use of com.chinaunicom.rundocker.bean.DockerJob in project mesosFramework by zhizuqiu.
the class RestHandler method postJobs.
/**
* 添加任务,如果任务存在,会覆盖
*
* @param jsonParam 请求参数
* @param response 请求响应
* @return 返回参数
*/
@HttpMap(path = "/jobs", paramType = HttpMap.ParamType.JSON, method = HttpMap.Method.POST)
public Jobs postJobs(String jsonParam, DefaultFullHttpResponse response) {
Long logTime = System.currentTimeMillis();
Jobs jobs = new Gson().fromJson(jsonParam, Jobs.class);
List<DockerJob> unSuccessJobs = new ArrayList<>();
for (DockerJob dockerJob : jobs.getApps()) {
String id = dockerJob.getId();
if (id == null) {
unSuccessJobs.add(dockerJob);
continue;
}
// 设置id
dockerJob.setId(Tools.getStringByJsonpathRecursion(id));
// todo 检查配置是否正确
String key = Tools.getStringByJsonpathRecursion(id.replaceAll("/", "."));
DockerStatus dockerStatus;
if (AppDataStore.statusGet(key) == null) {
// 生成dockerStatus
dockerStatus = DockerStatus.DockerStatusBuilder.newBuilder().defaultCreate(Tools.getStringByJsonpathRecursion(id)).setPersistenceStatusNew(dockerJob.hasPersistence()).builder();
} else {
dockerStatus = AppDataStore.statusGet(key);
// 如果之前使用了持久卷,不能修改
if (!dockerStatus.get_persistenceInfo().getPersistenceStatus().equals(DockerStatus.PersistenceStatus.NONE)) {
unSuccessJobs.add(dockerJob);
logger.info("[" + logTime + "]" + "pre task is use persistence volumes ,please delete task first");
continue;
}
// 如果在running或running途中,认为失败
if (dockerStatus.getStatus() == JobState.RUNNING || dockerStatus.getStatus() == JobState.STAGING) {
unSuccessJobs.add(dockerJob);
logger.info("[" + logTime + "]" + "task is " + dockerStatus.getStatus() + " ,please stop task first");
continue;
}
dockerStatus.setSubmitted(false);
dockerStatus.setTryCount(0);
}
AppDataStore.JobAndStatusTemp jobAndStatusTemp = new AppDataStore.JobAndStatusTemp(key, dockerJob, dockerStatus);
// 原子的插入job和status,返回值用于etcd操作失败时的回退
AppDataStore.JobAndStatusTemp jobAndStatusTempResult = AppDataStore.postJobsAndStatus(jobAndStatusTemp);
// 原子的插入job和status到etcd
Boolean setSuccess = etcdService.setJobAndStatusAtomic(logTime, key, jobAndStatusTemp);
if (!setSuccess) {
// 回滚
AppDataStore.postJobsAndStatus(jobAndStatusTempResult);
unSuccessJobs.add(dockerJob);
}
}
jobs.getApps().removeAll(unSuccessJobs);
// 判断是否还有任务未下发,是则请求offer
if (!SchedulerService.checkAllAppsIsAccept()) {
AppDataStore.getSchedulerDriver().reviveOffers();
logger.info("reviveOffers");
}
return jobs;
}
use of com.chinaunicom.rundocker.bean.DockerJob in project mesosFramework by zhizuqiu.
the class EtcdService method getJobsFromEtcd.
public Boolean getJobsFromEtcd(Long logTime) {
logger.info("[" + logTime + "]" + "---------------------");
logger.info("[" + logTime + "]" + "start getJobsFromEtcd");
// 获取队列所有节点
List<Node> jobNode = getNodes(logTime, AppDataStore.getConfig().getFrameworkName() + StaticStr.JOBS_PATH);
if (jobNode == null) {
logger.info("[" + logTime + "]" + "node is null");
return false;
}
Map<String, DockerJob> jobMap = new HashMap<>();
for (Node node : jobNode) {
DockerJob job;
try {
job = new Gson().fromJson(node.getValue(), DockerJob.class);
} catch (JsonSyntaxException e) {
logger.error("[" + logTime + "]" + "getJobsFromEtcd->" + node.getKey() + "->JsonSyntaxException:" + e.getMessage());
continue;
}
if (job == null) {
continue;
}
String id = job.getId();
String key = Tools.getStringByJsonpathRecursion(id.replaceAll("/", "."));
jobMap.put(key, job);
}
AppDataStore.jobsPutAll(jobMap);
// 获取队列所有节点
List<Node> statusNodes = getNodes(logTime, AppDataStore.getConfig().getFrameworkName() + JOBSTATUS_PATH);
if (statusNodes == null) {
logger.info("[" + logTime + "]" + "node is null");
return false;
}
Map<String, DockerStatus> statusMap = new HashMap<>();
for (Node node : statusNodes) {
DockerStatus jobStatus;
try {
jobStatus = new Gson().fromJson(node.getValue(), DockerStatus.class);
} catch (JsonSyntaxException e) {
logger.error("[" + logTime + "]" + "getJobsFromEtcd->" + node.getKey() + "->JsonSyntaxException:" + e.getMessage());
continue;
}
if (jobStatus == null) {
continue;
}
String id = jobStatus.getId();
String key = Tools.getStringByJsonpathRecursion(id.replaceAll("/", "."));
statusMap.put(key, jobStatus);
}
AppDataStore.statusPutAll(statusMap);
return true;
}
use of com.chinaunicom.rundocker.bean.DockerJob in project mesosFramework by zhizuqiu.
the class AppDataStore method postJobsAndStatus.
/**
* post一个job和status,status会被覆盖
*
* @param jobAndStatusTemp jobAndStatusTemp
* @return 当true时,返回用于回退的JobAndStatusTemp
*/
public static synchronized JobAndStatusTemp postJobsAndStatus(JobAndStatusTemp jobAndStatusTemp) {
String key = jobAndStatusTemp.getKey();
// 要put的值
DockerJob dockerJob = jobAndStatusTemp.getDockerJobTemp();
DockerStatus dockerStatus = jobAndStatusTemp.getDockerStatusTemp();
// put之前的值,作为返回值
DockerJob dockerJobResult;
DockerStatus dockerStatusResult;
if (dockerJob == null) {
if (jobsGet(key) != null) {
dockerJobResult = jobsRemove(key);
} else {
dockerJobResult = null;
}
} else {
dockerJobResult = jobsPut(key, dockerJob);
}
if (dockerStatus == null) {
if (statusGet(key) != null) {
dockerStatusResult = statusRemove(key);
} else {
dockerStatusResult = null;
}
} else {
dockerStatusResult = statusPut(key, dockerStatus);
}
return new JobAndStatusTemp(key, dockerJobResult, dockerStatusResult);
}
use of com.chinaunicom.rundocker.bean.DockerJob in project mesosFramework by zhizuqiu.
the class DockerScheduler method statusUpdate.
@Override
public void statusUpdate(SchedulerDriver schedulerDriver, TaskStatus taskStatus) {
// 时间戳
Long logTime = System.currentTimeMillis();
logger.info("[" + logTime + "]" + "---------------------");
logger.info("[" + logTime + "]" + "Statuses update: " + taskStatus.getState() + " from " + taskStatus.getTaskId().getValue());
logger.info("[" + logTime + "]" + taskStatus);
String key = taskStatus.getTaskId().getValue();
DockerJob job = AppDataStore.jobsGet(key);
if (job == null) {
logger.error("收到状态的任务id不在[jobs]中");
return;
}
DockerStatus jobStatus = AppDataStore.statusGet(key);
if (jobStatus == null) {
logger.error("收到状态的任务id不在[jobStatus]中");
return;
}
// 如果是等待delete的任务,做删除操作
if (jobStatus.getStatus() == JobState.WAIT_DELETE) {
logger.info("this is a waiting delete app");
// 为null时,表示没有持久卷
String persistenceAgentid = jobStatus.get_persistenceInfo().getPersistenceAgentid();
// 删除持久卷
MesosService.MesosDoResult mesosDoResult = mesosService.destroy(persistenceAgentid, job);
logger.error("mesosService.destroy() : " + mesosDoResult.toString());
// 删除预留资源
MesosService.MesosDoResult resultUnReserve = mesosService.unReserve(persistenceAgentid, job);
logger.error("mesosService.unReserve() : " + mesosDoResult.toString());
// 删除任务
AppDataStore.remove(key);
etcdService.deleteNodeOnlyReturnPre(logTime, AppDataStore.getConfig().getFrameworkName() + JOBS_PATH + key);
etcdService.deleteNodeOnlyReturnPre(logTime, AppDataStore.getConfig().getFrameworkName() + JOBSTATUS_PATH + key);
} else {
// mesos任务状态向自定义状态的转换
switch(taskStatus.getState()) {
case TASK_RUNNING:
jobStatus.started();
jobStatus.setCurrentTime();
jobStatus.setMessage(null);
jobStatus.setSlaveId(taskStatus.getSlaveId().getValue());
jobStatus = SchedulerService.setPortBindings(jobStatus, taskStatus);
jobStatus = SchedulerService.setHealthy(job.hasHealthCheck(), jobStatus, taskStatus);
break;
case TASK_FINISHED:
jobStatus.succeed();
jobStatus.setCurrentTime();
jobStatus.setMessage(taskStatus.getMessage());
jobStatus.setHealthy(job.hasHealthCheck(), false);
// portNeed
SchedulerService.removePortNeed(key, jobStatus);
jobStatus.clearAllPortNeed();
SchedulerService.stopTaskWhenDependenceStop(key, false);
break;
case TASK_FAILED:
case TASK_KILLED:
case TASK_LOST:
case TASK_ERROR:
jobStatus.fail(job.getRetries());
jobStatus.setCurrentTime();
jobStatus.setMessage(taskStatus.getMessage());
jobStatus.setHealthy(job.hasHealthCheck(), false);
// portNeed
SchedulerService.removePortNeed(key, jobStatus);
jobStatus.clearAllPortNeed();
SchedulerService.stopTaskWhenDependenceStop(key, true);
break;
default:
break;
}
// 更新etcd中的任务状态
EtcdService.SetResult setResult = etcdService.setStatusAtomic(logTime, jobStatus);
switch(setResult) {
case HAS_EXCEPTION:
// todo 触发同步状态方法
break;
default:
break;
}
logger.info("[" + logTime + "]" + "statusUpdate->setStatusAtomic:" + setResult);
}
// 判断是否还有任务未下发,是则请求offer
if (!SchedulerService.checkAllAppsIsAccept()) {
schedulerDriver.reviveOffers();
logger.info("reviveOffers");
}
}
use of com.chinaunicom.rundocker.bean.DockerJob in project mesosFramework by zhizuqiu.
the class RestHandler method startOneTask.
/**
* 启动一个
*/
private Task startOneTask(String id) {
Task task = new Task();
task.setId(id);
task.setId(id);
String key = Tools.getStringByJsonpathRecursion(id.trim().replaceAll("/", "."));
DockerStatus dockerStatus = AppDataStore.statusGet(key);
if (dockerStatus == null) {
return null;
}
DockerJob dockerJob = AppDataStore.jobsGet(key);
if (dockerJob == null) {
return null;
}
if (dockerStatus.canRunAgain(dockerJob.getRetries())) {
dockerStatus.setSubmitted(false);
dockerStatus.setTryCount(0);
}
return task;
}
Aggregations