Search in sources :

Example 1 with DockerJob

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;
}
Also used : Jobs(com.chinaunicom.rundocker.bean.returnparm.Jobs) ArrayList(java.util.ArrayList) DockerStatus(com.chinaunicom.rundocker.bean.DockerStatus) Gson(com.google.gson.Gson) AppDataStore(com.chinaunicom.rundocker.store.AppDataStore) DockerJob(com.chinaunicom.rundocker.bean.DockerJob) HttpMap(com.zhizuqiu.nettyrestful.annotation.HttpMap)

Example 2 with DockerJob

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;
}
Also used : JsonSyntaxException(com.google.gson.JsonSyntaxException) HashMap(java.util.HashMap) ResponseNode(com.chinaunicom.etcd.v2.model.ResponseNode) Node(com.chinaunicom.etcd.v2.model.Node) DockerStatus(com.chinaunicom.rundocker.bean.DockerStatus) Gson(com.google.gson.Gson) DockerJob(com.chinaunicom.rundocker.bean.DockerJob)

Example 3 with DockerJob

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);
}
Also used : DockerStatus(com.chinaunicom.rundocker.bean.DockerStatus) DockerJob(com.chinaunicom.rundocker.bean.DockerJob)

Example 4 with DockerJob

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");
    }
}
Also used : MesosService(com.chinaunicom.rundocker.service.MesosService) EtcdService(com.chinaunicom.rundocker.service.EtcdService) DockerStatus(com.chinaunicom.rundocker.bean.DockerStatus) DockerJob(com.chinaunicom.rundocker.bean.DockerJob)

Example 5 with DockerJob

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;
}
Also used : Task(com.chinaunicom.rundocker.bean.returnparm.Task) DockerStatus(com.chinaunicom.rundocker.bean.DockerStatus) DockerJob(com.chinaunicom.rundocker.bean.DockerJob)

Aggregations

DockerJob (com.chinaunicom.rundocker.bean.DockerJob)11 DockerStatus (com.chinaunicom.rundocker.bean.DockerStatus)9 EtcdService (com.chinaunicom.rundocker.service.EtcdService)2 AppDataStore (com.chinaunicom.rundocker.store.AppDataStore)2 Gson (com.google.gson.Gson)2 ArrayList (java.util.ArrayList)2 HashMap (java.util.HashMap)2 Node (com.chinaunicom.etcd.v2.model.Node)1 ResponseNode (com.chinaunicom.etcd.v2.model.ResponseNode)1 Jobs (com.chinaunicom.rundocker.bean.returnparm.Jobs)1 Task (com.chinaunicom.rundocker.bean.returnparm.Task)1 MesosService (com.chinaunicom.rundocker.service.MesosService)1 OfferTemp (com.chinaunicom.rundocker.service.OfferTemp)1 Config (com.chinaunicom.rundocker.store.Config)1 JsonSyntaxException (com.google.gson.JsonSyntaxException)1 HttpMap (com.zhizuqiu.nettyrestful.annotation.HttpMap)1 List (java.util.List)1 Before (org.junit.Before)1 Test (org.junit.Test)1