DockerBuildCtrl.java 14.8 KB
package com.ui.ctrl;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.ui.contants.HttpUriContants;
import com.ui.http.HttpRestClient;
import com.ui.model.BaseResponse;
import com.ui.model.domain.BuildMessage;
import com.ui.model.domain.DockerProjectModel;
import com.ui.model.req.BuildRequest;
import com.ui.model.req.DockerJenkinsReq;
import com.ui.model.req.User;
import com.ui.model.req.*;
import com.ui.project.ProjectEnvironment;
import com.ui.project.ProjectOnline;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpSession;
import java.util.*;


@RestController
@RequestMapping("/dockerBuild")
public class DockerBuildCtrl {
    Logger log = LoggerFactory.getLogger(DockerBuildCtrl.class);

    @Autowired
    private HttpRestClient httpRestClient;

    @RequestMapping("/toProject")
    public ModelAndView toProject(Model model,String workJobId) {
        if(StringUtils.isNotBlank(workJobId)){
          //如果来源工单发布界面
            BaseResponse response = httpRestClient.defaultGet(HttpUriContants.GET_RELEASEWORKJOB_ID + "?id=" + workJobId, BaseResponse.class);
            if(response!=null&&response.getCode()==200&&response.getData()!=null){
                Map map=(Map)response.getData();
                String releaseWorkJob_environment=(String)(map.get("environment")==null?"":map.get("environment"));
                //int releaseWorkJob_enviCount=0;
                if(releaseWorkJob_environment!=null&&releaseWorkJob_environment.length()>0&&!releaseWorkJob_environment.endsWith(",")){
                    releaseWorkJob_environment+=",";
                }
               /* for(String tmp:releaseWorkJob_environment.split(",")){
                    if(tmp!=null&&tmp.length()>0){
                        releaseWorkJob_enviCount++;
                    }
                }*/

                String releaseWorkJob_project =  map.get("project")==null?"":(String)map.get("project");
                if(releaseWorkJob_project!=null&&releaseWorkJob_project.length()>0&&!releaseWorkJob_project.endsWith(",")){
                    releaseWorkJob_project += ",";
                }
                //model.addAttribute("releaseWorkJob_enviCount", releaseWorkJob_enviCount);
                model.addAttribute("releaseWorkJob_environment", releaseWorkJob_environment);
                model.addAttribute("releaseWorkJob_projectType", map.get("projectType")==null?"":(String)map.get("projectType"));
                model.addAttribute("releaseWorkJob_branch", map.get("branch")==null?"":(String)map.get("branch"));
                model.addAttribute("releaseWorkJob_project",releaseWorkJob_project);
                model.addAttribute("releaseWorkJob_id", workJobId);
            }
        }
        model.addAttribute("clusters", JSON.toJSONString(this.getDockerClusterMap()));
        model.addAttribute("environments", ProjectEnvironment.getDockerEnvironments(null));
        model.addAttribute("projectTypes", ProjectEnvironment.getDockerProjectTypeMap());
        return new ModelAndView("project/docker_project");
    }

    @RequestMapping("/toBuildView")
    public ModelAndView toBuildView(Model model,String project_id, String project_name,
                                    String environment_name,String clusters_name,String clusters_text,
                                    String operate_name, String branch_name, String rollbackImageStore,
                                    String workid_name, String buildIds,String failMsg, HttpSession session,String az2AutoSwitchOnlineCheck) {
        List<Map<String,String>> buildInfoList=new ArrayList<>();
        Map mapIds = new HashMap<>();
        mapIds.put("ids",project_id);
        BaseResponse response=httpRestClient.defaultGet("/dockerProject/getDockerProjectMapByIds", BaseResponse.class, mapIds);
        Map projectMap=JSON.parseObject((String)response.getData(),Map.class);

        if("deploy".equalsIgnoreCase(operate_name)){
            for(String buildIdWithProjectId:buildIds.split(",")){
                int index = buildIdWithProjectId.indexOf("-");
                String projectId=buildIdWithProjectId.substring(0,index);
                String buildId=buildIdWithProjectId.substring(index+1);
                Map map=new HashMap();
                map.put("projectId",projectId);
                map.put("buildId",buildId);
                map.put("projectName",buildId.substring(0,buildId.lastIndexOf("-")));
                map.put("projectInfo",projectMap.get(Integer.parseInt(projectId)));
                buildInfoList.add(map);
            }
        }else{
            String projectId=project_id;
            Map map=new HashMap();
            map.put("projectId",projectId);
            map.put("projectName",project_name);
            map.put("projectInfo",projectMap.get(Integer.parseInt(projectId)));
            buildInfoList.add(map);
        }

        model.addAttribute("az2AutoSwitchOnlineCheck", StringUtils.isBlank(az2AutoSwitchOnlineCheck)?"":az2AutoSwitchOnlineCheck);
        if(StringUtils.isNotBlank(az2AutoSwitchOnlineCheck)){
            model.addAttribute("az2AutoSwitchOnlineCheck_project", project_name);
        }else{
            model.addAttribute("az2AutoSwitchOnlineCheck_project", "");
        }

        model.addAttribute("environment_name", environment_name);
        model.addAttribute("clusters_name", clusters_name);
        model.addAttribute("clusters_text", clusters_text);
        model.addAttribute("operate_name", operate_name);
        model.addAttribute("branch_name", branch_name);
        model.addAttribute("workid_name", workid_name);
        model.addAttribute("rollbackfile_name", rollbackImageStore);
        model.addAttribute("buildIds", buildIds);
        model.addAttribute("failMsg", failMsg);
        model.addAttribute("buildInfoList",JSONArray.toJSON(buildInfoList));

        return new ModelAndView("project/docker_build");
    }

    /**
     * 把node项目的az2区域切换到gray
     * @env 发布环境 ,拦截器记录操作日志用
     * @branch 分支  ,拦截器记录操作日志用
     * @return
     */
    @RequestMapping(value = "/switchDockerNodeAz2")
    @ResponseBody
    public BaseResponse switchDockerNodeAz2(String project_name,String onlineOrGray,String env,String branch) {
        if(!"online".equals(onlineOrGray)&&!"gray".equals(onlineOrGray)){
            return new BaseResponse(201,"不支持参数onlineOrGray:"+onlineOrGray);
        }
        String projectType;
        String inGrayKey;
        if("yohoblk-wap".equals(project_name)){
            projectType="blk";
            inGrayKey="inGray_blk";
        }else if("yohobuywap-node".equals(project_name)){
            projectType="wap";
            inGrayKey="inGray_wap";
        }else if("yohobuy-node".equals(project_name)){
            projectType="pc";
            inGrayKey="inGray_pc";
        }else{
            return new BaseResponse(201,"不支持参数:"+project_name);
        }

        BaseResponse queryStatusResponse=httpRestClient.defaultGet("/pch5DockerSwitch/getDockerElbStatus", BaseResponse.class);
        if(queryStatusResponse!=null&&queryStatusResponse.getCode()==200){
            Map<String,Object> resultMap=(Map<String,Object>)queryStatusResponse.getData();
            if(resultMap.containsKey(inGrayKey)){
                boolean inGray=(Boolean)resultMap.get(inGrayKey);
                if("gray".equals(onlineOrGray)&&inGray){
                    //目标是切换到灰度,当前已经是灰度了,所以直接返回
                    return new BaseResponse();
                }

                if("online".equals(onlineOrGray)&&inGray==false){
                    //目标是切换到online,当前已经关闭灰度了,所以直接返回
                    return new BaseResponse();
                }
            }
        }

        Map map = new HashMap<>();
        map.put("projectType",projectType);
        map.put("onlineOrGray",onlineOrGray);
        BaseResponse response=httpRestClient.defaultGet("/pch5DockerSwitch/switchDockerAz2", BaseResponse.class, map);
        return response;
    }

    /**
     * 获取所有项目
     *
     * @return
     */
    @RequestMapping(value = "/getProjects")
    @ResponseBody
    public String getProjects(String projectType) {
        try {
            Map map = new HashMap<>();
            map.put("projectType",projectType);
            BaseResponse response=httpRestClient.defaultGet("/dockerProject/getDockerProjectByProjectType", BaseResponse.class, map);
            return JSONArray.toJSON(response.getData()).toString();
        } catch (Exception ex) {
            return "failed";
        }
    }

    @RequestMapping(value = "/getRollbackList")
    @ResponseBody
    public String getRollbackList(String projectId, String environment) {
        try {
            Map<String, String> map = new HashMap<>();
            map.put("projectId", projectId);
            map.put("environment", environment);
            return httpRestClient.defaultGet("/dockerProject/getRollbackList", String.class, map);
        } catch (Exception ex) {
            return "failed";
        }
    }
    /**
     * rollback项目
     **/
    @RequestMapping(value = "/rollback")
    @ResponseBody
    public BaseResponse rollback(String project_id, String environment_name, String clusters_name,String rollbackImageStore){
        Map<String, String> map = new HashMap<>();
        map.put("projectId", project_id);
        map.put("environment", environment_name);
        map.put("clusters_name", clusters_name);
        map.put("rollbackImageStore", rollbackImageStore);
        return httpRestClient.defaultGet("/dockerProject/rollback", BaseResponse.class, map);
    }

    /**
     * deploy项目
     *
     * @return
     */
    @RequestMapping(value = "/mirrorAndDeploy")
    @ResponseBody
    public BaseResponse mirrorAndDeploy(String project_id, String project_name,
                                        String environment_name,String clusters_name, String operate_name, String branch_name,
                                        String rollbackfile_name,String workid_name, Model model, HttpSession session) {
        DockerJenkinsReq dockerJenkinsReq=new DockerJenkinsReq();
        User user = (User) session.getAttribute("user");
        dockerJenkinsReq.setUserName(user.getName());
        dockerJenkinsReq.setUserMail(user.getEmail());
        dockerJenkinsReq.setProjectIds(project_id);
        dockerJenkinsReq.setNodeEnv(environment_name);
        dockerJenkinsReq.setClusterId(clusters_name);
        dockerJenkinsReq.setBranch(branch_name);
        dockerJenkinsReq.setReleaseWorkId(workid_name);
        if("deploy".equalsIgnoreCase(operate_name)){
            return httpRestClient.defaultPost("/dockerProject/mirrorAndDeploy",dockerJenkinsReq,BaseResponse.class);
        }
        BaseResponse rtnBaseResponse=new BaseResponse(201);
        rtnBaseResponse.setMessage("暂不支持的操作:"+operate_name);
        return rtnBaseResponse;
    }

    /**
     * 镜像制作
     */
    @RequestMapping(value = "/queryJenkinsStatus")
    @ResponseBody
    public BaseResponse queryJenkinsStatus(String buildId) {
        Map map = new HashMap<>();
        map.put("id",buildId);
        BaseResponse response=httpRestClient.defaultGet("/dockerProject/queryJenkinsStatus", BaseResponse.class, map);
        return response;
    }

    /**
     * qq发布
     */
    @RequestMapping(value = "/queryDockerServerStatus")
    @ResponseBody
    public BaseResponse queryDockerServerStatus(DockerJenkinsReq dockerJenkinsReq) {
        BaseResponse rtn= httpRestClient.defaultPost("/dockerProject/queryDockerServerStatus",dockerJenkinsReq,BaseResponse.class);
        if(rtn!=null&&200==rtn.getCode()){
            Map<String,Object> map= (Map<String,Object>)rtn.getData();
            Map<String,String> tmpMap = (Map<String,String>)map.get("resultMap");
            Map<String,String> clusterMap=this.getDockerClusterMap();
            StringBuilder sb=new StringBuilder();
            for(String key:tmpMap.keySet()){
                sb.append(clusterMap.get(key)).append(":").append(tmpMap.get(key)).append(";");
            }
            map.put("resultMessage",sb.toString());
        }
        return rtn;
    }

    public  Map<String,String> getDockerClusterMap(){
        BaseResponse rtn= httpRestClient.defaultPost("/dockerMonitor/getDockerClusterMap",null,BaseResponse.class);
        return (Map<String,String>)rtn.getData();
    }



    @RequestMapping(value = "/toDockerInfoList")
    public ModelAndView toDockerInfoList(Model model,DockerJenkinsReq dockerJenkinsReq) {
        model.addAttribute("clusters", JSON.toJSONString(this.getDockerClusterMap()));
        model.addAttribute("projectTypes", ProjectEnvironment.getDockerProjectTypeMap());
        model.addAttribute("projectJobTypes", httpRestClient.defaultGet("/dockerProject/getDockerProjectJobType",BaseResponse.class).getData());
        return new ModelAndView("project/docker_info");
    }

    /**
     * docker信息列表
     * @param req
     * @return
     * @throws Exception
     */
    @RequestMapping("/getDockerInfoList")
    @ResponseBody
    public BaseResponse getHostInfos(DockerInfoReq req) throws Exception {
        BaseResponse response = httpRestClient.defaultPost(HttpUriContants.DOCKER_INFO_LIST, req, BaseResponse.class);
        return response;
    }


    @RequestMapping("/toEditDockerInfo")
    public ModelAndView toEditDockerInfos(Model model) {
        model.addAttribute("clusters", this.getDockerClusterMap());
        model.addAttribute("projectTypes", ProjectEnvironment.getDockerProjectTypeMap());
        model.addAttribute("projectJobTypes", httpRestClient.defaultGet("/dockerProject/getDockerProjectJobType",BaseResponse.class).getData());
        return new ModelAndView("project/editDockerInfo");
    }


    @RequestMapping("/saveDockerInfo")
    @ResponseBody
    public BaseResponse saveDockerInfo(@RequestBody  DockerProjectModel req) throws Exception {
        BaseResponse response = httpRestClient.defaultPost(HttpUriContants.ADDORUPDATE_DOCKER_INFO, req, BaseResponse.class);
        return response;
    }


    @RequestMapping("/getDockerInfoById")
    @ResponseBody
    public BaseResponse getDockerInfoById(int id) throws Exception {
        BaseResponse response = httpRestClient.defaultGet(HttpUriContants.GET_DOCERK_INFO_BY_ID + "?id=" + id, BaseResponse.class);
        return response;
    }

    @RequestMapping("/delDockerInfoById")
    @ResponseBody
    public BaseResponse<Integer> delDockerInfoById(int id) throws Exception {
        BaseResponse response = httpRestClient.defaultGet(HttpUriContants.DEL_DOCKER_INFO_BYID + "?id=" + id, BaseResponse.class);
        return response;
    }
}