diff --git a/init-database.sh b/init-database.sh index a615ca9024..52143bdc72 100755 --- a/init-database.sh +++ b/init-database.sh @@ -8,11 +8,11 @@ mvn org.apache.maven.plugins:maven-dependency-plugin:get \ -Dartifact=${TOOL_GROUP_ID}:${TOOL_ARTIFACT_ID}:${TOOL_VERSION} \ -Dtransitive=false -java -Dspring.datasource.url="jdbc:mysql://localhost:33306/?serverTimezone=CTT&useUnicode=true&characterEncoding=utf-8&useSSL=false&useInformationSchema=true&remarks=true" \ +java -Dspring.datasource.url="jdbc:mysql://localhost:3306/?serverTimezone=CTT&useUnicode=true&characterEncoding=utf-8&useSSL=false&useInformationSchema=true&remarks=true" \ -Dspring.datasource.username=root \ -Dspring.datasource.password=root \ -Dspring.datasource.driver-class-name=com.mysql.jdbc.Driver \ - -Dinstaller.datasources.platform.url="jdbc:mysql://localhost:33306/?useUnicode=true&characterEncoding=utf-8&useSSL=false&useInformationSchema=true&remarks=true" \ + -Dinstaller.datasources.platform.url="jdbc:mysql://localhost:3306/?useUnicode=true&characterEncoding=utf-8&useSSL=false&useInformationSchema=true&remarks=true" \ -Dinstaller.datasources.platform.username=root \ -Dinstaller.datasources.platform.password=root \ -Ddata.init=true \ diff --git a/pom.xml b/pom.xml index 9df1662b11..bf6db7add2 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 devops-service - 2.0.9.RELEASE + 2.2.0-SNAPSHOT jar https://github.com/open-hand/devops-service @@ -11,7 +11,7 @@ io.choerodon choerodon-framework-parent - 2.0.1.RELEASE + 2.1.0.RELEASE @@ -21,6 +21,11 @@ + + io.choerodon + choerodon-starter-core + + org.hzero.boot @@ -212,7 +217,7 @@ com.squareup.retrofit2 retrofit - 2.3.0 + 2.5.0 io.codearte.props2yaml @@ -238,7 +243,7 @@ io.kubernetes client-java - 1.0.0-beta3 + 16.0.0 compile diff --git a/src/main/java/io/choerodon/devops/api/controller/v1/AppServiceController.java b/src/main/java/io/choerodon/devops/api/controller/v1/AppServiceController.java index 8c7f84839a..1cf280b8f7 100644 --- a/src/main/java/io/choerodon/devops/api/controller/v1/AppServiceController.java +++ b/src/main/java/io/choerodon/devops/api/controller/v1/AppServiceController.java @@ -73,9 +73,7 @@ public ResponseEntity creatstatefulSetWorkLoade( @PathVariable(value = "project_id") Long projectId, @ApiParam(value = "服务信息", required = true) @RequestBody @Validated AppServiceReqVO appServiceReqVO) { - return Optional.ofNullable(applicationServiceService.create(projectId, appServiceReqVO)) - .map(target -> new ResponseEntity<>(target, HttpStatus.OK)) - .orElseThrow(() -> new CommonException("error.app.service.create")); + return ResponseEntity.ok(applicationServiceService.create(projectId, appServiceReqVO)); } @@ -570,23 +568,6 @@ public ResponseEntity queryByCode( .orElseThrow(() -> new CommonException(ERROR_APPLICATION_GET)); } - - /** - * 校验chart仓库配置信息是否正确 - * - * @param configVO chartMuseum信息 - */ - @Permission(level = ResourceLevel.ORGANIZATION, roles = {InitRoleCode.PROJECT_OWNER}) - @ApiOperation(value = "校验chart仓库配置信息是否正确") - @PostMapping(value = "/check_chart") - public void checkChart( - @ApiParam(value = "项目id", required = true) - @PathVariable(value = "project_id") Long projectId, - @ApiParam(value = "chartMuseum信息", required = true) - @RequestBody ConfigVO configVO) { - applicationServiceService.checkChart(configVO.getUrl(), configVO.getUserName(), configVO.getPassword()); - } - /** * 验证用于克隆仓库的url及授权的access token是否有效 * diff --git a/src/main/java/io/choerodon/devops/api/controller/v1/AppServiceInstanceController.java b/src/main/java/io/choerodon/devops/api/controller/v1/AppServiceInstanceController.java index 4e361c2138..46d48b0cd5 100644 --- a/src/main/java/io/choerodon/devops/api/controller/v1/AppServiceInstanceController.java +++ b/src/main/java/io/choerodon/devops/api/controller/v1/AppServiceInstanceController.java @@ -141,46 +141,6 @@ public ResponseEntity> pageInstanceInfoByOptions( appServiceInstanceService.pageInstanceInfoByOptions(projectId, envId, pageable, params), HttpStatus.OK); } - -// /** -// * 分页查询服务部署 -// * -// * @param projectId 项目id -// * @param pageable 分页参数 -// * @param envId 环境id -// * @param versionId 版本id -// * @param appServiceId 服务id -// * @param params 搜索参数 -// * @return page of DevopsEnvPreviewInstanceVO -// */ -// @Permission(level = ResourceLevel.ORGANIZATION, -// roles = {InitRoleCode.PROJECT_OWNER, -// InitRoleCode.PROJECT_MEMBER}) -// @ApiOperation(value = "分页查询服务部署") -// @CustomPageRequest -// @PostMapping(value = "/page_by_options") -// public ResponseEntity> pageByOptions( -// @ApiParam(value = "项目ID", required = true) -// @PathVariable(value = "project_id") Long projectId, -// @ApiIgnore -// @ApiParam(value = "分页参数") PageRequest pageable, -// @ApiParam(value = "环境ID") -// @RequestParam(value = "env_id", required = false) Long envId, -// @ApiParam(value = "版本ID") -// @RequestParam(value = "version_id", required = false) Long versionId, -// @ApiParam(value = "服务ID") -// @RequestParam(value = "app_service_id", required = false) Long appServiceId, -// @ApiParam(value = "实例ID") -// @RequestParam(value = "instance_id", required = false) Long instanceId, -// @ApiParam(value = "查询参数") -// @RequestBody(required = false) String params) { -// return Optional.ofNullable(appServiceInstanceService.pageByOptions( -// projectId, pageable, envId, versionId, appServiceId, instanceId, params)) -// .map(target -> new ResponseEntity<>(target, HttpStatus.OK)) -// .orElseThrow(() -> new CommonException("error.application.version.query")); -// } - - /** * 获取实例上次部署配置 * @@ -900,22 +860,22 @@ public ResponseEntity> pageDeployTimeTable( .orElseThrow(() -> new CommonException("error.deploy.time.get")); } - /** - * 部署自动化测试服务 - * - * @param projectId 项目id - * @param appServiceDeployVO 部署信息 - */ - @ApiOperation(value = "部署自动化测试服务") - @Permission(level = ResourceLevel.ORGANIZATION) - @PostMapping("/deploy_test_app") - public void deployTestApp( - @ApiParam(value = "项目ID", required = true) - @PathVariable(value = "project_id") Long projectId, - @ApiParam(value = "部署信息", required = true) - @RequestBody AppServiceDeployVO appServiceDeployVO) { - appServiceInstanceService.deployTestApp(projectId, appServiceDeployVO); - } +// /** +// * 部署自动化测试服务 +// * +// * @param projectId 项目id +// * @param appServiceDeployVO 部署信息 +// */ +// @ApiOperation(value = "部署自动化测试服务") +// @Permission(level = ResourceLevel.ORGANIZATION) +// @PostMapping("/deploy_test_app") +// public void deployTestApp( +// @ApiParam(value = "项目ID", required = true) +// @PathVariable(value = "project_id") Long projectId, +// @ApiParam(value = "部署信息", required = true) +// @RequestBody AppServiceDeployVO appServiceDeployVO) { +// appServiceInstanceService.deployTestApp(projectId, appServiceDeployVO); +// } /** * 操作pod的数量 @@ -1021,7 +981,6 @@ public ResponseEntity> batchDeployment( return new ResponseEntity<>(appServiceInstanceService.batchDeployment(projectId, appServiceDeployVOs), HttpStatus.OK); } - @Deprecated @ApiOperation("查询引用了实例作为替换对象的流水线信息") @Permission(level = ResourceLevel.ORGANIZATION) @GetMapping("/{instance_id}/pipeline_reference") diff --git a/src/main/java/io/choerodon/devops/api/controller/v1/AppServiceVersionController.java b/src/main/java/io/choerodon/devops/api/controller/v1/AppServiceVersionController.java index ccec2cfba8..03bbb89a13 100644 --- a/src/main/java/io/choerodon/devops/api/controller/v1/AppServiceVersionController.java +++ b/src/main/java/io/choerodon/devops/api/controller/v1/AppServiceVersionController.java @@ -61,10 +61,15 @@ public ResponseEntity> pageByOptions( @RequestBody(required = false) String params, @ApiParam(value = "指定版本") @RequestParam(required = false) String version) { - return Optional.ofNullable(appServiceVersionService.pageByOptions( - projectId, appServiceId, appServiceVersionId, deployOnly, doPage, params, pageable, version)) - .map(target -> new ResponseEntity<>(target, HttpStatus.OK)) - .orElseThrow(() -> new CommonException(VERSION_QUERY_ERROR)); + return ResponseEntity.ok(appServiceVersionService.pageByOptions( + projectId, + appServiceId, + appServiceVersionId, + deployOnly, + doPage, + params, + pageable, + version)); } @@ -315,10 +320,7 @@ public ResponseEntity> pageShareVersionByappServic @SortDefault(value = "id", direction = Sort.Direction.DESC) PageRequest pageable, @ApiParam(value = "查询参数") @RequestParam(value = "version", required = false) String version) { - return Optional.ofNullable( - appServiceVersionService.pageShareVersionByAppId(appServiceId, pageable, version)) - .map(target -> new ResponseEntity<>(target, HttpStatus.OK)) - .orElseThrow(() -> new CommonException("error.remote.application.versions.get")); + return ResponseEntity.ok(appServiceVersionService.pageShareVersionByAppId(appServiceId, pageable, version)); } @Permission(level = ResourceLevel.ORGANIZATION) diff --git a/src/main/java/io/choerodon/devops/api/controller/v1/CiCdPipelineController.java b/src/main/java/io/choerodon/devops/api/controller/v1/CiCdPipelineController.java index 7d0fdd036a..38f3cfe243 100644 --- a/src/main/java/io/choerodon/devops/api/controller/v1/CiCdPipelineController.java +++ b/src/main/java/io/choerodon/devops/api/controller/v1/CiCdPipelineController.java @@ -247,9 +247,7 @@ public ResponseEntity pipelineExecuteTime( @RequestParam(value = "start_time") Date startTime, @ApiParam(value = "end_time") @RequestParam(value = "end_time") Date endTime) { - return Optional.ofNullable(devopsCiPipelineService.pipelineExecuteTime(pipelineIds, startTime, endTime)) - .map(target -> new ResponseEntity<>(target, HttpStatus.OK)) - .orElseThrow(() -> new CommonException("error.pipeline.execute.time.get")); + return ResponseEntity.ok(devopsCiPipelineService.pipelineExecuteTime(pipelineIds, startTime, endTime)); } @Permission(level = ResourceLevel.ORGANIZATION, diff --git a/src/main/java/io/choerodon/devops/api/controller/v1/CiController.java b/src/main/java/io/choerodon/devops/api/controller/v1/CiController.java index a40a5ed6d9..92292ea139 100644 --- a/src/main/java/io/choerodon/devops/api/controller/v1/CiController.java +++ b/src/main/java/io/choerodon/devops/api/controller/v1/CiController.java @@ -116,6 +116,25 @@ public ResponseEntity create( return ResponseEntity.ok().build(); } + @Permission(permissionPublic = true) + @ApiOperation(value = "发布应用服务版本") + @PostMapping("/app_version") + public ResponseEntity publishAppVersion( + @ApiParam(value = "token", required = true) + @RequestParam String token, + @ApiParam(value = "版本", required = true) + @RequestParam String version, + @ApiParam(value = "commit", required = true) + @RequestParam String commit, + @ApiParam(value = "GitLab流水线id") + @RequestParam(value = "gitlabPipelineId", required = false) Long gitlabPipelineId, + @ApiParam(value = "job_name") + @RequestParam(value = "jobName", required = false) String jobName, + @RequestParam String ref) { + appServiceVersionService.publishAppVersion(token, version, commit, ref, gitlabPipelineId, jobName); + return ResponseEntity.ok().build(); + } + @Permission(permissionPublic = true) @ApiOperation(value = "查询CI流水线默认的镜像地址") @GetMapping("/default_image") @@ -154,9 +173,11 @@ public ResponseEntity saveJarMetaData( @RequestParam(value = "job_name") String jobName, @ApiParam(value = "token", required = true) @RequestParam String token, + @ApiParam(value = "版本", required = true) + @RequestParam String version, @ApiParam(value = "pom文件", required = true) @RequestParam MultipartFile file) { - ciPipelineMavenService.createOrUpdate(nexusRepoId, jobId, sequence, gitlabPipelineId, jobName, token, file, mavenRepoUrl, username, password); + ciPipelineMavenService.createOrUpdate(nexusRepoId, jobId, sequence, gitlabPipelineId, jobName, token, file, mavenRepoUrl, username, password, version); return ResponseEntity.ok().build(); } @@ -180,7 +201,7 @@ public ResponseEntity saveSonarInfo( @ApiOperation(value = "判断平台是否有配置sonarqube") @GetMapping("/has_default_sonar") public ResponseEntity hasDefaultSonarqubeConfig() { - return ResponseEntity.ok(!StringUtils.isEmpty(sonarqubeUrl)); + return ResponseEntity.ok(StringUtils.hasText(sonarqubeUrl)); } @Permission(level = ResourceLevel.ORGANIZATION, permissionWithin = true) diff --git a/src/main/java/io/choerodon/devops/api/controller/v1/DevopsBranchController.java b/src/main/java/io/choerodon/devops/api/controller/v1/DevopsBranchController.java new file mode 100644 index 0000000000..12e72e2e62 --- /dev/null +++ b/src/main/java/io/choerodon/devops/api/controller/v1/DevopsBranchController.java @@ -0,0 +1,38 @@ +package io.choerodon.devops.api.controller.v1; + +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import org.hzero.core.util.Results; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import io.choerodon.devops.app.service.DevopsBranchService; + +@RestController +@RequestMapping("/v1/projects/{project_id}/branch") +public class DevopsBranchController { + + @Autowired + private DevopsBranchService devopsBranchService; + + @GetMapping("/issue/check_rel_exist") + public ResponseEntity checkIssueBranchRelExist(@ApiParam("项目id") + @PathVariable("project_id") Long projectId, + @ApiParam("issueId") + @RequestParam("issue_id") Long issueId) { + return Results.success(devopsBranchService.checkIssueBranchRelExist(projectId, issueId)); + } + + @ApiOperation("复制工作项与分支关联关系") + @PostMapping("/issue/copy_rel") + public ResponseEntity copyIssueBranchRel(@ApiParam("项目id") + @PathVariable("project_id") Long projectId, + @ApiParam("oldIssueId") + @RequestParam("old_issue_id") Long oldIssueId, + @ApiParam("newIssueId") + @RequestParam("new_issue_id") Long newIssueId) { + devopsBranchService.copyIssueBranchRel(projectId, oldIssueId, newIssueId); + return Results.success(); + } +} diff --git a/src/main/java/io/choerodon/devops/api/controller/v1/DevopsCdApiTestInfoController.java b/src/main/java/io/choerodon/devops/api/controller/v1/DevopsCdApiTestInfoController.java new file mode 100644 index 0000000000..888401ea01 --- /dev/null +++ b/src/main/java/io/choerodon/devops/api/controller/v1/DevopsCdApiTestInfoController.java @@ -0,0 +1,28 @@ +package io.choerodon.devops.api.controller.v1; + +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import org.hzero.core.util.Results; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import io.choerodon.devops.app.service.DevopsCdApiTestInfoService; + +@RestController +@RequestMapping("/v1/projects/{project_id}/api_test_info") +public class DevopsCdApiTestInfoController { + @Autowired + private DevopsCdApiTestInfoService devopsCdApiTestInfoService; + + @ApiOperation("查询测试套件是否关联流水线") + @GetMapping("/suites/{suite_id}/related_with_pipeline") + public ResponseEntity doesApiTestSuiteRelatedWithPipeline(@ApiParam(value = "项目Id", required = true) + @PathVariable(value = "project_id") Long projectId, + @PathVariable(value = "suite_id") Long suiteId) { + return Results.success(devopsCdApiTestInfoService.doesApiTestSuiteRelatedWithPipeline(suiteId)); + } +} diff --git a/src/main/java/io/choerodon/devops/api/controller/v1/DevopsCiPipelineRecordController.java b/src/main/java/io/choerodon/devops/api/controller/v1/DevopsCiPipelineRecordController.java index 6e0b1f064b..454fd3ee9f 100644 --- a/src/main/java/io/choerodon/devops/api/controller/v1/DevopsCiPipelineRecordController.java +++ b/src/main/java/io/choerodon/devops/api/controller/v1/DevopsCiPipelineRecordController.java @@ -37,20 +37,6 @@ public DevopsCiPipelineRecordController(DevopsCiPipelineRecordService devopsCiPi this.devopsCiPipelineRecordService = devopsCiPipelineRecordService; } - @Permission(level = ResourceLevel.ORGANIZATION, roles = {InitRoleCode.PROJECT_OWNER, InitRoleCode.PROJECT_MEMBER}) - @ApiOperation(value = "查询ci流水线执行记录") - @GetMapping("/{ci_pipeline_id}") - public ResponseEntity> pagingPipelineRecord( - @ApiParam(value = "项目Id", required = true) - @PathVariable(value = "project_id") Long projectId, - @Encrypt - @ApiParam(value = "流水线Id", required = true) - @PathVariable(value = "ci_pipeline_id") Long ciPipelineId, - @ApiIgnore - @SortDefault(value = DevopsCiPipelineRecordDTO.FIELD_GITLAB_PIPELINE_ID, direction = Sort.Direction.DESC) PageRequest pageable) { - return ResponseEntity.ok(devopsCiPipelineRecordService.pagingPipelineRecord(projectId, ciPipelineId, pageable)); - } - @Permission(level = ResourceLevel.ORGANIZATION, roles = {InitRoleCode.PROJECT_OWNER, InitRoleCode.PROJECT_MEMBER}) @ApiOperation(value = "查询指定流水线记录详情") @GetMapping("/{gitlab_pipeline_id}/details") diff --git a/src/main/java/io/choerodon/devops/api/controller/v1/DevopsGitController.java b/src/main/java/io/choerodon/devops/api/controller/v1/DevopsGitController.java index e527c3ef13..33a5ccd49d 100644 --- a/src/main/java/io/choerodon/devops/api/controller/v1/DevopsGitController.java +++ b/src/main/java/io/choerodon/devops/api/controller/v1/DevopsGitController.java @@ -484,4 +484,29 @@ public ResponseEntity checkName( @RequestParam(value = "branch_name") String branchName) { return ResponseEntity.ok(devopsGitService.isBranchNameUnique(projectId, appServiceId, branchName)); } + + @Permission(level = ResourceLevel.ORGANIZATION) + @ApiOperation(value = "分支同步") + @PostMapping("/sync_branch") + public ResponseEntity syncBranch( + @ApiParam(value = "项目id", required = true) + @PathVariable(value = "project_id") Long projectId, + @Encrypt + @ApiParam(value = "服务ID") + @PathVariable(value = "app_service_id") Long appServiceId) { + devopsGitService.syncBranch(projectId, appServiceId, true); + return Results.success(); + } + + @Permission(level = ResourceLevel.ORGANIZATION) + @ApiOperation(value = "校验分支同步") + @GetMapping("/check_sync_branch") + public ResponseEntity checkSyncBranch( + @ApiParam(value = "项目id", required = true) + @PathVariable(value = "project_id") Long projectId, + @Encrypt + @ApiParam(value = "服务ID") + @PathVariable(value = "app_service_id") Long appServiceId) { + return Results.success(devopsGitService.syncBranch(projectId, appServiceId, false)); + } } diff --git a/src/main/java/io/choerodon/devops/api/controller/v1/DevopsHelmConfigController.java b/src/main/java/io/choerodon/devops/api/controller/v1/DevopsHelmConfigController.java new file mode 100644 index 0000000000..0dd07dbb87 --- /dev/null +++ b/src/main/java/io/choerodon/devops/api/controller/v1/DevopsHelmConfigController.java @@ -0,0 +1,138 @@ +package io.choerodon.devops.api.controller.v1; + +import java.util.List; + +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import org.hzero.core.util.Results; +import org.hzero.starter.keyencrypt.core.Encrypt; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import io.choerodon.core.iam.ResourceLevel; +import io.choerodon.devops.api.vo.DevopsHelmConfigVO; +import io.choerodon.devops.app.service.DevopsHelmConfigService; +import io.choerodon.swagger.annotation.Permission; + +@RestController("DevopsHelmConfigController.v1") +@RequestMapping("/v1/projects/{project_id}/helm_config") +public class DevopsHelmConfigController { + @Autowired + private DevopsHelmConfigService helmConfigService; + + @ApiOperation("查询helm仓库列表") + @Permission(level = ResourceLevel.ORGANIZATION) + @GetMapping("/list") + public ResponseEntity> listHelmConfig( + @ApiParam("项目id") + @PathVariable("project_id") Long projectId) { + return Results.success(helmConfigService.listHelmConfig(projectId)); + } + + @ApiOperation("应用层查询helm仓库列表") + @Permission(level = ResourceLevel.ORGANIZATION) + @GetMapping("/app/list") + public ResponseEntity> listHelmConfigOnApp( + @ApiParam("项目id") + @PathVariable("project_id") Long projectId, + @ApiParam("项目id") + @Encrypt + @RequestParam("app_service_id") Long appServiceId) { + return Results.success(helmConfigService.listHelmConfigOnApp(projectId, appServiceId)); + } + + @ApiOperation("查询helm仓库") + @Permission(level = ResourceLevel.ORGANIZATION) + @GetMapping("/{helm_config_id}") + public ResponseEntity queryHelmConfig( + @ApiParam("项目id") + @PathVariable("project_id") Long projectId, + @ApiParam("仓库id") + @Encrypt @PathVariable("helm_config_id") Long helmConfigId) { + return Results.success(helmConfigService.queryDevopsHelmConfig(projectId, helmConfigId)); + } + + @ApiOperation("检查helm名称是否已存在") + @Permission(level = ResourceLevel.ORGANIZATION) + @GetMapping("/check_name_exist") + public ResponseEntity checkNameExist(@ApiParam("项目id") + @PathVariable("project_id") Long projectId, + @ApiParam("仓库名称") + @RequestParam("name") String name, + @ApiParam("仓库id") + @Encrypt @RequestParam(value = "helm_config_id", required = false) Long helmConfigId) { + return Results.success(helmConfigService.checkNameExists(projectId, helmConfigId, name)); + } + + + @ApiOperation("添加helm仓库") + @PostMapping + @Permission(level = ResourceLevel.ORGANIZATION) + public ResponseEntity createDevopsHelmConfig( + @ApiParam("项目id") + @PathVariable("project_id") Long projectId, + @RequestBody DevopsHelmConfigVO devopsHelmConfigVO) { + return Results.success(helmConfigService.createDevopsHelmConfigOnProjectLevel(projectId, devopsHelmConfigVO)); + } + + @ApiOperation("更新helm仓库") + @PutMapping + @Permission(level = ResourceLevel.ORGANIZATION) + public ResponseEntity updateDevopsHelmConfig( + @ApiParam("项目id") + @PathVariable("project_id") Long projectId, + @RequestBody DevopsHelmConfigVO devopsHelmConfigVO) { + return Results.success(helmConfigService.updateDevopsHelmConfigOnProjectLevel(projectId, devopsHelmConfigVO)); + } + + @ApiOperation("删除helm仓库") + @DeleteMapping("/{helm_config_id}") + @Permission(level = ResourceLevel.ORGANIZATION) + public ResponseEntity deleteHelmConfig(@ApiParam("项目id") + @PathVariable("project_id") Long projectId, + @ApiParam("仓库id") + @Encrypt @PathVariable("helm_config_id") Long helmConfigId) { + helmConfigService.deleteDevopsHelmConfig(projectId, helmConfigId); + return Results.success(); + } + + @ApiOperation("将指定仓库设为默认仓库") + @PostMapping("/{helm_config_id}/set_default") + @Permission(level = ResourceLevel.ORGANIZATION) + public ResponseEntity setDefaultHelmConfig(@ApiParam("项目id") + @PathVariable("project_id") Long projectId, + @ApiParam("仓库id") + @Encrypt @PathVariable("helm_config_id") Long helmConfigId) { + helmConfigService.setDefaultDevopsHelmConfig(projectId, helmConfigId); + return Results.success(); + } + + @ApiOperation("获取chart的index内容并返回给前端") + @GetMapping("/{helm_config_id}/index") + @Permission(level = ResourceLevel.ORGANIZATION) + public ResponseEntity getIndexContent(@ApiParam("项目id") + @PathVariable("project_id") Long projectId, + @ApiParam("仓库id") + @Encrypt @PathVariable("helm_config_id") Long helmConfigId) { + return Results.success(helmConfigService.getIndexContent(projectId, helmConfigId)); + } + + @ApiOperation("下载chart包") + @GetMapping("/{helm_config_id}/charts/download") + @Permission(level = ResourceLevel.ORGANIZATION) + public ResponseEntity downloadCharts( + @ApiParam("项目id") + @PathVariable("project_id") Long projectId, + @ApiParam("仓库id") + @Encrypt @PathVariable("helm_config_id") Long helmConfigId, + @RequestParam("chart_url") String chartUrl) { + String[] chartInfos = chartUrl.split("/"); + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.add("Content-Disposition", String.format("attchement;filename=%s", chartInfos[1])); + httpHeaders.add("content-type", "application/x-tar"); + return new ResponseEntity<>(helmConfigService.downloadChart(helmConfigId, chartUrl), httpHeaders, HttpStatus.OK); + } +} \ No newline at end of file diff --git a/src/main/java/io/choerodon/devops/api/controller/v1/DevopsHostController.java b/src/main/java/io/choerodon/devops/api/controller/v1/DevopsHostController.java index bdf085fbf6..48ef089581 100644 --- a/src/main/java/io/choerodon/devops/api/controller/v1/DevopsHostController.java +++ b/src/main/java/io/choerodon/devops/api/controller/v1/DevopsHostController.java @@ -4,7 +4,6 @@ import java.util.Map; import java.util.Optional; import java.util.Set; -import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; import io.swagger.annotations.ApiOperation; diff --git a/src/main/java/io/choerodon/devops/api/controller/v1/DevopsOrganizationConfigController.java b/src/main/java/io/choerodon/devops/api/controller/v1/DevopsOrganizationConfigController.java index 6983da3be9..cc2aa55e13 100644 --- a/src/main/java/io/choerodon/devops/api/controller/v1/DevopsOrganizationConfigController.java +++ b/src/main/java/io/choerodon/devops/api/controller/v1/DevopsOrganizationConfigController.java @@ -4,7 +4,6 @@ import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; -import org.hzero.starter.keyencrypt.core.Encrypt; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -91,7 +90,7 @@ public ResponseEntity checkChart( @ApiParam(value = "chartMuseum信息", required = true) @RequestBody ConfigVO configVO) { return Optional.ofNullable( - appServiceService.checkChart(configVO.getUrl(), configVO.getUserName(), configVO.getPassword())) + appServiceService.checkChartOnOrganization(configVO.getUrl(), configVO.getUserName(), configVO.getPassword())) .map(target -> new ResponseEntity<>(target, HttpStatus.OK)) .orElseThrow(() -> new CommonException("error.connection.failed")); } diff --git a/src/main/java/io/choerodon/devops/api/controller/v1/DevopsProjectConfigController.java b/src/main/java/io/choerodon/devops/api/controller/v1/DevopsProjectConfigController.java index c47ea87f28..14bd977184 100644 --- a/src/main/java/io/choerodon/devops/api/controller/v1/DevopsProjectConfigController.java +++ b/src/main/java/io/choerodon/devops/api/controller/v1/DevopsProjectConfigController.java @@ -12,6 +12,7 @@ import io.choerodon.core.exception.CommonException; import io.choerodon.core.iam.InitRoleCode; import io.choerodon.core.iam.ResourceLevel; +import io.choerodon.devops.api.vo.CheckInfoVO; import io.choerodon.devops.api.vo.ConfigVO; import io.choerodon.devops.api.vo.DefaultConfigVO; import io.choerodon.devops.api.vo.DevopsConfigRepVO; @@ -98,13 +99,13 @@ public ResponseEntity queryProjectDefaultConfig( @Permission(level = ResourceLevel.ORGANIZATION, roles = {InitRoleCode.PROJECT_OWNER}) @ApiOperation(value = "校验chart配置信息是否正确") @PostMapping(value = "/check_chart") - public ResponseEntity checkChart( + public ResponseEntity checkChart( @ApiParam(value = "项目id", required = true) @PathVariable(value = "project_id") Long projectId, @ApiParam(value = "chartMuseum信息", required = true) @RequestBody ConfigVO configVO) { return Optional.ofNullable( - appServiceService.checkChart(configVO.getUrl(), configVO.getUserName(), configVO.getPassword())) + appServiceService.checkChart(projectId, configVO.getUrl(), configVO.getUsername(), configVO.getPassword())) .map(target -> new ResponseEntity<>(target, HttpStatus.OK)) .orElseThrow(() -> new CommonException("error.connection.failed")); } diff --git a/src/main/java/io/choerodon/devops/api/controller/v1/DevopsProjectController.java b/src/main/java/io/choerodon/devops/api/controller/v1/DevopsProjectController.java index c3f80c0da9..ea9da99566 100644 --- a/src/main/java/io/choerodon/devops/api/controller/v1/DevopsProjectController.java +++ b/src/main/java/io/choerodon/devops/api/controller/v1/DevopsProjectController.java @@ -5,7 +5,6 @@ import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; -import org.hzero.starter.keyencrypt.core.Encrypt; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -19,7 +18,6 @@ import io.choerodon.devops.api.vo.ProjectReqVO; import io.choerodon.devops.api.vo.iam.UserVO; import io.choerodon.devops.app.service.DevopsProjectService; -import io.choerodon.devops.infra.dto.DevopsProjectDTO; import io.choerodon.devops.infra.dto.GitlabProjectSimple; import io.choerodon.mybatis.pagehelper.domain.PageRequest; import io.choerodon.swagger.annotation.CustomPageRequest; diff --git a/src/main/java/io/choerodon/devops/api/controller/v1/GitlabWebHookController.java b/src/main/java/io/choerodon/devops/api/controller/v1/GitlabWebHookController.java index 08f08d3864..e8dc324099 100644 --- a/src/main/java/io/choerodon/devops/api/controller/v1/GitlabWebHookController.java +++ b/src/main/java/io/choerodon/devops/api/controller/v1/GitlabWebHookController.java @@ -43,12 +43,12 @@ public ResponseEntity gitOpsWebHook(HttpServletRequest httpServletRequest, return new ResponseEntity<>(HttpStatus.NO_CONTENT); } - @ApiOperation(value = "查询自动化测试应用实例状态") - @Permission(permissionPublic = true) - @PostMapping("/get_test_status") - public void getTestStatus( - @ApiParam(value = "releaseName", required = true) - @RequestBody Map> testReleases) { - appServiceInstanceService.getTestAppStatus(testReleases); - } +// @ApiOperation(value = "查询自动化测试应用实例状态") +// @Permission(permissionPublic = true) +// @PostMapping("/get_test_status") +// public void getTestStatus( +// @ApiParam(value = "releaseName", required = true) +// @RequestBody Map> testReleases) { +// appServiceInstanceService.getTestAppStatus(testReleases); +// } } diff --git a/src/main/java/io/choerodon/devops/api/validator/DevopsCiPipelineAdditionalValidator.java b/src/main/java/io/choerodon/devops/api/validator/DevopsCiPipelineAdditionalValidator.java index bd506c881c..879ac64f3c 100644 --- a/src/main/java/io/choerodon/devops/api/validator/DevopsCiPipelineAdditionalValidator.java +++ b/src/main/java/io/choerodon/devops/api/validator/DevopsCiPipelineAdditionalValidator.java @@ -216,7 +216,7 @@ public static void validateMavenBuildStep(DevopsCiMavenBuildConfigVO config) { // 校验用户直接粘贴的maven的settings文件的内容 if (!StringUtils.isEmpty(config.getMavenSettings()) - && !MavenSettingsUtil.isXmlFormat(Base64Util.getBase64DecodedString(config.getMavenSettings()))) { + && !MavenSettingsUtil.isXmlFormat(config.getMavenSettings())) { // 如果不符合xml格式,抛异常 throw new CommonException(ERROR_MAVEN_SETTINGS_NOT_XML_FORMAT); } diff --git a/src/main/java/io/choerodon/devops/api/validator/DevopsHostAdditionalCheckValidator.java b/src/main/java/io/choerodon/devops/api/validator/DevopsHostAdditionalCheckValidator.java index 97de450925..f62d9a3d0a 100644 --- a/src/main/java/io/choerodon/devops/api/validator/DevopsHostAdditionalCheckValidator.java +++ b/src/main/java/io/choerodon/devops/api/validator/DevopsHostAdditionalCheckValidator.java @@ -50,10 +50,10 @@ public void validHostInformationMatch(DevopsHostCreateRequestVO devopsHostCreate } public void validHostIdAndInstanceIdMatch(Long hostId, Long instanceId) { - CommonExAssertUtil.assertTrue(devopsHostService.HostIdInstanceIdMatch(hostId, instanceId), "error.host.id.instance.id.not.match"); + CommonExAssertUtil.assertTrue(devopsHostService.hostIdInstanceIdMatch(hostId, instanceId), "error.host.id.instance.id.not.match"); } public void validHostIdAndDockerInstanceIdMatch(Long hostId, Long instanceId) { - CommonExAssertUtil.assertTrue(devopsHostService.HostIdDockerInstanceMatch(hostId, instanceId), "error.host.id.instance.id.not.match"); + CommonExAssertUtil.assertTrue(devopsHostService.hostIdDockerInstanceMatch(hostId, instanceId), "error.host.id.instance.id.not.match"); } } diff --git a/src/main/java/io/choerodon/devops/api/validator/DevopsPvValidator.java b/src/main/java/io/choerodon/devops/api/validator/DevopsPvValidator.java index d6cd058b90..dcaf091f66 100644 --- a/src/main/java/io/choerodon/devops/api/validator/DevopsPvValidator.java +++ b/src/main/java/io/choerodon/devops/api/validator/DevopsPvValidator.java @@ -1,12 +1,13 @@ package io.choerodon.devops.api.validator; +import io.kubernetes.client.openapi.models.V1HostPathVolumeSource; +import io.kubernetes.client.openapi.models.V1NFSVolumeSource; + +import java.util.regex.Pattern; + import io.choerodon.core.exception.CommonException; import io.choerodon.devops.api.vo.kubernetes.LocalPvResource; import io.choerodon.devops.infra.enums.VolumeTypeEnum; -import io.kubernetes.client.models.V1HostPathVolumeSource; -import io.kubernetes.client.models.V1NFSVolumeSource; - -import java.util.regex.Pattern; public class DevopsPvValidator { diff --git a/src/main/java/io/choerodon/devops/api/validator/DevopsServiceValidator.java b/src/main/java/io/choerodon/devops/api/validator/DevopsServiceValidator.java index d738773517..7b99d53ea8 100644 --- a/src/main/java/io/choerodon/devops/api/validator/DevopsServiceValidator.java +++ b/src/main/java/io/choerodon/devops/api/validator/DevopsServiceValidator.java @@ -2,13 +2,13 @@ import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.regex.Pattern; import java.util.stream.Collectors; import com.fasterxml.jackson.core.type.TypeReference; -import org.apache.commons.lang.ObjectUtils; -import org.apache.commons.lang.StringUtils; import org.springframework.util.CollectionUtils; +import org.springframework.util.ObjectUtils; import io.choerodon.core.convertor.ApplicationContextHelper; import io.choerodon.core.exception.CommonException; @@ -47,7 +47,7 @@ private DevopsServiceValidator() { public static void checkService(DevopsServiceReqVO devopsServiceReqVO, Long targetServiceId) { devopsServiceReqVO.getPorts().forEach(DevopsServiceValidator::checkPorts); checkName(devopsServiceReqVO.getName()); - if (!StringUtils.isEmpty(devopsServiceReqVO.getExternalIp()) + if (!ObjectUtils.isEmpty(devopsServiceReqVO.getExternalIp()) && !Pattern.matches(EXTERNAL_IP_PATTERN, devopsServiceReqVO.getExternalIp())) { throw new CommonException("error.externalIp.notMatch"); } @@ -95,8 +95,8 @@ private static void checkIPAndPortUnique(DevopsServiceReqVO devopsServiceReqVO, Long port = portMapVO.getPort(); String externalIp = s.getExternalIp(); devopsServiceReqVO.getPorts().forEach(p -> { - if (!StringUtils.isEmpty(devopsServiceReqVO.getExternalIp())) { - if (ObjectUtils.equals(port, p.getPort()) && ObjectUtils.equals(externalIp, devopsServiceReqVO.getExternalIp())) { + if (!ObjectUtils.isEmpty(devopsServiceReqVO.getExternalIp())) { + if (Objects.equals(port, p.getPort()) && Objects.equals(externalIp, devopsServiceReqVO.getExternalIp())) { throw new CommonException("error.same.externalIp.port.exist"); } } @@ -116,7 +116,7 @@ private static void checkIPAndPortUnique(DevopsServiceReqVO devopsServiceReqVO, Long nodePort = portMapVO.getNodePort(); if (nodePort != null) { devopsServiceReqVO.getPorts().forEach(p -> { - if (ObjectUtils.equals(nodePort, p.getNodePort())) { + if (Objects.equals(nodePort, p.getNodePort())) { throw new CommonException("error.same.nodePort.exist"); } }); diff --git a/src/main/java/io/choerodon/devops/api/vo/AppServiceRepVO.java b/src/main/java/io/choerodon/devops/api/vo/AppServiceRepVO.java index 43fbf75222..9f744d6fda 100644 --- a/src/main/java/io/choerodon/devops/api/vo/AppServiceRepVO.java +++ b/src/main/java/io/choerodon/devops/api/vo/AppServiceRepVO.java @@ -142,6 +142,18 @@ public class AppServiceRepVO { @ApiModelProperty("用户权限等级") private Integer accessLevel; + @ApiModelProperty("helm仓库配置id") + @Encrypt + private Long helmConfigId; + + public Long getHelmConfigId() { + return helmConfigId; + } + + public void setHelmConfigId(Long helmConfigId) { + this.helmConfigId = helmConfigId; + } + public Long getExternalConfigId() { return externalConfigId; } diff --git a/src/main/java/io/choerodon/devops/api/vo/AppServiceUpdateDTO.java b/src/main/java/io/choerodon/devops/api/vo/AppServiceUpdateDTO.java index 0b0a52ef5c..2ba37db177 100644 --- a/src/main/java/io/choerodon/devops/api/vo/AppServiceUpdateDTO.java +++ b/src/main/java/io/choerodon/devops/api/vo/AppServiceUpdateDTO.java @@ -25,8 +25,13 @@ public class AppServiceUpdateDTO { @ApiModelProperty("harbor配置") private DevopsConfigVO harbor; @ApiModelProperty("char配置") + @Deprecated private DevopsConfigVO chart; + @Encrypt + @ApiModelProperty("helm配置id") + private Long helmConfigId; + @Length(max = 512, min = 1) @Pattern(regexp = "[A-Za-z0-9_\\-.]+") @ApiModelProperty("应用服务附加的pom信息:groupId(敏捷使用)") @@ -115,4 +120,11 @@ public void setHarborRepoConfigDTO(HarborRepoConfigDTO harborRepoConfigDTO) { this.harborRepoConfigDTO = harborRepoConfigDTO; } + public Long getHelmConfigId() { + return helmConfigId; + } + + public void setHelmConfigId(Long helmConfigId) { + this.helmConfigId = helmConfigId; + } } diff --git a/src/main/java/io/choerodon/devops/api/vo/AppServiceVersionVO.java b/src/main/java/io/choerodon/devops/api/vo/AppServiceVersionVO.java index 4037d5e5a3..6d9d583b49 100644 --- a/src/main/java/io/choerodon/devops/api/vo/AppServiceVersionVO.java +++ b/src/main/java/io/choerodon/devops/api/vo/AppServiceVersionVO.java @@ -5,6 +5,10 @@ import io.swagger.annotations.ApiModelProperty; import org.hzero.starter.keyencrypt.core.Encrypt; +import io.choerodon.devops.api.vo.appversion.AppServiceHelmVersionVO; +import io.choerodon.devops.api.vo.appversion.AppServiceImageVersionVO; +import io.choerodon.devops.api.vo.appversion.AppServiceMavenVersionVO; + /** * Created by younger on 2018/4/14. */ @@ -18,15 +22,45 @@ public class AppServiceVersionVO { private Long appServiceId; @ApiModelProperty("版本创建时间") private Date creationDate; - @ApiModelProperty("版本中镜像推送的镜像仓库类型") - private String repoType; @ApiModelProperty("版本是否可以删除标记") private Boolean deleteFlag = true; @ApiModelProperty("版本最近更新时间") private Date lastUpdateDate; + @ApiModelProperty("版本中镜像推送的镜像仓库类型") + private String repoType; @ApiModelProperty("docker镜像版本") private String image; + @ApiModelProperty(value = "关联的helm版本信息") + private AppServiceHelmVersionVO appServiceHelmVersionVO; + @ApiModelProperty(value = "关联的maven版本信息") + private AppServiceMavenVersionVO appServiceMavenVersionVO; + @ApiModelProperty(value = "关联的镜像版本信息") + private AppServiceImageVersionVO appServiceImageVersionVO; + + public AppServiceHelmVersionVO getAppServiceHelmVersionVO() { + return appServiceHelmVersionVO; + } + + public void setAppServiceHelmVersionVO(AppServiceHelmVersionVO appServiceHelmVersionVO) { + this.appServiceHelmVersionVO = appServiceHelmVersionVO; + } + + public AppServiceMavenVersionVO getAppServiceMavenVersionVO() { + return appServiceMavenVersionVO; + } + + public void setAppServiceMavenVersionVO(AppServiceMavenVersionVO appServiceMavenVersionVO) { + this.appServiceMavenVersionVO = appServiceMavenVersionVO; + } + + public AppServiceImageVersionVO getAppServiceImageVersionVO() { + return appServiceImageVersionVO; + } + + public void setAppServiceImageVersionVO(AppServiceImageVersionVO appServiceImageVersionVO) { + this.appServiceImageVersionVO = appServiceImageVersionVO; + } public Date getLastUpdateDate() { return lastUpdateDate; diff --git a/src/main/java/io/choerodon/devops/api/vo/CheckInfoVO.java b/src/main/java/io/choerodon/devops/api/vo/CheckInfoVO.java new file mode 100644 index 0000000000..0c9bedde73 --- /dev/null +++ b/src/main/java/io/choerodon/devops/api/vo/CheckInfoVO.java @@ -0,0 +1,37 @@ +package io.choerodon.devops.api.vo; + +/** + * 〈功能简述〉 + * 〈〉 + * + * @author lihao + * @since 2022/07/22 + */ +public class CheckInfoVO { + private boolean success; + private String errMsg; + + public CheckInfoVO() { + } + + public CheckInfoVO(boolean success, String errMsg) { + this.success = success; + this.errMsg = errMsg; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public String getErrMsg() { + return errMsg; + } + + public void setErrMsg(String errMsg) { + this.errMsg = errMsg; + } +} diff --git a/src/main/java/io/choerodon/devops/api/vo/CiPipelineImageVO.java b/src/main/java/io/choerodon/devops/api/vo/CiPipelineImageVO.java index d4d1164816..0f91f3f975 100644 --- a/src/main/java/io/choerodon/devops/api/vo/CiPipelineImageVO.java +++ b/src/main/java/io/choerodon/devops/api/vo/CiPipelineImageVO.java @@ -2,6 +2,8 @@ import javax.validation.constraints.NotNull; +import io.swagger.annotations.ApiParam; + /** * @author scp * @date 2020/7/21 @@ -20,6 +22,16 @@ public class CiPipelineImageVO { private Long harborRepoId; @NotNull private String repoType; + @ApiParam(value = "版本", required = true) + private String version; + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } public String getToken() { return token; diff --git a/src/main/java/io/choerodon/devops/api/vo/ConfigVO.java b/src/main/java/io/choerodon/devops/api/vo/ConfigVO.java index 7c62bf516b..99b26c9a01 100644 --- a/src/main/java/io/choerodon/devops/api/vo/ConfigVO.java +++ b/src/main/java/io/choerodon/devops/api/vo/ConfigVO.java @@ -15,6 +15,8 @@ public class ConfigVO implements Serializable { private String userName; + private String username; + private String password; private String project; @@ -23,6 +25,16 @@ public class ConfigVO implements Serializable { private Boolean isPrivate; + public ConfigVO() { + } + + public ConfigVO(String url, String userName, String password, Boolean isPrivate) { + this.url = url; + this.userName = userName; + this.password = password; + this.isPrivate = isPrivate; + } + public String getUrl() { return url; } @@ -71,6 +83,14 @@ public void setIsPrivate(Boolean aPrivate) { isPrivate = aPrivate; } + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/src/main/java/io/choerodon/devops/api/vo/DevopsCiPipelineRecordVO.java b/src/main/java/io/choerodon/devops/api/vo/DevopsCiPipelineRecordVO.java index 46ca7823be..5204d18d44 100644 --- a/src/main/java/io/choerodon/devops/api/vo/DevopsCiPipelineRecordVO.java +++ b/src/main/java/io/choerodon/devops/api/vo/DevopsCiPipelineRecordVO.java @@ -45,6 +45,16 @@ public class DevopsCiPipelineRecordVO extends DevopsPipelineRecordVO { private Date lastUpdateDate; private Long gitlabProjectId; + @ApiModelProperty("gitlab commit sha") + private String commitSha; + + public String getCommitSha() { + return commitSha; + } + + public void setCommitSha(String commitSha) { + this.commitSha = commitSha; + } public Long getGitlabProjectId() { return gitlabProjectId; diff --git a/src/main/java/io/choerodon/devops/api/vo/DevopsEnvironmentInfoVO.java b/src/main/java/io/choerodon/devops/api/vo/DevopsEnvironmentInfoVO.java index 3256f4e829..6bdc478439 100644 --- a/src/main/java/io/choerodon/devops/api/vo/DevopsEnvironmentInfoVO.java +++ b/src/main/java/io/choerodon/devops/api/vo/DevopsEnvironmentInfoVO.java @@ -47,6 +47,8 @@ public class DevopsEnvironmentInfoVO { @ApiModelProperty("gitops同步状态") private String gitopsStatus; + private String clusterBelongedProjectName; + public Boolean getFail() { return fail; } @@ -166,4 +168,12 @@ public String getGitlabUrl() { public void setGitlabUrl(String gitlabUrl) { this.gitlabUrl = gitlabUrl; } + + public String getClusterBelongedProjectName() { + return clusterBelongedProjectName; + } + + public void setClusterBelongedProjectName(String clusterBelongedProjectName) { + this.clusterBelongedProjectName = clusterBelongedProjectName; + } } diff --git a/src/main/java/io/choerodon/devops/api/vo/DevopsHelmConfigVO.java b/src/main/java/io/choerodon/devops/api/vo/DevopsHelmConfigVO.java new file mode 100644 index 0000000000..baf669230e --- /dev/null +++ b/src/main/java/io/choerodon/devops/api/vo/DevopsHelmConfigVO.java @@ -0,0 +1,178 @@ +package io.choerodon.devops.api.vo; + +import java.util.Date; +import javax.validation.constraints.NotNull; + +import io.swagger.annotations.ApiModelProperty; +import org.hibernate.validator.constraints.Length; +import org.hzero.starter.keyencrypt.core.Encrypt; + +public class DevopsHelmConfigVO { + @Encrypt + private Long id; + + @ApiModelProperty("仓库名称") + @Length(max = 60, min = 1) + private String name; + + @ApiModelProperty("helm仓库地址 平台层或组织层为仓库地址前缀部分 项目层是完整的仓库地址") + @NotNull + private String url; + + @ApiModelProperty("仓库账号") + private String username; + + @ApiModelProperty("仓库密码") + private String password; + + @ApiModelProperty("关联该配置的层级 project/organization/side") + private String resourceType; + + @ApiModelProperty("关联该仓库配置的资源id, 项目id 组织id 平台层为0") + private Long resourceId; + + @ApiModelProperty("仓库是否私有") + private Boolean repoPrivate; + + @ApiModelProperty("是否为默认仓库") + private Boolean repoDefault; + + @ApiModelProperty("创建时间") + private Date creationDate; + + @ApiModelProperty("创建者头像") + private String creatorImageUrl; + + @ApiModelProperty("创建者登录名") + private String creatorLoginName; + + @ApiModelProperty("创建者真实名称") + private String creatorRealName; + + @ApiModelProperty("版本控制号") + private Long objectVersionNumber; + + @ApiModelProperty("创建者") + @Encrypt + private Long createdBy; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public Long getResourceId() { + return resourceId; + } + + public void setResourceId(Long resourceId) { + this.resourceId = resourceId; + } + + public Boolean getRepoPrivate() { + return repoPrivate; + } + + public void setRepoPrivate(Boolean repoPrivate) { + this.repoPrivate = repoPrivate; + } + + public Boolean getRepoDefault() { + return repoDefault; + } + + public void setRepoDefault(Boolean repoDefault) { + this.repoDefault = repoDefault; + } + + public Date getCreationDate() { + return creationDate; + } + + public void setCreationDate(Date creationDate) { + this.creationDate = creationDate; + } + + public String getCreatorImageUrl() { + return creatorImageUrl; + } + + public void setCreatorImageUrl(String creatorImageUrl) { + this.creatorImageUrl = creatorImageUrl; + } + + public String getCreatorLoginName() { + return creatorLoginName; + } + + public void setCreatorLoginName(String creatorLoginName) { + this.creatorLoginName = creatorLoginName; + } + + public String getCreatorRealName() { + return creatorRealName; + } + + public void setCreatorRealName(String creatorRealName) { + this.creatorRealName = creatorRealName; + } + + public Long getObjectVersionNumber() { + return objectVersionNumber; + } + + public void setObjectVersionNumber(Long objectVersionNumber) { + this.objectVersionNumber = objectVersionNumber; + } + + public Long getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(Long createdBy) { + this.createdBy = createdBy; + } +} diff --git a/src/main/java/io/choerodon/devops/api/vo/DevopsServiceConfigVO.java b/src/main/java/io/choerodon/devops/api/vo/DevopsServiceConfigVO.java index 678cd966db..e462dfc706 100644 --- a/src/main/java/io/choerodon/devops/api/vo/DevopsServiceConfigVO.java +++ b/src/main/java/io/choerodon/devops/api/vo/DevopsServiceConfigVO.java @@ -17,6 +17,16 @@ public class DevopsServiceConfigVO { private List externalIps; @ApiModelProperty("端口号") private List ports; + @ApiModelProperty("clusterIp") + private String clusterIp; + + public String getClusterIp() { + return clusterIp; + } + + public void setClusterIp(String clusterIp) { + this.clusterIp = clusterIp; + } public List getExternalIps() { return externalIps; diff --git a/src/main/java/io/choerodon/devops/api/vo/appversion/AppServiceHelmVersionVO.java b/src/main/java/io/choerodon/devops/api/vo/appversion/AppServiceHelmVersionVO.java new file mode 100644 index 0000000000..5fbba9bb08 --- /dev/null +++ b/src/main/java/io/choerodon/devops/api/vo/appversion/AppServiceHelmVersionVO.java @@ -0,0 +1,127 @@ +package io.choerodon.devops.api.vo.appversion; + +import io.swagger.annotations.ApiModelProperty; +import org.hzero.starter.keyencrypt.core.Encrypt; + +/** + * @author hao.wang@zknow.com + * @since 2022-07-14 10:41:40 + */ +public class AppServiceHelmVersionVO { + + @Encrypt + private Long id; + @ApiModelProperty(value = "应用服务版本,devops_app_service_version.id", required = true) + @Encrypt + private Long appServiceVersionId; + @ApiModelProperty(value = "配置Id", required = true) + @Encrypt + private Long helmConfigId; + @ApiModelProperty(value = "仓库类型(DEFAULT_REPO、CUSTOM_REPO)", required = true) + private String harborRepoType; + @ApiModelProperty(value = "配置Id", required = true) + @Encrypt + private Long harborConfigId; + @ApiModelProperty(value = "参数 ID", required = true) + @Encrypt + private Long valueId; + @ApiModelProperty(value = "readme value id", required = true) + @Encrypt + private Long readmeValueId; + @ApiModelProperty(value = "镜像名", required = true) + private String image; + @ApiModelProperty(value = "仓库地址", required = true) + private String repository; + @ApiModelProperty(value = "chart包名", required = true) + private String chartName; + @ApiModelProperty("版本号") + private String version; + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public String getChartName() { + return chartName; + } + + public void setChartName(String chartName) { + this.chartName = chartName; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getAppServiceVersionId() { + return appServiceVersionId; + } + + public void setAppServiceVersionId(Long appServiceVersionId) { + this.appServiceVersionId = appServiceVersionId; + } + + public Long getHelmConfigId() { + return helmConfigId; + } + + public void setHelmConfigId(Long helmConfigId) { + this.helmConfigId = helmConfigId; + } + + public String getHarborRepoType() { + return harborRepoType; + } + + public void setHarborRepoType(String harborRepoType) { + this.harborRepoType = harborRepoType; + } + + public Long getHarborConfigId() { + return harborConfigId; + } + + public void setHarborConfigId(Long harborConfigId) { + this.harborConfigId = harborConfigId; + } + + public Long getValueId() { + return valueId; + } + + public void setValueId(Long valueId) { + this.valueId = valueId; + } + + public Long getReadmeValueId() { + return readmeValueId; + } + + public void setReadmeValueId(Long readmeValueId) { + this.readmeValueId = readmeValueId; + } + + public String getImage() { + return image; + } + + public void setImage(String image) { + this.image = image; + } + + public String getRepository() { + return repository; + } + + public void setRepository(String repository) { + this.repository = repository; + } +} diff --git a/src/main/java/io/choerodon/devops/api/vo/appversion/AppServiceImageVersionVO.java b/src/main/java/io/choerodon/devops/api/vo/appversion/AppServiceImageVersionVO.java new file mode 100644 index 0000000000..06e03c03a4 --- /dev/null +++ b/src/main/java/io/choerodon/devops/api/vo/appversion/AppServiceImageVersionVO.java @@ -0,0 +1,65 @@ +package io.choerodon.devops.api.vo.appversion; + +import io.swagger.annotations.ApiModelProperty; +import org.hzero.starter.keyencrypt.core.Encrypt; + +/** + * @author hao.wang@zknow.com + * @since 2022-07-14 10:42:13 + */ +public class AppServiceImageVersionVO { + + @Encrypt + private Long id; + @ApiModelProperty(value = "应用服务版本,devops_app_service_version.id", required = true) + @Encrypt + private Long appServiceVersionId; + @ApiModelProperty(value = "仓库类型(DEFAULT_REPO、CUSTOM_REPO)", required = true) + private String harborRepoType; + @ApiModelProperty(value = "配置Id", required = true) + @Encrypt + private Long harborConfigId; + @ApiModelProperty(value = "镜像名", required = true) + private String image; + + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getAppServiceVersionId() { + return appServiceVersionId; + } + + public void setAppServiceVersionId(Long appServiceVersionId) { + this.appServiceVersionId = appServiceVersionId; + } + + public String getHarborRepoType() { + return harborRepoType; + } + + public void setHarborRepoType(String harborRepoType) { + this.harborRepoType = harborRepoType; + } + + public Long getHarborConfigId() { + return harborConfigId; + } + + public void setHarborConfigId(Long harborConfigId) { + this.harborConfigId = harborConfigId; + } + + public String getImage() { + return image; + } + + public void setImage(String image) { + this.image = image; + } +} diff --git a/src/main/java/io/choerodon/devops/api/vo/appversion/AppServiceMavenVersionVO.java b/src/main/java/io/choerodon/devops/api/vo/appversion/AppServiceMavenVersionVO.java new file mode 100644 index 0000000000..6db97b402c --- /dev/null +++ b/src/main/java/io/choerodon/devops/api/vo/appversion/AppServiceMavenVersionVO.java @@ -0,0 +1,105 @@ +package io.choerodon.devops.api.vo.appversion; + +import io.swagger.annotations.ApiModelProperty; +import org.hzero.starter.keyencrypt.core.Encrypt; + +/** + * @author hao.wang@zknow.com + * @since 2022-07-14 10:42:26 + */ +public class AppServiceMavenVersionVO { + + @Encrypt + private Long id; + @ApiModelProperty(value = "应用服务版本,devops_app_service_version.id", required = true) + @Encrypt + private Long appServiceVersionId; + @ApiModelProperty(value = "groupId", required = true) + private String groupId; + @ApiModelProperty(value = "artifactId", required = true) + private String artifactId; + @ApiModelProperty(value = "版本", required = true) + private String version; + @ApiModelProperty(value = "nexus仓库id,hrds_prod_repo.rdupm_nexus_repository.repository_id") + @Encrypt + private Long nexusRepoId; + + private String mavenRepoUrl; + + private String username; + + private String password; + + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getAppServiceVersionId() { + return appServiceVersionId; + } + + public void setAppServiceVersionId(Long appServiceVersionId) { + this.appServiceVersionId = appServiceVersionId; + } + + public String getGroupId() { + return groupId; + } + + public void setGroupId(String groupId) { + this.groupId = groupId; + } + + public String getArtifactId() { + return artifactId; + } + + public void setArtifactId(String artifactId) { + this.artifactId = artifactId; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public Long getNexusRepoId() { + return nexusRepoId; + } + + public void setNexusRepoId(Long nexusRepoId) { + this.nexusRepoId = nexusRepoId; + } + + public String getMavenRepoUrl() { + return mavenRepoUrl; + } + + public void setMavenRepoUrl(String mavenRepoUrl) { + this.mavenRepoUrl = mavenRepoUrl; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } +} diff --git a/src/main/java/io/choerodon/devops/api/vo/chart/ChartTagVO.java b/src/main/java/io/choerodon/devops/api/vo/chart/ChartTagVO.java index 5909ff47e6..03ea50de31 100644 --- a/src/main/java/io/choerodon/devops/api/vo/chart/ChartTagVO.java +++ b/src/main/java/io/choerodon/devops/api/vo/chart/ChartTagVO.java @@ -14,6 +14,24 @@ public class ChartTagVO { private String chartName; private String chartVersion; private Long appServiceId; + private Long tenantId; + private Long projectId; + + public Long getTenantId() { + return tenantId; + } + + public void setTenantId(Long tenantId) { + this.tenantId = tenantId; + } + + public Long getProjectId() { + return projectId; + } + + public void setProjectId(Long projectId) { + this.projectId = projectId; + } public String getOrgCode() { return orgCode; diff --git a/src/main/java/io/choerodon/devops/api/vo/iam/ImmutableProjectInfoVO.java b/src/main/java/io/choerodon/devops/api/vo/iam/ImmutableProjectInfoVO.java index 2c6e46a734..49447ffad3 100644 --- a/src/main/java/io/choerodon/devops/api/vo/iam/ImmutableProjectInfoVO.java +++ b/src/main/java/io/choerodon/devops/api/vo/iam/ImmutableProjectInfoVO.java @@ -11,6 +11,8 @@ public class ImmutableProjectInfoVO { @ApiModelProperty("项目code") private String projCode; + @ApiModelProperty("devops基础组件中使用的编码,harbor、gitlab、sonar、chartmuserm") + private String devopsComponentCode; @ApiModelProperty("组织id") private Long tenantId; @ApiModelProperty("组织code") @@ -25,6 +27,14 @@ public ImmutableProjectInfoVO(String projCode, Long tenantId, String tenantNum) this.tenantNum = tenantNum; } + public String getDevopsComponentCode() { + return devopsComponentCode; + } + + public void setDevopsComponentCode(String devopsComponentCode) { + this.devopsComponentCode = devopsComponentCode; + } + public String getProjCode() { return projCode; } diff --git a/src/main/java/io/choerodon/devops/api/vo/pipeline/PipelineCompositeRecordVO.java b/src/main/java/io/choerodon/devops/api/vo/pipeline/PipelineCompositeRecordVO.java index 20cb9fe233..e5e8156116 100644 --- a/src/main/java/io/choerodon/devops/api/vo/pipeline/PipelineCompositeRecordVO.java +++ b/src/main/java/io/choerodon/devops/api/vo/pipeline/PipelineCompositeRecordVO.java @@ -2,6 +2,8 @@ import java.util.Date; +import org.hzero.starter.keyencrypt.core.Encrypt; + /** * 〈功能简述〉 * 〈〉 @@ -10,10 +12,20 @@ * @since 2020/11/16 14:54 */ public class PipelineCompositeRecordVO { + @Encrypt + private Long id; private String ciStatus; private String cdStatus; private Date creationDate; + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + public String getCiStatus() { return ciStatus; } diff --git a/src/main/java/io/choerodon/devops/api/vo/template/CiTemplateJobGroupVO.java b/src/main/java/io/choerodon/devops/api/vo/template/CiTemplateJobGroupVO.java index 5f609b661f..0a9a73eebb 100644 --- a/src/main/java/io/choerodon/devops/api/vo/template/CiTemplateJobGroupVO.java +++ b/src/main/java/io/choerodon/devops/api/vo/template/CiTemplateJobGroupVO.java @@ -1,12 +1,11 @@ package io.choerodon.devops.api.vo.template; -import io.swagger.annotations.ApiModelProperty; import java.util.Date; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; + +import io.swagger.annotations.ApiModelProperty; import org.hzero.starter.keyencrypt.core.Encrypt; import io.choerodon.devops.infra.dto.iam.IamUserDTO; diff --git a/src/main/java/io/choerodon/devops/api/vo/template/CiTemplateJobStepRelVO.java b/src/main/java/io/choerodon/devops/api/vo/template/CiTemplateJobStepRelVO.java index 0f8243c097..0d373b2db6 100644 --- a/src/main/java/io/choerodon/devops/api/vo/template/CiTemplateJobStepRelVO.java +++ b/src/main/java/io/choerodon/devops/api/vo/template/CiTemplateJobStepRelVO.java @@ -1,7 +1,5 @@ package io.choerodon.devops.api.vo.template; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; import javax.validation.constraints.NotNull; import io.swagger.annotations.ApiModelProperty; diff --git a/src/main/java/io/choerodon/devops/api/vo/template/CiTemplateJobVO.java b/src/main/java/io/choerodon/devops/api/vo/template/CiTemplateJobVO.java index 6e263058fd..7c3b03f9c3 100644 --- a/src/main/java/io/choerodon/devops/api/vo/template/CiTemplateJobVO.java +++ b/src/main/java/io/choerodon/devops/api/vo/template/CiTemplateJobVO.java @@ -2,13 +2,12 @@ import java.util.Date; import java.util.List; +import javax.validation.constraints.NotNull; import com.fasterxml.jackson.annotation.JsonInclude; import io.swagger.annotations.ApiModelProperty; -import javax.validation.constraints.NotNull; import org.hzero.starter.keyencrypt.core.Encrypt; -import io.choerodon.devops.api.vo.DevopsCiStepVO; import io.choerodon.devops.infra.dto.CiTemplateJobGroupDTO; import io.choerodon.devops.infra.dto.iam.IamUserDTO; diff --git a/src/main/java/io/choerodon/devops/api/vo/template/CiTemplateSonarVO.java b/src/main/java/io/choerodon/devops/api/vo/template/CiTemplateSonarVO.java index 9d66c65add..aa88cf572f 100644 --- a/src/main/java/io/choerodon/devops/api/vo/template/CiTemplateSonarVO.java +++ b/src/main/java/io/choerodon/devops/api/vo/template/CiTemplateSonarVO.java @@ -1,10 +1,9 @@ package io.choerodon.devops.api.vo.template; -import io.swagger.annotations.ApiModelProperty; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; import javax.validation.constraints.NotBlank; + +import io.swagger.annotations.ApiModelProperty; import org.hzero.starter.keyencrypt.core.Encrypt; diff --git a/src/main/java/io/choerodon/devops/api/vo/template/CiTemplateStageJobRelVO.java b/src/main/java/io/choerodon/devops/api/vo/template/CiTemplateStageJobRelVO.java index f74d575627..556051eac3 100644 --- a/src/main/java/io/choerodon/devops/api/vo/template/CiTemplateStageJobRelVO.java +++ b/src/main/java/io/choerodon/devops/api/vo/template/CiTemplateStageJobRelVO.java @@ -1,19 +1,10 @@ package io.choerodon.devops.api.vo.template; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.Table; import javax.validation.constraints.NotNull; -import com.fasterxml.jackson.annotation.JsonInclude; -import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import org.hzero.starter.keyencrypt.core.Encrypt; -import io.choerodon.mybatis.annotation.ModifyAudit; -import io.choerodon.mybatis.annotation.VersionAudit; -import io.choerodon.mybatis.domain.AuditDomain; - /** * 流水线阶段与任务模板的关系表(CiTemplateStageJobRel)实体类 * diff --git a/src/main/java/io/choerodon/devops/api/vo/template/CiTemplateVariableVO.java b/src/main/java/io/choerodon/devops/api/vo/template/CiTemplateVariableVO.java index 72cef2ea6d..2a6c87f41d 100644 --- a/src/main/java/io/choerodon/devops/api/vo/template/CiTemplateVariableVO.java +++ b/src/main/java/io/choerodon/devops/api/vo/template/CiTemplateVariableVO.java @@ -1,10 +1,9 @@ package io.choerodon.devops.api.vo.template; -import io.swagger.annotations.ApiModelProperty; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; + +import io.swagger.annotations.ApiModelProperty; import org.hzero.starter.keyencrypt.core.Encrypt; /** diff --git a/src/main/java/io/choerodon/devops/api/vo/test/ApiTestTaskRecordVO.java b/src/main/java/io/choerodon/devops/api/vo/test/ApiTestTaskRecordVO.java index 363b6d3887..3ea8594a41 100644 --- a/src/main/java/io/choerodon/devops/api/vo/test/ApiTestTaskRecordVO.java +++ b/src/main/java/io/choerodon/devops/api/vo/test/ApiTestTaskRecordVO.java @@ -51,6 +51,9 @@ public class ApiTestTaskRecordVO { private Double performThreshold; + @Encrypt + private Long folderId; + public Long getSuiteId() { return suiteId; } @@ -155,11 +158,20 @@ public void setPerformThreshold(Double performThreshold) { this.performThreshold = performThreshold; } + public Long getFolderId() { + return folderId; + } + + public void setFolderId(Long folderId) { + this.folderId = folderId; + } + @Override public String toString() { return "ApiTestTaskRecordVO{" + "id=" + id + ", taskId=" + taskId + + ", suiteId=" + suiteId + ", status='" + status + '\'' + ", startTime=" + startTime + ", endTime=" + endTime + @@ -169,6 +181,8 @@ public String toString() { ", errorMessage='" + errorMessage + '\'' + ", viewId='" + viewId + '\'' + ", deployJobName='" + deployJobName + '\'' + + ", performThreshold=" + performThreshold + + ", folderId=" + folderId + '}'; } } diff --git a/src/main/java/io/choerodon/devops/api/ws/polaris/agent/AgentPolarisSocketHandler.java b/src/main/java/io/choerodon/devops/api/ws/polaris/agent/AgentPolarisSocketHandler.java deleted file mode 100644 index 13bedab92e..0000000000 --- a/src/main/java/io/choerodon/devops/api/ws/polaris/agent/AgentPolarisSocketHandler.java +++ /dev/null @@ -1,51 +0,0 @@ -package io.choerodon.devops.api.ws.polaris.agent; - -import static io.choerodon.devops.infra.constant.DevOpsWebSocketConstants.AGENT_POLARIS; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.socket.TextMessage; -import org.springframework.web.socket.WebSocketSession; - -import io.choerodon.devops.api.vo.polaris.PolarisResponsePayloadVO; -import io.choerodon.devops.api.ws.AbstractSocketHandler; -import io.choerodon.devops.api.ws.WebSocketTool; -import io.choerodon.devops.app.service.PolarisScanningService; -import io.choerodon.devops.infra.util.JsonHelper; - -/** - * // TODO to be delete at 0.25 - * polaris结果的返回不再通过websocket,而是http,这个逻辑不再使用了 - * - * @author zmf - * @since 20-5-9 - */ -@Deprecated -@Component -public class AgentPolarisSocketHandler extends AbstractSocketHandler { - private static final Logger LOGGER = LoggerFactory.getLogger(AgentPolarisSocketHandler.class); - - @Autowired - private PolarisScanningService polarisScanningService; - - @Override - public String processor() { - return AGENT_POLARIS; - } - - @Override - public void handleTextMessage(WebSocketSession session, TextMessage message) { - LOGGER.info("Polaris: received message from agent..."); - - // 获取集群id - Long clusterId = WebSocketTool.getClusterId(session); - LOGGER.info("Polaris: the cluster id is {}", clusterId); - - - polarisScanningService.handleAgentPolarisMessage(JsonHelper.unmarshalByJackson(message.getPayload(), PolarisResponsePayloadVO.class)); - - WebSocketTool.closeSessionQuietly(session); - } -} diff --git a/src/main/java/io/choerodon/devops/api/ws/polaris/agent/AgentPolarisSocketInterceptor.java b/src/main/java/io/choerodon/devops/api/ws/polaris/agent/AgentPolarisSocketInterceptor.java deleted file mode 100644 index 6a2247e06e..0000000000 --- a/src/main/java/io/choerodon/devops/api/ws/polaris/agent/AgentPolarisSocketInterceptor.java +++ /dev/null @@ -1,39 +0,0 @@ -package io.choerodon.devops.api.ws.polaris.agent; - -import static io.choerodon.devops.infra.constant.DevOpsWebSocketConstants.AGENT_POLARIS; - -import java.util.Map; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.server.ServerHttpRequest; -import org.springframework.http.server.ServerHttpResponse; -import org.springframework.http.server.ServletServerHttpRequest; -import org.springframework.stereotype.Component; -import org.springframework.web.socket.WebSocketHandler; - -import io.choerodon.devops.api.ws.AbstractSocketInterceptor; -import io.choerodon.devops.infra.handler.ClusterConnectionHandler; - -/** - * // TODO to be delete at 0.25 - * polaris结果的返回不再通过websocket,而是http,这个逻辑不再使用了 - * - * @author zmf - * @since 20-5-9 - */ -@Deprecated -@Component -public class AgentPolarisSocketInterceptor extends AbstractSocketInterceptor { - @Autowired - private ClusterConnectionHandler clusterConnectionHandler; - - @Override - public String processor() { - return AGENT_POLARIS; - } - - @Override - public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map attributes) { - return clusterConnectionHandler.validConnectionParameter(((ServletServerHttpRequest) request).getServletRequest()); - } -} diff --git a/src/main/java/io/choerodon/devops/app/eventhandler/DemoEnvSetupSagaHandler.java b/src/main/java/io/choerodon/devops/app/eventhandler/DemoEnvSetupSagaHandler.java index c0f9392e70..bcbccb0187 100644 --- a/src/main/java/io/choerodon/devops/app/eventhandler/DemoEnvSetupSagaHandler.java +++ b/src/main/java/io/choerodon/devops/app/eventhandler/DemoEnvSetupSagaHandler.java @@ -61,6 +61,7 @@ private String handleCreateGroupsForDemoProject(String payload) { gitlabGroupPayload.setOrganizationCode(registerInfo.getOrganization().getCode()); gitlabGroupPayload.setOrganizationName(registerInfo.getOrganization().getName()); gitlabGroupPayload.setProjectCode(registerInfo.getProject().getCode()); + gitlabGroupPayload.setDevopsComponentCode(registerInfo.getProject().getCode()); gitlabGroupPayload.setProjectId(registerInfo.getProject().getId()); gitlabGroupPayload.setProjectName(registerInfo.getProject().getName()); gitlabGroupPayload.setUserId(registerInfo.getUser().getId()); diff --git a/src/main/java/io/choerodon/devops/app/eventhandler/DevopsSagaHandler.java b/src/main/java/io/choerodon/devops/app/eventhandler/DevopsSagaHandler.java index e088d7f1cd..abf610cd5b 100644 --- a/src/main/java/io/choerodon/devops/app/eventhandler/DevopsSagaHandler.java +++ b/src/main/java/io/choerodon/devops/app/eventhandler/DevopsSagaHandler.java @@ -1,17 +1,9 @@ package io.choerodon.devops.app.eventhandler; -import static io.choerodon.asgard.saga.SagaDefinition.TimeoutPolicy.ALERT_ONLY; -import static io.choerodon.devops.app.eventhandler.constants.SagaTopicCodeConstants.*; - -import java.io.IOException; -import java.io.PrintWriter; -import java.io.StringWriter; -import java.util.Objects; - import com.alibaba.fastjson.JSONObject; import com.google.gson.Gson; import com.google.gson.JsonObject; -import io.kubernetes.client.JSON; +import io.kubernetes.client.openapi.JSON; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -19,6 +11,14 @@ import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; +import java.io.IOException; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.Objects; + +import static io.choerodon.asgard.saga.SagaDefinition.TimeoutPolicy.ALERT_ONLY; +import static io.choerodon.devops.app.eventhandler.constants.SagaTopicCodeConstants.*; + import io.choerodon.asgard.saga.SagaDefinition; import io.choerodon.asgard.saga.annotation.SagaTask; import io.choerodon.devops.api.vo.*; diff --git a/src/main/java/io/choerodon/devops/app/eventhandler/SagaHandler.java b/src/main/java/io/choerodon/devops/app/eventhandler/SagaHandler.java index eb1fd7f26b..bc22fec9a9 100644 --- a/src/main/java/io/choerodon/devops/app/eventhandler/SagaHandler.java +++ b/src/main/java/io/choerodon/devops/app/eventhandler/SagaHandler.java @@ -1,12 +1,15 @@ package io.choerodon.devops.app.eventhandler; import static io.choerodon.devops.infra.constant.GitOpsConstants.NEW_LINE; +import static io.choerodon.devops.infra.constant.MiscConstants.DEVOPS; +import static io.choerodon.devops.infra.constant.MiscConstants.OPERATIONS; import java.util.ArrayList; import java.util.Collections; import java.util.List; import com.alibaba.fastjson.JSONObject; +import com.fasterxml.jackson.core.type.TypeReference; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import org.slf4j.Logger; @@ -32,9 +35,9 @@ import io.choerodon.devops.infra.dto.iam.ProjectDTO; import io.choerodon.devops.infra.exception.NoTraceException; import io.choerodon.devops.infra.feign.operator.BaseServiceClientOperator; -import io.choerodon.devops.infra.mapper.DevopsCdJobRecordMapper; import io.choerodon.devops.infra.mapper.UserAttrMapper; import io.choerodon.devops.infra.util.ArrayUtil; +import io.choerodon.devops.infra.util.JsonHelper; import io.choerodon.devops.infra.util.LogUtil; import io.choerodon.devops.infra.util.TypeUtil; @@ -51,15 +54,6 @@ public class SagaHandler { private static final Logger LOGGER = LoggerFactory.getLogger(SagaHandler.class); private final Gson gson = new Gson(); - /** - * devops项目类型 - */ - private static final String DEVOPS = "N_DEVOPS"; - - /** - * 运维项目类型 - */ - private static final String OPERATIONS = "N_OPERATIONS"; @Autowired private GitlabGroupService gitlabGroupService; @@ -72,21 +66,17 @@ public class SagaHandler { @Autowired private BaseServiceClientOperator baseServiceClientOperator; @Autowired - private DevopsCdJobRecordMapper devopsCdJobRecordMapper; - @Autowired - private DevopsCdPipelineRecordService devopsCdPipelineRecordService; - @Autowired private ChartService chartService; @Autowired private GitlabHandleService gitlabHandleService; @Autowired private DevopsAppTemplateService devopsAppTemplateService; @Autowired - private DevopsMiddlewareService devopsMiddlewareService; - @Autowired private UserAttrService userAttrService; @Autowired private UserAttrMapper userAttrMapper; + @Autowired + private DevopsGitService devopsGitService; private void loggerInfo(Object o) { if (LOGGER.isInfoEnabled()) { @@ -104,7 +94,7 @@ private void loggerInfo(Object o) { seq = 1) public String handleGitOpsGroupEvent(String msg) { ProjectPayload projectPayload = gson.fromJson(msg, ProjectPayload.class); - if (!projectPayload.getProjectCategoryVOS().stream().map(ProjectCategoryVO::getCode).anyMatch(s -> DEVOPS.equals(s) || s.equals(OPERATIONS))) { + if (projectPayload.getProjectCategoryVOS().stream().map(ProjectCategoryVO::getCode).noneMatch(s -> DEVOPS.equals(s) || s.equals(OPERATIONS))) { return msg; } GitlabGroupPayload gitlabGroupPayload = new GitlabGroupPayload(); @@ -135,19 +125,12 @@ public String handleUpdateGitOpsGroupEvent(String msg) { if (CollectionUtils.isEmpty(projectPayload.getProjectCategoryVOS())) { return msg; } - if (!projectPayload.getProjectCategoryVOS().stream().map(ProjectCategoryVO::getCode).anyMatch(s -> DEVOPS.equals(s) || s.equals(OPERATIONS))) { + if (projectPayload.getProjectCategoryVOS().stream().map(ProjectCategoryVO::getCode).noneMatch(s -> DEVOPS.equals(s) || s.equals(OPERATIONS))) { return msg; } gitlabHandleService.handleProjectCategoryEvent(projectPayload); LOGGER.info(">>>>>>>>>end sync project devops category<<<<<<<<<<"); return msg; - -// ProjectPayload projectPayload = gson.fromJson(msg, ProjectPayload.class); -// GitlabGroupPayload gitlabGroupPayload = new GitlabGroupPayload(); -// BeanUtils.copyProperties(projectPayload, gitlabGroupPayload); -// loggerInfo(msg); -// gitlabGroupService.updateGroups(gitlabGroupPayload); -// return msg; } /** @@ -184,7 +167,7 @@ public List handleDeleteMemberRoleEvent(String payload) { List tempList = new ArrayList<>(gitlabGroupMemberVOList); tempList.forEach(t -> { if (t.getResourceType().equals(ResourceLevel.PROJECT.value())) { - if (!baseServiceClientOperator.listProjectCategoryById(t.getResourceId()).stream().anyMatch(s -> DEVOPS.equals(s) || s.equals(OPERATIONS))) { + if (baseServiceClientOperator.listProjectCategoryById(t.getResourceId()).stream().noneMatch(s -> DEVOPS.equals(s) || s.equals(OPERATIONS))) { gitlabGroupMemberVOList.remove(t); } } @@ -207,9 +190,8 @@ public List handleDeleteMemberRoleEvent(String payload) { sagaCode = SagaTopicCodeConstants.IAM_CREATE_USER, maxRetryCount = 5, seq = 1) public List handleCreateUserEvent(String payload) { - List gitlabUserDTO = gson.fromJson(payload, new TypeToken>() { - }.getType()); - + List gitlabUserDTO = JsonHelper.unmarshalByJackson(payload, new TypeReference>() { + }); loggerInfo(gitlabUserDTO); StringBuilder failedUsers = new StringBuilder(); List exs = new ArrayList<>(); @@ -231,12 +213,6 @@ public List handleCreateUserEvent(String payload) { try { gitlabUserService.createGitlabUserInNewTx(gitlabUserReqDTO); LOGGER.info("Finished to create user {}", t); - // 更改devops_user 登录名 - UserAttrDTO result = userAttrService.baseQueryByIamUserId(TypeUtil.objToLong(t.getId())); - if (!result.getGitlabUserName().equals(t.getUsername())) { - result.setGitlabUserName(t.getUsername()); - userAttrMapper.updateByPrimaryKey(result); - } } catch (Exception ex) { // 补偿机制 // 根据邮箱查询到devops_user 但是对应的iam_user_id 不存在 diff --git a/src/main/java/io/choerodon/devops/app/eventhandler/host/SyncOperatingCommandStatusHandler.java b/src/main/java/io/choerodon/devops/app/eventhandler/host/SyncOperatingCommandStatusHandler.java index 27c3970777..513844084e 100644 --- a/src/main/java/io/choerodon/devops/app/eventhandler/host/SyncOperatingCommandStatusHandler.java +++ b/src/main/java/io/choerodon/devops/app/eventhandler/host/SyncOperatingCommandStatusHandler.java @@ -53,10 +53,10 @@ public void handler(String hostId, Long commandId, String payload) { devopsCdPipelineService.hostDeployStatusUpdate(devopsHostCommandDTO.getCdJobRecordId(), false, "timeout"); } }); - // 2. 同步devops丢失的命令 - List unSyncCommands = commandResultVOS.stream().filter(v -> Boolean.FALSE.equals(v.getNotExist())).collect(Collectors.toList()); - unSyncCommands.forEach(unSyncCommand -> commandResultHandler.handler(hostId, unSyncCommand.getCommandId(), unSyncCommand)); } + // 2. 同步devops丢失的命令 + List unSyncCommands = commandResultVOS.stream().filter(v -> Boolean.FALSE.equals(v.getNotExist())).collect(Collectors.toList()); + unSyncCommands.forEach(unSyncCommand -> commandResultHandler.handler(hostId, unSyncCommand.getCommandId(), unSyncCommand)); } @Override diff --git a/src/main/java/io/choerodon/devops/app/eventhandler/payload/GitlabGroupPayload.java b/src/main/java/io/choerodon/devops/app/eventhandler/payload/GitlabGroupPayload.java index 14dc2947cc..9cbafebd94 100644 --- a/src/main/java/io/choerodon/devops/app/eventhandler/payload/GitlabGroupPayload.java +++ b/src/main/java/io/choerodon/devops/app/eventhandler/payload/GitlabGroupPayload.java @@ -2,6 +2,8 @@ import java.util.Set; +import io.swagger.annotations.ApiModelProperty; + /** * GitLab group create event */ @@ -9,6 +11,8 @@ public class GitlabGroupPayload { private Long projectId; private String projectCode; + @ApiModelProperty("devops组件编码") + private String devopsComponentCode; private String projectName; private String organizationCode; private String organizationName; @@ -28,6 +32,14 @@ public GitlabGroupPayload(String projectCode, String projectName, String organiz this.userId = userId; } + public String getDevopsComponentCode() { + return devopsComponentCode; + } + + public void setDevopsComponentCode(String devopsComponentCode) { + this.devopsComponentCode = devopsComponentCode; + } + public Long getProjectId() { return projectId; } diff --git a/src/main/java/io/choerodon/devops/app/eventhandler/payload/IngressSagaPayload.java b/src/main/java/io/choerodon/devops/app/eventhandler/payload/IngressSagaPayload.java index ebd036aa38..fb10e2a379 100644 --- a/src/main/java/io/choerodon/devops/app/eventhandler/payload/IngressSagaPayload.java +++ b/src/main/java/io/choerodon/devops/app/eventhandler/payload/IngressSagaPayload.java @@ -1,6 +1,6 @@ package io.choerodon.devops.app.eventhandler.payload; -import io.kubernetes.client.models.V1beta1Ingress; +import io.kubernetes.client.openapi.models.V1Ingress; import io.choerodon.devops.infra.dto.DevopsEnvironmentDTO; import io.choerodon.devops.infra.dto.DevopsIngressDTO; @@ -15,7 +15,7 @@ public class IngressSagaPayload { private Boolean created; private DevopsEnvironmentDTO devopsEnvironmentDTO; private DevopsIngressDTO devopsIngressDTO; - private V1beta1Ingress v1beta1Ingress; + private V1Ingress v1beta1Ingress; public IngressSagaPayload() { @@ -59,11 +59,11 @@ public void setDevopsIngressDTO(DevopsIngressDTO devopsIngressDTO) { this.devopsIngressDTO = devopsIngressDTO; } - public V1beta1Ingress getV1beta1Ingress() { + public V1Ingress getV1Ingress() { return v1beta1Ingress; } - public void setV1beta1Ingress(V1beta1Ingress v1beta1Ingress) { + public void setV1Ingress(V1Ingress v1beta1Ingress) { this.v1beta1Ingress = v1beta1Ingress; } diff --git a/src/main/java/io/choerodon/devops/app/eventhandler/payload/PersistentVolumeClaimPayload.java b/src/main/java/io/choerodon/devops/app/eventhandler/payload/PersistentVolumeClaimPayload.java index fa59784fd8..4092e8c508 100644 --- a/src/main/java/io/choerodon/devops/app/eventhandler/payload/PersistentVolumeClaimPayload.java +++ b/src/main/java/io/choerodon/devops/app/eventhandler/payload/PersistentVolumeClaimPayload.java @@ -2,7 +2,7 @@ import io.choerodon.devops.infra.dto.DevopsEnvironmentDTO; import io.choerodon.devops.infra.dto.DevopsPvcDTO; -import io.kubernetes.client.models.V1PersistentVolumeClaim; +import io.kubernetes.client.openapi.models.V1PersistentVolumeClaim; public class PersistentVolumeClaimPayload { private Long projectId; diff --git a/src/main/java/io/choerodon/devops/app/eventhandler/payload/PersistentVolumePayload.java b/src/main/java/io/choerodon/devops/app/eventhandler/payload/PersistentVolumePayload.java index 47b906a97b..b433efe868 100644 --- a/src/main/java/io/choerodon/devops/app/eventhandler/payload/PersistentVolumePayload.java +++ b/src/main/java/io/choerodon/devops/app/eventhandler/payload/PersistentVolumePayload.java @@ -1,8 +1,9 @@ package io.choerodon.devops.app.eventhandler.payload; +import io.kubernetes.client.openapi.models.V1PersistentVolume; + import io.choerodon.devops.infra.dto.DevopsEnvironmentDTO; import io.choerodon.devops.infra.dto.DevopsPvDTO; -import io.kubernetes.client.models.V1PersistentVolume; public class PersistentVolumePayload { private Long projectId; diff --git a/src/main/java/io/choerodon/devops/app/eventhandler/payload/ProjectPayload.java b/src/main/java/io/choerodon/devops/app/eventhandler/payload/ProjectPayload.java index 194651d4e4..4a1e3c3093 100644 --- a/src/main/java/io/choerodon/devops/app/eventhandler/payload/ProjectPayload.java +++ b/src/main/java/io/choerodon/devops/app/eventhandler/payload/ProjectPayload.java @@ -3,6 +3,8 @@ import java.util.List; import java.util.Set; +import io.swagger.annotations.ApiModelProperty; + import io.choerodon.devops.api.vo.ProjectCategoryVO; /** @@ -16,6 +18,8 @@ public class ProjectPayload { private String projectName; private String organizationCode; private String organizationName; + @ApiModelProperty("devops组件编码") + private String devopsComponentCode; private String userName; private Long userId; private String imageUrl; @@ -29,6 +33,14 @@ public class ProjectPayload { private List projectCategoryVOS; + public String getDevopsComponentCode() { + return devopsComponentCode; + } + + public void setDevopsComponentCode(String devopsComponentCode) { + this.devopsComponentCode = devopsComponentCode; + } + public Long getProjectId() { return projectId; } diff --git a/src/main/java/io/choerodon/devops/app/eventhandler/payload/ServiceSagaPayLoad.java b/src/main/java/io/choerodon/devops/app/eventhandler/payload/ServiceSagaPayLoad.java index 13244c4980..d2d3f3d3a8 100644 --- a/src/main/java/io/choerodon/devops/app/eventhandler/payload/ServiceSagaPayLoad.java +++ b/src/main/java/io/choerodon/devops/app/eventhandler/payload/ServiceSagaPayLoad.java @@ -3,8 +3,8 @@ import io.choerodon.devops.api.vo.DevopsIngressVO; import io.choerodon.devops.infra.dto.DevopsEnvironmentDTO; import io.choerodon.devops.infra.dto.DevopsServiceDTO; -import io.kubernetes.client.models.V1Endpoints; -import io.kubernetes.client.models.V1Service; +import io.kubernetes.client.openapi.models.V1Endpoints; +import io.kubernetes.client.openapi.models.V1Service; import io.swagger.annotations.ApiModelProperty; /** diff --git a/src/main/java/io/choerodon/devops/app/eventhandler/pipeline/step/DevopsCiImageBuildStepHandler.java b/src/main/java/io/choerodon/devops/app/eventhandler/pipeline/step/DevopsCiImageBuildStepHandler.java index fd3d306691..262d804a85 100644 --- a/src/main/java/io/choerodon/devops/app/eventhandler/pipeline/step/DevopsCiImageBuildStepHandler.java +++ b/src/main/java/io/choerodon/devops/app/eventhandler/pipeline/step/DevopsCiImageBuildStepHandler.java @@ -54,8 +54,6 @@ public void fillStepConfigInfo(DevopsCiStepVO devopsCiStepVO) { @Override public List buildGitlabCiScript(DevopsCiStepDTO devopsCiStepDTO) { - // 不填skipDockerTlsVerify参数或者填TRUE都是跳过证书校验 - // TODO 修复 目前后端这个参数的含义是是否跳过证书校验, 前端的含义是是否进行证书校验 DevopsCiDockerBuildConfigDTO devopsCiDockerBuildConfigDTO = devopsCiDockerBuildConfigService.queryByStepId(devopsCiStepDTO.getId()); Boolean doTlsVerify = devopsCiDockerBuildConfigDTO.getEnableDockerTlsVerify(); diff --git a/src/main/java/io/choerodon/devops/app/eventhandler/pipeline/step/DevopsCiMavenBuildStepHandler.java b/src/main/java/io/choerodon/devops/app/eventhandler/pipeline/step/DevopsCiMavenBuildStepHandler.java index 0c47e4200f..89580066d2 100644 --- a/src/main/java/io/choerodon/devops/app/eventhandler/pipeline/step/DevopsCiMavenBuildStepHandler.java +++ b/src/main/java/io/choerodon/devops/app/eventhandler/pipeline/step/DevopsCiMavenBuildStepHandler.java @@ -142,7 +142,7 @@ private boolean buildAndSaveMavenSettings(Long projectId, Long jobId, Long seque if (!StringUtils.isEmpty(devopsCiMavenBuildConfigVO.getMavenSettings())) { // 使用用户提供的xml内容,不进行内容的校验 - settings = Base64Util.getBase64DecodedString(devopsCiMavenBuildConfigVO.getMavenSettings()); + settings = devopsCiMavenBuildConfigVO.getMavenSettings(); } else if (hasManualRepos || hasNexusRepos) { if (hasNexusRepos) { // 用户选择的已有的maven仓库 diff --git a/src/main/java/io/choerodon/devops/app/eventhandler/pipeline/step/DevopsCiPublishAppVersionStepHandler.java b/src/main/java/io/choerodon/devops/app/eventhandler/pipeline/step/DevopsCiPublishAppVersionStepHandler.java new file mode 100644 index 0000000000..bbd28a5e88 --- /dev/null +++ b/src/main/java/io/choerodon/devops/app/eventhandler/pipeline/step/DevopsCiPublishAppVersionStepHandler.java @@ -0,0 +1,20 @@ +package io.choerodon.devops.app.eventhandler.pipeline.step; + +import org.springframework.stereotype.Component; + +import io.choerodon.devops.infra.enums.DevopsCiStepTypeEnum; + +/** + * 〈功能简述〉 + * 〈〉 + * + * @author wanghao + * @since 2022/7/13 17:21 + */ +@Component +public class DevopsCiPublishAppVersionStepHandler extends AbstractDevopsCiStepHandler { + @Override + public DevopsCiStepTypeEnum getType() { + return DevopsCiStepTypeEnum.PUBLISH_APP_VERSION; + } +} diff --git a/src/main/java/io/choerodon/devops/app/service/AppExternalConfigService.java b/src/main/java/io/choerodon/devops/app/service/AppExternalConfigService.java index 6e59e2351f..e071644348 100644 --- a/src/main/java/io/choerodon/devops/app/service/AppExternalConfigService.java +++ b/src/main/java/io/choerodon/devops/app/service/AppExternalConfigService.java @@ -1,7 +1,5 @@ package io.choerodon.devops.app.service; -import java.util.List; - import io.choerodon.devops.infra.dto.AppExternalConfigDTO; /** diff --git a/src/main/java/io/choerodon/devops/app/service/AppServiceHelmRelService.java b/src/main/java/io/choerodon/devops/app/service/AppServiceHelmRelService.java new file mode 100644 index 0000000000..190cbbfec5 --- /dev/null +++ b/src/main/java/io/choerodon/devops/app/service/AppServiceHelmRelService.java @@ -0,0 +1,23 @@ +package io.choerodon.devops.app.service; + +import java.util.List; + +import io.choerodon.devops.infra.dto.AppServiceHelmRelDTO; + +/** + * 应用服务和helm配置的关联关系表(AppServiceHelmRel)应用服务 + * + * @author hao.wang@zknow.com + * @since 2022-07-15 10:55:52 + */ +public interface AppServiceHelmRelService { + + AppServiceHelmRelDTO queryByAppServiceId(Long appServiceId); + + /** + * 批量插入 + * @param appServiceHelmRelDTOToInsert + */ + void batchInsertInNewTrans(List appServiceHelmRelDTOToInsert); +} + diff --git a/src/main/java/io/choerodon/devops/app/service/AppServiceHelmVersionService.java b/src/main/java/io/choerodon/devops/app/service/AppServiceHelmVersionService.java new file mode 100644 index 0000000000..8793dce454 --- /dev/null +++ b/src/main/java/io/choerodon/devops/app/service/AppServiceHelmVersionService.java @@ -0,0 +1,27 @@ +package io.choerodon.devops.app.service; + +import java.util.List; +import java.util.Set; + +import io.choerodon.devops.api.vo.appversion.AppServiceHelmVersionVO; +import io.choerodon.devops.infra.dto.AppServiceHelmVersionDTO; + +/** + * 应用版本表(AppServiceHelmVersion)应用服务 + * + * @author hao.wang@zknow.com + * @since 2022-07-13 16:47:41 + */ +public interface AppServiceHelmVersionService { + + List listByAppVersionIds(Set versionIds); + + AppServiceHelmVersionDTO queryByAppServiceVersionId(Long appServiceVersionId); + + void create(AppServiceHelmVersionDTO appServiceHelmVersionDTO); + + void deleteByAppServiceVersionId(Long appServiceVersionId); + + void batchInsertInNewTrans(List appServiceHelmVersionDTOToInsert); +} + diff --git a/src/main/java/io/choerodon/devops/app/service/AppServiceImageVersionService.java b/src/main/java/io/choerodon/devops/app/service/AppServiceImageVersionService.java new file mode 100644 index 0000000000..e16d3d24aa --- /dev/null +++ b/src/main/java/io/choerodon/devops/app/service/AppServiceImageVersionService.java @@ -0,0 +1,34 @@ +package io.choerodon.devops.app.service; + +import java.util.List; +import java.util.Set; + +import io.choerodon.devops.api.vo.appversion.AppServiceImageVersionVO; +import io.choerodon.devops.infra.dto.AppServiceImageVersionDTO; + +/** + * 应用版本表(AppServiceImageVersion)应用服务 + * + * @author hao.wang@zknow.com + * @since 2022-07-13 16:47:42 + */ +public interface AppServiceImageVersionService { + + void create(AppServiceImageVersionDTO appServiceImageVersionDTO); + + AppServiceImageVersionDTO queryByAppServiceVersionId(Long appServiceVersionId); + + List listByAppVersionIds(Set versionIds); + + void baseUpdate(AppServiceImageVersionDTO appServiceImageVersionDTO); + + void deleteByAppServiceVersionId(Long appServiceVersionId); + + /** + * 2.2版本迁移原应服务版本数据使用,后续可删除 + * + * @param appServiceImageVersionDTOS + */ + void batchInsertInNewTrans(List appServiceImageVersionDTOS); +} + diff --git a/src/main/java/io/choerodon/devops/app/service/AppServiceInstanceService.java b/src/main/java/io/choerodon/devops/app/service/AppServiceInstanceService.java index 4add6ca526..819b8b446b 100644 --- a/src/main/java/io/choerodon/devops/app/service/AppServiceInstanceService.java +++ b/src/main/java/io/choerodon/devops/app/service/AppServiceInstanceService.java @@ -285,13 +285,13 @@ Page pageByOptions(Long projectId, PageRequest pagea */ Page pageDeployTimeTable(Long projectId, PageRequest pageable, Long[] appServiceIds, Long envId, Date startTime, Date endTime); - /** - * 部署自动化测试应用 - * - * @param projectId 项目id - * @param appServiceDeployVO 部署信息 - */ - void deployTestApp(Long projectId, AppServiceDeployVO appServiceDeployVO); +// /** +// * 部署自动化测试应用 +// * +// * @param projectId 项目id +// * @param appServiceDeployVO 部署信息 +// */ +// void deployTestApp(Long projectId, AppServiceDeployVO appServiceDeployVO); /** * 根据实例id获取更多资源详情(json格式) @@ -313,12 +313,12 @@ Page pageByOptions(Long projectId, PageRequest pagea */ InstanceControllerDetailVO getInstanceResourceDetailYaml(Long instanceId, String resourceName, ResourceType resourceType); - /** - * 查询自动化测试应用实例状态 - * - * @param testReleases - */ - void getTestAppStatus(Map> testReleases); +// /** +// * 查询自动化测试应用实例状态 +// * +// * @param testReleases +// */ +// void getTestAppStatus(Map> testReleases); /** diff --git a/src/main/java/io/choerodon/devops/app/service/AppServiceMavenVersionService.java b/src/main/java/io/choerodon/devops/app/service/AppServiceMavenVersionService.java new file mode 100644 index 0000000000..0e51c7e16f --- /dev/null +++ b/src/main/java/io/choerodon/devops/app/service/AppServiceMavenVersionService.java @@ -0,0 +1,27 @@ +package io.choerodon.devops.app.service; + +import java.util.List; +import java.util.Set; + +import io.choerodon.devops.api.vo.appversion.AppServiceMavenVersionVO; +import io.choerodon.devops.infra.dto.AppServiceMavenVersionDTO; + +/** + * 应用版本表(AppServiceMavenVersion)应用服务 + * + * @author hao.wang@zknow.com + * @since 2022-07-13 16:47:43 + */ +public interface AppServiceMavenVersionService { + + AppServiceMavenVersionDTO queryByAppServiceVersionId(Long appServiceVersionId); + + void create(AppServiceMavenVersionDTO appServiceMavenVersionDTO); + + List listByAppVersionIds(Set versionIds); + + void baseUpdate(AppServiceMavenVersionDTO appServiceMavenVersionDTO); + + void deleteByAppServiceVersionId(Long appServiceVersionId); +} + diff --git a/src/main/java/io/choerodon/devops/app/service/AppServiceService.java b/src/main/java/io/choerodon/devops/app/service/AppServiceService.java index 5c117d1812..ed967bf6d4 100644 --- a/src/main/java/io/choerodon/devops/app/service/AppServiceService.java +++ b/src/main/java/io/choerodon/devops/app/service/AppServiceService.java @@ -94,15 +94,15 @@ public interface AppServiceService { * @return Page */ Page pageByOptions(Long projectId, - Boolean isActive, - Boolean hasVersion, - String type, - Boolean doPage, - PageRequest pageable, - String params, - Boolean checkMember, - Boolean includeExternal, - Boolean excludeFailed); + Boolean isActive, + Boolean hasVersion, + String type, + Boolean doPage, + PageRequest pageable, + String params, + Boolean checkMember, + Boolean includeExternal, + Boolean excludeFailed); /** * 处理服务创建逻辑 @@ -275,7 +275,18 @@ Page pageInternalByOptionsWithAccessLevel(Long projectId, * @param password 密码 * @return true如果通过 (未通过则抛出错误信息) */ - Boolean checkChart(String url, @Nullable String username, @Nullable String password); + Boolean checkChartOnOrganization(String url, @Nullable String username, @Nullable String password); + + /** + * 项目层或应用层校验chart配置信息是否正确 + * + * @param projectId + * @param url ChartMuseum地址 + * @param username 用户名 + * @param password 密码 + * @return CheckInfoVO + */ + CheckInfoVO checkChart(Long projectId, String url, @Nullable String username, @Nullable String password); /** * 查看sonarqube相关信息 @@ -581,16 +592,6 @@ void replaceParams(String newServiceCode, Boolean checkDeleteEnvApp(Long appServiceId, Long envId); - /** - * 根据坐标查询出项目下的应用列表 - * - * @param projectId - * @param groupId - * @param artifactId - * @return - */ - List listByProjectIdAndGAV(Long projectId, String groupId, String artifactId); - Set getMemberAppServiceIdsByAccessLevel(Long organizationId, Long projectId, Long userId, Integer value, Long appId); void batchTransfer(Long projectId, List appServiceTransferVOList); @@ -620,4 +621,12 @@ void replaceParams(String newServiceCode, Set listAllIdsByProjectId(Long projectId); HarborRepoConfigDTO queryRepoConfigById(Long projectId, Long appServiceId); + + /** + * 根据应用id列出所有应用所在的项目id + * + * @param appIds + * @return + */ + List listProjectIdsByAppIds(List appIds); } diff --git a/src/main/java/io/choerodon/devops/app/service/AppServiceShareResourceService.java b/src/main/java/io/choerodon/devops/app/service/AppServiceShareResourceService.java index 1a96c596f8..682295229a 100644 --- a/src/main/java/io/choerodon/devops/app/service/AppServiceShareResourceService.java +++ b/src/main/java/io/choerodon/devops/app/service/AppServiceShareResourceService.java @@ -1,7 +1,5 @@ package io.choerodon.devops.app.service; -import java.util.List; - import io.choerodon.devops.infra.dto.AppServiceShareResourceDTO; /** @@ -11,6 +9,4 @@ public interface AppServiceShareResourceService { void baseCreate(AppServiceShareResourceDTO appServiceShareResourceDTO); - List baseListByShareId(Long shareId); - } diff --git a/src/main/java/io/choerodon/devops/app/service/AppServiceVersionService.java b/src/main/java/io/choerodon/devops/app/service/AppServiceVersionService.java index d04c4ddc2c..3701e3e9ec 100644 --- a/src/main/java/io/choerodon/devops/app/service/AppServiceVersionService.java +++ b/src/main/java/io/choerodon/devops/app/service/AppServiceVersionService.java @@ -6,8 +6,10 @@ import org.springframework.web.multipart.MultipartFile; import io.choerodon.core.domain.Page; -import io.choerodon.devops.api.vo.*; -import io.choerodon.devops.infra.dto.AppServiceLatestVersionDTO; +import io.choerodon.devops.api.vo.AppServiceVersionAndCommitVO; +import io.choerodon.devops.api.vo.AppServiceVersionRespVO; +import io.choerodon.devops.api.vo.AppServiceVersionVO; +import io.choerodon.devops.api.vo.AppServiceVersionWithHelmConfigVO; import io.choerodon.devops.infra.dto.AppServiceVersionDTO; import io.choerodon.mybatis.pagehelper.domain.PageRequest; @@ -76,15 +78,6 @@ void create(String image, */ List listUpgradeableAppVersion(Long projectId, Long appServiceServiceId); - /** - * 项目下查询应用最新的版本和各环境下部署的版本 - * - * @param appServiceId 应用ID - * @return DeployVersionVO - */ - DeployVersionVO queryDeployedVersions(Long appServiceId); - - String queryVersionValue(Long appServiceServiceId); AppServiceVersionRespVO queryById(Long appServiceServiceId); @@ -141,8 +134,6 @@ void create(String image, */ Page pageShareVersionByAppServiceIdAndVersion(Long appServiceId, PageRequest pageable, String version); - List baseListAppNewestVersion(Long projectId); - List baseListByAppServiceId(Long appServiceId); @@ -164,8 +155,6 @@ void create(String image, List baseQueryByCommitSha(Long appServiceId, String ref, String sha); - AppServiceVersionDTO baseQueryNewestVersion(Long appServiceId); - List baseListByAppServiceVersionIds(List appServiceServiceIds); List baseListByAppServiceIdAndBranch(Long appServiceId, String branch); @@ -212,8 +201,6 @@ void create(String image, void deleteByAppServiceId(Long appServiceId); - void fixHarbor(); - /** * 批量删除应用服务版本 * @@ -226,4 +213,35 @@ void create(String image, AppServiceVersionDTO queryByCommitShaAndRef(Long appServiceId, String commitSha, String ref); AppServiceVersionWithHelmConfigVO queryVersionWithHelmConfig(Long projectId, Long appServiceVersionId); + + /** + * 发布应用服务版本 + * @param token + * @param version + * @param commit + * @param ref + * @param gitlabPipelineId + * @param jobName + */ + AppServiceVersionDTO publishAppVersion(String token, String version, String commit, String ref, Long gitlabPipelineId, String jobName); + + AppServiceVersionDTO saveAppVersion(String version, String commit, String ref, Long gitlabPipelineId, Long appServiceId); + + /** + * 保存应用服务版本 + * @param appServiceId 应用服务id + * @param version 版本名 + * @param commit commit sha + * @param ref 分支 + * @return + */ + AppServiceVersionDTO create(Long appServiceId, String version, String commit, String ref); + + List listAllVersionsWithHelmConfig(); + + List listAllVersionsWithHarborConfig(); + + Integer queryCountVersionsWithHelmConfig(); + + Integer queryCountVersionsWithHarborConfig(); } diff --git a/src/main/java/io/choerodon/devops/app/service/CiCdStageService.java b/src/main/java/io/choerodon/devops/app/service/CiCdStageService.java deleted file mode 100644 index 670d9aa392..0000000000 --- a/src/main/java/io/choerodon/devops/app/service/CiCdStageService.java +++ /dev/null @@ -1,23 +0,0 @@ -package io.choerodon.devops.app.service; - -import java.util.List; - -import io.choerodon.devops.api.vo.DevopsCdStageVO; -import io.choerodon.devops.infra.dto.DevopsCdStageDTO; - -public interface CiCdStageService { - /** - * 创建流水线stage - * @param devopsCdStageDTO - * @return - */ - DevopsCdStageDTO create(DevopsCdStageDTO devopsCdStageDTO); - - List listByPipelineId(Long ciCdPipelineId); - - void deleteById(Long stageId); - - void update(DevopsCdStageVO devopsCdStageVO); - - void deleteByPipelineId(Long ciCdPipelineId); -} diff --git a/src/main/java/io/choerodon/devops/app/service/CiPipelineAppVersionService.java b/src/main/java/io/choerodon/devops/app/service/CiPipelineAppVersionService.java new file mode 100644 index 0000000000..5f1dd53ede --- /dev/null +++ b/src/main/java/io/choerodon/devops/app/service/CiPipelineAppVersionService.java @@ -0,0 +1,21 @@ +package io.choerodon.devops.app.service; + +import io.choerodon.devops.infra.dto.CiPipelineAppVersionDTO; + +/** + * 发布应用服务版本步骤生成的流水线记录信息(CiPipelineAppVersion)应用服务 + * + * @author hao.wang@zknow.com + * @since 2022-07-14 16:01:30 + */ +public interface CiPipelineAppVersionService { + + CiPipelineAppVersionDTO queryByPipelineIdAndJobName(Long appServiceId, + Long gitlabPipelineId, + String jobName); + + void baseCreate(CiPipelineAppVersionDTO ciPipelineAppVersionDTO); + + void deleteByAppServiceId(Long appServiceId); +} + diff --git a/src/main/java/io/choerodon/devops/app/service/CiPipelineImageService.java b/src/main/java/io/choerodon/devops/app/service/CiPipelineImageService.java index dd86ff4073..e1a60b8d24 100644 --- a/src/main/java/io/choerodon/devops/app/service/CiPipelineImageService.java +++ b/src/main/java/io/choerodon/devops/app/service/CiPipelineImageService.java @@ -18,4 +18,8 @@ public interface CiPipelineImageService { ImageRepoInfoVO queryRewriteRepoInfoScript(Long projectId, String token, String repoType, Long repoId); ImageRepoInfoVO queryImageRepoInfo(String token, Long gitlabPipelineId); + + CiPipelineImageDTO queryPipelineLatestImage(Long appServiceId, Long gitlabPipelineId); + + void deleteByAppServiceId(Long appServiceId); } diff --git a/src/main/java/io/choerodon/devops/app/service/CiPipelineMavenService.java b/src/main/java/io/choerodon/devops/app/service/CiPipelineMavenService.java index 5b53000540..999b3706b5 100644 --- a/src/main/java/io/choerodon/devops/app/service/CiPipelineMavenService.java +++ b/src/main/java/io/choerodon/devops/app/service/CiPipelineMavenService.java @@ -14,8 +14,7 @@ public interface CiPipelineMavenService { /** * 存储jar包元数据 - * - * @param nexusRepoId 制品库id + * @param nexusRepoId 制品库id * @param jobId ci job 的id * @param sequence job的顺序 * @param gitlabPipelineId gitlab流水线id @@ -25,6 +24,7 @@ public interface CiPipelineMavenService { * @param mavenRepoUrl * @param username * @param password + * @param version */ void createOrUpdate(Long nexusRepoId, Long jobId, @@ -35,7 +35,12 @@ void createOrUpdate(Long nexusRepoId, MultipartFile file, String mavenRepoUrl, String username, - String password); + String password, + String version); CiPipelineMavenDTO queryByGitlabPipelineId(Long appServiceId, Long gitlabPipelineId, String jobName); + + CiPipelineMavenDTO queryPipelineLatestImage(Long appServiceId, Long gitlabPipelineId); + + void deleteByAppServiceId(Long appServiceId); } diff --git a/src/main/java/io/choerodon/devops/app/service/CiTemplateNodeJsBuildService.java b/src/main/java/io/choerodon/devops/app/service/CiTemplateNodeJsBuildService.java deleted file mode 100644 index 32959454aa..0000000000 --- a/src/main/java/io/choerodon/devops/app/service/CiTemplateNodeJsBuildService.java +++ /dev/null @@ -1,8 +0,0 @@ -package io.choerodon.devops.app.service; - -/** - * Created by wangxiang on 2021/12/20 - */ -public interface CiTemplateNodeJsBuildService { - void queryByStepId(Long id); -} diff --git a/src/main/java/io/choerodon/devops/app/service/DeployDetailService.java b/src/main/java/io/choerodon/devops/app/service/DeployDetailService.java deleted file mode 100644 index ed783d2055..0000000000 --- a/src/main/java/io/choerodon/devops/app/service/DeployDetailService.java +++ /dev/null @@ -1,15 +0,0 @@ -package io.choerodon.devops.app.service; - -import java.util.List; - -import io.choerodon.devops.api.vo.DevopsEnvPodVO; - -/** - * Creator: Runge - * Date: 2018/4/17 - * Time: 14:40 - * Description: - */ -public interface DeployDetailService { - List baseQueryPods(Long instanceId); -} diff --git a/src/main/java/io/choerodon/devops/app/service/DevopsAppServiceHelmRelService.java b/src/main/java/io/choerodon/devops/app/service/DevopsAppServiceHelmRelService.java new file mode 100644 index 0000000000..8758f0406e --- /dev/null +++ b/src/main/java/io/choerodon/devops/app/service/DevopsAppServiceHelmRelService.java @@ -0,0 +1,29 @@ +package io.choerodon.devops.app.service; + +import io.choerodon.devops.infra.dto.DevopsAppServiceHelmRelDTO; +import org.apache.ibatis.annotations.Param; + +public interface DevopsAppServiceHelmRelService { + + /** + * 处理应用服务和helm仓库的关联关系 + */ + void handleRel(Long appServiceId, Long helmConfigId); + + /** + * 删除应用服务和helm仓库的关联关系 + * + * @param appServiceId + */ + void deleteRelationByServiceId(Long appServiceId); + + /** + * 创建应用符合和helm仓库的关联关系 + * + * @param appServiceId + * @param helmConfigId + */ + void createRel(Long appServiceId, Long helmConfigId); + + DevopsAppServiceHelmRelDTO queryByAppServiceId(Long appServiceId); +} diff --git a/src/main/java/io/choerodon/devops/app/service/DevopsBranchService.java b/src/main/java/io/choerodon/devops/app/service/DevopsBranchService.java index 4ef1a822f2..399288fa10 100644 --- a/src/main/java/io/choerodon/devops/app/service/DevopsBranchService.java +++ b/src/main/java/io/choerodon/devops/app/service/DevopsBranchService.java @@ -41,4 +41,21 @@ public interface DevopsBranchService { List listDeletedBranchIds(Set collect); List listByIds(List branchIds); + + /** + * 查询工作项是否与分支有关联关系 + * + * @param projectId + * @param issueId + * @return + */ + Boolean checkIssueBranchRelExist(Long projectId, Long issueId); + + /** + * 复制工作项与分支关联关系 + * @param projectId + * @param oldIssueId + * @param newIssueId + */ + void copyIssueBranchRel(Long projectId, Long oldIssueId, Long newIssueId); } \ No newline at end of file diff --git a/src/main/java/io/choerodon/devops/app/service/DevopsCdApiTestInfoService.java b/src/main/java/io/choerodon/devops/app/service/DevopsCdApiTestInfoService.java index b954f29d01..56d45c36d2 100644 --- a/src/main/java/io/choerodon/devops/app/service/DevopsCdApiTestInfoService.java +++ b/src/main/java/io/choerodon/devops/app/service/DevopsCdApiTestInfoService.java @@ -14,5 +14,6 @@ public interface DevopsCdApiTestInfoService { DevopsCdApiTestInfoDTO queryById(Long deployInfoId); + Boolean doesApiTestSuiteRelatedWithPipeline(Long suiteId); } diff --git a/src/main/java/io/choerodon/devops/app/service/DevopsCdAuditRecordService.java b/src/main/java/io/choerodon/devops/app/service/DevopsCdAuditRecordService.java index 495ac3e21b..eb5bccd23c 100644 --- a/src/main/java/io/choerodon/devops/app/service/DevopsCdAuditRecordService.java +++ b/src/main/java/io/choerodon/devops/app/service/DevopsCdAuditRecordService.java @@ -21,6 +21,4 @@ public interface DevopsCdAuditRecordService { void save(DevopsCdAuditRecordDTO devopsCdAuditRecordDTO); DevopsCdAuditRecordDTO queryByJobRecordIdAndUserId(Long jobRecordId, Long userId); - - void fixProjectId(); } diff --git a/src/main/java/io/choerodon/devops/app/service/DevopsCdAuditService.java b/src/main/java/io/choerodon/devops/app/service/DevopsCdAuditService.java index 58c23e670e..3932ed920c 100644 --- a/src/main/java/io/choerodon/devops/app/service/DevopsCdAuditService.java +++ b/src/main/java/io/choerodon/devops/app/service/DevopsCdAuditService.java @@ -9,6 +9,4 @@ public interface DevopsCdAuditService { void baseCreate(DevopsCdAuditDTO devopsCdAuditDTO); List baseListByOptions(Long pipelineId, Long stageId, Long jobId); - - void fixProjectId(); } diff --git a/src/main/java/io/choerodon/devops/app/service/DevopsCdJobService.java b/src/main/java/io/choerodon/devops/app/service/DevopsCdJobService.java index 82a17abac0..9982d71a08 100644 --- a/src/main/java/io/choerodon/devops/app/service/DevopsCdJobService.java +++ b/src/main/java/io/choerodon/devops/app/service/DevopsCdJobService.java @@ -45,10 +45,4 @@ public interface DevopsCdJobService { * @return */ List listCdApiTestConfig(); - - /** - * 修复数据saga - * @param payload - */ - void taskRepairCdJobRecordData(String payload); } diff --git a/src/main/java/io/choerodon/devops/app/service/DevopsCdPipelineRecordService.java b/src/main/java/io/choerodon/devops/app/service/DevopsCdPipelineRecordService.java index 01891fcba4..783a67a123 100644 --- a/src/main/java/io/choerodon/devops/app/service/DevopsCdPipelineRecordService.java +++ b/src/main/java/io/choerodon/devops/app/service/DevopsCdPipelineRecordService.java @@ -1,11 +1,9 @@ package io.choerodon.devops.app.service; -import io.choerodon.core.domain.Page; import io.choerodon.devops.api.vo.DevopsCdPipelineRecordVO; import io.choerodon.devops.api.vo.HostConnectionVO; import io.choerodon.devops.infra.dto.DevopsCdPipelineRecordDTO; import io.choerodon.devops.infra.dto.workflow.DevopsPipelineDTO; -import io.choerodon.mybatis.pagehelper.domain.PageRequest; /** * 〈功能简述〉 @@ -44,9 +42,6 @@ public interface DevopsCdPipelineRecordService { DevopsCdPipelineRecordDTO queryById(Long id); - Page pagingCdPipelineRecord(Long projectId, Long ciPipelineId, PageRequest pageable); - - void updatePipelineStatusFailed(Long pipelineRecordId); DevopsCdPipelineRecordVO queryPipelineRecordDetails(Long projectId, Long cdPipelineId); diff --git a/src/main/java/io/choerodon/devops/app/service/DevopsCdValuesService.java b/src/main/java/io/choerodon/devops/app/service/DevopsCdValuesService.java deleted file mode 100644 index e340666235..0000000000 --- a/src/main/java/io/choerodon/devops/app/service/DevopsCdValuesService.java +++ /dev/null @@ -1,4 +0,0 @@ -package io.choerodon.devops.app.service; - -public interface DevopsCdValuesService { -} diff --git a/src/main/java/io/choerodon/devops/app/service/DevopsCiPipelineChartService.java b/src/main/java/io/choerodon/devops/app/service/DevopsCiPipelineChartService.java index eaa46c62eb..b6db3d83ee 100644 --- a/src/main/java/io/choerodon/devops/app/service/DevopsCiPipelineChartService.java +++ b/src/main/java/io/choerodon/devops/app/service/DevopsCiPipelineChartService.java @@ -14,5 +14,6 @@ public interface DevopsCiPipelineChartService { void baseCreate(DevopsCiPipelineChartDTO devopsCiPipelineChartDTO); + void deleteByAppServiceId(Long appServiceId); } diff --git a/src/main/java/io/choerodon/devops/app/service/DevopsCiPipelineRecordService.java b/src/main/java/io/choerodon/devops/app/service/DevopsCiPipelineRecordService.java index 1574cd2529..d0c53a7b72 100644 --- a/src/main/java/io/choerodon/devops/app/service/DevopsCiPipelineRecordService.java +++ b/src/main/java/io/choerodon/devops/app/service/DevopsCiPipelineRecordService.java @@ -2,13 +2,10 @@ import java.util.List; -import io.choerodon.core.domain.Page; import io.choerodon.devops.api.vo.DevopsCiPipelineRecordVO; import io.choerodon.devops.api.vo.PipelineWebHookVO; -import io.choerodon.devops.infra.dto.AppServiceDTO; import io.choerodon.devops.infra.dto.DevopsCiPipelineRecordDTO; import io.choerodon.devops.infra.dto.gitlab.ci.Pipeline; -import io.choerodon.mybatis.pagehelper.domain.PageRequest; /** * 〈功能简述〉 @@ -22,11 +19,6 @@ public interface DevopsCiPipelineRecordService { void handleCreate(PipelineWebHookVO pipelineWebHookVO); - /** - * 分页查询流水线记录 - */ - Page pagingPipelineRecord(Long projectId, Long ciPipelineId, PageRequest pageable); - /** * 异步地拉取gitlab中流水线的状态到数据库进行更新 * @@ -47,11 +39,6 @@ public interface DevopsCiPipelineRecordService { */ List queryByPipelineId(Long ciPipelineId); - /** - * @deprecated 根据gitlabProjectId删除pipeline record - */ - void deleteByGitlabProjectId(Long gitlabProjectId); - DevopsCiPipelineRecordDTO create(Long ciPipelineId, Long gitlabProjectId, Pipeline pipeline); /** @@ -74,12 +61,4 @@ public interface DevopsCiPipelineRecordService { List queryNotSynchronizedRecord(Long statusUpdatePeriodMilliSeconds); DevopsCiPipelineRecordVO queryByCiPipelineRecordId(Long ciPipelineRecordId); - - - /** - * 查询任务记录所属的应用服务 - * @param pipelineRecordId - * @return - */ - AppServiceDTO queryAppServiceByPipelineRecordId(Long pipelineRecordId); } diff --git a/src/main/java/io/choerodon/devops/app/service/DevopsConfigService.java b/src/main/java/io/choerodon/devops/app/service/DevopsConfigService.java index 45adf7e696..11c3ec9228 100644 --- a/src/main/java/io/choerodon/devops/app/service/DevopsConfigService.java +++ b/src/main/java/io/choerodon/devops/app/service/DevopsConfigService.java @@ -39,8 +39,6 @@ public interface DevopsConfigService { DevopsConfigDTO queryRealConfig(Long resourceId, String resourceType, String configType,String operateType); - DevopsConfigVO queryRealConfigVO(Long resourceId, String resourceType, String configType); - DevopsConfigDTO baseCreate(DevopsConfigDTO devopsConfigDTO); DevopsConfigDTO baseUpdate(DevopsConfigDTO devopsConfigDTO); @@ -51,8 +49,6 @@ public interface DevopsConfigService { DevopsConfigDTO baseQueryByName(Long projectId, String name); - DevopsConfigDTO baseCheckByName(String name); - Page basePageByOptions(Long projectId, PageRequest pageable, String params); void baseDelete(Long id); @@ -74,5 +70,7 @@ public interface DevopsConfigService { void operateConfig(Long organizationId, String resourceType, DevopsConfigRepVO devopsConfigRepVO); void deleteByConfigIds(Set configIds); + + List listAllChart(); } diff --git a/src/main/java/io/choerodon/devops/app/service/DevopsDeployRecordService.java b/src/main/java/io/choerodon/devops/app/service/DevopsDeployRecordService.java index 27cd21bd3f..3a9686f5bb 100644 --- a/src/main/java/io/choerodon/devops/app/service/DevopsDeployRecordService.java +++ b/src/main/java/io/choerodon/devops/app/service/DevopsDeployRecordService.java @@ -73,10 +73,6 @@ Long saveDeployRecord(Long projectId, void baseCreate(DevopsDeployRecordDTO devopsDeployRecordDTO); - void updateRecord(Long recordId, String status, String errorMsg); - - void updateRecord(DevopsDeployRecordDTO devopsDeployRecordDTO); - List baseList(DevopsDeployRecordDTO devopsDeployRecordDTO); void baseDelete(DevopsDeployRecordDTO devopsDeployRecordDTO); diff --git a/src/main/java/io/choerodon/devops/app/service/DevopsDeployService.java b/src/main/java/io/choerodon/devops/app/service/DevopsDeployService.java index 889404e807..de3fbc7b73 100644 --- a/src/main/java/io/choerodon/devops/app/service/DevopsDeployService.java +++ b/src/main/java/io/choerodon/devops/app/service/DevopsDeployService.java @@ -1,6 +1,5 @@ package io.choerodon.devops.app.service; -import io.choerodon.devops.api.vo.deploy.DeployConfigVO; import io.choerodon.devops.api.vo.deploy.hzero.HzeroDeployVO; /** diff --git a/src/main/java/io/choerodon/devops/app/service/DevopsEnvFileService.java b/src/main/java/io/choerodon/devops/app/service/DevopsEnvFileService.java index 370d95d144..cfaefd53ae 100644 --- a/src/main/java/io/choerodon/devops/app/service/DevopsEnvFileService.java +++ b/src/main/java/io/choerodon/devops/app/service/DevopsEnvFileService.java @@ -44,8 +44,6 @@ public interface DevopsEnvFileService { void baseDelete(DevopsEnvFileDTO devopsEnvFileDTO); - List baseListByEnvIdAndPath(Long envId, String path); - /** * 根据环境id删除相应的纪录 * 删除环境时使用 diff --git a/src/main/java/io/choerodon/devops/app/service/DevopsEnvGroupService.java b/src/main/java/io/choerodon/devops/app/service/DevopsEnvGroupService.java index 636b5e4a6c..55d36a961f 100644 --- a/src/main/java/io/choerodon/devops/app/service/DevopsEnvGroupService.java +++ b/src/main/java/io/choerodon/devops/app/service/DevopsEnvGroupService.java @@ -1,11 +1,11 @@ package io.choerodon.devops.app.service; -import io.choerodon.devops.api.vo.DevopsEnvGroupVO; -import io.choerodon.devops.infra.dto.DevopsEnvGroupDTO; - +import java.util.List; import javax.annotation.Nullable; import javax.validation.constraints.NotNull; -import java.util.List; + +import io.choerodon.devops.api.vo.DevopsEnvGroupVO; +import io.choerodon.devops.infra.dto.DevopsEnvGroupDTO; public interface DevopsEnvGroupService { /** @@ -79,8 +79,6 @@ public interface DevopsEnvGroupService { Boolean baseCheckUniqueInProject(Long id, String name, Long projectId); - Boolean baseCheckUniqueInProject(String name, Long projectId); - void baseDelete(Long id); } diff --git a/src/main/java/io/choerodon/devops/app/service/DevopsEnvPodService.java b/src/main/java/io/choerodon/devops/app/service/DevopsEnvPodService.java index 4e79182ecb..abcb7949ff 100644 --- a/src/main/java/io/choerodon/devops/app/service/DevopsEnvPodService.java +++ b/src/main/java/io/choerodon/devops/app/service/DevopsEnvPodService.java @@ -1,11 +1,9 @@ package io.choerodon.devops.app.service; import java.util.List; - import javax.annotation.Nullable; import io.choerodon.core.domain.Page; -import io.choerodon.devops.api.vo.DevopsEnvPodInfoVO; import io.choerodon.devops.api.vo.DevopsEnvPodVO; import io.choerodon.devops.infra.dto.DevopsEnvPodDTO; import io.choerodon.devops.infra.dto.PodResourceDetailsDTO; @@ -33,8 +31,6 @@ public interface DevopsEnvPodService { DevopsEnvPodDTO baseQueryByEnvIdAndName(Long envId, String name); - DevopsEnvPodDTO baseQueryByPod(DevopsEnvPodDTO devopsEnvPodDTO); - void baseCreate(DevopsEnvPodDTO devopsEnvPodDTO); List baseListByInstanceId(Long instanceId); @@ -49,17 +45,6 @@ public interface DevopsEnvPodService { void baseDeleteById(Long id); - DevopsEnvPodDTO queryByNameAndEnvName(String name, String namespace); - - /** - * 按资源用量列出环境下Pod信息 - * - * @param envId 环境id - * @param sort 排序条件 - * @return 环境下相关资源的数量 - */ - List queryEnvPodInfo(Long envId, String sort); - void deleteEnvPodById(Long projectId, Long envId, Long podId); List queryResourceDetailsByInstanceId(Long instanceId); diff --git a/src/main/java/io/choerodon/devops/app/service/DevopsEnvResourceService.java b/src/main/java/io/choerodon/devops/app/service/DevopsEnvResourceService.java index 78ec0a2888..b278cfe394 100644 --- a/src/main/java/io/choerodon/devops/app/service/DevopsEnvResourceService.java +++ b/src/main/java/io/choerodon/devops/app/service/DevopsEnvResourceService.java @@ -5,7 +5,6 @@ import io.choerodon.devops.api.vo.DevopsEnvPodVO; import io.choerodon.devops.api.vo.DevopsEnvResourceVO; import io.choerodon.devops.api.vo.InstanceEventVO; -import io.choerodon.devops.api.vo.PodEventVO; import io.choerodon.devops.infra.dto.DevopsEnvResourceDTO; import io.choerodon.devops.infra.enums.ResourceType; @@ -75,18 +74,6 @@ public interface DevopsEnvResourceService { */ String getResourceDetailByNameAndTypeAndInstanceId(Long instanceId, String name, ResourceType resourceType); - /** - * 批量查询DevopsEnvResourceDTO 根据names - * - * @param envId - * @param type - * @param names - * @return - */ - List listEnvResourceByOptions(Long envId, String type, List names); - - List listPodEventBycommandId(Long commandId); - String getResourceDetailByEnvIdAndKindAndName(Long envId, String name, ResourceType resourceType); Object queryDetailsByKindAndName(Long envId, String kind, String name); diff --git a/src/main/java/io/choerodon/devops/app/service/DevopsEnvUserPermissionService.java b/src/main/java/io/choerodon/devops/app/service/DevopsEnvUserPermissionService.java index f732ab4e17..fece0f0a90 100644 --- a/src/main/java/io/choerodon/devops/app/service/DevopsEnvUserPermissionService.java +++ b/src/main/java/io/choerodon/devops/app/service/DevopsEnvUserPermissionService.java @@ -37,8 +37,6 @@ public interface DevopsEnvUserPermissionService { List baseListByEnvId(Long envId); - List baseListAll(Long envId); - void baseUpdate(Long envId, List addUsersList, List deleteUsersList); void baseDelete(Long envId, Long userId); diff --git a/src/main/java/io/choerodon/devops/app/service/DevopsEnvironmentService.java b/src/main/java/io/choerodon/devops/app/service/DevopsEnvironmentService.java index 52888d54c8..27a5dd3f2b 100644 --- a/src/main/java/io/choerodon/devops/app/service/DevopsEnvironmentService.java +++ b/src/main/java/io/choerodon/devops/app/service/DevopsEnvironmentService.java @@ -26,15 +26,6 @@ public interface DevopsEnvironmentService { */ void create(Long projectId, DevopsEnvironmentReqVO devopsEnvironmentReqVO); - /** - * 项目下环境流水线查询环境 - * - * @param projectId 项目id - * @param active 是否可用 - * @return List - */ - List listDevopsEnvGroupEnvs(Long projectId, Boolean active); - /** * 项目下根据分组查看环境详情 * @@ -153,6 +144,8 @@ public interface DevopsEnvironmentService { */ void handleCreateEnvSaga(EnvGitlabProjectPayload gitlabProjectPayload); + void initUserPermissionWhenCreatingEnv(EnvGitlabProjectPayload gitlabProjectPayload, Long envId, Long projectId); + EnvSyncStatusVO queryEnvSyncStatus(Long projectId, Long envId); /** @@ -346,14 +339,6 @@ Page pageUserPermissionByEnvId(Long projectId, PageReque DevopsEnvironmentDTO queryByTokenWithClusterCode(@Param("token") String token); - /** - * 查询项目下的环境 - * - * @param projectId - * @param envName 环境名 - * @return - */ - List listByProjectIdAndName(Long projectId, String envName); /** * 更新符合project_id和devops_env_group_id的环境的devops_env_group_id为null diff --git a/src/main/java/io/choerodon/devops/app/service/DevopsGitService.java b/src/main/java/io/choerodon/devops/app/service/DevopsGitService.java index bfa9a6981a..7fb71735d0 100644 --- a/src/main/java/io/choerodon/devops/app/service/DevopsGitService.java +++ b/src/main/java/io/choerodon/devops/app/service/DevopsGitService.java @@ -5,7 +5,6 @@ import io.choerodon.core.domain.Page; import io.choerodon.devops.api.vo.*; import io.choerodon.devops.app.eventhandler.payload.BranchSagaPayLoad; -import io.choerodon.devops.infra.dto.gitlab.BranchDTO; import io.choerodon.devops.infra.dto.gitlab.GitlabProjectDTO; import io.choerodon.devops.infra.dto.gitlab.GroupDTO; import io.choerodon.mybatis.pagehelper.domain.PageRequest; @@ -110,15 +109,6 @@ public interface DevopsGitService { */ void deleteBranch(Long projectId, Long appServiceId, String branchName); - /** - * 校验分支名唯一性 - * - * @param projectId 项目id - * @param applicationId 应用id - * @param branchName 分支名 - */ - void checkBranchName(Long projectId, Long applicationId, String branchName); - /** * 判断分支名唯一性 * @@ -194,8 +184,6 @@ public interface DevopsGitService { */ void createBranchBySaga(BranchSagaPayLoad branchSagaDTO); - BranchDTO baseQueryBranch(Integer gitLabProjectId, String branchName); - /** * 查询 * @@ -235,4 +223,6 @@ public interface DevopsGitService { Page listOwnedProjectByGroupId(Long projectId, Integer gitlabGroupId, String search, PageRequest pageRequest); Page pageBranchBasicInfoByOptions(Long projectId, PageRequest pageable, Long appServiceId, String params); + + Integer syncBranch(Long projectId, Long appServiceId, Boolean sync); } diff --git a/src/main/java/io/choerodon/devops/app/service/DevopsGitlabPipelineService.java b/src/main/java/io/choerodon/devops/app/service/DevopsGitlabPipelineService.java index bddd68624c..a5dc2c57c8 100644 --- a/src/main/java/io/choerodon/devops/app/service/DevopsGitlabPipelineService.java +++ b/src/main/java/io/choerodon/devops/app/service/DevopsGitlabPipelineService.java @@ -34,7 +34,5 @@ public interface DevopsGitlabPipelineService { Page basePageByApplicationId(Long appServiceId, PageRequest pageable, Date startTime, Date endTime); - void baseDeleteWithoutCommit(); - List baseListByAppIdAndBranch(Long appServiceId, String branch); } diff --git a/src/main/java/io/choerodon/devops/app/service/DevopsHelmConfigService.java b/src/main/java/io/choerodon/devops/app/service/DevopsHelmConfigService.java new file mode 100644 index 0000000000..4250983939 --- /dev/null +++ b/src/main/java/io/choerodon/devops/app/service/DevopsHelmConfigService.java @@ -0,0 +1,140 @@ +package io.choerodon.devops.app.service; + +import java.util.List; + +import org.springframework.transaction.annotation.Transactional; + +import io.choerodon.devops.api.vo.DevopsHelmConfigVO; +import io.choerodon.devops.infra.dto.DevopsHelmConfigDTO; + +public interface DevopsHelmConfigService { + /** + * 查询helm仓库列表 + * + * @param projectId + * @return + */ + List listHelmConfig(Long projectId); + + /** + * 创建helm仓库 + * + * @param projectId + * @param devopsHelmConfigVO + * @return + */ + DevopsHelmConfigVO createDevopsHelmConfigOnProjectLevel(Long projectId, DevopsHelmConfigVO devopsHelmConfigVO); + + /** + * 更新helm仓库 + * + * @param projectId + * @param devopsHelmConfigVO + * @return + */ + DevopsHelmConfigVO updateDevopsHelmConfigOnProjectLevel(Long projectId, DevopsHelmConfigVO devopsHelmConfigVO); + + /** + * 删除helm仓库 + * + * @param projectId + * @param helmConfigId + */ + void deleteDevopsHelmConfig(Long projectId, Long helmConfigId); + + /** + * 查询helm仓库信息 + * + * @param projectId + * @param helmConfigId + * @return + */ + DevopsHelmConfigVO queryDevopsHelmConfig(Long projectId, Long helmConfigId); + + /** + * 查询helm仓库信息 + * + * @param id + * @return + */ + DevopsHelmConfigDTO queryById(Long id); + + /** + * 设置默认仓库 + * + * @param projectId + * @param helmConfigId + */ + void setDefaultDevopsHelmConfig(Long projectId, Long helmConfigId); + + /** + * 查询指定层级的默认仓库 + * + * @return + */ + DevopsHelmConfigDTO queryDefaultDevopsHelmConfigByLevel(String resourceType, Long resourceId); + + /** + * 创建创建指定层级的仓库 + * + * @param devopsHelmConfigDTO + */ + void createDevopsHelmConfig(DevopsHelmConfigDTO devopsHelmConfigDTO); + + @Transactional(rollbackFor = Exception.class) + void updateDevopsHelmConfig(DevopsHelmConfigDTO devopsHelmConfigDTO); + + void updateDevopsHelmConfigToNonDefaultRepoOnOrganization(Long resourceId); + + /** + * 查询应用服务生效的配置 + * 生效优先级 app -> project -> tenant -> site, 查到就返回 + * + * @return + */ + DevopsHelmConfigDTO queryAppConfig(Long appServiceId, Long projectId, Long tenantId); + + /** + * 检查项目下仓库名称是否已存在 + * + * @param projectId + * @param helmConfigId + * @param name + * @return + */ + boolean checkNameExists(Long projectId, Long helmConfigId, String name); + + void checkNameExistsThrowEx(Long projectId, Long helmConfigId, String name); + + /** + * 获取chart仓库的index内容 + * + * @param projectId + * @param helmConfigId + * @return + */ + String getIndexContent(Long projectId, Long helmConfigId); + + /** + * 应用层查询helm仓库配置列表 + * + * @param projectId + * @param appServiceId + * @return + */ + List listHelmConfigOnApp(Long projectId, Long appServiceId); + + /** + * 批量插入 + */ + void batchInsertInNewTrans(List devopsHelmConfigDTOS); + + /** + * 下载chart包 + * + * @param helmConfigId + * @param chartUrl + * @return + */ + byte[] downloadChart(Long helmConfigId, String chartUrl); +} diff --git a/src/main/java/io/choerodon/devops/app/service/DevopsHostCommandService.java b/src/main/java/io/choerodon/devops/app/service/DevopsHostCommandService.java index 7243a1dad6..1ae251fde7 100644 --- a/src/main/java/io/choerodon/devops/app/service/DevopsHostCommandService.java +++ b/src/main/java/io/choerodon/devops/app/service/DevopsHostCommandService.java @@ -22,6 +22,8 @@ public interface DevopsHostCommandService { DevopsHostCommandDTO queryInstanceLatest(Long instanceId, String instanceType); + DevopsHostCommandDTO queryDockerInstanceLatest(Long instanceId, String instanceType); + /** * 查询出处于操作中状态三分钟及以上的记录 * @@ -38,6 +40,4 @@ public interface DevopsHostCommandService { void batchUpdateTimeoutCommand(Set missCommands); List listByIds(Set missCommands); - - List listByTypeAndInsIds(Set insIds, String instanceType); } diff --git a/src/main/java/io/choerodon/devops/app/service/DevopsHostService.java b/src/main/java/io/choerodon/devops/app/service/DevopsHostService.java index f96ebfda3b..12909a815f 100644 --- a/src/main/java/io/choerodon/devops/app/service/DevopsHostService.java +++ b/src/main/java/io/choerodon/devops/app/service/DevopsHostService.java @@ -128,9 +128,9 @@ public interface DevopsHostService { * @param instanceId 实例id * @return true表示匹配 */ - boolean HostIdInstanceIdMatch(Long hostId, Long instanceId); + boolean hostIdInstanceIdMatch(Long hostId, Long instanceId); - boolean HostIdDockerInstanceMatch(Long hostId, Long instanceId); + boolean hostIdDockerInstanceMatch(Long hostId, Long instanceId); /** * 分页查询主机 diff --git a/src/main/java/io/choerodon/devops/app/service/DevopsHzeroDeployDetailsService.java b/src/main/java/io/choerodon/devops/app/service/DevopsHzeroDeployDetailsService.java index dbbb7a32b8..b213f68f7a 100644 --- a/src/main/java/io/choerodon/devops/app/service/DevopsHzeroDeployDetailsService.java +++ b/src/main/java/io/choerodon/devops/app/service/DevopsHzeroDeployDetailsService.java @@ -22,9 +22,6 @@ public interface DevopsHzeroDeployDetailsService { DevopsHzeroDeployDetailsDTO baseQueryByAppId(Long appId); - - DevopsHzeroDeployDetailsDTO baseQueryDeployingByEnvIdAndInstanceCode(Long envId, String instanceCode); - List listNotSuccessRecordId(Long recordId); List listByDeployRecordId(Long deployRecordId); diff --git a/src/main/java/io/choerodon/devops/app/service/DevopsIngressService.java b/src/main/java/io/choerodon/devops/app/service/DevopsIngressService.java index 8df25322b7..90c83bdddd 100644 --- a/src/main/java/io/choerodon/devops/app/service/DevopsIngressService.java +++ b/src/main/java/io/choerodon/devops/app/service/DevopsIngressService.java @@ -1,5 +1,7 @@ package io.choerodon.devops.app.service; +import java.util.List; + import io.choerodon.core.domain.Page; import io.choerodon.devops.api.vo.DevopsIngressVO; import io.choerodon.devops.app.eventhandler.payload.IngressSagaPayload; @@ -8,8 +10,6 @@ import io.choerodon.devops.infra.dto.UserAttrDTO; import io.choerodon.mybatis.pagehelper.domain.PageRequest; -import java.util.List; - public interface DevopsIngressService { @@ -142,8 +142,6 @@ IngressSagaPayload createForBatchDeployment( Long baseUpdateStatus(Long envId, String name, String status); - List baseListNameByServiceId(Long serviceId); - Boolean baseCheckName(Long envId, String name); Boolean baseCheckPath(Long envId, String domain, String path, Long id); diff --git a/src/main/java/io/choerodon/devops/app/service/DevopsIssueRelService.java b/src/main/java/io/choerodon/devops/app/service/DevopsIssueRelService.java index e6ef6f5b2b..81f7e52ea5 100644 --- a/src/main/java/io/choerodon/devops/app/service/DevopsIssueRelService.java +++ b/src/main/java/io/choerodon/devops/app/service/DevopsIssueRelService.java @@ -66,7 +66,17 @@ public interface DevopsIssueRelService { * @param issueId * @return */ - Set listRelationByIssueIdAndObjectType(Long projectId, String object, Long issueId); + Set listRelationByIssueIdAndProjectIdAndObjectType(Long projectId, String object, Long issueId); + + /** + * 列出关联了敏捷问题的commitId或branchId + * + * @param object + * @param issueId + * @return + */ + Set listRelationByIssueIdAndObjectType(String object, Long issueId); + /** * 列出敏捷问题以及关联的分支信息 diff --git a/src/main/java/io/choerodon/devops/app/service/DevopsNotificationUserRelService.java b/src/main/java/io/choerodon/devops/app/service/DevopsNotificationUserRelService.java deleted file mode 100644 index 373f0b56bb..0000000000 --- a/src/main/java/io/choerodon/devops/app/service/DevopsNotificationUserRelService.java +++ /dev/null @@ -1,7 +0,0 @@ -package io.choerodon.devops.app.service; - -/** - * Created by Sheep on 2019/7/15. - */ -public interface DevopsNotificationUserRelService { -} diff --git a/src/main/java/io/choerodon/devops/app/service/DevopsProjectService.java b/src/main/java/io/choerodon/devops/app/service/DevopsProjectService.java index 46d92abd51..39dd361eaa 100644 --- a/src/main/java/io/choerodon/devops/app/service/DevopsProjectService.java +++ b/src/main/java/io/choerodon/devops/app/service/DevopsProjectService.java @@ -44,10 +44,6 @@ public interface DevopsProjectService { DevopsProjectDTO baseQueryByGitlabEnvGroupId(Integer envGroupId); void baseUpdate(DevopsProjectDTO devopsProjectDTO); - - void baseUpdateByPrimaryKey(DevopsProjectDTO devopsProjectDTO); - - /** * 分页查询与该项目在同一组织的项目列表(包含自身) * diff --git a/src/main/java/io/choerodon/devops/app/service/DevopsRegistrySecretService.java b/src/main/java/io/choerodon/devops/app/service/DevopsRegistrySecretService.java index 081bf346a6..95f8119c5a 100644 --- a/src/main/java/io/choerodon/devops/app/service/DevopsRegistrySecretService.java +++ b/src/main/java/io/choerodon/devops/app/service/DevopsRegistrySecretService.java @@ -1,7 +1,5 @@ package io.choerodon.devops.app.service; -import java.util.List; - import io.choerodon.devops.infra.dto.DevopsRegistrySecretDTO; /** @@ -45,8 +43,6 @@ public interface DevopsRegistrySecretService { */ DevopsRegistrySecretDTO baseQueryByClusterIdAndNamespace(Long clusterId, String namespace, Long configId, Long projectId); - List baseListByConfig(Long configId); - /** * 查询集群下的namespace中是否存在对应name的secret * diff --git a/src/main/java/io/choerodon/devops/app/service/DevopsSecretService.java b/src/main/java/io/choerodon/devops/app/service/DevopsSecretService.java index 950eb4471c..02dd06f1b6 100644 --- a/src/main/java/io/choerodon/devops/app/service/DevopsSecretService.java +++ b/src/main/java/io/choerodon/devops/app/service/DevopsSecretService.java @@ -1,13 +1,13 @@ package io.choerodon.devops.app.service; +import java.util.List; + import io.choerodon.core.domain.Page; import io.choerodon.devops.api.vo.SecretReqVO; import io.choerodon.devops.api.vo.SecretRespVO; import io.choerodon.devops.infra.dto.DevopsSecretDTO; import io.choerodon.mybatis.pagehelper.domain.PageRequest; -import java.util.List; - /** * Created by n!Ck * Date: 18-12-4 @@ -97,8 +97,6 @@ public interface DevopsSecretService { SecretReqVO dtoToReqVo(DevopsSecretDTO devopsSecretDTO); - SecretRespVO dtoToRespVo(DevopsSecretDTO devopsSecretDTO); - DevopsSecretDTO baseQuery(Long secretId); DevopsSecretDTO baseCreate(DevopsSecretDTO devopsSecretDTO); diff --git a/src/main/java/io/choerodon/devops/app/service/DevopsServiceInstanceService.java b/src/main/java/io/choerodon/devops/app/service/DevopsServiceInstanceService.java index 4aecb5b73a..79d4da5874 100644 --- a/src/main/java/io/choerodon/devops/app/service/DevopsServiceInstanceService.java +++ b/src/main/java/io/choerodon/devops/app/service/DevopsServiceInstanceService.java @@ -11,8 +11,6 @@ public interface DevopsServiceInstanceService { void baseCreate(DevopsServiceInstanceDTO devopsServiceInstanceDTO); - DevopsServiceInstanceDTO baseQueryByOptions(Long serviceId, Long instanceId); - List baseListByServiceId(Long serviceId); void deleteByServiceId(Long serviceId); diff --git a/src/main/java/io/choerodon/devops/app/service/DevopsServiceService.java b/src/main/java/io/choerodon/devops/app/service/DevopsServiceService.java index 85ede8b33f..bb9a9de6be 100644 --- a/src/main/java/io/choerodon/devops/app/service/DevopsServiceService.java +++ b/src/main/java/io/choerodon/devops/app/service/DevopsServiceService.java @@ -1,5 +1,7 @@ package io.choerodon.devops.app.service; +import java.util.List; + import io.choerodon.core.domain.Page; import io.choerodon.devops.api.vo.DevopsServiceReqVO; import io.choerodon.devops.api.vo.DevopsServiceVO; @@ -10,8 +12,6 @@ import io.choerodon.devops.infra.dto.UserAttrDTO; import io.choerodon.mybatis.pagehelper.domain.PageRequest; -import java.util.List; - /** * Created by Zenger on 2018/4/13. */ @@ -180,8 +180,6 @@ Page basePageByOptions(Long projectId, Long envId, Long i void baseUpdateEndPoint(Long id); - List baseListEnvByRunningService(); - DevopsServiceDTO baseQueryByNameAndEnvId(String name, Long envId); Boolean baseCheckServiceByEnv(Long envId); diff --git a/src/main/java/io/choerodon/devops/app/service/GitlabGroupService.java b/src/main/java/io/choerodon/devops/app/service/GitlabGroupService.java index e7cda2767d..5690118f66 100644 --- a/src/main/java/io/choerodon/devops/app/service/GitlabGroupService.java +++ b/src/main/java/io/choerodon/devops/app/service/GitlabGroupService.java @@ -2,7 +2,6 @@ import io.choerodon.devops.app.eventhandler.payload.GitlabGroupPayload; import io.choerodon.devops.infra.dto.UserAttrDTO; -import io.choerodon.devops.infra.dto.gitlab.GroupDTO; import io.choerodon.devops.infra.dto.iam.ProjectDTO; import io.choerodon.devops.infra.dto.iam.Tenant; @@ -33,12 +32,5 @@ public interface GitlabGroupService { */ void createClusterEnvGroup(ProjectDTO projectDTO, Tenant organizationDTO, UserAttrDTO userAttrDTO); - /** - * 创建平台的应用组 - * - * @return 创建后的组 - */ - GroupDTO createSiteAppGroup(Long iamUserId, String groupName); - Boolean checkRepositoryAvailable(String groupName, String projectName, String token); } diff --git a/src/main/java/io/choerodon/devops/app/service/HandlerObjectFileRelationsService.java b/src/main/java/io/choerodon/devops/app/service/HandlerObjectFileRelationsService.java index aaa28a635d..f0c2feeed8 100644 --- a/src/main/java/io/choerodon/devops/app/service/HandlerObjectFileRelationsService.java +++ b/src/main/java/io/choerodon/devops/app/service/HandlerObjectFileRelationsService.java @@ -1,12 +1,11 @@ package io.choerodon.devops.app.service; +import io.choerodon.devops.infra.dto.DevopsEnvFileResourceDTO; +import io.kubernetes.client.openapi.models.V1Endpoints; + import java.util.List; import java.util.Map; -import io.kubernetes.client.models.V1Endpoints; - -import io.choerodon.devops.infra.dto.DevopsEnvFileResourceDTO; - /** * 处理资源对象和文件对应关系 diff --git a/src/main/java/io/choerodon/devops/app/service/HostCommandService.java b/src/main/java/io/choerodon/devops/app/service/HostCommandService.java deleted file mode 100644 index 59410b2a96..0000000000 --- a/src/main/java/io/choerodon/devops/app/service/HostCommandService.java +++ /dev/null @@ -1,11 +0,0 @@ -package io.choerodon.devops.app.service; - -/** - * 〈功能简述〉 - * 〈〉 - * - * @author wanghao - * @Date 2021/6/28 11:55 - */ -public interface HostCommandService { -} diff --git a/src/main/java/io/choerodon/devops/app/service/ProjectService.java b/src/main/java/io/choerodon/devops/app/service/ProjectService.java index 0ee90febae..b73cf8e6b6 100644 --- a/src/main/java/io/choerodon/devops/app/service/ProjectService.java +++ b/src/main/java/io/choerodon/devops/app/service/ProjectService.java @@ -2,22 +2,7 @@ import io.choerodon.devops.infra.dto.DevopsProjectDTO; -/** - * Created with IntelliJ IDEA. - * User: Runge - * Date: 2018/4/2 - * Time: 10:59 - * Description: - */ public interface ProjectService { - /** - * 查询项目在gitlab中组是否创建 - * - * @param projectId 项目Id - * @return gitlab group Ready - */ - boolean queryProjectGitlabGroupReady(Long projectId); - /** * 根据Id查询project diff --git a/src/main/java/io/choerodon/devops/app/service/SendNotificationService.java b/src/main/java/io/choerodon/devops/app/service/SendNotificationService.java index ef59a69619..359ce37367 100644 --- a/src/main/java/io/choerodon/devops/app/service/SendNotificationService.java +++ b/src/main/java/io/choerodon/devops/app/service/SendNotificationService.java @@ -56,8 +56,6 @@ public interface SendNotificationService { */ void sendWhenAppServiceDisabled(Long appServiceId); -// WebHookJsonSendDTO getWebHookJsonSendDTO(JSONObject JSONObject, String code, Long createdBy, Date lastUpdateDate); - /** * 删除应用服务通知 */ diff --git a/src/main/java/io/choerodon/devops/app/service/UserAttrService.java b/src/main/java/io/choerodon/devops/app/service/UserAttrService.java index 8eff1b7055..806024cf9b 100644 --- a/src/main/java/io/choerodon/devops/app/service/UserAttrService.java +++ b/src/main/java/io/choerodon/devops/app/service/UserAttrService.java @@ -78,6 +78,8 @@ public interface UserAttrService { */ void updateAdmin(Long iamUserId, Boolean isGitlabAdmin); + void updateAdmins(List iamUserIds, Boolean isGitlabAdmin); + Page queryByAppServiceId(Long projectId, Long appServiceId, PageRequest pageRequest, String params); /** @@ -101,4 +103,21 @@ public interface UserAttrService { * @return UserAttrDTO */ UserAttrDTO queryGitlabAdminByIamId(); + + /** + * 查询猪齿鱼中的所有gitlabAdmin用户 + * + * @return + */ + List listAllAdmin(); + + void updateGitlabAdminUserToNormalUser(List iamUserIds); + + /** + * 查询用户的模拟令牌,不存在则创建 + * + * @param iamUserId + * @return + */ + String queryOrCreateImpersonationToken(Long iamUserId); } diff --git a/src/main/java/io/choerodon/devops/app/service/impl/AgentCommandServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/AgentCommandServiceImpl.java index 0d2e100a7c..2dd98d21fd 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/AgentCommandServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/AgentCommandServiceImpl.java @@ -329,7 +329,7 @@ public void initEnv(DevopsEnvironmentDTO devopsEnvironmentDTO, Long clusterId) { ProjectDTO projectDTO = baseServiceClientOperator.queryIamProjectById(devopsEnvironmentDTO.getProjectId()); Tenant organization = baseServiceClientOperator.queryOrganizationById(projectDTO.getOrganizationId()); String repoUrl = GitUtil.getGitlabSshUrl(PATTERN, gitlabSshUrl, organization.getTenantNum(), - projectDTO.getCode(), devopsEnvironmentDTO.getCode(), + projectDTO.getDevopsComponentCode(), devopsEnvironmentDTO.getCode(), EnvironmentType.forValue(devopsEnvironmentDTO.getType()), devopsClusterMapper.selectByPrimaryKey(devopsEnvironmentDTO.getClusterId()).getCode()); diff --git a/src/main/java/io/choerodon/devops/app/service/impl/AgentMsgHandlerServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/AgentMsgHandlerServiceImpl.java index c7ac9eb5f6..f9f43d809e 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/AgentMsgHandlerServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/AgentMsgHandlerServiceImpl.java @@ -1,24 +1,10 @@ package io.choerodon.devops.app.service.impl; -import static io.choerodon.devops.infra.constant.GitOpsConstants.DATE_PATTERN; -import static io.choerodon.devops.infra.constant.GitOpsConstants.THREE_MINUTE_MILLISECONDS; -import static io.choerodon.devops.infra.constant.MiscConstants.CREATE_TYPE; -import static io.choerodon.devops.infra.constant.MiscConstants.UPDATE_TYPE; -import static org.springframework.transaction.annotation.Isolation.READ_COMMITTED; - -import java.io.IOException; -import java.security.cert.CertificateException; -import java.security.cert.X509Certificate; -import java.text.SimpleDateFormat; -import java.util.*; -import java.util.function.Function; -import java.util.stream.Collectors; - import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.google.gson.Gson; -import io.kubernetes.client.JSON; -import io.kubernetes.client.models.*; +import io.kubernetes.client.openapi.JSON; +import io.kubernetes.client.openapi.models.*; import org.codehaus.jackson.map.ObjectMapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -30,6 +16,20 @@ import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; +import java.io.IOException; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; + +import static io.choerodon.devops.infra.constant.GitOpsConstants.DATE_PATTERN; +import static io.choerodon.devops.infra.constant.GitOpsConstants.THREE_MINUTE_MILLISECONDS; +import static io.choerodon.devops.infra.constant.MiscConstants.CREATE_TYPE; +import static io.choerodon.devops.infra.constant.MiscConstants.UPDATE_TYPE; +import static org.springframework.transaction.annotation.Isolation.READ_COMMITTED; + import io.choerodon.asgard.saga.annotation.Saga; import io.choerodon.asgard.saga.producer.StartSagaBuilder; import io.choerodon.asgard.saga.producer.TransactionalProducer; @@ -311,7 +311,7 @@ public void handlerUpdatePodMessage(String key, String msg, Long envId) { * @return true 当状态不等于Pending时,所有container都ready */ private Boolean getReadyValue(String podStatus, V1Pod v1Pod) { - return !PENDING.equals(podStatus) && v1Pod.getStatus().getContainerStatuses().stream().map(V1ContainerStatus::isReady).reduce((one, another) -> mapNullToFalse(one) && mapNullToFalse(another)).orElse(Boolean.FALSE); + return !PENDING.equals(podStatus) && v1Pod.getStatus().getContainerStatuses().stream().map(V1ContainerStatus::getReady).reduce((one, another) -> mapNullToFalse(one) && mapNullToFalse(another)).orElse(Boolean.FALSE); } @@ -601,11 +601,11 @@ public void resourceUpdate(String key, String msg, Long clusterId) { DevopsDeploymentDTO deploymentDTO = devopsDeploymentService.baseQueryByEnvIdAndName(envId, KeyParseUtil.getResourceName(key)); // 部署组创建的deployment,如果副本变为0则更新应用状态为停止 if (deploymentDTO != null && WorkloadSourceTypeEnums.DEPLOY_GROUP.getType().equals(deploymentDTO.getSourceType())) { - V1beta2Deployment v1beta2Deployment = K8sUtil.deserialize(msg, V1beta2Deployment.class); - if (v1beta2Deployment.getSpec().getReplicas() == 0 && !InstanceStatus.STOPPED.getStatus().equals(deploymentDTO.getStatus())) { + V1Deployment v1Deployment = K8sUtil.deserialize(msg, V1Deployment.class); + if (v1Deployment.getSpec().getReplicas() == 0 && !InstanceStatus.STOPPED.getStatus().equals(deploymentDTO.getStatus())) { deploymentDTO.setStatus(InstanceStatus.STOPPED.getStatus()); devopsDeploymentService.baseUpdate(deploymentDTO); - } else if (v1beta2Deployment.getSpec().getReplicas() > 0 && !InstanceStatus.RUNNING.getStatus().equals(deploymentDTO.getStatus())) { + } else if (v1Deployment.getSpec().getReplicas() > 0 && !InstanceStatus.RUNNING.getStatus().equals(deploymentDTO.getStatus())) { deploymentDTO.setStatus(InstanceStatus.RUNNING.getStatus()); devopsDeploymentService.baseUpdate(deploymentDTO); } @@ -759,6 +759,10 @@ private void handleUpdateServiceMsg(String key, Long envId, String msg, DevopsEn // 如果数据库没有service的对象, 相关的 env_resource 纪录也不需要 return; } + if (devopsServiceDTO.getType().equals("ClusterIP")) { + devopsServiceDTO.setClusterIp(v1Service.getSpec().getClusterIP()); + devopsServiceService.baseUpdate(devopsServiceDTO); + } if (devopsServiceDTO.getType().equals("LoadBalancer") && v1Service.getStatus() != null && v1Service.getStatus().getLoadBalancer() != null && @@ -942,7 +946,7 @@ public void handlerDomainCreateMessage(String key, String msg, Long clusterId) { return; } - V1beta1Ingress ingress = json.deserialize(msg, V1beta1Ingress.class); + V1Ingress ingress = json.deserialize(msg, V1Ingress.class); DevopsEnvResourceDTO devopsEnvResourceDTO = new DevopsEnvResourceDTO(); DevopsEnvResourceDetailDTO devopsEnvResourceDetailDTO = new DevopsEnvResourceDetailDTO(); devopsEnvResourceDetailDTO.setMessage(msg); diff --git a/src/main/java/io/choerodon/devops/app/service/impl/AppExceptionRecordServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/AppExceptionRecordServiceImpl.java index a1fb6767f5..e48b610472 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/AppExceptionRecordServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/AppExceptionRecordServiceImpl.java @@ -1,17 +1,17 @@ package io.choerodon.devops.app.service.impl; -import java.util.Date; -import java.util.List; - -import io.kubernetes.client.JSON; -import io.kubernetes.client.models.V1beta2Deployment; -import io.kubernetes.client.models.V1beta2StatefulSet; +import io.kubernetes.client.openapi.JSON; +import io.kubernetes.client.openapi.models.V1Deployment; +import io.kubernetes.client.openapi.models.V1StatefulSet; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.Date; +import java.util.List; + import io.choerodon.devops.app.service.AppExceptionRecordService; import io.choerodon.devops.app.service.DevopsDeployAppCenterService; import io.choerodon.devops.infra.dto.AppExceptionRecordDTO; @@ -32,7 +32,10 @@ public class AppExceptionRecordServiceImpl implements AppExceptionRecordService { private static final Logger LOGGER = LoggerFactory.getLogger(AppExceptionRecordServiceImpl.class); - private static JSON json = new JSON(); + + private static final String ERROR_UPDATE_EXCEPTION_RECORD = "error.update.exception.record"; + private static final String ERROR_SAVE_EXCEPTION_RECORD = "error.save.exception.record"; + private static final io.kubernetes.client.openapi.JSON JSON = new JSON(); @Autowired private AppExceptionRecordMapper appExceptionRecordMapper; @Autowired @@ -51,12 +54,12 @@ public void createOrUpdateExceptionRecord(String resourceType, String resource, int desired = 1; String resourceName = ""; if (ResourceType.DEPLOYMENT.getType().equals(resourceType)) { - V1beta2Deployment v1beta2Deployment = json.deserialize(resource, V1beta2Deployment.class); + V1Deployment v1beta2Deployment = JSON.deserialize(resource, V1Deployment.class); current = v1beta2Deployment.getStatus().getReadyReplicas() == null ? 0 : v1beta2Deployment.getStatus().getReadyReplicas(); desired = v1beta2Deployment.getStatus().getReplicas() == null ? 0 : v1beta2Deployment.getStatus().getReplicas(); resourceName = v1beta2Deployment.getMetadata().getName(); } else if (ResourceType.STATEFULSET.getType().equals(resourceType)) { - V1beta2StatefulSet v1beta2StatefulSet = json.deserialize(resource, V1beta2StatefulSet.class); + V1StatefulSet v1beta2StatefulSet = JSON.deserialize(resource, V1StatefulSet.class); current = v1beta2StatefulSet.getStatus().getReadyReplicas() == null ? 0 : v1beta2StatefulSet.getStatus().getReadyReplicas(); desired = v1beta2StatefulSet.getStatus().getReplicas() == null ? 0 : v1beta2StatefulSet.getStatus().getReplicas(); resourceName = v1beta2StatefulSet.getMetadata().getName(); @@ -71,7 +74,7 @@ public void createOrUpdateExceptionRecord(String resourceType, String resource, AppExceptionRecordDTO appExceptionRecordDTO = appExceptionRecordMapper.queryLatestExceptionRecordFilterByType(devopsDeployAppCenterEnvDTO.getId(), resourceType, resourceName); if (appExceptionRecordDTO != null) { appExceptionRecordDTO.setEndDate(new Date()); - MapperUtil.resultJudgedUpdateByPrimaryKeySelective(appExceptionRecordMapper, appExceptionRecordDTO, "error.update.exception.record"); + MapperUtil.resultJudgedUpdateByPrimaryKeySelective(appExceptionRecordMapper, appExceptionRecordDTO, ERROR_UPDATE_EXCEPTION_RECORD); } } else if (current == 0) { // 停机 @@ -85,11 +88,11 @@ public void createOrUpdateExceptionRecord(String resourceType, String resource, resourceName, new Date(), true); - MapperUtil.resultJudgedInsertSelective(appExceptionRecordMapper, appExceptionRecordDTO1, "error.save.exception.record"); + MapperUtil.resultJudgedInsertSelective(appExceptionRecordMapper, appExceptionRecordDTO1, ERROR_SAVE_EXCEPTION_RECORD); } else { if (Boolean.FALSE.equals(appExceptionRecordDTO.getDowntime())) { appExceptionRecordDTO.setEndDate(new Date()); - MapperUtil.resultJudgedUpdateByPrimaryKeySelective(appExceptionRecordMapper, appExceptionRecordDTO, "error.update.exception.record"); + MapperUtil.resultJudgedUpdateByPrimaryKeySelective(appExceptionRecordMapper, appExceptionRecordDTO, ERROR_UPDATE_EXCEPTION_RECORD); AppExceptionRecordDTO appExceptionRecordDTO1 = new AppExceptionRecordDTO(devopsDeployAppCenterEnvDTO.getProjectId(), devopsDeployAppCenterEnvDTO.getId(), @@ -98,7 +101,7 @@ public void createOrUpdateExceptionRecord(String resourceType, String resource, resourceName, new Date(), true); - MapperUtil.resultJudgedInsertSelective(appExceptionRecordMapper, appExceptionRecordDTO1, "error.save.exception.record"); + MapperUtil.resultJudgedInsertSelective(appExceptionRecordMapper, appExceptionRecordDTO1, ERROR_SAVE_EXCEPTION_RECORD); } } } else { @@ -112,11 +115,11 @@ public void createOrUpdateExceptionRecord(String resourceType, String resource, resourceName, new Date(), false); - MapperUtil.resultJudgedInsertSelective(appExceptionRecordMapper, appExceptionRecordDTO1, "error.save.exception.record"); + MapperUtil.resultJudgedInsertSelective(appExceptionRecordMapper, appExceptionRecordDTO1, ERROR_SAVE_EXCEPTION_RECORD); } else { if (Boolean.TRUE.equals(appExceptionRecordDTO.getDowntime())) { appExceptionRecordDTO.setEndDate(new Date()); - MapperUtil.resultJudgedUpdateByPrimaryKeySelective(appExceptionRecordMapper, appExceptionRecordDTO, "error.update.exception.record"); + MapperUtil.resultJudgedUpdateByPrimaryKeySelective(appExceptionRecordMapper, appExceptionRecordDTO, ERROR_UPDATE_EXCEPTION_RECORD); AppExceptionRecordDTO appExceptionRecordDTO1 = new AppExceptionRecordDTO(devopsDeployAppCenterEnvDTO.getProjectId(), devopsDeployAppCenterEnvDTO.getId(), @@ -125,7 +128,7 @@ public void createOrUpdateExceptionRecord(String resourceType, String resource, resourceName, new Date(), false); - MapperUtil.resultJudgedInsertSelective(appExceptionRecordMapper, appExceptionRecordDTO1, "error.save.exception.record"); + MapperUtil.resultJudgedInsertSelective(appExceptionRecordMapper, appExceptionRecordDTO1, ERROR_SAVE_EXCEPTION_RECORD); } } diff --git a/src/main/java/io/choerodon/devops/app/service/impl/AppServiceHelmRelServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/AppServiceHelmRelServiceImpl.java new file mode 100644 index 0000000000..f98dd77d65 --- /dev/null +++ b/src/main/java/io/choerodon/devops/app/service/impl/AppServiceHelmRelServiceImpl.java @@ -0,0 +1,39 @@ +package io.choerodon.devops.app.service.impl; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.Assert; + +import io.choerodon.devops.app.service.AppServiceHelmRelService; +import io.choerodon.devops.infra.constant.ResourceCheckConstant; +import io.choerodon.devops.infra.dto.AppServiceHelmRelDTO; +import io.choerodon.devops.infra.mapper.AppServiceHelmRelMapper; + +/** + * 应用服务和helm配置的关联关系表(AppServiceHelmRel)应用服务 + * + * @author hao.wang@zknow.com + * @since 2022-07-15 10:55:52 + */ +@Service +public class AppServiceHelmRelServiceImpl implements AppServiceHelmRelService { + @Autowired + private AppServiceHelmRelMapper appServiceHelmRelMapper; + + @Override + public AppServiceHelmRelDTO queryByAppServiceId(Long appServiceId) { + Assert.notNull(appServiceId, ResourceCheckConstant.ERROR_APP_SERVICE_ID_IS_NULL); + + AppServiceHelmRelDTO appServiceHelmRelDTO = new AppServiceHelmRelDTO(); + appServiceHelmRelDTO.setAppServiceId(appServiceId); + return appServiceHelmRelMapper.selectOne(appServiceHelmRelDTO); + } + + @Override + public void batchInsertInNewTrans(List appServiceHelmRelDTOToInsert) { + appServiceHelmRelMapper.batchInsert(appServiceHelmRelDTOToInsert); + } +} + diff --git a/src/main/java/io/choerodon/devops/app/service/impl/AppServiceHelmVersionServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/AppServiceHelmVersionServiceImpl.java new file mode 100644 index 0000000000..8eca131ab8 --- /dev/null +++ b/src/main/java/io/choerodon/devops/app/service/impl/AppServiceHelmVersionServiceImpl.java @@ -0,0 +1,67 @@ +package io.choerodon.devops.app.service.impl; + +import java.util.List; +import java.util.Set; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.Assert; + +import io.choerodon.devops.api.vo.appversion.AppServiceHelmVersionVO; +import io.choerodon.devops.app.service.AppServiceHelmVersionService; +import io.choerodon.devops.infra.constant.ResourceCheckConstant; +import io.choerodon.devops.infra.dto.AppServiceHelmVersionDTO; +import io.choerodon.devops.infra.mapper.AppServiceHelmVersionMapper; +import io.choerodon.devops.infra.util.MapperUtil; + +/** + * 应用版本表(AppServiceHelmVersion)应用服务 + * + * @author hao.wang@zknow.com + * @since 2022-07-13 16:47:41 + */ +@Service +public class AppServiceHelmVersionServiceImpl implements AppServiceHelmVersionService { + @Autowired + private AppServiceHelmVersionMapper appServiceHelmVersionMapper; + + @Override + public List listByAppVersionIds(Set versionIds) { + return appServiceHelmVersionMapper.listByAppVersionIds(versionIds); + } + + @Override + public AppServiceHelmVersionDTO queryByAppServiceVersionId(Long appServiceVersionId) { + Assert.notNull(appServiceVersionId, ResourceCheckConstant.ERROR_SERVICE_VERSION_ID_IS_NULL); + + AppServiceHelmVersionDTO appServiceHelmVersionDTO = new AppServiceHelmVersionDTO(); + appServiceHelmVersionDTO.setAppServiceVersionId(appServiceVersionId); + + return appServiceHelmVersionMapper.selectOne(appServiceHelmVersionDTO); + } + + @Override + @Transactional + public void create(AppServiceHelmVersionDTO appServiceHelmVersionDTO) { + MapperUtil.resultJudgedInsertSelective(appServiceHelmVersionMapper, appServiceHelmVersionDTO, "error.save.helm.version"); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteByAppServiceVersionId(Long appServiceVersionId) { + Assert.notNull(appServiceVersionId, ResourceCheckConstant.ERROR_SERVICE_VERSION_ID_IS_NULL); + + AppServiceHelmVersionDTO appServiceHelmVersionDTO = new AppServiceHelmVersionDTO(); + appServiceHelmVersionDTO.setAppServiceVersionId(appServiceVersionId); + appServiceHelmVersionMapper.delete(appServiceHelmVersionDTO); + } + + @Override + @Transactional(propagation = Propagation.REQUIRES_NEW) + public void batchInsertInNewTrans(List appServiceHelmVersionDTOToInsert) { + appServiceHelmVersionMapper.batchInsert(appServiceHelmVersionDTOToInsert); + } +} + diff --git a/src/main/java/io/choerodon/devops/app/service/impl/AppServiceImageVersionServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/AppServiceImageVersionServiceImpl.java new file mode 100644 index 0000000000..a9d0660016 --- /dev/null +++ b/src/main/java/io/choerodon/devops/app/service/impl/AppServiceImageVersionServiceImpl.java @@ -0,0 +1,72 @@ +package io.choerodon.devops.app.service.impl; + +import java.util.List; +import java.util.Set; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.Assert; + +import io.choerodon.devops.api.vo.appversion.AppServiceImageVersionVO; +import io.choerodon.devops.app.service.AppServiceImageVersionService; +import io.choerodon.devops.infra.constant.ResourceCheckConstant; +import io.choerodon.devops.infra.dto.AppServiceImageVersionDTO; +import io.choerodon.devops.infra.mapper.AppServiceImageVersionMapper; +import io.choerodon.devops.infra.util.MapperUtil; + +/** + * 应用版本表(AppServiceImageVersion)应用服务 + * + * @author hao.wang@zknow.com + * @since 2022-07-13 16:47:42 + */ +@Service +public class AppServiceImageVersionServiceImpl implements AppServiceImageVersionService { + @Autowired + private AppServiceImageVersionMapper appServiceImageVersionMapper; + + @Override + public void create(AppServiceImageVersionDTO appServiceImageVersionDTO) { + MapperUtil.resultJudgedInsertSelective(appServiceImageVersionMapper, appServiceImageVersionDTO, "error.save.image.version"); + } + + @Override + public AppServiceImageVersionDTO queryByAppServiceVersionId(Long appServiceVersionId) { + Assert.notNull(appServiceVersionId, ResourceCheckConstant.ERROR_SERVICE_VERSION_ID_IS_NULL); + + AppServiceImageVersionDTO appServiceImageVersionDTO = new AppServiceImageVersionDTO(); + appServiceImageVersionDTO.setAppServiceVersionId(appServiceVersionId); + + return appServiceImageVersionMapper.selectOne(appServiceImageVersionDTO); + } + + @Override + public List listByAppVersionIds(Set versionIds) { + return appServiceImageVersionMapper.listByAppVersionIds(versionIds); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void baseUpdate(AppServiceImageVersionDTO appServiceImageVersionDTO) { + appServiceImageVersionMapper.updateByPrimaryKeySelective(appServiceImageVersionDTO); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteByAppServiceVersionId(Long appServiceVersionId) { + Assert.notNull(appServiceVersionId, ResourceCheckConstant.ERROR_SERVICE_VERSION_ID_IS_NULL); + + AppServiceImageVersionDTO appServiceImageVersionDTO = new AppServiceImageVersionDTO(); + appServiceImageVersionDTO.setAppServiceVersionId(appServiceVersionId); + appServiceImageVersionMapper.delete(appServiceImageVersionDTO); + } + + @Override + @Transactional(propagation = Propagation.REQUIRES_NEW) + public void batchInsertInNewTrans(List appServiceImageVersionDTOS) { + appServiceImageVersionMapper.batchInsert(appServiceImageVersionDTOS); + } +} + diff --git a/src/main/java/io/choerodon/devops/app/service/impl/AppServiceInstanceServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/AppServiceInstanceServiceImpl.java index da4d3f5031..b6ad8090ee 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/AppServiceInstanceServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/AppServiceInstanceServiceImpl.java @@ -1,25 +1,11 @@ package io.choerodon.devops.app.service.impl; -import static io.choerodon.devops.infra.constant.MarketConstant.APP_SHELVES_CODE; -import static io.choerodon.devops.infra.constant.MarketConstant.APP_SHELVES_NAME; -import static io.choerodon.devops.infra.constant.MiscConstants.APP_INSTANCE_DELETE_REDIS_KEY; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.text.DecimalFormat; -import java.util.*; -import java.util.concurrent.TimeUnit; -import java.util.function.Function; -import java.util.stream.Collectors; -import javax.annotation.Nullable; - import com.fasterxml.jackson.databind.ObjectMapper; import com.google.gson.Gson; -import io.kubernetes.client.JSON; -import io.kubernetes.client.models.V1Service; -import io.kubernetes.client.models.V1beta1Ingress; +import io.kubernetes.client.openapi.JSON; +import io.kubernetes.client.openapi.models.V1Ingress; +import io.kubernetes.client.openapi.models.V1Service; import org.apache.commons.lang.StringUtils; import org.hzero.core.base.BaseConstants; import org.hzero.core.util.Pair; @@ -39,6 +25,20 @@ import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.text.DecimalFormat; +import java.util.*; +import java.util.concurrent.TimeUnit; +import java.util.function.Function; +import java.util.stream.Collectors; +import javax.annotation.Nullable; + +import static io.choerodon.devops.infra.constant.MarketConstant.APP_SHELVES_CODE; +import static io.choerodon.devops.infra.constant.MarketConstant.APP_SHELVES_NAME; +import static io.choerodon.devops.infra.constant.MiscConstants.APP_INSTANCE_DELETE_REDIS_KEY; + import io.choerodon.asgard.saga.annotation.Saga; import io.choerodon.asgard.saga.producer.StartSagaBuilder; import io.choerodon.asgard.saga.producer.TransactionalProducer; @@ -225,6 +225,12 @@ public class AppServiceInstanceServiceImpl implements AppServiceInstanceService private DevopsPrometheusMapper devopsPrometheusMapper; @Autowired private DevopsProjectMapper devopsProjectMapper; + @Autowired + private AppServiceImageVersionService appServiceImageVersionService; + @Autowired + private AppServiceHelmVersionService appServiceHelmVersionService; + @Autowired + private DevopsHelmConfigService devopsHelmConfigService; /** * 前端传入的排序字段和Mapper文件中的字段名的映射 */ @@ -579,26 +585,26 @@ public Page pageDeployTimeTable(Long projectId, PageRequest } - @Override - public void deployTestApp(Long projectId, AppServiceDeployVO appServiceDeployVO) { - // 这里的environmentId就是集群id - CommonExAssertUtil.assertTrue(permissionHelper.projectPermittedToCluster(appServiceDeployVO.getEnvironmentId(), projectId), MiscConstants.ERROR_OPERATING_RESOURCE_IN_OTHER_PROJECT); - - String versionValue = appServiceVersionService.baseQueryValue(appServiceDeployVO.getAppServiceVersionId()); - AppServiceDTO appServiceDTO = applicationService.baseQuery(appServiceDeployVO.getAppServiceId()); - - DevopsEnvironmentDTO devopsEnvironmentDTO = new DevopsEnvironmentDTO(); - devopsEnvironmentDTO.setClusterId(appServiceDeployVO.getEnvironmentId()); - devopsEnvironmentDTO.setCode(CHOERODON); - // 测试应用没有环境id - String secretCode = getSecret(appServiceDTO, appServiceDeployVO.getAppServiceVersionId(), devopsEnvironmentDTO); - - AppServiceVersionDTO appServiceVersionDTO = appServiceVersionService.baseQuery(appServiceDeployVO.getAppServiceVersionId()); - FileUtil.checkYamlFormat(appServiceDeployVO.getValues()); - String deployValue = getReplaceResult(versionValue, - appServiceDeployVO.getValues()).getDeltaYaml().trim(); - agentCommandService.deployTestApp(appServiceDTO, appServiceVersionDTO, appServiceDeployVO.getInstanceName(), secretCode, appServiceDeployVO.getEnvironmentId(), deployValue); - } +// @Override +// public void deployTestApp(Long projectId, AppServiceDeployVO appServiceDeployVO) { +// // 这里的environmentId就是集群id +// CommonExAssertUtil.assertTrue(permissionHelper.projectPermittedToCluster(appServiceDeployVO.getEnvironmentId(), projectId), MiscConstants.ERROR_OPERATING_RESOURCE_IN_OTHER_PROJECT); +// +// String versionValue = appServiceVersionService.baseQueryValue(appServiceDeployVO.getAppServiceVersionId()); +// AppServiceDTO appServiceDTO = applicationService.baseQuery(appServiceDeployVO.getAppServiceId()); +// +// DevopsEnvironmentDTO devopsEnvironmentDTO = new DevopsEnvironmentDTO(); +// devopsEnvironmentDTO.setClusterId(appServiceDeployVO.getEnvironmentId()); +// devopsEnvironmentDTO.setCode(CHOERODON); +// // 测试应用没有环境id +// String secretCode = getSecret(appServiceDTO, appServiceDeployVO.getAppServiceVersionId(), devopsEnvironmentDTO); +// +// AppServiceVersionDTO appServiceVersionDTO = appServiceVersionService.baseQuery(appServiceDeployVO.getAppServiceVersionId()); +// FileUtil.checkYamlFormat(appServiceDeployVO.getValues()); +// String deployValue = getReplaceResult(versionValue, +// appServiceDeployVO.getValues()).getDeltaYaml().trim(); +// agentCommandService.deployTestApp(appServiceDTO, appServiceVersionDTO, appServiceDeployVO.getInstanceName(), secretCode, appServiceDeployVO.getEnvironmentId(), deployValue); +// } @Override @@ -625,10 +631,10 @@ public InstanceControllerDetailVO getInstanceResourceDetailYaml(Long instanceId, } } - @Override - public void getTestAppStatus(Map> testReleases) { - agentCommandService.getTestAppStatus(testReleases); - } +// @Override +// public void getTestAppStatus(Map> testReleases) { +// agentCommandService.getTestAppStatus(testReleases); +// } @Override public void operationPodCount(Long projectId, String kind, String name, Long envId, Long count, boolean workload) { @@ -1712,7 +1718,7 @@ public void deleteInstance(Long projectId, Long instanceId, Boolean deletePromet TypeUtil.objToInteger(devopsEnvironmentDTO.getGitlabEnvProjectId()), RELEASE_PREFIX + appServiceInstanceDTO.getCode() + YAML_SUFFIX, "DELETE FILE", - TypeUtil.objToInteger(userAttrDTO.getGitlabUserId()), "master"); + TypeUtil.objToInteger(userAttrDTO.getGitlabUserId()), MASTER); } return; } else { @@ -1837,7 +1843,7 @@ private void checkNameInternal(String code, Long envId, boolean isFromPipeline) @Override public InstanceValueVO getReplaceResult(String versionValue, String deployValue) { String deployFileAfterProcessed = deleteLineStartWithPoundKey(deployValue); - if (versionValue.equals(deployValue) || !org.springframework.util.StringUtils.hasText(deployFileAfterProcessed)) { + if (versionValue.equals(deployValue) || org.apache.commons.lang3.StringUtils.isEmpty(deployFileAfterProcessed)) { InstanceValueVO instanceValueVO = new InstanceValueVO(); instanceValueVO.setDeltaYaml(""); instanceValueVO.setYaml(versionValue); @@ -2212,8 +2218,8 @@ public void batchDeploymentSaga(BatchDeploymentPayload batchDeploymentPayload) { } for (IngressSagaPayload ingressSagaPayload : batchDeploymentPayload.getIngressSagaPayloads()) { - ResourceConvertToYamlHandler ingressResourceConvertToYamlHandler = new ResourceConvertToYamlHandler<>(); - ingressResourceConvertToYamlHandler.setType(ingressSagaPayload.getV1beta1Ingress()); + ResourceConvertToYamlHandler ingressResourceConvertToYamlHandler = new ResourceConvertToYamlHandler<>(); + ingressResourceConvertToYamlHandler.setType(ingressSagaPayload.getV1Ingress()); String ingressContent = ingressResourceConvertToYamlHandler.getCreationResourceContentForBatchDeployment(); String fileName = GitOpsConstants.INGRESS_PREFIX + ingressSagaPayload.getDevopsIngressDTO().getName() + GitOpsConstants.YAML_FILE_SUFFIX; pathContentMap.put(fileName, ingressContent); @@ -2289,7 +2295,6 @@ public void hzeroDeploy(Long detailsRecordId) { @Transactional(propagation = Propagation.REQUIRES_NEW) public void pipelineDeployHzeroApp(Long projectId, DevopsHzeroDeployDetailsDTO devopsHzeroDeployDetailsDTO) { -// AppServiceInstanceDTO appServiceInstanceDTO = baseQueryByCodeAndEnv(devopsHzeroDeployDetailsDTO.getInstanceCode(), devopsHzeroDeployDetailsDTO.getEnvId()); DevopsHzeroDeployConfigDTO devopsHzeroDeployConfigDTO = devopsHzeroDeployConfigService.baseQueryById(devopsHzeroDeployDetailsDTO.getValueId()); // 设置用户上下文 @@ -2652,14 +2657,14 @@ private String getSecret(AppServiceDTO appServiceDTO, Long appServiceVersionId, String secretCode = null; //如果应用绑定了私有镜像库,则处理secret AppServiceVersionDTO appServiceVersionDTO = appServiceVersionService.baseQuery(appServiceVersionId); - // 先处理chart的认证信息 sendChartMuseumAuthentication(devopsEnvironmentDTO.getClusterId(), appServiceDTO, appServiceVersionDTO); DevopsConfigDTO devopsConfigDTO; - if (appServiceVersionDTO.getHarborConfigId() != null) { + AppServiceHelmVersionDTO appServiceHelmVersionDTO = appServiceHelmVersionService.queryByAppServiceVersionId(appServiceVersionId); + if (appServiceHelmVersionDTO.getHarborConfigId() != null) { devopsConfigDTO = harborService.queryRepoConfigByIdToDevopsConfig(appServiceDTO.getId(), appServiceDTO.getProjectId(), - appServiceVersionDTO.getHarborConfigId(), appServiceVersionDTO.getRepoType(), AUTHTYPE); + appServiceHelmVersionDTO.getHarborConfigId(), appServiceHelmVersionDTO.getHarborRepoType(), AUTHTYPE); } else { //查询harbor的用户名密码 devopsConfigDTO = harborService.queryRepoConfigToDevopsConfig(appServiceDTO.getProjectId(), @@ -2803,10 +2808,12 @@ private String parseMarketChartRepo(String chartRepo) { */ private void sendChartMuseumAuthentication(Long clusterId, AppServiceDTO appServiceDTO, AppServiceVersionDTO appServiceVersionDTO) { - if (appServiceVersionDTO.getHelmConfigId() != null) { + AppServiceHelmVersionDTO appServiceHelmVersionDTO = appServiceHelmVersionService.queryByAppServiceVersionId(appServiceVersionDTO.getId()); + if (appServiceHelmVersionDTO.getHelmConfigId() != null) { // 查询chart配置 - DevopsConfigDTO devopsConfigDTO = devopsConfigService.queryRealConfig(appServiceDTO.getId(), APP_SERVICE, "chart", null); - ConfigVO helmConfig = gson.fromJson(devopsConfigDTO.getConfig(), ConfigVO.class); + DevopsHelmConfigDTO devopsHelmConfigDTO = devopsHelmConfigService.queryById(appServiceHelmVersionDTO.getHelmConfigId()); + ConfigVO helmConfig = ConvertUtils.convertObject(devopsHelmConfigDTO, ConfigVO.class); + helmConfig.setIsPrivate(devopsHelmConfigDTO.getRepoPrivate()); // 如果是私有的, 发送认证信息给agent if (Boolean.TRUE.equals(helmConfig.getIsPrivate())) { agentCommandService.sendChartMuseumAuthentication(clusterId, helmConfig); diff --git a/src/main/java/io/choerodon/devops/app/service/impl/AppServiceMavenVersionServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/AppServiceMavenVersionServiceImpl.java new file mode 100644 index 0000000000..ac42d33cd4 --- /dev/null +++ b/src/main/java/io/choerodon/devops/app/service/impl/AppServiceMavenVersionServiceImpl.java @@ -0,0 +1,68 @@ +package io.choerodon.devops.app.service.impl; + +import java.util.List; +import java.util.Set; + +import org.springframework.beans.factory.annotation.Autowired; + +import io.choerodon.devops.api.vo.appversion.AppServiceMavenVersionVO; +import io.choerodon.devops.app.service.AppServiceMavenVersionService; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.Assert; + +import io.choerodon.devops.infra.constant.ResourceCheckConstant; +import io.choerodon.devops.infra.dto.AppServiceMavenVersionDTO; +import io.choerodon.devops.infra.mapper.AppServiceMavenVersionMapper; +import io.choerodon.devops.infra.util.MapperUtil; + +/** + * 应用版本表(AppServiceMavenVersion)应用服务 + * + * @author hao.wang@zknow.com + * @since 2022-07-13 16:47:43 + */ +@Service +public class AppServiceMavenVersionServiceImpl implements AppServiceMavenVersionService { + @Autowired + private AppServiceMavenVersionMapper appServiceMavenVersionMapper; + + @Override + public AppServiceMavenVersionDTO queryByAppServiceVersionId(Long appServiceVersionId) { + Assert.notNull(appServiceVersionId, ResourceCheckConstant.ERROR_SERVICE_VERSION_ID_IS_NULL); + + AppServiceMavenVersionDTO appServiceMavenVersionDTO = new AppServiceMavenVersionDTO(); + appServiceMavenVersionDTO.setAppServiceVersionId(appServiceVersionId); + + return appServiceMavenVersionMapper.selectOne(appServiceMavenVersionDTO); + } + + @Override + @Transactional + public void create(AppServiceMavenVersionDTO appServiceMavenVersionDTO) { + MapperUtil.resultJudgedInsertSelective(appServiceMavenVersionMapper, appServiceMavenVersionDTO, "error.save.maven.version"); + } + + @Override + public List listByAppVersionIds(Set versionIds) { + return appServiceMavenVersionMapper.listByAppVersionIds(versionIds); + } + + @Override + @Transactional + public void baseUpdate(AppServiceMavenVersionDTO appServiceMavenVersionDTO) { + appServiceMavenVersionMapper.updateByPrimaryKeySelective(appServiceMavenVersionDTO); + } + + @Override + public void deleteByAppServiceVersionId(Long appServiceVersionId) { + Assert.notNull(appServiceVersionId, ResourceCheckConstant.ERROR_SERVICE_VERSION_ID_IS_NULL); + + AppServiceMavenVersionDTO appServiceMavenVersionDTO = new AppServiceMavenVersionDTO(); + appServiceMavenVersionDTO.setAppServiceVersionId(appServiceVersionId); + appServiceMavenVersionMapper.delete(appServiceMavenVersionDTO); + + } +} + diff --git a/src/main/java/io/choerodon/devops/app/service/impl/AppServiceServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/AppServiceServiceImpl.java index 745a1a72bc..c1f1900a38 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/AppServiceServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/AppServiceServiceImpl.java @@ -9,6 +9,7 @@ import java.io.IOException; import java.io.InputStream; import java.math.BigDecimal; +import java.net.URL; import java.nio.charset.StandardCharsets; import java.text.DateFormat; import java.text.ParseException; @@ -24,7 +25,6 @@ import com.google.common.base.Functions; import com.google.common.base.Joiner; import com.google.gson.Gson; -import io.kubernetes.client.JSON; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.eclipse.jgit.api.Git; @@ -45,7 +45,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; -import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; @@ -83,7 +82,6 @@ import io.choerodon.devops.infra.constant.GitOpsConstants; import io.choerodon.devops.infra.constant.MiscConstants; import io.choerodon.devops.infra.constant.PipelineConstants; -import io.choerodon.devops.infra.constant.ResourceCheckConstant; import io.choerodon.devops.infra.dto.*; import io.choerodon.devops.infra.dto.gitlab.*; import io.choerodon.devops.infra.dto.harbor.HarborRepoConfigDTO; @@ -136,7 +134,6 @@ public class AppServiceServiceImpl implements AppServiceService { private static final String DUPLICATE = "duplicate"; private static final String NORMAL_SERVICE = "normal_service"; private static final String SHARE_SERVICE = "share_service"; - private static final String ALL = "all"; private static final String TEMP_MODAL = "\\?version="; private static final String LOGIN_NAME = "loginName"; private static final String REAL_NAME = "realName"; @@ -154,7 +151,6 @@ public class AppServiceServiceImpl implements AppServiceService { private static final String CI_FILE_TEMPLATE; private final Gson gson = new Gson(); - private final JSON json = new JSON(); @Value("${services.gitlab.url}") private String gitlabUrl; @Value("${services.gitlab.proxy-url:}") @@ -258,6 +254,8 @@ public class AppServiceServiceImpl implements AppServiceService { private DevopsCiPipelineFunctionService devopsCiPipelineFunctionService; @Autowired private AppServiceInstanceService appServiceInstanceService; + @Autowired + private DevopsAppServiceHelmRelService devopsAppServiceHelmRelService; static { try (InputStream inputStream = AppServiceServiceImpl.class.getResourceAsStream("/shell/ci.sh")) { @@ -354,17 +352,13 @@ public AppServiceRepVO query(Long projectId, Long appServiceId) { shareAppService = true; } AppServiceRepVO appServiceRepVO = dtoToRepVo(appServiceDTO); - List devopsConfigVOS = devopsConfigService.queryByResourceId(appServiceId, APP_SERVICE); - if (!devopsConfigVOS.isEmpty()) { - devopsConfigVOS.forEach(devopsConfigVO -> { - if (devopsConfigVO.getType().equals(CHART)) { - appServiceRepVO.setChart(devopsConfigVO); - } - }); + DevopsAppServiceHelmRelDTO devopsAppServiceHelmRelDTO = devopsAppServiceHelmRelService.queryByAppServiceId(appServiceId); + if (devopsAppServiceHelmRelDTO != null) { + appServiceRepVO.setHelmConfigId(devopsAppServiceHelmRelDTO.getHelmConfigId()); } //url地址拼接 if (appServiceDTO.getGitlabProjectId() != null && !shareAppService) { - appServiceRepVO.setRepoUrl(concatRepoUrl(organizationDTO.getTenantNum(), projectDTO.getCode(), appServiceDTO.getCode())); + appServiceRepVO.setRepoUrl(concatRepoUrl(organizationDTO.getTenantNum(), projectDTO.getDevopsComponentCode(), appServiceDTO.getCode())); } if (shareAppService) { ProjectDTO shareProjectDTO = baseServiceClientOperator.queryIamProjectById(appServiceDTO.getProjectId()); @@ -514,7 +508,7 @@ public void deleteAppServiceSage(Long projectId, Long appServiceId) { Tenant tenant = baseServiceClientOperator.queryOrganizationById(projectDTO.getOrganizationId()); UserAttrDTO userAttrDTO = userAttrService.baseQueryById(TypeUtil.objToLong(GitUserNameUtil.getUserId())); Integer gitlabUserId = TypeUtil.objToInt(userAttrDTO.getGitlabUserId()); - GitlabProjectDTO gitlabProjectDO = gitlabServiceClientOperator.queryProjectByName(tenant.getTenantNum() + "-" + projectDTO.getCode(), appServiceDTO.getCode(), gitlabUserId, false); + GitlabProjectDTO gitlabProjectDO = gitlabServiceClientOperator.queryProjectByName(tenant.getTenantNum() + "-" + projectDTO.getDevopsComponentCode(), appServiceDTO.getCode(), gitlabUserId, false); if (gitlabProjectDO != null && gitlabProjectDO.getId() != null) { // 一般情况下,这个关于count的if条件是true,不正常的数据才会false if (selectCountByGitlabProjectId(gitlabProjectDO.getId()) == 0) { @@ -554,33 +548,10 @@ public Boolean update(Long projectId, AppServiceUpdateDTO appServiceUpdateDTO) { appServiceMapper.updatePomFields(appServiceUpdateDTO.getId(), appServiceUpdateDTO.getGroupId(), appServiceUpdateDTO.getArtifactId()); AppServiceDTO appServiceDTO = ConvertUtils.convertObject(appServiceUpdateDTO, AppServiceDTO.class); - List devopsConfigVOS = new ArrayList<>(); - DevopsConfigVO chart = new DevopsConfigVO(); - if (ObjectUtils.isEmpty(appServiceUpdateDTO.getChart())) { - chart.setCustom(false); - } else { - chart = appServiceUpdateDTO.getChart(); - chart.setCustom(Boolean.TRUE); - ConfigVO configVO = chart.getConfig(); - CommonExAssertUtil.assertNotNull(configVO, "error.chart.config.null"); - boolean usernameEmpty = StringUtils.isEmpty(configVO.getUserName()); - boolean passwordEmpty = StringUtils.isEmpty(configVO.getPassword()); - if (!usernameEmpty && !passwordEmpty) { - configVO.setUserName(configVO.getUserName()); - configVO.setPassword(configVO.getPassword()); - configVO.setIsPrivate(Boolean.TRUE); - } else { - configVO.setIsPrivate(Boolean.FALSE); - } - - // 用户名和密码要么都为空, 要么都有值 - CommonExAssertUtil.assertTrue(((usernameEmpty && passwordEmpty) || (!usernameEmpty && !passwordEmpty)), "error.chart.auth.invalid"); - } - chart.setType(CHART); - devopsConfigVOS.add(chart); //处理helm仓库的配置 - devopsConfigService.operate(appServiceId, APP_SERVICE, devopsConfigVOS); + devopsAppServiceHelmRelService.handleRel(appServiceUpdateDTO.getId(), appServiceUpdateDTO.getHelmConfigId()); + //保存应用服务与harbor仓库的关系 if (!Objects.isNull(appServiceUpdateDTO.getHarborRepoConfigDTO())) { if (DEFAULT_REPO.equals(appServiceUpdateDTO.getHarborRepoConfigDTO().getType())) { @@ -591,10 +562,10 @@ public Boolean update(Long projectId, AppServiceUpdateDTO appServiceUpdateDTO) { rdupmClient.saveRelationByService(projectId, appServiceDTO.getId(), appServiceUpdateDTO.getHarborRepoConfigDTO().getRepoId()); } } - if (appServiceUpdateDTO.getChart() != null) { - DevopsConfigDTO chartConfig = devopsConfigService.queryRealConfig(appServiceId, APP_SERVICE, CHART, AUTHTYPE_PULL); - appServiceDTO.setChartConfigId(chartConfig.getId()); - } +// if (appServiceUpdateDTO.getChart() != null) { +// DevopsConfigDTO chartConfig = devopsConfigService.queryRealConfig(appServiceId, APP_SERVICE, CHART, AUTHTYPE_PULL); +// appServiceDTO.setChartConfigId(chartConfig.getId()); +// } if (!oldAppServiceDTO.getName().equals(appServiceUpdateDTO.getName())) { checkName(oldAppServiceDTO.getProjectId(), appServiceDTO.getName()); @@ -727,14 +698,6 @@ public Page pageByOptions(Long projectId, Boolean isActive, Boo List userIds = appServiceDTOList.stream().map(AppServiceDTO::getCreatedBy).collect(toList()); userIds.addAll(appServiceDTOList.stream().map(AppServiceDTO::getLastUpdatedBy).collect(toList())); List distinctIds = userIds.stream().distinct().collect(toList()); - -// Future> userFuture = baseServiceClientOperator.listUsersByIdsCollapse(new ArrayList<>(distinctIds)); -// List userResult; -// try { -// userResult = userFuture.get(); -// } catch (InterruptedException | ExecutionException e) { -// throw new CommonException("Failed to get user", e); -// } List userResult = baseServiceClientOperator.listUsersByIds(distinctIds); Map users = userResult.stream().collect(Collectors.toMap(IamUserDTO::getId, u -> u)); @@ -777,7 +740,7 @@ public Page pageInternalByOptionsWithAccessLevel(Long projectId @Override public List listByActive(Long projectId) { Long userId = DetailsHelper.getUserDetails().getUserId(); - ProjectDTO projectDTO = baseServiceClientOperator.queryIamProjectById(projectId, false, false, false); + ProjectDTO projectDTO = baseServiceClientOperator.queryIamProjectById(projectId, false, false, false, false, false); boolean projectOwner = permissionHelper.isGitlabProjectOwnerOrGitlabAdmin(projectId, userId); List applicationDTOServiceList; if (projectOwner) { @@ -939,7 +902,7 @@ public void operationApplication(DevOpsAppServicePayload devOpsAppServicePayload ProjectDTO projectDTO = baseServiceClientOperator.queryIamProjectBasicInfoById(devopsProjectDTO.getIamProjectId()); Tenant organizationDTO = baseServiceClientOperator.queryOrganizationBasicInfoById(projectDTO.getOrganizationId()); GitlabProjectDTO gitlabProjectDO = gitlabServiceClientOperator - .queryProjectByName(organizationDTO.getTenantNum() + "-" + projectDTO.getCode(), appServiceDTO.getCode(), + .queryProjectByName(organizationDTO.getTenantNum() + "-" + projectDTO.getDevopsComponentCode(), appServiceDTO.getCode(), devOpsAppServicePayload.getUserId(), false); Integer gitlabProjectId = gitlabProjectDO.getId(); if (gitlabProjectId == null) { @@ -962,7 +925,7 @@ public void operationApplication(DevOpsAppServicePayload devOpsAppServicePayload LOGGER.info("The template app service id is not null: {}, start to clone template repository", devOpsAppServicePayload.getTemplateAppServiceId()); String repoUrl = !gitlabUrl.endsWith("/") ? gitlabUrl + "/" : gitlabUrl; - String newGroupName = organizationDTO.getTenantNum() + "-" + projectDTO.getCode(); + String newGroupName = organizationDTO.getTenantNum() + "-" + projectDTO.getDevopsComponentCode(); String repositoryUrl = repoUrl + newGroupName + "/" + appServiceDTO.getCode() + GIT; cloneAndPushCode(appServiceDTO, userAttrDTO, devOpsAppServicePayload.getTemplateAppServiceId(), devOpsAppServicePayload.getTemplateAppServiceVersionId(), repositoryUrl, newGroupName); } @@ -1027,7 +990,7 @@ public void operationAppServiceImport(DevOpsAppImportServicePayload devOpsAppSer Tenant organizationDTO = baseServiceClientOperator.queryOrganizationBasicInfoById(projectDTO.getOrganizationId()); GitlabProjectDTO gitlabProjectDO = gitlabServiceClientOperator.queryProjectByName( - organizationDTO.getTenantNum() + "-" + projectDTO.getCode(), + organizationDTO.getTenantNum() + "-" + projectDTO.getDevopsComponentCode(), appServiceDTO.getCode(), devOpsAppServiceImportPayload.getUserId(), false); @@ -1050,7 +1013,7 @@ public void operationAppServiceImport(DevOpsAppImportServicePayload devOpsAppSer gitlabServiceClientOperator.updateProjectCiConfigPath(gitlabProjectDO.getId(), TypeUtil.objToInteger(userAttrDTO.getGitlabUserId()), GitOpsConstants.TEMP_CI_CONFIG_PATH); if (devOpsAppServiceImportPayload.getTemplate() != null && devOpsAppServiceImportPayload.getTemplate() - && !StringUtils.isEmpty(devOpsAppServiceImportPayload.getRepositoryUrl())) { + && StringUtils.hasText(devOpsAppServiceImportPayload.getRepositoryUrl())) { String[] tempUrl = devOpsAppServiceImportPayload.getRepositoryUrl().split(TEMP_MODAL); if (tempUrl.length < 2) { throw new CommonException("error.temp.git.url"); @@ -1059,11 +1022,11 @@ public void operationAppServiceImport(DevOpsAppImportServicePayload devOpsAppSer String repositoryUrl = tempUrl[0]; externalGitUtil.cloneAppMarket(applicationDir, templateVersion, repositoryUrl, devOpsAppServiceImportPayload.getAccessToken()); File applicationWorkDir = new File(gitUtil.getWorkingDirectory(applicationDir)); - replaceParams(appServiceDTO.getCode(), organizationDTO.getTenantNum() + "-" + projectDTO.getCode(), applicationDir, null, null, true); + replaceParams(appServiceDTO.getCode(), organizationDTO.getTenantNum() + "-" + projectDTO.getDevopsComponentCode(), applicationDir, null, null, true); Git newGit = gitUtil.initGit(applicationWorkDir); String repoUrl = !gitlabUrl.endsWith("/") ? gitlabUrl + "/" : gitlabUrl; appServiceDTO.setRepoUrl(repoUrl + organizationDTO.getTenantNum() - + "-" + projectDTO.getCode() + "/" + appServiceDTO.getCode() + ".git"); + + "-" + projectDTO.getDevopsComponentCode() + "/" + appServiceDTO.getCode() + ".git"); String accessToken = getToken(devOpsAppServiceImportPayload.getGitlabProjectId(), applicationDir, userAttrDTO); try { gitUtil.commitAndPushForMaster(newGit, appServiceDTO.getRepoUrl(), templateVersion, accessToken); @@ -1103,15 +1066,15 @@ public void operationAppServiceImport(DevOpsAppImportServicePayload devOpsAppSer String pullToken = getToken(devOpsAppServiceImportPayload.getGitlabProjectId(), applicationDir, gitlabAdminDTO); git = gitUtil.cloneRepository(applicationWorkDir, appTemplateDTO.getGitlabUrl(), pullToken); } - replaceParams(appServiceDTO.getCode(), organizationDTO.getTenantNum() + "-" + projectDTO.getCode(), applicationWorkPath, oldAppServiceCode, devopsAppTemplateService.getTemplateGroupPath(appTemplateDTO.getId()), false); + replaceParams(appServiceDTO.getCode(), organizationDTO.getTenantNum() + "-" + projectDTO.getDevopsComponentCode(), applicationWorkPath, oldAppServiceCode, devopsAppTemplateService.getTemplateGroupPath(appTemplateDTO.getId()), false); String repoUrl = !gitlabUrl.endsWith("/") ? gitlabUrl + "/" : gitlabUrl; appServiceDTO.setRepoUrl(repoUrl + organizationDTO.getTenantNum() - + "-" + projectDTO.getCode() + "/" + appServiceDTO.getCode() + ".git"); + + "-" + projectDTO.getDevopsComponentCode() + "/" + appServiceDTO.getCode() + ".git"); String accessToken = getToken(devOpsAppServiceImportPayload.getGitlabProjectId(), applicationDir, userAttrDTO); try { gitUtil.commitAndPushForMaster(git, appServiceDTO.getRepoUrl(), "init app from template", accessToken); } catch (Exception e) { - throw e; + throw new CommonException("init app from template failed", e); } finally { releaseResources(applicationWorkDir, git); } @@ -1122,7 +1085,7 @@ public void operationAppServiceImport(DevOpsAppImportServicePayload devOpsAppSer // 设置Application对应的gitlab项目的仓库地址 String repoUrl = !gitlabUrl.endsWith("/") ? gitlabUrl + "/" : gitlabUrl; appServiceDTO.setRepoUrl(repoUrl + organizationDTO.getTenantNum() - + "-" + projectDTO.getCode() + "/" + appServiceDTO.getCode() + ".git"); + + "-" + projectDTO.getDevopsComponentCode() + "/" + appServiceDTO.getCode() + ".git"); File applicationWorkDir = new File(gitUtil.getWorkingDirectory(applicationDir)); @@ -1240,11 +1203,10 @@ public String queryFile(String token) { try { ProjectDTO projectDTO = baseServiceClientOperator.queryIamProjectById(appServiceDTO.getProjectId()); Tenant organizationDTO = baseServiceClientOperator.queryOrganizationById(projectDTO.getOrganizationId()); -// DevopsConfigDTO harborConfigDTO = devopsConfigService.queryRealConfig(appServiceDTO.getId(), APP_SERVICE, HARBOR, AUTHTYPE_PUSH); DevopsConfigDTO harborConfigDTO = harborService.queryRepoConfigToDevopsConfig(projectDTO.getId(), appServiceDTO.getId(), AUTHTYPE_PUSH); ConfigVO harborProjectConfig = gson.fromJson(harborConfigDTO.getConfig(), ConfigVO.class); Map params = new HashMap<>(); - String groupName = organizationDTO.getTenantNum() + "-" + projectDTO.getCode(); + String groupName = organizationDTO.getTenantNum() + "-" + projectDTO.getDevopsComponentCode(); params.put("{{ SONAR_GROUP_NAME }}", groupName); if (harborProjectConfig.getProject() != null) { groupName = harborProjectConfig.getProject(); @@ -1259,16 +1221,17 @@ public String queryFile(String token) { params.put("{{ SONAR_LOGIN }}", ""); params.put("{{ SONAR_URL }}", ""); } - params.put("{{ SONAR_PROJECT_KEY }}", organizationDTO.getTenantNum() + "-" + projectDTO.getCode() + ":" + appServiceDTO.getCode()); + params.put("{{ SONAR_PROJECT_KEY }}", organizationDTO.getTenantNum() + "-" + projectDTO.getDevopsComponentCode() + ":" + appServiceDTO.getCode()); params.put("{{ GROUP_NAME }}", groupName); params.put("{{ PROJECT_NAME }}", appServiceDTO.getCode()); - params.put("{{ PRO_CODE }}", projectDTO.getCode()); + params.put("{{ PRO_CODE }}", projectDTO.getDevopsComponentCode()); params.put("{{ ORG_CODE }}", organizationDTO.getTenantNum()); params.put("{{ DOCKER_REGISTRY }}", dockerUrl); params.put("{{ DOCKER_USERNAME }}", "'" + harborProjectConfig.getUserName() + "'"); params.put("{{ DOCKER_PASSWORD }}", harborProjectConfig.getPassword()); params.put("{{ HARBOR_CONFIG_ID }}", harborConfigDTO.getId().toString()); params.put("{{ REPO_TYPE }}", harborConfigDTO.getType()); + params.put("{{ CHOERODON_URL }}", gatewayUrl); String ciStr = FileUtil.replaceReturnString(CI_FILE_TEMPLATE, params); StringBuilder stringBuilder = new StringBuilder(ciStr); @@ -1447,10 +1410,7 @@ public AppServiceRepVO queryByCode(Long projectId, String code) { } @Override - public Boolean checkChart(String url, @Nullable String username, @Nullable String password) { - if (!url.endsWith("/")) { - throw new CommonException("error.base.url.must.end"); - } + public Boolean checkChartOnOrganization(String url, @Nullable String username, @Nullable String password) { url = url.endsWith("/") ? url.substring(0, url.length() - 1) : url; ConfigurationProperties configurationProperties = new ConfigurationProperties(); configurationProperties.setBaseUrl(url); @@ -1491,6 +1451,58 @@ public Boolean checkChart(String url, @Nullable String username, @Nullable Strin return true; } + @Override + public CheckInfoVO checkChart(Long projectId, String url, @Nullable String username, @Nullable String password) { + CheckInfoVO checkInfoVO = new CheckInfoVO(); + url = url.endsWith("/") ? url.substring(0, url.length() - 1) : url; + URL processedUrl; + try { + processedUrl = new URL(url); + } catch (Exception e) { + checkInfoVO.setSuccess(false); + checkInfoVO.setErrMsg("helm仓库地址不正确"); + return checkInfoVO; + } + ConfigurationProperties configurationProperties = new ConfigurationProperties(); + configurationProperties.setBaseUrl(processedUrl.getProtocol() + "://" + processedUrl.getHost()); + configurationProperties.setType(CHART); + if (username != null && password != null) { + configurationProperties.setUsername(username); + configurationProperties.setPassword(password); + } + ChartClient chartClient = null; + + Response result; + try { + String[] params = processedUrl.getPath().split("/"); + if (params.length != 3) { + checkInfoVO.setSuccess(false); + checkInfoVO.setErrMsg("helm仓库地址无效,应该类似:http://localhost:8080/org1/repoa"); + return checkInfoVO; + } + Retrofit retrofit = RetrofitHandler.initRetrofit(configurationProperties, new RetrofitHandler.StringConverter()); + chartClient = retrofit.create(ChartClient.class); + Call getIndex = chartClient.getIndex(params[1], params[2]); + result = getIndex.execute(); + } catch (Exception ex) { + checkInfoVO.setSuccess(false); + checkInfoVO.setErrMsg("无法访问helm仓库:" + ex.getMessage()); + return checkInfoVO; + } + if (result != null && result.isSuccessful()) { + checkInfoVO.setSuccess(true); + return checkInfoVO; + } + if (result != null && (result.code() > 400 && result.code() < 500)) { + checkInfoVO.setSuccess(false); + checkInfoVO.setErrMsg("账号或密码不正确"); + return checkInfoVO; + } + checkInfoVO.setSuccess(false); + checkInfoVO.setErrMsg("测试连接失败"); + return checkInfoVO; + } + @Override public SonarContentsVO getSonarContent(Long projectId, Long appServiceId) { //没有使用sonarqube直接返回空对象 @@ -1506,7 +1518,7 @@ public SonarContentsVO getSonarContent(Long projectId, Long appServiceId) { //初始化sonarClient SonarClient sonarClient = RetrofitHandler.getSonarClient(sonarqubeUrl, SONAR, userName, password); - String key = String.format(SONAR_KEY, organization.getTenantNum(), projectDTO.getCode(), appServiceDTO.getCode()); + String key = String.format(SONAR_KEY, organization.getTenantNum(), projectDTO.getDevopsComponentCode(), appServiceDTO.getCode()); sonarqubeUrl = sonarqubeUrl.endsWith("/") ? sonarqubeUrl : sonarqubeUrl + "/"; //校验sonarqube地址是否正确 @@ -1851,7 +1863,7 @@ public SonarTableVO getSonarTable(Long projectId, Long appServiceId, String type ProjectDTO projectDTO = baseServiceClientOperator.queryIamProjectById(projectId); Tenant organizationDTO = baseServiceClientOperator.queryOrganizationById(projectDTO.getOrganizationId()); SonarClient sonarClient = RetrofitHandler.getSonarClient(sonarqubeUrl, SONAR, userName, password); - String key = String.format(SONAR_KEY, organizationDTO.getTenantNum(), projectDTO.getCode(), applicationDTO.getCode()); + String key = String.format(SONAR_KEY, organizationDTO.getTenantNum(), projectDTO.getDevopsComponentCode(), applicationDTO.getCode()); sonarqubeUrl = sonarqubeUrl.endsWith("/") ? sonarqubeUrl : sonarqubeUrl + "/"; Map queryMap = new HashMap<>(); queryMap.put("component", key); @@ -2144,7 +2156,7 @@ public List createAppService(Long projectId, List groupDTOS = gitlabServiceClientOperator.queryGroupWithStatisticsByName(path, TypeUtil.objToInteger(userAttrDTO.getGitlabUserId()), Boolean.TRUE); if (!CollectionUtils.isEmpty(groupDTOS)) { List projectGroups = groupDTOS.stream().filter(groupDTO -> org.apache.commons.lang3.StringUtils.equalsIgnoreCase(groupDTO.getPath(), path)).collect(toList()); @@ -2423,19 +2435,6 @@ public Boolean checkDeleteEnvApp(Long appServiceId, Long envId) { return devopsEnvApplicationService.checkCanDelete(appServiceId, envId); } - @Override - public List listByProjectIdAndGAV(Long projectId, String groupId, String artifactId) { - Assert.notNull(projectId, ResourceCheckConstant.ERROR_PROJECT_ID_IS_NULL); - Assert.notNull(groupId, ResourceCheckConstant.ERROR_APP_GROUP_ID_IS_NULL); - Assert.notNull(artifactId, ResourceCheckConstant.ERROR_APP_ARTIFACT_ID_IS_NULL); - - AppServiceDTO appServiceDTO = new AppServiceDTO(); - appServiceDTO.setProjectId(projectId); - appServiceDTO.setGroupId(groupId); - appServiceDTO.setArtifactId(artifactId); - return appServiceMapper.select(appServiceDTO); - } - private void downloadSourceCodeAndPush(AppServiceDTO appServiceDTO, UserAttrDTO userAttrDTO, AppServiceImportPayload appServiceImportPayload, String repositoryUrl, String newGroupName) { // TODO: 2021/3/3 方法待抽取 @@ -2545,7 +2544,7 @@ private void cloneAndPushCode(AppServiceDTO appServiceDTO, UserAttrDTO userAttrD String oldGroup; ProjectDTO oldProjectDTO = baseServiceClientOperator.queryIamProjectById(oldAppServiceDTO.getProjectId()); Tenant oldOrganizationDTO = baseServiceClientOperator.queryOrganizationById(oldProjectDTO.getOrganizationId()); - oldGroup = oldOrganizationDTO.getTenantNum() + "-" + oldProjectDTO.getCode(); + oldGroup = oldOrganizationDTO.getTenantNum() + "-" + oldProjectDTO.getDevopsComponentCode(); //拉取代码 // 获取push代码所需的access token String applicationDir = APPLICATION + System.currentTimeMillis(); @@ -2694,7 +2693,7 @@ public String getGitlabUrl(Long projectId, Long appServiceId) { Tenant organizationDTO = baseServiceClientOperator.queryOrganizationById(projectDTO.getOrganizationId()); String urlSlash = gitlabUrl.endsWith("/") ? "" : "/"; return gitlabUrl + urlSlash - + organizationDTO.getTenantNum() + "-" + projectDTO.getCode() + "/" + + organizationDTO.getTenantNum() + "-" + projectDTO.getDevopsComponentCode() + "/" + appServiceDTO.getCode(); } return ""; @@ -2901,7 +2900,7 @@ private List listAllAppServicesHavingVersion(Long projectId, ProjectDTO projectDTO = projectMap.get(entry.getKey()); AppServiceGroupVO appServiceGroupVO = new AppServiceGroupVO(); appServiceGroupVO.setName(projectDTO.getName()); - appServiceGroupVO.setCode(projectDTO.getCode()); + appServiceGroupVO.setCode(projectDTO.getDevopsComponentCode()); appServiceGroupVO.setId(projectDTO.getId()); appServiceGroupVO.setAppServiceList(entry.getValue()); appServiceGroupList.add(appServiceGroupVO); @@ -3109,8 +3108,8 @@ public Page listAppServiceByIds(Set ids, Boolean doPage, rep.setGitlabProjectId(TypeUtil.objToLong(app.getGitlabProjectId())); ProjectDTO project = projectDTOMap.get(rep.getProjectId()); Tenant org = orgMap.get(project.getOrganizationId()); - rep.setRepoUrl(concatRepoUrl(org.getTenantNum(), project.getCode(), rep.getCode())); - rep.setSshRepositoryUrl(GitUtil.getAppServiceSshUrl(gitlabSshUrl, org.getTenantNum(), project.getCode(), rep.getCode())); + rep.setRepoUrl(concatRepoUrl(org.getTenantNum(), project.getDevopsComponentCode(), rep.getCode())); + rep.setSshRepositoryUrl(GitUtil.getAppServiceSshUrl(gitlabSshUrl, org.getTenantNum(), project.getDevopsComponentCode(), rep.getCode())); return rep; }).collect(toList()); @@ -3280,7 +3279,7 @@ public String calculateGitlabProjectUrlWithSuffix(Long appServiceId) { ProjectDTO projectDTO = baseServiceClientOperator.queryIamProjectById(appServiceDTO.getProjectId()); Tenant tenant = baseServiceClientOperator.queryOrganizationById(projectDTO.getOrganizationId()); String repoUrl = !gitlabUrl.endsWith("/") ? gitlabUrl + "/" : gitlabUrl; - return String.format(GitOpsConstants.REPO_URL_TEMPLATE_WITHOUT_SUFFIX, repoUrl, tenant.getTenantNum(), projectDTO.getCode(), appServiceDTO.getCode()); + return String.format(GitOpsConstants.REPO_URL_TEMPLATE_WITHOUT_SUFFIX, repoUrl, tenant.getTenantNum(), projectDTO.getDevopsComponentCode(), appServiceDTO.getCode()); } /** @@ -3304,9 +3303,9 @@ private void releaseResources(File applicationWorkDir, Git repositoryGit) { private String getApplicationToken(String token, Integer projectId, Integer userId) { List variables = gitlabServiceClientOperator.listAppServiceVariable(projectId, userId); if (variables.isEmpty()) { - gitlabServiceClientOperator.createProjectVariable(projectId, "Token", token, false, userId); + gitlabServiceClientOperator.createProjectVariable(projectId, GITLAB_VARIABLE_TOKEN, token, false, userId); //添加跳过证书扫描的变量 - gitlabServiceClientOperator.createProjectVariable(projectId, "TRIVY_INSECURE", "true", false, userId); + gitlabServiceClientOperator.createProjectVariable(projectId, GITLAB_VARIABLE_TRIVY_INSECURE, "true", false, userId); return token; } else { return variables.get(0).getValue(); @@ -3433,7 +3432,7 @@ public void createAppServiceForTransfer(AppServiceTransferVO appServiceTransferV // 1. 迁移gitlab代码库 if (!oldProjectDTO.getNamespace().getId().equals(appServiceTransferVO.getGitlabGroupId())) { - GitlabProjectDTO gitlabProjectDTO = gitlabServiceClientOperator.transferProject(appServiceTransferVO.getGitlabProjectId(), + gitlabServiceClientOperator.transferProject(appServiceTransferVO.getGitlabProjectId(), appServiceTransferVO.getGitlabGroupId(), userId); } @@ -3565,11 +3564,11 @@ private void initApplicationParams(Long projectId, List applicati private void initApplicationParams(ImmutableProjectInfoVO info, AppServiceDTO appService, String urlSlash) { if (appService.getExternalConfigId() == null) { if (appService.getGitlabProjectId() != null) { - String projectCode = info.getProjCode(); + String devopsComponentCode = info.getDevopsComponentCode(); String tenantCode = info.getTenantNum(); - appService.setSshRepositoryUrl(GitUtil.getAppServiceSshUrl(gitlabSshUrl, tenantCode, projectCode, appService.getCode())); + appService.setSshRepositoryUrl(GitUtil.getAppServiceSshUrl(gitlabSshUrl, tenantCode, devopsComponentCode, appService.getCode())); appService.setRepoUrl( - gitlabUrl + urlSlash + tenantCode + "-" + projectCode + "/" + gitlabUrl + urlSlash + tenantCode + "-" + devopsComponentCode + "/" + appService.getCode() + ".git"); } } else { @@ -3676,7 +3675,7 @@ public AppServiceRepVO queryOtherProjectAppServiceWithRepositoryInfo(Long projec @Override public Page listAppServiceUnderOrg(Long projectId, Long appServiceId, String searchParam, PageRequest pageRequest) { CustomUserDetails userDetails = DetailsHelper.getUserDetails(); - ProjectDTO projectDTO = baseServiceClientOperator.queryIamProjectById(projectId, false, false, false); + ProjectDTO projectDTO = baseServiceClientOperator.queryIamProjectById(projectId, false, false, false, false, false); UserAppServiceIdsVO userAppServiceIdsVO = rducmClientOperator.getAppServiceIds(projectDTO.getOrganizationId(), userDetails.getUserId()); // 待查询的appService列表 @@ -3859,7 +3858,9 @@ public Boolean testConnection(AppExternalConfigDTO appExternalConfigDTO) { // 校验账户权限 appExternalConfigDTO.setRepositoryUrl(appExternalConfigDTO.getRepositoryUrl().replace(".git", "")); GitlabProjectDTO gitlabProjectDTO = gitlabServiceClientOperator.queryExternalProjectByCode(appExternalConfigDTO); - LOGGER.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>gitlabProjectDTO is {}<<<<<<<<<<<<<<<<<<<<<<<<<<<<", JsonHelper.marshalByJackson(gitlabProjectDTO)); + if (LOGGER.isInfoEnabled()) { + LOGGER.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>gitlabProjectDTO is {}<<<<<<<<<<<<<<<<<<<<<<<<<<<<", JsonHelper.marshalByJackson(gitlabProjectDTO)); + } if (gitlabProjectDTO == null || gitlabProjectDTO.getId() == null) { flag = false; } @@ -3878,16 +3879,15 @@ public Set listExternalAppIdByProjectId(Long projectId) { @Override public List queryAppByProjectIds(List projectIds) { if (CollectionUtils.isEmpty(projectIds)) { - return Collections.EMPTY_LIST; + return Collections.emptyList(); } - List appServiceDTOS = appServiceMapper.listByActiveAndProjects(projectIds); - return appServiceDTOS; + return appServiceMapper.listByActiveAndProjects(projectIds); } @Override public Page pageByActive(Long projectId, Long targetProjectId, Long targetAppServiceId, PageRequest pageRequest, String param) { Long userId = DetailsHelper.getUserDetails().getUserId(); - ProjectDTO projectDTO = baseServiceClientOperator.queryIamProjectById(targetProjectId, false, false, false); + ProjectDTO projectDTO = baseServiceClientOperator.queryIamProjectById(targetProjectId, false, false, false, false, false); boolean projectOwner = permissionHelper.isGitlabProjectOwnerOrGitlabAdmin(targetProjectId, userId); Page appServiceDTOPage; if (projectOwner) { @@ -3917,4 +3917,12 @@ public HarborRepoConfigDTO queryRepoConfigById(Long projectId, Long appServiceId harborRepoConfig.setType(selectedHarborConfig.getRepoType()); return harborRepoConfig; } + + @Override + public List listProjectIdsByAppIds(List appIds) { + if (ObjectUtils.isEmpty(appIds)) { + return new ArrayList<>(); + } + return appServiceMapper.listProjectIdsByAppIds(appIds); + } } diff --git a/src/main/java/io/choerodon/devops/app/service/impl/AppServiceShareResourceServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/AppServiceShareResourceServiceImpl.java index d8c1315f3e..dcfd8b8499 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/AppServiceShareResourceServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/AppServiceShareResourceServiceImpl.java @@ -1,13 +1,12 @@ package io.choerodon.devops.app.service.impl; -import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; import io.choerodon.core.exception.CommonException; import io.choerodon.devops.app.service.AppServiceShareResourceService; import io.choerodon.devops.infra.dto.AppServiceShareResourceDTO; import io.choerodon.devops.infra.mapper.AppShareResourceMapper; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; /** * Created by Sheep on 2019/7/12. @@ -34,11 +33,4 @@ public void baseDelete(Long shareId, Long projectId) { applicationShareResourceMapper.deleteByPrimaryKey(appServiceShareResourceDTO); } - @Override - public List baseListByShareId(Long shareId) { - AppServiceShareResourceDTO appServiceShareResourceDTO = new AppServiceShareResourceDTO(); - appServiceShareResourceDTO.setShareId(shareId); - return applicationShareResourceMapper.select(appServiceShareResourceDTO); - } - } diff --git a/src/main/java/io/choerodon/devops/app/service/impl/AppServiceVersionServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/AppServiceVersionServiceImpl.java index 643100d1d3..67da1c4f32 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/AppServiceVersionServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/AppServiceVersionServiceImpl.java @@ -1,6 +1,6 @@ package io.choerodon.devops.app.service.impl; -import static io.choerodon.devops.app.eventhandler.constants.HarborRepoConstants.*; +import static io.choerodon.devops.app.eventhandler.constants.HarborRepoConstants.DEFAULT_REPO; import static java.util.Comparator.comparing; import static java.util.stream.Collectors.collectingAndThen; import static java.util.stream.Collectors.toCollection; @@ -9,8 +9,8 @@ import java.io.FileInputStream; import java.io.IOException; import java.util.*; +import java.util.function.Function; import java.util.stream.Collectors; -import javax.annotation.Nullable; import com.google.gson.Gson; import org.apache.commons.lang3.StringUtils; @@ -18,11 +18,18 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Lazy; +import org.springframework.core.io.ByteArrayResource; +import org.springframework.http.*; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.web.client.HttpClientErrorException; +import org.springframework.web.client.RestClientException; +import org.springframework.web.client.RestTemplate; import org.springframework.web.multipart.MultipartFile; import io.choerodon.asgard.saga.annotation.Saga; @@ -33,6 +40,9 @@ import io.choerodon.core.exception.FeignException; import io.choerodon.core.iam.ResourceLevel; import io.choerodon.devops.api.vo.*; +import io.choerodon.devops.api.vo.appversion.AppServiceHelmVersionVO; +import io.choerodon.devops.api.vo.appversion.AppServiceImageVersionVO; +import io.choerodon.devops.api.vo.appversion.AppServiceMavenVersionVO; import io.choerodon.devops.api.vo.chart.ChartTagVO; import io.choerodon.devops.app.eventhandler.constants.SagaTopicCodeConstants; import io.choerodon.devops.app.service.*; @@ -44,13 +54,11 @@ import io.choerodon.devops.infra.dto.iam.Tenant; import io.choerodon.devops.infra.enums.ProjectConfigType; import io.choerodon.devops.infra.exception.DevopsCiInvalidException; -import io.choerodon.devops.infra.feign.RdupmClient; import io.choerodon.devops.infra.feign.operator.BaseServiceClientOperator; import io.choerodon.devops.infra.mapper.*; import io.choerodon.devops.infra.util.*; import io.choerodon.mybatis.pagehelper.PageHelper; import io.choerodon.mybatis.pagehelper.domain.PageRequest; -import io.choerodon.mybatis.pagehelper.domain.Sort; @Service public class AppServiceVersionServiceImpl implements AppServiceVersionService { @@ -71,7 +79,7 @@ public class AppServiceVersionServiceImpl implements AppServiceVersionService { private static final String CHART = "chart"; private static final String HARBOR_DEFAULT = "harbor_default"; private static final String ERROR_VERSION_INSERT = "error.version.insert"; - private static final String ERROR_VERSION_UPDATE="error.version.update"; + private static final String ERROR_VERSION_UPDATE = "error.version.update"; @Value("${services.gitlab.url}") private String gitlabUrl; @@ -83,17 +91,8 @@ public class AppServiceVersionServiceImpl implements AppServiceVersionService { @Autowired private AppServiceVersionValueService appServiceVersionValueService; @Autowired - @Lazy - private AppServiceInstanceService appServiceInstanceService; - @Autowired - private DevopsEnvironmentService devopsEnvironmentService; - @Autowired - private DevopsEnvCommandService devopsEnvCommandService; - @Autowired private DevopsGitlabCommitService devopsGitlabCommitService; @Autowired - private ChartUtil chartUtil; - @Autowired private AppServiceVersionMapper appServiceVersionMapper; @Autowired private AppServiceVersionReadmeMapper appServiceVersionReadmeMapper; @@ -106,18 +105,27 @@ public class AppServiceVersionServiceImpl implements AppServiceVersionService { @Autowired private DevopsCiPipelineChartService devopsCiPipelineChartService; @Autowired - private DevopsCiPipelineService devopsCiPipelineService; + private AppServiceShareRuleMapper appServiceShareRuleMapper; @Autowired - private RdupmClient rdupmClient; + private AppServiceInstanceMapper appServiceInstanceMapper; @Autowired - private DevopsConfigMapper devopsConfigMapper; + private CiPipelineImageService ciPipelineImageService; @Autowired - private DevopsRegistrySecretMapper devopsRegistrySecretMapper; + private AppServiceHelmVersionService appServiceHelmVersionService; @Autowired - private AppServiceShareRuleMapper appServiceShareRuleMapper; + private AppServiceImageVersionService appServiceImageVersionService; @Autowired - private AppServiceInstanceMapper appServiceInstanceMapper; + private AppServiceMavenVersionService appServiceMavenVersionService; + @Autowired + private CiPipelineMavenService ciPipelineMavenService; + @Autowired + private CiPipelineAppVersionService ciPipelineAppVersionService; + @Autowired + private DevopsHelmConfigService devopsHelmConfigService; + @Autowired + @Qualifier(value = "restTemplateForIp") + private RestTemplate restTemplate; @Autowired private TransactionalProducer producer; @@ -139,14 +147,63 @@ public void create(String image, Long gitlabPipelineId, String jobName) { try { - AppServiceVersionDTO appServiceVersionDTO = doCreate(image, - TypeUtil.objToLong(harborConfigId), - repoType, - token, - version, - commit, - files, - ref); + + AppServiceDTO appServiceDTO = appServiceMapper.queryByToken(token); + + AppServiceVersionDTO appServiceVersionDTO = saveAppVersion(version, commit, ref, gitlabPipelineId, appServiceDTO.getId()); + + ProjectDTO projectDTO = baseServiceClientOperator.queryIamProjectById(appServiceDTO.getProjectId()); + Tenant organization = baseServiceClientOperator.queryOrganizationById(projectDTO.getOrganizationId()); + + // 查询helm仓库配置id + DevopsHelmConfigDTO devopsHelmConfigDTO = devopsHelmConfigService.queryAppConfig(appServiceDTO.getId(), projectDTO.getId(), organization.getTenantId()); + + String repository; + if (ResourceLevel.PROJECT.value().equals(devopsHelmConfigDTO.getResourceType())) { + repository = devopsHelmConfigDTO.getUrl(); + } else { + repository = devopsHelmConfigDTO.getUrl().endsWith("/") ? devopsHelmConfigDTO.getUrl() + organization.getTenantNum() + "/" + projectDTO.getDevopsComponentCode() + "/" : devopsHelmConfigDTO.getUrl() + "/" + organization.getTenantNum() + "/" + projectDTO.getDevopsComponentCode() + "/"; + } + // 取commit的一部分作为文件路径 + String commitPart = commit == null ? "" : commit.substring(0, 8); + String storeFilePath = String.format(STORE_PATH_TEMPLATE, appServiceDTO.getId(), version, commitPart); + String destFilePath = String.format(DESTINATION_PATH_TEMPLATE, appServiceDTO.getId(), version, commitPart); + String path = FileUtil.multipartFileToFile(storeFilePath, files); + + uploadChart(files, devopsHelmConfigDTO, repository); + + // 解析chart包中的values文件 + String values = getValues(storeFilePath, destFilePath, path); + + AppServiceHelmVersionDTO appServiceHelmVersionDTO = appServiceHelmVersionService.queryByAppServiceVersionId(appServiceVersionDTO.getId()); + if (appServiceHelmVersionDTO == null) { + AppServiceVersionValueDTO appServiceVersionValueDTO = new AppServiceVersionValueDTO(); + appServiceVersionValueDTO.setValue(values); + appServiceVersionValueService.baseCreate(appServiceVersionValueDTO); + + AppServiceVersionReadmeDTO appServiceVersionReadmeDTO = new AppServiceVersionReadmeDTO(); + appServiceVersionReadmeDTO.setReadme(FileUtil.getReadme(destFilePath)); + appServiceVersionReadmeMapper.insert(appServiceVersionReadmeDTO); + + appServiceHelmVersionDTO = new AppServiceHelmVersionDTO(); + appServiceHelmVersionDTO.setAppServiceVersionId(appServiceVersionDTO.getId()); + appServiceHelmVersionDTO.setValueId(appServiceVersionValueDTO.getId()); + appServiceHelmVersionDTO.setReadmeValueId(appServiceVersionReadmeDTO.getId()); + appServiceHelmVersionDTO.setHarborRepoType(repoType); + appServiceHelmVersionDTO.setHarborConfigId(TypeUtil.objToLong(harborConfigId)); + appServiceHelmVersionDTO.setHelmConfigId(devopsHelmConfigDTO.getId()); + appServiceHelmVersionDTO.setRepository(repository); + appServiceHelmVersionDTO.setImage(image); + + appServiceHelmVersionService.create(appServiceHelmVersionDTO); + } else { + updateValues(appServiceHelmVersionDTO.getValueId(), values); + } + + FileUtil.deleteDirectories(destFilePath, storeFilePath); + //生成版本成功后发送webhook json + sendNotificationService.sendWhenAppServiceVersion(appServiceVersionDTO, appServiceDTO, projectDTO); + // 保存流水线chart版本信息 if (gitlabPipelineId != null && StringUtils.isNotBlank(jobName)) { Long appServiceId = appServiceVersionDTO.getAppServiceId(); @@ -170,48 +227,59 @@ public void create(String image, } - private AppServiceVersionDTO doCreate(String image, Long harborConfigId, String repoType, String token, String version, String commit, MultipartFile files, String ref) { - AppServiceDTO appServiceDTO = appServiceMapper.queryByToken(token); - - AppServiceVersionValueDTO appServiceVersionValueDTO = new AppServiceVersionValueDTO(); - AppServiceVersionDTO newVersion = new AppServiceVersionDTO(); - ProjectDTO projectDTO = baseServiceClientOperator.queryIamProjectById(appServiceDTO.getProjectId()); - Tenant organization = baseServiceClientOperator.queryOrganizationById(projectDTO.getOrganizationId()); - AppServiceVersionDTO oldVersionInDb = baseQueryByAppServiceIdAndVersion(appServiceDTO.getId(), version); - newVersion.setAppServiceId(appServiceDTO.getId()); - newVersion.setImage(image); - newVersion.setCommit(commit); - newVersion.setRef(ref); - newVersion.setVersion(version); - //根据配置id 查询仓库是自定义还是默认 -// HarborRepoDTO harborRepoDTO = rdupmClient.queryHarborRepoConfig(appServiceDTO.getProjectId(), appServiceDTO.getId()).getBody(); -// if (Objects.isNull(harborRepoDTO) -// || Objects.isNull(harborRepoDTO.getHarborRepoConfig()) -// || harborRepoDTO.getHarborRepoConfig().getRepoId().longValue() != harborConfigId) { -// throw new DevopsCiInvalidException("error.harbor.configuration.expiration"); -// } - newVersion.setHarborConfigId(harborConfigId); - newVersion.setRepoType(repoType); - - // 查询helm仓库配置id - DevopsConfigDTO devopsConfigDTO = devopsConfigService.queryRealConfig(appServiceDTO.getId(), APP_SERVICE, CHART, AUTH_TYPE_PULL); - ConfigVO helmConfig = GSON.fromJson(devopsConfigDTO.getConfig(), ConfigVO.class); - String helmUrl = helmConfig.getUrl(); - newVersion.setHelmConfigId(devopsConfigDTO.getId()); - - newVersion.setRepository(helmUrl.endsWith("/") ? helmUrl + organization.getTenantNum() + "/" + projectDTO.getCode() + "/" : helmUrl + "/" + organization.getTenantNum() + "/" + projectDTO.getCode() + "/"); - - // 取commit的一部分作为文件路径 - String commitPart = commit == null ? "" : commit.substring(0, 8); + /** + * 上传chart包到chartmuserm + * + * @param files + * @param devopsHelmConfigDTO + * @param repository + */ + private void uploadChart(MultipartFile files, DevopsHelmConfigDTO devopsHelmConfigDTO, String repository) { + MultiValueMap params = new LinkedMultiValueMap<>(); + ByteArrayResource fileAsResource = null; + try { + byte[] bytes = files.getBytes(); - String storeFilePath = String.format(STORE_PATH_TEMPLATE, appServiceDTO.getId(), version, commitPart); - String destFilePath = String.format(DESTINATION_PATH_TEMPLATE, appServiceDTO.getId(), version, commitPart); + fileAsResource = new ByteArrayResource(bytes) { + @Override + public String getFilename() { + return files.getOriginalFilename(); + } - String path = FileUtil.multipartFileToFile(storeFilePath, files); + @Override + public long contentLength() { + return files.getSize(); + } + }; + } catch (IOException e) { + e.printStackTrace(); + } + params.add("chart", fileAsResource); + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.MULTIPART_FORM_DATA); + if (devopsHelmConfigDTO.getRepoPrivate()) { + String credentials = devopsHelmConfigDTO.getUsername() + ":" + + devopsHelmConfigDTO.getPassword(); + headers.add("Authorization", "Basic " + Base64.getEncoder().encodeToString(credentials.getBytes())); + } + HttpEntity> requestEntity = new HttpEntity<>(params, headers); - // 上传chart包到 chart museum - chartUtil.uploadChart(helmUrl, organization.getTenantNum(), projectDTO.getCode(), new File(path), helmConfig.getUserName(), helmConfig.getPassword()); + ResponseEntity entity = null; + try { + entity = restTemplate.postForEntity(repository + "/api/charts", requestEntity, String.class); + if (!entity.getStatusCode().is2xxSuccessful() && !HttpStatus.CONFLICT.equals(entity.getStatusCode())) { + throw new CommonException("error.upload.chart"); + } + } catch (HttpClientErrorException e) { + if (!HttpStatus.CONFLICT.equals(e.getStatusCode())) { + throw new CommonException("error.upload.chart", e); + } + } catch (RestClientException e) { + throw new CommonException(e); + } + } + private String getValues(String storeFilePath, String destFilePath, String path) { FileUtil.unTarGZ(path, destFilePath); // 使用深度优先遍历查找文件, 避免查询到子chart的values值 @@ -236,38 +304,114 @@ private AppServiceVersionDTO doCreate(String image, Long harborConfigId, String FileUtil.deleteDirectories(storeFilePath, destFilePath); throw new CommonException("The format of the values.yaml in the chart is invalid!", e); } - - // 更新版本纪录和values纪录 - if (oldVersionInDb != null) { - // 重新上传chart包后更新values - updateValues(oldVersionInDb.getValueId(), values); - updateVersion(oldVersionInDb, newVersion); - } else { - // 新建版本时的操作 - appServiceVersionValueDTO.setValue(values); - try { - newVersion.setValueId(appServiceVersionValueService - .baseCreate(appServiceVersionValueDTO).getId()); - } catch (Exception e) { - FileUtil.deleteDirectories(storeFilePath, destFilePath); - throw new CommonException(ERROR_VERSION_INSERT, e); - } - - AppServiceVersionReadmeDTO appServiceVersionReadmeDTO = new AppServiceVersionReadmeDTO(); - appServiceVersionReadmeDTO.setReadme(FileUtil.getReadme(destFilePath)); - appServiceVersionReadmeMapper.insert(appServiceVersionReadmeDTO); - - newVersion.setReadmeValueId(appServiceVersionReadmeDTO.getId()); - newVersion = baseCreate(newVersion); - } - - - FileUtil.deleteDirectories(destFilePath, storeFilePath); - //生成版本成功后发送webhook json - sendNotificationService.sendWhenAppServiceVersion(newVersion, appServiceDTO, projectDTO); - return newVersion; + return values; } +// private AppServiceVersionDTO doCreate(String image, +// Long harborConfigId, +// String repoType, +// String token, +// String version, +// String commit, +// MultipartFile files, +// String ref) { +// AppServiceDTO appServiceDTO = appServiceMapper.queryByToken(token); +// +// AppServiceVersionValueDTO appServiceVersionValueDTO = new AppServiceVersionValueDTO(); +// AppServiceVersionDTO newVersion = new AppServiceVersionDTO(); +// ProjectDTO projectDTO = baseServiceClientOperator.queryIamProjectById(appServiceDTO.getProjectId()); +// Tenant organization = baseServiceClientOperator.queryOrganizationById(projectDTO.getOrganizationId()); +// AppServiceVersionDTO oldVersionInDb = baseQueryByAppServiceIdAndVersion(appServiceDTO.getId(), version); +// newVersion.setAppServiceId(appServiceDTO.getId()); +// newVersion.setImage(image); +// newVersion.setCommit(commit); +// newVersion.setRef(ref); +// newVersion.setVersion(version); +// //根据配置id 查询仓库是自定义还是默认 +//// HarborRepoDTO harborRepoDTO = rdupmClient.queryHarborRepoConfig(appServiceDTO.getProjectId(), appServiceDTO.getId()).getBody(); +//// if (Objects.isNull(harborRepoDTO) +//// || Objects.isNull(harborRepoDTO.getHarborRepoConfig()) +//// || harborRepoDTO.getHarborRepoConfig().getRepoId().longValue() != harborConfigId) { +//// throw new DevopsCiInvalidException("error.harbor.configuration.expiration"); +//// } +// newVersion.setHarborConfigId(harborConfigId); +// newVersion.setRepoType(repoType); +// +// // 查询helm仓库配置id +// DevopsConfigDTO devopsConfigDTO = devopsConfigService.queryRealConfig(appServiceDTO.getId(), APP_SERVICE, CHART, AUTH_TYPE_PULL); +// ConfigVO helmConfig = GSON.fromJson(devopsConfigDTO.getConfig(), ConfigVO.class); +// String helmUrl = helmConfig.getUrl(); +// newVersion.setHelmConfigId(devopsConfigDTO.getId()); +// +// newVersion.setRepository(helmUrl.endsWith("/") ? helmUrl + organization.getTenantNum() + "/" + projectDTO.getDevopsComponentCode() + "/" : helmUrl + "/" + organization.getTenantNum() + "/" + projectDTO.getDevopsComponentCode() + "/"); +// +// // 取commit的一部分作为文件路径 +// String commitPart = commit == null ? "" : commit.substring(0, 8); +// +// String storeFilePath = String.format(STORE_PATH_TEMPLATE, appServiceDTO.getId(), version, commitPart); +// String destFilePath = String.format(DESTINATION_PATH_TEMPLATE, appServiceDTO.getId(), version, commitPart); +// +// String path = FileUtil.multipartFileToFile(storeFilePath, files); +// +// // 上传chart包到 chart museum +// chartUtil.uploadChart(helmUrl, organization.getTenantNum(), projectDTO.getDevopsComponentCode(), new File(path), helmConfig.getUserName(), helmConfig.getPassword()); +// +// FileUtil.unTarGZ(path, destFilePath); +// +// // 使用深度优先遍历查找文件, 避免查询到子chart的values值 +// File valuesFile = FileUtil.queryFileFromFilesBFS(new File(destFilePath), "values.yaml"); +// +// if (valuesFile == null) { +// FileUtil.deleteDirectories(storeFilePath, destFilePath); +// throw new CommonException("error.find.values.yaml.in.chart"); +// } +// +// String values; +// try (FileInputStream fis = new FileInputStream(valuesFile)) { +// values = FileUtil.replaceReturnString(fis, null); +// } catch (IOException e) { +// FileUtil.deleteDirectories(storeFilePath, destFilePath); +// throw new CommonException(e); +// } +// +// try { +// FileUtil.checkYamlFormat(values); +// } catch (CommonException e) { +// FileUtil.deleteDirectories(storeFilePath, destFilePath); +// throw new CommonException("The format of the values.yaml in the chart is invalid!", e); +// } +// +// // 更新版本纪录和values纪录 +// if (oldVersionInDb != null) { +// // 重新上传chart包后更新values +// updateValues(oldVersionInDb.getValueId(), values); +// updateVersion(oldVersionInDb, newVersion); +// } else { +// // 新建版本时的操作 +// appServiceVersionValueDTO.setValue(values); +// try { +// newVersion.setValueId(appServiceVersionValueService +// .baseCreate(appServiceVersionValueDTO).getId()); +// } catch (Exception e) { +// FileUtil.deleteDirectories(storeFilePath, destFilePath); +// throw new CommonException(ERROR_VERSION_INSERT, e); +// } +// +// AppServiceVersionReadmeDTO appServiceVersionReadmeDTO = new AppServiceVersionReadmeDTO(); +// appServiceVersionReadmeDTO.setReadme(FileUtil.getReadme(destFilePath)); +// appServiceVersionReadmeMapper.insert(appServiceVersionReadmeDTO); +// +// newVersion.setReadmeValueId(appServiceVersionReadmeDTO.getId()); +// newVersion = baseCreate(newVersion); +// } +// +// +// FileUtil.deleteDirectories(destFilePath, storeFilePath); +// //生成版本成功后发送webhook json +// sendNotificationService.sendWhenAppServiceVersion(newVersion, appServiceDTO, projectDTO); +// return newVersion; +// } + private void updateVersion(AppServiceVersionDTO oldVersionInDb, AppServiceVersionDTO newVersion) { newVersion.setId(oldVersionInDb.getId()); newVersion.setLastUpdateDate(new Date()); @@ -332,18 +476,74 @@ public Page pageByOptions(Long projectId, Long appServiceId } } Page appServiceVersionVOS = ConvertUtils.convertPage(applicationVersionDTOPageInfo, AppServiceVersionVO.class); - // 计算应用服务版本是否可以被删除 + if (!CollectionUtils.isEmpty(appServiceVersionVOS.getContent())) { + // 计算应用服务版本是否可以被删除 caculateDelteFlag(appServiceId, appServiceVersionVOS.getContent()); + // 添加版本关联的helm、image、jar版本信息 + addVersionInfo(appServiceId, appServiceVersionVOS.getContent()); } return appServiceVersionVOS; } + /** + * 添加版本关联的helm、image、jar版本信息 + * + * @param appServiceId + * @param appServiceVersionVOList + */ + private void addVersionInfo(Long appServiceId, List appServiceVersionVOList) { + Set versionIds = appServiceVersionVOList.stream().map(AppServiceVersionVO::getId).collect(Collectors.toSet()); + + AppServiceDTO appServiceDTO = appServiceMapper.selectByPrimaryKey(appServiceId); + + // 批量查询各版本信息 + Map helmVersionMap = new HashMap<>(); + List appServiceHelmVersionVOS = appServiceHelmVersionService.listByAppVersionIds(versionIds); + if (!CollectionUtils.isEmpty(appServiceHelmVersionVOS)) { + helmVersionMap = appServiceHelmVersionVOS.stream().collect(Collectors.toMap(AppServiceHelmVersionVO::getAppServiceVersionId, Function.identity())); + } + Map imageVersionMap = new HashMap<>(); + List appServiceImageVersionVOS = appServiceImageVersionService.listByAppVersionIds(versionIds); + if (!CollectionUtils.isEmpty(appServiceImageVersionVOS)) { + imageVersionMap = appServiceImageVersionVOS.stream().collect(Collectors.toMap(AppServiceImageVersionVO::getAppServiceVersionId, Function.identity())); + } + + Map mavenVersionMap = new HashMap<>(); + List appServiceMavenVersionVOS = appServiceMavenVersionService.listByAppVersionIds(versionIds); + if (!CollectionUtils.isEmpty(appServiceMavenVersionVOS)) { + mavenVersionMap = appServiceMavenVersionVOS.stream().collect(Collectors.toMap(AppServiceMavenVersionVO::getAppServiceVersionId, Function.identity())); + } + + // 填充版本信息 + Map finalHelmVersionMap = helmVersionMap; + Map finalImageVersionMap = imageVersionMap; + Map finalMavenVersionMap = mavenVersionMap; + appServiceVersionVOList.forEach(appServiceVersionVO -> { + Long appServiceVersionId = appServiceVersionVO.getId(); + + AppServiceHelmVersionVO appServiceHelmVersionVO = finalHelmVersionMap.get(appServiceVersionId); + if (appServiceHelmVersionVO != null) { + appServiceHelmVersionVO.setChartName(appServiceDTO.getCode()); + appServiceHelmVersionVO.setVersion(appServiceVersionVO.getVersion()); + } + AppServiceImageVersionVO appServiceImageVersionVO = finalImageVersionMap.get(appServiceVersionId); + AppServiceMavenVersionVO appServiceMavenVersionVO = finalMavenVersionMap.get(appServiceVersionId); + + appServiceVersionVO.setAppServiceHelmVersionVO(appServiceHelmVersionVO); + appServiceVersionVO.setAppServiceImageVersionVO(appServiceImageVersionVO); + appServiceVersionVO.setAppServiceMavenVersionVO(appServiceMavenVersionVO); + }); + + + } + /** * 计算应用服务版本是否可以被删除 * 1. 有实例的版本不能删除 * 2. 有共享规则的版本不能删除 + * * @param appServiceId * @param content */ @@ -391,56 +591,11 @@ public List listUpgradeableAppVersion(Long projectId, L baseListUpgradeVersion(appServiceServiceId), AppServiceVersionRespVO.class); } - @Override - public DeployVersionVO queryDeployedVersions(Long appServiceId) { - AppServiceVersionDTO appServiceVersionDTO = baseQueryNewestVersion(appServiceId); - DeployVersionVO deployVersionVO = new DeployVersionVO(); - List deployEnvVersionVOS = new ArrayList<>(); - if (appServiceVersionDTO != null) { - Map> envInstances = appServiceInstanceService.baseListByAppId(appServiceId) - .stream() - .filter(applicationInstanceDTO -> applicationInstanceDTO.getCommandId() != null) - .collect(Collectors.groupingBy(AppServiceInstanceDTO::getEnvId)); - - if (!envInstances.isEmpty()) { - envInstances.forEach((key, value) -> { - DevopsEnvironmentDTO devopsEnvironmentDTO = devopsEnvironmentService.baseQueryById(key); - DeployEnvVersionVO deployEnvVersionVO = new DeployEnvVersionVO(); - deployEnvVersionVO.setEnvName(devopsEnvironmentDTO.getName()); - List deployInstanceVersionVOS = new ArrayList<>(); - Map> versionInstances = value.stream().collect(Collectors.groupingBy(t -> { - DevopsEnvCommandDTO devopsEnvCommandDTO = devopsEnvCommandService.baseQuery(t.getCommandId()); - return devopsEnvCommandDTO.getObjectVersionId(); - })); - - if (!versionInstances.isEmpty()) { - versionInstances.forEach((newKey, newValue) -> { - AppServiceVersionDTO newAppServiceVersionDTO = baseQuery(newKey); - DeployInstanceVersionVO deployInstanceVersionVO = new DeployInstanceVersionVO(); - deployInstanceVersionVO.setDeployVersion(newAppServiceVersionDTO.getVersion()); - deployInstanceVersionVO.setInstanceCount(newValue.size()); - if (newAppServiceVersionDTO.getId() < appServiceVersionDTO.getId()) { - deployInstanceVersionVO.setUpdate(true); - } - deployInstanceVersionVOS.add(deployInstanceVersionVO); - }); - } - - deployEnvVersionVO.setDeployIntanceVersionDTO(deployInstanceVersionVOS); - deployEnvVersionVOS.add(deployEnvVersionVO); - }); - - deployVersionVO.setLatestVersion(appServiceVersionDTO.getVersion()); - deployVersionVO.setDeployEnvVersionVO(deployEnvVersionVOS); - } - } - return deployVersionVO; - } - @Override public String queryVersionValue(Long appServiceServiceId) { AppServiceVersionDTO appServiceVersionDTO = baseQuery(appServiceServiceId); - return appServiceVersionValueService.baseQuery(appServiceVersionDTO.getValueId()).getValue(); + AppServiceHelmVersionDTO appServiceHelmVersionDTO = appServiceHelmVersionService.queryByAppServiceVersionId(appServiceVersionDTO.getId()); + return appServiceVersionValueService.baseQuery(appServiceHelmVersionDTO.getValueId()).getValue(); } @Override @@ -473,7 +628,7 @@ public List listByAppIdAndBranch(Long appServiceId appServiceVersionAndCommitVO.setVersion(applicationVersionDTO.getVersion()); appServiceVersionAndCommitVO.setCreateDate(applicationVersionDTO.getCreationDate()); appServiceVersionAndCommitVO.setCommitUrl(gitlabUrl + "/" - + organization.getTenantNum() + "-" + projectDTO.getCode() + "/" + + organization.getTenantNum() + "-" + projectDTO.getDevopsComponentCode() + "/" + applicationDTO.getCode() + ".git"); appServiceVersionAndCommitVOS.add(appServiceVersionAndCommitVO); @@ -552,15 +707,6 @@ private AppServiceVersionVO dtoToVo(AppServiceVersionDTO appServiceVersionDTO) { return appServiceVersionVO; } - @Override - public List baseListAppNewestVersion(Long projectId) { - ProjectDTO projectDTO = baseServiceClientOperator.queryIamProjectById(projectId); - List projectEList = baseServiceClientOperator.listIamProjectByOrgId(projectDTO.getOrganizationId()); - List projectIds = projectEList.stream().map(ProjectDTO::getId) - .collect(Collectors.toCollection(ArrayList::new)); - return appServiceVersionMapper.listAppNewestVersion(projectId, projectIds); - } - @Override public Page pageShareVersionByAppId(Long appServiceId, PageRequest pageable, String params) { Map paramMap = TypeUtil.castMapParams(params); @@ -594,7 +740,16 @@ public List baseListAppDeployedVersion(Long projectId, Lon @Override public AppServiceVersionDTO baseQuery(Long appServiceServiceId) { - return appServiceVersionMapper.selectByPrimaryKey(appServiceServiceId); + AppServiceVersionDTO appServiceVersionDTO = appServiceVersionMapper.selectByPrimaryKey(appServiceServiceId); + AppServiceHelmVersionDTO appServiceHelmVersionDTO = appServiceHelmVersionService.queryByAppServiceVersionId(appServiceVersionDTO.getId()); + appServiceVersionDTO.setValueId(appServiceHelmVersionDTO.getValueId()); + appServiceVersionDTO.setReadmeValueId(appServiceHelmVersionDTO.getReadmeValueId()); + appServiceVersionDTO.setRepository(appServiceHelmVersionDTO.getRepository()); + appServiceVersionDTO.setImage(appServiceHelmVersionDTO.getImage()); + appServiceVersionDTO.setHarborConfigId(appServiceHelmVersionDTO.getHarborConfigId()); + appServiceVersionDTO.setRepoType(appServiceHelmVersionDTO.getHarborRepoType()); + appServiceVersionDTO.setHelmConfigId(appServiceHelmVersionDTO.getHelmConfigId()); + return appServiceVersionDTO; } @Override @@ -646,11 +801,6 @@ public List baseQueryByCommitSha(Long appServiceId, String return appServiceVersionMapper.queryByCommitSha(appServiceId, ref, sha); } - @Override - public AppServiceVersionDTO baseQueryNewestVersion(Long appServiceId) { - return appServiceVersionMapper.queryNewestVersion(appServiceId); - } - @Override public List baseListByAppServiceVersionIds(List appServiceServiceIds) { return appServiceVersionMapper.listByAppServiceVersionIds(appServiceServiceIds); @@ -752,70 +902,6 @@ public void deleteByAppServiceId(Long appServiceId) { } } - private Long queryDefaultHarborId() { - DevopsConfigDTO devopsConfigDTO = new DevopsConfigDTO(); - devopsConfigDTO.setName(MiscConstants.DEFAULT_HARBOR_NAME); - return devopsConfigMapper.selectOne(devopsConfigDTO).getId(); - } - - @Override - public void fixHarbor() { - //修复appVsersion表,register_secret表 - LOGGER.info("start fix appVsersion table"); - //根据appServiceID 进行分组 - - Long defaultHarborConfigId = queryDefaultHarborId(); - - LOGGER.info("Default harbor config id is {}", defaultHarborConfigId); - - List longList = appServiceVersionMapper.selectAllAppServiceIdWithNullHarborConfig(); - LOGGER.info("Start to fix null harbor config id versions. the app-service id size is {}", longList.size()); - for (Long appServiceId : longList) { - handlerVersion(appServiceId); - } - LOGGER.info("End to fix null harbor config id versions"); - - // 修harbor config id 非null的 - LOGGER.info("Start to fix default harbor config id versions"); - appServiceVersionMapper.updateDefaultHarborRecords(defaultHarborConfigId); - LOGGER.info("Finish to fix default harbor config id versions"); - - LOGGER.info("Start to fix non default harbor config id versions"); - appServiceVersionMapper.updateCustomHarborRecords(defaultHarborConfigId); - LOGGER.info("Finish to fix non default harbor config id versions"); - - LOGGER.info("end fix appVsersion table"); - LOGGER.info("start fix register_secret"); - int count = devopsRegistrySecretMapper.selectCount(null); - int pageSize = 100; - int total = (count + pageSize - 1) / pageSize; - int pageNumber = 0; - do { - PageRequest pageable = new PageRequest(); - pageable.setPage(pageNumber); - pageable.setSize(pageSize); - pageable.setSort(new Sort("id")); - Page doPageAndSort = PageHelper.doPageAndSort(PageRequestUtil.simpleConvertSortForPage(pageable), - () -> devopsRegistrySecretMapper.selectAll()); - if (!CollectionUtils.isEmpty(doPageAndSort.getContent())) { - for (DevopsRegistrySecretDTO devopsRegistrySecretDTO : doPageAndSort) { - DevopsConfigDTO devopsConfigDTO = devopsConfigMapper.selectByPrimaryKey(devopsRegistrySecretDTO.getConfigId()); - if (!Objects.isNull(devopsConfigDTO) && HARBOR_DEFAULT.equals(devopsConfigDTO.getName())) { - devopsRegistrySecretDTO.setConfigId(null); - devopsRegistrySecretDTO.setRepoType(DEFAULT_REPO); - devopsRegistrySecretMapper.updateByPrimaryKey(devopsRegistrySecretDTO); - } else { - devopsRegistrySecretDTO.setRepoType(CUSTOM_REPO); - devopsRegistrySecretMapper.updateByPrimaryKey(devopsRegistrySecretDTO); - } - } - } - pageNumber++; - } while (pageNumber <= total); - - LOGGER.info("end fix register_secret"); - } - @Override @Transactional @Saga(code = SagaTopicCodeConstants.DEVOPS_DELETE_APPLICATION_SERVICE_VERSION, inputSchemaClass = CustomResourceVO.class, description = "批量删除应用服务版本") @@ -832,21 +918,27 @@ public void batchDelete(Long projectId, Long appServiceId, Set versionIds) versionIds.forEach(id -> { // 查询应用服务版本 AppServiceVersionDTO appServiceVersionDTO = appServiceVersionMapper.selectByPrimaryKey(id); + AppServiceHelmVersionDTO appServiceHelmVersionDTO = appServiceHelmVersionService.queryByAppServiceVersionId(appServiceVersionDTO.getId()); // 删除value - appServiceVersionValueService.baseDeleteById(appServiceVersionDTO.getValueId()); + appServiceVersionValueService.baseDeleteById(appServiceHelmVersionDTO.getValueId()); // 删除readme - appServiceVersionReadmeMapper.deleteByPrimaryKey(appServiceVersionDTO.getReadmeValueId()); + appServiceVersionReadmeMapper.deleteByPrimaryKey(appServiceHelmVersionDTO.getReadmeValueId()); // 计算删除harbor镜像列表 - if (DEFAULT_REPO.equals(appServiceVersionDTO.getRepoType())) { - HarborImageTagDTO harborImageTagDTO = caculateHarborImageTagDTO(appServiceDTO.getProjectId(), appServiceVersionDTO.getImage()); + if (DEFAULT_REPO.equals(appServiceHelmVersionDTO.getHarborRepoType())) { + HarborImageTagDTO harborImageTagDTO = caculateHarborImageTagDTO(appServiceDTO.getProjectId(), appServiceHelmVersionDTO.getImage()); deleteImagetags.add(harborImageTagDTO); } // 计算删除chart列表 - ChartTagVO chartTagVO = caculateChartTag(tenant.getTenantNum(), projectDTO.getCode(), appServiceDTO.getCode(), appServiceVersionDTO); + ChartTagVO chartTagVO = caculateChartTag(tenant.getTenantNum(), projectDTO.getDevopsComponentCode(), appServiceDTO.getCode(), appServiceVersionDTO); + chartTagVO.setTenantId(tenant.getTenantId()); + chartTagVO.setProjectId(projectDTO.getId()); deleteChartTags.add(chartTagVO); // 删除应用服务版本 + appServiceHelmVersionService.deleteByAppServiceVersionId(appServiceVersionDTO.getId()); + appServiceImageVersionService.deleteByAppServiceVersionId(appServiceVersionDTO.getId()); + appServiceMavenVersionService.deleteByAppServiceVersionId(appServiceVersionDTO.getId()); appServiceVersionMapper.deleteByPrimaryKey(appServiceVersionDTO.getId()); }); CustomResourceVO customResourceVO = new CustomResourceVO(); @@ -875,23 +967,131 @@ public AppServiceVersionDTO queryByCommitShaAndRef(Long appServiceId, String com @Override public AppServiceVersionWithHelmConfigVO queryVersionWithHelmConfig(Long projectId, Long appServiceVersionId) { - AppServiceVersionWithHelmConfigVO appServiceVersionWithHelmConfigVO = io.choerodon.core.utils.ConvertUtils.convertObject(appServiceVersionMapper.selectByPrimaryKey(appServiceVersionId), AppServiceVersionWithHelmConfigVO.class); - if (appServiceVersionWithHelmConfigVO != null) { - Long helmConfigId = appServiceVersionWithHelmConfigVO.getHelmConfigId(); + AppServiceVersionWithHelmConfigVO appServiceVersionWithHelmConfigVO = io.choerodon.core.utils.ConvertUtils.convertObject(appServiceVersionMapper.selectByAppServiceVersionId(appServiceVersionId), AppServiceVersionWithHelmConfigVO.class); + AppServiceHelmVersionDTO appServiceHelmVersionDTO = appServiceHelmVersionService.queryByAppServiceVersionId(appServiceVersionId); + if (appServiceHelmVersionDTO != null) { + Long helmConfigId = appServiceHelmVersionDTO.getHelmConfigId(); if (helmConfigId == null) { throw new FeignException("error.helm.config.id.null"); } - - DevopsConfigDTO devopsConfigDTO = devopsConfigMapper.selectByPrimaryKey(helmConfigId); - if (devopsConfigDTO == null) { + DevopsHelmConfigDTO devopsHelmConfigDTO = devopsHelmConfigService.queryById(helmConfigId); + if (devopsHelmConfigDTO == null) { throw new FeignException("error.helm.config.not.exist"); } - - appServiceVersionWithHelmConfigVO.setHelmConfig(JsonHelper.unmarshalByJackson(devopsConfigDTO.getConfig(), ConfigVO.class)); + appServiceVersionWithHelmConfigVO.setHelmConfig(new ConfigVO(devopsHelmConfigDTO.getUrl(), + devopsHelmConfigDTO.getUsername(), + devopsHelmConfigDTO.getPassword(), + devopsHelmConfigDTO.getRepoPrivate())); } return appServiceVersionWithHelmConfigVO; } + @Override + @Transactional(rollbackFor = Exception.class) + public AppServiceVersionDTO publishAppVersion(String token, String version, String commit, String ref, Long gitlabPipelineId, String jobName) { + try { + // 1. 创建应用服务版本 + AppServiceDTO appServiceDTO = appServiceMapper.queryByToken(token); + Long appServiceId = appServiceDTO.getId(); + AppServiceVersionDTO appServiceVersionDTO = saveAppVersion(version, commit, ref, gitlabPipelineId, appServiceId); + + // 2. 保存流水线任务记录信息 + if (gitlabPipelineId != null && StringUtils.isNotBlank(jobName)) { + CiPipelineAppVersionDTO ciPipelineAppVersionDTO = ciPipelineAppVersionService.queryByPipelineIdAndJobName(appServiceId, + gitlabPipelineId, + jobName); + if (ciPipelineAppVersionDTO == null) { + ciPipelineAppVersionService.baseCreate(new CiPipelineAppVersionDTO(appServiceId, + gitlabPipelineId, + jobName, + appServiceVersionDTO.getId())); + } + } + return appServiceVersionDTO; + } catch (Exception e) { + if (e instanceof CommonException) { + throw new DevopsCiInvalidException(((CommonException) e).getCode(), e, ((CommonException) e).getParameters()); + } + throw new DevopsCiInvalidException(e); + } + } + + @Transactional(rollbackFor = Exception.class) + public AppServiceVersionDTO saveAppVersion(String version, String commit, String ref, Long gitlabPipelineId, Long appServiceId) { + AppServiceVersionDTO appServiceVersionDTO = baseQueryByAppServiceIdAndVersion(appServiceId, version); + // 不存在才创建 + if (appServiceVersionDTO == null) { + appServiceVersionDTO = create(appServiceId, version, commit, ref); + } + Long appServiceVersionId = appServiceVersionDTO.getId(); + // 2. 创建helm版本 + + // 3. 创建image版本 + // 3.1 查询流水线中最新的镜像版本 + AppServiceImageVersionDTO appServiceImageVersionDTO = appServiceImageVersionService.queryByAppServiceVersionId(appServiceVersionId); + if (appServiceImageVersionDTO == null) { + CiPipelineImageDTO ciPipelineImageDTO = ciPipelineImageService.queryPipelineLatestImage(appServiceId, gitlabPipelineId); + if (ciPipelineImageDTO != null) { + appServiceImageVersionDTO = new AppServiceImageVersionDTO(); + appServiceImageVersionDTO.setAppServiceVersionId(appServiceVersionId); + appServiceImageVersionDTO.setImage(ciPipelineImageDTO.getImageTag()); + appServiceImageVersionDTO.setHarborRepoType(ciPipelineImageDTO.getRepoType()); + appServiceImageVersionDTO.setHarborConfigId(ciPipelineImageDTO.getHarborRepoId()); + appServiceImageVersionService.create(appServiceImageVersionDTO); + } + } + + // 4. 创建jar版本 + AppServiceMavenVersionDTO appServiceMavenVersionDTO = appServiceMavenVersionService.queryByAppServiceVersionId(appServiceVersionId); + if (appServiceMavenVersionDTO == null) { + CiPipelineMavenDTO ciPipelineMavenDTO = ciPipelineMavenService.queryPipelineLatestImage(appServiceId, gitlabPipelineId); + if (ciPipelineMavenDTO != null) { + appServiceMavenVersionDTO = new AppServiceMavenVersionDTO(); + appServiceMavenVersionDTO.setAppServiceVersionId(appServiceVersionId); + appServiceMavenVersionDTO.setGroupId(ciPipelineMavenDTO.getGroupId()); + appServiceMavenVersionDTO.setArtifactId(ciPipelineMavenDTO.getArtifactId()); + appServiceMavenVersionDTO.setVersion(ciPipelineMavenDTO.getVersion()); + appServiceMavenVersionDTO.setMavenRepoUrl(ciPipelineMavenDTO.getMavenRepoUrl()); + appServiceMavenVersionDTO.setUsername(ciPipelineMavenDTO.getUsername()); + appServiceMavenVersionDTO.setPassword(ciPipelineMavenDTO.getPassword()); + appServiceMavenVersionDTO.setNexusRepoId(ciPipelineMavenDTO.getNexusRepoId()); + appServiceMavenVersionService.create(appServiceMavenVersionDTO); + } + } + return appServiceVersionDTO; + } + + @Override + @Transactional + public AppServiceVersionDTO create(Long appServiceId, String version, String commit, String ref) { + AppServiceVersionDTO appServiceVersionDTO = new AppServiceVersionDTO(); + appServiceVersionDTO.setAppServiceId(appServiceId); + appServiceVersionDTO.setVersion(version); + appServiceVersionDTO.setCommit(commit); + appServiceVersionDTO.setRef(ref); + return MapperUtil.resultJudgedInsertSelective(appServiceVersionMapper, appServiceVersionDTO, "error.save.version"); + } + + @Override + public List listAllVersionsWithHelmConfig() { + return appServiceVersionMapper.listAllVersionsWithHelmConfig(); + } + + @Override + public List listAllVersionsWithHarborConfig() { + return appServiceVersionMapper.listAllVersionsWithHarborConfig(); + } + + @Override + public Integer queryCountVersionsWithHelmConfig() { + return appServiceVersionMapper.queryCountVersionsWithHelmConfig(); + } + + @Override + public Integer queryCountVersionsWithHarborConfig() { + return appServiceVersionMapper.queryCountVersionsWithHarborConfig(); + } + private Set checkVersion(Long appServiceId, Set versionIds) { Set deleteErrorVersion = new HashSet<>(); AppServiceInstanceDTO appServiceInstanceDTO = new AppServiceInstanceDTO(); @@ -963,61 +1163,4 @@ private HarborImageTagDTO caculateHarborImageTagDTO(Long projectId, String image harborImageTagDTO.setProjectId(projectId); return harborImageTagDTO; } - - @Nullable - private DevopsConfigDTO queryConfigByAppServiceId(Long appServiceId) { - DevopsConfigDTO configDTO = new DevopsConfigDTO(); - configDTO.setAppServiceId(appServiceId); - return devopsConfigMapper.selectOne(configDTO); - } - - @Nullable - private DevopsConfigDTO queryConfigByProjectId(Long projectId) { - DevopsConfigDTO configDTO = new DevopsConfigDTO(); - configDTO.setProjectId(projectId); - return devopsConfigMapper.selectOne(configDTO); - } - - @Nullable - private DevopsConfigDTO queryConfigByOrgId(Long orgId) { - DevopsConfigDTO configDTO = new DevopsConfigDTO(); - configDTO.setOrganizationId(orgId); - return devopsConfigMapper.selectOne(configDTO); - } - - private void handlerVersion(Long appServiceId) { - LOGGER.info("fix app service id is {} data", appServiceId); - DevopsConfigDTO devopsConfigDTO = queryConfigByAppServiceId(appServiceId); - if (!Objects.isNull(devopsConfigDTO)) { - //自定义仓库 ,配置和appService一样 - LOGGER.info("Custom config {} found for app-service with id {} in app service", devopsConfigDTO.getId(), appServiceId); - appServiceVersionMapper.updateNullHarborVersionToCustomType(appServiceId, devopsConfigDTO.getId()); - } else { - // 找项目的 - AppServiceDTO appServiceDTO = appServiceMapper.selectByPrimaryKey(appServiceId); - if (!Objects.isNull(appServiceDTO)) { - devopsConfigDTO = queryConfigByProjectId(appServiceDTO.getProjectId()); - if (!Objects.isNull(devopsConfigDTO)) { - //自定义仓库 ,配置和project一样 - LOGGER.info("Custom config {} found for app-service with id {} in project with id {}", devopsConfigDTO.getId(), appServiceId, appServiceDTO.getProjectId()); - appServiceVersionMapper.updateNullHarborVersionToCustomType(appServiceId, devopsConfigDTO.getId()); - } else { - ProjectDTO projectDTO = baseServiceClientOperator.queryIamProjectById(appServiceDTO.getProjectId()); - if (!Objects.isNull(projectDTO)) { - devopsConfigDTO = queryConfigByOrgId(projectDTO.getOrganizationId()); - if (!Objects.isNull(devopsConfigDTO)) { - //自定义仓库 ,配置和Org一样 - LOGGER.info("Custom config {} found for app-service with id {} in organization with id {}", devopsConfigDTO.getId(), appServiceId, projectDTO.getOrganizationId()); - appServiceVersionMapper.updateNullHarborVersionToCustomType(appServiceId, devopsConfigDTO.getId()); - } else { - //默认仓库 - LOGGER.info("No custom config Found for app-service with id {}, set to default", appServiceId); - appServiceVersionMapper.updateNullHarborVersionToDefaultType(appServiceId); - } - } - } - } - - } - } } diff --git a/src/main/java/io/choerodon/devops/app/service/impl/CertificationServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/CertificationServiceImpl.java index ae2e0152a2..bf861e3327 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/CertificationServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/CertificationServiceImpl.java @@ -132,7 +132,7 @@ public void createCertification(Long projectId, C7nCertificationCreateVO c7nCert ProjectDTO projectDTO = baseServiceClientOperator.queryIamProjectById(projectId); - String path = String.format("tmp%s%s%s%s", FILE_SEPARATOR, projectDTO.getCode(), FILE_SEPARATOR, devopsEnvironmentDTO.getCode()); + String path = String.format("tmp%s%s%s%s", FILE_SEPARATOR, projectDTO.getDevopsComponentCode(), FILE_SEPARATOR, devopsEnvironmentDTO.getCode()); String certFileName; String keyFileName; diff --git a/src/main/java/io/choerodon/devops/app/service/impl/CheckGitlabAccessLevelServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/CheckGitlabAccessLevelServiceImpl.java index 84c813eb47..bceb71d78e 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/CheckGitlabAccessLevelServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/CheckGitlabAccessLevelServiceImpl.java @@ -30,7 +30,7 @@ */ @Service public class CheckGitlabAccessLevelServiceImpl implements CheckGitlabAccessLevelService { - private final static String EMPTY_GITLAB_ACCESS_LEVEL = "error.empty.gitlab.access.level"; + private static final String EMPTY_GITLAB_ACCESS_LEVEL = "error.empty.gitlab.access.level"; @Autowired private HrdsCodeRepoClientOperator hrdsCodeRepoClientOperator; @Autowired diff --git a/src/main/java/io/choerodon/devops/app/service/impl/CiCdPipelineRecordServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/CiCdPipelineRecordServiceImpl.java index 663a13edff..13c0f67b99 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/CiCdPipelineRecordServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/CiCdPipelineRecordServiceImpl.java @@ -178,20 +178,6 @@ public CiCdPipelineRecordVO queryPipelineRecordDetails(Long projectId, Long reco return ciCdPipelineRecordVO; } - private boolean isFirstRecord(DevopsPipelineRecordRelVO devopsPipelineRecordRelVO) { - //如果为流水线的下的第一条记录则返回为null - Long pipelineId = devopsPipelineRecordRelVO.getPipelineId(); - DevopsPipelineRecordRelDTO recordRelDTO = new DevopsPipelineRecordRelDTO(); - recordRelDTO.setPipelineId(pipelineId); - List select = devopsPipelineRecordRelMapper.select(recordRelDTO); - if (select.size() == 1) { - return true; - } - List devopsPipelineRecordRelVOS = ConvertUtils.convertList(select, this::relDtoToRelVO); - CiCdPipelineUtils.recordListSort(devopsPipelineRecordRelVOS); - return devopsPipelineRecordRelVO.getId().compareTo(devopsPipelineRecordRelVOS.get(devopsPipelineRecordRelVOS.size() - 1).getId()) == 0; - } - private void fillPipelineVO(String userName, List stageRecordVOS, Date executeDate, CiCdPipelineVO ciCdPipelineVO, CiCdPipelineRecordVO ciCdPipelineRecordVO) { ciCdPipelineVO.setCreateUserName(userName); if (!CollectionUtils.isEmpty(stageRecordVOS)) { @@ -377,7 +363,7 @@ public void cancelCdPipeline(Long pipelineRecordId) { // 只有未执行、执行中的流水线可以取消执行 if (PipelineStatus.CREATED.toValue().equals(pipelineRecordDTO.getStatus())) { - cancelCreateStageAndJob(pipelineRecordId); + cancelCreateOrRunningStageAndJob(pipelineRecordId); } else if (PipelineStatus.RUNNING.toValue().equals(pipelineRecordDTO.getStatus())) { List devopsCdStageRecordDTOS = devopsCdStageRecordService.queryStageWithPipelineRecordIdAndStatus(pipelineRecordId, PipelineStatus.RUNNING.toValue()); @@ -389,10 +375,9 @@ public void cancelCdPipeline(Long pipelineRecordId) { if (JobTypeEnum.CD_AUDIT.value().equals(devopsCdJobRecordDTO.getType())) { throw new CommonException(PipelineCheckConstant.ERROR_CANCEL_AUDITING_PIPELINE); } - devopsCdStageRecordService.updateStatusById(devopsCdStageRecordDTO.getId(), PipelineStatus.CANCELED.toValue()); } } - cancelCreateStageAndJob(pipelineRecordId); + cancelCreateOrRunningStageAndJob(pipelineRecordId); } else { return; } @@ -401,12 +386,28 @@ public void cancelCdPipeline(Long pipelineRecordId) { workFlowServiceOperator.stopInstance(pipelineRecordDTO.getProjectId(), pipelineRecordDTO.getBusinessKey()); } - private void cancelCreateStageAndJob(Long pipelineRecordId) { - List devopsCdStageRecordDTOS = devopsCdStageRecordService.queryStageWithPipelineRecordIdAndStatus(pipelineRecordId, PipelineStatus.CREATED.toValue()); + private void cancelCreateOrRunningStageAndJob(Long pipelineRecordId) { + List devopsCdStageRecordDTOS = new ArrayList<>(); + List createdRecordDTOS = devopsCdStageRecordService.queryStageWithPipelineRecordIdAndStatus(pipelineRecordId, PipelineStatus.CREATED.toValue()); + List runningRecordDTOS = devopsCdStageRecordService.queryStageWithPipelineRecordIdAndStatus(pipelineRecordId, PipelineStatus.RUNNING.toValue()); + if (!CollectionUtils.isEmpty(createdRecordDTOS)) { + devopsCdStageRecordDTOS.addAll(createdRecordDTOS); + } + if (!CollectionUtils.isEmpty(runningRecordDTOS)) { + devopsCdStageRecordDTOS.addAll(runningRecordDTOS); + } if (!CollectionUtils.isEmpty(devopsCdStageRecordDTOS)) { devopsCdStageRecordDTOS.forEach(devopsCdStageRecordDTO -> { devopsCdStageRecordService.updateStatusById(devopsCdStageRecordDTO.getId(), PipelineStatus.CANCELED.toValue()); - List devopsCdJobRecordDTOS = devopsCdJobRecordService.queryJobWithStageRecordIdAndStatus(devopsCdStageRecordDTO.getId(), PipelineStatus.CREATED.toValue()); + List devopsCdJobRecordDTOS = new ArrayList<>(); + List createdJobRecordDTOS = devopsCdJobRecordService.queryJobWithStageRecordIdAndStatus(devopsCdStageRecordDTO.getId(), PipelineStatus.CREATED.toValue()); + List runningJobRecordDTOS = devopsCdJobRecordService.queryJobWithStageRecordIdAndStatus(devopsCdStageRecordDTO.getId(), PipelineStatus.RUNNING.toValue()); + if (!CollectionUtils.isEmpty(createdJobRecordDTOS)) { + devopsCdJobRecordDTOS.addAll(createdJobRecordDTOS); + } + if (!CollectionUtils.isEmpty(runningJobRecordDTOS)) { + devopsCdJobRecordDTOS.addAll(runningJobRecordDTOS); + } if (!CollectionUtils.isEmpty(devopsCdJobRecordDTOS)) { devopsCdJobRecordDTOS.forEach(devopsCdJobRecordDTO -> devopsCdJobRecordService.updateStatusById(devopsCdJobRecordDTO.getId(), PipelineStatus.CANCELED.toValue())); } diff --git a/src/main/java/io/choerodon/devops/app/service/impl/CiPipelineAppVersionServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/CiPipelineAppVersionServiceImpl.java new file mode 100644 index 0000000000..b2edbb21bd --- /dev/null +++ b/src/main/java/io/choerodon/devops/app/service/impl/CiPipelineAppVersionServiceImpl.java @@ -0,0 +1,54 @@ +package io.choerodon.devops.app.service.impl; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.Assert; + +import io.choerodon.devops.app.service.CiPipelineAppVersionService; +import io.choerodon.devops.infra.constant.ResourceCheckConstant; +import io.choerodon.devops.infra.dto.CiPipelineAppVersionDTO; +import io.choerodon.devops.infra.mapper.CiPipelineAppVersionMapper; +import io.choerodon.devops.infra.util.MapperUtil; + +/** + * 发布应用服务版本步骤生成的流水线记录信息(CiPipelineAppVersion)应用服务 + * + * @author hao.wang@zknow.com + * @since 2022-07-14 16:01:30 + */ +@Service +public class CiPipelineAppVersionServiceImpl implements CiPipelineAppVersionService { + @Autowired + private CiPipelineAppVersionMapper ciPipelineAppVersionMapper; + + @Override + public CiPipelineAppVersionDTO queryByPipelineIdAndJobName(Long appServiceId, Long gitlabPipelineId, String jobName) { + Assert.notNull(appServiceId, ResourceCheckConstant.ERROR_APP_SERVICE_ID_IS_NULL); + Assert.notNull(gitlabPipelineId, ResourceCheckConstant.ERROR_GITLAB_PIPELINE_ID_IS_NULL); + Assert.notNull(jobName, ResourceCheckConstant.ERROR_JOB_NAME_ID_IS_NULL); + + CiPipelineAppVersionDTO ciPipelineAppVersionDTO = new CiPipelineAppVersionDTO(); + ciPipelineAppVersionDTO.setAppServiceId(appServiceId); + ciPipelineAppVersionDTO.setGitlabPipelineId(gitlabPipelineId); + ciPipelineAppVersionDTO.setJobName(jobName); + + return ciPipelineAppVersionMapper.selectOne(ciPipelineAppVersionDTO); + } + + @Override + public void baseCreate(CiPipelineAppVersionDTO ciPipelineAppVersionDTO) { + MapperUtil.resultJudgedInsertSelective(ciPipelineAppVersionMapper, ciPipelineAppVersionDTO, "error.save.app.version"); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteByAppServiceId(Long appServiceId) { + Assert.notNull(appServiceId, ResourceCheckConstant.ERROR_APP_SERVICE_ID_IS_NULL); + + CiPipelineAppVersionDTO ciPipelineAppVersionDTO = new CiPipelineAppVersionDTO(); + ciPipelineAppVersionDTO.setAppServiceVersionId(appServiceId); + ciPipelineAppVersionMapper.delete(ciPipelineAppVersionDTO); + } +} + diff --git a/src/main/java/io/choerodon/devops/app/service/impl/CiPipelineImageServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/CiPipelineImageServiceImpl.java index 3c2e234f1a..61f9d7b4c9 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/CiPipelineImageServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/CiPipelineImageServiceImpl.java @@ -4,14 +4,20 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.Assert; import io.choerodon.core.exception.CommonException; import io.choerodon.devops.api.vo.CiPipelineImageVO; import io.choerodon.devops.api.vo.ImageRepoInfoVO; +import io.choerodon.devops.app.service.AppServiceImageVersionService; import io.choerodon.devops.app.service.AppServiceService; +import io.choerodon.devops.app.service.AppServiceVersionService; import io.choerodon.devops.app.service.CiPipelineImageService; import io.choerodon.devops.infra.constant.MiscConstants; +import io.choerodon.devops.infra.constant.ResourceCheckConstant; import io.choerodon.devops.infra.dto.AppServiceDTO; +import io.choerodon.devops.infra.dto.AppServiceImageVersionDTO; +import io.choerodon.devops.infra.dto.AppServiceVersionDTO; import io.choerodon.devops.infra.dto.CiPipelineImageDTO; import io.choerodon.devops.infra.dto.harbor.HarborRepoDTO; import io.choerodon.devops.infra.enums.DevopsRegistryRepoType; @@ -34,6 +40,10 @@ public class CiPipelineImageServiceImpl implements CiPipelineImageService { @Autowired private AppServiceService appServiceService; @Autowired + private AppServiceImageVersionService appServiceImageVersionService; + @Autowired + private AppServiceVersionService appServiceVersionService; + @Autowired private RdupmClientOperator rdupmClientOperator; @Transactional(rollbackFor = Exception.class) @@ -62,6 +72,27 @@ public void createOrUpdate(CiPipelineImageVO ciPipelineImageVO) { throw new CommonException("error.update.image.record"); } } + + // 如果流水线中还包含发布应用服务版本的步骤,还需要将镜像信息保存到版本记录表中 + AppServiceVersionDTO appServiceVersionDTO = appServiceVersionService.baseQueryByAppServiceIdAndVersion(appServiceId, ciPipelineImageVO.getVersion()); + if (appServiceVersionDTO != null) { + AppServiceImageVersionDTO appServiceImageVersionDTO = appServiceImageVersionService.queryByAppServiceVersionId(appServiceVersionDTO.getId()); + // 镜像版本不存在则创建,存在则更新 + if (appServiceImageVersionDTO == null) { + appServiceImageVersionDTO = new AppServiceImageVersionDTO(); + appServiceImageVersionDTO.setImage(ciPipelineImageVO.getImageTag()); + appServiceImageVersionDTO.setAppServiceVersionId(appServiceVersionDTO.getId()); + appServiceImageVersionDTO.setHarborRepoType(ciPipelineImageVO.getRepoType()); + appServiceImageVersionDTO.setHarborConfigId(ciPipelineImageVO.getHarborRepoId()); + appServiceImageVersionService.create(appServiceImageVersionDTO); + } else { + appServiceImageVersionDTO.setImage(ciPipelineImageVO.getImageTag()); + appServiceImageVersionDTO.setHarborRepoType(ciPipelineImageVO.getRepoType()); + appServiceImageVersionDTO.setHarborConfigId(ciPipelineImageVO.getHarborRepoId()); + appServiceImageVersionService.baseUpdate(appServiceImageVersionDTO); + } + } + }); } @@ -141,6 +172,24 @@ public ImageRepoInfoVO queryImageRepoInfo(String token, Long gitlabPipelineId) { return new ImageRepoInfoVO(String.valueOf(repoId), repoType, trimPrefix(dockerRegistry), groupName); } + @Override + public CiPipelineImageDTO queryPipelineLatestImage(Long appServiceId, Long gitlabPipelineId) { + Assert.notNull(appServiceId, ResourceCheckConstant.ERROR_APP_SERVICE_ID_IS_NULL); + Assert.notNull(gitlabPipelineId, ResourceCheckConstant.ERROR_GITLAB_PIPELINE_ID_IS_NULL); + + return ciPipelineImageMapper.queryPipelineLatestImage(appServiceId, gitlabPipelineId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteByAppServiceId(Long appServiceId) { + Assert.notNull(appServiceId, ResourceCheckConstant.ERROR_APP_SERVICE_ID_IS_NULL); + + CiPipelineImageDTO ciPipelineImageDTO = new CiPipelineImageDTO(); + ciPipelineImageDTO.setAppServiceId(appServiceId); + ciPipelineImageMapper.delete(ciPipelineImageDTO); + } + private String trimPrefix(String dockerRegistry) { String dockerUrl = dockerRegistry.replace("http://", "").replace("https://", ""); return dockerUrl.endsWith("/") ? dockerUrl.substring(0, dockerUrl.length() - 1) : dockerUrl; diff --git a/src/main/java/io/choerodon/devops/app/service/impl/CiPipelineMavenServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/CiPipelineMavenServiceImpl.java index 1ec35a0053..67fc6032cc 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/CiPipelineMavenServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/CiPipelineMavenServiceImpl.java @@ -14,25 +14,18 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; -import org.springframework.web.client.RestTemplate; import org.springframework.web.multipart.MultipartFile; import retrofit2.Response; import io.choerodon.core.exception.CommonException; -import io.choerodon.devops.app.service.AppServiceService; -import io.choerodon.devops.app.service.CiPipelineMavenService; -import io.choerodon.devops.app.service.DevopsCiStepService; +import io.choerodon.devops.app.service.*; import io.choerodon.devops.infra.constant.ResourceCheckConstant; -import io.choerodon.devops.infra.dto.AppServiceDTO; -import io.choerodon.devops.infra.dto.CiPipelineMavenDTO; -import io.choerodon.devops.infra.dto.DevopsCiJobDTO; -import io.choerodon.devops.infra.dto.DevopsCiStepDTO; +import io.choerodon.devops.infra.dto.*; import io.choerodon.devops.infra.dto.iam.ProjectDTO; import io.choerodon.devops.infra.dto.maven.Server; import io.choerodon.devops.infra.dto.maven.Settings; @@ -55,10 +48,10 @@ @Service public class CiPipelineMavenServiceImpl implements CiPipelineMavenService { - private final Logger logger = LoggerFactory.getLogger(getClass()); + private static final Logger logger = LoggerFactory.getLogger(CiPipelineMavenServiceImpl.class); - private final String ID = "id"; - private final String OBJECT_VERSION_NUMBER = "objectVersionNumber"; + private static final String ID = "id"; + private static final String OBJECT_VERSION_NUMBER = "objectVersionNumber"; @Autowired private CiPipelineMavenMapper ciPipelineMavenMapper; @@ -71,6 +64,10 @@ public class CiPipelineMavenServiceImpl implements CiPipelineMavenService { private DevopsCiMavenSettingsMapper devopsCiMavenSettingsMapper; @Autowired private DevopsCiJobMapper devopsCiJobMapper; + @Autowired + private AppServiceMavenVersionService appServiceMavenVersionService; + @Autowired + private AppServiceVersionService appServiceVersionService; @Autowired private RdupmClient rdupmClient; @@ -78,10 +75,6 @@ public class CiPipelineMavenServiceImpl implements CiPipelineMavenService { @Autowired private BaseServiceClientOperator baseServiceClientOperator; - @Autowired - @Qualifier(value = "restTemplateForIp") - private RestTemplate restTemplateForIp; - @Transactional(rollbackFor = Exception.class) @Override public void createOrUpdate(CiPipelineMavenDTO ciPipelineMavenDTO) { @@ -110,7 +103,8 @@ public void createOrUpdate(Long nexusRepoId, MultipartFile file, String mavenRepoUrl, String username, - String password) { + String password, + String version) { ExceptionUtil.wrapExWithCiEx(() -> { AppServiceDTO appServiceDTO = appServiceService.baseQueryByToken(Objects.requireNonNull(token)); if (appServiceDTO == null) { @@ -188,6 +182,33 @@ public void createOrUpdate(Long nexusRepoId, } } createOrUpdate(ciPipelineMavenDTO); + // 判断流水线中是否包含发布应用服务版本步骤, + AppServiceVersionDTO appServiceVersionDTO = appServiceVersionService.baseQueryByAppServiceIdAndVersion(appServiceDTO.getId(), version); + if (appServiceVersionDTO != null) { + AppServiceMavenVersionDTO appServiceMavenVersionDTO = appServiceMavenVersionService.queryByAppServiceVersionId(appServiceVersionDTO.getId()); + if (appServiceMavenVersionDTO == null) { + appServiceMavenVersionDTO = new AppServiceMavenVersionDTO(); + appServiceMavenVersionDTO.setAppServiceVersionId(appServiceVersionDTO.getId()); + appServiceMavenVersionDTO.setVersion(ciPipelineMavenDTO.getVersion()); + appServiceMavenVersionDTO.setPassword(ciPipelineMavenDTO.getPassword()); + appServiceMavenVersionDTO.setMavenRepoUrl(ciPipelineMavenDTO.getMavenRepoUrl()); + appServiceMavenVersionDTO.setUsername(ciPipelineMavenDTO.getUsername()); + appServiceMavenVersionDTO.setNexusRepoId(ciPipelineMavenDTO.getNexusRepoId()); + appServiceMavenVersionDTO.setGroupId(ciPipelineMavenDTO.getGroupId()); + appServiceMavenVersionDTO.setArtifactId(ciPipelineMavenDTO.getArtifactId()); + appServiceMavenVersionService.create(appServiceMavenVersionDTO); + } else { + appServiceMavenVersionDTO.setVersion(ciPipelineMavenDTO.getVersion()); + appServiceMavenVersionDTO.setPassword(ciPipelineMavenDTO.getPassword()); + appServiceMavenVersionDTO.setMavenRepoUrl(ciPipelineMavenDTO.getMavenRepoUrl()); + appServiceMavenVersionDTO.setUsername(ciPipelineMavenDTO.getUsername()); + appServiceMavenVersionDTO.setNexusRepoId(ciPipelineMavenDTO.getNexusRepoId()); + appServiceMavenVersionDTO.setGroupId(ciPipelineMavenDTO.getGroupId()); + appServiceMavenVersionDTO.setArtifactId(ciPipelineMavenDTO.getArtifactId()); + appServiceMavenVersionService.baseUpdate(appServiceMavenVersionDTO); + } + } + }); } @@ -212,7 +233,7 @@ private String getJarSnapshotTimestamp(String nexusUrl, String repositoryName, S return parsedVersion == null ? ciPipelineMavenDTO.getVersion() : parsedVersion; } catch (Exception ex) { if (logger.isDebugEnabled()) { - logger.debug("Ex occurred when parse JarSnapshotTimestamp for {}:{}", ciPipelineMavenDTO.getGroupId(), ciPipelineMavenDTO.getArtifactId(), ciPipelineMavenDTO.getVersion()); + logger.debug("Ex occurred when parse JarSnapshotTimestamp for {}:{}:{}", ciPipelineMavenDTO.getGroupId(), ciPipelineMavenDTO.getArtifactId(), ciPipelineMavenDTO.getVersion()); logger.debug("The ex is:", ex); } return ciPipelineMavenDTO.getVersion(); @@ -257,7 +278,7 @@ public String getCustomJarSnapshotTimestamp(String mavenRepoUrl, String userName } catch (Exception ex) { if (logger.isInfoEnabled()) { - logger.info("Ex occurred when parse JarSnapshotTimestamp for {}:{}", ciPipelineMavenDTO.getGroupId(), ciPipelineMavenDTO.getArtifactId(), ciPipelineMavenDTO.getVersion()); + logger.info("Ex occurred when parse JarSnapshotTimestamp for {}:{}:{}", ciPipelineMavenDTO.getGroupId(), ciPipelineMavenDTO.getArtifactId(), ciPipelineMavenDTO.getVersion()); logger.info("The ex is:", ex); } return ciPipelineMavenDTO.getVersion(); @@ -286,4 +307,22 @@ public CiPipelineMavenDTO queryByGitlabPipelineId(Long appServiceId, Long gitlab ciPipelineMavenDTO.setJobName(jobName); return ciPipelineMavenMapper.selectOne(ciPipelineMavenDTO); } + + @Override + public CiPipelineMavenDTO queryPipelineLatestImage(Long appServiceId, Long gitlabPipelineId) { + Assert.notNull(appServiceId, ResourceCheckConstant.ERROR_APP_SERVICE_ID_IS_NULL); + Assert.notNull(gitlabPipelineId, ResourceCheckConstant.ERROR_GITLAB_PIPELINE_ID_IS_NULL); + + return ciPipelineMavenMapper.queryPipelineLatestMaven(appServiceId, gitlabPipelineId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteByAppServiceId(Long appServiceId) { + Assert.notNull(appServiceId, ResourceCheckConstant.ERROR_APP_SERVICE_ID_IS_NULL); + + CiPipelineMavenDTO ciPipelineMavenDTO = new CiPipelineMavenDTO(); + ciPipelineMavenDTO.setAppServiceId(appServiceId); + ciPipelineMavenMapper.delete(ciPipelineMavenDTO); + } } diff --git a/src/main/java/io/choerodon/devops/app/service/impl/CiTemplateJobGroupServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/CiTemplateJobGroupServiceImpl.java index f337086013..295995962d 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/CiTemplateJobGroupServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/CiTemplateJobGroupServiceImpl.java @@ -4,15 +4,14 @@ import java.util.Comparator; import java.util.List; import java.util.Set; +import java.util.stream.Collectors; import com.google.common.base.Joiner; -import java.util.stream.Collectors; import org.apache.commons.lang3.StringUtils; import org.hzero.core.base.BaseConstants; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import io.choerodon.devops.api.vo.template.CiTemplateJobGroupVO; import io.choerodon.devops.app.service.CiTemplateJobGroupService; import io.choerodon.devops.infra.dto.CiTemplateJobGroupDTO; import io.choerodon.devops.infra.enums.CiTemplateJobGroupTypeEnum; @@ -48,8 +47,7 @@ public List listAllGroups() { @Override public List listNonEmptyGroups() { List ciTemplateJobGroupDTOS = ciTemplateJobGroupMapper.listNonEmptyGroups(); - List templateJobGroupDTOS = sortedTemplateJob(ciTemplateJobGroupDTOS); - return templateJobGroupDTOS; + return sortedTemplateJob(ciTemplateJobGroupDTOS); } private List sortedTemplateJob(List ciTemplateJobGroupDTOS) { diff --git a/src/main/java/io/choerodon/devops/app/service/impl/CiTemplateNodeJsBuildServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/CiTemplateNodeJsBuildServiceImpl.java deleted file mode 100644 index 2aeca4d3e1..0000000000 --- a/src/main/java/io/choerodon/devops/app/service/impl/CiTemplateNodeJsBuildServiceImpl.java +++ /dev/null @@ -1,16 +0,0 @@ -package io.choerodon.devops.app.service.impl; - -import org.springframework.stereotype.Service; - -import io.choerodon.devops.app.service.CiTemplateNodeJsBuildService; - -/** - * Created by wangxiang on 2021/12/20 - */ -@Service -public class CiTemplateNodeJsBuildServiceImpl implements CiTemplateNodeJsBuildService { - @Override - public void queryByStepId(Long id) { - - } -} diff --git a/src/main/java/io/choerodon/devops/app/service/impl/CiTemplateStepServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/CiTemplateStepServiceImpl.java index 45a997dbe3..1d6143c592 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/CiTemplateStepServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/CiTemplateStepServiceImpl.java @@ -4,8 +4,6 @@ import java.util.stream.Collectors; import org.apache.commons.lang3.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -14,12 +12,8 @@ import io.choerodon.devops.app.eventhandler.pipeline.step.AbstractDevopsCiStepHandler; import io.choerodon.devops.app.service.CiTemplateStepCategoryService; import io.choerodon.devops.app.service.CiTemplateStepService; -import io.choerodon.devops.infra.dto.CiTemplateJobGroupDTO; import io.choerodon.devops.infra.dto.iam.ProjectDTO; -import io.choerodon.devops.infra.enums.CiTemplateJobGroupTypeEnum; import io.choerodon.devops.infra.feign.operator.BaseServiceClientOperator; -import io.choerodon.devops.infra.mapper.CiTemplateDockerMapper; -import io.choerodon.devops.infra.mapper.CiTemplateSonarMapper; import io.choerodon.devops.infra.mapper.CiTemplateStepMapper; /** @@ -31,18 +25,10 @@ @Service public class CiTemplateStepServiceImpl implements CiTemplateStepService { - private static final Logger LOGGER = LoggerFactory.getLogger(CiTemplateStepServiceImpl.class); - @Autowired private CiTemplateStepCategoryService ciTemplateStepCategoryService; @Autowired private CiTemplateStepMapper ciTemplateStepMapper; - - @Autowired - private CiTemplateDockerMapper ciTemplateDockerMapper; - - @Autowired - private CiTemplateSonarMapper ciTemplateSonarMapper; @Autowired private BaseServiceClientOperator baseServiceClientOperator; @Autowired diff --git a/src/main/java/io/choerodon/devops/app/service/impl/ConvertC7nSecretServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/ConvertC7nSecretServiceImpl.java index 68a39b3117..06ae019cbd 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/ConvertC7nSecretServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/ConvertC7nSecretServiceImpl.java @@ -1,13 +1,13 @@ package io.choerodon.devops.app.service.impl; -import java.util.List; -import java.util.Map; - -import io.kubernetes.client.models.V1Secret; +import io.kubernetes.client.openapi.models.V1Secret; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; +import java.util.List; +import java.util.Map; + import io.choerodon.devops.app.service.DevopsEnvFileResourceService; import io.choerodon.devops.app.service.DevopsSecretService; import io.choerodon.devops.infra.dto.DevopsEnvFileResourceDTO; diff --git a/src/main/java/io/choerodon/devops/app/service/impl/ConvertPersistentVolumeServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/ConvertPersistentVolumeServiceImpl.java index 664e89a625..90fdabb9ed 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/ConvertPersistentVolumeServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/ConvertPersistentVolumeServiceImpl.java @@ -1,5 +1,16 @@ package io.choerodon.devops.app.service.impl; +import io.kubernetes.client.openapi.models.V1PersistentVolume; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; + +import java.util.List; +import java.util.Map; +import java.util.regex.Pattern; + +import static io.choerodon.devops.infra.util.GitOpsUtil.*; + import io.choerodon.core.exception.CommonException; import io.choerodon.devops.app.service.DevopsEnvFileResourceService; import io.choerodon.devops.app.service.DevopsPvService; @@ -10,16 +21,6 @@ import io.choerodon.devops.infra.enums.ResourceType; import io.choerodon.devops.infra.exception.GitOpsExplainException; import io.choerodon.devops.infra.util.TypeUtil; -import io.kubernetes.client.models.V1PersistentVolume; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.util.StringUtils; - -import java.util.List; -import java.util.Map; -import java.util.regex.Pattern; - -import static io.choerodon.devops.infra.util.GitOpsUtil.*; /** * @author zmf diff --git a/src/main/java/io/choerodon/devops/app/service/impl/ConvertV1ConfigMapServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/ConvertV1ConfigMapServiceImpl.java index b406e9cb8d..ea86de036e 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/ConvertV1ConfigMapServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/ConvertV1ConfigMapServiceImpl.java @@ -1,12 +1,12 @@ package io.choerodon.devops.app.service.impl; -import java.util.List; -import java.util.Map; - -import io.kubernetes.client.models.V1ConfigMap; +import io.kubernetes.client.openapi.models.V1ConfigMap; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import java.util.List; +import java.util.Map; + import io.choerodon.devops.app.service.DevopsConfigMapService; import io.choerodon.devops.app.service.DevopsEnvFileResourceService; import io.choerodon.devops.infra.dto.DevopsConfigMapDTO; diff --git a/src/main/java/io/choerodon/devops/app/service/impl/ConvertV1beta2DeploymentServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/ConvertV1DeploymentServiceImpl.java similarity index 95% rename from src/main/java/io/choerodon/devops/app/service/impl/ConvertV1beta2DeploymentServiceImpl.java rename to src/main/java/io/choerodon/devops/app/service/impl/ConvertV1DeploymentServiceImpl.java index 05754d7cd0..a5ac12bec5 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/ConvertV1beta2DeploymentServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/ConvertV1DeploymentServiceImpl.java @@ -19,9 +19,9 @@ import io.choerodon.devops.infra.util.TypeUtil; @Component -public class ConvertV1beta2DeploymentServiceImpl extends ConvertK8sObjectService { +public class ConvertV1DeploymentServiceImpl extends ConvertK8sObjectService { - public ConvertV1beta2DeploymentServiceImpl() { + public ConvertV1DeploymentServiceImpl() { super(DevopsDeploymentDTO.class); } @@ -37,7 +37,7 @@ public ResourceType getType() { } // @Override -// public void checkParameters(V1beta2Deployment v1beta2Deployment, Map objectPath) { +// public void checkParameters(V1Deployment v1beta2Deployment, Map objectPath) { // String filePath = objectPath.get(TypeUtil.objToString(v1beta2Deployment.hashCode())); // if (v1beta2Deployment.getMetadata() == null) { // throw new GitOpsExplainException(GitOpsObjectError.RELEASE_META_DATA_NOT_FOUND.getError(), filePath); diff --git a/src/main/java/io/choerodon/devops/app/service/impl/ConvertV1EndPointsServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/ConvertV1EndPointsServiceImpl.java index 9a5b707122..fdaa70df6d 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/ConvertV1EndPointsServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/ConvertV1EndPointsServiceImpl.java @@ -1,18 +1,18 @@ package io.choerodon.devops.app.service.impl; +import io.kubernetes.client.openapi.models.CoreV1EndpointPort; +import io.kubernetes.client.openapi.models.V1EndpointAddress; +import io.kubernetes.client.openapi.models.V1Endpoints; +import org.springframework.stereotype.Component; + import java.util.List; import java.util.Map; -import io.kubernetes.client.models.V1EndpointAddress; -import io.kubernetes.client.models.V1EndpointPort; -import io.kubernetes.client.models.V1Endpoints; -import org.springframework.stereotype.Component; - import io.choerodon.devops.infra.dto.DevopsEnvFileResourceDTO; +import io.choerodon.devops.infra.enums.GitOpsObjectError; import io.choerodon.devops.infra.enums.ResourceType; import io.choerodon.devops.infra.exception.GitOpsExplainException; import io.choerodon.devops.infra.util.TypeUtil; -import io.choerodon.devops.infra.enums.GitOpsObjectError; @Component public class ConvertV1EndPointsServiceImpl extends ConvertK8sObjectService { @@ -45,8 +45,8 @@ public void checkParameters(V1Endpoints v1Endpoints, Map objectP if (v1Endpoints.getSubsets().get(0).getPorts().isEmpty()) { throw new GitOpsExplainException(GitOpsObjectError.END_POINT_PORTS_NOT_FOUND.getError()); } else { - for (V1EndpointPort v1EndpointPort : v1Endpoints.getSubsets().get(0).getPorts()) { - if (v1EndpointPort.getPort() == null) { + for (CoreV1EndpointPort coreV1EndpointPort : v1Endpoints.getSubsets().get(0).getPorts()) { + if (coreV1EndpointPort.getPort() == null) { throw new GitOpsExplainException(GitOpsObjectError.END_POINT_ADDRESS_IP_NOT_FOUND.getError()); } } diff --git a/src/main/java/io/choerodon/devops/app/service/impl/ConvertV1beta1IngressServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/ConvertV1IngressServiceImpl.java similarity index 71% rename from src/main/java/io/choerodon/devops/app/service/impl/ConvertV1beta1IngressServiceImpl.java rename to src/main/java/io/choerodon/devops/app/service/impl/ConvertV1IngressServiceImpl.java index b0acc15f0f..2483fd647c 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/ConvertV1beta1IngressServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/ConvertV1IngressServiceImpl.java @@ -1,14 +1,14 @@ package io.choerodon.devops.app.service.impl; -import java.util.List; -import java.util.Map; - -import io.kubernetes.client.models.V1beta1HTTPIngressPath; -import io.kubernetes.client.models.V1beta1Ingress; -import io.kubernetes.client.models.V1beta1IngressRule; +import io.kubernetes.client.openapi.models.V1HTTPIngressPath; +import io.kubernetes.client.openapi.models.V1Ingress; +import io.kubernetes.client.openapi.models.V1IngressRule; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import java.util.List; +import java.util.Map; + import io.choerodon.devops.api.validator.DevopsIngressValidator; import io.choerodon.devops.app.service.DevopsEnvFileResourceService; import io.choerodon.devops.app.service.DevopsIngressService; @@ -20,18 +20,18 @@ import io.choerodon.devops.infra.util.TypeUtil; @Component -public class ConvertV1beta1IngressServiceImpl extends ConvertK8sObjectService { +public class ConvertV1IngressServiceImpl extends ConvertK8sObjectService { @Autowired private DevopsIngressService devopsIngressService; @Autowired private DevopsEnvFileResourceService devopsEnvFileResourceService; - public ConvertV1beta1IngressServiceImpl() { - super(V1beta1Ingress.class); + public ConvertV1IngressServiceImpl() { + super(V1Ingress.class); } @Override - public void checkIfExist(List v1beta1Ingresses, Long envId, List beforeSyncDelete, Map objectPath, V1beta1Ingress v1beta1Ingress) { + public void checkIfExist(List v1beta1Ingresses, Long envId, List beforeSyncDelete, Map objectPath, V1Ingress v1beta1Ingress) { String filePath = objectPath.get(TypeUtil.objToString(v1beta1Ingress.hashCode())); DevopsIngressDTO devopsIngressDTO = devopsIngressService.baseCheckByEnvAndName(envId, v1beta1Ingress.getMetadata().getName()); if (devopsIngressDTO != null @@ -56,7 +56,7 @@ public ResourceType getType() { } @Override - public void checkParameters(V1beta1Ingress v1beta1Ingress, Map objectPath) { + public void checkParameters(V1Ingress v1beta1Ingress, Map objectPath) { String filePath = objectPath.get(TypeUtil.objToString(v1beta1Ingress.hashCode())); if (v1beta1Ingress.getMetadata() == null) { throw new GitOpsExplainException(GitOpsObjectError.INGRESS_META_DATA_NOT_FOUND.getError(), filePath); @@ -68,7 +68,7 @@ public void checkParameters(V1beta1Ingress v1beta1Ingress, Map o if (v1beta1Ingress.getSpec() == null) { throw new GitOpsExplainException(GitOpsObjectError.INGRESS_SPEC_NOT_FOUND.getError(), filePath); } else { - checkV1beta1IngressRules(v1beta1Ingress, filePath); + checkV1IngressRules(v1beta1Ingress, filePath); } if (v1beta1Ingress.getApiVersion() == null) { throw new GitOpsExplainException(GitOpsObjectError.INGRESS_API_VERSION_NOT_FOUND.getError(), filePath); @@ -79,30 +79,30 @@ public void checkParameters(V1beta1Ingress v1beta1Ingress, Map o } - private void checkV1beta1IngressRules(V1beta1Ingress v1beta1Ingress, String filePath) { - List v1beta1IngressRules = v1beta1Ingress.getSpec().getRules(); + private void checkV1IngressRules(V1Ingress v1beta1Ingress, String filePath) { + List v1beta1IngressRules = v1beta1Ingress.getSpec().getRules(); if (v1beta1IngressRules.isEmpty()) { throw new GitOpsExplainException(GitOpsObjectError.INGRESS_RULES_NOT_FOUND.getError(), filePath); } else { - for (V1beta1IngressRule v1beta1IngressRule : v1beta1IngressRules) { + for (V1IngressRule v1beta1IngressRule : v1beta1IngressRules) { if (v1beta1IngressRule.getHost() == null) { throw new GitOpsExplainException(GitOpsObjectError.INGRESS_RULE_HOST_NOT_FOUND.getError(), filePath); } if (v1beta1IngressRule.getHttp() == null) { throw new GitOpsExplainException(GitOpsObjectError.INGRESS_RULE_HTTP_NOT_FOUND.getError(), filePath); } else { - checkV1beta1HTTPIngressPaths(v1beta1IngressRule, filePath); + checkV1HTTPIngressPaths(v1beta1IngressRule, filePath); } } } } - private void checkV1beta1HTTPIngressPaths(V1beta1IngressRule v1beta1IngressRule, String filePath) { - List v1beta1HTTPIngressPaths = v1beta1IngressRule.getHttp().getPaths(); - if (v1beta1HTTPIngressPaths.isEmpty()) { + private void checkV1HTTPIngressPaths(V1IngressRule v1beta1IngressRule, String filePath) { + List v1HTTPIngressPaths = v1beta1IngressRule.getHttp().getPaths(); + if (v1HTTPIngressPaths.isEmpty()) { throw new GitOpsExplainException(GitOpsObjectError.INGRESS_PATHS_NOT_FOUND.getError(), filePath); } else { - for (V1beta1HTTPIngressPath v1beta1HTTPIngressPath : v1beta1HTTPIngressPaths) { + for (V1HTTPIngressPath v1beta1HTTPIngressPath : v1HTTPIngressPaths) { if (v1beta1HTTPIngressPath.getPath() == null) { throw new GitOpsExplainException(GitOpsObjectError.INGRESS_PATHS_PATH_NOT_FOUND.getError(), filePath); } @@ -115,12 +115,13 @@ private void checkV1beta1HTTPIngressPaths(V1beta1IngressRule v1beta1IngressRule, } } - private void checkBackend(V1beta1HTTPIngressPath v1beta1HTTPIngressPath, String filePath) { - if (v1beta1HTTPIngressPath.getBackend().getServiceName() == null) { - throw new GitOpsExplainException(GitOpsObjectError.INGRESS_BACKEND_SERVICE_NAME_NOT_FOUND.getError(), filePath); - } - if (v1beta1HTTPIngressPath.getBackend().getServicePort() == null) { - throw new GitOpsExplainException(GitOpsObjectError.INGRESS_BACKEND_SERVICE_PORT_NOT_FOUND.getError(), filePath); - } + private void checkBackend(V1HTTPIngressPath v1beta1HTTPIngressPath, String filePath) { + // TODO 兼容旧版本 +// if (v1beta1HTTPIngressPath.getBackend().getServiceName() == null) { +// throw new GitOpsExplainException(GitOpsObjectError.INGRESS_BACKEND_SERVICE_NAME_NOT_FOUND.getError(), filePath); +// } +// if (v1beta1HTTPIngressPath.getBackend().getServicePort() == null) { +// throw new GitOpsExplainException(GitOpsObjectError.INGRESS_BACKEND_SERVICE_PORT_NOT_FOUND.getError(), filePath); +// } } } \ No newline at end of file diff --git a/src/main/java/io/choerodon/devops/app/service/impl/ConvertV1PersistentVolumeClaimServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/ConvertV1PersistentVolumeClaimServiceImpl.java index 59df5f4b2d..099c8ca003 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/ConvertV1PersistentVolumeClaimServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/ConvertV1PersistentVolumeClaimServiceImpl.java @@ -1,14 +1,14 @@ package io.choerodon.devops.app.service.impl; -import static io.choerodon.devops.infra.util.GitOpsUtil.*; +import io.kubernetes.client.openapi.models.V1PersistentVolumeClaim; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; import java.util.List; import java.util.Map; -import io.kubernetes.client.models.V1PersistentVolumeClaim; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.util.CollectionUtils; +import static io.choerodon.devops.infra.util.GitOpsUtil.*; import io.choerodon.devops.app.service.DevopsEnvFileResourceService; import io.choerodon.devops.app.service.DevopsPvcService; diff --git a/src/main/java/io/choerodon/devops/app/service/impl/ConvertV1ServiceServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/ConvertV1ServiceServiceImpl.java index fddc0ca7de..5549e04dcb 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/ConvertV1ServiceServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/ConvertV1ServiceServiceImpl.java @@ -1,16 +1,16 @@ package io.choerodon.devops.app.service.impl; -import java.util.List; -import java.util.Map; - -import io.kubernetes.client.models.V1Service; -import io.kubernetes.client.models.V1ServicePort; +import io.kubernetes.client.openapi.models.V1Service; +import io.kubernetes.client.openapi.models.V1ServicePort; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; +import java.util.List; +import java.util.Map; + import io.choerodon.devops.app.service.DevopsEnvFileResourceService; import io.choerodon.devops.app.service.DevopsServiceService; import io.choerodon.devops.infra.constant.GitOpsConstants; diff --git a/src/main/java/io/choerodon/devops/app/service/impl/ConvertV1beta2StatefulSetServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/ConvertV1StatefulSetServiceImpl.java similarity index 96% rename from src/main/java/io/choerodon/devops/app/service/impl/ConvertV1beta2StatefulSetServiceImpl.java rename to src/main/java/io/choerodon/devops/app/service/impl/ConvertV1StatefulSetServiceImpl.java index a77a5f0fcc..441eac45fc 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/ConvertV1beta2StatefulSetServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/ConvertV1StatefulSetServiceImpl.java @@ -19,9 +19,9 @@ import io.choerodon.devops.infra.util.TypeUtil; @Component -public class ConvertV1beta2StatefulSetServiceImpl extends ConvertK8sObjectService { +public class ConvertV1StatefulSetServiceImpl extends ConvertK8sObjectService { - public ConvertV1beta2StatefulSetServiceImpl() { + public ConvertV1StatefulSetServiceImpl() { super(DevopsStatefulSetDTO.class); } diff --git a/src/main/java/io/choerodon/devops/app/service/impl/DeployDetailServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/DeployDetailServiceImpl.java deleted file mode 100644 index 2b570cec08..0000000000 --- a/src/main/java/io/choerodon/devops/app/service/impl/DeployDetailServiceImpl.java +++ /dev/null @@ -1,33 +0,0 @@ -package io.choerodon.devops.app.service.impl; - -import java.util.List; -import java.util.stream.Collectors; - -import io.choerodon.devops.api.vo.DevopsEnvPodVO; -import io.choerodon.devops.app.service.DeployDetailService; -import io.choerodon.devops.infra.dto.DevopsEnvPodDTO; -import io.choerodon.devops.infra.mapper.DevopsEnvPodMapper; -import org.springframework.beans.BeanUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -/** - * Creator: Runge - * Date: 2018/4/17 - * Time: 14:40 - * Description: - */ -@Component -public class DeployDetailServiceImpl implements DeployDetailService { - @Autowired - private DevopsEnvPodMapper devopsEnvPodMapper; - - @Override - public List baseQueryPods(Long instanceId) { - return devopsEnvPodMapper.select(new DevopsEnvPodDTO(instanceId)).stream().map(pod -> { - DevopsEnvPodVO devopsEnvPodVO = new DevopsEnvPodVO(); - BeanUtils.copyProperties(pod, devopsEnvPodVO); - return devopsEnvPodVO; - }).collect(Collectors.toList()); - } -} diff --git a/src/main/java/io/choerodon/devops/app/service/impl/DevopsAppServiceHelmRelServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/DevopsAppServiceHelmRelServiceImpl.java new file mode 100644 index 0000000000..76bf077877 --- /dev/null +++ b/src/main/java/io/choerodon/devops/app/service/impl/DevopsAppServiceHelmRelServiceImpl.java @@ -0,0 +1,44 @@ +package io.choerodon.devops.app.service.impl; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import io.choerodon.devops.app.service.DevopsAppServiceHelmRelService; +import io.choerodon.devops.infra.dto.DevopsAppServiceHelmRelDTO; +import io.choerodon.devops.infra.mapper.DevopsAppServiceHelmRelMapper; +import io.choerodon.devops.infra.util.MapperUtil; + +@Service +public class DevopsAppServiceHelmRelServiceImpl implements DevopsAppServiceHelmRelService { + @Autowired + private DevopsAppServiceHelmRelMapper devopsAppServiceHelmRelMapper; + + + @Override + public void handleRel(Long appServiceId, Long helmConfigId) { + deleteRelationByServiceId(appServiceId); + if (helmConfigId != null) { + createRel(appServiceId, helmConfigId); + } + } + + @Override + public void deleteRelationByServiceId(Long appServiceId) { + DevopsAppServiceHelmRelDTO devopsAppServiceHelmRelDTO = new DevopsAppServiceHelmRelDTO(); + devopsAppServiceHelmRelDTO.setAppServiceId(appServiceId); + devopsAppServiceHelmRelMapper.delete(devopsAppServiceHelmRelDTO); + } + + @Override + public void createRel(Long appServiceId, Long helmConfigId) { + DevopsAppServiceHelmRelDTO devopsAppServiceHelmRelDTO = new DevopsAppServiceHelmRelDTO(); + devopsAppServiceHelmRelDTO.setAppServiceId(appServiceId); + devopsAppServiceHelmRelDTO.setHelmConfigId(helmConfigId); + MapperUtil.resultJudgedInsertSelective(devopsAppServiceHelmRelMapper, devopsAppServiceHelmRelDTO, "error.app.service.helm.config.rel.insert"); + } + + @Override + public DevopsAppServiceHelmRelDTO queryByAppServiceId(Long appServiceId) { + return devopsAppServiceHelmRelMapper.queryByAppServiceId(appServiceId); + } +} diff --git a/src/main/java/io/choerodon/devops/app/service/impl/DevopsBranchServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/DevopsBranchServiceImpl.java index a615180344..073ddf36f0 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/DevopsBranchServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/DevopsBranchServiceImpl.java @@ -224,11 +224,11 @@ public List listByCommitIs(List commitIds) { @Override public List listDeletedBranchIds(Set branchIds) { - if (CollectionUtils.isEmpty(branchIds)){ + if (CollectionUtils.isEmpty(branchIds)) { return new ArrayList<>(); } List existBranchIds = devopsBranchMapper.listExistBranchIds(branchIds); - return branchIds.stream().filter(id->!existBranchIds.contains(id)).collect(Collectors.toList()); + return branchIds.stream().filter(id -> !existBranchIds.contains(id)).collect(Collectors.toList()); } @Override @@ -238,4 +238,17 @@ public List listByIds(List branchIds) { } return new ArrayList<>(); } + + @Override + public Boolean checkIssueBranchRelExist(Long projectId, Long issueId) { + return devopsIssueRelMapper.checkIssueBranchRelExist(DevopsIssueRelObjectTypeEnum.BRANCH.getValue(), projectId, issueId); + } + + @Override + public void copyIssueBranchRel(Long projectId, Long oldIssueId, Long newIssueId) { + Set devopsIssueRelDTOS = devopsIssueRelService.listRelationByIssueIdAndObjectType(DevopsIssueRelObjectTypeEnum.BRANCH.getValue(), oldIssueId); + devopsIssueRelDTOS.forEach(devopsIssueRelDTO -> { + devopsIssueRelService.addRelation(DevopsIssueRelObjectTypeEnum.BRANCH.getValue(), devopsIssueRelDTO.getBranchId(), devopsIssueRelDTO.getBranchId(), devopsIssueRelDTO.getProjectId(), devopsIssueRelDTO.getAppServiceCode(), newIssueId); + }); + } } diff --git a/src/main/java/io/choerodon/devops/app/service/impl/DevopsCdApiTestInfoServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/DevopsCdApiTestInfoServiceImpl.java index 6b2a52c487..ac4661e93e 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/DevopsCdApiTestInfoServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/DevopsCdApiTestInfoServiceImpl.java @@ -31,5 +31,10 @@ public void baseCreate(DevopsCdApiTestInfoDTO devopsCdApiTestInfoDTO) { public DevopsCdApiTestInfoDTO queryById(Long deployInfoId) { return devopsCdApiTestInfoMapper.selectByPrimaryKey(deployInfoId); } + + @Override + public Boolean doesApiTestSuiteRelatedWithPipeline(Long suiteId) { + return devopsCdApiTestInfoMapper.doesApiTestSuiteRelatedWithPipeline(suiteId); + } } diff --git a/src/main/java/io/choerodon/devops/app/service/impl/DevopsCdAuditRecordServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/DevopsCdAuditRecordServiceImpl.java index 3f7da04461..b5b17eb846 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/DevopsCdAuditRecordServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/DevopsCdAuditRecordServiceImpl.java @@ -1,9 +1,11 @@ package io.choerodon.devops.app.service.impl; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.stream.Collectors; -import org.apache.commons.lang3.StringUtils; import org.hzero.boot.message.entity.Receiver; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; @@ -18,14 +20,15 @@ import io.choerodon.devops.infra.constant.MessageCodeConstants; import io.choerodon.devops.infra.constant.PipelineCheckConstant; import io.choerodon.devops.infra.constant.ResourceCheckConstant; -import io.choerodon.devops.infra.dto.CiCdPipelineDTO; import io.choerodon.devops.infra.dto.DevopsCdAuditRecordDTO; import io.choerodon.devops.infra.dto.DevopsCdJobRecordDTO; import io.choerodon.devops.infra.dto.DevopsPipelineRecordRelDTO; import io.choerodon.devops.infra.dto.iam.IamUserDTO; -import io.choerodon.devops.infra.dto.iam.ProjectDTO; import io.choerodon.devops.infra.feign.operator.BaseServiceClientOperator; -import io.choerodon.devops.infra.mapper.*; +import io.choerodon.devops.infra.mapper.DevopsCdAuditRecordMapper; +import io.choerodon.devops.infra.mapper.DevopsCdJobRecordMapper; +import io.choerodon.devops.infra.mapper.DevopsCiCdPipelineMapper; +import io.choerodon.devops.infra.mapper.DevopsPipelineRecordRelMapper; import io.choerodon.devops.infra.util.KeyDecryptHelper; /** @@ -129,16 +132,4 @@ public DevopsCdAuditRecordDTO queryByJobRecordIdAndUserId(Long jobRecordId, Long devopsCdAuditRecordDTO.setUserId(userId); return devopsCdAuditRecordMapper.selectOne(devopsCdAuditRecordDTO); } - - @Override - public void fixProjectId() { - List devopsCdAuditDTOS = devopsCdAuditRecordMapper.selectAll(); - Set jobRecordIds = devopsCdAuditDTOS.stream().filter(i -> i.getJobRecordId() != null).map(DevopsCdAuditRecordDTO::getJobRecordId).collect(Collectors.toSet()); - - List devopsCdJobRecordDTOS = devopsCdJobRecordMapper.selectByIds(StringUtils.join(jobRecordIds, ",")); - - devopsCdJobRecordDTOS.forEach(i -> { - devopsCdAuditRecordMapper.updateProjectIdByJobRecordId(i.getProjectId(), i.getId()); - }); - } } diff --git a/src/main/java/io/choerodon/devops/app/service/impl/DevopsCdAuditServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/DevopsCdAuditServiceImpl.java index b58474f3c4..22b2a827f0 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/DevopsCdAuditServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/DevopsCdAuditServiceImpl.java @@ -1,19 +1,14 @@ package io.choerodon.devops.app.service.impl; import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; -import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import org.springframework.util.CollectionUtils; import io.choerodon.core.exception.CommonException; import io.choerodon.devops.app.service.DevopsCdAuditService; import io.choerodon.devops.infra.dto.DevopsCdAuditDTO; -import io.choerodon.devops.infra.dto.DevopsCdJobDTO; import io.choerodon.devops.infra.mapper.DevopsCdAuditMapper; import io.choerodon.devops.infra.mapper.DevopsCdJobMapper; import io.choerodon.devops.infra.mapper.DevopsCdStageMapper; @@ -42,15 +37,4 @@ public List baseListByOptions(Long pipelineId, Long stageId, L DevopsCdAuditDTO devopsCdAuditDTO = new DevopsCdAuditDTO(pipelineId, stageId, taskId); return devopsCdAuditMapper.select(devopsCdAuditDTO); } - - @Override - public void fixProjectId() { - List devopsCdAuditDTOS = devopsCdAuditMapper.selectAll(); - Set cdJobIds = devopsCdAuditDTOS.stream().filter(i -> i.getCdJobId() != null).map(DevopsCdAuditDTO::getCdJobId).collect(Collectors.toSet()); - - if (!CollectionUtils.isEmpty(cdJobIds)) { - List devopsCdJobDTOS = devopsCdJobMapper.selectByIds(StringUtils.join(cdJobIds, ",")); - devopsCdJobDTOS.forEach(i -> devopsCdAuditMapper.updateProjectIdByJobId(i.getProjectId(), i.getId())); - } - } } \ No newline at end of file diff --git a/src/main/java/io/choerodon/devops/app/service/impl/DevopsCdEnvDeployInfoServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/DevopsCdEnvDeployInfoServiceImpl.java index 026c0b51d5..dd2d266adb 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/DevopsCdEnvDeployInfoServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/DevopsCdEnvDeployInfoServiceImpl.java @@ -22,10 +22,8 @@ @Service public class DevopsCdEnvDeployInfoServiceImpl implements DevopsCdEnvDeployInfoService { - private static final String ERROR_APP_SVC_ID_IS_NULL = "error.app.svc.id.is.null"; private static final String ERROR_ENV_ID_IS_NULL = "error.env.id.is.null"; private static final String ERROR_VALUE_ID_IS_NULL = "error.value.id.is.null"; - private static final String ERROR_PARAM_IS_INVALID = "error.param.is.invalid"; private static final String ERROR_DEPLOY_INFO_ID_IS_NULL = "error.deploy.info.id.is.null"; private static final String ERROR_SAVE_DEPLOY_INFO = "error.save.deploy.info"; diff --git a/src/main/java/io/choerodon/devops/app/service/impl/DevopsCdJobServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/DevopsCdJobServiceImpl.java index 1b46b037dd..6960391460 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/DevopsCdJobServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/DevopsCdJobServiceImpl.java @@ -1,7 +1,6 @@ package io.choerodon.devops.app.service.impl; import java.util.ArrayList; -import java.util.HashSet; import java.util.List; import java.util.Set; @@ -13,13 +12,10 @@ import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; -import io.choerodon.asgard.saga.annotation.SagaTask; import io.choerodon.core.exception.CommonException; import io.choerodon.devops.api.vo.CdApiTestConfigForSagaVO; import io.choerodon.devops.api.vo.CdApiTestConfigVO; import io.choerodon.devops.api.vo.DevopsCdJobVO; -import io.choerodon.devops.app.eventhandler.constants.SagaTaskCodeConstants; -import io.choerodon.devops.app.eventhandler.constants.SagaTopicCodeConstants; import io.choerodon.devops.app.service.DevopsCdJobService; import io.choerodon.devops.infra.constant.PipelineCheckConstant; import io.choerodon.devops.infra.constant.ResourceCheckConstant; @@ -146,41 +142,4 @@ public List listCdApiTestConfig() { } return cdApiTestConfigForSagaVOArrayList; } - - @SagaTask(sagaCode = SagaTopicCodeConstants.REPAIR_API_TEST_TASK_FROM_CD, - code = SagaTaskCodeConstants.DEVOPS_REPAIR_API_TEST_TASK_FROM_CD, - seq = 10, - maxRetryCount = 3) - @Override - public void taskRepairCdJobRecordData(String payload) { - List cdApiTestConfigForSagaVOList = JsonHelper.unmarshalByJackson(payload, new com.fasterxml.jackson.core.type.TypeReference>() { - }); - repairCdJobRecordData(cdApiTestConfigForSagaVOList); - } - - private void repairCdJobRecordData(List cdApiTestConfigForSagaVOList) { - if (!CollectionUtils.isEmpty(cdApiTestConfigForSagaVOList)) { - LOGGER.info(">>>>>>>>>>> start fix devops_cd_job from pipeline cd api test <<<<<<<<<<<<<<<<<<<<"); - //记录处理失败的devopsCdJobId - Set errorSet = new HashSet<>(); - cdApiTestConfigForSagaVOList.forEach(cdApiTestConfigForSagaVO -> { - DevopsCdJobDTO devopsCdJobDTO = devopsCdJobMapper.selectByPrimaryKey(cdApiTestConfigForSagaVO.getDevopsCdJobId()); - try { - CdApiTestConfigVO cdApiTestConfigVO = JsonHelper.unmarshalByJackson(devopsCdJobDTO.getMetadata(), CdApiTestConfigVO.class); - cdApiTestConfigVO.setApiTestConfigId(cdApiTestConfigForSagaVO.getApiTestConfigId()); - devopsCdJobDTO.setMetadata(JsonHelper.marshalByJackson(cdApiTestConfigVO)); - devopsCdJobMapper.updateByPrimaryKeySelective(devopsCdJobDTO); - } catch (Exception e) { - errorSet.add(devopsCdJobDTO.getId()); - LOGGER.info(">>>>>>>>>>> update to devops_cd_job failed! devopsCdJobId: {} <<<<<<<<<<<<<<<<<<<<", devopsCdJobDTO.getId()); - } - }); - if (CollectionUtils.isEmpty(errorSet)) { - LOGGER.info(">>>>>>>>>>> end fix devops_cd_job <<<<<<<<<<<<<<<<<<<<"); - } else { - errorSet.forEach(error -> LOGGER.info(">>>>>>>>>>> end fix devops_cd_job, but exist error. failed devopsCdJobId is: {} <<<<<<<<<<<<<<<<<<<<", error)); - } - LOGGER.info(">>>>>>>>>>> end fix devops_cd_job from pipeline cd api test <<<<<<<<<<<<<<<<<<<<"); - } - } } diff --git a/src/main/java/io/choerodon/devops/app/service/impl/DevopsCdPipelineRecordServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/DevopsCdPipelineRecordServiceImpl.java index 2e83b7ba04..19042ab065 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/DevopsCdPipelineRecordServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/DevopsCdPipelineRecordServiceImpl.java @@ -35,7 +35,6 @@ import sun.misc.BASE64Decoder; import io.choerodon.core.convertor.ApplicationContextHelper; -import io.choerodon.core.domain.Page; import io.choerodon.core.exception.CommonException; import io.choerodon.core.oauth.DetailsHelper; import io.choerodon.devops.api.vo.*; @@ -71,8 +70,6 @@ import io.choerodon.devops.infra.handler.HostConnectionHandler; import io.choerodon.devops.infra.mapper.*; import io.choerodon.devops.infra.util.*; -import io.choerodon.mybatis.pagehelper.PageHelper; -import io.choerodon.mybatis.pagehelper.domain.PageRequest; /** * 〈功能简述〉 @@ -372,6 +369,10 @@ private String getJarName(String url) { public void cdHostDeploy(Long pipelineRecordId, Long cdStageRecordId, Long cdJobRecordId) { HostDeployPayload hostDeployPayload = new HostDeployPayload(pipelineRecordId, cdStageRecordId, cdJobRecordId); DevopsCdPipelineRecordDTO pipelineRecordDTO = devopsCdPipelineRecordMapper.selectByPrimaryKey(pipelineRecordId); + + if (PipelineStatus.CANCELED.toValue().equals(pipelineRecordDTO.getStatus())) { + return; + } CustomContextUtil.setUserContext(pipelineRecordDTO.getCreatedBy()); DevopsCdJobRecordDTO jobRecordDTO = devopsCdJobRecordMapper.selectByPrimaryKey(hostDeployPayload.getJobRecordId()); @@ -799,7 +800,6 @@ public void pipelineDeployImage(Long pipelineRecordId, Long cdStageRecordId, Lon String deployObjectName = null; String image = null; Long appServiceId = null; - String serviceName = null; String repoName = null; Long repoId = null; String userName = null; @@ -1193,36 +1193,6 @@ public void update(DevopsCdPipelineRecordDTO devopsCdPipelineRecordDTO) { } } - @Override - public Page pagingCdPipelineRecord(Long projectId, Long pipelineId, PageRequest pageable) { - Page pipelineRecordInfo = PageHelper.doPageAndSort(PageRequestUtil.simpleConvertSortForPage(pageable), - () -> devopsCdPipelineRecordMapper.listByCiPipelineId(pipelineId)); - List pipelineRecordVOList = pipelineRecordInfo.getContent(); - if (CollectionUtils.isEmpty(pipelineRecordVOList)) { - return pipelineRecordInfo; - } - pipelineRecordVOList.forEach(devopsCdPipelineRecordVO -> { - List devopsCdStageRecordDTOS = devopsCdStageRecordService.queryByPipelineRecordId(devopsCdPipelineRecordVO.getId()); - if (!CollectionUtils.isEmpty(devopsCdStageRecordDTOS)) { - //封装审核数据 - List devopsCdStageRecordVOS = ConvertUtils.convertList(devopsCdStageRecordDTOS, DevopsCdStageRecordVO.class); - for (DevopsCdStageRecordVO devopsCdStageRecordVO : devopsCdStageRecordVOS) { - //计算satge耗时 - if (!CollectionUtils.isEmpty(devopsCdStageRecordVO.getJobRecordVOList())) { - Long seconds = devopsCdStageRecordVO.getJobRecordVOList().stream().filter(devopsCdJobRecordVO -> !Objects.isNull(devopsCdJobRecordVO.getDurationSeconds())).map(DevopsCdJobRecordVO::getDurationSeconds).reduce((aLong, aLong2) -> aLong + aLong2).get(); - devopsCdStageRecordVO.setDurationSeconds(seconds); - } - } - // 计算流水线当前停留的审核节点 - addAuditStateInfo(devopsCdPipelineRecordVO); - devopsCdPipelineRecordVO.setDevopsCdStageRecordVOS(devopsCdStageRecordVOS); - } else { - devopsCdPipelineRecordVO.setDevopsCdStageRecordVOS(Collections.emptyList()); - } - }); - return pipelineRecordInfo; - } - private void addAuditStateInfo(DevopsCdPipelineRecordVO devopsCdPipelineRecordVO) { DevopsCdPipelineDeatilVO devopsCdPipelineDeatilVO = new DevopsCdPipelineDeatilVO(); List devopsCdStageRecordDTOS = devopsCdStageRecordService.queryStageWithPipelineRecordIdAndStatus(devopsCdPipelineRecordVO.getId(), PipelineStatus.NOT_AUDIT.toValue()); diff --git a/src/main/java/io/choerodon/devops/app/service/impl/DevopsCdPipelineServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/DevopsCdPipelineServiceImpl.java index b35f29b987..27a2b69f52 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/DevopsCdPipelineServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/DevopsCdPipelineServiceImpl.java @@ -471,6 +471,9 @@ public void envAutoDeploy(Long pipelineRecordId, Long stageRecordId, Long jobRec StringBuilder log = new StringBuilder(); DevopsCdPipelineRecordDTO devopsCdPipelineRecordDTO = devopsCdPipelineRecordService.queryById(pipelineRecordId); DevopsCdJobRecordDTO devopsCdJobRecordDTO = devopsCdJobRecordService.queryById(jobRecordId); + if (PipelineStatus.CANCELED.toValue().equals(devopsCdJobRecordDTO.getStatus())) { + return; + } if (LOGGER.isInfoEnabled()) { LOGGER.info(">>>>>>>>>>>>>>>>>>>>>>Begin envAutoDeploy,devopsCdJobRecordDTO: {}<<<<<<<<<<<<<<<<<<<<<", JsonHelper.marshalByJackson(devopsCdJobRecordDTO)); } @@ -512,7 +515,7 @@ public void pipelineDeploy(Long pipelineRecordId, Long stageRecordId, Long jobRe log.append("Start pipeline auto deploy task.").append(System.lineSeparator()); // 获取数据 DevopsCdJobRecordDTO devopsCdJobRecordDTO = devopsCdJobRecordService.queryById(jobRecordId); - DevopsCdJobDTO devopsCdJobDTO = devopsCdJobService.queryById(devopsCdJobRecordDTO.getJobId()); + devopsCdJobService.queryById(devopsCdJobRecordDTO.getJobId()); DevopsCdEnvDeployInfoDTO devopsCdEnvDeployInfoDTO = devopsCdEnvDeployInfoService.queryById(devopsCdJobRecordDTO.getDeployInfoId()); Date startDate = new Date(); Long commandId = null; @@ -521,7 +524,6 @@ public void pipelineDeploy(Long pipelineRecordId, Long stageRecordId, Long jobRe // 设置用户上下文 log.append("Pipeline trigger user id is :").append(devopsCdJobRecordDTO.getCreatedBy()).append(System.lineSeparator()); CustomContextUtil.setUserContext(devopsCdJobRecordDTO.getCreatedBy()); -// DevopsDeployInfoVO devopsDeployInfoVO = JsonHelper.unmarshalByJackson(devopsCdJobRecordDTO.getMetadata(), DevopsDeployInfoVO.class); // 1. 校验环境是否开启一键关闭自动部署 if (Boolean.FALSE.equals(checkEnvEnableAutoDeploy(devopsCdJobRecordDTO, devopsCdEnvDeployInfoDTO, log))) { @@ -622,8 +624,8 @@ public void pipelineDeploy(Long pipelineRecordId, Long stageRecordId, Long jobRe devopsCdEnvDeployInfoDTO.getAppCode(), devopsDeployAppCenterEnvDTO.getObjectId(), CommandType.UPDATE.getType(), - devopsCdEnvDeployInfoDTO.getAppName(), - devopsCdEnvDeployInfoDTO.getAppCode()); + null, + null); appServiceDeployVO.setInstanceId(devopsDeployAppCenterEnvDTO.getObjectId()); AppServiceInstanceVO appServiceInstanceVO = appServiceInstanceService.createOrUpdate(devopsCdJobRecordDTO.getProjectId(), appServiceDeployVO, true); commandId = appServiceInstanceVO.getCommandId(); @@ -830,6 +832,12 @@ public void setAppDeployStatus(Long pipelineRecordId, Long stageRecordId, Long j LOGGER.info(">>>>>>>>>>>>>>>>>>>>>>> Userdetails is {}", DetailsHelper.getUserDetails()); DevopsCdPipelineRecordDTO devopsCdPipelineRecordDTO = devopsCdPipelineRecordService.queryById(pipelineRecordId); CustomContextUtil.setUserContext(devopsCdPipelineRecordDTO.getCreatedBy()); + // 流水线取消执行则不更新相关状态 + if (PipelineStatus.CANCELED.toValue().equals(devopsCdPipelineRecordDTO.getStatus())) { + LOGGER.info("Pipeline instance has canceled:pipelineRecordId: {} stageRecordId: {} taskId: {}, status: {}", pipelineRecordId, stageRecordId, jobRecordId, status); + return; + } + if (Boolean.TRUE.equals(status) && PipelineStatus.RUNNING.toValue().equals(devopsCdPipelineRecordDTO.getStatus())) { LOGGER.info(">>>>>>> setAppDeployStatus, start next task, pipelineStatus is :{}<<<<<<<<<<<", devopsCdPipelineRecordDTO.getStatus()); @@ -1203,12 +1211,16 @@ public void initPipelineRecordWithStageAndJob(Long projectId, Long gitlabPipelin @Transactional public void executeApiTestTask(Long pipelineRecordId, Long stageRecordId, Long jobRecordId) { DevopsCdJobRecordDTO devopsCdJobRecordDTO = devopsCdJobRecordService.queryById(jobRecordId); + if (PipelineStatus.CANCELED.toValue().equals(devopsCdJobRecordDTO.getStatus())) { + return; + } LOGGER.info(">>>>>>>>>>>>>>>>>>> Execute api test task. pipelineRecordId : {}, stageRecordId : {} ,jobRecordId : {} <<<<<<<<<<<<<<<<<<<<", pipelineRecordId, stageRecordId, jobRecordId); if (!JobTypeEnum.CD_API_TEST.value().equals(devopsCdJobRecordDTO.getType())) { throw new CommonException("error.invalid.job.type"); } DevopsCdApiTestInfoDTO devopsCdApiTestInfoDTO = devopsCdApiTestInfoService.queryById(devopsCdJobRecordDTO.getDeployInfoId()); + ApiTestTaskRecordDTO taskRecordDTO; // 更新记录状态为执行中 @@ -1260,8 +1272,6 @@ public String getDeployStatus(Long pipelineRecordId, String deployJobName) { // 查询实例 AppServiceInstanceDTO instanceE = appServiceInstanceService.baseQuery(devopsDeployAppCenterEnvDTO.getObjectId()); - // 查询部署版本 - AppServiceVersionDTO appServiceVersionDTO = appServiceVersionService.queryByCommitShaAndRef(instanceE.getAppServiceId(), devopsCdPipelineRecordDTO.getCommitSha(), devopsCdPipelineRecordDTO.getRef()); // 查询当前实例运行时pod metadata List podResourceDetailsDTOS = devopsEnvPodService.queryResourceDetailsByInstanceId(instanceE.getId()); @@ -1278,6 +1288,9 @@ public String getDeployStatus(Long pipelineRecordId, String deployJobName) { @Transactional public void executeExternalApprovalTask(Long pipelineRecordId, Long stageRecordId, Long jobRecordId) { DevopsCdJobRecordDTO devopsCdJobRecordDTO = devopsCdJobRecordService.queryById(jobRecordId); + if (PipelineStatus.CANCELED.toValue().equals(devopsCdJobRecordDTO.getStatus())) { + return; + } String callbackToken = UUIDUtils.generateUUID(); // 添加回调token devopsCdJobRecordDTO.setCallbackToken(callbackToken); @@ -1504,6 +1517,10 @@ public void handleApiTestSuiteCompleteEvent(ApiTestCompleteEventVO apiTestComple DevopsCdPipelineRecordDTO devopsCdPipelineRecordDTO = devopsCdPipelineRecordService.queryById(devopsCdStageRecordDTO.getPipelineRecordId()); DevopsPipelineRecordRelDTO devopsPipelineRecordRelDTO = devopsPipelineRecordRelService.queryByCdPipelineRecordId(devopsCdPipelineRecordDTO.getId()); + // 取消状态下的流水线不再更新状态 + if (PipelineStatus.CANCELED.toValue().equals(devopsCdPipelineRecordDTO.getStatus())) { + return; + } // 流水线状态 // 失败: // 1. API测试任务执行失败 diff --git a/src/main/java/io/choerodon/devops/app/service/impl/DevopsCdValuesServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/DevopsCdValuesServiceImpl.java deleted file mode 100644 index 206d0f727a..0000000000 --- a/src/main/java/io/choerodon/devops/app/service/impl/DevopsCdValuesServiceImpl.java +++ /dev/null @@ -1,8 +0,0 @@ -package io.choerodon.devops.app.service.impl; - -import org.springframework.stereotype.Service; - -import io.choerodon.devops.app.service.DevopsCdValuesService; -@Service -public class DevopsCdValuesServiceImpl implements DevopsCdValuesService { -} diff --git a/src/main/java/io/choerodon/devops/app/service/impl/DevopsCheckLogServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/DevopsCheckLogServiceImpl.java index 05ee0bf3e1..4c0930f2cc 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/DevopsCheckLogServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/DevopsCheckLogServiceImpl.java @@ -1,29 +1,42 @@ package io.choerodon.devops.app.service.impl; +import static io.choerodon.devops.infra.constant.MiscConstants.DEFAULT_CHART_NAME; + +import java.net.URL; import java.util.*; +import java.util.function.Function; import java.util.stream.Collectors; import com.alibaba.fastjson.JSONObject; +import com.fasterxml.jackson.core.type.TypeReference; import com.google.common.base.Joiner; +import jdk.nashorn.internal.runtime.regexp.joni.encoding.IntHolder; import org.apache.commons.collections4.ListUtils; import org.hzero.core.base.BaseConstants; +import org.hzero.mybatis.BatchInsertHelper; import org.hzero.mybatis.domian.Condition; import org.hzero.mybatis.util.Sqls; import org.jetbrains.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; +import org.springframework.util.ObjectUtils; +import io.choerodon.core.domain.Page; +import io.choerodon.core.iam.ResourceLevel; import io.choerodon.devops.api.vo.*; import io.choerodon.devops.api.vo.pipeline.WarningSettingVO; import io.choerodon.devops.app.eventhandler.pipeline.step.AbstractDevopsCiStepHandler; import io.choerodon.devops.app.service.*; import io.choerodon.devops.infra.dto.*; import io.choerodon.devops.infra.dto.iam.ProjectDTO; +import io.choerodon.devops.infra.dto.iam.Tenant; import io.choerodon.devops.infra.enums.*; import io.choerodon.devops.infra.enums.deploy.DeployTypeEnum; import io.choerodon.devops.infra.enums.deploy.RdupmTypeEnum; @@ -33,6 +46,8 @@ import io.choerodon.devops.infra.mapper.*; import io.choerodon.devops.infra.util.ConvertUtils; import io.choerodon.devops.infra.util.JsonHelper; +import io.choerodon.mybatis.pagehelper.PageHelper; +import io.choerodon.mybatis.pagehelper.domain.PageRequest; @Service @@ -41,6 +56,9 @@ public class DevopsCheckLogServiceImpl implements DevopsCheckLogService { public static final String FIX_APP_CENTER_DATA = "fixAppCenterData"; public static final String FIX_PIPELINE_DATA = "fixPipelineData"; + public static final String FIX_HELM_REPO_DATA = "fixHelmRepoData"; + public static final String FIX_HELM_VERSION_DATA = "fixHelmVersionData"; + public static final String FIX_IMAGE_VERSION_DATA = "fixImageVersionData"; public static final String FIX_PIPELINE_MAVEN_PUBLISH_DATA = "fixPipelineMavenPublishData"; private static final String PIPELINE_CONTENT_FIX = "pipelineContentFix"; @@ -89,9 +107,29 @@ public class DevopsCheckLogServiceImpl implements DevopsCheckLogService { private CiTemplateJobStepRelMapper ciTemplateJobStepRelMapper; @Autowired private CiTemplateJobMapper ciTemplateJobMapper; - + @Autowired + private DevopsHelmConfigService devopsHelmConfigService; + @Autowired + private DevopsConfigService devopsConfigService; + @Autowired + private AppServiceService devopsAppService; + @Autowired + private AppServiceVersionService appServiceVersionService; + @Autowired + @Qualifier("devopsHelmConfigHelper") + private BatchInsertHelper devopsHelmConfigDTOBatchInsertHelper; + @Autowired + @Qualifier("appServiceHelmConfigHelper") + private BatchInsertHelper appServiceHelmRelDTOBatchInsertHelper; + @Autowired + private AppServiceImageVersionService appServiceImageVersionService; + @Autowired + private AppServiceHelmVersionService appServiceHelmVersionService; + @Autowired + private AppServiceHelmRelService appServiceHelmRelService; @Override + @Transactional(rollbackFor = Exception.class) public void checkLog(String task) { DevopsCheckLogDTO devopsCheckLogDTO = new DevopsCheckLogDTO(); devopsCheckLogDTO.setLog(task); @@ -117,6 +155,15 @@ public void checkLog(String task) { case FIX_PIPELINE_MAVEN_PUBLISH_DATA: pipelineDataMavenPublishFix(); break; + case FIX_HELM_REPO_DATA: + fixHelmRepoDate(); + break; + case FIX_HELM_VERSION_DATA: + fixHelmVersionData(); + break; + case FIX_IMAGE_VERSION_DATA: + fixImageVersionData(); + break; default: LOGGER.info("version not matched"); return; @@ -126,6 +173,254 @@ public void checkLog(String task) { devopsCheckLogMapper.insert(devopsCheckLogDTO); } + private void fixImageVersionData() { + int count = appServiceVersionService.queryCountVersionsWithHarborConfig(); + int pageSize = 500; + int total = (count + pageSize - 1) / pageSize; + int pageNumber = 0; + LOGGER.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>start fix app version image record >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>!"); + do { + LOGGER.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>app version image record {}/{} >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>!", pageNumber, total); + PageRequest pageRequest = new PageRequest(); + pageRequest.setPage(pageNumber); + pageRequest.setSize(pageSize); + List appServiceImageVersionDTOS = new ArrayList<>(); + + Page appServiceVersionDTOPage = PageHelper.doPage(pageRequest, () -> appServiceVersionService.listAllVersionsWithHarborConfig()); + appServiceVersionDTOPage.getContent().forEach(v -> { + AppServiceImageVersionDTO appServiceImageVersionDTO = new AppServiceImageVersionDTO(); + appServiceImageVersionDTO.setAppServiceVersionId(v.getId()); + appServiceImageVersionDTO.setHarborRepoType(v.getRepoType()); + appServiceImageVersionDTO.setHarborConfigId(v.getHarborConfigId()); + appServiceImageVersionDTO.setImage(v.getImage()); + appServiceImageVersionDTOS.add(appServiceImageVersionDTO); + }); + if (!CollectionUtils.isEmpty(appServiceImageVersionDTOS)) { + appServiceImageVersionService.batchInsertInNewTrans(appServiceImageVersionDTOS); + } + pageNumber++; + } while (pageNumber <= total); + LOGGER.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>end fix app version image record >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>!"); + + } + + private void fixHelmVersionData() { + // 应用服务版本与helm仓库关联关系 + // 数量非常大,需要分页操作 + int count = appServiceVersionService.queryCountVersionsWithHelmConfig(); + int pageSize = 500; + int total = (count + pageSize - 1) / pageSize; + int pageNumber = 0; + LOGGER.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>end fix app version helm config >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>!"); + do { + LOGGER.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>app version helm config {}/{} >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>!", pageNumber, total); + PageRequest pageRequest = new PageRequest(); + pageRequest.setPage(pageNumber); + pageRequest.setSize(pageSize); + List appServiceHelmVersionDTOToInsert = new ArrayList<>(); + + Page appServiceVersionDTOPage = PageHelper.doPage(pageRequest, () -> appServiceVersionService.listAllVersionsWithHelmConfig()); + appServiceVersionDTOPage.getContent().forEach(v -> { + AppServiceHelmVersionDTO appServiceHelmVersionDTO = new AppServiceHelmVersionDTO(); + appServiceHelmVersionDTO.setAppServiceVersionId(v.getId()); + appServiceHelmVersionDTO.setHelmConfigId(v.getHelmConfigId()); + appServiceHelmVersionDTO.setHarborRepoType(v.getRepoType()); + appServiceHelmVersionDTO.setHarborConfigId(v.getHarborConfigId()); + appServiceHelmVersionDTO.setValueId(v.getValueId()); + appServiceHelmVersionDTO.setReadmeValueId(v.getReadmeValueId()); + appServiceHelmVersionDTO.setImage(v.getImage()); + appServiceHelmVersionDTO.setRepository(v.getRepository()); + if (appServiceHelmVersionDTO.getValueId() == null + || appServiceHelmVersionDTO.getReadmeValueId() == null + || appServiceHelmVersionDTO.getImage() == null + || appServiceHelmVersionDTO.getRepository() == null) { + LOGGER.error(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> fix app service version failed, version info is {} <<<<<<<<<<<<<<<<<<<", + JsonHelper.marshalByJackson(appServiceHelmVersionDTO)); + } else { + appServiceHelmVersionDTOToInsert.add(appServiceHelmVersionDTO); + } + + }); + if (!CollectionUtils.isEmpty(appServiceHelmVersionDTOToInsert)) { + appServiceHelmVersionService.batchInsertInNewTrans(appServiceHelmVersionDTOToInsert); + } + pageNumber++; + } while (pageNumber <= total); + LOGGER.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>end fix app version helm config >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>!"); + } + + private void fixHelmRepoDate() { + fixHelmConfig(); + } + + private void fixHelmConfig() { + LOGGER.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>start fix helm config >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>!"); + + Set projectIds = new HashSet<>(); + + List devopsConfigDTOS = devopsConfigService.listAllChart(); + + List platformHelmConfig = devopsConfigDTOS.stream().filter(c -> c.getProjectId() == null && c.getAppServiceId() == null && c.getOrganizationId() == null).collect(Collectors.toList()); + List organizationHelmConfig = devopsConfigDTOS.stream().filter(c -> c.getOrganizationId() != null).collect(Collectors.toList()); + List projectHelmConfig = devopsConfigDTOS.stream().filter(c -> c.getProjectId() != null).collect(Collectors.toList()); + projectIds.addAll(projectHelmConfig.stream().map(DevopsConfigDTO::getProjectId).collect(Collectors.toSet())); + List appHelmConfig = devopsConfigDTOS.stream().filter(c -> c.getAppServiceId() != null).collect(Collectors.toList()); + List appIds = appHelmConfig.stream().map(DevopsConfigDTO::getAppServiceId).collect(Collectors.toList()); + + projectIds.addAll(devopsAppService.listProjectIdsByAppIds(appIds)); + + List appServiceDTOList = devopsAppService.baseListByIds(new HashSet<>(appIds)); + Map appServiceDTOMap = appServiceDTOList.stream().collect(Collectors.toMap(AppServiceDTO::getId, Function.identity())); + + List projectDTOS = baseServiceClientOperator.queryProjectsByIds(projectIds); + Map projectDTOMap = projectDTOS.stream().collect(Collectors.toMap(ProjectDTO::getId, Function.identity())); + + + Set organizationIds = projectDTOS.stream().map(ProjectDTO::getOrganizationId).collect(Collectors.toSet()); + List tenants = baseServiceClientOperator.listOrganizationByIds(organizationIds); + Map tenantMap = tenants.stream().collect(Collectors.toMap(Tenant::getTenantId, Function.identity())); + + + List devopsHelmConfigDTOToInsert = new ArrayList<>(); + List appServiceHelmRelDTOToInsert = new ArrayList<>(); + + // 平台层 + platformHelmConfig.forEach(c -> { + DevopsHelmConfigDTO devopsHelmConfigDTO = new DevopsHelmConfigDTO(); + devopsHelmConfigDTO.setId(c.getId()); + devopsHelmConfigDTO.setName(UUID.randomUUID().toString()); + if (DEFAULT_CHART_NAME.equals(c.getName())) { + devopsHelmConfigDTO.setRepoDefault(true); + } + Map helmConfig = JsonHelper.unmarshalByJackson(c.getConfig(), new TypeReference>() { + }); + devopsHelmConfigDTO.setUrl(helmConfig.get("url")); + devopsHelmConfigDTO.setUsername(helmConfig.get("userName")); + devopsHelmConfigDTO.setPassword(helmConfig.get("password")); + devopsHelmConfigDTO.setRepoPrivate(Boolean.parseBoolean(helmConfig.get("isPrivate"))); + devopsHelmConfigDTO.setRepoDefault(false); + devopsHelmConfigDTO.setResourceId(0L); + devopsHelmConfigDTO.setResourceType(ResourceLevel.SITE.value()); + devopsHelmConfigDTOToInsert.add(devopsHelmConfigDTO); + }); + // 组织层 + organizationHelmConfig.forEach(c -> { + DevopsHelmConfigDTO devopsHelmConfigDTO = new DevopsHelmConfigDTO(); + devopsHelmConfigDTO.setId(c.getId()); + devopsHelmConfigDTO.setName(UUID.randomUUID().toString()); + Map helmConfig = JsonHelper.unmarshalByJackson(c.getConfig(), new TypeReference>() { + }); + devopsHelmConfigDTO.setUrl(helmConfig.get("url")); + devopsHelmConfigDTO.setUsername(helmConfig.get("userName")); + devopsHelmConfigDTO.setPassword(helmConfig.get("password")); + devopsHelmConfigDTO.setRepoPrivate(Boolean.parseBoolean(helmConfig.get("isPrivate"))); + devopsHelmConfigDTO.setResourceId(c.getOrganizationId()); + devopsHelmConfigDTO.setRepoDefault(false); + devopsHelmConfigDTO.setResourceType(ResourceLevel.ORGANIZATION.value()); + devopsHelmConfigDTOToInsert.add(devopsHelmConfigDTO); + }); + // 项目id为key + Map indexMap = new HashMap<>(); + // 项目层 + projectHelmConfig.forEach(c -> { + ProjectDTO projectDTO = projectDTOMap.get(c.getProjectId()); + if (projectDTO == null) { + LOGGER.info("skip current config.id:{}", c.getId()); + return; + } + Tenant tenant = tenantMap.get(projectDTO.getOrganizationId()); + if (tenant == null) { + LOGGER.info("skip current config.id:{}", c.getId()); + return; + } + + IntHolder index = indexMap.get(c.getProjectId()); + if (index == null) { + index = new IntHolder(); + index.value = 1; + indexMap.put(c.getProjectId(), index); + } + DevopsHelmConfigDTO devopsHelmConfigDTO = new DevopsHelmConfigDTO(); + devopsHelmConfigDTO.setId(c.getId()); + devopsHelmConfigDTO.setName(String.format("自定义Helm仓库-%s", index.value)); + Map helmConfig = JsonHelper.unmarshalByJackson(c.getConfig(), new TypeReference>() { + }); + URL processedUrl = null; + try { + processedUrl = new URL(helmConfig.get("url")); + } catch (Exception e) { + LOGGER.warn("current config:{} errorMsg:{}", c.getConfig(), e.getMessage()); + } + devopsHelmConfigDTO.setUrl(String.format("%s://%s/%s/%s", processedUrl.getProtocol(), processedUrl.getHost(), tenant.getTenantNum(), projectDTO.getCode())); + devopsHelmConfigDTO.setUsername(helmConfig.get("userName")); + devopsHelmConfigDTO.setPassword(helmConfig.get("password")); + devopsHelmConfigDTO.setRepoPrivate(Boolean.parseBoolean(helmConfig.get("isPrivate"))); + devopsHelmConfigDTO.setRepoDefault(false); + devopsHelmConfigDTO.setResourceId(c.getProjectId()); + devopsHelmConfigDTO.setResourceType(ResourceLevel.PROJECT.value()); + index.value++; + devopsHelmConfigDTOToInsert.add(devopsHelmConfigDTO); + }); + + // 应用层 + appHelmConfig.forEach(c -> { + AppServiceDTO appServiceDTO = appServiceDTOMap.get(c.getAppServiceId()); + ProjectDTO projectDTO = projectDTOMap.get(appServiceDTO.getProjectId()); + if (projectDTO == null) { + LOGGER.info("skip current config.id:{}", c.getId()); + return; + } + Tenant tenant = tenantMap.get(projectDTO.getOrganizationId()); + if (tenant == null) { + LOGGER.info("skip current config.id:{}", c.getId()); + return; + } + + IntHolder index = indexMap.get(appServiceDTO.getProjectId()); + if (index == null) { + index = new IntHolder(); + index.value = 1; + indexMap.put(appServiceDTO.getProjectId(), index); + } + + DevopsHelmConfigDTO devopsHelmConfigDTO = new DevopsHelmConfigDTO(); + devopsHelmConfigDTO.setId(c.getId()); + devopsHelmConfigDTO.setName(String.format("自定义Helm仓库-%s", index.value)); + Map helmConfig = JsonHelper.unmarshalByJackson(c.getConfig(), new TypeReference>() { + }); + URL processedUrl = null; + try { + processedUrl = new URL(helmConfig.get("url")); + } catch (Exception e) { + LOGGER.warn("current config:{} errorMsg:{}", c.getConfig(), e.getMessage()); + } + devopsHelmConfigDTO.setUrl(String.format("%s://%s/%s/%s", processedUrl.getProtocol(), processedUrl.getHost(), tenant.getTenantNum(), projectDTO.getCode())); + devopsHelmConfigDTO.setUsername(helmConfig.get("userName")); + devopsHelmConfigDTO.setPassword(helmConfig.get("password")); + devopsHelmConfigDTO.setRepoPrivate(Boolean.parseBoolean(helmConfig.get("isPrivate"))); + devopsHelmConfigDTO.setRepoDefault(false); + devopsHelmConfigDTO.setResourceId(appServiceDTO.getProjectId()); + devopsHelmConfigDTO.setResourceType(ResourceLevel.PROJECT.value()); + devopsHelmConfigDTOToInsert.add(devopsHelmConfigDTO); + + AppServiceHelmRelDTO appServiceHelmRelDTO = new AppServiceHelmRelDTO(); + appServiceHelmRelDTO.setAppServiceId(appServiceDTO.getId()); + appServiceHelmRelDTO.setHelmConfigId(c.getId()); + + index.value++; + appServiceHelmRelDTOToInsert.add(appServiceHelmRelDTO); + }); + + if (!ObjectUtils.isEmpty(devopsHelmConfigDTOToInsert)) { + devopsHelmConfigService.batchInsertInNewTrans(devopsHelmConfigDTOToInsert); + } + if (!ObjectUtils.isEmpty(appServiceHelmRelDTOToInsert)) { + appServiceHelmRelService.batchInsertInNewTrans(appServiceHelmRelDTOToInsert); + } + + LOGGER.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>end fix helm config >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>!"); + } + private void pipelineSonarTemplateImageFix() { LOGGER.info(">>>>>>>>>>>>>>>>>>>>start fix sonar template data<<<<<<<<<<<<<<<<<<<<<<<"); CiTemplateStepDTO ciTemplateStepDTO = new CiTemplateStepDTO(); @@ -138,7 +433,7 @@ private void pipelineSonarTemplateImageFix() { Condition condition = Condition.builder(CiTemplateJobStepRelDTO.class).where(Sqls.custom() .andIn("ciTemplateStepId", stepIds)).build(); List ciTemplateJobStepRelDTOS = ciTemplateJobStepRelMapper.selectByCondition(condition); - if (CollectionUtils.isEmpty(ciTemplateJobStepRelDTOS)){ + if (CollectionUtils.isEmpty(ciTemplateJobStepRelDTOS)) { return; } @@ -191,7 +486,7 @@ public void pipelineDataMavenPublishFix() { for (CiConfigTemplateVO ciConfigTemplateVO : config) { try { - if (CiJobScriptTypeEnum.MAVEN_DEPLOY.getType().equals(ciConfigTemplateVO.getType().toLowerCase())) { + if (CiJobScriptTypeEnum.MAVEN_DEPLOY.getType().equalsIgnoreCase(ciConfigTemplateVO.getType())) { DevopsCiMavenPublishConfigVO devopsCiMavenPublishConfigVO = new DevopsCiMavenPublishConfigVO(); devopsCiMavenPublishConfigVO.setRepos(ciConfigTemplateVO.getRepos()); devopsCiMavenPublishConfigVO.setMavenSettings(ciConfigTemplateVO.getMavenSettings()); @@ -280,10 +575,6 @@ private void fixCustomJob() { for (DevopsCiJobDTO devopsCiJobDTO : devopsCiJobDTOList) { try { if (devopsCiJobDTO != null) { - CiCdPipelineVO ciCdPipelineVO = devopsCiCdPipelineMapper.queryById(devopsCiJobDTO.getCiPipelineId()); - Long devopsCiJobId = devopsCiJobDTO.getId(); - Long projectId = ciCdPipelineVO.getProjectId(); - // 需要修复的内容 // 1. job的所属分组信息 // 将构建任务拆分为单步骤的任务 @@ -459,7 +750,7 @@ private void fixBuildJob() { devopsCiJobDTO.setType(CiJobTypeEnum.NORMAL.value()); for (CiConfigTemplateVO ciConfigTemplateVO : config) { - if (CiJobScriptTypeEnum.NPM.getType().equals(ciConfigTemplateVO.getType().toLowerCase())) { + if (CiJobScriptTypeEnum.NPM.getType().equalsIgnoreCase(ciConfigTemplateVO.getType())) { DevopsCiStepVO devopsCiStepVO = new DevopsCiStepVO(); devopsCiStepVO.setDevopsCiJobId(devopsCiJobId); devopsCiStepVO.setName("Npm构建"); @@ -470,7 +761,7 @@ private void fixBuildJob() { devopsCiStepVOList.add(devopsCiStepVO); devopsCiJobDTO.setGroupType(CiTemplateJobGroupTypeEnum.BUILD.value()); - } else if (CiJobScriptTypeEnum.MAVEN.getType().equals(ciConfigTemplateVO.getType().toLowerCase())) { + } else if (CiJobScriptTypeEnum.MAVEN.getType().equalsIgnoreCase(ciConfigTemplateVO.getType())) { DevopsCiStepVO mavenStep = new DevopsCiStepVO(); mavenStep.setDevopsCiJobId(devopsCiJobId); mavenStep.setName("Maven构建"); @@ -487,7 +778,7 @@ private void fixBuildJob() { devopsCiJobDTO.setGroupType(CiTemplateJobGroupTypeEnum.BUILD.value()); - } else if (CiJobScriptTypeEnum.DOCKER.getType().equals(ciConfigTemplateVO.getType().toLowerCase())) { + } else if (CiJobScriptTypeEnum.DOCKER.getType().equalsIgnoreCase(ciConfigTemplateVO.getType())) { DevopsCiStepVO dockerStep = new DevopsCiStepVO(); dockerStep.setDevopsCiJobId(devopsCiJobId); dockerStep.setName("Docker构建"); @@ -510,7 +801,7 @@ private void fixBuildJob() { devopsCiStepVOList.add(dockerStep); devopsCiJobDTO.setGroupType(CiTemplateJobGroupTypeEnum.DOCKER_BUILD.value()); - } else if (CiJobScriptTypeEnum.UPLOAD_JAR.getType().equals(ciConfigTemplateVO.getType().toLowerCase())) { + } else if (CiJobScriptTypeEnum.UPLOAD_JAR.getType().equalsIgnoreCase(ciConfigTemplateVO.getType())) { DevopsCiStepVO uploadJar = new DevopsCiStepVO(); uploadJar.setDevopsCiJobId(devopsCiJobId); uploadJar.setName("上传Jar包至制品库"); @@ -528,7 +819,7 @@ private void fixBuildJob() { devopsCiStepVOList.add(uploadJar); devopsCiJobDTO.setGroupType(CiTemplateJobGroupTypeEnum.BUILD.value()); - } else if (CiJobScriptTypeEnum.MAVEN_DEPLOY.getType().equals(ciConfigTemplateVO.getType().toLowerCase())) { + } else if (CiJobScriptTypeEnum.MAVEN_DEPLOY.getType().equalsIgnoreCase(ciConfigTemplateVO.getType())) { DevopsCiStepVO mavenDeploy = new DevopsCiStepVO(); mavenDeploy.setDevopsCiJobId(devopsCiJobId); mavenDeploy.setName("Maven发布"); diff --git a/src/main/java/io/choerodon/devops/app/service/impl/DevopsCiJobServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/DevopsCiJobServiceImpl.java index 1f56fb0d71..2746e75fa1 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/DevopsCiJobServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/DevopsCiJobServiceImpl.java @@ -264,8 +264,16 @@ public void deleteByPipelineId(Long ciPipelineId) { throw new CommonException(ERROR_PIPELINE_ID_IS_NULL); } + List devopsCiJobDTOS = listByPipelineId(ciPipelineId); + if (CollectionUtils.isEmpty(devopsCiJobDTOS)) { + return; + } + List jobIds = devopsCiJobDTOS.stream().map(DevopsCiJobDTO::getId).collect(Collectors.toList()); // 删除maven settings - deleteMavenSettingsRecordByJobIds(listByPipelineId(ciPipelineId).stream().map(DevopsCiJobDTO::getId).collect(Collectors.toList())); + deleteMavenSettingsRecordByJobIds(jobIds); + + // 删除步骤 + devopsCiStepService.deleteByJobIds(jobIds); DevopsCiJobDTO devopsCiJobDTO = new DevopsCiJobDTO(); devopsCiJobDTO.setCiPipelineId(ciPipelineId); diff --git a/src/main/java/io/choerodon/devops/app/service/impl/DevopsCiPipelineChartServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/DevopsCiPipelineChartServiceImpl.java index 882f4b3f6c..a130db0251 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/DevopsCiPipelineChartServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/DevopsCiPipelineChartServiceImpl.java @@ -42,5 +42,16 @@ public DevopsCiPipelineChartDTO queryByPipelineIdAndJobName(Long appServiceId, L public void baseCreate(DevopsCiPipelineChartDTO devopsCiPipelineChartDTO) { MapperUtil.resultJudgedInsertSelective(devopsCiPipelineChartMapper, devopsCiPipelineChartDTO, "error.save.chart.info"); } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteByAppServiceId(Long appServiceId) { + Assert.notNull(appServiceId, ResourceCheckConstant.ERROR_APP_SERVICE_ID_IS_NULL); + + DevopsCiPipelineChartDTO devopsCiPipelineChartDTO = new DevopsCiPipelineChartDTO(); + devopsCiPipelineChartDTO.setAppServiceId(appServiceId); + + devopsCiPipelineChartMapper.delete(devopsCiPipelineChartDTO); + } } diff --git a/src/main/java/io/choerodon/devops/app/service/impl/DevopsCiPipelineRecordServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/DevopsCiPipelineRecordServiceImpl.java index eb20e5c7ff..78dc92f4e5 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/DevopsCiPipelineRecordServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/DevopsCiPipelineRecordServiceImpl.java @@ -24,7 +24,6 @@ import io.choerodon.asgard.saga.annotation.Saga; import io.choerodon.asgard.saga.producer.StartSagaBuilder; import io.choerodon.asgard.saga.producer.TransactionalProducer; -import io.choerodon.core.domain.Page; import io.choerodon.core.exception.CommonException; import io.choerodon.core.iam.ResourceLevel; import io.choerodon.core.oauth.DetailsHelper; @@ -56,8 +55,6 @@ import io.choerodon.devops.infra.handler.CiPipelineSyncHandler; import io.choerodon.devops.infra.mapper.*; import io.choerodon.devops.infra.util.*; -import io.choerodon.mybatis.pagehelper.PageHelper; -import io.choerodon.mybatis.pagehelper.domain.PageRequest; /** * 〈功能简述〉 @@ -75,7 +72,6 @@ public class DevopsCiPipelineRecordServiceImpl implements DevopsCiPipelineRecord private static final String ERROR_GITLAB_PIPELINE_ID_IS_NULL = "error.gitlab.pipeline.id.is.null"; private static final String ERROR_GITLAB_PROJECT_ID_IS_NULL = "error.gitlab.project.id.is.null"; private static final String DOWNLOAD_JAR_URL = "%s%s/%s/repository/"; - private static final String REPOSITORY = "repository"; private final DevopsCiPipelineRecordMapper devopsCiPipelineRecordMapper; private final DevopsCiJobRecordService devopsCiJobRecordService; @@ -102,9 +98,6 @@ public class DevopsCiPipelineRecordServiceImpl implements DevopsCiPipelineRecord @Autowired private DevopsCiPipelineChartService devopsCiPipelineChartService; - @Autowired - private CiPipelineImageMapper ciPipelineImageMapper; - @Autowired private RdupmClient rdupmClient; @@ -334,14 +327,6 @@ private void saveJobRecords(PipelineWebHookVO pipelineWebHookVO, Long pipelineRe devopsCiJobRecordDTO.setStatus(ciJobWebHookVO.getStatus()); devopsCiJobRecordDTO.setTriggerUserId(getIamUserIdByGitlabUserName(ciJobWebHookVO.getUser().getUsername())); MapperUtil.resultJudgedUpdateByPrimaryKeySelective(devopsCiJobRecordMapper, devopsCiJobRecordDTO, "error.update.ci.job.record", ciJobWebHookVO.getId()); - // sonar任务执行成功后,缓存sonar信息到redis - // todo v1.2待删除 -// if (PipelineStatus.SUCCESS.toValue().equals(ciJobWebHookVO.getStatus()) -// && JobTypeEnum.SONAR.value().equals(devopsCiJobRecordDTO.getType())) { -// DevopsCiPipelineRecordDTO devopsCiPipelineRecordDTO = devopsCiPipelineRecordMapper.selectByPrimaryKey(pipelineRecordId); -// CiCdPipelineVO ciCdPipelineVO = devopsCiPipelineService.queryById(devopsCiPipelineRecordDTO.getCiPipelineId()); -// applicationService.getSonarContent(ciCdPipelineVO.getProjectId(), ciCdPipelineVO.getAppServiceId()); -// } } }); } @@ -376,43 +361,6 @@ private void fillMavenSettingId(DevopsCiJobRecordDTO devopsCiJobRecordDTO, CiJob } } - @Override - public Page pagingPipelineRecord(Long projectId, Long ciPipelineId, PageRequest pageable) { - Page pipelineRecordInfo = PageHelper.doPageAndSort(PageRequestUtil.simpleConvertSortForPage(pageable), () -> devopsCiPipelineRecordMapper.listByCiPipelineId(ciPipelineId)); - List pipelineRecordVOList = pipelineRecordInfo.getContent(); - if (CollectionUtils.isEmpty(pipelineRecordVOList)) { - return pipelineRecordInfo; - } - pipelineRecordVOList.forEach(pipelineRecord -> { - ciPipelineSyncHandler.syncPipeline(pipelineRecord.getStatus(), pipelineRecord.getLastUpdateDate(), pipelineRecord.getId(), TypeUtil.objToInteger(pipelineRecord.getGitlabPipelineId())); - // 查询流水线记录下的job记录 - DevopsCiJobRecordDTO recordDTO = new DevopsCiJobRecordDTO(); - recordDTO.setCiPipelineRecordId(pipelineRecord.getId()); - List devopsCiJobRecordDTOS = devopsCiJobRecordMapper.select(recordDTO); - - // 只返回job的最新记录 - devopsCiJobRecordDTOS = filterJobs(devopsCiJobRecordDTOS); - Map> jobRecordMap = devopsCiJobRecordDTOS.stream().collect(Collectors.groupingBy(DevopsCiJobRecordDTO::getStage)); - // 查询阶段信息 - List devopsCiStageDTOList = devopsCiStageService.listByPipelineId(ciPipelineId); - List devopsCiStageRecordVOS = ConvertUtils.convertList(devopsCiStageDTOList, DevopsCiStageRecordVO.class); - // 计算stage状态 - devopsCiStageRecordVOS.forEach(stageRecord -> { - List ciJobRecordDTOS = jobRecordMap.get(stageRecord.getName()); - if (!CollectionUtils.isEmpty(ciJobRecordDTOS)) { - Map> statusMap = ciJobRecordDTOS.stream().collect(Collectors.groupingBy(DevopsCiJobRecordDTO::getStatus)); - //计算stage状态 - calculateStageStatus(stageRecord, ciJobRecordDTOS); - } - - }); - // stage排序 - devopsCiStageRecordVOS = devopsCiStageRecordVOS.stream().sorted(Comparator.comparing(DevopsCiStageRecordVO::getSequence)).filter(v -> v.getStatus() != null).collect(Collectors.toList()); - pipelineRecord.setStageRecordVOList(devopsCiStageRecordVOS); - }); - return pipelineRecordInfo; - } - @Transactional(rollbackFor = Exception.class) @Async(GitOpsConstants.PIPELINE_EXECUTOR) @Override @@ -832,25 +780,6 @@ public List queryByPipelineId(Long ciPipelineId) { return devopsCiPipelineRecordMapper.select(pipelineRecordDTO); } - @Override - @Transactional - public void deleteByGitlabProjectId(Long gitlabProjectId) { - Objects.requireNonNull(gitlabProjectId); - DevopsCiPipelineRecordDTO pipelineRecordDTO = new DevopsCiPipelineRecordDTO(); - pipelineRecordDTO.setGitlabProjectId(gitlabProjectId); - List devopsCiPipelineRecordDTOS = devopsCiPipelineRecordMapper.select(pipelineRecordDTO); - if (CollectionUtils.isEmpty(devopsCiPipelineRecordDTOS)) { - return; - } - devopsCiPipelineRecordMapper.delete(pipelineRecordDTO); - List gitlabPipelineIds = devopsCiPipelineRecordDTOS.stream().map(DevopsCiPipelineRecordDTO::getGitlabPipelineId).collect(Collectors.toList()); - if (CollectionUtils.isEmpty(gitlabPipelineIds)) { - return; - } - //删除镜像扫描记录 -// devopsImageScanResultMapper.deleteByGitlabPipelineIds(gitlabPipelineIds); - } - @Override public DevopsCiPipelineRecordDTO create(Long ciPipelineId, Long gitlabProjectId, Pipeline pipeline) { DevopsCiPipelineRecordDTO pipelineRecordDTO = new DevopsCiPipelineRecordDTO(); @@ -1080,11 +1009,4 @@ public DevopsCiPipelineRecordVO queryByCiPipelineRecordId(Long ciPipelineRecordI devopsCiPipelineRecordVO.setStageRecordVOList(devopsCiStageRecordVOS); return devopsCiPipelineRecordVO; } - - @Override - public AppServiceDTO queryAppServiceByPipelineRecordId(Long pipelineRecordId) { - DevopsCiPipelineRecordDTO devopsCiPipelineRecordDTO = devopsCiPipelineRecordMapper.selectByPrimaryKey(pipelineRecordId); - CiCdPipelineVO ciCdPipelineVO = devopsCiPipelineService.queryById(devopsCiPipelineRecordDTO.getCiPipelineId()); - return applicationService.baseQuery(ciCdPipelineVO.getAppServiceId()); - } } diff --git a/src/main/java/io/choerodon/devops/app/service/impl/DevopsCiPipelineServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/DevopsCiPipelineServiceImpl.java index 282c5061eb..c70497353f 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/DevopsCiPipelineServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/DevopsCiPipelineServiceImpl.java @@ -1,7 +1,5 @@ package io.choerodon.devops.app.service.impl; -import static io.choerodon.devops.infra.constant.MiscConstants.DEFAULT_SONAR_NAME; - import java.nio.charset.StandardCharsets; import java.text.DecimalFormat; import java.util.*; @@ -11,8 +9,6 @@ import com.alibaba.fastjson.JSONObject; import com.fasterxml.jackson.core.type.TypeReference; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -20,8 +16,6 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Isolation; -import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; @@ -47,20 +41,13 @@ import io.choerodon.devops.infra.dto.iam.IamUserDTO; import io.choerodon.devops.infra.dto.iam.ProjectDTO; import io.choerodon.devops.infra.dto.iam.Tenant; -import io.choerodon.devops.infra.dto.maven.Repository; -import io.choerodon.devops.infra.dto.maven.RepositoryPolicy; -import io.choerodon.devops.infra.dto.maven.Server; -import io.choerodon.devops.infra.dto.repo.NexusMavenRepoDTO; import io.choerodon.devops.infra.enums.PipelineStatus; import io.choerodon.devops.infra.enums.*; import io.choerodon.devops.infra.enums.deploy.DeployTypeEnum; import io.choerodon.devops.infra.enums.deploy.RdupmTypeEnum; -import io.choerodon.devops.infra.enums.sonar.CiSonarConfigType; -import io.choerodon.devops.infra.enums.sonar.SonarAuthType; import io.choerodon.devops.infra.enums.sonar.SonarScannerType; import io.choerodon.devops.infra.feign.operator.BaseServiceClientOperator; import io.choerodon.devops.infra.feign.operator.GitlabServiceClientOperator; -import io.choerodon.devops.infra.feign.operator.RdupmClientOperator; import io.choerodon.devops.infra.mapper.*; import io.choerodon.devops.infra.util.*; import io.choerodon.mybatis.pagehelper.PageHelper; @@ -87,11 +74,7 @@ public class DevopsCiPipelineServiceImpl implements DevopsCiPipelineService { private static final String DELETE_PIPELINE_FAILED = "delete.pipeline.failed"; private static final String ERROR_APP_SVC_ID_IS_NULL = "error.app.svc.id.is.null"; private static final String ERROR_PROJECT_ID_IS_NULL = "error.project.id.is.null"; - private static final String ERROR_CI_MAVEN_REPOSITORY_TYPE = "error.ci.maven.repository.type"; - private static final String ERROR_CI_MAVEN_SETTINGS_INSERT = "error.maven.settings.insert"; - private static final String ERROR_UNSUPPORTED_STEP_TYPE = "error.unsupported.step.type"; private static final String ERROR_BRANCH_PERMISSION_MISMATCH = "error.branch.permission.mismatch"; - private static final String UNKNOWN_DEPLOY_TYPE = "unknown.deploy.type"; @Value("${services.gateway.url}") private String gatewayUrl; @@ -105,8 +88,6 @@ public class DevopsCiPipelineServiceImpl implements DevopsCiPipelineService { @Value("${devops.ci.base.image:registry.cn-shanghai.aliyuncs.com/c7n/cibase:0.11.4}") private String cibase; - private static final Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create(); - @Autowired private DevopsCiSonarConfigService devopsCiSonarConfigService; @@ -120,12 +101,9 @@ public class DevopsCiPipelineServiceImpl implements DevopsCiPipelineService { private final UserAttrService userAttrService; private final AppServiceService appServiceService; private final DevopsCiJobRecordService devopsCiJobRecordService; - private final DevopsCiMavenSettingsMapper devopsCiMavenSettingsMapper; private final DevopsProjectService devopsProjectService; private final BaseServiceClientOperator baseServiceClientOperator; - private final RdupmClientOperator rdupmClientOperator; private final CheckGitlabAccessLevelService checkGitlabAccessLevelService; - private final DevopsConfigService devopsConfigService; private final PermissionHelper permissionHelper; private final AppServiceMapper appServiceMapper; private final CiCdPipelineMapper ciCdPipelineMapper; @@ -137,7 +115,6 @@ public class DevopsCiPipelineServiceImpl implements DevopsCiPipelineService { private final DevopsPipelineRecordRelService devopsPipelineRecordRelService; private final DevopsCdPipelineService devopsCdPipelineService; private final DevopsPipelineRecordRelMapper devopsPipelineRecordRelMapper; - private final DevopsDeployValueMapper devopsDeployValueMapper; @Autowired private DevopsCiPipelineRecordMapper devopsCiPipelineRecordMapper; @@ -188,6 +165,14 @@ public class DevopsCiPipelineServiceImpl implements DevopsCiPipelineService { private CiDockerAuthConfigService ciDockerAuthConfigService; @Autowired private CiPipelineScheduleService ciPipelineScheduleService; + @Autowired + private DevopsCiPipelineChartService devopsCiPipelineChartService; + @Autowired + private CiPipelineMavenService ciPipelineMavenService; + @Autowired + private CiPipelineImageService ciPipelineImageService; + @Autowired + private CiPipelineAppVersionService ciPipelineAppVersionService; public DevopsCiPipelineServiceImpl( @@ -203,11 +188,8 @@ public DevopsCiPipelineServiceImpl( CheckGitlabAccessLevelService checkGitlabAccessLevelService, @Lazy AppServiceService appServiceService, DevopsCiJobRecordService devopsCiJobRecordService, - DevopsCiMavenSettingsMapper devopsCiMavenSettingsMapper, DevopsProjectService devopsProjectService, BaseServiceClientOperator baseServiceClientOperator, - RdupmClientOperator rdupmClientOperator, - DevopsConfigService devopsConfigService, PermissionHelper permissionHelper, AppServiceMapper appServiceMapper, CiCdPipelineMapper ciCdPipelineMapper, @@ -218,8 +200,7 @@ public DevopsCiPipelineServiceImpl( DevopsEnvironmentMapper devopsEnvironmentMapper, @Lazy DevopsPipelineRecordRelService devopsPipelineRecordRelService, @Lazy DevopsCdPipelineService devopsCdPipelineService, - DevopsPipelineRecordRelMapper devopsPipelineRecordRelMapper, - DevopsDeployValueMapper devopsDeployValueMapper + DevopsPipelineRecordRelMapper devopsPipelineRecordRelMapper ) { this.devopsCiCdPipelineMapper = devopsCiCdPipelineMapper; this.devopsCiPipelineRecordService = devopsCiPipelineRecordService; @@ -230,11 +211,8 @@ public DevopsCiPipelineServiceImpl( this.userAttrService = userAttrService; this.appServiceService = appServiceService; this.devopsCiJobRecordService = devopsCiJobRecordService; - this.devopsCiMavenSettingsMapper = devopsCiMavenSettingsMapper; this.baseServiceClientOperator = baseServiceClientOperator; this.devopsProjectService = devopsProjectService; - this.rdupmClientOperator = rdupmClientOperator; - this.devopsConfigService = devopsConfigService; this.checkGitlabAccessLevelService = checkGitlabAccessLevelService; this.permissionHelper = permissionHelper; this.appServiceMapper = appServiceMapper; @@ -247,34 +225,9 @@ public DevopsCiPipelineServiceImpl( this.devopsPipelineRecordRelService = devopsPipelineRecordRelService; this.devopsCdPipelineService = devopsCdPipelineService; this.devopsPipelineRecordRelMapper = devopsPipelineRecordRelMapper; - this.devopsDeployValueMapper = devopsDeployValueMapper; this.devopsCiJobMapper = devopsCiJobMapper; } - private static String buildSettings(List mavenRepoList) { - List servers = new ArrayList<>(); - List repositories = new ArrayList<>(); - - mavenRepoList.forEach(m -> { - if (m.getType() != null) { - String[] types = m.getType().split(GitOpsConstants.COMMA); - if (types.length > 2) { - throw new CommonException(ERROR_CI_MAVEN_REPOSITORY_TYPE, m.getType()); - } - } - if (Boolean.TRUE.equals(m.getPrivateRepo())) { - servers.add(new Server(Objects.requireNonNull(m.getName()), Objects.requireNonNull(m.getUsername()), Objects.requireNonNull(m.getPassword()))); - } - repositories.add(new Repository( - Objects.requireNonNull(m.getName()), - Objects.requireNonNull(m.getName()), - Objects.requireNonNull(m.getUrl()), - m.getType() == null ? null : new RepositoryPolicy(m.getType().contains(GitOpsConstants.RELEASE)), - m.getType() == null ? null : new RepositoryPolicy(m.getType().contains(GitOpsConstants.SNAPSHOT)))); - }); - return MavenSettingsUtil.generateMavenSettings(servers, repositories); - } - /** * 第一次创建CI流水线时初始化仓库下的.gitlab-ci.yml文件 * @@ -298,7 +251,7 @@ private void initGitlabCiFile(Integer gitlabProjectId, String branch, String ciF GitUserNameUtil.getAdminId(), branch); } catch (Exception ex) { - throw new CommonException("error.create.or.update.gitlab.ci", ex); + throw new CommonException("error.create.or.update.gitlab.ci", ex, branch); } } else { @@ -317,7 +270,7 @@ private void initGitlabCiFile(Integer gitlabProjectId, String branch, String ciF GitUserNameUtil.getAdminId(), branch); } catch (Exception ex) { - throw new CommonException("error.create.or.update.gitlab.ci", ex); + throw new CommonException("error.create.or.update.gitlab.ci", ex, branch); } } } @@ -338,7 +291,7 @@ private void initGitlabCiFileIfEmpty(Integer gitlabProjectId, String branch, Str GitUserNameUtil.getAdminId(), branch); } catch (Exception ex) { - throw new CommonException("error.create.or.update.gitlab.ci", ex); + throw new CommonException("error.create.or.update.gitlab.ci", ex, branch); } } @@ -361,7 +314,7 @@ private void initExternalGitlabCiFileIfEmpty(Integer gitlabProjectId, String bra branch, appExternalConfigDTO); } catch (Exception ex) { - throw new CommonException("error.create.or.update.gitlab.ci", ex); + throw new CommonException("error.create.or.update.gitlab.ci", ex, branch); } } @@ -391,7 +344,7 @@ private void initExternalGitlabCiFile(Integer gitlabProjectId, String branch, St branch, appExternalConfigDTO); } catch (Exception ex) { - throw new CommonException("error.create.or.update.gitlab.ci", ex); + throw new CommonException("error.create.or.update.gitlab.ci", ex, branch); } } else { @@ -411,7 +364,7 @@ private void initExternalGitlabCiFile(Integer gitlabProjectId, String branch, St branch, appExternalConfigDTO); } catch (Exception ex) { - throw new CommonException("error.create.or.update.gitlab.ci", ex); + throw new CommonException("error.create.or.update.gitlab.ci", ex, branch); } } } @@ -464,6 +417,11 @@ private void saveCiDockerAuthConfig(CiCdPipelineVO ciCdPipelineVO, CiCdPipelineD List ciDockerAuthConfigDTOList = ciCdPipelineVO.getCiDockerAuthConfigDTOList(); if (!CollectionUtils.isEmpty(ciDockerAuthConfigDTOList)) { ciDockerAuthConfigDTOList.forEach(v -> { + if (StringUtils.isEmpty(v.getDomain()) + || StringUtils.isEmpty(v.getUsername()) + || StringUtils.isEmpty(v.getPassword())) { + throw new CommonException("error.docker.auth.config.invalid"); + } v.setId(null); v.setDevopsPipelineId(ciCdPipelineDTO.getId()); ciDockerAuthConfigService.baseCreate(v); @@ -625,14 +583,6 @@ private void saveCiPipeline(Long projectId, CiCdPipelineVO ciCdPipelineVO, CiCdP }); } }); -// AppServiceDTO appServiceDTO = appServiceService.baseQuery(ciCdPipelineDTO.getAppServiceId()); -// String ciFileIncludeUrl = String.format(GitOpsConstants.CI_CONTENT_URL_TEMPLATE, gatewayUrl, projectId, ciCdPipelineDTO.getToken()); -// if (appServiceDTO.getExternalConfigId() != null) { -// AppExternalConfigDTO appExternalConfigDTO = appExternalConfigService.baseQueryWithPassword(appServiceDTO.getExternalConfigId()); -// ciCdPipelineVO.getRelatedBranches().forEach(branch -> initExternalGitlabCiFile(appServiceDTO.getGitlabProjectId(), branch, ciFileIncludeUrl, appExternalConfigDTO)); -// } else { -// ciCdPipelineVO.getRelatedBranches().forEach(branch -> initGitlabCiFile(appServiceDTO.getGitlabProjectId(), branch, ciFileIncludeUrl)); -// } } } @@ -1010,6 +960,7 @@ public void deletePipeline(Long projectId, Long pipelineId) { CommonExAssertUtil.assertTrue(projectId.equals(ciCdPipelineDTO.getProjectId()), MiscConstants.ERROR_OPERATING_RESOURCE_IN_OTHER_PROJECT); checkGitlabAccessLevelService.checkGitlabPermission(projectId, ciCdPipelineDTO.getAppServiceId(), AppServiceEvent.CICD_PIPELINE_DELETE); AppServiceDTO appServiceDTO = appServiceService.baseQuery(ciCdPipelineDTO.getAppServiceId()); + // 删除流水线 if (ciCdPipelineMapper.deleteByPrimaryKey(pipelineId) != 1) { throw new CommonException(DELETE_PIPELINE_FAILED); @@ -1027,6 +978,12 @@ public void deletePipeline(Long projectId, Long pipelineId) { // 删除 ci job记录 devopsCiJobRecordService.deleteByAppServiceId(appServiceDTO.getId()); + // 删除流水线相关产物 + devopsCiPipelineChartService.deleteByAppServiceId(appServiceDTO.getId()); + ciPipelineImageService.deleteByAppServiceId(appServiceDTO.getId()); + ciPipelineMavenService.deleteByAppServiceId(appServiceDTO.getId()); + ciPipelineAppVersionService.deleteByAppServiceId(appServiceDTO.getId()); + // 删除pipeline记录 devopsCiPipelineRecordService.deleteByPipelineId(pipelineId); @@ -1335,12 +1292,12 @@ public Page pagePipelineExecuteTime(List pipelineIds @Override public Map runnerGuide(Long projectId) { - ProjectDTO projectDTO = baseServiceClientOperator.queryIamProjectById(projectId, false, false, false); + ProjectDTO projectDTO = baseServiceClientOperator.queryIamProjectById(projectId, false, false, false, false, false); Tenant tenant = baseServiceClientOperator.queryOrganizationById(projectDTO.getOrganizationId()); // name: orgName-projectName + suffix String groupName = GitOpsUtil.renderGroupName(tenant.getTenantNum(), - projectDTO.getCode(), ""); + projectDTO.getDevopsComponentCode(), ""); String processedGitlabUrl = ""; if (gitlabUrl.endsWith("/")) { processedGitlabUrl = gitlabUrl.substring(0, gitlabUrl.length() - 1); @@ -1427,44 +1384,6 @@ private CiCdPipelineRecordVO dtoToVo(DevopsPipelineRecordRelDTO devopsPipelineRe return ciCdPipelineRecordVO; } - private void calculateStageStatus(DevopsCiStageRecordVO stageRecord, Map> statusMap) { - if (!CollectionUtils.isEmpty(statusMap.get(JobStatusEnum.CREATED.value()))) { - stageRecord.setStatus(JobStatusEnum.CREATED.value()); - } else if (!CollectionUtils.isEmpty(statusMap.get(JobStatusEnum.PENDING.value()))) { - stageRecord.setStatus(JobStatusEnum.PENDING.value()); - } else if (!CollectionUtils.isEmpty(statusMap.get(JobStatusEnum.RUNNING.value()))) { - stageRecord.setStatus(JobStatusEnum.RUNNING.value()); - } else if (!CollectionUtils.isEmpty(statusMap.get(JobStatusEnum.FAILED.value()))) { - stageRecord.setStatus(JobStatusEnum.FAILED.value()); - } else if (!CollectionUtils.isEmpty(statusMap.get(JobStatusEnum.SUCCESS.value()))) { - stageRecord.setStatus(JobStatusEnum.SUCCESS.value()); - } else if (!CollectionUtils.isEmpty(statusMap.get(JobStatusEnum.CANCELED.value()))) { - stageRecord.setStatus(JobStatusEnum.CANCELED.value()); - } else if (!CollectionUtils.isEmpty(statusMap.get(JobStatusEnum.SKIPPED.value()))) { - stageRecord.setStatus(JobStatusEnum.SKIPPED.value()); - } else if (!CollectionUtils.isEmpty(statusMap.get(JobStatusEnum.MANUAL.value()))) { - stageRecord.setStatus(JobStatusEnum.MANUAL.value()); - } - } - - private List filterJobs(List devopsCiJobRecordDTOS) { - List devopsCiJobRecordDTOList = new ArrayList<>(); - if (CollectionUtils.isEmpty(devopsCiJobRecordDTOS)) { - return devopsCiJobRecordDTOList; - } - Map> jobMap = devopsCiJobRecordDTOS.stream().collect(Collectors.groupingBy(DevopsCiJobRecordDTO::getName)); - jobMap.forEach((k, v) -> { - if (v.size() > 1) { - Optional ciJobRecordDTO = v.stream().max(Comparator.comparing(DevopsCiJobRecordDTO::getId)); - devopsCiJobRecordDTOList.add(ciJobRecordDTO.get()); - } else if (v.size() == 1) { - devopsCiJobRecordDTOList.add(v.get(0)); - } - }); - return devopsCiJobRecordDTOList; - } - - private Long getPipelineExecuteTime(Long relId) { DevopsPipelineRecordRelDTO devopsPipelineRecordRelDTO = devopsPipelineRecordRelMapper.selectByPrimaryKey(relId); if (Objects.isNull(devopsPipelineRecordRelDTO)) { @@ -1768,46 +1687,6 @@ private void updateCiPipeline(Long projectId, CiCdPipelineVO ciCdPipelineVO, CiC } } -// private void processCiJobVO(DevopsCiJobVO devopsCiJobVO) { -// // 不让数据库存加密的值 -// if (JobTypeEnum.BUILD.value().equals(devopsCiJobVO.getType())) { -// // 将构建类型的stage中的job的每个step进行解析和转化 -// CiConfigVO ciConfigVO = JSONObject.parseObject(devopsCiJobVO.getMetadata(), CiConfigVO.class); -// if (!CollectionUtils.isEmpty(ciConfigVO.getConfig())) { -// ciConfigVO.getConfig().forEach(c -> { -// if (!org.springframework.util.ObjectUtils.isEmpty(c.getScript())) { -// c.setScript(Base64Util.getBase64DecodedString(c.getScript())); -// } -// }); -// } -// devopsCiJobVO.setConfigVO(ciConfigVO); -// devopsCiJobVO.setMetadata(JSONObject.toJSONString(ciConfigVO)); -// } -// } - -// private void saveCiContent(final Long projectId, final Long organizationId, Long pipelineId, CiCdPipelineVO ciCdPipelineVO) { -// GitlabCi gitlabCi = buildGitLabCiObject(projectId, organizationId, ciCdPipelineVO); -// StringBuilder gitlabCiYaml = new StringBuilder(GitlabCiUtil.gitlabCi2yaml(gitlabCi)); -// -// // 拼接自定义job -// if (!CollectionUtils.isEmpty(ciCdPipelineVO.getDevopsCiStageVOS())) { -// List ciJobVOS = ciCdPipelineVO.getDevopsCiStageVOS().stream() -// .flatMap(v -> v.getJobList().stream()).filter(job -> JobTypeEnum.CUSTOM.value().equalsIgnoreCase(job.getType())) -// .collect(Collectors.toList()); -// if (!CollectionUtils.isEmpty(ciJobVOS)) { -// for (DevopsCiJobVO job : ciJobVOS) { -// gitlabCiYaml.append(GitOpsConstants.NEW_LINE).append(job.getMetadata()); -// } -// } -// -// } -// -// //保存gitlab-ci配置文件 -// DevopsCiContentDTO devopsCiContentDTO = new DevopsCiContentDTO(); -// devopsCiContentDTO.setCiPipelineId(pipelineId); -// devopsCiContentDTO.setCiContentFile(gitlabCiYaml.toString()); -// devopsCiContentService.create(devopsCiContentDTO); -// } /** * 构建gitlab-ci对象,用于转换为gitlab-ci.yaml @@ -1905,92 +1784,6 @@ private GitlabCi buildGitLabCiObject(CiCdPipelineDTO ciCdPipelineDTO) { return gitlabCi; } -// /** -// * 构建gitlab-ci对象,用于转换为gitlab-ci.yaml -// * -// * @param projectId 项目id -// * @param ciCdPipelineVO 流水线数据 -// * @return 构建完的CI文件对象 -// */ -// private GitlabCi buildGitLabCiObject(final Long projectId, final Long organizationId, CiCdPipelineVO ciCdPipelineVO) { -// // 对阶段排序 -// List stages = ciCdPipelineVO.getDevopsCiStageVOS().stream() -// .sorted(Comparator.comparing(DevopsCiStageVO::getSequence)) -// .map(DevopsCiStageVO::getName) -// .collect(Collectors.toList()); -// -// GitlabCi gitlabCi = new GitlabCi(); -// -// // 如果用户指定了就使用用户指定的,如果没有指定就使用默认的猪齿鱼提供的镜像 -// gitlabCi.setImage(ObjectUtils.isEmpty(ciCdPipelineVO.getImage()) ? defaultCiImage : ciCdPipelineVO.getImage()); -// -// gitlabCi.setStages(stages); -// ciCdPipelineVO.getDevopsCiStageVOS().forEach(stageVO -> { -// if (!CollectionUtils.isEmpty(stageVO.getJobList())) { -// stageVO.getJobList().forEach(job -> { -// if (CiJobTypeEnum.CUSTOM.value().equals(job.getType())) { -// return; -// } -// CiJob ciJob = new CiJob(); -// if (StringUtils.isNoneBlank(job.getImage())) { -// ciJob.setImage(job.getImage()); -// } -// ciJob.setStage(stageVO.getName()); -// ciJob.setParallel(job.getParallel()); -// //增加afterScript -//// ciJob.setAfterScript(buildAfterScript(job)); -// //增加services -// CiJobServices ciJobServices = buildServices(job); -// ciJob.setServices(Objects.isNull(ciJobServices) ? null : ArrayUtil.singleAsList(ciJobServices)); -// ciJob.setScript(buildScript(Objects.requireNonNull(organizationId), projectId, job)); -// ciJob.setCache(buildJobCache(job)); -// processOnlyAndExcept(job, ciJob); -// gitlabCi.addJob(job.getName(), ciJob); -// }); -// } -// }); -// buildBeforeScript(gitlabCi, ciCdPipelineVO.getVersionName()); -// return gitlabCi; -// } - -// private List buildAfterScript(DevopsCiJobVO jobVO) { -// List afterScript = new ArrayList<>(); -// if (isContainDokcerBuild(jobVO)) { -// afterScript.add("rm -rf /${CI_PROJECT_NAMESPACE}-${CI_PROJECT_NAME}-${CI_COMMIT_SHA}/${PROJECT_NAME}.tar"); -// return afterScript; -// } else { -// return null; -// } -// } - - -// private CiJobServices buildServices(DevopsCiJobVO jobVO) { -// CiJobServices ciJobServices = new CiJobServices(); -// if (isContainDokcerBuild(jobVO)) { -// ciJobServices.setName(defaultCiImage); -// ciJobServices.setAlias("kaniko"); -// return ciJobServices; -// } else { -// return null; -// } -// } - -// private boolean isContainDokcerBuild(DevopsCiJobVO jobVO) { -// if (Objects.isNull(jobVO)) { -// return false; -// } -// if (JobTypeEnum.BUILD.value().equals(jobVO.getType())) { -// CiConfigVO ciConfigVO = jobVO.getConfigVO(); -// if (ciConfigVO == null || CollectionUtils.isEmpty(ciConfigVO.getConfig())) { -// return false; -// } -// if (!CollectionUtils.isEmpty(ciConfigVO.getConfig().stream().filter(ciConfigTemplateVO -> StringUtils.equalsIgnoreCase(ciConfigTemplateVO.getType().trim(), CiJobScriptTypeEnum.DOCKER.getType())).collect(Collectors.toList()))) { -// return true; -// } -// } -// return false; -// } - /** * 处理job的触发方式 * @@ -2021,70 +1814,6 @@ private void processOnlyAndExcept(DevopsCiJobDTO devopsCiJobDTO, CiJob ciJob) { } } - /** - * 处理job的触发方式 - * - * @param metadata job元数据 - * @param ciJob ci文件的job对象 - */ - private void processOnlyAndExcept(DevopsCiJobVO metadata, CiJob ciJob) { - if (StringUtils.isNotBlank(metadata.getTriggerType()) - && StringUtils.isNotBlank(metadata.getTriggerValue())) { - CiTriggerType ciTriggerType = CiTriggerType.forValue(metadata.getTriggerType()); - if (ciTriggerType != null) { - String triggerValue = metadata.getTriggerValue(); - switch (ciTriggerType) { - case REFS: - GitlabCiUtil.processTriggerRefs(ciJob, triggerValue); - break; - case EXACT_MATCH: - GitlabCiUtil.processExactMatch(ciJob, triggerValue); - break; - case REGEX_MATCH: - GitlabCiUtil.processRegexMatch(ciJob, triggerValue); - break; - case EXACT_EXCLUDE: - GitlabCiUtil.processExactExclude(ciJob, triggerValue); - break; - } - } - } - } - - private static MavenRepoVO convertRepo(NexusMavenRepoDTO nexusMavenRepoDTO) { - MavenRepoVO mavenRepoVO = new MavenRepoVO(); - mavenRepoVO.setName(nexusMavenRepoDTO.getName()); - mavenRepoVO.setPrivateRepo(Boolean.TRUE); - if ("MIXED".equals(nexusMavenRepoDTO.getVersionPolicy())) { - mavenRepoVO.setType(GitOpsConstants.SNAPSHOT + "," + GitOpsConstants.RELEASE); - } else { - // group 类型的仓库没有版本类型 - mavenRepoVO.setType(nexusMavenRepoDTO.getVersionPolicy() == null ? null : nexusMavenRepoDTO.getVersionPolicy().toLowerCase()); - } - mavenRepoVO.setUrl(nexusMavenRepoDTO.getUrl()); - mavenRepoVO.setUsername(nexusMavenRepoDTO.getNeUserId()); - mavenRepoVO.setPassword(nexusMavenRepoDTO.getNeUserPassword()); - return mavenRepoVO; - } - - /** - * 生成maven构建相关的脚本 - * - * @param projectId 项目id - * @param jobId job id - * @param ciConfigTemplateVO maven构建阶段的信息 - * @param hasSettings 这个阶段是否有配置settings - * @return 生成的shell脚本 - */ - private List buildMavenScripts(final Long projectId, final Long jobId, CiConfigTemplateVO ciConfigTemplateVO, boolean hasSettings) { - List shells = GitlabCiUtil.filterLines(GitlabCiUtil.splitLinesForShell(ciConfigTemplateVO.getScript()), true, true); - if (hasSettings) { - // 插入shell指令将配置的settings文件下载到项目目录下 - shells.add(0, GitlabCiUtil.downloadMavenSettings(projectId, jobId, ciConfigTemplateVO.getSequence())); - } - return shells; - } - /** * 把配置转换为gitlab-ci配置(maven,sonarqube) * @@ -2117,203 +1846,6 @@ private List buildScript(final Long organizationId, final Long projectId return result; } -// /** -// * 把配置转换为gitlab-ci配置(maven,sonarqube) -// * -// * @param organizationId 组织id -// * @param projectId 项目id -// * @param jobVO 生成脚本 -// * @return 生成的脚本列表 -// */ -// private List buildScript(final Long organizationId, final Long projectId, DevopsCiJobVO jobVO) { -// Assert.notNull(jobVO, "Job can't be null"); -// Assert.notNull(organizationId, "Organization id can't be null"); -// Assert.notNull(projectId, "project id can't be null"); -// final Long jobId = jobVO.getId(); -// Assert.notNull(jobId, "Ci job id is required."); -// -// if (JobTypeEnum.SONAR.value().equals(jobVO.getType())) { -// return calculateSonarScript(jobVO); -// } else if (JobTypeEnum.BUILD.value().equals(jobVO.getType())) { -// // 将构建类型的stage中的job的每个step进行解析和转化 -// CiConfigVO ciConfigVO = jobVO.getConfigVO(); -// if (ciConfigVO == null || CollectionUtils.isEmpty(ciConfigVO.getConfig())) { -// return Collections.emptyList(); -// } -// -// List existedSequences = new ArrayList<>(); -// // 校验前端传入的sequence不为null且不重复 -// ciConfigVO.getConfig().forEach(config -> DevopsCiPipelineAdditionalValidator.validConfigSequence(config.getSequence(), config.getName(), existedSequences)); -// -// // 最后生成的所有script集合 -// List result = new ArrayList<>(); -// -// // 同一个job中的所有step要按照sequence顺序来 -// // 将每一个step都转为一个List并将所有的list合并为一个 -// ciConfigVO.getConfig() -// .stream() -// .sorted(Comparator.comparingLong(CiConfigTemplateVO::getSequence)) -// .forEach(config -> { -// CiJobScriptTypeEnum type = CiJobScriptTypeEnum.forType(config.getType().toLowerCase()); -// if (type == null) { -// throw new CommonException(ERROR_UNSUPPORTED_STEP_TYPE, config.getType()); -// } -// -// switch (type) { -// // GO和NPM是一样处理 -// case NPM: -// result.addAll(GitlabCiUtil.filterLines(GitlabCiUtil.splitLinesForShell(config.getScript()), true, true)); -// break; -// case MAVEN: -// // 处理settings文件 -// DevopsCiPipelineAdditionalValidator.validateMavenStep(config); -// boolean hasSettings = buildAndSaveMavenSettings(projectId, jobId, config); -// result.addAll(buildMavenScripts(projectId, jobId, config, hasSettings)); -// break; -// case DOCKER: -// // 不填skipDockerTlsVerify参数或者填TRUE都是跳过证书校验 -// // TODO 修复 目前后端这个参数的含义是是否跳过证书校验, 前端的含义是是否进行证书校验 -// Boolean doTlsVerify = config.getSkipDockerTlsVerify(); -// //是否开启镜像扫描 默认是关闭镜像扫描的 -// Boolean imageScan = config.getImageScan(); -// result.addAll(GitlabCiUtil.generateDockerScripts( -// config.getDockerContextDir(), -// config.getDockerFilePath(), -// doTlsVerify == null || !doTlsVerify, -// Objects.isNull(imageScan) ? false : imageScan, jobVO.getId())); -// break; -// // 上传JAR包阶段是没有选择项目依赖的, 同样也可以复用maven deploy的逻辑 -// case UPLOAD_JAR: -// case MAVEN_DEPLOY: -// List targetRepos = new ArrayList<>(); -// boolean hasMavenSettings = buildAndSaveJarDeployMavenSettings(projectId, jobId, config, targetRepos); -// result.addAll(buildMavenJarDeployScripts(projectId, jobId, hasMavenSettings, config, targetRepos)); -// break; -// default: -// } -// }); -// -// return result; -// } else if (JobTypeEnum.CHART.value().equals(jobVO.getType())) { -// // 生成chart步骤 -// return ArrayUtil.singleAsList(GitlabCiUtil.generateChartBuildScripts()); -// } -// return Collections.emptyList(); -// } - - /** - * 计算sonar脚本 - * - * @param jobVO - * @return - */ - private List calculateSonarScript(DevopsCiJobVO jobVO) { - // sonar配置转化为gitlab-ci配置 - List scripts = new ArrayList<>(); - SonarQubeConfigVO sonarQubeConfigVO = JSONObject.parseObject(jobVO.getMetadata(), SonarQubeConfigVO.class); - if (SonarScannerType.SONAR_SCANNER.value().equals(sonarQubeConfigVO.getScannerType())) { - if (CiSonarConfigType.DEFAULT.value().equals(sonarQubeConfigVO.getConfigType())) { - // 查询默认的sonarqube配置 - DevopsConfigDTO sonarConfig = devopsConfigService.baseQueryByName(null, DEFAULT_SONAR_NAME); - CommonExAssertUtil.assertTrue(sonarConfig != null, "error.default.sonar.not.exist"); - scripts.add(GitlabCiUtil.getDefaultSonarScannerCommand(sonarQubeConfigVO.getSources())); - } else if (CiSonarConfigType.CUSTOM.value().equals(sonarQubeConfigVO.getConfigType())) { - if (Objects.isNull(sonarQubeConfigVO.getSonarUrl())) { - throw new CommonException("error.sonar.url.is.null"); - } - if (SonarAuthType.USERNAME_PWD.value().equals(sonarQubeConfigVO.getAuthType())) { - scripts.add(GitlabCiUtil.renderSonarScannerCommand(sonarQubeConfigVO.getSonarUrl(), sonarQubeConfigVO.getUsername(), sonarQubeConfigVO.getPassword(), sonarQubeConfigVO.getSources())); - } else if (SonarAuthType.TOKEN.value().equals(sonarQubeConfigVO.getAuthType())) { - scripts.add(GitlabCiUtil.renderSonarScannerCommandForToken(sonarQubeConfigVO.getSonarUrl(), sonarQubeConfigVO.getToken(), sonarQubeConfigVO.getSources())); - } - } else { - throw new CommonException("error.sonar.config.type.not.supported", sonarQubeConfigVO.getConfigType()); - } - } else if (SonarScannerType.SONAR_MAVEN.value().equals(sonarQubeConfigVO.getScannerType())) { - if (CiSonarConfigType.DEFAULT.value().equals(sonarQubeConfigVO.getConfigType())) { - // 查询默认的sonarqube配置 - DevopsConfigDTO sonarConfig = devopsConfigService.baseQueryByName(null, DEFAULT_SONAR_NAME); - CommonExAssertUtil.assertTrue(sonarConfig != null, "error.default.sonar.not.exist"); - scripts.add(GitlabCiUtil.getDefaultSonarCommand(sonarQubeConfigVO.getSkipTests())); - } else if (CiSonarConfigType.CUSTOM.value().equals(sonarQubeConfigVO.getConfigType())) { - if (Objects.isNull(sonarQubeConfigVO.getSonarUrl())) { - throw new CommonException("error.sonar.url.is.null"); - } - if (SonarAuthType.USERNAME_PWD.value().equals(sonarQubeConfigVO.getAuthType())) { - scripts.add(GitlabCiUtil.renderSonarCommand(sonarQubeConfigVO.getSonarUrl(), sonarQubeConfigVO.getUsername(), sonarQubeConfigVO.getPassword(), sonarQubeConfigVO.getSkipTests())); - } else if (SonarAuthType.TOKEN.value().equals(sonarQubeConfigVO.getAuthType())) { - scripts.add(GitlabCiUtil.renderSonarCommandForToken(sonarQubeConfigVO.getSonarUrl(), sonarQubeConfigVO.getToken(), sonarQubeConfigVO.getSkipTests())); - } - } else { - throw new CommonException("error.sonar.config.type.not.supported", sonarQubeConfigVO.getConfigType()); - } - } else { - throw new CommonException(ResourceCheckConstant.ERROR_SONAR_SCANNER_TYPE_INVALID); - } - return scripts; - } - - /** - * 生成并存储maven settings到数据库 - * - * @param projectId 项目id - * @param jobId job id - * @param ciConfigTemplateVO 配置信息 - * @return true表示有settings配置,false表示没有 - */ - private boolean buildAndSaveMavenSettings(Long projectId, Long jobId, CiConfigTemplateVO ciConfigTemplateVO) { - // settings文件内容 - String settings; - final List repos = new ArrayList<>(); - - // 是否有手动填写仓库表单 - final boolean hasManualRepos = !CollectionUtils.isEmpty(ciConfigTemplateVO.getRepos()); - // 是否有选择已有的maven仓库 - final boolean hasNexusRepos = !CollectionUtils.isEmpty(ciConfigTemplateVO.getNexusMavenRepoIds()); - - if (!StringUtils.isEmpty(ciConfigTemplateVO.getMavenSettings())) { - // 使用用户提供的xml内容,不进行内容的校验 - settings = Base64Util.getBase64DecodedString(ciConfigTemplateVO.getMavenSettings()); - } else if (hasManualRepos || hasNexusRepos) { - if (hasNexusRepos) { - // 用户选择的已有的maven仓库 - List nexusMavenRepoDTOs = rdupmClientOperator.getRepoUserByProject(null, projectId, ciConfigTemplateVO.getNexusMavenRepoIds()); - repos.addAll(nexusMavenRepoDTOs.stream().map(DevopsCiPipelineServiceImpl::convertRepo).collect(Collectors.toList())); - } - - if (hasManualRepos) { - // 由用户填写的表单构建xml文件内容 - repos.addAll(ciConfigTemplateVO.getRepos()); - } - - // 构建settings文件 - settings = buildSettings(repos); - } else { - // 没有填关于settings的信息 - return false; - } - - // 这里存储的ci setting文件内容是解密后的 - DevopsCiMavenSettingsDTO devopsCiMavenSettingsDTO = new DevopsCiMavenSettingsDTO(jobId, ciConfigTemplateVO.getSequence(), settings); - MapperUtil.resultJudgedInsert(devopsCiMavenSettingsMapper, devopsCiMavenSettingsDTO, ERROR_CI_MAVEN_SETTINGS_INSERT); - return true; - } - - @Nullable - private Cache buildJobCache(DevopsCiJobVO jobConfig) { - boolean isToUpload = Boolean.TRUE.equals(jobConfig.getToUpload()); - boolean isToDownload = Boolean.TRUE.equals(jobConfig.getToDownload()); - if (isToUpload && isToDownload) { - return constructCache(CachePolicy.PULL_PUSH.getValue()); - } else if (isToDownload) { - return constructCache(CachePolicy.PULL.getValue()); - } else if (isToUpload) { - return constructCache(CachePolicy.PUSH.getValue()); - } else { - return null; - } - } - @Nullable private Cache buildJobCache(DevopsCiJobDTO jobConfig) { boolean isToUpload = Boolean.TRUE.equals(jobConfig.getToUpload()); @@ -2351,124 +1883,6 @@ private void buildBeforeScript(GitlabCi gitlabCi, String versionName) { gitlabCi.setBeforeScript(beforeScripts); } - /** - * 生成jar包发布相关的脚本 - * - * @param projectId 项目id - * @param jobId job id - * @param hasSettings 是否有settings配置 - * @param ciConfigTemplateVO maven发布软件包阶段的信息 - * @param targetMavenRepoVO 目标制品库仓库信息 - * @return 生成的shell脚本 - */ - private List buildMavenJarDeployScripts(final Long projectId, final Long jobId, final boolean hasSettings, CiConfigTemplateVO ciConfigTemplateVO, List targetMavenRepoVO) { - List shells = new ArrayList<>(); - // 这里这么写是为了考虑之后可能选了多个仓库, 如果是多个仓库的话, 变量替换不便 - // TODO 重构逻辑 - List templateShells = GitlabCiUtil.filterLines(GitlabCiUtil.splitLinesForShell(ciConfigTemplateVO.getScript()), true, true); - // 如果有settings配置, 填入获取settings的指令 - if (hasSettings) { - shells.add(GitlabCiUtil.downloadMavenSettings(projectId, jobId, ciConfigTemplateVO.getSequence())); - } - // 根据目标仓库信息, 渲染发布jar包的指令 - if (!CollectionUtils.isEmpty(targetMavenRepoVO)) { - // 插入shell指令将配置的settings文件下载到项目目录下 - - // 包含repoId锚点的字符串在templateShells中的索引号 - int repoIdIndex = -1; - // 包含repoUrl锚点的字符串在templateShells中的索引号 - int repoUrlIndex = -1; - // 寻找包含这两个锚点的字符串位置 - for (int i = 0; i < templateShells.size(); i++) { - if (repoIdIndex == -1 && templateShells.get(i).contains(GitOpsConstants.CHOERODON_MAVEN_REPO_ID)) { - repoIdIndex = i; - } - if (repoUrlIndex == -1 && templateShells.get(i).contains(GitOpsConstants.CHOERODON_MAVEN_REPO_URL)) { - repoUrlIndex = i; - } - if (repoIdIndex != -1 && repoUrlIndex != -1) { - // 没必要再找了 - break; - } - } - - // 为每一个仓库都从模板的脚本中加一份生成的命令 - for (MavenRepoVO repo : targetMavenRepoVO) { - // 将预定的变量(仓库名和地址)替换为settings.xml文件指定的 - List commands = new ArrayList<>(templateShells); - if (repoIdIndex != -1) { - commands.set(repoIdIndex, commands.get(repoIdIndex).replace(GitOpsConstants.CHOERODON_MAVEN_REPO_ID, repo.getName())); - } - if (repoUrlIndex != -1) { - commands.set(repoUrlIndex, commands.get(repoUrlIndex).replace(GitOpsConstants.CHOERODON_MAVEN_REPO_URL, repo.getUrl())); - } - shells.addAll(commands); - } - - // 只生成一个jar包元数据上传指令用于CD阶段 - //加上jobId 与sequence,用于查询jar包的时间戳 - shells.add(GitlabCiUtil.saveJarMetadata(ciConfigTemplateVO.getMavenDeployRepoSettings().getNexusRepoIds(), jobId, ciConfigTemplateVO.getSequence())); - } else { - // 如果没有目标仓库信息, 则认为用户是自己填入好了maven发布jar的指令, 不需要渲染 - shells.addAll(templateShells); - } - return shells; - } - - /** - * 生成并存储maven settings到数据库 - * - * @param projectId 项目id - * @param jobId job id - * @param ciConfigTemplateVO 配置 - * @param targetRepoContainer 用来存放解析出的目标仓库信息 - * @return 返回true表示有settings信息 - */ - private boolean buildAndSaveJarDeployMavenSettings(Long projectId, Long jobId, CiConfigTemplateVO ciConfigTemplateVO, List targetRepoContainer) { - MavenDeployRepoSettings mavenDeployRepoSettings = ciConfigTemplateVO.getMavenDeployRepoSettings(); - Long sequence = ciConfigTemplateVO.getSequence(); - Set dependencyRepoIds = ciConfigTemplateVO.getNexusMavenRepoIds(); - List dependencyRepos = ciConfigTemplateVO.getRepos(); - - boolean targetRepoEmpty = mavenDeployRepoSettings.getNexusRepoIds() == null; - boolean dependencyRepoIdsEmpty = CollectionUtils.isEmpty(dependencyRepoIds); - boolean dependencyRepoEmpty = CollectionUtils.isEmpty(dependencyRepos); - - // 如果都为空, 不生成settings文件 - if (targetRepoEmpty && dependencyRepoIdsEmpty && dependencyRepoEmpty) { - return false; - } - - // 查询制品库 - List nexusMavenRepoDTOs = rdupmClientOperator.getRepoUserByProject(null, projectId, ArrayUtil.singleAsSet(mavenDeployRepoSettings.getNexusRepoIds())); - - // 如果填入的仓库信息和制品库查出的结果都为空, 不生成settings文件 - if (CollectionUtils.isEmpty(nexusMavenRepoDTOs) && dependencyRepoEmpty) { - return false; - } - - // 转化制品库信息, 并将目标仓库信息取出, 放入targetRepoContainer - List mavenRepoVOS = nexusMavenRepoDTOs.stream().map(r -> { - MavenRepoVO result = convertRepo(r); - // 目标仓库不为空, 并且目标仓库包含 - if (!targetRepoEmpty && mavenDeployRepoSettings.getNexusRepoIds().equals(r.getRepositoryId())) { - targetRepoContainer.add(result); - } - return result; - }).collect(Collectors.toList()); - - // 将手动输入的仓库信息也放入列表 - if (!dependencyRepoEmpty) { - mavenRepoVOS.addAll(dependencyRepos); - } - - // 生成settings文件内容 - String settings = buildSettings(mavenRepoVOS); - DevopsCiMavenSettingsDTO devopsCiMavenSettingsDTO = new DevopsCiMavenSettingsDTO(jobId, sequence, settings); - MapperUtil.resultJudgedInsert(devopsCiMavenSettingsMapper, devopsCiMavenSettingsDTO, ERROR_CI_MAVEN_SETTINGS_INSERT); - return true; - } - private void createUserRel(List cdAuditUserIds, Long projectId, Long pipelineId, Long jobId) { if (!CollectionUtils.isEmpty(cdAuditUserIds)) { // 去重 @@ -2505,8 +1919,8 @@ private void createCdJob(DevopsCdJobVO t, Long projectId, Long stageId, Long pip devopsDeployAppCenterService.checkNameAndCodeUniqueAndThrow(devopsCdEnvDeployInfoDTO.getEnvId(), rdupmType, null, devopsCdEnvDeployInfoDTO.getAppName(), devopsCdEnvDeployInfoDTO.getAppCode()); } else { DevopsDeployAppCenterEnvDTO devopsDeployAppCenterEnvDTO = devopsDeployAppCenterService.selectByPrimaryKey(devopsCdEnvDeployInfoDTO.getAppId()); - devopsCdEnvDeployInfoDTO.setAppCode(devopsDeployAppCenterEnvDTO.getName()); - devopsCdEnvDeployInfoDTO.setAppName(devopsDeployAppCenterEnvDTO.getCode()); + devopsCdEnvDeployInfoDTO.setAppCode(devopsDeployAppCenterEnvDTO.getCode()); + devopsCdEnvDeployInfoDTO.setAppName(devopsDeployAppCenterEnvDTO.getName()); } // 使用不进行主键加密的json工具再将json写入类, 用于在数据库存非加密数据 devopsCdJobDTO.setMetadata(JsonHelper.marshalByJackson(devopsDeployInfoVO)); @@ -2580,34 +1994,6 @@ private void createCdJob(DevopsCdJobVO t, Long projectId, Long stageId, Long pip } - /** - * 主机部署 关联ci任务 - * 对于创建或更新根据任务名称获取id - * - * @param pipelineId - * @param ciJobName - * @return - */ - @Transactional(propagation = Propagation.REQUIRES_NEW, isolation = Isolation.READ_UNCOMMITTED) - public Long getCiJobId(Long pipelineId, String ciJobName) { - DevopsCiJobDTO devopsCiJobDTO = new DevopsCiJobDTO(); - devopsCiJobDTO.setCiPipelineId(pipelineId); - devopsCiJobDTO.setName(ciJobName); - List ciJobDTOList = devopsCiJobMapper.select(devopsCiJobDTO); - if (CollectionUtils.isEmpty(ciJobDTOList)) { - throw new CommonException("error.get.ci.job.id"); - } - return ciJobDTOList.get(0).getId(); - } - - private void updateExtraInfoToNull(DevopsCdEnvDeployInfoDTO devopsCdEnvDeployInfoDTO) { - devopsCdEnvDeployInfoDTO.setId(null); - devopsCdEnvDeployInfoDTO.setCreatedBy(null); - devopsCdEnvDeployInfoDTO.setCreationDate(null); - devopsCdEnvDeployInfoDTO.setLastUpdatedBy(null); - devopsCdEnvDeployInfoDTO.setLastUpdateDate(null); - } - public void checkCdHostJobName(Long ciPipelineId, CdHostDeployConfigVO deployConfigVO, String cdHostName, DevopsCdJobDTO devopsCdJobDTO) { DevopsCiJobDTO devopsCiJobDTO = new DevopsCiJobDTO(); devopsCiJobDTO.setCiPipelineId(ciPipelineId); @@ -2629,16 +2015,4 @@ public void checkCdHostJobName(Long ciPipelineId, CdHostDeployConfigVO deployCon } } } - -// /** -// * 将job中的metadata字段解密 -// * -// * @param devopsCiJobVO job数据 -// */ -// private void decryptCiBuildMetadata(DevopsCiJobVO devopsCiJobVO) { -// if (JobTypeEnum.BUILD.value().equals(devopsCiJobVO.getType())) { -// // 解密json字符串中的加密的主键 -// devopsCiJobVO.setMetadata(JsonHelper.marshalByJackson(KeyDecryptHelper.decryptJson(devopsCiJobVO.getMetadata(), CiConfigVO.class))); -// } -// } } diff --git a/src/main/java/io/choerodon/devops/app/service/impl/DevopsCiStageServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/DevopsCiStageServiceImpl.java index 6fff0f3cd4..f667fb7358 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/DevopsCiStageServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/DevopsCiStageServiceImpl.java @@ -2,6 +2,9 @@ import java.util.List; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + import io.choerodon.core.exception.CommonException; import io.choerodon.devops.api.vo.DevopsCiStageVO; import io.choerodon.devops.app.service.DevopsCiStageService; @@ -9,9 +12,6 @@ import io.choerodon.devops.infra.mapper.DevopsCiStageMapper; import io.choerodon.devops.infra.util.ConvertUtils; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - /** * 〈功能简述〉 * 〈〉 @@ -24,7 +24,6 @@ public class DevopsCiStageServiceImpl implements DevopsCiStageService { private static final String CREATE_STAGE_FAILED = "create.stage.failed"; private static final String DELETE_STAGE_FAILED = "delete.stage.failed"; - private static final String UPDATE_STAGE_FAILED = "update.stage.failed"; private static final String ERROR_PIPELINE_ID_IS_NULL = "error.pipeline.id.is.null"; private DevopsCiStageMapper devopsCiStageMapper; diff --git a/src/main/java/io/choerodon/devops/app/service/impl/DevopsClusterOperatingRecordServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/DevopsClusterOperatingRecordServiceImpl.java index 766c9d96f3..50653282c9 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/DevopsClusterOperatingRecordServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/DevopsClusterOperatingRecordServiceImpl.java @@ -1,7 +1,5 @@ package io.choerodon.devops.app.service.impl; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; @@ -24,7 +22,6 @@ @Service public class DevopsClusterOperatingRecordServiceImpl implements DevopsClusterOperatingRecordService { - private static final Logger LOGGER = LoggerFactory.getLogger(DevopsClusterOperatingRecordServiceImpl.class); @Autowired private DevopsClusterOperationRecordMapper devopsClusterOperationRecordMapper; diff --git a/src/main/java/io/choerodon/devops/app/service/impl/DevopsClusterResourceServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/DevopsClusterResourceServiceImpl.java index 1b62d48a5d..99d61bb57c 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/DevopsClusterResourceServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/DevopsClusterResourceServiceImpl.java @@ -612,17 +612,6 @@ private Boolean checkValidity(Date date, Date validFrom, Date validUntil) { && date.after(validFrom) && date.before(validUntil); } - private DevopsPvcReqVO operatePV(Long pvId, Long envId, String name) { - DevopsPvcReqVO devopsPvcReqVO = new DevopsPvcReqVO(); - DevopsPvVO devopsPvVO = devopsPvService.queryById(pvId); - devopsPvcReqVO.setPvId(devopsPvVO.getId()); - devopsPvcReqVO.setName(name + "-" + GenerateUUID.generateUUID().substring(0, 10)); - devopsPvcReqVO.setAccessModes(devopsPvVO.getAccessModes()); - devopsPvcReqVO.setRequestResource(devopsPvVO.getRequestResource()); - devopsPvcReqVO.setEnvId(envId); - return devopsPvcReqVO; - } - private DevopsClusterDTO checkClusterExist(Long clusterId) { DevopsClusterDTO devopsClusterDTO = devopsClusterService.baseQuery(clusterId); if (devopsClusterDTO == null) { diff --git a/src/main/java/io/choerodon/devops/app/service/impl/DevopsClusterServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/DevopsClusterServiceImpl.java index 1b98f5aed2..1b53e046cf 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/DevopsClusterServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/DevopsClusterServiceImpl.java @@ -68,7 +68,6 @@ public class DevopsClusterServiceImpl implements DevopsClusterService { private static final String ERROR_CLUSTER_NOT_EXIST = "error.cluster.not.exist"; private static final String ERROR_UPDATE_CLUSTER_STATUS_FAILED = "error.update.cluster.status.failed"; - private static final String PROJECT_OWNER = "role/project/default/project-owner"; private static final String ERROR_ORGANIZATION_CLUSTER_NUM_MAX = "error.organization.cluster.num.max"; @Value("${agent.version}") diff --git a/src/main/java/io/choerodon/devops/app/service/impl/DevopsConfigMapServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/DevopsConfigMapServiceImpl.java index 290d84d753..d23a4486be 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/DevopsConfigMapServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/DevopsConfigMapServiceImpl.java @@ -1,7 +1,5 @@ package io.choerodon.devops.app.service.impl; -import static io.choerodon.devops.infra.constant.MiscConstants.*; - import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import io.choerodon.core.domain.Page; @@ -23,8 +21,8 @@ import io.choerodon.devops.infra.util.*; import io.choerodon.mybatis.pagehelper.PageHelper; import io.choerodon.mybatis.pagehelper.domain.PageRequest; -import io.kubernetes.client.models.V1ConfigMap; -import io.kubernetes.client.models.V1ObjectMeta; +import io.kubernetes.client.openapi.models.V1ConfigMap; +import io.kubernetes.client.openapi.models.V1ObjectMeta; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; @@ -34,6 +32,8 @@ import java.util.List; import java.util.Map; +import static io.choerodon.devops.infra.constant.MiscConstants.*; + @Service public class DevopsConfigMapServiceImpl implements DevopsConfigMapService { public static final String CONFIGMAP = "ConfigMap"; @@ -225,7 +225,7 @@ public void delete(Long projectId, Long configMapId) { TypeUtil.objToInteger(devopsEnvironmentDTO.getGitlabEnvProjectId()), CONFIG_MAP_PREFIX + devopsConfigMapDTO.getName() + ".yaml", "DELETE FILE", - TypeUtil.objToInteger(userAttrDTO.getGitlabUserId()), "master"); + TypeUtil.objToInteger(userAttrDTO.getGitlabUserId()), MASTER); } return; } else { diff --git a/src/main/java/io/choerodon/devops/app/service/impl/DevopsConfigServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/DevopsConfigServiceImpl.java index dcf2ffbf8f..045c68dc3c 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/DevopsConfigServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/DevopsConfigServiceImpl.java @@ -1,9 +1,8 @@ package io.choerodon.devops.app.service.impl; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Set; +import static io.choerodon.devops.infra.constant.MiscConstants.DEFAULT_CHART_NAME; + +import java.util.*; import com.google.gson.Gson; import org.springframework.beans.BeanUtils; @@ -19,13 +18,11 @@ import io.choerodon.devops.api.vo.DefaultConfigVO; import io.choerodon.devops.api.vo.DevopsConfigRepVO; import io.choerodon.devops.api.vo.DevopsConfigVO; -import io.choerodon.devops.app.service.AppServiceService; -import io.choerodon.devops.app.service.AppServiceVersionService; -import io.choerodon.devops.app.service.DevopsConfigService; -import io.choerodon.devops.app.service.DevopsProjectService; +import io.choerodon.devops.app.service.*; import io.choerodon.devops.infra.constant.MiscConstants; import io.choerodon.devops.infra.dto.AppServiceDTO; import io.choerodon.devops.infra.dto.DevopsConfigDTO; +import io.choerodon.devops.infra.dto.DevopsHelmConfigDTO; import io.choerodon.devops.infra.dto.DevopsProjectDTO; import io.choerodon.devops.infra.dto.iam.ProjectDTO; import io.choerodon.devops.infra.dto.iam.Tenant; @@ -45,11 +42,8 @@ public class DevopsConfigServiceImpl implements DevopsConfigService { private static final String HARBOR = "harbor"; private static final String AUTHTYPE_PULL = "pull"; - private static final String AUTHTYPE_PUSH = "push"; private static final String CHART = "chart"; private static final Gson gson = new Gson(); - private static final String USER_PREFIX = "pullUser%s%s"; - private static final String ERROR_CREATE_HARBOR_USER = "error.create.harbor.user"; @Autowired private DevopsConfigMapper devopsConfigMapper; @@ -61,39 +55,73 @@ public class DevopsConfigServiceImpl implements DevopsConfigService { private AppServiceService appServiceService; @Autowired private AppServiceVersionService appServiceVersionService; + @Autowired + private DevopsHelmConfigService devopsHelmConfigService; @Override public void operate(Long resourceId, String resourceType, List devopsConfigVOS) { devopsConfigVOS.forEach(devopsConfigVO -> { - //根据每个配置的默认还是自定义执行不同逻辑 - DevopsConfigDTO devopsConfigDTO = baseQueryByResourceAndType(resourceId, resourceType, devopsConfigVO.getType()); - if (devopsConfigVO.getCustom()) { - //根据配置所在的资源层级,查询出数据库中是否存在 - DevopsConfigDTO newDevopsConfigDTO = voToDto(devopsConfigVO); - if (devopsConfigDTO != null) { - // 存在判断是否已经生成服务版本,无服务版本,直接覆盖更新;有服务版本,将原config对应的resourceId设置为null,新建config - if (appServiceVersionService.isVersionUseConfig(devopsConfigDTO.getId(), devopsConfigVO.getType())) { - updateResourceId(devopsConfigDTO.getId()); - setResourceId(resourceId, resourceType, newDevopsConfigDTO); - newDevopsConfigDTO.setId(null); - baseCreate(newDevopsConfigDTO); - } else { - newDevopsConfigDTO.setId(devopsConfigDTO.getId()); - setResourceId(resourceId, resourceType, newDevopsConfigDTO); - baseUpdate(newDevopsConfigDTO); + if (devopsConfigVO.getType().equals(CHART)) { + DevopsHelmConfigDTO devopsHelmConfigDTO = new DevopsHelmConfigDTO(); + devopsHelmConfigDTO.setUrl(devopsConfigVO.getConfig().getUrl()); + devopsHelmConfigDTO.setName(UUID.randomUUID().toString()); + devopsHelmConfigDTO.setUsername(devopsConfigVO.getConfig().getUserName()); + devopsHelmConfigDTO.setPassword(devopsConfigVO.getConfig().getPassword()); + if (!ObjectUtils.isEmpty(devopsHelmConfigDTO.getUsername()) && !ObjectUtils.isEmpty(devopsHelmConfigDTO.getPassword())) { + devopsHelmConfigDTO.setRepoPrivate(true); + } else { + devopsHelmConfigDTO.setRepoPrivate(false); + } + + devopsHelmConfigDTO.setResourceType(ResourceLevel.ORGANIZATION.value()); + devopsHelmConfigDTO.setResourceId(resourceId); + devopsHelmConfigDTO.setRepoDefault(true); + DevopsHelmConfigDTO oldConfigDTO = devopsHelmConfigService.queryDefaultDevopsHelmConfigByLevel(ResourceLevel.ORGANIZATION.value(), resourceId); + if (oldConfigDTO == null) { + devopsHelmConfigService.createDevopsHelmConfig(devopsHelmConfigDTO); + } else if (oldConfigDTO.getUrl().equals(devopsHelmConfigDTO.getUrl())) { + if (!oldConfigDTO.getUsername().equals(devopsHelmConfigDTO.getUsername()) + || !oldConfigDTO.getPassword().equals(devopsHelmConfigDTO.getPassword())) { + devopsHelmConfigDTO.setId(oldConfigDTO.getId()); + devopsHelmConfigDTO.setObjectVersionNumber(oldConfigDTO.getObjectVersionNumber()); + devopsHelmConfigService.updateDevopsHelmConfig(devopsHelmConfigDTO); } } else { - setResourceId(resourceId, resourceType, newDevopsConfigDTO); - newDevopsConfigDTO.setId(null); - baseCreate(newDevopsConfigDTO); + oldConfigDTO.setRepoDefault(false); + devopsHelmConfigService.updateDevopsHelmConfig(oldConfigDTO); + devopsHelmConfigService.createDevopsHelmConfig(devopsHelmConfigDTO); } } else { - //根据配置所在的资源层级,查询出数据库中是否存在,存在则删除 - if (devopsConfigDTO != null) { - if (appServiceVersionService.isVersionUseConfig(devopsConfigDTO.getId(), devopsConfigVO.getType())) { - updateResourceId(devopsConfigDTO.getId()); + //根据每个配置的默认还是自定义执行不同逻辑 + DevopsConfigDTO devopsConfigDTO = baseQueryByResourceAndType(resourceId, resourceType, devopsConfigVO.getType()); + if (devopsConfigVO.getCustom()) { + //根据配置所在的资源层级,查询出数据库中是否存在 + DevopsConfigDTO newDevopsConfigDTO = voToDto(devopsConfigVO); + if (devopsConfigDTO != null) { + // 存在判断是否已经生成服务版本,无服务版本,直接覆盖更新;有服务版本,将原config对应的resourceId设置为null,新建config + if (appServiceVersionService.isVersionUseConfig(devopsConfigDTO.getId(), devopsConfigVO.getType())) { + updateResourceId(devopsConfigDTO.getId()); + setResourceId(resourceId, resourceType, newDevopsConfigDTO); + newDevopsConfigDTO.setId(null); + baseCreate(newDevopsConfigDTO); + } else { + newDevopsConfigDTO.setId(devopsConfigDTO.getId()); + setResourceId(resourceId, resourceType, newDevopsConfigDTO); + baseUpdate(newDevopsConfigDTO); + } } else { - baseDelete(devopsConfigDTO.getId()); + setResourceId(resourceId, resourceType, newDevopsConfigDTO); + newDevopsConfigDTO.setId(null); + baseCreate(newDevopsConfigDTO); + } + } else { + //根据配置所在的资源层级,查询出数据库中是否存在,存在则删除 + if (devopsConfigDTO != null) { + if (appServiceVersionService.isVersionUseConfig(devopsConfigDTO.getId(), devopsConfigVO.getType())) { + updateResourceId(devopsConfigDTO.getId()); + } else { + baseDelete(devopsConfigDTO.getId()); + } } } } @@ -180,11 +208,6 @@ public DevopsConfigDTO queryRealConfig(Long resourceId, String resourceType, Str } } - @Override - public DevopsConfigVO queryRealConfigVO(Long resourceId, String resourceType, String configType) { - return dtoToVo(queryRealConfig(resourceId, resourceType, configType, AUTHTYPE_PULL)); - } - @Override public DevopsConfigDTO baseCreate(DevopsConfigDTO devopsConfigDTO) { if (devopsConfigMapper.insert(devopsConfigDTO) != 1) { @@ -219,11 +242,6 @@ public DevopsConfigDTO baseQueryByName(Long projectId, String name) { return devopsConfigMapper.selectOne(paramDO); } - @Override - public DevopsConfigDTO baseCheckByName(String name) { - return devopsConfigMapper.queryByNameWithNoProject(name); - } - @Override public Page basePageByOptions(Long projectId, PageRequest pageable, String params) { Map mapParams = TypeUtil.castMapParams(params); @@ -255,7 +273,7 @@ private DevopsConfigDTO baseQueryDefaultConfig(String type) { if (type.equals(HARBOR)) { devopsConfigDTO.setName(MiscConstants.DEFAULT_HARBOR_NAME); } else { - devopsConfigDTO.setName(MiscConstants.DEFAULT_CHART_NAME); + devopsConfigDTO.setName(DEFAULT_CHART_NAME); } return devopsConfigMapper.selectOne(devopsConfigDTO); } @@ -298,8 +316,6 @@ private void configVOInToRepVO(DevopsConfigRepVO devopsConfigRepVO, DevopsConfig if (devopsConfigVO.getType().equals(HARBOR)) { devopsConfigRepVO.setHarbor(devopsConfigVO); devopsConfigRepVO.setHarborPrivate(devopsConfigVO.getHarborPrivate()); - } else if (devopsConfigVO.getType().equals(CHART)) { - devopsConfigRepVO.setChart(devopsConfigVO); } } @@ -312,16 +328,33 @@ public DevopsConfigRepVO queryConfig(Long resourceId, String resourceType) { DevopsProjectDTO devopsProjectDTO = devopsProjectService.baseQueryByProjectId(resourceId); devopsConfigRepVO.setHarborPrivate(devopsProjectDTO.getHarborProjectIsPrivate()); } + // 设置chart仓库 + DevopsHelmConfigDTO devopsHelmConfigDTO = devopsHelmConfigService.queryDefaultDevopsHelmConfigByLevel(resourceType, resourceId); + if (devopsHelmConfigDTO != null) { + ConfigVO configVO = new ConfigVO(); + configVO.setUrl(devopsHelmConfigDTO.getUrl()); + configVO.setUserName(devopsHelmConfigDTO.getUsername()); + configVO.setPassword(devopsHelmConfigDTO.getPassword()); + configVO.setIsPrivate(devopsHelmConfigDTO.getRepoPrivate()); + + DevopsConfigVO chart = new DevopsConfigVO(); + chart.setType(CHART); + chart.setCustom(true); + chart.setConfig(configVO); + devopsConfigRepVO.setChart(chart); + } return devopsConfigRepVO; } @Override public void operateConfig(Long resourceId, String resourceType, DevopsConfigRepVO devopsConfigRepVO) { List configVOS = new ArrayList<>(); - DevopsConfigVO chart; + DevopsConfigVO chart = null; if (ObjectUtils.isEmpty(devopsConfigRepVO.getChart())) { - chart = new DevopsConfigVO(); - chart.setCustom(false); + if (ResourceLevel.ORGANIZATION.value().equals(resourceType)) { + devopsHelmConfigService.updateDevopsHelmConfigToNonDefaultRepoOnOrganization(resourceId); + return; + } } else { chart = devopsConfigRepVO.getChart(); chart.setCustom(Boolean.TRUE); @@ -340,6 +373,9 @@ public void operateConfig(Long resourceId, String resourceType, DevopsConfigRepV // 用户名和密码要么都为空, 要么都有值 CommonExAssertUtil.assertTrue(((usernameEmpty && passwordEmpty) || (!usernameEmpty && !passwordEmpty)), "error.chart.auth.invalid"); } + if (chart == null) { + return; + } chart.setType(CHART); configVOS.add(chart); operate(resourceId, resourceType, configVOS); @@ -351,6 +387,11 @@ public void deleteByConfigIds(Set configIds) { devopsConfigDTOS.stream().filter(devopsConfigDTO -> devopsConfigDTO.getAppServiceId() != null) .forEach(devopsConfigDTO -> devopsConfigMapper.deleteByPrimaryKey(devopsConfigDTO.getId())); } + + @Override + public List listAllChart() { + return devopsConfigMapper.listAllChart(); + } } diff --git a/src/main/java/io/choerodon/devops/app/service/impl/DevopsCronJobServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/DevopsCronJobServiceImpl.java index 336c4ab8f6..d2dfeb6656 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/DevopsCronJobServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/DevopsCronJobServiceImpl.java @@ -1,17 +1,9 @@ package io.choerodon.devops.app.service.impl; -import static io.choerodon.devops.infra.constant.MiscConstants.CREATE_TYPE; - -import java.time.ZoneId; -import java.time.format.DateTimeFormatter; -import java.util.*; -import java.util.function.Function; -import java.util.stream.Collectors; - -import io.kubernetes.client.JSON; -import io.kubernetes.client.models.V1Container; -import io.kubernetes.client.models.V1ContainerPort; -import io.kubernetes.client.models.V1beta1CronJob; +import io.kubernetes.client.openapi.JSON; +import io.kubernetes.client.openapi.models.V1Container; +import io.kubernetes.client.openapi.models.V1ContainerPort; +import io.kubernetes.client.openapi.models.V1beta1CronJob; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -21,6 +13,14 @@ import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; + +import static io.choerodon.devops.infra.constant.MiscConstants.CREATE_TYPE; + import io.choerodon.core.domain.Page; import io.choerodon.core.exception.CommonException; import io.choerodon.core.utils.ConvertUtils; @@ -89,7 +89,7 @@ public Page pagingByEnvId(Long projectId, Long envId, PageRequest cronJobInfoVO.setActive(v1beta1CronJob.getStatus().getActive() == null ? 0 : v1beta1CronJob.getStatus().getActive().size()); cronJobInfoVO.setSchedule(v1beta1CronJob.getSpec().getSchedule()); - cronJobInfoVO.setSuspend(v1beta1CronJob.getSpec().isSuspend()); + cronJobInfoVO.setSuspend(v1beta1CronJob.getSpec().getSuspend()); cronJobInfoVO.setLabels(v1beta1CronJob.getMetadata().getLabels()); cronJobInfoVO.setCreationTimestamp(v1beta1CronJob.getMetadata().getCreationTimestamp().toString()); List portRes = new ArrayList<>(); @@ -103,7 +103,7 @@ public Page pagingByEnvId(Long projectId, Long envId, PageRequest } cronJobInfoVO.setPorts(portRes); if (v1beta1CronJob.getStatus() != null && v1beta1CronJob.getStatus().getLastScheduleTime() != null) { - cronJobInfoVO.setLastScheduleTime(v1beta1CronJob.getStatus().getLastScheduleTime().toString("yyyy-MM-dd HH:mm:ss")); + cronJobInfoVO.setLastScheduleTime(v1beta1CronJob.getStatus().getLastScheduleTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); } else { ZoneId zoneId = ZoneId.systemDefault(); cronJobInfoVO.setLastScheduleTime(v.getLastUpdateDate().toInstant().atZone(zoneId).toLocalDateTime().format(DATE_TIME_FORMATTER)); diff --git a/src/main/java/io/choerodon/devops/app/service/impl/DevopsDaemonSetServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/DevopsDaemonSetServiceImpl.java index c385aaa46d..89205b3365 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/DevopsDaemonSetServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/DevopsDaemonSetServiceImpl.java @@ -1,17 +1,9 @@ package io.choerodon.devops.app.service.impl; -import static io.choerodon.devops.infra.constant.MiscConstants.CREATE_TYPE; - -import java.time.ZoneId; -import java.time.format.DateTimeFormatter; -import java.util.*; -import java.util.function.Function; -import java.util.stream.Collectors; - -import io.kubernetes.client.JSON; -import io.kubernetes.client.models.V1Container; -import io.kubernetes.client.models.V1ContainerPort; -import io.kubernetes.client.models.V1beta2DaemonSet; +import io.kubernetes.client.openapi.JSON; +import io.kubernetes.client.openapi.models.V1Container; +import io.kubernetes.client.openapi.models.V1ContainerPort; +import io.kubernetes.client.openapi.models.V1DaemonSet; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -21,6 +13,14 @@ import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; + +import static io.choerodon.devops.infra.constant.MiscConstants.CREATE_TYPE; + import io.choerodon.core.domain.Page; import io.choerodon.core.exception.CommonException; import io.choerodon.core.utils.ConvertUtils; @@ -82,7 +82,7 @@ public Page pagingByEnvId(Long projectId, Long envId, PageReque DaemonSetInfoVO daemonSetInfoVO = ConvertUtils.convertObject(v, DaemonSetInfoVO.class); if (detailDTOMap.get(v.getResourceDetailId()) != null) { // 参考实例详情查询逻辑 - V1beta2DaemonSet v1beta2DaemonSet = json.deserialize(detailDTOMap.get(v.getResourceDetailId()).getMessage(), V1beta2DaemonSet.class); + V1DaemonSet v1beta2DaemonSet = json.deserialize(detailDTOMap.get(v.getResourceDetailId()).getMessage(), V1DaemonSet.class); daemonSetInfoVO.setName(v1beta2DaemonSet.getMetadata().getName()); @@ -158,7 +158,7 @@ public DevopsDaemonSetDTO baseQueryByEnvIdAndName(Long envId, String name) { @Override @Transactional(propagation = Propagation.NESTED) public void saveOrUpdateChartResource(String detailsJson, AppServiceInstanceDTO appServiceInstanceDTO) { - V1beta2DaemonSet v1beta2DaemonSet = json.deserialize(detailsJson, V1beta2DaemonSet.class); + V1DaemonSet v1beta2DaemonSet = json.deserialize(detailsJson, V1DaemonSet.class); DevopsDaemonSetDTO oldDevopsDaemonSetDTO = baseQueryByEnvIdAndName(appServiceInstanceDTO.getEnvId(), v1beta2DaemonSet.getMetadata().getName()); if (oldDevopsDaemonSetDTO != null) { diff --git a/src/main/java/io/choerodon/devops/app/service/impl/DevopsDemoEnvInitServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/DevopsDemoEnvInitServiceImpl.java index 574a51e2e0..b1a897cd8c 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/DevopsDemoEnvInitServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/DevopsDemoEnvInitServiceImpl.java @@ -31,15 +31,11 @@ import io.choerodon.devops.infra.constant.GitOpsConstants; import io.choerodon.devops.infra.constant.MiscConstants; import io.choerodon.devops.infra.dto.*; -import io.choerodon.devops.infra.dto.gitlab.BranchDTO; -import io.choerodon.devops.infra.dto.gitlab.CommitDTO; -import io.choerodon.devops.infra.dto.gitlab.MemberDTO; -import io.choerodon.devops.infra.dto.gitlab.MergeRequestDTO; +import io.choerodon.devops.infra.dto.gitlab.*; import io.choerodon.devops.infra.dto.iam.ProjectDTO; import io.choerodon.devops.infra.dto.iam.Tenant; import io.choerodon.devops.infra.enums.AccessLevel; import io.choerodon.devops.infra.enums.CommandStatus; -import io.choerodon.devops.infra.enums.ProjectConfigType; import io.choerodon.devops.infra.feign.operator.BaseServiceClientOperator; import io.choerodon.devops.infra.feign.operator.GitlabServiceClientOperator; import io.choerodon.devops.infra.mapper.AppServiceMapper; @@ -98,6 +94,8 @@ public class DevopsDemoEnvInitServiceImpl implements DevopsDemoEnvInitService { private AppServiceVersionReadmeMapper appServiceVersionReadmeMapper; @Autowired private SendNotificationService sendNotificationService; + @Autowired + private DevopsHelmConfigService devopsHelmConfigService; private final Gson gson = new Gson(); @@ -133,10 +131,12 @@ public void initialDemoEnv(OrganizationRegisterEventPayload organizationRegister // 2. 创建分支 BranchDTO branchDO = gitlabServiceClientOperator.queryBranch(gitlabProjectId, demoDataVO.getBranchInfo().getBranchName()); if (branchDO.getName() == null) { + GitlabProjectDTO gitlabProjectDO = gitlabServiceClientOperator + .queryProjectById(gitlabProjectId); gitlabServiceClientOperator.createBranch( gitlabProjectId, demoDataVO.getBranchInfo().getBranchName(), - demoDataVO.getBranchInfo().getOriginBranch(), + gitlabProjectDO.getDefaultBranch(), gitlabUserId); } @@ -279,7 +279,7 @@ private void newCommit(Integer gitlabProjectId) { private void mergeBranch(Integer gitlabProjectId) { try { // 创建merge request - MergeRequestDTO mergeRequest = gitlabServiceClientOperator.createMergeRequest(gitlabProjectId, demoDataVO.getBranchInfo().getBranchName(), "master", "a new merge request", "[ADD] add instant push", gitlabUserId); + MergeRequestDTO mergeRequest = gitlabServiceClientOperator.createMergeRequest(gitlabProjectId, demoDataVO.getBranchInfo().getBranchName(), demoDataVO.getBranchInfo().getOriginBranch(), "a new merge request", "[ADD] add instant push", gitlabUserId); // 确认merge request gitlabServiceClientOperator.acceptMergeRequest(gitlabProjectId, mergeRequest.getId(), "", Boolean.FALSE, Boolean.TRUE, gitlabUserId); @@ -343,18 +343,20 @@ private void doCreate(String image, String token, String version, String commit, appServiceVersionDTO.setRef(GitOpsConstants.MASTER); // 查询helm仓库配置id - DevopsConfigDTO devopsConfigDTO = devopsConfigService.queryRealConfig(appServiceDTO.getId(), MiscConstants.APP_SERVICE, ProjectConfigType.CHART.getType(), null); - ConfigVO helmConfig = gson.fromJson(devopsConfigDTO.getConfig(), ConfigVO.class); + DevopsHelmConfigDTO devopsHelmConfigDTO = devopsHelmConfigService.queryAppConfig(appServiceDTO.getId(), projectDTO.getId(), organization.getTenantId()); + + ConfigVO helmConfig = ConvertUtils.convertObject(devopsHelmConfigDTO, ConfigVO.class); + helmConfig.setIsPrivate(devopsHelmConfigDTO.getRepoPrivate()); String helmUrl = helmConfig.getUrl(); - appServiceVersionDTO.setHelmConfigId(devopsConfigDTO.getId()); + appServiceVersionDTO.setHelmConfigId(devopsHelmConfigDTO.getId()); - appServiceVersionDTO.setRepository(helmUrl.endsWith("/") ? helmUrl + organization.getTenantNum() + "/" + projectDTO.getCode() + "/" : helmUrl + "/" + organization.getTenantNum() + "/" + projectDTO.getCode() + "/"); + appServiceVersionDTO.setRepository(helmUrl.endsWith("/") ? helmUrl + organization.getTenantNum() + "/" + projectDTO.getDevopsComponentCode() + "/" : helmUrl + "/" + organization.getTenantNum() + "/" + projectDTO.getDevopsComponentCode() + "/"); String storeFilePath = STORE_PATH + version; String destFilePath = DESTINATION_PATH + version; String path = FileUtil.multipartFileToFile(storeFilePath, files); //上传chart包到chartmuseum - chartUtil.uploadChart(helmUrl, organization.getTenantNum(), projectDTO.getCode(), new File(path), helmConfig.getUserName(), helmConfig.getPassword()); + chartUtil.uploadChart(helmUrl, organization.getTenantNum(), projectDTO.getDevopsComponentCode(), new File(path), helmConfig.getUsername(), helmConfig.getPassword()); // 有需求让重新上传chart包,所以校验重复推后 if (newApplicationVersion != null) { diff --git a/src/main/java/io/choerodon/devops/app/service/impl/DevopsDeployGroupServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/DevopsDeployGroupServiceImpl.java index 25f7ee3a10..1d0ff0a1df 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/DevopsDeployGroupServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/DevopsDeployGroupServiceImpl.java @@ -1,18 +1,9 @@ package io.choerodon.devops.app.service.impl; -import static io.choerodon.devops.app.eventhandler.constants.HarborRepoConstants.CUSTOM_REPO; -import static io.choerodon.devops.app.service.AppServiceInstanceService.PARENT_WORK_LOAD_LABEL; -import static io.choerodon.devops.app.service.AppServiceInstanceService.PARENT_WORK_LOAD_NAME_LABEL; -import static io.choerodon.devops.infra.enums.ResourceType.DEPLOYMENT; - -import java.io.IOException; -import java.math.BigDecimal; -import java.util.*; - -import io.kubernetes.client.JSON; import io.kubernetes.client.custom.IntOrString; import io.kubernetes.client.custom.Quantity; -import io.kubernetes.client.models.*; +import io.kubernetes.client.openapi.JSON; +import io.kubernetes.client.openapi.models.*; import org.hzero.core.util.EncryptionUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -23,6 +14,15 @@ import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; +import java.io.IOException; +import java.math.BigDecimal; +import java.util.*; + +import static io.choerodon.devops.app.eventhandler.constants.HarborRepoConstants.CUSTOM_REPO; +import static io.choerodon.devops.app.service.AppServiceInstanceService.PARENT_WORK_LOAD_LABEL; +import static io.choerodon.devops.app.service.AppServiceInstanceService.PARENT_WORK_LOAD_NAME_LABEL; +import static io.choerodon.devops.infra.enums.ResourceType.DEPLOYMENT; + import io.choerodon.core.exception.CommonException; import io.choerodon.core.oauth.DetailsHelper; import io.choerodon.devops.api.vo.*; @@ -196,7 +196,7 @@ public DevopsDeployAppCenterEnvVO updateContainer(Long projectId, DevopsDeployGr public String buildDeploymentYaml(ProjectDTO projectDTO, DevopsEnvironmentDTO devopsEnvironmentDTO, DevopsDeployGroupVO devopsDeployGroupVO) { - V1beta2Deployment deployment = new V1beta2Deployment(); + V1Deployment deployment = new V1Deployment(); deployment.setKind(DEPLOYMENT.getType()); deployment.setApiVersion("apps/v1"); try { @@ -216,8 +216,8 @@ public String buildDeploymentYaml(ProjectDTO projectDTO, DevopsEnvironmentDTO } } - private V1beta2Deployment addAppConfig(ProjectDTO projectDTO, DevopsEnvironmentDTO - devopsEnvironmentDTO, DevopsDeployGroupVO devopsDeployGroupVO, V1beta2Deployment deployment) throws IOException { + private V1Deployment addAppConfig(ProjectDTO projectDTO, DevopsEnvironmentDTO + devopsEnvironmentDTO, DevopsDeployGroupVO devopsDeployGroupVO, V1Deployment deployment) throws IOException { DevopsDeployGroupAppConfigVO devopsDeployGroupAppConfigVO = devopsDeployGroupVO.getAppConfig(); // 设置名称、labels、annotations V1ObjectMeta metadata = new V1ObjectMeta(); @@ -231,14 +231,14 @@ private V1beta2Deployment addAppConfig(ProjectDTO projectDTO, DevopsEnvironmentD deployment.setMetadata(metadata); // 设置spec - V1beta2DeploymentSpec v1beta2DeploymentSpec = new V1beta2DeploymentSpec(); + V1DeploymentSpec v1beta2DeploymentSpec = new V1DeploymentSpec(); v1beta2DeploymentSpec.setReplicas(devopsDeployGroupAppConfigVO.getReplicas()); // 设置升级策略 - V1beta2DeploymentStrategy v1beta2DeploymentStrategy = new V1beta2DeploymentStrategy(); + V1DeploymentStrategy v1beta2DeploymentStrategy = new V1DeploymentStrategy(); v1beta2DeploymentStrategy.setType(devopsDeployGroupAppConfigVO.getStrategyType()); if (devopsDeployGroupAppConfigVO.getStrategyType().equals("RollingUpdate")) { - V1beta2RollingUpdateDeployment rollingUpdate = new V1beta2RollingUpdateDeployment(); + V1RollingUpdateDeployment rollingUpdate = new V1RollingUpdateDeployment(); if (devopsDeployGroupAppConfigVO.getMaxSurge() != null) { rollingUpdate.setMaxSurge(new IntOrString(devopsDeployGroupAppConfigVO.getMaxSurge())); } @@ -310,8 +310,8 @@ private V1beta2Deployment addAppConfig(ProjectDTO projectDTO, DevopsEnvironmentD return deployment; } - private V1beta2Deployment addContainerConfig(ProjectDTO projectDTO, DevopsEnvironmentDTO - devopsEnvironmentDTO, DevopsDeployGroupVO devopsDeployGroupVO, V1beta2Deployment deployment) throws IOException { + private V1Deployment addContainerConfig(ProjectDTO projectDTO, DevopsEnvironmentDTO + devopsEnvironmentDTO, DevopsDeployGroupVO devopsDeployGroupVO, V1Deployment deployment) throws IOException { List devopsDeployGroupContainerConfigVOS = devopsDeployGroupVO.getContainerConfig(); List containers = new ArrayList<>(); boolean hasJarRdupm = false; diff --git a/src/main/java/io/choerodon/devops/app/service/impl/DevopsDeployRecordServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/DevopsDeployRecordServiceImpl.java index 3c47db9eb8..7cd803d759 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/DevopsDeployRecordServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/DevopsDeployRecordServiceImpl.java @@ -36,7 +36,10 @@ import io.choerodon.devops.api.vo.market.MarketServiceDeployObjectVO; import io.choerodon.devops.app.service.*; import io.choerodon.devops.infra.constant.ResourceCheckConstant; -import io.choerodon.devops.infra.dto.*; +import io.choerodon.devops.infra.dto.DeployDTO; +import io.choerodon.devops.infra.dto.DevopsDeployAppCenterEnvDTO; +import io.choerodon.devops.infra.dto.DevopsDeployRecordDTO; +import io.choerodon.devops.infra.dto.DevopsEnvironmentDTO; import io.choerodon.devops.infra.dto.deploy.DevopsHzeroDeployConfigDTO; import io.choerodon.devops.infra.dto.deploy.DevopsHzeroDeployDetailsDTO; import io.choerodon.devops.infra.enums.*; @@ -210,31 +213,6 @@ public void baseCreate(DevopsDeployRecordDTO devopsDeployRecordDTO) { } } - /** - * 这里使用REQUIRES_NEW 是为了在catch中不会被回滚 - * - * @param recordId 记录id - * @param status 状态 - * @param errorMsg 错误消息 - */ - @Override - public void updateRecord(Long recordId, String status, String errorMsg) { - DevopsDeployRecordDTO devopsDeployRecordDTO = devopsDeployRecordMapper.selectByPrimaryKey(recordId); - devopsDeployRecordDTO.setDeployResult(status); - devopsDeployRecordDTO.setErrorMessage(errorMsg); - MapperUtil.resultJudgedUpdateByPrimaryKeySelective(devopsDeployRecordMapper, devopsDeployRecordDTO, "error.deploy.record.insert"); - } - - /** - * 不关注更新结果 - * - * @param devopsDeployRecordDTO - */ - @Override - public void updateRecord(DevopsDeployRecordDTO devopsDeployRecordDTO) { - devopsDeployRecordMapper.updateByPrimaryKey(devopsDeployRecordDTO); - } - @Override public List baseList(DevopsDeployRecordDTO devopsDeployRecordDTO) { return devopsDeployRecordMapper.select(devopsDeployRecordDTO); diff --git a/src/main/java/io/choerodon/devops/app/service/impl/DevopsDeployServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/DevopsDeployServiceImpl.java index b80ac65a16..f6b76a5326 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/DevopsDeployServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/DevopsDeployServiceImpl.java @@ -12,13 +12,9 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import io.choerodon.devops.api.vo.AppServiceDeployVO; -import io.choerodon.devops.api.vo.deploy.DeployConfigVO; import io.choerodon.devops.api.vo.deploy.DeploySourceVO; import io.choerodon.devops.api.vo.deploy.hzero.HzeroDeployPipelineVO; import io.choerodon.devops.api.vo.deploy.hzero.HzeroDeployVO; @@ -34,7 +30,9 @@ import io.choerodon.devops.infra.enums.CommandStatus; import io.choerodon.devops.infra.enums.DeployType; import io.choerodon.devops.infra.enums.HzeroDeployDetailsStatusEnum; -import io.choerodon.devops.infra.enums.deploy.*; +import io.choerodon.devops.infra.enums.deploy.DeployModeEnum; +import io.choerodon.devops.infra.enums.deploy.DeployObjectTypeEnum; +import io.choerodon.devops.infra.enums.deploy.DeployResultEnum; import io.choerodon.devops.infra.feign.operator.BaseServiceClientOperator; import io.choerodon.devops.infra.feign.operator.MarketServiceClientOperator; import io.choerodon.devops.infra.feign.operator.WorkFlowServiceOperator; diff --git a/src/main/java/io/choerodon/devops/app/service/impl/DevopsDeploymentServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/DevopsDeploymentServiceImpl.java index ded3e78bbc..67e554fc34 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/DevopsDeploymentServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/DevopsDeploymentServiceImpl.java @@ -1,18 +1,11 @@ package io.choerodon.devops.app.service.impl; -import static io.choerodon.devops.infra.constant.MiscConstants.CREATE_TYPE; - -import java.io.IOException; -import java.util.*; -import java.util.function.Function; -import java.util.stream.Collectors; - import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; -import io.kubernetes.client.JSON; -import io.kubernetes.client.models.V1Container; -import io.kubernetes.client.models.V1ContainerPort; -import io.kubernetes.client.models.V1beta2Deployment; +import io.kubernetes.client.openapi.JSON; +import io.kubernetes.client.openapi.models.V1Container; +import io.kubernetes.client.openapi.models.V1ContainerPort; +import io.kubernetes.client.openapi.models.V1Deployment; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; @@ -21,6 +14,13 @@ import org.springframework.util.CollectionUtils; import org.springframework.util.ObjectUtils; +import java.io.IOException; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; + +import static io.choerodon.devops.infra.constant.MiscConstants.CREATE_TYPE; + import io.choerodon.core.domain.Page; import io.choerodon.core.exception.CommonException; import io.choerodon.core.utils.ConvertUtils; @@ -191,9 +191,9 @@ public Page pagingByEnvId(Long projectId, Long envId, PageRequ DeploymentInfoVO deploymentVO = ConvertUtils.convertObject(v, DeploymentInfoVO.class); if (detailDTOMap.get(v.getResourceDetailId()) != null) { // 参考实例详情查询逻辑 - V1beta2Deployment v1beta2Deployment = json.deserialize( + V1Deployment v1beta2Deployment = json.deserialize( detailDTOMap.get(v.getResourceDetailId()).getMessage(), - V1beta2Deployment.class); + V1Deployment.class); deploymentVO.setDesired(TypeUtil.objToLong(v1beta2Deployment.getSpec().getReplicas())); deploymentVO.setCurrent(TypeUtil.objToLong(v1beta2Deployment.getStatus().getReplicas())); deploymentVO.setUpToDate(TypeUtil.objToLong(v1beta2Deployment.getStatus().getUpdatedReplicas())); @@ -226,7 +226,7 @@ public Page pagingByEnvId(Long projectId, Long envId, PageRequ @Override @Transactional(propagation = Propagation.NESTED) public void saveOrUpdateChartResource(String detailsJson, AppServiceInstanceDTO appServiceInstanceDTO) { - V1beta2Deployment v1beta2Deployment = json.deserialize(detailsJson, V1beta2Deployment.class); + V1Deployment v1beta2Deployment = json.deserialize(detailsJson, V1Deployment.class); DevopsDeploymentDTO oldDevopsDeploymentDTO = baseQueryByEnvIdAndName(appServiceInstanceDTO.getEnvId(), v1beta2Deployment.getMetadata().getName()); if (oldDevopsDeploymentDTO != null) { diff --git a/src/main/java/io/choerodon/devops/app/service/impl/DevopsEnvApplicationServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/DevopsEnvApplicationServiceImpl.java index 7f91efb2f2..b5955244d2 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/DevopsEnvApplicationServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/DevopsEnvApplicationServiceImpl.java @@ -1,33 +1,26 @@ package io.choerodon.devops.app.service.impl; -import java.util.*; -import java.util.stream.Collectors; - -import io.kubernetes.client.JSON; -import io.kubernetes.client.models.V1Container; -import io.kubernetes.client.models.V1ContainerPort; -import io.kubernetes.client.models.V1beta2Deployment; -import org.apache.commons.lang3.StringUtils; +import io.kubernetes.client.openapi.JSON; +import io.kubernetes.client.openapi.models.V1Container; +import io.kubernetes.client.openapi.models.V1ContainerPort; +import io.kubernetes.client.openapi.models.V1Deployment; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import org.springframework.util.CollectionUtils; + +import java.util.*; +import java.util.stream.Collectors; import io.choerodon.core.exception.CommonException; import io.choerodon.devops.api.vo.*; import io.choerodon.devops.api.vo.iam.DevopsEnvMessageVO; -import io.choerodon.devops.api.vo.market.MarketServiceDeployObjectVO; import io.choerodon.devops.app.service.AppServiceService; import io.choerodon.devops.app.service.DevopsEnvApplicationService; import io.choerodon.devops.app.service.PermissionHelper; -import io.choerodon.devops.infra.dto.*; -import io.choerodon.devops.infra.enums.AppSourceType; +import io.choerodon.devops.infra.dto.AppServiceDTO; +import io.choerodon.devops.infra.dto.DevopsEnvAppServiceDTO; import io.choerodon.devops.infra.enums.deploy.ApplicationCenterEnum; -import io.choerodon.devops.infra.feign.operator.MarketServiceClientOperator; -import io.choerodon.devops.infra.mapper.AppServiceInstanceMapper; -import io.choerodon.devops.infra.mapper.AppServiceShareRuleMapper; import io.choerodon.devops.infra.mapper.DevopsEnvAppServiceMapper; -import io.choerodon.devops.infra.mapper.DevopsEnvironmentMapper; import io.choerodon.devops.infra.util.ConvertUtils; /** @@ -134,8 +127,8 @@ public List> listLabelByAppAndEnvId(Long envId, Long appServ List devopsEnvMessageVOS = baseListResourceByEnvAndApp(envId, appServiceId); List> listLabel = new ArrayList<>(); devopsEnvMessageVOS.forEach(devopsEnvMessageVO -> { - V1beta2Deployment v1beta2Deployment = json.deserialize( - devopsEnvMessageVO.getDetail(), V1beta2Deployment.class); + V1Deployment v1beta2Deployment = json.deserialize( + devopsEnvMessageVO.getDetail(), V1Deployment.class); listLabel.add(v1beta2Deployment.getMetadata().getLabels()); }); return listLabel; @@ -146,8 +139,8 @@ public List listPortByAppAndEnvId(Long envId, Long appServiceId List devopsEnvMessageVOS = baseListResourceByEnvAndApp(envId, appServiceId); List devopsEnvPortVOS = new ArrayList<>(); devopsEnvMessageVOS.forEach(devopsEnvMessageVO -> { - V1beta2Deployment v1beta2Deployment = json.deserialize( - devopsEnvMessageVO.getDetail(), V1beta2Deployment.class); + V1Deployment v1beta2Deployment = json.deserialize( + devopsEnvMessageVO.getDetail(), V1Deployment.class); List containers = v1beta2Deployment.getSpec().getTemplate().getSpec().getContainers(); for (V1Container container : containers) { List ports = container.getPorts(); diff --git a/src/main/java/io/choerodon/devops/app/service/impl/DevopsEnvFileServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/DevopsEnvFileServiceImpl.java index 1f0061c2d3..58508c8047 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/DevopsEnvFileServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/DevopsEnvFileServiceImpl.java @@ -125,14 +125,6 @@ public void baseDelete(DevopsEnvFileDTO devopsEnvFileDTO) { devopsEnvFileMapper.delete(devopsEnvFileDTO); } - @Override - public List baseListByEnvIdAndPath(Long envId, String path) { - DevopsEnvFileDTO devopsEnvFileDTO = new DevopsEnvFileDTO(); - devopsEnvFileDTO.setEnvId(envId); - devopsEnvFileDTO.setFilePath(path); - return devopsEnvFileMapper.select(devopsEnvFileDTO); - } - @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) @Override public void deleteByEnvId(Long envId) { @@ -151,7 +143,7 @@ private String getGitlabUrl(Long envId) { Tenant organizationDTO = baseServiceClientOperator.queryOrganizationById(projectDTO.getOrganizationId()); String urlSlash = gitlabUrl.endsWith("/") ? "" : "/"; return String.format("%s%s%s-%s-gitops/%s/tree/", - gitlabUrl, urlSlash, organizationDTO.getTenantNum(), projectDTO.getCode(), devopsEnvironmentDTO.getCode()); + gitlabUrl, urlSlash, organizationDTO.getTenantNum(), projectDTO.getDevopsComponentCode(), devopsEnvironmentDTO.getCode()); } private void setCommitAndFileUrl(DevopsEnvFileErrorVO devopsEnvFileErrorVO, String gitlabProjectPath) { diff --git a/src/main/java/io/choerodon/devops/app/service/impl/DevopsEnvGroupServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/DevopsEnvGroupServiceImpl.java index e9dcb67fa8..b5ebec8cd3 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/DevopsEnvGroupServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/DevopsEnvGroupServiceImpl.java @@ -1,5 +1,14 @@ package io.choerodon.devops.app.service.impl; +import java.util.List; +import javax.annotation.Nullable; +import javax.validation.constraints.NotNull; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + import io.choerodon.core.exception.CommonException; import io.choerodon.devops.api.validator.DevopsEnvGroupValidator; import io.choerodon.devops.api.vo.DevopsEnvGroupVO; @@ -11,14 +20,6 @@ import io.choerodon.devops.infra.util.CommonExAssertUtil; import io.choerodon.devops.infra.util.ConvertUtils; import io.choerodon.devops.infra.util.MapperUtil; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Propagation; -import org.springframework.transaction.annotation.Transactional; - -import javax.annotation.Nullable; -import javax.validation.constraints.NotNull; -import java.util.List; /** * Creator: Runge @@ -135,11 +136,6 @@ public Boolean baseCheckUniqueInProject(Long id, String name, Long projectId) { return devopsEnvGroupDOS.isEmpty() || updateCheck; } - @Override - public Boolean baseCheckUniqueInProject(String name, Long projectId) { - return baseCheckUniqueInProject(null, name, projectId); - } - @Override public void baseDelete(Long id) { devopsEnvGroupMapper.deleteByPrimaryKey(id); diff --git a/src/main/java/io/choerodon/devops/app/service/impl/DevopsEnvPodServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/DevopsEnvPodServiceImpl.java index bfe2b462d7..225c0ad752 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/DevopsEnvPodServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/DevopsEnvPodServiceImpl.java @@ -1,28 +1,9 @@ package io.choerodon.devops.app.service.impl; -import java.util.*; -import java.util.function.Function; -import java.util.stream.Collectors; - -import io.kubernetes.client.JSON; -import io.kubernetes.client.models.V1Pod; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.util.Assert; -import org.springframework.util.CollectionUtils; -import org.springframework.util.ObjectUtils; -import org.springframework.util.StringUtils; - import io.choerodon.core.domain.Page; import io.choerodon.core.exception.CommonException; import io.choerodon.devops.api.vo.ContainerVO; -import io.choerodon.devops.api.vo.DevopsEnvPodInfoVO; import io.choerodon.devops.api.vo.DevopsEnvPodVO; -import io.choerodon.devops.api.vo.PodMetricsRedisInfoVO; import io.choerodon.devops.app.service.*; import io.choerodon.devops.infra.constant.KubernetesConstants; import io.choerodon.devops.infra.constant.ResourceCheckConstant; @@ -34,6 +15,24 @@ import io.choerodon.mybatis.pagehelper.PageHelper; import io.choerodon.mybatis.pagehelper.domain.PageRequest; import io.choerodon.mybatis.pagehelper.domain.Sort; +import io.kubernetes.client.openapi.JSON; +import io.kubernetes.client.openapi.models.V1Pod; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.Assert; +import org.springframework.util.CollectionUtils; +import org.springframework.util.ObjectUtils; +import org.springframework.util.StringUtils; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; /** * Created by Zenger on 2018/4/17. @@ -110,7 +109,7 @@ public void fillContainers(DevopsEnvPodVO devopsEnvPodVO) { .map(container -> { ContainerVO containerVO = new ContainerVO(); containerVO.setName(container.getName()); - containerVO.setReady(container.isReady()); + containerVO.setReady(container.getReady()); return containerVO; }) .collect(Collectors.toList()); @@ -148,16 +147,6 @@ public DevopsEnvPodDTO baseQueryByEnvIdAndName(Long envId, String name) { return devopsEnvPodMapper.selectOne(devopsEnvPodDTO); } - @Override - public DevopsEnvPodDTO baseQueryByPod(DevopsEnvPodDTO devopsEnvPodDTO) { - List devopsEnvPodDOS = - devopsEnvPodMapper.select(devopsEnvPodDTO); - if (devopsEnvPodDOS.isEmpty()) { - return null; - } - return devopsEnvPodDOS.get(0); - } - @Override public void baseCreate(DevopsEnvPodDTO devopsEnvPodDTO) { DevopsEnvPodDTO envPodDTO = new DevopsEnvPodDTO(); @@ -246,14 +235,6 @@ public void baseDeleteById(Long id) { devopsEnvPodMapper.deleteByPrimaryKey(id); } - @Override - public DevopsEnvPodDTO queryByNameAndEnvName(String name, String namespace) { - DevopsEnvPodDTO devopsEnvPodDTO = new DevopsEnvPodDTO(); - devopsEnvPodDTO.setName(name); - devopsEnvPodDTO.setNamespace(namespace); - return devopsEnvPodMapper.selectOne(devopsEnvPodDTO); - } - private static Map listToMap(List resources) { Map map = new HashMap<>(); for (DevopsEnvResourceDTO resource : resources) { @@ -276,50 +257,6 @@ private static DevopsEnvResourceDTO compareRevision(DevopsEnvResourceDTO one, De return one.getReversion() > theOther.getReversion() ? one : theOther; } - @Override - public List queryEnvPodInfo(Long envId, String sort) { - DevopsEnvironmentDTO devopsEnvironmentDTO = devopsEnvironmentService.baseQueryById(envId); - DevopsClusterDTO devopsClusterDTO = devopsClusterService.baseQuery(devopsEnvironmentDTO.getClusterId()); - List devopsEnvPodInfoVOList = devopsEnvPodMapper.queryEnvPodIns(envId); - - // 根据devopsEnvPodInfoVOList获取name集合,批量查询devopsEnvResourceDTO和DevopsEnvResourceDetailDTO - List podNames = devopsEnvPodInfoVOList.stream().map(DevopsEnvPodInfoVO::getName).collect(Collectors.toList()); - List devopsEnvResourceDTOList = devopsEnvResourceService.listEnvResourceByOptions(envId, ResourceType.POD.getType(), podNames); - Set resourceDetailIds = devopsEnvResourceDTOList.stream().map(DevopsEnvResourceDTO::getResourceDetailId).collect(Collectors.toSet()); - Map devopsEnvResourceMap = listToMap(devopsEnvResourceDTOList); - List devopsEnvResourceDetailDTOS = devopsEnvResourceDetailService.listByResourceDetailsIds(resourceDetailIds); - Map devopsEnvResourceDetailMap = devopsEnvResourceDetailDTOS.stream().collect(Collectors.toMap(DevopsEnvResourceDetailDTO::getId, Function.identity())); - - devopsEnvPodInfoVOList.forEach(devopsEnvPodInfoVO -> { - PodMetricsRedisInfoVO podMetricsRedisInfoVO = agentPodService.queryLatestPodSnapshot(devopsEnvPodInfoVO.getName(), devopsEnvPodInfoVO.getNamespace(), devopsClusterDTO.getCode()); - DevopsEnvResourceDTO devopsEnvResourceDTO = devopsEnvResourceMap.get(devopsEnvPodInfoVO.getName()); - DevopsEnvResourceDetailDTO devopsEnvResourceDetailDTO = devopsEnvResourceDetailMap.get(devopsEnvResourceDTO.getResourceDetailId()); - V1Pod v1Pod = json.deserialize(devopsEnvResourceDetailDTO.getMessage(), V1Pod.class); - devopsEnvPodInfoVO.setStatus(K8sUtil.changePodStatus(v1Pod)); - devopsEnvPodInfoVO.setPodIp(v1Pod == null ? null : v1Pod.getStatus().getPodIP()); - if (podMetricsRedisInfoVO != null) { - devopsEnvPodInfoVO.setCpuUsed(podMetricsRedisInfoVO.getCpu()); - devopsEnvPodInfoVO.setMemoryUsed(podMetricsRedisInfoVO.getMemory()); - } - }); - - // 根据cpu进行逆序排序,考虑为null值的情况 - if ("cpu".equals(sort)) { - devopsEnvPodInfoVOList = devopsEnvPodInfoVOList.stream() - .sorted(Comparator.comparing(DevopsEnvPodInfoVO::getCpuUsed, Comparator.nullsFirst(String::compareTo)).reversed()) - .collect(Collectors.toList()); - } - - // 默认根据memory进行逆序排序,考虑为null值的情况 - if ("memory".equals(sort)) { - devopsEnvPodInfoVOList = devopsEnvPodInfoVOList.stream() - .sorted(Comparator.comparing(DevopsEnvPodInfoVO::getMemoryUsed, Comparator.nullsFirst(String::compareTo)).reversed()) - .collect(Collectors.toList()); - } - - return devopsEnvPodInfoVOList; - } - @Override @Transactional(rollbackFor = Exception.class) public void deleteEnvPodById(Long projectId, Long envId, Long podId) { @@ -479,7 +416,7 @@ private void fillContainers(Long envId, DevopsEnvPodVO devopsEnvPodVO) { .map(container -> { ContainerVO containerVO = new ContainerVO(); containerVO.setName(container.getName()); - containerVO.setReady(container.isReady()); + containerVO.setReady(container.getReady()); return containerVO; }) .collect(Collectors.toList()); diff --git a/src/main/java/io/choerodon/devops/app/service/impl/DevopsEnvResourceServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/DevopsEnvResourceServiceImpl.java index 3731ded5f6..7a20241cc5 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/DevopsEnvResourceServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/DevopsEnvResourceServiceImpl.java @@ -1,14 +1,9 @@ package io.choerodon.devops.app.service.impl; -import java.io.IOException; -import java.util.*; -import java.util.function.Function; -import java.util.stream.Collectors; - import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; -import io.kubernetes.client.JSON; -import io.kubernetes.client.models.*; +import io.kubernetes.client.openapi.JSON; +import io.kubernetes.client.openapi.models.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; @@ -16,6 +11,11 @@ import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; +import java.io.IOException; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; + import io.choerodon.core.exception.CommonException; import io.choerodon.devops.api.vo.*; import io.choerodon.devops.app.service.*; @@ -98,9 +98,9 @@ public DevopsEnvResourceVO listResourcesByDeploymentId(Long deploymentId) { // 获取相关的pod List devopsEnvPodVOs = devopsEnvPodService.listWorkloadPod(ResourceType.DEPLOYMENT.getType(), devopsDeploymentVO.getName()); - V1beta2Deployment v1beta2Deployment = json.deserialize( + V1Deployment v1beta2Deployment = json.deserialize( devopsEnvResourceDetailDTO.getMessage(), - V1beta2Deployment.class); + V1Deployment.class); addDeploymentToResource(devopsEnvResourceVO, v1beta2Deployment, deploymentId); @@ -147,9 +147,9 @@ private void dealWithResource(DevopsEnvResourceDetailDTO devopsEnvResourceDetail addPodToResource(devopsEnvResourceVO, v1Pod); break; case DEPLOYMENT: - V1beta2Deployment v1beta2Deployment = json.deserialize( + V1Deployment v1beta2Deployment = json.deserialize( devopsEnvResourceDetailDTO.getMessage(), - V1beta2Deployment.class); + V1Deployment.class); addDeploymentToResource(devopsEnvResourceVO, v1beta2Deployment, devopsEnvResourceDTO.getInstanceId()); break; @@ -160,24 +160,24 @@ private void dealWithResource(DevopsEnvResourceDetailDTO devopsEnvResourceDetail break; case INGRESS: if (devopsEnvResourceDTO.getInstanceId() != null) { - V1beta1Ingress v1beta1Ingress = json.deserialize( + V1Ingress v1beta1Ingress = json.deserialize( devopsEnvResourceDetailDTO.getMessage(), - V1beta1Ingress.class); + V1Ingress.class); devopsEnvResourceVO.getIngressVOS().add(addIngressToResource(v1beta1Ingress)); } break; case REPLICASET: - V1beta2ReplicaSet v1beta2ReplicaSet = json.deserialize( + V1ReplicaSet v1beta2ReplicaSet = json.deserialize( devopsEnvResourceDetailDTO.getMessage(), - V1beta2ReplicaSet.class); + V1ReplicaSet.class); addReplicaSetToResource(devopsEnvResourceVO, v1beta2ReplicaSet); break; case DAEMONSET: - V1beta2DaemonSet v1beta2DaemonSet = json.deserialize(devopsEnvResourceDetailDTO.getMessage(), V1beta2DaemonSet.class); + V1DaemonSet v1beta2DaemonSet = json.deserialize(devopsEnvResourceDetailDTO.getMessage(), V1DaemonSet.class); addDaemonSetToResource(devopsEnvResourceVO, v1beta2DaemonSet, devopsEnvResourceDTO.getInstanceId()); break; case STATEFULSET: - V1beta2StatefulSet v1beta2StatefulSet = json.deserialize(devopsEnvResourceDetailDTO.getMessage(), V1beta2StatefulSet.class); + V1StatefulSet v1beta2StatefulSet = json.deserialize(devopsEnvResourceDetailDTO.getMessage(), V1StatefulSet.class); addStatefulSetSetToResource(devopsEnvResourceVO, v1beta2StatefulSet, devopsEnvResourceDTO.getInstanceId()); break; case PERSISTENT_VOLUME_CLAIM: @@ -329,7 +329,7 @@ private void addPodToResource(DevopsEnvResourceVO devopsEnvResourceDTO, V1Pod v1 Long restart = 0L; if (v1Pod.getStatus().getContainerStatuses() != null) { for (V1ContainerStatus v1ContainerStatus : v1Pod.getStatus().getContainerStatuses()) { - if (v1ContainerStatus.isReady() && v1ContainerStatus.getState().getRunning().getStartedAt() != null) { + if (v1ContainerStatus.getReady() && v1ContainerStatus.getState().getRunning().getStartedAt() != null) { ready = ready + 1; } restart = restart + v1ContainerStatus.getRestartCount(); @@ -348,7 +348,7 @@ private void addPodToResource(DevopsEnvResourceVO devopsEnvResourceDTO, V1Pod v1 * @param devopsEnvResourceDTO 实例资源参数 * @param v1beta2Deployment deployment对象 */ - public void addDeploymentToResource(DevopsEnvResourceVO devopsEnvResourceDTO, V1beta2Deployment v1beta2Deployment, Long instanceId) { + public void addDeploymentToResource(DevopsEnvResourceVO devopsEnvResourceDTO, V1Deployment v1beta2Deployment, Long instanceId) { DeploymentVO deploymentVO = new DeploymentVO(); deploymentVO.setName(v1beta2Deployment.getMetadata().getName()); deploymentVO.setDesired(TypeUtil.objToLong(v1beta2Deployment.getSpec().getReplicas())); @@ -413,7 +413,7 @@ public void addServiceToResource(DevopsEnvResourceVO devopsEnvResourceDTO, V1Ser * * @param v1beta1Ingress ingress对象 */ - private IngressVO addIngressToResource(V1beta1Ingress v1beta1Ingress) { + private IngressVO addIngressToResource(V1Ingress v1beta1Ingress) { IngressVO ingressVO = new IngressVO(); ingressVO.setName(v1beta1Ingress.getMetadata().getName()); ingressVO.setHosts(K8sUtil.formatHosts(v1beta1Ingress.getSpec().getRules())); @@ -430,7 +430,7 @@ private IngressVO addIngressToResource(V1beta1Ingress v1beta1Ingress) { * @param devopsEnvResourceDTO 实例资源参数 * @param v1beta2ReplicaSet replicaSet对象 */ - public void addReplicaSetToResource(DevopsEnvResourceVO devopsEnvResourceDTO, V1beta2ReplicaSet v1beta2ReplicaSet) { + public void addReplicaSetToResource(DevopsEnvResourceVO devopsEnvResourceDTO, V1ReplicaSet v1beta2ReplicaSet) { if (v1beta2ReplicaSet.getSpec().getReplicas() == 0) { return; } @@ -449,7 +449,7 @@ public void addReplicaSetToResource(DevopsEnvResourceVO devopsEnvResourceDTO, V1 * @param devopsEnvResourceDTO 实例资源参数 * @param v1beta2DaemonSet daemonSet对象 */ - private void addDaemonSetToResource(DevopsEnvResourceVO devopsEnvResourceDTO, V1beta2DaemonSet v1beta2DaemonSet, Long instanceId) { + private void addDaemonSetToResource(DevopsEnvResourceVO devopsEnvResourceDTO, V1DaemonSet v1beta2DaemonSet, Long instanceId) { DaemonSetVO daemonSetVO = new DaemonSetVO(); daemonSetVO.setName(v1beta2DaemonSet.getMetadata().getName()); daemonSetVO.setAge(v1beta2DaemonSet.getMetadata().getCreationTimestamp().toString()); @@ -467,7 +467,7 @@ private void addDaemonSetToResource(DevopsEnvResourceVO devopsEnvResourceDTO, V1 * @param devopsEnvResourceDTO 实例资源参数 * @param v1beta2StatefulSet statefulSet对象 */ - private void addStatefulSetSetToResource(DevopsEnvResourceVO devopsEnvResourceDTO, V1beta2StatefulSet v1beta2StatefulSet, Long instanceId) { + private void addStatefulSetSetToResource(DevopsEnvResourceVO devopsEnvResourceDTO, V1StatefulSet v1beta2StatefulSet, Long instanceId) { StatefulSetVO statefulSetVO = new StatefulSetVO(); statefulSetVO.setName(v1beta2StatefulSet.getMetadata().getName()); statefulSetVO.setDesiredReplicas(TypeUtil.objToLong(v1beta2StatefulSet.getSpec().getReplicas())); @@ -577,77 +577,6 @@ public String getResourceDetailByNameAndTypeAndInstanceId(Long instanceId, Strin return devopsEnvResourceMapper.getResourceDetailByNameAndTypeAndInstanceId(instanceId, name, resourceType.getType()); } - @Override - public List listEnvResourceByOptions(Long envId, String type, List names) { - return devopsEnvResourceMapper.listEnvResourceByOptions(envId, type, names); - } - - @Override - public List listPodEventBycommandId(Long commandId) { - - Assert.notNull(commandId, ERROR_COMMAND_ID_IS_NULL); - - List devopsCommandEventDTOS = devopsCommandEventService.listByCommandId(commandId); - List commandEventTypeJob = devopsCommandEventDTOS.stream().filter(v -> ResourceType.JOB.getType().equals(v.getType())).collect(Collectors.toList()); - List commandEventTypePod = devopsCommandEventDTOS.stream().filter(v -> ResourceType.POD.getType().equals(v.getType())).collect(Collectors.toList()); - - //获取实例中job的event - List podEventVOS = new ArrayList<>(); - if (!CollectionUtils.isEmpty(commandEventTypeJob)) { - LinkedHashMap jobEvents = getDevopsCommandEvent(commandEventTypeJob); - jobEvents.forEach((key, value) -> { - PodEventVO podEventVO = new PodEventVO(); - podEventVO.setName(key); - podEventVO.setEvent(value); - podEventVOS.add(podEventVO); - }); - } - List jobs = baseListByCommandId(commandId); - List devopsEnvCommandLogES = devopsEnvCommandLogService - .baseListByDeployId(commandId); - for (int i = 0; i < jobs.size(); i++) { - DevopsEnvResourceDTO job = jobs.get(i); - DevopsEnvResourceDetailDTO devopsEnvResourceDetailDTO = - devopsEnvResourceDetailService.baseQueryByResourceDetailId( - job.getResourceDetailId()); - V1Job v1Job = json.deserialize(devopsEnvResourceDetailDTO.getMessage(), V1Job.class); - if (podEventVOS.size() < 4) { - //job日志 - if (i <= devopsEnvCommandLogES.size() - 1) { - if (podEventVOS.size() == i) { - PodEventVO podEventVO = new PodEventVO(); - podEventVO.setName(v1Job.getMetadata().getName()); - podEventVOS.add(podEventVO); - } - podEventVOS.get(i).setLog(devopsEnvCommandLogES.get(i).getLog()); - } - //获取job状态 - if (i <= podEventVOS.size() - 1) { - if (podEventVOS.size() == i) { - PodEventVO podEventVO = new PodEventVO(); - podEventVOS.add(podEventVO); - } - setJobStatus(v1Job, podEventVOS.get(i)); - } - } - } - //获取实例中pod的event - if (!CollectionUtils.isEmpty(commandEventTypePod)) { - LinkedHashMap podEvents = getDevopsCommandEvent(commandEventTypePod); - int index = 0; - for (Map.Entry entry : podEvents.entrySet()) { - PodEventVO podEventVO = new PodEventVO(); - podEventVO.setName(entry.getKey()); - podEventVO.setEvent(entry.getValue()); - podEventVOS.add(podEventVO); - if (index++ >= 4) { - break; - } - } - } - return podEventVOS; - } - @Override public String getResourceDetailByEnvIdAndKindAndName(Long envId, String name, ResourceType resourceType) { return devopsEnvResourceMapper.getResourceDetailByEnvIdAndKindAndName(envId, name, resourceType.getType()); diff --git a/src/main/java/io/choerodon/devops/app/service/impl/DevopsEnvUserPermissionServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/DevopsEnvUserPermissionServiceImpl.java index 416137a1ab..0ac52c0761 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/DevopsEnvUserPermissionServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/DevopsEnvUserPermissionServiceImpl.java @@ -3,7 +3,6 @@ import java.util.List; import java.util.Map; -import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -125,11 +124,6 @@ public List baseListByEnvId(Long envId) { return devopsEnvUserPermissionMapper.listByEnvId(envId); } - @Override - public List baseListAll(Long envId) { - return devopsEnvUserPermissionMapper.listAll(envId); - } - @Override @Transactional public void baseUpdate(Long envId, List addUsersList, List deleteUsersList) { diff --git a/src/main/java/io/choerodon/devops/app/service/impl/DevopsEnvironmentServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/DevopsEnvironmentServiceImpl.java index c3da8e601b..7afde87512 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/DevopsEnvironmentServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/DevopsEnvironmentServiceImpl.java @@ -259,7 +259,7 @@ public void create(Long projectId, DevopsEnvironmentReqVO devopsEnvironmentReqVO } List sshKeys = FileUtil.getSshKey( - organizationDTO.getTenantNum() + "/" + projectDTO.getCode() + "/" + devopsEnvironmentReqVO.getCode()); + organizationDTO.getTenantNum() + "/" + projectDTO.getDevopsComponentCode() + "/" + devopsEnvironmentReqVO.getCode()); devopsEnvironmentDTO.setEnvIdRsa(sshKeys.get(0)); devopsEnvironmentDTO.setEnvIdRsaPub(sshKeys.get(1)); @@ -298,57 +298,6 @@ private static boolean isCodePatternValid(String code) { return CODE.matcher(code).matches(); } - @Override - public List listDevopsEnvGroupEnvs(Long projectId, Boolean active) { - List devopsEnvGroupEnvsDTOS = new ArrayList<>(); - List upgradeClusterList = clusterConnectionHandler.getUpdatedClusterList(); - List devopsEnvironmentDTOS = baseListByProjectIdAndActive(projectId, active).stream().peek(t -> - setEnvStatus(upgradeClusterList, t) - ) - .collect(Collectors.toList()); - List devopsEnviromentRepDTOS = ConvertUtils.convertList(devopsEnvironmentDTOS, DevopsEnvironmentRepVO.class); - if (!active) { - DevopsEnvGroupEnvsVO devopsEnvGroupEnvsDTO = new DevopsEnvGroupEnvsVO(); - devopsEnvGroupEnvsDTO.setDevopsEnvironmentRepDTOs(devopsEnviromentRepDTOS); - devopsEnvGroupEnvsDTOS.add(devopsEnvGroupEnvsDTO); - return devopsEnvGroupEnvsDTOS; - } - List devopsEnvGroupES = devopsEnvGroupService.baseListByProjectId(projectId); - devopsEnviromentRepDTOS.forEach(devopsEnviromentRepDTO -> { - DevopsClusterDTO devopsClusterDTO = devopsClusterService.baseQuery(devopsEnviromentRepDTO.getClusterId()); - devopsEnviromentRepDTO.setClusterName(devopsClusterDTO == null ? null : devopsClusterDTO.getName()); - if (devopsEnviromentRepDTO.getDevopsEnvGroupId() == null) { - devopsEnviromentRepDTO.setDevopsEnvGroupId(0L); - } - }); - //按照环境组分组查询,有环境的环境组放前面,没环境的环境组放后面 - Map> resultMaps = devopsEnviromentRepDTOS.stream() - .collect(Collectors.groupingBy(DevopsEnvironmentRepVO::getDevopsEnvGroupId)); - - List envGroupIds = new ArrayList<>(); - resultMaps.forEach((key, value) -> { - envGroupIds.add(key); - DevopsEnvGroupEnvsVO devopsEnvGroupEnvsDTO = new DevopsEnvGroupEnvsVO(); - DevopsEnvGroupDTO devopsEnvGroupDTO = new DevopsEnvGroupDTO(); - if (key != 0) { - devopsEnvGroupDTO = devopsEnvGroupService.baseQuery(key); - } - devopsEnvGroupEnvsDTO.setDevopsEnvGroupId(devopsEnvGroupDTO.getId()); - devopsEnvGroupEnvsDTO.setDevopsEnvGroupName(devopsEnvGroupDTO.getName()); - devopsEnvGroupEnvsDTO.setDevopsEnvironmentRepDTOs(value); - devopsEnvGroupEnvsDTOS.add(devopsEnvGroupEnvsDTO); - }); - devopsEnvGroupES.forEach(devopsEnvGroupE -> { - if (!envGroupIds.contains(devopsEnvGroupE.getId())) { - DevopsEnvGroupEnvsVO devopsEnvGroupEnvsDTO = new DevopsEnvGroupEnvsVO(); - devopsEnvGroupEnvsDTO.setDevopsEnvGroupId(devopsEnvGroupE.getId()); - devopsEnvGroupEnvsDTO.setDevopsEnvGroupName(devopsEnvGroupE.getName()); - devopsEnvGroupEnvsDTOS.add(devopsEnvGroupEnvsDTO); - } - }); - return devopsEnvGroupEnvsDTOS; - } - @Override public List listEnvTreeMenu(Long projectId) { List devopsEnvGroupEnvsDTOS = new ArrayList<>(); @@ -713,7 +662,14 @@ public DevopsEnvironmentInfoVO queryInfoById(Long projectId, Long environmentId) } gitlabUrl = gitlabUrl.endsWith("/") ? gitlabUrl.substring(0, gitlabUrl.length() - 1) : gitlabUrl; - vo.setGitlabUrl(String.format("%s/%s-%s-gitops/%s/", gitlabUrl, organizationDTO.getTenantNum(), projectDTO.getCode(), envInfo.getCode())); + vo.setGitlabUrl(String.format("%s/%s-%s-gitops/%s/", gitlabUrl, organizationDTO.getTenantNum(), projectDTO.getDevopsComponentCode(), envInfo.getCode())); + + // 设置环境所属集群所在项目 + Long clusterId = vo.getClusterId(); + DevopsClusterDTO devopsClusterDTO = devopsClusterMapper.selectByPrimaryKey(clusterId); + ProjectDTO clusterBelongedProject = baseServiceClientOperator.queryIamProjectById(devopsClusterDTO.getProjectId(), false, false, false, false, false); + vo.setClusterBelongedProjectName(clusterBelongedProject.getName()); + return vo; } @@ -920,7 +876,7 @@ public void handleCreateEnvSaga(EnvGitlabProjectPayload gitlabProjectPayload) { Tenant organizationDTO = baseServiceClientOperator.queryOrganizationById(projectDTO.getOrganizationId()); GitlabProjectDTO gitlabProjectDO = gitlabServiceClientOperator.queryProjectByName( - organizationDTO.getTenantNum() + "-" + projectDTO.getCode() + "-gitops", + organizationDTO.getTenantNum() + "-" + projectDTO.getDevopsComponentCode() + "-gitops", devopsEnvironmentDTO.getCode(), gitlabProjectPayload.getUserId(), false); @@ -974,9 +930,8 @@ public void handleCreateEnvSaga(EnvGitlabProjectPayload gitlabProjectPayload) { baseUpdate(devopsEnvironmentDTO); } - private void initUserPermissionWhenCreatingEnv(EnvGitlabProjectPayload gitlabProjectPayload, Long envId, Long - projectId) { - + @Override + public void initUserPermissionWhenCreatingEnv(EnvGitlabProjectPayload gitlabProjectPayload, Long envId, Long projectId) { // 跳过权限检查,项目下所有成员自动分配权限 if (Boolean.TRUE.equals(gitlabProjectPayload.getSkipCheckPermission())) { List iamUserIds = baseServiceClientOperator.getAllMemberIdsWithoutOwner(gitlabProjectPayload.getIamProjectId()); @@ -1091,7 +1046,7 @@ public EnvSyncStatusVO queryEnvSyncStatus(Long projectId, Long envId) { gitlabUrl = gitlabUrl.endsWith("/") ? gitlabUrl.substring(0, gitlabUrl.length() - 1) : gitlabUrl; envSyncStatusDTO.setCommitUrl(String.format("%s/%s-%s-gitops/%s/commit/", - gitlabUrl, organizationDTO.getTenantNum(), projectDTO.getCode(), + gitlabUrl, organizationDTO.getTenantNum(), projectDTO.getDevopsComponentCode(), devopsEnvironmentDTO.getCode())); return envSyncStatusDTO; } @@ -1608,7 +1563,7 @@ public DevopsEnvironmentDTO createSystemEnv(Long clusterId) { // 生成deployKey List sshKeys = FileUtil.getSshKey( - organizationDTO.getTenantNum() + "/" + projectDTO.getCode() + "/" + devopsEnvironmentDTO.getCode()); + organizationDTO.getTenantNum() + "/" + projectDTO.getDevopsComponentCode() + "/" + devopsEnvironmentDTO.getCode()); devopsEnvironmentDTO.setEnvIdRsa(sshKeys.get(0)); devopsEnvironmentDTO.setEnvIdRsaPub(sshKeys.get(1)); @@ -1620,7 +1575,7 @@ public DevopsEnvironmentDTO createSystemEnv(Long clusterId) { Integer gitlabUserId = TypeUtil.objToInteger(userAttrDTO.getGitlabUserId()); GitlabProjectDTO gitlabProjectDO = gitlabServiceClientOperator.queryProjectByName( GitOpsUtil.renderGroupPath(organizationDTO.getTenantNum(), - projectDTO.getCode(), + projectDTO.getDevopsComponentCode(), GitOpsConstants.CLUSTER_ENV_GROUP_SUFFIX), envCode, gitlabUserId, @@ -1689,7 +1644,7 @@ public void deleteSystemEnv(Long projectId, Long clusterId, String clusterCode, Integer gitlabUserId = TypeUtil.objToInteger(userAttrDTO.getGitlabUserId()); GitlabProjectDTO gitlabProjectDO = gitlabServiceClientOperator.queryProjectByName( GitOpsUtil.renderGroupPath(organizationDTO.getTenantNum(), - projectDTO.getCode(), + projectDTO.getDevopsComponentCode(), GitOpsConstants.CLUSTER_ENV_GROUP_SUFFIX), systemEnvProjectCode, gitlabUserId, @@ -1711,11 +1666,6 @@ public DevopsEnvironmentDTO queryByTokenWithClusterCode(String token) { return devopsEnvironmentMapper.queryByTokenWithClusterCode(token); } - @Override - public List listByProjectIdAndName(Long projectId, String envName) { - return devopsEnvironmentMapper.listByProjectIdAndName(projectId, envName); - } - @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED) @Override public void updateDevopsEnvGroupIdNullByProjectIdAndGroupId(Long projectId, Long envGroupId) { diff --git a/src/main/java/io/choerodon/devops/app/service/impl/DevopsGitServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/DevopsGitServiceImpl.java index bc0a230645..86788fc14b 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/DevopsGitServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/DevopsGitServiceImpl.java @@ -1,19 +1,7 @@ package io.choerodon.devops.app.service.impl; -import static io.choerodon.devops.infra.constant.KubernetesConstants.METADATA; -import static io.choerodon.devops.infra.constant.KubernetesConstants.NAME; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.util.*; -import java.util.function.Function; -import java.util.regex.Pattern; -import java.util.stream.Collectors; -import javax.annotation.PostConstruct; - import com.alibaba.fastjson.JSONObject; -import io.kubernetes.client.models.V1Endpoints; +import io.kubernetes.client.openapi.models.V1Endpoints; import org.eclipse.jgit.api.Git; import org.eclipse.jgit.api.errors.CheckoutConflictException; import org.jetbrains.annotations.NotNull; @@ -32,6 +20,18 @@ import org.springframework.util.StringUtils; import org.yaml.snakeyaml.Yaml; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.util.*; +import java.util.function.Function; +import java.util.regex.Pattern; +import java.util.stream.Collectors; +import javax.annotation.PostConstruct; + +import static io.choerodon.devops.infra.constant.KubernetesConstants.METADATA; +import static io.choerodon.devops.infra.constant.KubernetesConstants.NAME; + import io.choerodon.asgard.saga.annotation.Saga; import io.choerodon.asgard.saga.producer.StartSagaBuilder; import io.choerodon.asgard.saga.producer.TransactionalProducer; @@ -61,6 +61,7 @@ import io.choerodon.devops.infra.feign.operator.AsgardServiceClientOperator; import io.choerodon.devops.infra.feign.operator.BaseServiceClientOperator; import io.choerodon.devops.infra.feign.operator.GitlabServiceClientOperator; +import io.choerodon.devops.infra.mapper.DevopsBranchMapper; import io.choerodon.devops.infra.mapper.DevopsMergeRequestMapper; import io.choerodon.devops.infra.util.*; import io.choerodon.mybatis.pagehelper.domain.PageRequest; @@ -146,6 +147,8 @@ public class DevopsGitServiceImpl implements DevopsGitService { private DevopsProjectService devopsProjectService; @Autowired private AppExternalConfigService appExternalConfigService; + @Autowired + private DevopsBranchMapper devopsBranchMapper; /** * 初始化转换类和处理关系的类 @@ -368,7 +371,7 @@ public Page pageBranchByOptions(Long projectId, PageRequest pageable, String urlSlash = gitlabUrl.endsWith("/") ? "" : "/"; String path = String.format("%s%s%s-%s/%s", - gitlabUrl, urlSlash, organizationDTO.getTenantNum(), projectDTO.getCode(), applicationDTO.getCode()); + gitlabUrl, urlSlash, organizationDTO.getTenantNum(), projectDTO.getDevopsComponentCode(), applicationDTO.getCode()); Page devopsBranchDTOPageInfo = devopsBranchService.basePageBranch(appServiceId, pageable, params, null); Page devopsBranchVOPageInfo = ConvertUtils.convertPage(devopsBranchDTOPageInfo, BranchVO.class); @@ -590,7 +593,7 @@ public Page pageTagsByOptions(Long projectId, Long applicationId, String Tenant organizationDTO = baseServiceClientOperator.queryOrganizationById(projectDTO.getOrganizationId()); String urlSlash = gitlabUrl.endsWith("/") ? "" : "/"; String path = String.format("%s%s%s-%s/%s", - gitlabUrl, urlSlash, organizationDTO.getTenantNum(), projectDTO.getCode(), applicationDTO.getCode()); + gitlabUrl, urlSlash, organizationDTO.getTenantNum(), projectDTO.getDevopsComponentCode(), applicationDTO.getCode()); return ConvertUtils.convertPage(gitlabServiceClientOperator.pageTag(projectDTO, applicationDTO.getGitlabProjectId(), path, page, params, size, getGitlabUserId(), checkMember), TagVO.class); } @@ -707,10 +710,10 @@ public void fileResourceSync(PushWebHookVO pushWebHookVO) { //本地路径 final String path = GitOpsUtil.getLocalPathToStoreEnv(organizationDTO.getTenantNum(), - projectDTO.getCode(), devopsEnvironmentDTO.getClusterCode(), devopsEnvironmentDTO.getCode(), devopsEnvironmentDTO.getId()); + projectDTO.getDevopsComponentCode(), devopsEnvironmentDTO.getClusterCode(), devopsEnvironmentDTO.getCode(), devopsEnvironmentDTO.getId()); //生成环境git仓库ssh地址 final String url = GitUtil.getGitlabSshUrl( - pattern, gitUtil.getSshUrl(), organizationDTO.getTenantNum(), projectDTO.getCode(), + pattern, gitUtil.getSshUrl(), organizationDTO.getTenantNum(), projectDTO.getDevopsComponentCode(), devopsEnvironmentDTO.getCode(), EnvironmentType.forValue(devopsEnvironmentDTO.getType()), devopsEnvironmentDTO.getClusterCode()); @@ -818,13 +821,6 @@ private Map initResourceKindContainer() { return map; } - @Override - public void checkBranchName(Long projectId, Long applicationId, String branchName) { - if (Boolean.FALSE.equals(isBranchNameUnique(projectId, applicationId, branchName))) { - throw new CommonException("error.branch.exist"); - } - } - @Override public Boolean isBranchNameUnique(Long projectId, Long applicationId, String branchName) { AppServiceDTO applicationDTO = appServiceService.baseQuery(applicationId); @@ -1216,12 +1212,6 @@ private Git handDevopsEnvGitRepository(String path, String url, String envIdRsa) } } - - @Override - public BranchDTO baseQueryBranch(Integer gitLabProjectId, String branchName) { - return gitlabServiceClientOperator.queryBranch(gitLabProjectId, branchName); - } - @Override public Page pageBranchFilteredByIssueId(Long projectId, PageRequest pageable, Long appServiceId, String params, Long issueId) { Page branchDTOPage = devopsBranchService.basePageBranch(appServiceId, pageable, params, issueId); @@ -1270,7 +1260,7 @@ public void removeAssociation(Long projectId, Long appServiceId, Long branchId, }); // 查出剩下的和敏捷问题有关联的分支 - Set remainBranchIssueRelation = devopsIssueRelService.listRelationByIssueIdAndObjectType(projectId, DevopsIssueRelObjectTypeEnum.BRANCH.getValue(), issueId); + Set remainBranchIssueRelation = devopsIssueRelService.listRelationByIssueIdAndProjectIdAndObjectType(projectId, DevopsIssueRelObjectTypeEnum.BRANCH.getValue(), issueId); List devopsBranchVOS = remainBranchIssueRelation.stream().map(r -> { DevopsBranchVO devopsBranchVO = new DevopsBranchVO(); devopsBranchVO.setAppServiceCode(r.getAppServiceCode()); @@ -1367,7 +1357,8 @@ public Page listOwnedProjectByGroupId(Long projectId, Integer true, search, pageRequest.getPage(), - pageRequest.getSize()); + pageRequest.getSize(), + null); int totalElements = 0; if (gitlabProjectDTOS.size() < pageRequest.getSize()) { @@ -1378,7 +1369,8 @@ public Page listOwnedProjectByGroupId(Long projectId, Integer true, search, pageRequest.getPage() + 1, - pageRequest.getSize()); + pageRequest.getSize(), + null); if (CollectionUtils.isEmpty(nextProjects)) { totalElements = ((pageRequest.getPage() + 1) * pageRequest.getSize()); } else { @@ -1435,6 +1427,61 @@ public Page pageBranchBasicInfoByOptions(Long projectId, PageRequest p return ConvertUtils.convertPage(devopsBranchDTOPageInfo, BranchVO.class); } + @Override + public Integer syncBranch(Long projectId, Long appServiceId, Boolean sync) { + Integer syncCount = 0; + // 查询所有分支 + AppServiceDTO appServiceDTO = appServiceService.baseQuery(appServiceId); + checkGitlabAccessLevelService.checkGitlabPermission(appServiceDTO.getProjectId(), appServiceId, AppServiceEvent.BRANCH_SYNC); + CommonExAssertUtil.assertTrue(projectId.equals(appServiceDTO.getProjectId()), MiscConstants.ERROR_OPERATING_RESOURCE_IN_OTHER_PROJECT); + + UserAttrDTO userAttrDTO = userAttrService.baseQueryById(TypeUtil.objToLong(GitUserNameUtil.getUserId())); + List branchDTOS = gitlabServiceClientOperator.listBranch(appServiceDTO.getGitlabProjectId(), + TypeUtil.objToInteger(userAttrDTO.getGitlabUserId())); + if (CollectionUtils.isEmpty(branchDTOS)) { + return syncCount; + } + List gitlabBranches = branchDTOS.stream().map(BranchDTO::getName).collect(Collectors.toList()); + // 查询c7n已经存在的分支 + DevopsBranchDTO queryBranchDTO = new DevopsBranchDTO(); + queryBranchDTO.setAppServiceId(appServiceId); + List devopsBranches = devopsBranchMapper.select(queryBranchDTO).stream().map(DevopsBranchDTO::getBranchName).collect(Collectors.toList()); + // 创建分支 + for (BranchDTO branchDTO : branchDTOS) { + if (!devopsBranches.contains(branchDTO.getName())) { + syncCount = syncCount + 1; + if (sync) { + CommitDTO commitDTO = branchDTO.getCommit(); + DevopsBranchDTO devopsBranchDTO = new DevopsBranchDTO(); + devopsBranchDTO.setBranchName(branchDTO.getName()); + devopsBranchDTO.setUserId(userAttrDTO.getGitlabUserId()); + devopsBranchDTO.setAppServiceId(appServiceId); + + devopsBranchDTO.setCheckoutDate(commitDTO.getCommittedDate()); + devopsBranchDTO.setCheckoutCommit(commitDTO.getId()); + + devopsBranchDTO.setLastCommitUser(userAttrDTO.getGitlabUserId()); + devopsBranchDTO.setLastCommit(commitDTO.getId()); + devopsBranchDTO.setLastCommitMsg(LogUtil.cutOutString(commitDTO.getMessage(), MiscConstants.DEVOPS_BRANCH_LAST_COMMIT_MESSAGE_MAX_LENGTH)); + devopsBranchDTO.setLastCommitDate(commitDTO.getCommittedDate()); + + devopsBranchService.baseCreate(devopsBranchDTO); + } + } + } + // 删除不存在分支 + for (String t : devopsBranches) { + if (!gitlabBranches.contains(t)) { + syncCount = syncCount + 1; + if (sync) { + devopsBranchService.baseDelete(appServiceId, t); + } + } + } + return syncCount; + } + + @NotNull private Page listExternalBranch(PageRequest pageable, String params, AppServiceDTO applicationDTO) { AppExternalConfigDTO appExternalConfigDTO = appExternalConfigService.baseQueryWithPassword(applicationDTO.getExternalConfigId()); diff --git a/src/main/java/io/choerodon/devops/app/service/impl/DevopsGitlabPipelineServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/DevopsGitlabPipelineServiceImpl.java index 55fbcede16..01f629ecd0 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/DevopsGitlabPipelineServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/DevopsGitlabPipelineServiceImpl.java @@ -409,7 +409,7 @@ public Page pageByOptions(Long appServiceId, String bran } devopsGitlabPipelineDTO.setStages(stages); devopsGitlabPipelineDTO.setGitlabUrl(gitlabUrl + "/" - + organization.getTenantNum() + "-" + projectDTO.getCode() + "/" + + organization.getTenantNum() + "-" + projectDTO.getDevopsComponentCode() + "/" + appServiceDTO.getCode() + ".git"); devopsGiltabPipelineDTOS.add(devopsGitlabPipelineDTO); }); @@ -465,11 +465,6 @@ public Page basePageByApplicationId(Long appServiceId, devopsGitlabPipelineMapper.listDevopsGitlabPipeline(appServiceId, startTime == null ? null : new java.sql.Date(startTime.getTime()), endTime == null ? null : new java.sql.Date(endTime.getTime()))); } - @Override - public void baseDeleteWithoutCommit() { - devopsGitlabPipelineMapper.deleteWithoutCommit(); - } - @Override public List baseListByAppIdAndBranch(Long appServiceId, String branch) { return devopsGitlabPipelineMapper.listByBranch(appServiceId, branch); diff --git a/src/main/java/io/choerodon/devops/app/service/impl/DevopsHelmConfigServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/DevopsHelmConfigServiceImpl.java new file mode 100644 index 0000000000..d8ee43c55b --- /dev/null +++ b/src/main/java/io/choerodon/devops/app/service/impl/DevopsHelmConfigServiceImpl.java @@ -0,0 +1,398 @@ +package io.choerodon.devops.app.service.impl; + +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.http.*; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.Assert; +import org.springframework.util.ObjectUtils; +import org.springframework.web.client.RestTemplate; + +import io.choerodon.core.exception.CommonException; +import io.choerodon.core.iam.ResourceLevel; +import io.choerodon.devops.api.vo.DevopsHelmConfigVO; +import io.choerodon.devops.app.service.AppServiceHelmRelService; +import io.choerodon.devops.app.service.DevopsHelmConfigService; +import io.choerodon.devops.infra.constant.ResourceCheckConstant; +import io.choerodon.devops.infra.dto.AppServiceHelmRelDTO; +import io.choerodon.devops.infra.dto.DevopsHelmConfigDTO; +import io.choerodon.devops.infra.dto.iam.IamUserDTO; +import io.choerodon.devops.infra.dto.iam.ProjectDTO; +import io.choerodon.devops.infra.dto.iam.Tenant; +import io.choerodon.devops.infra.feign.operator.BaseServiceClientOperator; +import io.choerodon.devops.infra.mapper.DevopsHelmConfigMapper; +import io.choerodon.devops.infra.util.ConvertUtils; +import io.choerodon.devops.infra.util.MapperUtil; + +@Service +public class DevopsHelmConfigServiceImpl implements DevopsHelmConfigService { + + @Autowired + private DevopsHelmConfigMapper devopsHelmConfigMapper; + + @Autowired + private AppServiceHelmRelService appServiceHelmRelService; + + @Autowired + private BaseServiceClientOperator baseServiceClientOperator; + + @Autowired + @Qualifier(value = "restTemplateForIp") + private RestTemplate restTemplate; + + @Override + public List listHelmConfig(Long projectId) { + List devopsHelmConfigDTOS = new ArrayList<>(); + + // 查询项目层设置helm仓库 + DevopsHelmConfigDTO helmConfigSearchDTOOnProject = new DevopsHelmConfigDTO(); + helmConfigSearchDTOOnProject.setResourceId(projectId); + helmConfigSearchDTOOnProject.setResourceType(ResourceLevel.PROJECT.value()); + helmConfigSearchDTOOnProject.setDeleted(false); + List devopsHelmConfigDTOListOnProject = devopsHelmConfigMapper.select(helmConfigSearchDTOOnProject); + devopsHelmConfigDTOS.addAll(devopsHelmConfigDTOListOnProject); + DevopsHelmConfigDTO defaultDevopsHelmConfigDTOOnProject = null; + if (devopsHelmConfigDTOS.size() != 0) { + for (DevopsHelmConfigDTO devopsHelmConfigDTO : devopsHelmConfigDTOS) { + if (Boolean.TRUE.equals(devopsHelmConfigDTO.getRepoDefault())) { + defaultDevopsHelmConfigDTOOnProject = devopsHelmConfigDTO; + } + } + } + devopsHelmConfigDTOS.remove(defaultDevopsHelmConfigDTOOnProject); + devopsHelmConfigDTOS = devopsHelmConfigDTOS.stream().sorted(Comparator.comparing(DevopsHelmConfigDTO::getCreationDate, (i, j) -> { + if (i.before(j)) { + return -1; + } else if (i.equals(j)) { + return 0; + } + return 1; + }).reversed()).collect(Collectors.toList()); + + // 查询组织层helm仓库 + ProjectDTO projectDTO = baseServiceClientOperator.queryIamProjectById(projectId, false, false, false, false, false); + DevopsHelmConfigDTO helmConfigSearchDTOOnOrganization = new DevopsHelmConfigDTO(); + helmConfigSearchDTOOnOrganization.setResourceId(projectDTO.getOrganizationId()); + helmConfigSearchDTOOnOrganization.setResourceType(ResourceLevel.ORGANIZATION.value()); + helmConfigSearchDTOOnOrganization.setRepoDefault(true); + DevopsHelmConfigDTO devopsHelmConfigDTOtOnOrganization = devopsHelmConfigMapper.selectOne(helmConfigSearchDTOOnOrganization); + if (devopsHelmConfigDTOtOnOrganization != null) { + Tenant tenant = baseServiceClientOperator.queryOrganizationById(projectDTO.getOrganizationId()); + devopsHelmConfigDTOtOnOrganization.setName(tenant.getTenantNum() + "-" + projectDTO.getCode()); + if (defaultDevopsHelmConfigDTOOnProject != null) { + devopsHelmConfigDTOtOnOrganization.setRepoDefault(false); + } + devopsHelmConfigDTOS.add(0, devopsHelmConfigDTOtOnOrganization); + } else { + // 如果组织层的仓库为空,查询平台默认 + DevopsHelmConfigDTO helmConfigSearchDTOOnSite = new DevopsHelmConfigDTO(); + helmConfigSearchDTOOnSite.setResourceType(ResourceLevel.SITE.value()); + helmConfigSearchDTOOnSite.setRepoDefault(true); + DevopsHelmConfigDTO devopsHelmConfigDTOOnSite = devopsHelmConfigMapper.selectOne(helmConfigSearchDTOOnSite); + if (devopsHelmConfigDTOOnSite == null) { + throw new CommonException("error.helm.config.site.exist"); + } + Tenant tenant = baseServiceClientOperator.queryOrganizationById(projectDTO.getOrganizationId()); + devopsHelmConfigDTOOnSite.setName(tenant.getTenantNum() + "-" + projectDTO.getCode()); + if (defaultDevopsHelmConfigDTOOnProject != null) { + devopsHelmConfigDTOOnSite.setRepoDefault(false); + } + devopsHelmConfigDTOS.add(0, devopsHelmConfigDTOOnSite); + } + + if (defaultDevopsHelmConfigDTOOnProject != null) { + devopsHelmConfigDTOS.add(0, defaultDevopsHelmConfigDTOOnProject); + } + + List devopsHelmConfigVOS = ConvertUtils.convertList(devopsHelmConfigDTOS, DevopsHelmConfigVO.class); + + Set creatorIds = devopsHelmConfigDTOS.stream().map(DevopsHelmConfigDTO::getCreatedBy).collect(Collectors.toSet()); + List iamUserDTOList = baseServiceClientOperator.listUsersByIds(new ArrayList<>(creatorIds)); + Map iamUserDTOMap = iamUserDTOList.stream().collect(Collectors.toMap(IamUserDTO::getId, Function.identity())); + + devopsHelmConfigVOS.forEach(c -> { + c.setPassword(null); + IamUserDTO creator = iamUserDTOMap.get(c.getCreatedBy()); + if (creator != null) { + c.setCreatorImageUrl(creator.getImageUrl()); + c.setCreatorLoginName(creator.getLoginName()); + c.setCreatorRealName(creator.getRealName()); + } + }); + return devopsHelmConfigVOS; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public DevopsHelmConfigVO createDevopsHelmConfigOnProjectLevel(Long projectId, DevopsHelmConfigVO devopsHelmConfigVO) { + checkNameExistsThrowEx(projectId, null, devopsHelmConfigVO.getName()); + DevopsHelmConfigDTO devopsHelmConfigDTO = ConvertUtils.convertObject(devopsHelmConfigVO, DevopsHelmConfigDTO.class); + devopsHelmConfigDTO.setResourceType(ResourceLevel.PROJECT.value()); + devopsHelmConfigDTO.setResourceId(projectId); + devopsHelmConfigDTO.setRepoPrivate(!ObjectUtils.isEmpty(devopsHelmConfigDTO.getUsername()) && !ObjectUtils.isEmpty(devopsHelmConfigDTO.getPassword())); + + DevopsHelmConfigDTO result = MapperUtil.resultJudgedInsertSelective(devopsHelmConfigMapper, devopsHelmConfigDTO, "error.helm.config.insert"); + return ConvertUtils.convertObject(result, DevopsHelmConfigVO.class); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public DevopsHelmConfigVO updateDevopsHelmConfigOnProjectLevel(Long projectId, DevopsHelmConfigVO devopsHelmConfigVO) { + checkNameExistsThrowEx(projectId, devopsHelmConfigVO.getId(), devopsHelmConfigVO.getName()); + DevopsHelmConfigDTO devopsHelmConfigDTO = ConvertUtils.convertObject(devopsHelmConfigVO, DevopsHelmConfigDTO.class); + devopsHelmConfigDTO.setResourceType(ResourceLevel.PROJECT.value()); + devopsHelmConfigDTO.setResourceId(projectId); + + devopsHelmConfigDTO.setRepoPrivate(!ObjectUtils.isEmpty(devopsHelmConfigDTO.getUsername()) && !ObjectUtils.isEmpty(devopsHelmConfigDTO.getPassword())); + devopsHelmConfigDTO.setRepoDefault(null); + devopsHelmConfigDTO.setDeleted(null); + + MapperUtil.resultJudgedUpdateByPrimaryKeySelective(devopsHelmConfigMapper, devopsHelmConfigDTO, "error.helm.config.update"); + + return ConvertUtils.convertObject(devopsHelmConfigDTO, DevopsHelmConfigVO.class); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteDevopsHelmConfig(Long projectId, Long helmConfigId) { + DevopsHelmConfigDTO oldDevopsHelmConfigDTO = devopsHelmConfigMapper.listObjectVersionNumberById(helmConfigId); + if (oldDevopsHelmConfigDTO == null) { + return; + } + + DevopsHelmConfigDTO devopsHelmConfigDTO = new DevopsHelmConfigDTO(); + devopsHelmConfigDTO.setResourceId(projectId); + devopsHelmConfigDTO.setResourceType(ResourceLevel.PROJECT.value()); + devopsHelmConfigDTO.setId(helmConfigId); + devopsHelmConfigDTO.setDeleted(true); + devopsHelmConfigDTO.setObjectVersionNumber(oldDevopsHelmConfigDTO.getObjectVersionNumber()); + devopsHelmConfigDTO.setName(UUID.randomUUID().toString()); + + MapperUtil.resultJudgedUpdateByPrimaryKeySelective(devopsHelmConfigMapper, devopsHelmConfigDTO, "error.helm.config.delete"); + } + + @Override + public DevopsHelmConfigVO queryDevopsHelmConfig(Long projectId, Long helmConfigId) { + DevopsHelmConfigDTO devopsHelmConfigSearchDTO = new DevopsHelmConfigDTO(); + devopsHelmConfigSearchDTO.setResourceType(ResourceLevel.PROJECT.value()); + devopsHelmConfigSearchDTO.setResourceId(projectId); + devopsHelmConfigSearchDTO.setId(helmConfigId); + + DevopsHelmConfigDTO devopsHelmConfigDTO = devopsHelmConfigMapper.selectOne(devopsHelmConfigSearchDTO); + devopsHelmConfigDTO.setPassword(null); + + return ConvertUtils.convertObject(devopsHelmConfigDTO, DevopsHelmConfigVO.class); + } + + @Override + public DevopsHelmConfigDTO queryById(Long id) { + return devopsHelmConfigMapper.selectByPrimaryKey(id); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void setDefaultDevopsHelmConfig(Long projectId, Long helmConfigId) { + DevopsHelmConfigDTO devopsHelmConfigDTO = devopsHelmConfigMapper.selectByPrimaryKey(helmConfigId); + + // 先将项目层的所有仓库是否为默认置为false + devopsHelmConfigMapper.updateAllHelmConfigRepoDefaultToFalse(projectId); + + // 如果helm默认仓库仍是项目层,那么将指定的仓库设置为默认仓库 + if (!ResourceLevel.SITE.value().equals(devopsHelmConfigDTO.getResourceType()) && !ResourceLevel.ORGANIZATION.value().equals(devopsHelmConfigDTO.getResourceType())) { + devopsHelmConfigMapper.updateHelmConfigRepoDefaultToTrue(projectId, helmConfigId); + } + } + + @Override + public DevopsHelmConfigDTO queryDefaultDevopsHelmConfigByLevel(String resourceType, Long resourceId) { + Assert.notNull(resourceType, ResourceCheckConstant.ERROR_RESOURCE_TYPE_IS_NULL); + Assert.notNull(resourceId, ResourceCheckConstant.ERROR_RESOURCE_ID_IS_NULL); + + DevopsHelmConfigDTO devopsHelmConfigDTO = new DevopsHelmConfigDTO(); + devopsHelmConfigDTO.setResourceType(resourceType); + devopsHelmConfigDTO.setResourceId(resourceId); + devopsHelmConfigDTO.setRepoDefault(true); + devopsHelmConfigDTO.setDeleted(false); + + return devopsHelmConfigMapper.selectOne(devopsHelmConfigDTO); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void createDevopsHelmConfig(DevopsHelmConfigDTO devopsHelmConfigDTO) { + MapperUtil.resultJudgedInsertSelective(devopsHelmConfigMapper, devopsHelmConfigDTO, "error.helm.config.insert"); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateDevopsHelmConfig(DevopsHelmConfigDTO devopsHelmConfigDTO) { + MapperUtil.resultJudgedUpdateByPrimaryKeySelective(devopsHelmConfigMapper, devopsHelmConfigDTO, "error.helm.config.update"); + } + + @Override + public void updateDevopsHelmConfigToNonDefaultRepoOnOrganization(Long resourceId) { + devopsHelmConfigMapper.updateDevopsHelmConfigToNonDefaultRepoOnOrganization(resourceId); + } + + @Override + public DevopsHelmConfigDTO queryAppConfig(Long appServiceId, Long projectId, Long tenantId) { + DevopsHelmConfigDTO devopsHelmConfigDTO; + AppServiceHelmRelDTO appServiceHelmRelDTO = appServiceHelmRelService.queryByAppServiceId(appServiceId); + if (appServiceHelmRelDTO != null) { + return queryById(appServiceHelmRelDTO.getHelmConfigId()); + } + devopsHelmConfigDTO = queryDefaultDevopsHelmConfigByLevel(ResourceLevel.PROJECT.value(), projectId); + if (devopsHelmConfigDTO != null) { + return devopsHelmConfigDTO; + } + + devopsHelmConfigDTO = queryDefaultDevopsHelmConfigByLevel(ResourceLevel.ORGANIZATION.value(), tenantId); + if (devopsHelmConfigDTO != null) { + return devopsHelmConfigDTO; + } + + devopsHelmConfigDTO = queryDefaultDevopsHelmConfigByLevel(ResourceLevel.SITE.value(), 0L); + return devopsHelmConfigDTO; + } + + @Override + public boolean checkNameExists(Long projectId, Long helmConfigId, String name) { + return devopsHelmConfigMapper.checkNameExists(projectId, helmConfigId, name); + } + + @Override + public void checkNameExistsThrowEx(Long projectId, Long helmConfigId, String name) { + if (devopsHelmConfigMapper.checkNameExists(projectId, helmConfigId, name)) { + throw new CommonException("error.helm.config.name.exists"); + } + } + + @Override + public String getIndexContent(Long projectId, Long helmConfigId) { + DevopsHelmConfigDTO devopsHelmConfigDTO = devopsHelmConfigMapper.selectByPrimaryKey(helmConfigId); + + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.MULTIPART_FORM_DATA); + if (devopsHelmConfigDTO.getRepoPrivate()) { + String credentials = devopsHelmConfigDTO.getUsername() + ":" + + devopsHelmConfigDTO.getPassword(); + headers.add("Authorization", "Basic " + Base64.getEncoder().encodeToString(credentials.getBytes())); + } + + HttpEntity requestEntity = new HttpEntity<>(headers); + String helmRepoUrl = devopsHelmConfigDTO.getUrl(); + helmRepoUrl = helmRepoUrl.endsWith("/") ? helmRepoUrl.substring(0, devopsHelmConfigDTO.getUrl().length() - 1) : helmRepoUrl; + ResponseEntity exchange = restTemplate.exchange(helmRepoUrl + "/index.yaml", HttpMethod.GET, requestEntity, String.class); + + if (!HttpStatus.OK.equals(exchange.getStatusCode())) { + throw new CommonException("error.get.helm.chart"); + } + return exchange.getBody(); + } + + + @Override + public List listHelmConfigOnApp(Long projectId, Long appServiceId) { + List devopsHelmConfigDTOS = new ArrayList<>(); + + // 查询项目层设置helm仓库 + DevopsHelmConfigDTO helmConfigSearchDTOOnProject = new DevopsHelmConfigDTO(); + helmConfigSearchDTOOnProject.setResourceId(projectId); + helmConfigSearchDTOOnProject.setResourceType(ResourceLevel.PROJECT.value()); + List devopsHelmConfigDTOListOnProject = devopsHelmConfigMapper.listHelmConfigWithIdAndName(projectId, ResourceLevel.PROJECT.value()); + devopsHelmConfigDTOS.addAll(devopsHelmConfigDTOListOnProject); + DevopsHelmConfigDTO defaultDevopsHelmConfigDTOOnProject = null; + if (devopsHelmConfigDTOS.size() != 0) { + for (DevopsHelmConfigDTO devopsHelmConfigDTO : devopsHelmConfigDTOS) { + if (Boolean.TRUE.equals(devopsHelmConfigDTO.getRepoDefault())) { + defaultDevopsHelmConfigDTOOnProject = devopsHelmConfigDTO; + } + } + } + devopsHelmConfigDTOS.remove(defaultDevopsHelmConfigDTOOnProject); + devopsHelmConfigDTOS = devopsHelmConfigDTOS.stream().sorted(Comparator.comparing(DevopsHelmConfigDTO::getCreationDate, (i, j) -> { + if (i.before(j)) { + return -1; + } else if (i.equals(j)) { + return 0; + } + return 1; + }).reversed()).collect(Collectors.toList()); + + // 查询组织层helm仓库 + ProjectDTO projectDTO = baseServiceClientOperator.queryIamProjectById(projectId, false, false, false, false, false); + DevopsHelmConfigDTO helmConfigSearchDTOOnOrganization = new DevopsHelmConfigDTO(); + helmConfigSearchDTOOnOrganization.setResourceId(projectDTO.getOrganizationId()); + helmConfigSearchDTOOnOrganization.setResourceType(ResourceLevel.ORGANIZATION.value()); + helmConfigSearchDTOOnOrganization.setRepoDefault(true); + DevopsHelmConfigDTO devopsHelmConfigDTOtOnOrganization = devopsHelmConfigMapper.selectOneWithIdAndName(projectDTO.getOrganizationId(), ResourceLevel.ORGANIZATION.value(), true); + if (devopsHelmConfigDTOtOnOrganization != null) { + Tenant tenant = baseServiceClientOperator.queryOrganizationById(projectDTO.getOrganizationId()); + devopsHelmConfigDTOtOnOrganization.setName(tenant.getTenantNum() + "-" + projectDTO.getCode()); + devopsHelmConfigDTOS.add(0, devopsHelmConfigDTOtOnOrganization); + } else { + // 如果组织层的仓库为空,查询平台默认 + DevopsHelmConfigDTO helmConfigSearchDTOOnSite = new DevopsHelmConfigDTO(); + helmConfigSearchDTOOnSite.setResourceType(ResourceLevel.SITE.value()); + helmConfigSearchDTOOnSite.setRepoDefault(true); + DevopsHelmConfigDTO devopsHelmConfigDTOOnSite = devopsHelmConfigMapper.selectOneWithIdAndName(0L, ResourceLevel.SITE.value(), true); + if (devopsHelmConfigDTOOnSite == null) { + throw new CommonException("error.helm.config.site.exist"); + } + Tenant tenant = baseServiceClientOperator.queryOrganizationById(projectDTO.getOrganizationId()); + devopsHelmConfigDTOOnSite.setName(tenant.getTenantNum() + "-" + projectDTO.getCode()); + devopsHelmConfigDTOS.add(0, devopsHelmConfigDTOOnSite); + } + + if (defaultDevopsHelmConfigDTOOnProject != null) { + devopsHelmConfigDTOS.add(0, defaultDevopsHelmConfigDTOOnProject); + } + + if (appServiceId != null) { + DevopsHelmConfigDTO devopsHelmConfigDTORelatedWithAppService = devopsHelmConfigMapper.selectWithIdAndNameByAppServiceId(appServiceId); + List helmConfigIds = devopsHelmConfigDTOS.stream().map(DevopsHelmConfigDTO::getId).collect(Collectors.toList()); + if (devopsHelmConfigDTORelatedWithAppService != null && !helmConfigIds.contains(devopsHelmConfigDTORelatedWithAppService.getId())) { + devopsHelmConfigDTOS.add(0, devopsHelmConfigDTORelatedWithAppService); + } + } + + return ConvertUtils.convertList(devopsHelmConfigDTOS, DevopsHelmConfigVO.class); + } + + @Override + public void batchInsertInNewTrans(List devopsHelmConfigDTOS) { + devopsHelmConfigMapper.batchInsert(devopsHelmConfigDTOS); + } + + @Override + public byte[] downloadChart(Long helmConfigId, String chartUrl) { + DevopsHelmConfigDTO devopsHelmConfigDTO = devopsHelmConfigMapper.selectByPrimaryKey(helmConfigId); + + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.MULTIPART_FORM_DATA); + if (devopsHelmConfigDTO.getRepoPrivate()) { + String credentials = devopsHelmConfigDTO.getUsername() + ":" + + devopsHelmConfigDTO.getPassword(); + headers.add("Authorization", "Basic " + Base64.getEncoder().encodeToString(credentials.getBytes())); + } + + HttpEntity requestEntity = new HttpEntity<>(headers); + + String helmRepoUrl = devopsHelmConfigDTO.getUrl(); + helmRepoUrl = helmRepoUrl.endsWith("/") ? helmRepoUrl.substring(0, devopsHelmConfigDTO.getUrl().length() - 1) : helmRepoUrl; + + ResponseEntity exchange; + try { + exchange = restTemplate.exchange(helmRepoUrl + "/" + chartUrl, HttpMethod.GET, requestEntity, byte[].class); + } catch (Exception e) { + throw new CommonException("error.helm.chart.download", e.getMessage()); + } + + return exchange.getBody(); + } +} diff --git a/src/main/java/io/choerodon/devops/app/service/impl/DevopsHostAppServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/DevopsHostAppServiceImpl.java index b0d5c81f49..29e9814003 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/DevopsHostAppServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/DevopsHostAppServiceImpl.java @@ -284,6 +284,10 @@ public Page pagingAppByHost(Long projectId, Long hostId, PageRe } + if (RdupmTypeEnum.DOCKER.value().equals(devopsHostAppVO.getRdupmType())) { + devopsHostAppVO.setDevopsHostCommandDTO(devopsHostCommandService.queryDockerInstanceLatest(devopsHostAppVO.getId(), HostResourceType.DOCKER_PROCESS.value())); + } + devopsHostAppVO.setHostStatus(hostConnectionHandler.getHostConnectionStatus(devopsHostAppVO.getHostId()) ? CONNECTED : DISCONNECTED); }); return page; @@ -350,6 +354,13 @@ public DevopsHostAppVO queryAppById(Long projectId, Long id) { devopsHostAppVO.setCreator(creator); devopsHostAppVO.setUpdater(updater); + if (devopsHostAppVO.getDevopsHostCommandDTO()==null){ + DevopsHostCommandDTO defaultDevopsHostCommandDTO = new DevopsHostCommandDTO(); + defaultDevopsHostCommandDTO.setHostId(devopsHostAppVO.getHostId()); + defaultDevopsHostCommandDTO.setStatus("failed"); + defaultDevopsHostCommandDTO.setError("Operation missing"); + devopsHostAppVO.setDevopsHostCommandDTO(defaultDevopsHostCommandDTO); + } return devopsHostAppVO; } diff --git a/src/main/java/io/choerodon/devops/app/service/impl/DevopsHostCommandServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/DevopsHostCommandServiceImpl.java index 41bccd7326..8ad35a2d46 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/DevopsHostCommandServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/DevopsHostCommandServiceImpl.java @@ -55,6 +55,12 @@ public DevopsHostCommandDTO queryInstanceLatest(Long instanceId, String instance return devopsHostCommandMapper.queryInstanceLatest(instanceId, instanceType); } + + @Override + public DevopsHostCommandDTO queryDockerInstanceLatest(Long instanceId, String instanceType) { + return devopsHostCommandMapper.queryDockerInstanceLatest(instanceId, instanceType); + } + @Override public List listStagnatedRecord(String hostId) { SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DevopsHostConstants.DATE_PATTERN); @@ -78,9 +84,4 @@ public List listByIds(Set missCommands) { } return devopsHostCommandMapper.listByIds(missCommands); } - - @Override - public List listByTypeAndInsIds(Set insIds, String instanceType) { - return devopsHostCommandMapper.listByTypeAndInsIds(insIds, instanceType); - } } diff --git a/src/main/java/io/choerodon/devops/app/service/impl/DevopsHostServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/DevopsHostServiceImpl.java index fa611d6eaa..33026aee56 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/DevopsHostServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/DevopsHostServiceImpl.java @@ -14,8 +14,6 @@ import net.schmizz.sshj.common.IOUtils; import org.apache.commons.lang3.StringUtils; import org.hzero.websocket.helper.KeySocketSendHelper; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Lazy; @@ -61,8 +59,6 @@ */ @Service public class DevopsHostServiceImpl implements DevopsHostService { - private static final Logger LOGGER = LoggerFactory.getLogger(DevopsHostServiceImpl.class); - public static final String PERMISSION_LABEL = "permissionLabel"; private static final String ERROR_HOST_NOT_FOUND = "error.host.not.found"; @@ -307,13 +303,13 @@ public boolean isSshIpPortUnique(Long projectId, String ip, Integer sshPort) { } @Override - public boolean HostIdInstanceIdMatch(Long hostId, Long instanceId) { + public boolean hostIdInstanceIdMatch(Long hostId, Long instanceId) { DevopsHostAppDTO devopsHostAppDTO = devopsHostAppMapper.selectByPrimaryKey(instanceId); return devopsHostAppDTO != null && devopsHostAppDTO.getHostId().equals(hostId); } @Override - public boolean HostIdDockerInstanceMatch(Long hostId, Long instanceId) { + public boolean hostIdDockerInstanceMatch(Long hostId, Long instanceId) { DevopsDockerInstanceDTO devopsDockerInstanceDTO = devopsDockerInstanceMapper.selectByPrimaryKey(instanceId); return devopsDockerInstanceDTO != null && devopsDockerInstanceDTO.getHostId().equals(hostId); } @@ -328,7 +324,6 @@ public Page pageByOptions(Long projectId, PageRequest pageRequest, Map hostPermissionMap = new HashMap<>(); if (projectOwnerOrRoot) { devopsHostVOList = devopsHostMapper.listByOptions(projectId, searchParam, hostStatus); - List hostIds = devopsHostVOList.stream().map(DevopsHostVO::getId).collect(Collectors.toList()); } else { devopsHostVOList = devopsHostMapper.listMemberHostByOptions(projectId, searchParam, hostStatus, DetailsHelper.getUserDetails().getUserId()); if (CollectionUtils.isEmpty(devopsHostVOList)) { diff --git a/src/main/java/io/choerodon/devops/app/service/impl/DevopsHzeroDeployDetailsServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/DevopsHzeroDeployDetailsServiceImpl.java index 82d2b86ed5..2faeb16aad 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/DevopsHzeroDeployDetailsServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/DevopsHzeroDeployDetailsServiceImpl.java @@ -81,14 +81,6 @@ public DevopsHzeroDeployDetailsDTO baseQueryByAppId(Long appId) { return devopsHzeroDeployDetailsMapper.selectOne(devopsHzeroDeployDetailsDTO); } - @Override - public DevopsHzeroDeployDetailsDTO baseQueryDeployingByEnvIdAndInstanceCode(Long envId, String appCode) { - Assert.notNull(envId, ResourceCheckConstant.ERROR_ENV_ID_IS_NULL); - Assert.notNull(appCode, ResourceCheckConstant.ERROR_INSTANCE_CODE_IS_NULL); - - return devopsHzeroDeployDetailsMapper.baseQueryDeployingByEnvIdAndInstanceCode(envId, appCode); - } - @Override public List listNotSuccessRecordId(Long recordId) { return devopsHzeroDeployDetailsMapper.listNotSuccessRecordId(recordId); diff --git a/src/main/java/io/choerodon/devops/app/service/impl/DevopsIngressServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/DevopsIngressServiceImpl.java index 41647438e1..64a608cf05 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/DevopsIngressServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/DevopsIngressServiceImpl.java @@ -1,15 +1,9 @@ package io.choerodon.devops.app.service.impl; -import java.util.*; -import java.util.regex.Pattern; -import java.util.stream.Collectors; -import javax.annotation.Nullable; - import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; -import io.kubernetes.client.JSON; -import io.kubernetes.client.custom.IntOrString; -import io.kubernetes.client.models.*; +import io.kubernetes.client.openapi.JSON; +import io.kubernetes.client.openapi.models.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; @@ -20,6 +14,11 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.util.Assert; +import java.util.*; +import java.util.regex.Pattern; +import java.util.stream.Collectors; +import javax.annotation.Nullable; + import io.choerodon.asgard.saga.annotation.Saga; import io.choerodon.asgard.saga.producer.StartSagaBuilder; import io.choerodon.asgard.saga.producer.TransactionalProducer; @@ -142,9 +141,9 @@ public void createIngress(Long projectId, DevopsIngressVO devopsIngressVO) { } } - // 初始化V1beta1Ingress对象 + // 初始化V1Ingress对象 String certName = getCertName(devopsIngressVO.getCertId()); - V1beta1Ingress v1beta1Ingress = initV1beta1Ingress(devopsIngressVO.getDomain(), devopsIngressVO.getName(), certName, devopsIngressVO.getAnnotations()); + V1Ingress v1beta1Ingress = initV1Ingress(devopsIngressVO.getDomain(), devopsIngressVO.getName(), certName, devopsIngressVO.getAnnotations()); // 处理创建域名数据 DevopsIngressDTO devopsIngressDO = handlerIngress(devopsIngressVO, projectId, v1beta1Ingress); @@ -175,9 +174,9 @@ public IngressSagaPayload createForBatchDeployment(DevopsEnvironmentDTO devopsEn } } - // 初始化V1beta1Ingress对象 + // 初始化V1Ingress对象 String certName = getCertName(devopsIngressVO.getCertId()); - V1beta1Ingress v1beta1Ingress = initV1beta1Ingress(devopsIngressVO.getDomain(), devopsIngressVO.getName(), certName, devopsIngressVO.getAnnotations()); + V1Ingress v1beta1Ingress = initV1Ingress(devopsIngressVO.getDomain(), devopsIngressVO.getName(), certName, devopsIngressVO.getAnnotations()); // 处理创建域名数据 DevopsIngressDTO devopsIngressDTO = handlerIngress(devopsIngressVO, projectId, v1beta1Ingress); @@ -193,7 +192,7 @@ public IngressSagaPayload createForBatchDeployment(DevopsEnvironmentDTO devopsEn IngressSagaPayload ingressSagaPayload = new IngressSagaPayload(devopsEnvironmentDTO.getProjectId(), userAttrDTO.getGitlabUserId()); ingressSagaPayload.setDevopsIngressDTO(devopsIngressDTO); ingressSagaPayload.setCreated(true); - ingressSagaPayload.setV1beta1Ingress(v1beta1Ingress); + ingressSagaPayload.setV1Ingress(v1beta1Ingress); ingressSagaPayload.setDevopsEnvironmentDTO(devopsEnvironmentDTO); return ingressSagaPayload; } @@ -230,9 +229,9 @@ public void createIngressByGitOps(DevopsIngressVO devopsIngressVO, Long projectI clusterConnectionHandler.checkEnvConnection(devopsEnvironmentDTO.getClusterId()); - // 初始化V1beta1Ingress对象 + // 初始化V1Ingress对象 String certName = getCertName(devopsIngressVO.getCertId()); - V1beta1Ingress v1beta1Ingress = initV1beta1Ingress(devopsIngressVO.getDomain(), devopsIngressVO.getName(), certName, devopsIngressVO.getAnnotations()); + V1Ingress v1beta1Ingress = initV1Ingress(devopsIngressVO.getDomain(), devopsIngressVO.getName(), certName, devopsIngressVO.getAnnotations()); // 处理域名数据 DevopsIngressDTO devopsIngressDO = handlerIngress(devopsIngressVO, projectId, v1beta1Ingress); @@ -299,9 +298,9 @@ public void updateIngress(Long id, DevopsIngressVO devopsIngressVO, Long project DevopsEnvCommandDTO devopsEnvCommandDTO = initDevopsEnvCommandDTO(UPDATE); - // 初始化V1beta1Ingress对象 + // 初始化V1Ingress对象 String certName = getCertName(devopsIngressVO.getCertId()); - V1beta1Ingress v1beta1Ingress = initV1beta1Ingress(devopsIngressVO.getDomain(), devopsIngressVO.getName(), certName, devopsIngressVO.getAnnotations()); + V1Ingress v1beta1Ingress = initV1Ingress(devopsIngressVO.getDomain(), devopsIngressVO.getName(), certName, devopsIngressVO.getAnnotations()); // 处理域名数据 devopsIngressVO.setId(id); @@ -340,9 +339,9 @@ public void updateIngressByGitOps(Long id, DevopsIngressVO devopsIngressVO, Long return; } - // 初始化V1beta1Ingress对象 + // 初始化V1Ingress对象 String certName = devopsIngressVO.getCertName(); - V1beta1Ingress v1beta1Ingress = initV1beta1Ingress(devopsIngressVO.getDomain(), devopsIngressVO.getName(), certName, devopsIngressVO.getAnnotations()); + V1Ingress v1beta1Ingress = initV1Ingress(devopsIngressVO.getDomain(), devopsIngressVO.getName(), certName, devopsIngressVO.getAnnotations()); // 处理域名数据 devopsIngressVO.setId(id); @@ -503,8 +502,8 @@ public void deleteIngress(Long projectId, Long ingressId) { TypeUtil.objToInteger(userAttrDTO.getGitlabUserId()), "master"); } } else { - ResourceConvertToYamlHandler resourceConvertToYamlHandler = new ResourceConvertToYamlHandler<>(); - V1beta1Ingress v1beta1Ingress = new V1beta1Ingress(); + ResourceConvertToYamlHandler resourceConvertToYamlHandler = new ResourceConvertToYamlHandler<>(); + V1Ingress v1beta1Ingress = new V1Ingress(); V1ObjectMeta v1ObjectMeta = new V1ObjectMeta(); v1ObjectMeta.setName(ingressDO.getName()); v1beta1Ingress.setMetadata(v1ObjectMeta); @@ -547,21 +546,22 @@ public Boolean checkDomainAndPath(Long envId, String domain, String path, Long i return baseCheckPath(envId, domain, path, id); } - private V1beta1HTTPIngressPath createPath(String hostPath, String serviceName, Long port) { - V1beta1HTTPIngressPath path = new V1beta1HTTPIngressPath(); - V1beta1IngressBackend backend = new V1beta1IngressBackend(); - backend.setServiceName(serviceName.toLowerCase()); - if (port != null) { - backend.setServicePort(new IntOrString(port.intValue())); - } + private V1HTTPIngressPath createPath(String hostPath, String serviceName, Long port) { + V1HTTPIngressPath path = new V1HTTPIngressPath(); + V1IngressBackend backend = new V1IngressBackend(); + // TODO 兼容旧版本 +// backend.setServiceName(serviceName.toLowerCase()); +// if (port != null) { +// backend.setServicePort(new IntOrString(port.intValue())); +// } path.setBackend(backend); path.setPath(hostPath); return path; } - private V1beta1Ingress initV1beta1Ingress(String host, String name, @Nullable String certName, @Nullable Map annotations) { - V1beta1Ingress ingress = new V1beta1Ingress(); + private V1Ingress initV1Ingress(String host, String name, @Nullable String certName, @Nullable Map annotations) { + V1Ingress ingress = new V1Ingress(); ingress.setKind(INGRESS); ingress.setApiVersion("extensions/v1beta1"); V1ObjectMeta metadata = new V1ObjectMeta(); @@ -572,12 +572,12 @@ private V1beta1Ingress initV1beta1Ingress(String host, String name, @Nullable St metadata.setLabels(labels); metadata.setAnnotations(annotations == null ? new HashMap<>() : annotations); ingress.setMetadata(metadata); - V1beta1IngressSpec spec = new V1beta1IngressSpec(); + V1IngressSpec spec = new V1IngressSpec(); - List rules = new ArrayList<>(); - V1beta1IngressRule rule = new V1beta1IngressRule(); - V1beta1HTTPIngressRuleValue http = new V1beta1HTTPIngressRuleValue(); - List paths = new ArrayList<>(); + List rules = new ArrayList<>(); + V1IngressRule rule = new V1IngressRule(); + V1HTTPIngressRuleValue http = new V1HTTPIngressRuleValue(); + List paths = new ArrayList<>(); http.setPaths(paths); rule.setHost(host); rule.setHttp(http); @@ -585,8 +585,8 @@ private V1beta1Ingress initV1beta1Ingress(String host, String name, @Nullable St spec.setRules(rules); if (certName != null) { - List tlsList = new ArrayList<>(); - V1beta1IngressTLS tls = new V1beta1IngressTLS(); + List tlsList = new ArrayList<>(); + V1IngressTLS tls = new V1IngressTLS(); tls.addHostsItem(host); tls.setSecretName(certName); tlsList.add(tls); @@ -599,7 +599,7 @@ private V1beta1Ingress initV1beta1Ingress(String host, String name, @Nullable St private void operateEnvGitLabFile(Integer envGitLabProjectId, Boolean deleteCert, - V1beta1Ingress ingress, + V1Ingress ingress, Boolean isCreate, String path, DevopsIngressDTO devopsIngressDTO, @@ -626,7 +626,7 @@ private void operateEnvGitLabFile(Integer envGitLabProjectId, IngressSagaPayload ingressSagaPayload = new IngressSagaPayload(devopsEnvironmentDTO.getProjectId(), userAttrDTO.getGitlabUserId()); ingressSagaPayload.setDevopsIngressDTO(devopsIngressDTO); ingressSagaPayload.setCreated(isCreate); - ingressSagaPayload.setV1beta1Ingress(ingress); + ingressSagaPayload.setV1Ingress(ingress); ingressSagaPayload.setDevopsEnvironmentDTO(devopsEnvironmentDTO); producer.apply( @@ -658,8 +658,8 @@ public void operateIngressBySaga(IngressSagaPayload ingressSagaPayload) { ingressSagaPayload.getDevopsEnvironmentDTO().getClusterCode()); } //在gitops库处理instance文件 - ResourceConvertToYamlHandler resourceConvertToYamlHandler = new ResourceConvertToYamlHandler<>(); - resourceConvertToYamlHandler.setType(ingressSagaPayload.getV1beta1Ingress()); + ResourceConvertToYamlHandler resourceConvertToYamlHandler = new ResourceConvertToYamlHandler<>(); + resourceConvertToYamlHandler.setType(ingressSagaPayload.getV1Ingress()); resourceConvertToYamlHandler.operationEnvGitlabFile( GitOpsConstants.INGRESS_PREFIX + ingressSagaPayload.getDevopsIngressDTO().getName(), @@ -696,7 +696,7 @@ public void operateIngressBySaga(IngressSagaPayload ingressSagaPayload) { } - private DevopsIngressDTO handlerIngress(DevopsIngressVO devopsIngressVO, Long projectId, V1beta1Ingress v1beta1Ingress) { + private DevopsIngressDTO handlerIngress(DevopsIngressVO devopsIngressVO, Long projectId, V1Ingress v1beta1Ingress) { Long envId = devopsIngressVO.getEnvId(); String ingressName = devopsIngressVO.getName(); DevopsIngressValidator.checkIngressName(ingressName); @@ -728,7 +728,7 @@ private DevopsIngressDTO handlerIngress(DevopsIngressVO devopsIngressVO, Long pr } - private List handlerPathList(List pathList, DevopsIngressVO devopsIngressVO, V1beta1Ingress v1beta1Ingress) { + private List handlerPathList(List pathList, DevopsIngressVO devopsIngressVO, V1Ingress v1beta1Ingress) { if (pathList == null || pathList.isEmpty()) { throw new CommonException(PATH_ERROR); } @@ -913,11 +913,6 @@ public void updateStatus(Long envId, String name, String status) { devopsIngressMapper.updateStatus(envId, name, status); } - @Override - public List baseListNameByServiceId(Long serviceId) { - return devopsIngressMapper.listIngressNameByServiceId(serviceId); - } - @Override public Boolean baseCheckName(Long envId, String name) { DevopsIngressDTO devopsIngressDTO = new DevopsIngressDTO(name); @@ -1003,7 +998,7 @@ public void deleteIngressAndIngressPathByEnvId(Long envId) { @Override @Transactional(propagation = Propagation.NESTED) public void saveOrUpdateChartResource(String detailsJson, AppServiceInstanceDTO appServiceInstanceDTO) { - V1beta1Ingress v1beta1Ingress = json.deserialize(detailsJson, V1beta1Ingress.class); + V1Ingress v1beta1Ingress = json.deserialize(detailsJson, V1Ingress.class); DevopsIngressDTO devopsIngressDTO = getDevopsIngressDTO(v1beta1Ingress, appServiceInstanceDTO.getEnvId()); DevopsIngressDTO oldDevopsIngressDTO = baseQueryByEnvIdAndName(appServiceInstanceDTO.getEnvId(), v1beta1Ingress.getMetadata().getName()); // 更新ingress @@ -1079,7 +1074,7 @@ public ResourceType getType() { return ResourceType.INGRESS; } - private DevopsIngressDTO getDevopsIngressDTO(V1beta1Ingress v1beta1Ingress, Long envId) { + private DevopsIngressDTO getDevopsIngressDTO(V1Ingress v1beta1Ingress, Long envId) { DevopsIngressDTO devopsIngressDTO = new DevopsIngressDTO(); devopsIngressDTO.setDomain(v1beta1Ingress.getSpec().getRules().get(0).getHost() ); @@ -1093,33 +1088,34 @@ private DevopsIngressDTO getDevopsIngressDTO(V1beta1Ingress v1beta1Ingress, Long devopsIngressDTO.setEnvId(envId); List pathCheckList = new ArrayList<>(); List devopsIngressPathDTOS = new ArrayList<>(); - List paths = v1beta1Ingress.getSpec().getRules().get(0).getHttp().getPaths(); - for (V1beta1HTTPIngressPath v1beta1HTTPIngressPath : paths) { + List paths = v1beta1Ingress.getSpec().getRules().get(0).getHttp().getPaths(); + for (V1HTTPIngressPath v1beta1HTTPIngressPath : paths) { String path = v1beta1HTTPIngressPath.getPath(); DevopsIngressValidator.checkPath(path); pathCheckList.add(path); - V1beta1IngressBackend backend = v1beta1HTTPIngressPath.getBackend(); - String serviceName = backend.getServiceName(); - DevopsServiceDTO devopsServiceDTO = devopsServiceService.baseQueryByNameAndEnvId( - serviceName, envId); - - Long servicePort = null; - IntOrString backendServicePort = backend.getServicePort(); - if (backendServicePort.isInteger() || PATTERN.matcher(TypeUtil.objToString(backendServicePort)).matches()) { - servicePort = TypeUtil.objToLong(backendServicePort); - } else { - if (devopsServiceDTO != null) { - List listPorts = gson.fromJson(devopsServiceDTO.getPorts(), new TypeToken>() { - }.getType()); - servicePort = listPorts.get(0).getPort(); - } - } - DevopsIngressPathDTO devopsIngressPathDTO = new DevopsIngressPathDTO(); - devopsIngressPathDTO.setPath(path); - devopsIngressPathDTO.setServicePort(servicePort); - devopsIngressPathDTO.setServiceName(serviceName); - devopsIngressPathDTO.setServiceId(devopsServiceDTO == null ? null : devopsServiceDTO.getId()); - devopsIngressPathDTOS.add(devopsIngressPathDTO); + V1IngressBackend backend = v1beta1HTTPIngressPath.getBackend(); + // TODO 兼容旧版本 +// String serviceName = backend.getServiceName(); +// DevopsServiceDTO devopsServiceDTO = devopsServiceService.baseQueryByNameAndEnvId( +// serviceName, envId); +// +// Long servicePort = null; +// IntOrString backendServicePort = backend.getServicePort(); +// if (backendServicePort.isInteger() || PATTERN.matcher(TypeUtil.objToString(backendServicePort)).matches()) { +// servicePort = TypeUtil.objToLong(backendServicePort); +// } else { +// if (devopsServiceDTO != null) { +// List listPorts = gson.fromJson(devopsServiceDTO.getPorts(), new TypeToken>() { +// }.getType()); +// servicePort = listPorts.get(0).getPort(); +// } +// } +// DevopsIngressPathDTO devopsIngressPathDTO = new DevopsIngressPathDTO(); +// devopsIngressPathDTO.setPath(path); +// devopsIngressPathDTO.setServicePort(servicePort); +// devopsIngressPathDTO.setServiceName(serviceName); +// devopsIngressPathDTO.setServiceId(devopsServiceDTO == null ? null : devopsServiceDTO.getId()); +// devopsIngressPathDTOS.add(devopsIngressPathDTO); } devopsIngressDTO.setDevopsIngressPathDTOS(devopsIngressPathDTOS); return devopsIngressDTO; diff --git a/src/main/java/io/choerodon/devops/app/service/impl/DevopsIssueRelServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/DevopsIssueRelServiceImpl.java index ed5f54a51f..cbfdf073f1 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/DevopsIssueRelServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/DevopsIssueRelServiceImpl.java @@ -4,8 +4,6 @@ import java.util.stream.Collectors; import org.hzero.mybatis.BatchInsertHelper; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; @@ -14,7 +12,6 @@ import io.choerodon.devops.api.vo.DevopsBranchVO; import io.choerodon.devops.api.vo.IssueIdAndBranchIdsVO; -import io.choerodon.devops.app.service.DevopsBranchService; import io.choerodon.devops.app.service.DevopsIssueRelService; import io.choerodon.devops.infra.dto.DevopsIssueRelDTO; import io.choerodon.devops.infra.enums.DevopsIssueRelObjectTypeEnum; @@ -22,13 +19,9 @@ @Service public class DevopsIssueRelServiceImpl implements DevopsIssueRelService { - private static final Logger LOGGER = LoggerFactory.getLogger(DevopsIssueRelServiceImpl.class); @Autowired private DevopsIssueRelMapper devopsIssueRelMapper; - @Autowired - private DevopsBranchService devopsBranchService; - @Autowired @Qualifier("devopsIssueRelBatchInsertHelper") private BatchInsertHelper batchInsertHelper; @@ -95,8 +88,13 @@ public Map> listMappedIssueIdsByObjectTypeAndObjectId(String ob } @Override - public Set listRelationByIssueIdAndObjectType(Long projectId, String object, Long issueId) { - return devopsIssueRelMapper.listRelationByIssueIdAndObjectType(projectId, object, issueId); + public Set listRelationByIssueIdAndProjectIdAndObjectType(Long projectId, String object, Long issueId) { + return devopsIssueRelMapper.listRelationByIssueIdAndProjectIdAndObjectType(projectId, object, issueId); + } + + @Override + public Set listRelationByIssueIdAndObjectType(String object, Long issueId) { + return devopsIssueRelMapper.listRelationByIssueIdAndObjectType(object, issueId); } @Override diff --git a/src/main/java/io/choerodon/devops/app/service/impl/DevopsJobServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/DevopsJobServiceImpl.java index 6b1b2c38d2..714099ca75 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/DevopsJobServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/DevopsJobServiceImpl.java @@ -1,17 +1,9 @@ package io.choerodon.devops.app.service.impl; -import static io.choerodon.devops.infra.constant.MiscConstants.CREATE_TYPE; - -import java.time.ZoneId; -import java.time.format.DateTimeFormatter; -import java.util.*; -import java.util.function.Function; -import java.util.stream.Collectors; - -import io.kubernetes.client.JSON; -import io.kubernetes.client.models.V1Container; -import io.kubernetes.client.models.V1ContainerPort; -import io.kubernetes.client.models.V1Job; +import io.kubernetes.client.openapi.JSON; +import io.kubernetes.client.openapi.models.V1Container; +import io.kubernetes.client.openapi.models.V1ContainerPort; +import io.kubernetes.client.openapi.models.V1Job; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -21,6 +13,14 @@ import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; + +import static io.choerodon.devops.infra.constant.MiscConstants.CREATE_TYPE; + import io.choerodon.core.domain.Page; import io.choerodon.core.exception.CommonException; import io.choerodon.core.utils.ConvertUtils; @@ -101,7 +101,7 @@ public Page pagingByEnvId(Long projectId, Long envId, PageRequest pag } jobInfoVO.setPorts(portRes); if (v1Job.getStatus() != null && v1Job.getStatus().getCompletionTime() != null) { - jobInfoVO.setAge(v1Job.getStatus().getCompletionTime().toString("yyyy-MM-dd HH:mm:ss")); + jobInfoVO.setAge(v1Job.getStatus().getCompletionTime().toLocalTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); } else { ZoneId zoneId = ZoneId.systemDefault(); jobInfoVO.setAge(v.getLastUpdateDate().toInstant().atZone(zoneId).toLocalDateTime().format(DATE_TIME_FORMATTER)); diff --git a/src/main/java/io/choerodon/devops/app/service/impl/DevopsMergeRequestServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/DevopsMergeRequestServiceImpl.java index 17e543441e..920ceb548f 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/DevopsMergeRequestServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/DevopsMergeRequestServiceImpl.java @@ -236,7 +236,7 @@ public Page getMergeRequestToBeChecked(Long projectId, Set mergeRequestVOPage.getContent().forEach(mergeRequestVO -> { String urlSlash = gitlabUrl.endsWith("/") ? "" : "/"; String mergeRequestUrl = String.format("%s%s%s-%s/%s/merge_requests/%s", - gitlabUrl, urlSlash, tenant.getTenantNum(), projectDTO.getCode(), mergeRequestVO.getAppServiceCode(), mergeRequestVO.getGitlabMergeRequestId()); + gitlabUrl, urlSlash, tenant.getTenantNum(), projectDTO.getDevopsComponentCode(), mergeRequestVO.getAppServiceCode(), mergeRequestVO.getGitlabMergeRequestId()); mergeRequestVO.setIamAuthor(ConvertUtils.convertObject(iamUserDTOMap.get(gitlabIamUserIdMap.get(mergeRequestVO.getAuthorId())), UserVO.class)); mergeRequestVO.setIamAssignee(ConvertUtils.convertObject(iamUserDTOMap.get(gitlabIamUserIdMap.get(mergeRequestVO.getAssigneeId())), UserVO.class)); mergeRequestVO.setGitlabUrl(mergeRequestUrl); diff --git a/src/main/java/io/choerodon/devops/app/service/impl/DevopsNotificationServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/DevopsNotificationServiceImpl.java index 41b2b83972..ab81bfa8bb 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/DevopsNotificationServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/DevopsNotificationServiceImpl.java @@ -45,7 +45,6 @@ public class DevopsNotificationServiceImpl implements DevopsNotificationService { private static final Logger LOGGER = LoggerFactory.getLogger(DevopsNotificationServiceImpl.class); - private static Random RANDOM; private static final String NOTIFY_TYPE = "resourceDelete"; public static final Gson gson = new Gson(); private static final Long TIMEOUT = 600L; @@ -74,13 +73,6 @@ public class DevopsNotificationServiceImpl implements DevopsNotificationService @Autowired private PermissionHelper permissionHelper; - static { - try { - RANDOM = SecureRandom.getInstanceStrong(); - } catch (NoSuchAlgorithmException e) { - LOGGER.error("get random failed", e); - } - } @Override public ResourceCheckVO checkResourceDelete(Long projectId, Long envId, String objectType) { @@ -156,7 +148,7 @@ public void sendMessage(Long projectId, Long envId, Long notificationId, Long ob // 生成验证码,存放在redis String resendKey = String.format("choerodon:devops:env:%s:%s:%s", devopsEnvironmentDTO.getCode(), objectType, objectCode); - String captcha = String.valueOf(RANDOM.nextInt(899999) + 100000); + String captcha = String.valueOf(new Random().nextInt(899999) + 100000); redisTemplate.opsForValue().set(resendKey, captcha, TIMEOUT, TimeUnit.SECONDS); @@ -213,6 +205,7 @@ public void sendMessage(Long projectId, Long envId, Long notificationId, Long ob } }); params.put(MOBILE, StringUtils.join(phones, ",")); + LOGGER.info("============message5=========="); Map additionalParams = new HashMap<>(); additionalParams.put(MessageAdditionalType.PARAM_PROJECT_ID.getTypeName(), devopsEnvironmentDTO.getProjectId()); @@ -228,7 +221,7 @@ public void sendMessage(Long projectId, Long envId, Long notificationId, Long ob try { //根据不同的通知方式发送验证码 - messageClient.sendMessage(messageSender); + messageClient.async().sendMessage(messageSender); } catch (Exception e) { redisTemplate.delete(resendKey); throw new CommonException("error.msg.send.failed"); diff --git a/src/main/java/io/choerodon/devops/app/service/impl/DevopsNotificationUserRelServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/DevopsNotificationUserRelServiceImpl.java deleted file mode 100644 index 5017e11875..0000000000 --- a/src/main/java/io/choerodon/devops/app/service/impl/DevopsNotificationUserRelServiceImpl.java +++ /dev/null @@ -1,18 +0,0 @@ -package io.choerodon.devops.app.service.impl; - -import io.choerodon.devops.app.service.DevopsNotificationUserRelService; -import io.choerodon.devops.infra.mapper.DevopsNotificationUserRelMapper; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -/** - * Created by Sheep on 2019/7/15. - */ - -@Service -public class DevopsNotificationUserRelServiceImpl implements DevopsNotificationUserRelService { - - @Autowired - private DevopsNotificationUserRelMapper devopsNotificationUserRelMapper; - -} diff --git a/src/main/java/io/choerodon/devops/app/service/impl/DevopsProjectServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/DevopsProjectServiceImpl.java index 45575855cd..1b4a6823be 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/DevopsProjectServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/DevopsProjectServiceImpl.java @@ -2,7 +2,6 @@ import java.util.*; import java.util.stream.Collectors; - import javax.annotation.Nullable; import com.alibaba.fastjson.JSONArray; @@ -137,17 +136,6 @@ public void baseUpdate(DevopsProjectDTO devopsProjectDTO) { } } - @Override - public void baseUpdateByPrimaryKey(DevopsProjectDTO devopsProjectDTO) { - DevopsProjectDTO oldDevopsProjectDTO = devopsProjectMapper.selectByPrimaryKey(devopsProjectDTO); - if (oldDevopsProjectDTO == null) { - MapperUtil.resultJudgedInsertSelective(devopsProjectMapper, devopsProjectDTO, "error.project.insert", (Object[]) null); - } else { - devopsProjectDTO.setObjectVersionNumber(oldDevopsProjectDTO.getObjectVersionNumber()); - MapperUtil.resultJudgedUpdateByPrimaryKey(devopsProjectMapper, devopsProjectDTO, "error.project.update", (Object[]) null); - } - } - @Override public Page pageProjects(Long projectId, PageRequest pageable, String searchParams) { ProjectDTO iamProjectDTO = baseServiceClientOperator.queryIamProjectById(projectId); diff --git a/src/main/java/io/choerodon/devops/app/service/impl/DevopsPvServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/DevopsPvServiceImpl.java index 7efb3359e6..000e4075b8 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/DevopsPvServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/DevopsPvServiceImpl.java @@ -1,14 +1,10 @@ package io.choerodon.devops.app.service.impl; -import java.math.BigDecimal; -import java.util.*; -import java.util.stream.Collectors; - import com.alibaba.fastjson.JSONObject; import com.fasterxml.jackson.core.type.TypeReference; import com.google.gson.Gson; import io.kubernetes.client.custom.Quantity; -import io.kubernetes.client.models.*; +import io.kubernetes.client.openapi.models.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -17,6 +13,10 @@ import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; +import java.math.BigDecimal; +import java.util.*; +import java.util.stream.Collectors; + import io.choerodon.asgard.saga.producer.StartSagaBuilder; import io.choerodon.asgard.saga.producer.TransactionalProducer; import io.choerodon.core.domain.Page; @@ -127,7 +127,6 @@ public void createPv(Long projectId, DevopsPvReqVO devopsPvReqVo) { devopsPvDTO.setStatus(PvStatus.OPERATING.getStatus()); // 创建pv的环境是所选集群关联的系统环境 DevopsClusterDTO devopsClusterDTO = devopsClusterService.baseQuery(devopsPvDTO.getClusterId()); - CommonExAssertUtil.assertTrue(projectId.equals(devopsClusterDTO.getProjectId()), MiscConstants.ERROR_OPERATING_RESOURCE_IN_OTHER_PROJECT); // 如果系统环境id为空那么先去创建系统环境,更新集群关联的系统环境 if (devopsClusterDTO.getSystemEnvId() == null) { @@ -769,13 +768,13 @@ public List listLabels(Long projectId, Long clusterId) { .filter(s -> !StringUtils.isEmpty(s)) .map(s -> JsonHelper.unmarshalByJackson(s, new TypeReference>() { })) - .forEach(l -> l.forEach((k, v)->{ + .forEach(l -> l.forEach((k, v) -> { DevopsPvLabelVO devopsPvLabelVO = new DevopsPvLabelVO(); devopsPvLabelVO.setKey(k); devopsPvLabelVO.setValue(v); - if (!labels.contains(devopsPvLabelVO)){ - labels.add(devopsPvLabelVO); - } + if (!labels.contains(devopsPvLabelVO)) { + labels.add(devopsPvLabelVO); + } })); return labels; } diff --git a/src/main/java/io/choerodon/devops/app/service/impl/DevopsPvcServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/DevopsPvcServiceImpl.java index 9d75895e25..6863b30c16 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/DevopsPvcServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/DevopsPvcServiceImpl.java @@ -1,14 +1,11 @@ package io.choerodon.devops.app.service.impl; -import java.math.BigDecimal; -import java.util.*; - import com.google.gson.Gson; import io.kubernetes.client.custom.Quantity; -import io.kubernetes.client.models.V1ObjectMeta; -import io.kubernetes.client.models.V1PersistentVolumeClaim; -import io.kubernetes.client.models.V1PersistentVolumeClaimSpec; -import io.kubernetes.client.models.V1ResourceRequirements; +import io.kubernetes.client.openapi.models.V1ObjectMeta; +import io.kubernetes.client.openapi.models.V1PersistentVolumeClaim; +import io.kubernetes.client.openapi.models.V1PersistentVolumeClaimSpec; +import io.kubernetes.client.openapi.models.V1ResourceRequirements; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; @@ -18,6 +15,9 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.util.StringUtils; +import java.math.BigDecimal; +import java.util.*; + import io.choerodon.asgard.saga.annotation.Saga; import io.choerodon.asgard.saga.producer.StartSagaBuilder; import io.choerodon.asgard.saga.producer.TransactionalProducer; diff --git a/src/main/java/io/choerodon/devops/app/service/impl/DevopsRegistrySecretServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/DevopsRegistrySecretServiceImpl.java index 4711518cff..f6dc67ea33 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/DevopsRegistrySecretServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/DevopsRegistrySecretServiceImpl.java @@ -1,6 +1,5 @@ package io.choerodon.devops.app.service.impl; -import java.util.List; import java.util.Objects; import org.slf4j.Logger; @@ -96,13 +95,6 @@ public DevopsRegistrySecretDTO baseQueryByClusterIdAndNamespace(Long clusterId, Objects.requireNonNull(projectId)); } - @Override - public List baseListByConfig(Long configId) { - DevopsRegistrySecretDTO devopsRegistrySecretDTO = new DevopsRegistrySecretDTO(); - devopsRegistrySecretDTO.setConfigId(configId); - return devopsRegistrySecretMapper.select(devopsRegistrySecretDTO); - } - @Override public DevopsRegistrySecretDTO baseQueryByClusterAndNamespaceAndName(Long clusterId, String namespace, String name) { DevopsRegistrySecretDTO devopsRegistrySecretDTO = new DevopsRegistrySecretDTO(); diff --git a/src/main/java/io/choerodon/devops/app/service/impl/DevopsSecretServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/DevopsSecretServiceImpl.java index f1f834d9b0..9286ac7474 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/DevopsSecretServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/DevopsSecretServiceImpl.java @@ -1,19 +1,18 @@ package io.choerodon.devops.app.service.impl; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; -import io.kubernetes.client.models.V1ObjectMeta; -import io.kubernetes.client.models.V1Secret; +import io.kubernetes.client.openapi.models.V1ObjectMeta; +import io.kubernetes.client.openapi.models.V1Secret; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + import io.choerodon.core.domain.Page; import io.choerodon.core.exception.CommonException; import io.choerodon.devops.api.validator.DevopsSecretValidator; @@ -50,7 +49,6 @@ public class DevopsSecretServiceImpl implements DevopsSecretService { private static final String CREATE = "create"; private static final String UPDATE = "update"; private static final String DELETE = "delete"; - private static final String SECRET_KIND = "secret"; private static final String DOCKER_CONFIG_JSON = ".dockerconfigjson"; private static final String MASTER = "master"; @@ -158,30 +156,6 @@ private DevopsSecretDTO voToDto(SecretReqVO secretReqVO, boolean isFromGitOps) { return devopsSecretDTO; } - @Override - public SecretRespVO dtoToRespVo(DevopsSecretDTO devopsSecretDTO) { - SecretRespVO secretRespVO = new SecretRespVO(); - BeanUtils.copyProperties(devopsSecretDTO, secretRespVO); - Map secretMaps = gson - .fromJson(devopsSecretDTO.getValue(), new TypeToken>() { - }.getType()); - secretRespVO.setValue(secretMaps); - for (Map.Entry e : secretRespVO.getValue().entrySet()) { - if (!e.getKey().equals(DOCKER_CONFIG_JSON)) { - secretMaps.put(e.getKey(), Base64Util.getBase64DecodedString(e.getValue())); - } else { - secretMaps.put(e.getKey(), e.getValue()); - } - } - List key = new ArrayList<>(); - secretMaps.forEach((key1, value) -> key.add(key1)); - secretRespVO.setKey(key); - secretRespVO.setCommandStatus(devopsSecretDTO.getCommandStatus()); - secretRespVO.setLastUpdateDate(devopsSecretDTO.getLastUpdateDate()); - secretRespVO.setValue(secretMaps); - return secretRespVO; - } - @Override public SecretReqVO dtoToReqVo(DevopsSecretDTO devopsSecretDTO) { SecretReqVO secretReqVO = new SecretReqVO(); @@ -228,7 +202,11 @@ private static V1Secret initV1Secret(DevopsSecretDTO devopsSecretDTO) { metadata.setName(devopsSecretDTO.getName()); secret.setMetadata(metadata); secret.setType("Opaque"); - secret.setData(devopsSecretDTO.getValueMap()); + Map data = new HashMap<>(); + devopsSecretDTO.getValueMap().forEach((k, v) -> { + data.put(k, v.getBytes()); + }); + secret.setData(data); return secret; } @@ -301,7 +279,7 @@ public Boolean deleteSecret(Long projectId, Long envId, Long secretId) { TypeUtil.objToInteger(devopsEnvironmentDTO.getGitlabEnvProjectId()), "sct-" + devopsSecretDTO.getName() + ".yaml", "DELETE FILE", - TypeUtil.objToInteger(userAttrDTO.getGitlabUserId()), "master"); + TypeUtil.objToInteger(userAttrDTO.getGitlabUserId()), MASTER); } return true; } else { diff --git a/src/main/java/io/choerodon/devops/app/service/impl/DevopsServiceInstanceServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/DevopsServiceInstanceServiceImpl.java index 91598a3f88..e49287da25 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/DevopsServiceInstanceServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/DevopsServiceInstanceServiceImpl.java @@ -32,15 +32,6 @@ public void baseCreate(DevopsServiceInstanceDTO devopsServiceInstanceDTO) { } } - @Override - public DevopsServiceInstanceDTO baseQueryByOptions(Long serviceId, Long instanceId) { - DevopsServiceInstanceDTO devopsServiceInstanceDTO = new DevopsServiceInstanceDTO(); - devopsServiceInstanceDTO.setServiceId(serviceId); - devopsServiceInstanceDTO.setInstanceId(instanceId); - return devopsServiceInstanceMapper - .selectOne(devopsServiceInstanceDTO); - } - @Override public List baseListByServiceId(Long serviceId) { DevopsServiceInstanceDTO devopsServiceInstanceDTO = new DevopsServiceInstanceDTO(); diff --git a/src/main/java/io/choerodon/devops/app/service/impl/DevopsServiceServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/DevopsServiceServiceImpl.java index 50f4826b2b..895b76cf5d 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/DevopsServiceServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/DevopsServiceServiceImpl.java @@ -11,9 +11,10 @@ import com.google.common.collect.Lists; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; -import io.kubernetes.client.JSON; +import com.netflix.servo.util.Strings; import io.kubernetes.client.custom.IntOrString; -import io.kubernetes.client.models.*; +import io.kubernetes.client.openapi.JSON; +import io.kubernetes.client.openapi.models.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; @@ -25,7 +26,7 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; -import org.springframework.util.StringUtils; +import org.springframework.util.ObjectUtils; import io.choerodon.asgard.saga.annotation.Saga; import io.choerodon.asgard.saga.producer.StartSagaBuilder; @@ -345,7 +346,7 @@ public Boolean updateDevopsServiceByGitOps(Long projectId, Long id, return false; } - if (!StringUtils.isEmpty(devopsServiceDTO.getEndPoints())) { + if (!ObjectUtils.isEmpty(devopsServiceDTO.getEndPoints())) { devopsServiceMapper.updateAppServiceIdToNull(devopsServiceDTO.getId()); devopsServiceDTO.setAppServiceId(null); } @@ -578,11 +579,6 @@ public void baseUpdateEndPoint(Long id) { devopsServiceMapper.updateEndPointToNull(id); } - @Override - public List baseListEnvByRunningService() { - return devopsServiceMapper.selectDeployedEnv(); - } - @Override public DevopsServiceDTO baseQueryByNameAndEnvId(String name, Long envId) { DevopsServiceDTO devopsServiceDTO = new DevopsServiceDTO(); @@ -666,6 +662,9 @@ private DevopsServiceVO queryDtoToVo(DevopsServiceQueryDTO devopsServiceQueryDTO devopsServiceConfigVO.setExternalIps(new ArrayList<>( Arrays.asList(devopsServiceQueryDTO.getExternalIp().split(",")))); } + if (devopsServiceQueryDTO.getClusterIp() != null) { + devopsServiceConfigVO.setClusterIp(devopsServiceQueryDTO.getClusterIp()); + } devopsServiceVO.setConfig(devopsServiceConfigVO); DevopsServiceTargetVO devopsServiceTargetVO = new DevopsServiceTargetVO(); @@ -679,7 +678,7 @@ private DevopsServiceVO queryDtoToVo(DevopsServiceQueryDTO devopsServiceQueryDTO } devopsServiceTargetVO.setInstances(ConvertUtils.convertList(devopsServiceQueryDTO.getInstances(), AppServiceInstanceInfoVO.class)); - if (!StringUtils.isEmpty(devopsServiceQueryDTO.getMessage())) { + if (!ObjectUtils.isEmpty(devopsServiceQueryDTO.getMessage())) { V1Service v1Service = json.deserialize(devopsServiceQueryDTO.getMessage(), V1Service.class); devopsServiceTargetVO.setSelectors(v1Service.getSpec().getSelector()); devopsServiceVO.setLabels(v1Service.getMetadata().getLabels()); @@ -1009,7 +1008,7 @@ private V1Service initV1Service(DevopsServiceReqVO devopsServiceReqVO, Map externalIps = new ArrayList<>( Arrays.asList(devopsServiceReqVO.getExternalIp().split(","))); spec.setExternalIPs(externalIps); @@ -1068,11 +1067,11 @@ private V1Endpoints initV1EndPoints(DevopsServiceReqVO devopsServiceReqVO) { }).collect(Collectors.toList())); final Integer[] serialNumber = {0}; v1EndpointSubset.setPorts(value.stream().map(port -> { - V1EndpointPort v1EndpointPort = new V1EndpointPort(); - v1EndpointPort.setPort(port.getPort()); + CoreV1EndpointPort coreV1EndpointPort = new CoreV1EndpointPort(); + coreV1EndpointPort.setPort(port.getPort()); serialNumber[0] = serialNumber[0] + 1; - v1EndpointPort.setName(port.getName() == null ? "http" + serialNumber[0] : port.getName()); - return v1EndpointPort; + coreV1EndpointPort.setName(port.getName() == null ? "http" + serialNumber[0] : port.getName()); + return coreV1EndpointPort; }).collect(Collectors.toList())); v1EndpointSubsets.add(v1EndpointSubset); }); @@ -1085,10 +1084,10 @@ private V1Endpoints initV1EndPoints(DevopsServiceReqVO devopsServiceReqVO) { * 判断外部ip是否更新 */ private Boolean isUpdateExternalIp(DevopsServiceReqVO devopsServiceReqVO, DevopsServiceDTO devopsServiceDTO) { - return !((StringUtils.isEmpty(devopsServiceReqVO.getExternalIp()) - && StringUtils.isEmpty(devopsServiceDTO.getExternalIp())) - || (!StringUtils.isEmpty(devopsServiceReqVO.getExternalIp()) - && !StringUtils.isEmpty(devopsServiceDTO.getExternalIp()) + return !((ObjectUtils.isEmpty(devopsServiceReqVO.getExternalIp()) + && ObjectUtils.isEmpty(devopsServiceDTO.getExternalIp())) + || (!ObjectUtils.isEmpty(devopsServiceReqVO.getExternalIp()) + && !ObjectUtils.isEmpty(devopsServiceDTO.getExternalIp()) && devopsServiceReqVO.getExternalIp().equals(devopsServiceDTO.getExternalIp()))); } @@ -1305,12 +1304,15 @@ public void saveOrUpdateChartResource(String detailsJson, AppServiceInstanceDTO private void fillDevopsServiceInfo(DevopsServiceDTO oldDevopsServiceDTO, V1Service v1Service) { oldDevopsServiceDTO.setType(v1Service.getSpec().getType()); + if (!ObjectUtils.isEmpty(v1Service.getSpec().getExternalIPs())) { + oldDevopsServiceDTO.setExternalIp(Strings.join(",", v1Service.getSpec().getExternalIPs().iterator())); + } // 添加service类型 if (ServiceTypeEnum.LOAD_BALANCER.value().equals(v1Service.getSpec().getType())) { oldDevopsServiceDTO.setLoadBalanceIp(v1Service.getStatus().getLoadBalancer().getIngress().get(0).getIp()); } else if (ServiceTypeEnum.CLUSTER_IP.value().equals(v1Service.getSpec().getType())) { - oldDevopsServiceDTO.setExternalIp(v1Service.getSpec().getClusterIP()); + oldDevopsServiceDTO.setClusterIp(v1Service.getSpec().getClusterIP()); } else if (ServiceTypeEnum.NODE_PORT.value().equals(v1Service.getSpec().getType())) { // do nothing } else { diff --git a/src/main/java/io/choerodon/devops/app/service/impl/DevopsStatefulSetServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/DevopsStatefulSetServiceImpl.java index 6c128d23ba..ba625aa791 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/DevopsStatefulSetServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/DevopsStatefulSetServiceImpl.java @@ -1,17 +1,9 @@ package io.choerodon.devops.app.service.impl; -import static io.choerodon.devops.infra.constant.MiscConstants.CREATE_TYPE; - -import java.time.ZoneId; -import java.time.format.DateTimeFormatter; -import java.util.*; -import java.util.function.Function; -import java.util.stream.Collectors; - -import io.kubernetes.client.JSON; -import io.kubernetes.client.models.V1Container; -import io.kubernetes.client.models.V1ContainerPort; -import io.kubernetes.client.models.V1beta2StatefulSet; +import io.kubernetes.client.openapi.JSON; +import io.kubernetes.client.openapi.models.V1Container; +import io.kubernetes.client.openapi.models.V1ContainerPort; +import io.kubernetes.client.openapi.models.V1StatefulSet; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -21,6 +13,14 @@ import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; + +import static io.choerodon.devops.infra.constant.MiscConstants.CREATE_TYPE; + import io.choerodon.core.domain.Page; import io.choerodon.core.exception.CommonException; import io.choerodon.core.utils.ConvertUtils; @@ -84,7 +84,7 @@ public Page pagingByEnvId(Long projectId, Long envId, PageReq StatefulSetInfoVO statefulSetInfoVO = ConvertUtils.convertObject(v, StatefulSetInfoVO.class); if (detailDTOMap.get(v.getResourceDetailId()) != null) { // 参考实例详情查询逻辑 - V1beta2StatefulSet v1beta2StatefulSet = json.deserialize(detailDTOMap.get(v.getResourceDetailId()).getMessage(), V1beta2StatefulSet.class); + V1StatefulSet v1beta2StatefulSet = json.deserialize(detailDTOMap.get(v.getResourceDetailId()).getMessage(), V1StatefulSet.class); statefulSetInfoVO.setName(v1beta2StatefulSet.getMetadata().getName()); @@ -196,7 +196,7 @@ public DevopsStatefulSetVO createOrUpdateByGitOps(DevopsStatefulSetVO devopsStat @Override @Transactional(propagation = Propagation.NESTED) public void saveOrUpdateChartResource(String detailsJson, AppServiceInstanceDTO appServiceInstanceDTO) { - V1beta2StatefulSet v1beta2StatefulSet = json.deserialize(detailsJson, V1beta2StatefulSet.class); + V1StatefulSet v1beta2StatefulSet = json.deserialize(detailsJson, V1StatefulSet.class); DevopsStatefulSetDTO oldDevopsStatefulSetDTO = baseQueryByEnvIdAndName(appServiceInstanceDTO.getEnvId(), v1beta2StatefulSet.getMetadata().getName()); if (oldDevopsStatefulSetDTO != null) { diff --git a/src/main/java/io/choerodon/devops/app/service/impl/DockerComposeServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/DockerComposeServiceImpl.java index f51e3c4ce4..fdaf342923 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/DockerComposeServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/DockerComposeServiceImpl.java @@ -39,6 +39,7 @@ import io.choerodon.devops.infra.enums.host.HostResourceType; import io.choerodon.devops.infra.feign.operator.BaseServiceClientOperator; import io.choerodon.devops.infra.mapper.DevopsDockerInstanceMapper; +import io.choerodon.devops.infra.mapper.DevopsHostAppMapper; import io.choerodon.devops.infra.util.HostDeployUtil; import io.choerodon.devops.infra.util.JsonHelper; import io.choerodon.mybatis.pagehelper.PageHelper; @@ -74,7 +75,8 @@ public class DockerComposeServiceImpl implements DockerComposeService { private BaseServiceClientOperator baseServiceClientOperator; @Autowired private DevopsDockerInstanceMapper devopsDockerInstanceMapper; - + @Autowired + private DevopsHostAppMapper devopsHostAppMapper; @Override @Transactional @@ -192,51 +194,22 @@ private boolean isRemoveService(String currentValue, String newValue) { } @Override + @Transactional(rollbackFor = Exception.class) public void restartDockerComposeApp(Long projectId, Long appId) { + // 查询应用 DevopsHostAppDTO devopsHostAppDTO = devopsHostAppService.baseQuery(appId); - Long hostId = devopsHostAppDTO.getHostId(); - DevopsHostDTO devopsHostDTO = devopsHostService.checkHostAvailable(devopsHostAppDTO.getHostId()); + // 查询DockerCompose实例部署配置 + DockerComposeValueDTO dockerComposeValueDTO = dockerComposeValueService.baseQuery(devopsHostAppDTO.getEffectValueId()); - // 保存操作记录 - DevopsHostCommandDTO devopsHostCommandDTO = new DevopsHostCommandDTO(hostId, - HostResourceType.DOCKER_COMPOSE.value(), - appId, - HostCommandEnum.DEPLOY_DOCKER_COMPOSE.value(), - HostCommandStatusEnum.OPERATING.value()); - devopsHostCommandService.baseCreate(devopsHostCommandDTO); - - ProjectDTO projectDTO = baseServiceClientOperator.queryIamProjectById(projectId); - // 保存部署记录 - devopsDeployRecordService.saveRecord( - projectId, - DeployType.MANUAL, - devopsHostCommandDTO.getId(), - DeployModeEnum.HOST, - hostId, - devopsHostDTO.getName(), - PipelineStatus.SUCCESS.toValue(), - DeployObjectTypeEnum.DOCKER_COMPOSE, - "Docker Compose应用", - null, - devopsHostAppDTO.getName(), - devopsHostAppDTO.getCode(), - devopsHostAppDTO.getId(), - new DeploySourceVO(AppSourceType.DOCKER_COMPOSE, projectDTO.getName())); - - // 发送部署指令给aegent - HostAgentMsgVO hostAgentMsgVO = new HostAgentMsgVO(String.valueOf(hostId), - HostCommandEnum.RESTART_DOCKER_COMPOSE.value(), - String.valueOf(devopsHostCommandDTO.getId()), - JsonHelper.marshalByJackson(new DockerComposeDeployDTO(String.valueOf(hostId), String.valueOf(appId), null, null))); - if (LOGGER.isInfoEnabled()) { - LOGGER.info(">>>>>>>>>>>>>>>>>>>> restart docker instance msg is {} <<<<<<<<<<<<<<<<<<<<<<<<", JsonHelper.marshalByJackson(hostAgentMsgVO)); - } - webSocketHelper.sendByGroup(DevopsHostConstants.GROUP + hostId, - String.format(DevopsHostConstants.DOCKER_COMPOSE, hostId, appId), - JsonHelper.marshalByJackson(hostAgentMsgVO)); + DockerComposeDeployVO dockerComposeDeployVO = new DockerComposeDeployVO(); + dockerComposeDeployVO.setAppName(devopsHostAppDTO.getName()); + dockerComposeDeployVO.setAppCode(devopsHostAppDTO.getCode()); + dockerComposeDeployVO.setRunCommand(devopsHostAppDTO.getRunCommand()); + dockerComposeDeployVO.setDockerComposeValueDTO(dockerComposeValueDTO); + updateDockerComposeApp(projectId, appId, null, dockerComposeDeployVO); } @Override diff --git a/src/main/java/io/choerodon/devops/app/service/impl/GitlabGroupMemberServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/GitlabGroupMemberServiceImpl.java index 6defed2434..abf9879530 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/GitlabGroupMemberServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/GitlabGroupMemberServiceImpl.java @@ -1,5 +1,7 @@ package io.choerodon.devops.app.service.impl; +import static io.choerodon.devops.infra.constant.MiscConstants.DEVOPS; +import static io.choerodon.devops.infra.constant.MiscConstants.OPERATIONS; import static io.choerodon.devops.infra.enums.LabelType.GITLAB_PROJECT_OWNER; import static io.choerodon.devops.infra.enums.LabelType.TENANT_ADMIN; @@ -48,14 +50,6 @@ public class GitlabGroupMemberServiceImpl implements GitlabGroupMemberService { private static final String PROJECT = "project"; private static final Logger LOGGER = LoggerFactory.getLogger(GitlabGroupMemberServiceImpl.class); - /** - * devops项目类型 - */ - private static final String DEVOPS = "N_DEVOPS"; - /** - * 运维项目类型 - */ - public static final String OPERATIONS = "N_OPERATIONS"; @Autowired private DevopsProjectService devopsProjectService; diff --git a/src/main/java/io/choerodon/devops/app/service/impl/GitlabGroupServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/GitlabGroupServiceImpl.java index 644e1798dc..fe6ffb3fd1 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/GitlabGroupServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/GitlabGroupServiceImpl.java @@ -31,7 +31,6 @@ import io.choerodon.devops.infra.dto.iam.Tenant; import io.choerodon.devops.infra.enums.AccessLevel; import io.choerodon.devops.infra.enums.SaasLevelEnum; -import io.choerodon.devops.infra.enums.Visibility; import io.choerodon.devops.infra.feign.operator.BaseServiceClientOperator; import io.choerodon.devops.infra.feign.operator.GitlabServiceClientOperator; import io.choerodon.devops.infra.util.GitOpsUtil; @@ -75,20 +74,6 @@ public void updateGroups(GitlabGroupPayload gitlabGroupPayload) { updateGroup(gitlabGroupPayload, APP_SERVICE_SUFFIX); } - @Override - public GroupDTO createSiteAppGroup(Long iamUserId, String groupName) { - GroupDTO group = new GroupDTO(); - group.setName(groupName); - group.setPath(groupName); - UserAttrDTO userAttrDTO = userAttrService.baseQueryById(iamUserId); - GroupDTO groupDTO = gitlabServiceClientOperator.queryGroupByName(group.getPath(), TypeUtil.objToInteger(userAttrDTO.getGitlabUserId())); - if (groupDTO == null) { - group.setVisibility(Visibility.PUBLIC); - groupDTO = gitlabServiceClientOperator.createGroup(group, TypeUtil.objToInteger(userAttrDTO.getGitlabUserId())); - } - return groupDTO; - } - @Override public Boolean checkRepositoryAvailable(String groupName, String projectName, String token) { // 校验token @@ -153,7 +138,8 @@ public void createClusterEnvGroup(ProjectDTO projectDTO, Tenant organizationDTO, GitlabGroupPayload payload = new GitlabGroupPayload(); payload.setOrganizationCode(organizationDTO.getTenantNum()); payload.setOrganizationName(organizationDTO.getTenantName()); - payload.setProjectCode(projectDTO.getCode()); + payload.setProjectCode(projectDTO.getDevopsComponentCode()); + payload.setDevopsComponentCode(projectDTO.getDevopsComponentCode()); payload.setProjectName(projectDTO.getName()); payload.setProjectId(projectDTO.getId()); payload.setUserId(userAttrDTO.getIamUserId()); @@ -188,7 +174,7 @@ private void createGroup(GitlabGroupPayload gitlabGroupPayload, final String suf gitlabGroupPayload.getProjectName(), suffix); // path: orgName-projectCode + suffix String path = GitOpsUtil.renderGroupPath(gitlabGroupPayload.getOrganizationCode(), - gitlabGroupPayload.getProjectCode(), suffix); + gitlabGroupPayload.getDevopsComponentCode(), suffix); group.setName(name); group.setPath(path); diff --git a/src/main/java/io/choerodon/devops/app/service/impl/GitlabHandleServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/GitlabHandleServiceImpl.java index 697141acdd..d92a2d36c3 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/GitlabHandleServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/GitlabHandleServiceImpl.java @@ -46,6 +46,7 @@ public void handleProjectCategoryEvent(ProjectPayload projectPayload) { gitlabGroupPayload.setOrganizationCode(projectPayload.getOrganizationCode()); gitlabGroupPayload.setOrganizationName(projectPayload.getOrganizationName()); gitlabGroupPayload.setProjectCode(projectPayload.getProjectCode()); + gitlabGroupPayload.setDevopsComponentCode(projectPayload.getDevopsComponentCode()); gitlabGroupPayload.setProjectId(projectPayload.getProjectId()); gitlabGroupPayload.setProjectName(projectPayload.getProjectName()); gitlabGroupPayload.setUserId(projectPayload.getUserId()); @@ -79,8 +80,6 @@ public void handleProjectCategoryEvent(ProjectPayload projectPayload) { //2.4 同步停用用户的角色 List disanbleUser = userDTOList.stream().filter(iamUserDTO -> !iamUserDTO.getEnabled()).collect(Collectors.toList()); - disanbleUser.forEach(iamUserDTO -> { - gitlabUserService.disEnabledGitlabUser(TypeUtil.objToLong(iamUserDTO.getId())); - }); + disanbleUser.forEach(iamUserDTO -> gitlabUserService.disEnabledGitlabUser(TypeUtil.objToLong(iamUserDTO.getId()))); } } diff --git a/src/main/java/io/choerodon/devops/app/service/impl/GitlabUserServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/GitlabUserServiceImpl.java index 4b0aa6fbff..764bf46bfe 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/GitlabUserServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/GitlabUserServiceImpl.java @@ -100,7 +100,7 @@ public class GitlabUserServiceImpl implements GitlabUserService { @Override public void createGitlabUser(GitlabUserRequestVO gitlabUserReqDTO) { - checkGitlabUser(gitlabUserReqDTO); +// checkGitlabUser(gitlabUserReqDTO); GitLabUserDTO gitLabUserDTO = gitlabServiceClientOperator.queryUserByUserName(gitlabUserReqDTO.getUsername()); if (gitLabUserDTO == null) { String randomPassword = GenerateUUID.generateRandomGitlabPassword(); @@ -156,7 +156,7 @@ public Boolean updateGitlabUserInNewTx(GitlabUserRequestVO gitlabUserReqDTO) { @Override public void updateGitlabUser(GitlabUserRequestVO gitlabUserReqDTO) { - checkGitlabUser(gitlabUserReqDTO); +// checkGitlabUser(gitlabUserReqDTO); UserAttrDTO userAttrDTO = userAttrService.baseQueryById(TypeUtil.objToLong(gitlabUserReqDTO.getExternUid())); if (userAttrDTO != null) { gitlabServiceClientOperator.updateUser(TypeUtil.objToInteger(userAttrDTO.getGitlabUserId()), diff --git a/src/main/java/io/choerodon/devops/app/service/impl/HandlePVCFileRelationServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/HandlePVCFileRelationServiceImpl.java index 0657fc8763..a78b4d4b54 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/HandlePVCFileRelationServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/HandlePVCFileRelationServiceImpl.java @@ -1,18 +1,18 @@ package io.choerodon.devops.app.service.impl; +import io.kubernetes.client.openapi.models.V1Endpoints; +import io.kubernetes.client.openapi.models.V1PersistentVolumeClaim; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.stream.Collectors; -import io.kubernetes.client.models.V1Endpoints; -import io.kubernetes.client.models.V1PersistentVolumeClaim; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - import io.choerodon.core.exception.CommonException; import io.choerodon.devops.api.vo.DevopsPvcReqVO; import io.choerodon.devops.app.service.DevopsEnvCommandService; diff --git a/src/main/java/io/choerodon/devops/app/service/impl/HandlerC7nCertificationServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/HandlerC7nCertificationServiceImpl.java index f74d3844c9..0af06921e2 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/HandlerC7nCertificationServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/HandlerC7nCertificationServiceImpl.java @@ -1,15 +1,7 @@ package io.choerodon.devops.app.service.impl; -import java.util.*; -import java.util.stream.Collectors; - import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; -import io.kubernetes.client.models.V1Endpoints; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.util.CollectionUtils; - import io.choerodon.devops.api.vo.kubernetes.C7nCertification; import io.choerodon.devops.api.vo.kubernetes.certification.CertificationExistCert; import io.choerodon.devops.api.vo.kubernetes.certification.CertificationSpec; @@ -20,6 +12,13 @@ import io.choerodon.devops.infra.exception.GitOpsExplainException; import io.choerodon.devops.infra.util.GitUtil; import io.choerodon.devops.infra.util.TypeUtil; +import io.kubernetes.client.openapi.models.V1Endpoints; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.util.*; +import java.util.stream.Collectors; @Service diff --git a/src/main/java/io/choerodon/devops/app/service/impl/HandlerC7nReleaseRelationsServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/HandlerC7nReleaseRelationsServiceImpl.java index 83e56f1a47..279aa6bb55 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/HandlerC7nReleaseRelationsServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/HandlerC7nReleaseRelationsServiceImpl.java @@ -1,10 +1,6 @@ package io.choerodon.devops.app.service.impl; -import java.util.*; -import java.util.stream.Collectors; -import javax.annotation.Nullable; - -import io.kubernetes.client.models.V1Endpoints; +import io.kubernetes.client.openapi.models.V1Endpoints; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -13,6 +9,10 @@ import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; +import java.util.*; +import java.util.stream.Collectors; +import javax.annotation.Nullable; + import io.choerodon.core.exception.CommonException; import io.choerodon.devops.api.vo.AppServiceDeployVO; import io.choerodon.devops.api.vo.AppServiceInstanceVO; diff --git a/src/main/java/io/choerodon/devops/app/service/impl/HandlerC7nSecretServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/HandlerC7nSecretServiceImpl.java index 0df8461ae2..f92a5b9d59 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/HandlerC7nSecretServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/HandlerC7nSecretServiceImpl.java @@ -1,15 +1,13 @@ package io.choerodon.devops.app.service.impl; -import java.util.*; -import java.util.stream.Collectors; - -import io.kubernetes.client.models.V1Endpoints; -import io.kubernetes.client.models.V1Secret; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import io.kubernetes.client.openapi.models.V1Endpoints; +import io.kubernetes.client.openapi.models.V1Secret; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.*; +import java.util.stream.Collectors; + import io.choerodon.core.exception.CommonException; import io.choerodon.devops.api.validator.DevopsSecretValidator; import io.choerodon.devops.api.vo.SecretReqVO; @@ -35,9 +33,6 @@ @Service public class HandlerC7nSecretServiceImpl implements HandlerObjectFileRelationsService { - private static final Logger logger = LoggerFactory.getLogger(HandlerC7nSecretServiceImpl.class); - - private static final String CREATE = "create"; private static final String SECRET = "Secret"; @@ -198,7 +193,7 @@ private SecretReqVO getSecretReqDTO(V1Secret c7nSecret, Long envId, String type) // 这两种其实是一样的处理方式, 都从data里面取数据(2020/10/10) if (DOCKER_REGISTRY_SECRET_TYPE.equals(c7nSecret.getType())) { Map map = new HashMap<>(); - c7nSecret.getData().forEach(map::put); + Objects.requireNonNull(c7nSecret.getData()).forEach((k, v) -> map.put(k, Arrays.toString(v))); secretReqVO.setValue(map); } else { secretReqVO.setValue(mergeSecretData(c7nSecret.getData(), c7nSecret.getStringData())); @@ -206,7 +201,7 @@ private SecretReqVO getSecretReqDTO(V1Secret c7nSecret, Long envId, String type) return secretReqVO; } - private Map mergeSecretData(Map data, Map stringData) { + private Map mergeSecretData(Map data, Map stringData) { // k8s处理stringData和data的逻辑是将stringData的value进行base64加密后, 与data合并, // 如果键相同, stringData覆盖data的值 Map converted = new LinkedHashMap<>(); @@ -215,7 +210,7 @@ private Map mergeSecretData(Map data, Map converted.put(k, Base64Util.getBase64EncodedString(v))); } if (data != null) { - data.forEach(converted::putIfAbsent); + data.forEach((k, v) -> converted.putIfAbsent(k, Arrays.toString(v))); } return converted; } diff --git a/src/main/java/io/choerodon/devops/app/service/impl/HandlerConfigMapRelationsServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/HandlerConfigMapRelationsServiceImpl.java index a91e7e5b75..a8fc5b8c9f 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/HandlerConfigMapRelationsServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/HandlerConfigMapRelationsServiceImpl.java @@ -1,17 +1,17 @@ package io.choerodon.devops.app.service.impl; +import com.google.gson.Gson; +import io.kubernetes.client.openapi.models.V1ConfigMap; +import io.kubernetes.client.openapi.models.V1Endpoints; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.stream.Collectors; -import com.google.gson.Gson; -import io.kubernetes.client.models.V1ConfigMap; -import io.kubernetes.client.models.V1Endpoints; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - import io.choerodon.core.exception.CommonException; import io.choerodon.devops.api.vo.DevopsConfigMapRespVO; import io.choerodon.devops.api.vo.DevopsConfigMapVO; diff --git a/src/main/java/io/choerodon/devops/app/service/impl/HandlerCronJobServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/HandlerCronJobServiceImpl.java index 64e277765e..2962064268 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/HandlerCronJobServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/HandlerCronJobServiceImpl.java @@ -1,7 +1,8 @@ package io.choerodon.devops.app.service.impl; -import static io.choerodon.devops.infra.constant.MiscConstants.CREATE_TYPE; -import static io.choerodon.devops.infra.constant.MiscConstants.UPDATE_TYPE; +import io.kubernetes.client.openapi.models.V1Endpoints; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.List; @@ -9,9 +10,8 @@ import java.util.Objects; import java.util.stream.Collectors; -import io.kubernetes.client.models.V1Endpoints; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; +import static io.choerodon.devops.infra.constant.MiscConstants.CREATE_TYPE; +import static io.choerodon.devops.infra.constant.MiscConstants.UPDATE_TYPE; import io.choerodon.core.exception.CommonException; import io.choerodon.devops.api.vo.workload.DevopsCronjobVO; diff --git a/src/main/java/io/choerodon/devops/app/service/impl/HandlerCustomResourceServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/HandlerCustomResourceServiceImpl.java index 49edc57ec6..e1b7b68e94 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/HandlerCustomResourceServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/HandlerCustomResourceServiceImpl.java @@ -1,15 +1,15 @@ package io.choerodon.devops.app.service.impl; +import io.kubernetes.client.openapi.models.V1Endpoints; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.stream.Collectors; -import io.kubernetes.client.models.V1Endpoints; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - import io.choerodon.core.exception.CommonException; import io.choerodon.devops.app.service.*; import io.choerodon.devops.infra.dto.DevopsCustomizeResourceContentDTO; diff --git a/src/main/java/io/choerodon/devops/app/service/impl/HandlerDaemonSetServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/HandlerDaemonSetServiceImpl.java index 22ea335b21..2e09b6b992 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/HandlerDaemonSetServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/HandlerDaemonSetServiceImpl.java @@ -1,8 +1,8 @@ package io.choerodon.devops.app.service.impl; -import static io.choerodon.devops.infra.constant.MiscConstants.CREATE_TYPE; -import static io.choerodon.devops.infra.constant.MiscConstants.UPDATE_TYPE; -import static io.choerodon.devops.infra.enums.ResourceType.DAEMONSET; +import io.kubernetes.client.openapi.models.V1Endpoints; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.List; @@ -10,9 +10,9 @@ import java.util.Objects; import java.util.stream.Collectors; -import io.kubernetes.client.models.V1Endpoints; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; +import static io.choerodon.devops.infra.constant.MiscConstants.CREATE_TYPE; +import static io.choerodon.devops.infra.constant.MiscConstants.UPDATE_TYPE; +import static io.choerodon.devops.infra.enums.ResourceType.DAEMONSET; import io.choerodon.core.exception.CommonException; import io.choerodon.devops.api.vo.DevopsDaemonSetVO; diff --git a/src/main/java/io/choerodon/devops/app/service/impl/HandlerDeploymentServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/HandlerDeploymentServiceImpl.java index b2e70077fb..07e7fbb98b 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/HandlerDeploymentServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/HandlerDeploymentServiceImpl.java @@ -1,7 +1,8 @@ package io.choerodon.devops.app.service.impl; -import static io.choerodon.devops.infra.constant.MiscConstants.CREATE_TYPE; -import static io.choerodon.devops.infra.constant.MiscConstants.UPDATE_TYPE; +import io.kubernetes.client.openapi.models.V1Endpoints; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; @@ -9,9 +10,8 @@ import java.util.Objects; import java.util.stream.Collectors; -import io.kubernetes.client.models.V1Endpoints; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import static io.choerodon.devops.infra.constant.MiscConstants.CREATE_TYPE; +import static io.choerodon.devops.infra.constant.MiscConstants.UPDATE_TYPE; import io.choerodon.core.exception.CommonException; import io.choerodon.devops.api.vo.DevopsDeploymentVO; diff --git a/src/main/java/io/choerodon/devops/app/service/impl/HandlerIngressRelationsServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/HandlerIngressRelationsServiceImpl.java index 37ecc660d4..1e567c287c 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/HandlerIngressRelationsServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/HandlerIngressRelationsServiceImpl.java @@ -1,5 +1,13 @@ package io.choerodon.devops.app.service.impl; +import com.google.gson.Gson; +import io.kubernetes.client.openapi.models.V1Endpoints; +import io.kubernetes.client.openapi.models.V1HTTPIngressPath; +import io.kubernetes.client.openapi.models.V1Ingress; +import io.kubernetes.client.openapi.models.V1IngressBackend; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -7,22 +15,14 @@ import java.util.regex.Pattern; import java.util.stream.Collectors; -import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; -import io.kubernetes.client.custom.IntOrString; -import io.kubernetes.client.models.V1Endpoints; -import io.kubernetes.client.models.V1beta1HTTPIngressPath; -import io.kubernetes.client.models.V1beta1Ingress; -import io.kubernetes.client.models.V1beta1IngressBackend; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - import io.choerodon.core.exception.CommonException; import io.choerodon.devops.api.validator.DevopsIngressValidator; import io.choerodon.devops.api.vo.DevopsIngressPathVO; import io.choerodon.devops.api.vo.DevopsIngressVO; import io.choerodon.devops.app.service.*; -import io.choerodon.devops.infra.dto.*; +import io.choerodon.devops.infra.dto.DevopsEnvCommandDTO; +import io.choerodon.devops.infra.dto.DevopsEnvFileResourceDTO; +import io.choerodon.devops.infra.dto.DevopsIngressDTO; import io.choerodon.devops.infra.enums.GitOpsObjectError; import io.choerodon.devops.infra.exception.GitOpsExplainException; import io.choerodon.devops.infra.util.GitOpsUtil; @@ -30,7 +30,7 @@ import io.choerodon.devops.infra.util.TypeUtil; @Service -public class HandlerIngressRelationsServiceImpl implements HandlerObjectFileRelationsService { +public class HandlerIngressRelationsServiceImpl implements HandlerObjectFileRelationsService { public static final String INGRESS = "Ingress"; private static final String GIT_SUFFIX = "/.git"; private static final Pattern PATTERN = Pattern.compile("^[-+]?[\\d]*$"); @@ -46,7 +46,7 @@ public class HandlerIngressRelationsServiceImpl implements HandlerObjectFileRela @Override - public void handlerRelations(Map objectPath, List beforeSync, List v1beta1Ingresses, List v1Endpoints, Long envId, Long projectId, String path, Long userId) { + public void handlerRelations(Map objectPath, List beforeSync, List v1beta1Ingresses, List v1Endpoints, Long envId, Long projectId, String path, Long userId) { List beforeIngress = beforeSync.stream() .filter(devopsEnvFileResourceE -> devopsEnvFileResourceE.getResourceType().equals(INGRESS)) .map(devopsEnvFileResourceE -> { @@ -62,9 +62,9 @@ public void handlerRelations(Map objectPath, List addV1beta1Ingress = new ArrayList<>(); - List updateV1beta1Ingress = new ArrayList<>(); - GitOpsUtil.pickCUDResource(beforeIngress, v1beta1Ingresses, addV1beta1Ingress, updateV1beta1Ingress, v1beta1Ingress -> v1beta1Ingress.getMetadata().getName()); + List addV1Ingress = new ArrayList<>(); + List updateV1Ingress = new ArrayList<>(); + GitOpsUtil.pickCUDResource(beforeIngress, v1beta1Ingresses, addV1Ingress, updateV1Ingress, v1beta1Ingress -> v1beta1Ingress.getMetadata().getName()); //删除ingress,删除文件对象关联关系 beforeIngress.forEach(ingressName -> { @@ -75,18 +75,18 @@ public void handlerRelations(Map objectPath, List getTarget() { - return V1beta1Ingress.class; + public Class getTarget() { + return V1Ingress.class; } - private void addIngress(Map objectPath, Long envId, Long projectId, List addV1beta1Ingress, String path, Long userId) { - addV1beta1Ingress + private void addIngress(Map objectPath, Long envId, Long projectId, List addV1Ingress, String path, Long userId) { + addV1Ingress .forEach(v1beta1Ingress -> { String filePath = ""; try { @@ -127,8 +127,8 @@ private void addIngress(Map objectPath, Long envId, Long project }); } - private void updateIngress(Map objectPath, Long envId, Long projectId, List updateV1beta1Ingress, String path, Long userId) { - updateV1beta1Ingress + private void updateIngress(Map objectPath, Long envId, Long projectId, List updateV1Ingress, String path, Long userId) { + updateV1Ingress .forEach(v1beta1Ingress -> { String filePath = ""; try { @@ -178,7 +178,7 @@ private void updateIngress(Map objectPath, Long envId, Long proj } private void checkIngressAppVersion( - V1beta1Ingress v1beta1Ingress) { + V1Ingress v1beta1Ingress) { try { DevopsIngressValidator.checkIngressName(v1beta1Ingress.getMetadata().getName()); } catch (Exception e) { @@ -186,7 +186,7 @@ private void checkIngressAppVersion( } } - private DevopsIngressVO getDevopsIngressDTO(V1beta1Ingress v1beta1Ingress, + private DevopsIngressVO getDevopsIngressDTO(V1Ingress v1beta1Ingress, Long envId, String filePath) { DevopsIngressVO devopsIngressVO = new DevopsIngressVO(); devopsIngressVO.setDomain(v1beta1Ingress.getSpec().getRules().get(0).getHost() @@ -196,12 +196,12 @@ private DevopsIngressVO getDevopsIngressDTO(V1beta1Ingress v1beta1Ingress, devopsIngressVO.setEnvId(envId); List pathCheckList = new ArrayList<>(); List devopsIngressPathVOS = new ArrayList<>(); - List paths = v1beta1Ingress.getSpec().getRules().get(0).getHttp().getPaths(); + List paths = v1beta1Ingress.getSpec().getRules().get(0).getHttp().getPaths(); if (paths == null) { throw new GitOpsExplainException(GitOpsObjectError.INGRESS_PATH_IS_EMPTY.getError(), filePath); } - for (V1beta1HTTPIngressPath v1beta1HTTPIngressPath : paths) { - String path = v1beta1HTTPIngressPath.getPath(); + for (V1HTTPIngressPath v1HTTPIngressPath : paths) { + String path = v1HTTPIngressPath.getPath(); try { DevopsIngressValidator.checkPath(path); if (pathCheckList.contains(path)) { @@ -211,28 +211,29 @@ private DevopsIngressVO getDevopsIngressDTO(V1beta1Ingress v1beta1Ingress, } catch (Exception e) { throw new GitOpsExplainException(e.getMessage(), filePath); } - V1beta1IngressBackend backend = v1beta1HTTPIngressPath.getBackend(); - String serviceName = backend.getServiceName(); - DevopsServiceDTO devopsServiceDTO = devopsServiceService.baseQueryByNameAndEnvId( - serviceName, envId); - - Long servicePort = null; - IntOrString backendServicePort = backend.getServicePort(); - if (backendServicePort.isInteger() || PATTERN.matcher(TypeUtil.objToString(backendServicePort)).matches()) { - servicePort = TypeUtil.objToLong(backendServicePort); - } else { - if (devopsServiceDTO != null) { - List listPorts = gson.fromJson(devopsServiceDTO.getPorts(), new TypeToken>() { - }.getType()); - servicePort = listPorts.get(0).getPort(); - } - } - DevopsIngressPathVO devopsIngressPathVO = new DevopsIngressPathVO(); - devopsIngressPathVO.setPath(path); - devopsIngressPathVO.setServicePort(servicePort); - devopsIngressPathVO.setServiceName(serviceName); - devopsIngressPathVO.setServiceId(devopsServiceDTO == null ? null : devopsServiceDTO.getId()); - devopsIngressPathVOS.add(devopsIngressPathVO); + V1IngressBackend backend = v1HTTPIngressPath.getBackend(); + // TODO 兼容旧版本 +// String serviceName = backend.getServiceName(); +// DevopsServiceDTO devopsServiceDTO = devopsServiceService.baseQueryByNameAndEnvId( +// serviceName, envId); +// +// Long servicePort = null; +// IntOrString backendServicePort = backend.getServicePort(); +// if (backendServicePort.isInteger() || PATTERN.matcher(TypeUtil.objToString(backendServicePort)).matches()) { +// servicePort = TypeUtil.objToLong(backendServicePort); +// } else { +// if (devopsServiceDTO != null) { +// List listPorts = gson.fromJson(devopsServiceDTO.getPorts(), new TypeToken>() { +// }.getType()); +// servicePort = listPorts.get(0).getPort(); +// } +// } +// DevopsIngressPathVO devopsIngressPathVO = new DevopsIngressPathVO(); +// devopsIngressPathVO.setPath(path); +// devopsIngressPathVO.setServicePort(servicePort); +// devopsIngressPathVO.setServiceName(serviceName); +// devopsIngressPathVO.setServiceId(devopsServiceDTO == null ? null : devopsServiceDTO.getId()); +// devopsIngressPathVOS.add(devopsIngressPathVO); } devopsIngressVO.setPathList(devopsIngressPathVOS); return devopsIngressVO; diff --git a/src/main/java/io/choerodon/devops/app/service/impl/HandlerJobServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/HandlerJobServiceImpl.java index b74569c996..7dd5b6662c 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/HandlerJobServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/HandlerJobServiceImpl.java @@ -1,7 +1,8 @@ package io.choerodon.devops.app.service.impl; -import static io.choerodon.devops.infra.constant.MiscConstants.CREATE_TYPE; -import static io.choerodon.devops.infra.constant.MiscConstants.UPDATE_TYPE; +import io.kubernetes.client.openapi.models.V1Endpoints; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.List; @@ -9,9 +10,8 @@ import java.util.Objects; import java.util.stream.Collectors; -import io.kubernetes.client.models.V1Endpoints; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; +import static io.choerodon.devops.infra.constant.MiscConstants.CREATE_TYPE; +import static io.choerodon.devops.infra.constant.MiscConstants.UPDATE_TYPE; import io.choerodon.core.exception.CommonException; import io.choerodon.devops.api.vo.DevopsJobVO; diff --git a/src/main/java/io/choerodon/devops/app/service/impl/HandlerPersistentVolumeServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/HandlerPersistentVolumeServiceImpl.java index cc78bc5618..7770a011d6 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/HandlerPersistentVolumeServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/HandlerPersistentVolumeServiceImpl.java @@ -1,20 +1,20 @@ package io.choerodon.devops.app.service.impl; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.stream.Collectors; - -import io.kubernetes.client.JSON; -import io.kubernetes.client.models.V1Endpoints; -import io.kubernetes.client.models.V1PersistentVolume; +import io.kubernetes.client.openapi.JSON; +import io.kubernetes.client.openapi.models.V1Endpoints; +import io.kubernetes.client.openapi.models.V1PersistentVolume; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + import io.choerodon.core.exception.CommonException; import io.choerodon.devops.api.vo.DevopsPvReqVO; import io.choerodon.devops.api.vo.kubernetes.LocalPvResource; @@ -182,7 +182,7 @@ private DevopsPvReqVO constructPv(V1PersistentVolume pv, Long envId, String type devopsPvReqVO.setEnvId(envId); devopsPvReqVO.setName(pv.getMetadata().getName()); devopsPvReqVO.setCommandType(type); - Map labels=pv.getMetadata().getLabels(); + Map labels = pv.getMetadata().getLabels(); if (!CollectionUtils.isEmpty(labels)) { devopsPvReqVO.setLabels(JsonHelper.marshalByJackson(pv.getMetadata().getLabels())); } diff --git a/src/main/java/io/choerodon/devops/app/service/impl/HandlerServiceRelationsServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/HandlerServiceRelationsServiceImpl.java index b44793b31a..bc569dce68 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/HandlerServiceRelationsServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/HandlerServiceRelationsServiceImpl.java @@ -1,16 +1,16 @@ package io.choerodon.devops.app.service.impl; -import java.util.*; -import java.util.stream.Collectors; - import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; -import io.kubernetes.client.models.V1Endpoints; -import io.kubernetes.client.models.V1Service; +import io.kubernetes.client.openapi.models.V1Endpoints; +import io.kubernetes.client.openapi.models.V1Service; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.*; +import java.util.stream.Collectors; + import io.choerodon.core.exception.CommonException; import io.choerodon.devops.api.validator.DevopsServiceValidator; import io.choerodon.devops.api.vo.DevopsServiceReqVO; @@ -248,7 +248,8 @@ private void checkServiceName( } private Boolean checkIsNotChange(DevopsServiceDTO devopsServiceDTO, DevopsServiceReqVO devopsServiceReqVO) { - List oldPort = gson.fromJson(devopsServiceDTO.getPorts(), new TypeToken>() {}.getType()); + List oldPort = gson.fromJson(devopsServiceDTO.getPorts(), new TypeToken>() { + }.getType()); //查询网络对应的实例 List devopsServiceInstanceDTOS = devopsServiceInstanceService.baseListByServiceId(devopsServiceDTO.getId()); diff --git a/src/main/java/io/choerodon/devops/app/service/impl/HandlerStatefulSetServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/HandlerStatefulSetServiceImpl.java index 8a5dc43a77..39dc0d8d0d 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/HandlerStatefulSetServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/HandlerStatefulSetServiceImpl.java @@ -1,7 +1,8 @@ package io.choerodon.devops.app.service.impl; -import static io.choerodon.devops.infra.constant.MiscConstants.CREATE_TYPE; -import static io.choerodon.devops.infra.constant.MiscConstants.UPDATE_TYPE; +import io.kubernetes.client.openapi.models.V1Endpoints; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; @@ -9,9 +10,8 @@ import java.util.Objects; import java.util.stream.Collectors; -import io.kubernetes.client.models.V1Endpoints; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import static io.choerodon.devops.infra.constant.MiscConstants.CREATE_TYPE; +import static io.choerodon.devops.infra.constant.MiscConstants.UPDATE_TYPE; import io.choerodon.core.exception.CommonException; import io.choerodon.devops.api.vo.DevopsStatefulSetVO; diff --git a/src/main/java/io/choerodon/devops/app/service/impl/HostCommandServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/HostCommandServiceImpl.java deleted file mode 100644 index dd63acd37a..0000000000 --- a/src/main/java/io/choerodon/devops/app/service/impl/HostCommandServiceImpl.java +++ /dev/null @@ -1,16 +0,0 @@ -package io.choerodon.devops.app.service.impl; - -import io.choerodon.devops.app.service.HostCommandService; -import org.springframework.stereotype.Service; - -/** - * 〈功能简述〉 - * 〈〉 - * - * @author wanghao - * @Date 2021/6/28 14:02 - */ -@Service -public class HostCommandServiceImpl implements HostCommandService { - -} diff --git a/src/main/java/io/choerodon/devops/app/service/impl/ProjectServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/ProjectServiceImpl.java index c206d49e68..8e359dfbfd 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/ProjectServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/ProjectServiceImpl.java @@ -1,7 +1,6 @@ package io.choerodon.devops.app.service.impl; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import io.choerodon.core.exception.CommonException; @@ -19,24 +18,9 @@ @Component public class ProjectServiceImpl implements ProjectService { - @Value("${spring.application.name}") - private String applicationName; - @Autowired private DevopsProjectMapper devopsProjectMapper; - @Override - public boolean queryProjectGitlabGroupReady(Long projectId) { - DevopsProjectDTO devopsProjectDTO = devopsProjectMapper.selectByPrimaryKey(projectId); - if (devopsProjectDTO == null) { - throw new CommonException("error.group.not.sync"); - } - if (devopsProjectDTO.getDevopsAppGroupId() == null || devopsProjectDTO.getDevopsEnvGroupId() == null) { - throw new CommonException("error.gitlab.groupId.select"); - } - return devopsProjectDTO.getDevopsAppGroupId() != null; - } - @Override public DevopsProjectDTO queryById(Long projectId) { DevopsProjectDTO devopsProjectDTO = devopsProjectMapper.selectByPrimaryKey(projectId); diff --git a/src/main/java/io/choerodon/devops/app/service/impl/SendNotificationServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/SendNotificationServiceImpl.java index a6f4da58c7..d2fc3f57cb 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/SendNotificationServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/SendNotificationServiceImpl.java @@ -479,7 +479,7 @@ public void sendWhenMergeRequestAuditEvent(Integer gitlabProjectId, Long mergeRe return; } - Map params = makeMergeRequestEventParams(gitlabUrl, organizationDTO.getTenantNum(), projectDTO.getCode(), projectDTO.getName(), appServiceDTO.getCode(), appServiceDTO.getName(), authorUser.getRealName(), mergeRequestId); + Map params = makeMergeRequestEventParams(gitlabUrl, organizationDTO.getTenantNum(), projectDTO.getDevopsComponentCode(), projectDTO.getName(), appServiceDTO.getCode(), appServiceDTO.getName(), authorUser.getRealName(), mergeRequestId); params.put(LINK, String.format(MERGE_REQUEST_URL, frontUrl, projectDTO.getId(), projectDTO.getName(), projectDTO.getOrganizationId(), appServiceDTO.getId())); sendNotices(MessageCodeConstants.AUDIT_MERGE_REQUEST, ArrayUtil.singleAsList(constructReceiver(iamUserDTO.getId())), params, projectDTO.getId()); }, @@ -546,7 +546,7 @@ private void doSendWhenMergeRequestClosedOrMerged(String sendSettingCode, Intege return; } - Map params = makeMergeRequestEventParams(gitlabUrl, organizationDTO.getTenantNum(), projectDTO.getCode(), projectDTO.getName(), appServiceDTO.getCode(), appServiceDTO.getName(), authorUser.getRealName(), mergeRequestId); + Map params = makeMergeRequestEventParams(gitlabUrl, organizationDTO.getTenantNum(), projectDTO.getDevopsComponentCode(), projectDTO.getName(), appServiceDTO.getCode(), appServiceDTO.getName(), authorUser.getRealName(), mergeRequestId); params.put(LINK, String.format(MERGE_REQUEST_URL, frontUrl, projectDTO.getId(), projectDTO.getName(), projectDTO.getOrganizationId(), appServiceDTO.getId())); sendNotices(sendSettingCode, ArrayUtil.singleAsList(constructReceiver(iamUserDTO.getId())), params, projectDTO.getId()); }, @@ -664,6 +664,7 @@ public void sendWhenServiceCreationFailure(DevopsServiceDTO devopsServiceDTO, Lo devopsEnvironmentDTO.getId(), devopsEnvironmentDTO.getName()); doSendWhenResourceCreationFailure(MessageCodeConstants.SERVICE_CREATION_FAILURE, devopsEnvironmentDTO.getId(), devopsServiceDTO.getName(), creatorId, resourceCommandId, webHookParams); + doSendWhenResourceCreationFailure(SendSettingEnum.CREATE_RESOURCE_FAILED.value(), devopsEnvironmentDTO.getId(), devopsServiceDTO.getName(), creatorId, resourceCommandId, webHookParams); }, ex -> LOGGER.info("Failed to send message WhenServiceCreationFailure.", ex) ); @@ -782,7 +783,7 @@ public void sendWhenSecret(DevopsSecretDTO devopsSecretDTO, String code) { } - private static Receiver constructReceiver(Long userId, String email, String phone, Long userTenantId) { + protected static Receiver constructReceiver(Long userId, String email, String phone, Long userTenantId) { Receiver receiver = new Receiver(); receiver.setUserId(Objects.requireNonNull(userId)); receiver.setEmail(Objects.requireNonNull(email)); @@ -826,7 +827,7 @@ private void sendCiPipelineMessage(Long pipelineRecordId, String type, List users) { + protected void addSpecifierList(String messageCode, Long projectId, List users) { if (messageCode.equals(MessageCodeConstants.PIPELINE_FAILED) || messageCode.equals(MessageCodeConstants.PIPELINE_SUCCESS)) { MessageSettingVO messageSettingVO = messageClientOperator.getMessageSettingVO(ServiceNotifyType.DEVOPS_NOTIFY.getTypeName(), projectId, messageCode); @@ -847,7 +848,7 @@ private void addSpecifierList(String messageCode, Long projectId, List } } - private Map constructCdParamsForPipeline(DevopsCdPipelineRecordDTO recordDTO, ProjectDTO projectDTO, @Nullable Map params, Long stageId, String stageName) { + protected Map constructCdParamsForPipeline(DevopsCdPipelineRecordDTO recordDTO, ProjectDTO projectDTO, @Nullable Map params, Long stageId, String stageName) { return StringMapBuilder.newBuilder() .put(PIPE_LINE_NAME, recordDTO.getPipelineName()) .put(PROJECT_ID, recordDTO.getProjectId()) @@ -860,7 +861,7 @@ private Map constructCdParamsForPipeline(DevopsCdPipelineRecordD .build(); } - private Map constructCiParamsForPipeline(String pipelineName, ProjectDTO projectDTO, @Nullable Map params, Long stageId, String stageName) { + protected Map constructCiParamsForPipeline(String pipelineName, ProjectDTO projectDTO, @Nullable Map params, Long stageId, String stageName) { return StringMapBuilder.newBuilder() .put(PIPE_LINE_NAME, pipelineName) .put(PROJECT_ID, projectDTO.getId()) @@ -888,6 +889,7 @@ public void sendWhenIngressCreationFailure(DevopsIngressDTO devopsIngressDTO, Lo devopsEnvironmentDTO.getName() ); doSendWhenResourceCreationFailure(MessageCodeConstants.INGRESS_CREATION_FAILURE, devopsEnvironmentDTO.getId(), devopsIngressDTO.getName(), creatorId, resourceCommandId, params); + doSendWhenResourceCreationFailure(SendSettingEnum.CREATE_RESOURCE_FAILED.value(), devopsEnvironmentDTO.getId(), devopsIngressDTO.getName(), creatorId, resourceCommandId, params); }, ex -> LOGGER.info("Failed to sendWhenIngressCreationFailure", ex)); } @@ -908,6 +910,7 @@ public void sendWhenCertificationCreationFailure(CertificationDTO certificationD devopsEnvironmentDTO.getName() ); doSendWhenResourceCreationFailure(MessageCodeConstants.CERTIFICATION_CREATION_FAILURE, certificationDTO.getEnvId(), certificationDTO.getName(), creatorId, resourceCommandId, params); + doSendWhenResourceCreationFailure(SendSettingEnum.CREATE_RESOURCE_FAILED.value(), certificationDTO.getEnvId(), certificationDTO.getName(), creatorId, resourceCommandId, params); }, ex -> LOGGER.info("Failed to sendWhenCertificationCreationFailure", ex)); } @@ -941,7 +944,7 @@ public void sendForUserDefaultPassword(String userId, String password) { private static Map constructParamsForEnv(DevopsEnvironmentDTO devopsEnvironmentDTO, Long organizationId) { return StringMapBuilder.newBuilder() // 不是打错,模板就是这样 - .put("enveId", devopsEnvironmentDTO.getId()) + .put("envId", devopsEnvironmentDTO.getId()) .put("envCode", devopsEnvironmentDTO.getCode()) .put(ENV_NAME, devopsEnvironmentDTO.getName()) .put(CLUSTER_ID, devopsEnvironmentDTO.getClusterId()) @@ -1113,7 +1116,7 @@ public void sendWhenResourceInstallFailed(DevopsClusterResourceDTO devopsCluster * @param actionInTry 正常处理的逻辑 * @param actionInCatch 处理异常的逻辑 */ - private static void doWithTryCatchAndLog(Runnable actionInTry, Consumer actionInCatch) { + protected static void doWithTryCatchAndLog(Runnable actionInTry, Consumer actionInCatch) { if (actionInTry == null) { LOGGER.info("Internal fault: parameter actionInTry is unexpectedly null. Action abort."); return; @@ -1229,7 +1232,7 @@ public void sendInstanceStatusUpdate(AppServiceInstanceDTO appServiceInstanceDTO webHookParams.put(LINK, String.format(INSTANCE_URL, frontUrl, projectDTO.getId(), projectDTO.getName(), projectDTO.getOrganizationId(), devopsEnvironmentDTO.getId())); //实例部署失败还有站内信和邮件 receivers = ArrayUtil.singleAsList(constructReceiver(Objects.requireNonNull(appServiceInstanceDTO.getCreatedBy()))); - + sendNotices(SendSettingEnum.CREATE_RESOURCE_FAILED.value(), receivers, webHookParams, projectDTO.getId()); } break; case UPDATE: diff --git a/src/main/java/io/choerodon/devops/app/service/impl/UserAttrServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/UserAttrServiceImpl.java index f39a9df3da..3b8406ad5c 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/UserAttrServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/UserAttrServiceImpl.java @@ -8,6 +8,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; +import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; import io.choerodon.core.domain.Page; @@ -19,6 +20,7 @@ import io.choerodon.devops.infra.dto.repo.RdmMemberQueryDTO; import io.choerodon.devops.infra.dto.repo.RdmMemberViewDTO; import io.choerodon.devops.infra.feign.operator.BaseServiceClientOperator; +import io.choerodon.devops.infra.feign.operator.GitlabServiceClientOperator; import io.choerodon.devops.infra.feign.operator.HrdsCodeRepoClientOperator; import io.choerodon.devops.infra.mapper.UserAttrMapper; import io.choerodon.devops.infra.util.*; @@ -33,6 +35,8 @@ public class UserAttrServiceImpl implements UserAttrService { private HrdsCodeRepoClientOperator hrdsCodeRepoClientOperator; @Autowired private BaseServiceClientOperator baseServiceClientOperator; + @Autowired + private GitlabServiceClientOperator gitlabServiceClientOperator; @Override public UserAttrVO queryByUserId(Long userId) { @@ -152,6 +156,14 @@ public void updateAdmin(Long iamUserId, Boolean isGitlabAdmin) { userAttrMapper.updateIsGitlabAdmin(Objects.requireNonNull(iamUserId), Objects.requireNonNull(isGitlabAdmin)); } + @Override + public void updateAdmins(List iamUserIds, Boolean isGitlabAdmin) { + if (ObjectUtils.isEmpty(iamUserIds)) { + return; + } + userAttrMapper.updateAreAdmin(iamUserIds, isGitlabAdmin); + } + @Override public Page queryByAppServiceId(Long projectId, Long appServiceId, PageRequest pageRequest, String params) { List selectedIamUserIds = new ArrayList<>(); @@ -226,4 +238,28 @@ public UserAttrDTO queryGitlabAdminByIamId() { throw new CommonException("error.get.iam.admin"); } } + + @Override + public List listAllAdmin() { + return userAttrMapper.listAllAdmin(); + } + + @Override + public void updateGitlabAdminUserToNormalUser(List iamUserIds) { + userAttrMapper.updateGitlabAdminUserToNormalUser(iamUserIds); + } + + @Override + public String queryOrCreateImpersonationToken(Long iamUserId) { + UserAttrDTO userAttrDTO = userAttrMapper.selectByPrimaryKey(iamUserId); + + if (org.apache.commons.lang3.StringUtils.isEmpty(userAttrDTO.getGitlabToken())) { + String impersonationToken = gitlabServiceClientOperator.createImpersonationToken(TypeUtil.objToInteger(userAttrDTO.getGitlabUserId()), null); + userAttrDTO.setGitlabToken(impersonationToken); + userAttrMapper.updateByPrimaryKeySelective(userAttrDTO); + return impersonationToken; + } else { + return userAttrDTO.getGitlabToken(); + } + } } diff --git a/src/main/java/io/choerodon/devops/app/service/impl/WorkBenchServiceImpl.java b/src/main/java/io/choerodon/devops/app/service/impl/WorkBenchServiceImpl.java index 6390765495..156e6215dd 100644 --- a/src/main/java/io/choerodon/devops/app/service/impl/WorkBenchServiceImpl.java +++ b/src/main/java/io/choerodon/devops/app/service/impl/WorkBenchServiceImpl.java @@ -169,7 +169,7 @@ private List listMergeRequestApproval(Tenant tenant, Map listLatestUserAppServiceDTO(Tenant tenant, List latestAppServiceVO.setProjectName(projectDTO.getName()) .setProjectId(appServiceDTO.getProjectId()) .setCode(appServiceDTO.getCode()) - .setRepoUrl(gitlabUrl + urlSlash + tenant.getTenantNum() + "-" + projectDTO.getCode() + "/" + .setRepoUrl(gitlabUrl + urlSlash + tenant.getTenantNum() + "-" + projectDTO.getDevopsComponentCode() + "/" + appServiceDTO.getCode() + ".git") .setName(appServiceDTO.getName()); }); diff --git a/src/main/java/io/choerodon/devops/app/task/DevopsCommandRunner.java b/src/main/java/io/choerodon/devops/app/task/DevopsCommandRunner.java index 7d6588803e..e0cd16266e 100644 --- a/src/main/java/io/choerodon/devops/app/task/DevopsCommandRunner.java +++ b/src/main/java/io/choerodon/devops/app/task/DevopsCommandRunner.java @@ -1,16 +1,11 @@ package io.choerodon.devops.app.task; -import static io.choerodon.devops.infra.constant.MiscConstants.DEFAULT_CHART_NAME; import static io.choerodon.devops.infra.constant.MiscConstants.DEFAULT_SONAR_NAME; -import java.util.HashMap; -import java.util.Map; -import java.util.Optional; +import java.util.*; import com.google.gson.Gson; import okhttp3.ResponseBody; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.CommandLineRunner; @@ -21,12 +16,14 @@ import retrofit2.Call; import io.choerodon.core.exception.CommonException; -import io.choerodon.devops.api.vo.ConfigVO; +import io.choerodon.core.iam.ResourceLevel; import io.choerodon.devops.api.vo.sonar.UserToken; import io.choerodon.devops.api.vo.sonar.UserTokens; import io.choerodon.devops.app.service.AppServiceVersionService; import io.choerodon.devops.app.service.DevopsConfigService; +import io.choerodon.devops.app.service.DevopsHelmConfigService; import io.choerodon.devops.infra.dto.DevopsConfigDTO; +import io.choerodon.devops.infra.dto.DevopsHelmConfigDTO; import io.choerodon.devops.infra.enums.ProjectConfigType; import io.choerodon.devops.infra.feign.SonarClient; import io.choerodon.devops.infra.handler.RetrofitHandler; @@ -42,8 +39,6 @@ @Order(100) @Component public class DevopsCommandRunner implements CommandLineRunner { - private static final Logger LOGGER = LoggerFactory.getLogger(DevopsCommandRunner.class); - public static final String SONAR = "sonar"; private final Gson gson = new Gson(); @@ -54,6 +49,8 @@ public class DevopsCommandRunner implements CommandLineRunner { private AppServiceVersionService appServiceVersionService; @Autowired private DevopsConfigMapper devopsConfigMapper; + @Autowired + private DevopsHelmConfigService devopsHelmConfigService; @Value("${services.helm.url}") private String servicesHelmUrl; @@ -71,15 +68,16 @@ public class DevopsCommandRunner implements CommandLineRunner { @Override public void run(String... strings) { try { - ConfigVO chartConfig = new ConfigVO(); - chartConfig.setUrl(servicesHelmUrl); + DevopsHelmConfigDTO devopsHelmConfigDTO = new DevopsHelmConfigDTO(); + devopsHelmConfigDTO.setUrl(servicesHelmUrl); + devopsHelmConfigDTO.setName(UUID.randomUUID().toString()); // 只有helm的用户名密码都设置了, 才设置到数据库中 - if (!StringUtils.isEmpty(servicesHelmUserName) && !StringUtils.isEmpty(servicesHelmPassword)) { - chartConfig.setUserName(servicesHelmUserName); - chartConfig.setPassword(servicesHelmPassword); - chartConfig.setIsPrivate(Boolean.TRUE); + if (StringUtils.hasText(servicesHelmUserName) && StringUtils.hasText(servicesHelmPassword)) { + devopsHelmConfigDTO.setUsername(servicesHelmUserName); + devopsHelmConfigDTO.setPassword(servicesHelmPassword); + devopsHelmConfigDTO.setRepoPrivate(Boolean.TRUE); } - initConfig(chartConfig, DEFAULT_CHART_NAME, ProjectConfigType.CHART.getType()); + initHelmConfig(devopsHelmConfigDTO); if (sonarqubeUrl != null && !sonarqubeUrl.isEmpty()) { createSonarToken(); @@ -89,26 +87,24 @@ public void run(String... strings) { } } - private void initConfig(ConfigVO configDTO, String configName, String configType) { - DevopsConfigDTO newConfigDTO = new DevopsConfigDTO(); - newConfigDTO.setConfig(gson.toJson(configDTO)); - newConfigDTO.setName(configName); - newConfigDTO.setType(configType); - DevopsConfigDTO oldConfigDTO = devopsConfigService.baseQueryByName(null, configName); + private void initHelmConfig(DevopsHelmConfigDTO devopsHelmConfigDTO) { + devopsHelmConfigDTO.setResourceId(0L); + devopsHelmConfigDTO.setResourceType(ResourceLevel.SITE.value()); + devopsHelmConfigDTO.setRepoDefault(true); + DevopsHelmConfigDTO oldConfigDTO = devopsHelmConfigService.queryDefaultDevopsHelmConfigByLevel(ResourceLevel.SITE.value(),0L); if (oldConfigDTO == null) { - devopsConfigService.baseCreate(newConfigDTO); - } else if (!gson.toJson(configDTO).equals(oldConfigDTO.getConfig())) { - // 存在判断是否已经生成服务版本,无服务版本,直接覆盖更新;有服务版本,将原config对应的resourceId设置为null,新建config - if (appServiceVersionService.isVersionUseConfig(oldConfigDTO.getId(), oldConfigDTO.getType())) { - // 将原有配置的name, app_service, project_id, organization_id 字段置为null - devopsConfigMapper.updateConfigFieldsNull(oldConfigDTO.getId()); - newConfigDTO.setId(null); - devopsConfigService.baseCreate(newConfigDTO); - } else { - newConfigDTO.setId(oldConfigDTO.getId()); - newConfigDTO.setObjectVersionNumber(oldConfigDTO.getObjectVersionNumber()); - devopsConfigService.baseUpdate(newConfigDTO); + devopsHelmConfigService.createDevopsHelmConfig(devopsHelmConfigDTO); + } else if (Objects.equals(oldConfigDTO.getUrl(), devopsHelmConfigDTO.getUrl())) { + if (!Objects.equals(oldConfigDTO.getUsername(), devopsHelmConfigDTO.getUsername()) + || !Objects.equals(oldConfigDTO.getPassword(), devopsHelmConfigDTO.getPassword())) { + devopsHelmConfigDTO.setId(oldConfigDTO.getId()); + devopsHelmConfigDTO.setObjectVersionNumber(oldConfigDTO.getObjectVersionNumber()); + devopsHelmConfigService.updateDevopsHelmConfig(devopsHelmConfigDTO); } + } else { + oldConfigDTO.setRepoDefault(false); + devopsHelmConfigService.updateDevopsHelmConfig(oldConfigDTO); + devopsHelmConfigService.createDevopsHelmConfig(devopsHelmConfigDTO); } } diff --git a/src/main/java/io/choerodon/devops/app/task/DevopsFixDataTask.java b/src/main/java/io/choerodon/devops/app/task/DevopsFixDataTask.java index 7e416c8214..08fbbdee88 100644 --- a/src/main/java/io/choerodon/devops/app/task/DevopsFixDataTask.java +++ b/src/main/java/io/choerodon/devops/app/task/DevopsFixDataTask.java @@ -1,7 +1,6 @@ package io.choerodon.devops.app.task; -import static io.choerodon.devops.app.service.impl.DevopsCheckLogServiceImpl.FIX_APP_CENTER_DATA; -import static io.choerodon.devops.app.service.impl.DevopsCheckLogServiceImpl.FIX_PIPELINE_DATA; +import static io.choerodon.devops.app.service.impl.DevopsCheckLogServiceImpl.*; import java.util.Map; @@ -54,4 +53,44 @@ public void fixPipelineData(Map map) { } } + /** + * 迁移helm仓库的数据到新的表,以及应用版本与helm仓库的关联关系 + * + * @param map + */ + @JobTask(maxRetryCount = 3, code = FIX_HELM_REPO_DATA, description = "迁移helm仓库数据") + @TimedTask(name = FIX_HELM_REPO_DATA, description = "迁移helm仓库数据", repeatInterval = 1, repeatIntervalUnit = QuartzDefinition.SimpleRepeatIntervalUnit.HOURS, params = {}) + public void fixHelmRepoData(Map map) { + try { + devopsCheckLogService.checkLog(FIX_HELM_REPO_DATA); + } catch (Exception e) { + logger.error("error.fix.data", e); + } + } + + @JobTask(maxRetryCount = 3, code = FIX_HELM_VERSION_DATA, description = "迁移应用服务版本中chart版本数据") + @TimedTask(name = FIX_HELM_VERSION_DATA, description = "迁移应用服务版本中chart版本数据", repeatInterval = 1, repeatIntervalUnit = QuartzDefinition.SimpleRepeatIntervalUnit.HOURS, params = {}) + public void fixHelmVersionData(Map map) { + try { + devopsCheckLogService.checkLog(FIX_HELM_VERSION_DATA); + } catch (Exception e) { + logger.error("error.fix.data", e); + } + } + + /** + * 迁移应用服务版本中镜像版本数据 + * + * @param map + */ + @JobTask(maxRetryCount = 3, code = FIX_IMAGE_VERSION_DATA, description = "迁移应用服务版本中镜像版本数据") + @TimedTask(name = FIX_IMAGE_VERSION_DATA, description = "迁移应用服务版本中镜像版本数据", repeatInterval = 1, repeatIntervalUnit = QuartzDefinition.SimpleRepeatIntervalUnit.HOURS, params = {}) + public void fixImageVersionData(Map map) { + try { + devopsCheckLogService.checkLog(FIX_IMAGE_VERSION_DATA); + } catch (Exception e) { + logger.error("error.fix.data", e); + } + } + } diff --git a/src/main/java/io/choerodon/devops/infra/annotation/WillDeleted.java b/src/main/java/io/choerodon/devops/infra/annotation/WillDeleted.java deleted file mode 100644 index 0bc520af11..0000000000 --- a/src/main/java/io/choerodon/devops/infra/annotation/WillDeleted.java +++ /dev/null @@ -1,7 +0,0 @@ -package io.choerodon.devops.infra.annotation; - -/** - * CICD融合完后将要删除类的标记 - */ -public @interface WillDeleted { -} diff --git a/src/main/java/io/choerodon/devops/infra/config/BatchInsertHelperConfig.java b/src/main/java/io/choerodon/devops/infra/config/BatchInsertHelperConfig.java index ab3418d890..260f25f80d 100644 --- a/src/main/java/io/choerodon/devops/infra/config/BatchInsertHelperConfig.java +++ b/src/main/java/io/choerodon/devops/infra/config/BatchInsertHelperConfig.java @@ -6,9 +6,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import io.choerodon.devops.infra.dto.DevopsDeployAppCenterEnvDTO; -import io.choerodon.devops.infra.dto.DevopsHostUserPermissionDTO; -import io.choerodon.devops.infra.dto.DevopsIssueRelDTO; +import io.choerodon.devops.infra.dto.*; /** * 批量插入的配置 @@ -33,4 +31,19 @@ public BatchInsertHelper hostUserPermissionDTOBatch public BatchInsertHelper devopsAppCenterHelper(SqlSessionFactory sqlSessionFactory) { return new BatchInsertHelper<>(sqlSessionFactory, this.sliceSize); } + + @Bean("devopsHelmConfigHelper") + public BatchInsertHelper devopsHelmConfigDTOBatchInsertHelper(SqlSessionFactory sqlSessionFactory) { + return new BatchInsertHelper<>(sqlSessionFactory, this.sliceSize); + } + + @Bean("appServiceHelmConfigHelper") + public BatchInsertHelper appServiceHelmRelDTOBatchInsertHelper(SqlSessionFactory sqlSessionFactory) { + return new BatchInsertHelper<>(sqlSessionFactory, this.sliceSize); + } + + @Bean("appServiceVersionHelmConfigHelper") + public BatchInsertHelper appServiceHelmVersionDTOBatchInsertHelper(SqlSessionFactory sqlSessionFactory) { + return new BatchInsertHelper<>(sqlSessionFactory, this.sliceSize); + } } \ No newline at end of file diff --git a/src/main/java/io/choerodon/devops/infra/config/SwaggerApiConfig.java b/src/main/java/io/choerodon/devops/infra/config/SwaggerApiConfig.java index 32b43eed05..79379ac5bb 100644 --- a/src/main/java/io/choerodon/devops/infra/config/SwaggerApiConfig.java +++ b/src/main/java/io/choerodon/devops/infra/config/SwaggerApiConfig.java @@ -14,7 +14,7 @@ */ @Configuration public class SwaggerApiConfig { - public static final String APP_EXTERNAL_CONFIG = "App external conifg"; + public static final String APP_EXTERNAL_CONFIG = "App external config"; public static final String APP_SERVICE = "App service"; public static final String APP_SERVICE_INSTANCE = "App service instance"; public static final String DEVOPS_CD_PIPELINE = "Devops cd pipeline"; diff --git a/src/main/java/io/choerodon/devops/infra/constant/MiscConstants.java b/src/main/java/io/choerodon/devops/infra/constant/MiscConstants.java index f2261fe2aa..f1905eaed3 100644 --- a/src/main/java/io/choerodon/devops/infra/constant/MiscConstants.java +++ b/src/main/java/io/choerodon/devops/infra/constant/MiscConstants.java @@ -9,9 +9,16 @@ public final class MiscConstants { private MiscConstants() { } + // 项目类型相关 + /** + * devops项目类型 + */ + public static final String DEVOPS = "N_DEVOPS"; - public static final String DEFAULT_INTERNAL_APP_SERVICE_REPO_URL = "none"; - + /** + * 运维项目类型 + */ + public static final String OPERATIONS = "N_OPERATIONS"; /** * 默认的chart配置的名称 */ diff --git a/src/main/java/io/choerodon/devops/infra/constant/ResourceCheckConstant.java b/src/main/java/io/choerodon/devops/infra/constant/ResourceCheckConstant.java index 8a1186a42f..0acbc71c88 100644 --- a/src/main/java/io/choerodon/devops/infra/constant/ResourceCheckConstant.java +++ b/src/main/java/io/choerodon/devops/infra/constant/ResourceCheckConstant.java @@ -19,6 +19,7 @@ private ResourceCheckConstant() { // app service version public static final String ERROR_SERVICE_VERSION_VALUE_ID_IS_NULL = "error.service.version.value.id.is.null"; + public static final String ERROR_SERVICE_VERSION_ID_IS_NULL = "error.service.version.id.is.null"; public static final String ERROR_PARAM_IS_INVALID = "error.param.is.invalid"; @@ -72,5 +73,9 @@ private ResourceCheckConstant() { public static final String ERROR_JOB_NAME_ID_IS_NULL = "error.job.name.id.is.null"; public static final String ERROR_JOB_TYPE_IS_NULL = "error.job.type.is.null"; + // general + public static final String ERROR_RESOURCE_ID_IS_NULL = "error.resource.id.is.null"; + public static final String ERROR_RESOURCE_TYPE_IS_NULL = "error.resource.type.is.null"; + } diff --git a/src/main/java/io/choerodon/devops/infra/dto/AppServiceHelmRelDTO.java b/src/main/java/io/choerodon/devops/infra/dto/AppServiceHelmRelDTO.java new file mode 100644 index 0000000000..c9bcec163f --- /dev/null +++ b/src/main/java/io/choerodon/devops/infra/dto/AppServiceHelmRelDTO.java @@ -0,0 +1,75 @@ +package io.choerodon.devops.infra.dto; + +import com.fasterxml.jackson.annotation.JsonInclude; + +import io.choerodon.mybatis.annotation.ModifyAudit; +import io.choerodon.mybatis.annotation.VersionAudit; +import io.choerodon.mybatis.domain.AuditDomain; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * 应用服务和helm配置的关联关系表(AppServiceHelmRel)实体类 + * + * @author hao.wang@zknow.com + * @since 2022-07-15 10:55:51 + */ + +@ApiModel("应用服务和helm配置的关联关系表") +@VersionAudit +@ModifyAudit +@JsonInclude(value = JsonInclude.Include.NON_NULL) +@Table(name = "devops_app_service_helm_rel") +public class AppServiceHelmRelDTO extends AuditDomain { + private static final long serialVersionUID = 531530280708275480L; + + public static final String FIELD_ID = "id"; + public static final String FIELD_APP_SERVICE_ID = "appServiceId"; + public static final String FIELD_HELM_CONFIG_ID = "helmConfigId"; + + @Id + @GeneratedValue + private Long id; + + @ApiModelProperty(value = "应用服务id,devops_app_service.id", required = true) + @NotNull + private Long appServiceId; + + @ApiModelProperty(value = "配置Id,devops_helm_config.id", required = true) + @NotNull + private Long helmConfigId; + + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getAppServiceId() { + return appServiceId; + } + + public void setAppServiceId(Long appServiceId) { + this.appServiceId = appServiceId; + } + + public Long getHelmConfigId() { + return helmConfigId; + } + + public void setHelmConfigId(Long helmConfigId) { + this.helmConfigId = helmConfigId; + } + +} + diff --git a/src/main/java/io/choerodon/devops/infra/dto/AppServiceHelmVersionDTO.java b/src/main/java/io/choerodon/devops/infra/dto/AppServiceHelmVersionDTO.java new file mode 100644 index 0000000000..f1753c0d7e --- /dev/null +++ b/src/main/java/io/choerodon/devops/infra/dto/AppServiceHelmVersionDTO.java @@ -0,0 +1,153 @@ +package io.choerodon.devops.infra.dto; + +import com.fasterxml.jackson.annotation.JsonInclude; + +import io.choerodon.mybatis.annotation.ModifyAudit; +import io.choerodon.mybatis.annotation.VersionAudit; +import io.choerodon.mybatis.domain.AuditDomain; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * 应用版本表(AppServiceHelmVersion)实体类 + * + * @author hao.wang@zknow.com + * @since 2022-07-13 16:47:41 + */ + +@ApiModel("应用版本表") +@VersionAudit +@ModifyAudit +@JsonInclude(value = JsonInclude.Include.NON_NULL) +@Table(name = "devops_app_service_helm_version") +public class AppServiceHelmVersionDTO extends AuditDomain { + private static final long serialVersionUID = 769273160524234032L; + + public static final String FIELD_ID = "id"; + public static final String FIELD_APP_SERVICE_VERSION_ID = "appServiceVersionId"; + public static final String FIELD_HELM_CONFIG_ID = "helmConfigId"; + public static final String FIELD_HARBOR_REPO_TYPE = "harborRepoType"; + public static final String FIELD_HARBOR_CONFIG_ID = "harborConfigId"; + public static final String FIELD_VALUE_ID = "valueId"; + public static final String FIELD_README_VALUE_ID = "readmeValueId"; + public static final String FIELD_IMAGE = "image"; + public static final String FIELD_REPOSITORY = "repository"; + + @Id + @GeneratedValue + private Long id; + + @ApiModelProperty(value = "应用服务版本,devops_app_service_version.id", required = true) + @NotNull + private Long appServiceVersionId; + + @ApiModelProperty(value = "配置Id", required = true) + @NotNull + private Long helmConfigId; + + @ApiModelProperty(value = "仓库类型(DEFAULT_REPO、CUSTOM_REPO)", required = true) + @NotBlank + private String harborRepoType; + + @ApiModelProperty(value = "配置Id", required = true) + @NotNull + private Long harborConfigId; + + @ApiModelProperty(value = "参数 ID", required = true) + @NotNull + private Long valueId; + + @ApiModelProperty(value = "readme value id", required = true) + @NotNull + private Long readmeValueId; + + @ApiModelProperty(value = "镜像名", required = true) + @NotBlank + private String image; + + @ApiModelProperty(value = "仓库地址", required = true) + @NotBlank + private String repository; + + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getAppServiceVersionId() { + return appServiceVersionId; + } + + public void setAppServiceVersionId(Long appServiceVersionId) { + this.appServiceVersionId = appServiceVersionId; + } + + public Long getHelmConfigId() { + return helmConfigId; + } + + public void setHelmConfigId(Long helmConfigId) { + this.helmConfigId = helmConfigId; + } + + public String getHarborRepoType() { + return harborRepoType; + } + + public void setHarborRepoType(String harborRepoType) { + this.harborRepoType = harborRepoType; + } + + public Long getHarborConfigId() { + return harborConfigId; + } + + public void setHarborConfigId(Long harborConfigId) { + this.harborConfigId = harborConfigId; + } + + public Long getValueId() { + return valueId; + } + + public void setValueId(Long valueId) { + this.valueId = valueId; + } + + public Long getReadmeValueId() { + return readmeValueId; + } + + public void setReadmeValueId(Long readmeValueId) { + this.readmeValueId = readmeValueId; + } + + public String getImage() { + return image; + } + + public void setImage(String image) { + this.image = image; + } + + public String getRepository() { + return repository; + } + + public void setRepository(String repository) { + this.repository = repository; + } + +} + diff --git a/src/main/java/io/choerodon/devops/infra/dto/AppServiceImageVersionDTO.java b/src/main/java/io/choerodon/devops/infra/dto/AppServiceImageVersionDTO.java new file mode 100644 index 0000000000..801d83f46c --- /dev/null +++ b/src/main/java/io/choerodon/devops/infra/dto/AppServiceImageVersionDTO.java @@ -0,0 +1,101 @@ +package io.choerodon.devops.infra.dto; + +import com.fasterxml.jackson.annotation.JsonInclude; + +import io.choerodon.mybatis.annotation.ModifyAudit; +import io.choerodon.mybatis.annotation.VersionAudit; +import io.choerodon.mybatis.domain.AuditDomain; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * 应用版本表(AppServiceImageVersion)实体类 + * + * @author hao.wang@zknow.com + * @since 2022-07-13 16:47:42 + */ + +@ApiModel("应用版本表") +@VersionAudit +@ModifyAudit +@JsonInclude(value = JsonInclude.Include.NON_NULL) +@Table(name = "devops_app_service_image_version") +public class AppServiceImageVersionDTO extends AuditDomain { + private static final long serialVersionUID = 311223429472258678L; + + public static final String FIELD_ID = "id"; + public static final String FIELD_APP_SERVICE_VERSION_ID = "appServiceVersionId"; + public static final String FIELD_HARBOR_REPO_TYPE = "harborRepoType"; + public static final String FIELD_HARBOR_CONFIG_ID = "harborConfigId"; + public static final String FIELD_IMAGE = "image"; + + @Id + @GeneratedValue + private Long id; + + @ApiModelProperty(value = "应用服务版本,devops_app_service_version.id", required = true) + @NotNull + private Long appServiceVersionId; + + @ApiModelProperty(value = "仓库类型(DEFAULT_REPO、CUSTOM_REPO)", required = true) + @NotBlank + private String harborRepoType; + + @ApiModelProperty(value = "配置Id", required = true) + @NotNull + private Long harborConfigId; + + @ApiModelProperty(value = "镜像名", required = true) + @NotBlank + private String image; + + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getAppServiceVersionId() { + return appServiceVersionId; + } + + public void setAppServiceVersionId(Long appServiceVersionId) { + this.appServiceVersionId = appServiceVersionId; + } + + public String getHarborRepoType() { + return harborRepoType; + } + + public void setHarborRepoType(String harborRepoType) { + this.harborRepoType = harborRepoType; + } + + public Long getHarborConfigId() { + return harborConfigId; + } + + public void setHarborConfigId(Long harborConfigId) { + this.harborConfigId = harborConfigId; + } + + public String getImage() { + return image; + } + + public void setImage(String image) { + this.image = image; + } + +} + diff --git a/src/main/java/io/choerodon/devops/infra/dto/AppServiceMavenVersionDTO.java b/src/main/java/io/choerodon/devops/infra/dto/AppServiceMavenVersionDTO.java new file mode 100644 index 0000000000..ae989695b6 --- /dev/null +++ b/src/main/java/io/choerodon/devops/infra/dto/AppServiceMavenVersionDTO.java @@ -0,0 +1,146 @@ +package io.choerodon.devops.infra.dto; + +import com.fasterxml.jackson.annotation.JsonInclude; + +import io.choerodon.mybatis.annotation.ModifyAudit; +import io.choerodon.mybatis.annotation.VersionAudit; +import io.choerodon.mybatis.domain.AuditDomain; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * 应用版本表(AppServiceMavenVersion)实体类 + * + * @author hao.wang@zknow.com + * @since 2022-07-13 16:47:42 + */ + +@ApiModel("应用版本表") +@VersionAudit +@ModifyAudit +@JsonInclude(value = JsonInclude.Include.NON_NULL) +@Table(name = "devops_app_service_maven_version") +public class AppServiceMavenVersionDTO extends AuditDomain { + private static final long serialVersionUID = 801548481676256212L; + + public static final String FIELD_ID = "id"; + public static final String FIELD_APP_SERVICE_VERSION_ID = "appServiceVersionId"; + public static final String FIELD_GROUP_ID = "groupId"; + public static final String FIELD_ARTIFACT_ID = "artifactId"; + public static final String FIELD_VERSION = "version"; + public static final String FIELD_NEXUS_REPO_ID = "nexusRepoId"; + public static final String FIELD_MAVEN_REPO_URL = "mavenRepoUrl"; + public static final String FIELD_USERNAME = "username"; + public static final String FIELD_PASSWORD = "password"; + + @Id + @GeneratedValue + private Long id; + + @ApiModelProperty(value = "应用服务版本,devops_app_service_version.id", required = true) + @NotNull + private Long appServiceVersionId; + + @ApiModelProperty(value = "groupId", required = true) + @NotBlank + private String groupId; + + @ApiModelProperty(value = "artifactId", required = true) + @NotBlank + private String artifactId; + + @ApiModelProperty(value = "版本", required = true) + @NotBlank + private String version; + + @ApiModelProperty(value = "nexus仓库id,hrds_prod_repo.rdupm_nexus_repository.repository_id") + private Long nexusRepoId; + + private String mavenRepoUrl; + + private String username; + + private String password; + + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getAppServiceVersionId() { + return appServiceVersionId; + } + + public void setAppServiceVersionId(Long appServiceVersionId) { + this.appServiceVersionId = appServiceVersionId; + } + + public String getGroupId() { + return groupId; + } + + public void setGroupId(String groupId) { + this.groupId = groupId; + } + + public String getArtifactId() { + return artifactId; + } + + public void setArtifactId(String artifactId) { + this.artifactId = artifactId; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public Long getNexusRepoId() { + return nexusRepoId; + } + + public void setNexusRepoId(Long nexusRepoId) { + this.nexusRepoId = nexusRepoId; + } + + public String getMavenRepoUrl() { + return mavenRepoUrl; + } + + public void setMavenRepoUrl(String mavenRepoUrl) { + this.mavenRepoUrl = mavenRepoUrl; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + +} + diff --git a/src/main/java/io/choerodon/devops/infra/dto/AppServiceVersionDTO.java b/src/main/java/io/choerodon/devops/infra/dto/AppServiceVersionDTO.java index 3e70d6d35d..71611189ad 100644 --- a/src/main/java/io/choerodon/devops/infra/dto/AppServiceVersionDTO.java +++ b/src/main/java/io/choerodon/devops/infra/dto/AppServiceVersionDTO.java @@ -28,26 +28,8 @@ public class AppServiceVersionDTO extends AuditDomain { @Encrypt @ApiModelProperty("版本关联的应用服务id") private Long appServiceId; - @Encrypt - @ApiModelProperty("版本关联的valuesId") - private Long valueId; - @Encrypt - @ApiModelProperty("版本关联的READMEId") - private Long readmeValueId; - @ApiModelProperty("版本关联的harbor镜像地址") - private String image; @ApiModelProperty("版本关联的Gitlab commit sha") private String commit; - @ApiModelProperty("版本关联的chart仓库地址") - private String repository; - @Encrypt - @ApiModelProperty("版本关联的harbor仓库id") - private Long harborConfigId; - @Encrypt - @ApiModelProperty("版本关联的helm仓库id") - private Long helmConfigId; - @ApiModelProperty("版本关联的harbor仓库类型") - private String repoType; @ApiModelProperty("版本关联的分支") private String ref; @@ -77,6 +59,33 @@ public class AppServiceVersionDTO extends AuditDomain { private Long projectId; + @Encrypt + @Transient + @ApiModelProperty("版本关联的valuesId") + private Long valueId; + @Encrypt + @Transient + @ApiModelProperty("版本关联的READMEId") + private Long readmeValueId; + @ApiModelProperty("版本关联的harbor镜像地址") + @Transient + private String image; + @ApiModelProperty("版本关联的chart仓库地址") + @Transient + private String repository; + @Encrypt + @ApiModelProperty("版本关联的harbor仓库id") + @Transient + private Long harborConfigId; + @Encrypt + @ApiModelProperty("版本关联的helm仓库id") + @Transient + private Long helmConfigId; + @ApiModelProperty("版本关联的harbor仓库类型") + @Transient + private String repoType; + + public String getChartName() { return chartName; } diff --git a/src/main/java/io/choerodon/devops/infra/dto/CertificationDTO.java b/src/main/java/io/choerodon/devops/infra/dto/CertificationDTO.java index 0dcc5fb48b..17a7a78fe8 100644 --- a/src/main/java/io/choerodon/devops/infra/dto/CertificationDTO.java +++ b/src/main/java/io/choerodon/devops/infra/dto/CertificationDTO.java @@ -5,7 +5,6 @@ import io.swagger.annotations.ApiModelProperty; -import io.choerodon.devops.api.vo.kubernetes.C7nCertification; import io.choerodon.mybatis.annotation.ModifyAudit; import io.choerodon.mybatis.annotation.VersionAudit; import io.choerodon.mybatis.domain.AuditDomain; diff --git a/src/main/java/io/choerodon/devops/infra/dto/CiDockerAuthConfigDTO.java b/src/main/java/io/choerodon/devops/infra/dto/CiDockerAuthConfigDTO.java index 2c30d811f1..6ae1dfd15f 100644 --- a/src/main/java/io/choerodon/devops/infra/dto/CiDockerAuthConfigDTO.java +++ b/src/main/java/io/choerodon/devops/infra/dto/CiDockerAuthConfigDTO.java @@ -30,8 +30,6 @@ public class CiDockerAuthConfigDTO extends AuditDomain { public static final String FIELD_ID = "id"; public static final String FIELD_DEVOPS_PIPELINE_ID = "devopsPipelineId"; public static final String FIELD_DOMAIN = "domain"; - public static final String FIELD_USERNAME = "username"; - public static final String FIELD_PASSWORD = "password"; private static final long serialVersionUID = 989629751337871365L; @Id @GeneratedValue diff --git a/src/main/java/io/choerodon/devops/infra/dto/CiPipelineAppVersionDTO.java b/src/main/java/io/choerodon/devops/infra/dto/CiPipelineAppVersionDTO.java new file mode 100644 index 0000000000..eaa2673799 --- /dev/null +++ b/src/main/java/io/choerodon/devops/infra/dto/CiPipelineAppVersionDTO.java @@ -0,0 +1,110 @@ +package io.choerodon.devops.infra.dto; + +import com.fasterxml.jackson.annotation.JsonInclude; + +import io.choerodon.mybatis.annotation.ModifyAudit; +import io.choerodon.mybatis.annotation.VersionAudit; +import io.choerodon.mybatis.domain.AuditDomain; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * 发布应用服务版本步骤生成的流水线记录信息(CiPipelineAppVersion)实体类 + * + * @author hao.wang@zknow.com + * @since 2022-07-14 16:01:29 + */ + +@ApiModel("发布应用服务版本步骤生成的流水线记录信息") +@VersionAudit +@ModifyAudit +@JsonInclude(value = JsonInclude.Include.NON_NULL) +@Table(name = "devops_ci_pipeline_app_version") +public class CiPipelineAppVersionDTO extends AuditDomain { + private static final long serialVersionUID = -24864468876350576L; + + public static final String FIELD_ID = "id"; + public static final String FIELD_APP_SERVICE_ID = "appServiceId"; + public static final String FIELD_GITLAB_PIPELINE_ID = "gitlabPipelineId"; + public static final String FIELD_JOB_NAME = "jobName"; + public static final String FIELD_APP_SERVICE_VERSION_ID = "appServiceVersionId"; + + @Id + @GeneratedValue + private Long id; + + @ApiModelProperty(value = "应用服务id", required = true) + @NotNull + private Long appServiceId; + + @ApiModelProperty(value = "gitlabPipelineId", required = true) + @NotNull + private Long gitlabPipelineId; + + @ApiModelProperty(value = "任务名称", required = true) + @NotBlank + private String jobName; + + @ApiModelProperty(value = "关联应用服务版本id,devops_app_service_version.id", required = true) + @NotNull + private Long appServiceVersionId; + + public CiPipelineAppVersionDTO() { + } + + public CiPipelineAppVersionDTO(@NotNull Long appServiceId, @NotNull Long gitlabPipelineId, @NotBlank String jobName, @NotNull Long appServiceVersionId) { + this.appServiceId = appServiceId; + this.gitlabPipelineId = gitlabPipelineId; + this.jobName = jobName; + this.appServiceVersionId = appServiceVersionId; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getAppServiceId() { + return appServiceId; + } + + public void setAppServiceId(Long appServiceId) { + this.appServiceId = appServiceId; + } + + public Long getGitlabPipelineId() { + return gitlabPipelineId; + } + + public void setGitlabPipelineId(Long gitlabPipelineId) { + this.gitlabPipelineId = gitlabPipelineId; + } + + public String getJobName() { + return jobName; + } + + public void setJobName(String jobName) { + this.jobName = jobName; + } + + public Long getAppServiceVersionId() { + return appServiceVersionId; + } + + public void setAppServiceVersionId(Long appServiceVersionId) { + this.appServiceVersionId = appServiceVersionId; + } + +} + diff --git a/src/main/java/io/choerodon/devops/infra/dto/CiPipelineImageDTO.java b/src/main/java/io/choerodon/devops/infra/dto/CiPipelineImageDTO.java index 87289464f0..743de1c335 100644 --- a/src/main/java/io/choerodon/devops/infra/dto/CiPipelineImageDTO.java +++ b/src/main/java/io/choerodon/devops/infra/dto/CiPipelineImageDTO.java @@ -33,9 +33,6 @@ public class CiPipelineImageDTO extends AuditDomain { private Long harborRepoId; private String repoType; - public CiPipelineImageDTO() { - } - public Long getAppServiceId() { return appServiceId; } diff --git a/src/main/java/io/choerodon/devops/infra/dto/CiTemplateSonarDTO.java b/src/main/java/io/choerodon/devops/infra/dto/CiTemplateSonarDTO.java index 2a210e263a..083cb2dd17 100644 --- a/src/main/java/io/choerodon/devops/infra/dto/CiTemplateSonarDTO.java +++ b/src/main/java/io/choerodon/devops/infra/dto/CiTemplateSonarDTO.java @@ -35,8 +35,6 @@ public class CiTemplateSonarDTO extends AuditDomain { public static final String FIELD_SOURCES = "sources"; public static final String FIELD_SONAR_URL = "sonarUrl"; public static final String FIELD_AUTH_TYPE = "authType"; - public static final String FIELD_USERNAME = "username"; - public static final String FIELD_PASSWORD = "password"; public static final String FIELD_TOKEN = "token"; @Id diff --git a/src/main/java/io/choerodon/devops/infra/dto/DevopsAppServiceHelmRelDTO.java b/src/main/java/io/choerodon/devops/infra/dto/DevopsAppServiceHelmRelDTO.java new file mode 100644 index 0000000000..91b0e11031 --- /dev/null +++ b/src/main/java/io/choerodon/devops/infra/dto/DevopsAppServiceHelmRelDTO.java @@ -0,0 +1,51 @@ +package io.choerodon.devops.infra.dto; + +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; + +import io.swagger.annotations.ApiModelProperty; +import org.hzero.starter.keyencrypt.core.Encrypt; + +import io.choerodon.mybatis.annotation.ModifyAudit; +import io.choerodon.mybatis.annotation.VersionAudit; +import io.choerodon.mybatis.domain.AuditDomain; + +@Table(name = "devops_app_service_helm_rel") +@ModifyAudit +@VersionAudit +public class DevopsAppServiceHelmRelDTO extends AuditDomain { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @Encrypt + private Long id; + @ApiModelProperty("应用服务id") + private Long appServiceId; + @ApiModelProperty("helm仓库id") + private Long helmConfigId; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getAppServiceId() { + return appServiceId; + } + + public void setAppServiceId(Long appServiceId) { + this.appServiceId = appServiceId; + } + + public Long getHelmConfigId() { + return helmConfigId; + } + + public void setHelmConfigId(Long helmConfigId) { + this.helmConfigId = helmConfigId; + } +} diff --git a/src/main/java/io/choerodon/devops/infra/dto/DevopsEnvAppServiceDTO.java b/src/main/java/io/choerodon/devops/infra/dto/DevopsEnvAppServiceDTO.java index c96f8874a7..b7e85c5be7 100644 --- a/src/main/java/io/choerodon/devops/infra/dto/DevopsEnvAppServiceDTO.java +++ b/src/main/java/io/choerodon/devops/infra/dto/DevopsEnvAppServiceDTO.java @@ -1,6 +1,5 @@ package io.choerodon.devops.infra.dto; -import io.swagger.annotations.ApiModelProperty; import java.util.Objects; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; diff --git a/src/main/java/io/choerodon/devops/infra/dto/DevopsHelmConfigDTO.java b/src/main/java/io/choerodon/devops/infra/dto/DevopsHelmConfigDTO.java new file mode 100644 index 0000000000..27bb661f4b --- /dev/null +++ b/src/main/java/io/choerodon/devops/infra/dto/DevopsHelmConfigDTO.java @@ -0,0 +1,128 @@ +package io.choerodon.devops.infra.dto; + +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; + +import io.swagger.annotations.ApiModelProperty; + +import io.choerodon.mybatis.annotation.ModifyAudit; +import io.choerodon.mybatis.annotation.VersionAudit; +import io.choerodon.mybatis.domain.AuditDomain; + +@Table(name = "devops_helm_config") +@ModifyAudit +@VersionAudit +public class DevopsHelmConfigDTO extends AuditDomain { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + @ApiModelProperty("仓库名称") + private String name; + + @ApiModelProperty("helm仓库地址 平台层或组织层为仓库地址前缀部分 项目层是完整的仓库地址") + private String url; + + @ApiModelProperty("仓库账号") + private String username; + + @ApiModelProperty("仓库密码") + private String password; + + @ApiModelProperty("关联该配置的层级 project/organization/side") + private String resourceType; + + @ApiModelProperty("关联该仓库配置的资源id, 项目id 组织id 平台层为0") + private Long resourceId; + + @ApiModelProperty("仓库是否私有") + private Boolean repoPrivate; + + @ApiModelProperty("是否为默认仓库") + private Boolean repoDefault; + + @ApiModelProperty("软删除 0未删除 1已删除") + private Boolean deleted; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public Long getResourceId() { + return resourceId; + } + + public void setResourceId(Long resourceId) { + this.resourceId = resourceId; + } + + public Boolean getRepoPrivate() { + return repoPrivate; + } + + public void setRepoPrivate(Boolean repoPrivate) { + this.repoPrivate = repoPrivate; + } + + public Boolean getRepoDefault() { + return repoDefault; + } + + public void setRepoDefault(Boolean repoDefault) { + this.repoDefault = repoDefault; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public Boolean getDeleted() { + return deleted; + } + + public void setDeleted(Boolean deleted) { + this.deleted = deleted; + } +} diff --git a/src/main/java/io/choerodon/devops/infra/dto/DevopsServiceDTO.java b/src/main/java/io/choerodon/devops/infra/dto/DevopsServiceDTO.java index ac514db4e8..2eeab150f2 100644 --- a/src/main/java/io/choerodon/devops/infra/dto/DevopsServiceDTO.java +++ b/src/main/java/io/choerodon/devops/infra/dto/DevopsServiceDTO.java @@ -32,6 +32,7 @@ public class DevopsServiceDTO extends AuditDomain { private String ports; private String endPoints; private String type; + private String clusterIp; private String externalIp; private String selectors; private String annotations; @@ -49,6 +50,14 @@ public class DevopsServiceDTO extends AuditDomain { @ApiModelProperty("目标对象是部署组时,部署组的id") private Long targetDeploymentId; + public String getClusterIp() { + return clusterIp; + } + + public void setClusterIp(String clusterIp) { + this.clusterIp = clusterIp; + } + public Long getInstanceId() { return instanceId; } diff --git a/src/main/java/io/choerodon/devops/infra/dto/DevopsServiceQueryDTO.java b/src/main/java/io/choerodon/devops/infra/dto/DevopsServiceQueryDTO.java index fe676b0a6b..211dc27ccf 100644 --- a/src/main/java/io/choerodon/devops/infra/dto/DevopsServiceQueryDTO.java +++ b/src/main/java/io/choerodon/devops/infra/dto/DevopsServiceQueryDTO.java @@ -12,6 +12,7 @@ public class DevopsServiceQueryDTO extends AuditDomain { private Long id; private String name; private String externalIp; + private String clusterIp; private String ports; private String status; private Long envId; @@ -67,6 +68,14 @@ public void setExternalIp(String externalIp) { this.externalIp = externalIp; } + public String getClusterIp() { + return clusterIp; + } + + public void setClusterIp(String clusterIp) { + this.clusterIp = clusterIp; + } + public String getPorts() { return ports; } diff --git a/src/main/java/io/choerodon/devops/infra/dto/gitlab/GroupDTO.java b/src/main/java/io/choerodon/devops/infra/dto/gitlab/GroupDTO.java index 002b0acf9d..65d1babdfa 100644 --- a/src/main/java/io/choerodon/devops/infra/dto/gitlab/GroupDTO.java +++ b/src/main/java/io/choerodon/devops/infra/dto/gitlab/GroupDTO.java @@ -19,10 +19,28 @@ public class GroupDTO { private Boolean requestAccessEnabled; private Integer parentId; private Integer sharedRunnersMinutesLimit; + private String fullName; + private String fullPath; private GroupStatistics statistics; + public String getFullName() { + return fullName; + } + + public void setFullName(String fullName) { + this.fullName = fullName; + } + + public String getFullPath() { + return fullPath; + } + + public void setFullPath(String fullPath) { + this.fullPath = fullPath; + } + public GroupStatistics getStatistics() { return statistics; } diff --git a/src/main/java/io/choerodon/devops/infra/dto/iam/ProjectDTO.java b/src/main/java/io/choerodon/devops/infra/dto/iam/ProjectDTO.java index d43e38f814..e20e79634a 100644 --- a/src/main/java/io/choerodon/devops/infra/dto/iam/ProjectDTO.java +++ b/src/main/java/io/choerodon/devops/infra/dto/iam/ProjectDTO.java @@ -39,6 +39,9 @@ public class ProjectDTO extends AuditDomain { @ApiModelProperty(value = "项目类型(遗留旧字段,一对一):AGILE(敏捷项目),PROGRAM(普通项目组),ANALYTICAL(分析型项目群)") private String category; + @ApiModelProperty("devops基础组件中使用的编码,harbor、gitlab、sonar、chartmuserm") + private String devopsComponentCode; + @ApiModelProperty(value = "项目类型") private List categoryIds; @@ -55,6 +58,14 @@ public class ProjectDTO extends AuditDomain { private String applicationCode; private String programName; + public String getDevopsComponentCode() { + return devopsComponentCode; + } + + public void setDevopsComponentCode(String devopsComponentCode) { + this.devopsComponentCode = devopsComponentCode; + } + public Long getAppServiceId() { return appServiceId; } diff --git a/src/main/java/io/choerodon/devops/infra/enums/AppServiceEvent.java b/src/main/java/io/choerodon/devops/infra/enums/AppServiceEvent.java index 852cd6491f..f24586b625 100644 --- a/src/main/java/io/choerodon/devops/infra/enums/AppServiceEvent.java +++ b/src/main/java/io/choerodon/devops/infra/enums/AppServiceEvent.java @@ -22,6 +22,11 @@ public enum AppServiceEvent { */ BRANCH_DELETE(20), + /** + * 分支同步 + */ + BRANCH_SYNC(30), + /** * 标记List */ diff --git a/src/main/java/io/choerodon/devops/infra/enums/CiTriggerType.java b/src/main/java/io/choerodon/devops/infra/enums/CiTriggerType.java index 117974ae3f..92e6ddba21 100644 --- a/src/main/java/io/choerodon/devops/infra/enums/CiTriggerType.java +++ b/src/main/java/io/choerodon/devops/infra/enums/CiTriggerType.java @@ -28,7 +28,7 @@ public String value() { @Nullable public static CiTriggerType forValue(String value) { - if (!StringUtils.isEmpty(value)) { + if (StringUtils.hasText(value)) { for (CiTriggerType type : values()) { if (type.value.equals(value)) { return type; diff --git a/src/main/java/io/choerodon/devops/infra/enums/DevopsCiStepTypeEnum.java b/src/main/java/io/choerodon/devops/infra/enums/DevopsCiStepTypeEnum.java index 9818cb8fdc..bfcbd124a6 100644 --- a/src/main/java/io/choerodon/devops/infra/enums/DevopsCiStepTypeEnum.java +++ b/src/main/java/io/choerodon/devops/infra/enums/DevopsCiStepTypeEnum.java @@ -78,7 +78,12 @@ public enum DevopsCiStepTypeEnum { /** * 自定义任务 */ - CUSTOM("custom"); + CUSTOM("custom"), + + /** + * 发布应用服务版本 + */ + PUBLISH_APP_VERSION("publish_app_version"); private String value; diff --git a/src/main/java/io/choerodon/devops/infra/feign/BaseServiceClient.java b/src/main/java/io/choerodon/devops/infra/feign/BaseServiceClient.java index f15c528c49..c4386f6383 100644 --- a/src/main/java/io/choerodon/devops/infra/feign/BaseServiceClient.java +++ b/src/main/java/io/choerodon/devops/infra/feign/BaseServiceClient.java @@ -1,26 +1,23 @@ package io.choerodon.devops.infra.feign; -import io.swagger.annotations.ApiParam; import java.util.List; import java.util.Map; import java.util.Set; import javax.validation.Valid; import io.swagger.annotations.ApiOperation; -import org.hzero.starter.keyencrypt.core.Encrypt; +import io.swagger.annotations.ApiParam; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import io.choerodon.core.domain.Page; -import io.choerodon.core.iam.ResourceLevel; import io.choerodon.devops.api.vo.ExternalTenantVO; import io.choerodon.devops.api.vo.OrgAdministratorVO; import io.choerodon.devops.api.vo.ResourceLimitVO; import io.choerodon.devops.api.vo.RoleAssignmentSearchVO; import io.choerodon.devops.infra.dto.iam.*; import io.choerodon.devops.infra.feign.fallback.BaseServiceClientFallback; -import io.choerodon.swagger.annotation.Permission; /** * Created by younger on 2018/3/29. @@ -36,7 +33,9 @@ public interface BaseServiceClient { ResponseEntity queryIamProject(@PathVariable("projectId") Long projectId, @RequestParam(value = "with_category_info") Boolean withCategoryInfo, @RequestParam(value = "with_user_info") Boolean withUserInfo, - @RequestParam(value = "with_agile_info") Boolean withAgileInfo); + @RequestParam(value = "with_agile_info") Boolean withAgileInfo, + @RequestParam(value = "with_work_group") Boolean withWorkGroup, + @RequestParam(value = "with_project_classfication") Boolean withProjectClassfication); /** * @param organizationId 组织id diff --git a/src/main/java/io/choerodon/devops/infra/feign/ChartClient.java b/src/main/java/io/choerodon/devops/infra/feign/ChartClient.java index 81501af782..6933f2deb2 100644 --- a/src/main/java/io/choerodon/devops/infra/feign/ChartClient.java +++ b/src/main/java/io/choerodon/devops/infra/feign/ChartClient.java @@ -15,6 +15,7 @@ public interface ChartClient { /** * 用于获取ChartMuseum首页以校验用户名密码的正确性 + * * @return 首页的html内容 */ @GET("/") @@ -38,4 +39,8 @@ Call getChartVersion(@Path("orgCode") String orgCode, @Path("proCode") String proCode, @Path("chartName") String chartName, @Path("chartVersion") String chartVersion); + + @GET("{orgCode}/{proCode}/index.yaml") + Call getIndex(@Path("orgCode") String orgCode, + @Path("proCode") String proCode); } diff --git a/src/main/java/io/choerodon/devops/infra/feign/GitlabServiceClient.java b/src/main/java/io/choerodon/devops/infra/feign/GitlabServiceClient.java index 70801e94d9..19cf987437 100644 --- a/src/main/java/io/choerodon/devops/infra/feign/GitlabServiceClient.java +++ b/src/main/java/io/choerodon/devops/infra/feign/GitlabServiceClient.java @@ -154,6 +154,17 @@ ResponseEntity revokeImpersonationToken(@PathVariable("userId") Integer us ResponseEntity queryGroupByName(@PathVariable("groupName") String groupName, @RequestParam(value = "userId") Integer userId); + /** + * 根据组的path查询组 + * + * @param groupIid 组的id + * @param userId 用户id + * @return 组 + */ + @GetMapping(value = "/v1/groups/query_by_id/{group_iid}") + ResponseEntity queryGroupByIid(@PathVariable("group_iid") Integer groupIid, + @RequestParam(value = "userId") Integer userId); + @PostMapping(value = "/v1/projects/{projectId}/repository/file") ResponseEntity createFile(@PathVariable("projectId") Integer projectId, @RequestBody FileCreationVO fileCreationVO, @@ -543,6 +554,12 @@ ResponseEntity deleteProjectMember(@PathVariable("projectId") Integer projectId, @GetMapping("/v1/projects/{project_id}/members/list") ResponseEntity> listMemberByProject(@PathVariable(value = "project_id") Integer projectId); + @GetMapping(value = "/v1/projects/{project_id}/all_members/list") + ResponseEntity> getAllMemberByProjectIdAndQuery( + @ApiParam(value = "项目id", required = true) + @PathVariable(value = "project_id") Integer projectId, + @RequestParam(value = "query") String query); + @GetMapping("/v1/projects/{user_id}/projects") ResponseEntity> listProjectByUser(@PathVariable(value = "user_id") Integer id); @@ -842,7 +859,8 @@ ResponseEntity> listProjects( @RequestParam(value = "owned", required = false) Boolean owned, @RequestParam(value = "search", required = false) String search, @RequestParam(value = "page", required = false) Integer page, - @RequestParam(value = "perPage", required = false) Integer perPage); + @RequestParam(value = "perPage", required = false) Integer perPage, + @RequestParam(value = "minAccessLevel", required = false) Integer minAccessLevel); @ApiParam(value = "迁移应用服务") @PutMapping(value = "/v1/projects/{projectId}/transfer") @@ -892,7 +910,7 @@ ResponseEntity> queryGroupWithStatisticsByName( @PostMapping(value = "/v1/projects/{project_id}/pipeline_schedules") ResponseEntity createPipelineSchedule( @PathVariable("project_id") Integer projectId, - @RequestParam(name = "user_id",required = false) Integer userId, + @RequestParam(name = "user_id", required = false) Integer userId, @RequestParam(value = "gitlabUrl") String gitlabUrl, @RequestParam(value = "authType") String authType, @RequestParam(value = "accessToken") String accessToken, @@ -953,7 +971,7 @@ ResponseEntity queryPipelineSchedule( @GetMapping(value = "/v1/projects/{project_id}/pipeline_schedules") ResponseEntity> listPipelineSchedules( @PathVariable("project_id") Integer projectId, - @RequestParam(name = "user_id",required = false) Integer userId, + @RequestParam(name = "user_id", required = false) Integer userId, @RequestParam(value = "gitlabUrl") String gitlabUrl, @RequestParam(value = "authType") String authType, @RequestParam(value = "accessToken") String accessToken, @@ -971,6 +989,7 @@ ResponseEntity updatePipelineSchedule( @RequestParam(value = "username") String username, @RequestParam(value = "password") String password, @RequestBody PipelineSchedule pipelineSchedule); + @DeleteMapping(value = "/v1/projects/{project_id}/pipeline_schedules/{pipeline_schedule_id}") ResponseEntity deletePipelineSchedule( @PathVariable("project_id") Integer projectId, @@ -982,4 +1001,8 @@ ResponseEntity deletePipelineSchedule( @RequestParam(value = "username") String username, @RequestParam(value = "password") String password); + + @GetMapping(value = "/v1/users/list_admin_users") + ResponseEntity> listAdminUsers(); + } diff --git a/src/main/java/io/choerodon/devops/infra/feign/fallback/BaseServiceClientFallback.java b/src/main/java/io/choerodon/devops/infra/feign/fallback/BaseServiceClientFallback.java index 00092afdde..ef753d4f7c 100644 --- a/src/main/java/io/choerodon/devops/infra/feign/fallback/BaseServiceClientFallback.java +++ b/src/main/java/io/choerodon/devops/infra/feign/fallback/BaseServiceClientFallback.java @@ -32,7 +32,7 @@ public ResponseEntity immutableProjectInfoById(Long id) { } @Override - public ResponseEntity queryIamProject(Long projectId, Boolean withCategoryInfo, Boolean withUserInfo, Boolean withAgileInfo) { + public ResponseEntity queryIamProject(Long projectId, Boolean withCategoryInfo, Boolean withUserInfo, Boolean withAgileInfo,Boolean withWorkGroup,Boolean withProjectClassfication) { throw new CommonException(ERROR_PROJECT_QUERY_BY_ID, projectId); } diff --git a/src/main/java/io/choerodon/devops/infra/feign/fallback/GitlabServiceClientFallback.java b/src/main/java/io/choerodon/devops/infra/feign/fallback/GitlabServiceClientFallback.java index 2bf8add674..2c6014f0d3 100644 --- a/src/main/java/io/choerodon/devops/infra/feign/fallback/GitlabServiceClientFallback.java +++ b/src/main/java/io/choerodon/devops/infra/feign/fallback/GitlabServiceClientFallback.java @@ -34,6 +34,7 @@ public ResponseEntity createFile(Integer projectId, FileCreat public ResponseEntity updateFile(Integer projectId, FileCreationVO fileCreationVO, String gitlabUrl, String authType, String accessToken, String username, String password) { throw new CommonException("error.file.update"); } + @Override public ResponseEntity deleteFile(Integer projectId, FileCreationVO fileCreationVO, String gitlabUrl, String authType, String accessToken, String username, String password) { throw new CommonException("error.file.delete"); @@ -206,6 +207,11 @@ public ResponseEntity queryGroupByName(String groupName, Integer userI throw new CommonException("error.group.get"); } + @Override + public ResponseEntity queryGroupByIid(Integer groupIid, Integer userId) { + throw new CommonException("error.group.get"); + } + @Override public ResponseEntity getFile(Integer projectId, String commit, String filePath) { throw new CommonException("error.file.get"); @@ -421,6 +427,11 @@ public ResponseEntity> listMemberByProject(Integer projectId) { return null; } + @Override + public ResponseEntity> getAllMemberByProjectIdAndQuery(Integer projectId, String query) { + throw new CommonException("error.query.project.members"); + } + @Override public ResponseEntity> listProjectByUser(Integer id) { return null; @@ -547,7 +558,7 @@ public ResponseEntity> listGroupsWithParam(Integer userId, Boolea } @Override - public ResponseEntity> listProjects(Integer groupId, Integer userId, Boolean owned, String search, Integer page, Integer perPage) { + public ResponseEntity> listProjects(Integer groupId, Integer userId, Boolean owned, String search, Integer page, Integer perPage, Integer minAccessLevel) { throw new CommonException("error.query.group.project"); } @@ -616,4 +627,9 @@ public ResponseEntity updatePipelineSchedule(Integer projectId, Integer us public ResponseEntity deletePipelineSchedule(Integer projectId, Integer userId, Integer pipelineScheduleId, String gitlabUrl, String authType, String accessToken, String username, String password) { throw new CommonException("error.delete.Pipeline.Schedule"); } + + @Override + public ResponseEntity> listAdminUsers() { + throw new CommonException("error.list.admin.users"); + } } diff --git a/src/main/java/io/choerodon/devops/infra/feign/operator/BaseServiceClientOperator.java b/src/main/java/io/choerodon/devops/infra/feign/operator/BaseServiceClientOperator.java index 877d8a59ec..487a38d5b6 100644 --- a/src/main/java/io/choerodon/devops/infra/feign/operator/BaseServiceClientOperator.java +++ b/src/main/java/io/choerodon/devops/infra/feign/operator/BaseServiceClientOperator.java @@ -71,8 +71,7 @@ public List querySaasTenants(List saasLevels) { if (responseEntity == null || CollectionUtils.isEmpty(responseEntity.getBody())) { return Collections.emptyList(); } else { - List externalTenantVOS = responseEntity.getBody(); - return externalTenantVOS; + return responseEntity.getBody(); } } @@ -81,22 +80,21 @@ public List queryRegisterTenant() { if (responseEntity == null || CollectionUtils.isEmpty(responseEntity.getBody())) { return Collections.emptyList(); } else { - List externalTenantVOS = responseEntity.getBody(); - return externalTenantVOS; + return responseEntity.getBody(); } } public ProjectDTO queryIamProjectById(Long projectId) { - return queryIamProjectById(projectId, true, true, true); + return queryIamProjectById(projectId, true, true, true, true, true); } public ProjectDTO queryIamProjectBasicInfoById(Long projectId) { - return queryIamProjectById(projectId, false, false, false); + return queryIamProjectById(projectId, false, false, false, false, false); } - public ProjectDTO queryIamProjectById(Long projectId, Boolean withCategory, Boolean withUserInfo, Boolean withAgileInfo) { - ResponseEntity projectDTOResponseEntity = baseServiceClient.queryIamProject(Objects.requireNonNull(projectId), withCategory, withUserInfo, withAgileInfo); + public ProjectDTO queryIamProjectById(Long projectId, Boolean withCategory, Boolean withUserInfo, Boolean withAgileInfo, Boolean withWorkGroup, Boolean withProjectClassfication) { + ResponseEntity projectDTOResponseEntity = baseServiceClient.queryIamProject(Objects.requireNonNull(projectId), withCategory, withUserInfo, withAgileInfo, withWorkGroup, withProjectClassfication); ProjectDTO projectDTO = projectDTOResponseEntity.getBody(); // 判断id是否为空是因为可能会返回 CommonException 但是也会被反序列化为 ProjectDTO if (projectDTO == null || projectDTO.getId() == null) { @@ -397,7 +395,7 @@ public List getAllMember(Long projectId, String params) { Map searchParamMap; List paramList; // 处理搜索参数 - if (!StringUtils.isEmpty(params)) { + if (StringUtils.hasText(params)) { Map maps = gson.fromJson(params, Map.class); searchParamMap = TypeUtil.cast(maps.get(TypeUtil.SEARCH_PARAM)); paramList = TypeUtil.cast(maps.get(TypeUtil.PARAMS)); @@ -700,7 +698,7 @@ public ExternalTenantVO queryTenantByIdWithExternalInfo(Long organizationId) { public List listCustomGitlabOwnerLabelUser(Long projectId, String roleLabel) { ResponseEntity> responseEntity = baseServiceClient.listProjectUsersByProjectIdAndRoleLabel(projectId, roleLabel); if (responseEntity == null || responseEntity.getBody() == null) { - return Collections.EMPTY_LIST; + return Collections.emptyList(); } else { return responseEntity.getBody(); } diff --git a/src/main/java/io/choerodon/devops/infra/feign/operator/GitlabServiceClientOperator.java b/src/main/java/io/choerodon/devops/infra/feign/operator/GitlabServiceClientOperator.java index 5a16527bda..a83efdb0cc 100644 --- a/src/main/java/io/choerodon/devops/infra/feign/operator/GitlabServiceClientOperator.java +++ b/src/main/java/io/choerodon/devops/infra/feign/operator/GitlabServiceClientOperator.java @@ -256,6 +256,21 @@ public String createProjectToken(Integer gitlabProjectId, Integer userId, String return impersonationToken.getBody().getToken(); } + /** + * 创建用户的模拟token + * + * @param userId + * @param name + * @return + */ + public String createImpersonationToken(Integer userId, String name) { + ResponseEntity impersonationToken = gitlabServiceClient.createProjectToken(userId, name, null); + if (impersonationToken.getBody() == null) { + throw new CommonException("error.create.project.token"); + } + return impersonationToken.getBody().getToken(); + } + /** * 从gitlab项目创建access token * @@ -1233,6 +1248,14 @@ public List listMemberByProject(Integer projectId) { } } + public List listMemberByProject(Integer projectId, String query) { + try { + return gitlabServiceClient.getAllMemberByProjectIdAndQuery(projectId, query).getBody(); + } catch (Exception e) { + throw new CommonException(e); + } + } + public String getAdminToken() { try { return gitlabServiceClient.getAdminToken().getBody(); @@ -1568,8 +1591,9 @@ public List listProject(Integer groupId, Boolean owned, String search, Integer page, - Integer perPage) { - return gitlabServiceClient.listProjects(groupId, userId, owned, search, page, perPage).getBody(); + Integer perPage, + Integer minAccessLevel) { + return gitlabServiceClient.listProjects(groupId, userId, owned, search, page, perPage, minAccessLevel).getBody(); } public GitlabProjectDTO transferProject(Integer gitlabProjectId, Integer gitlabGroupId, Integer userId) { @@ -1783,10 +1807,10 @@ public PipelineSchedule queryPipelineSchedule(Integer projectId, } public void updatePipelineSchedule(Integer projectId, - Integer userId, - Integer pipelineScheduleId, - AppExternalConfigDTO appExternalConfigDTO, - PipelineSchedule pipelineSchedule) { + Integer userId, + Integer pipelineScheduleId, + AppExternalConfigDTO appExternalConfigDTO, + PipelineSchedule pipelineSchedule) { if (appExternalConfigDTO == null) { gitlabServiceClient.updatePipelineSchedule(projectId, userId, @@ -1841,4 +1865,22 @@ public void deletePipelineSchedule(Integer projectId, } } + public List listAdminUsers() { + return gitlabServiceClient.listAdminUsers().getBody(); + } + + public GroupDTO queryGroupByIid(Integer groupIid, Integer userId) { + ResponseEntity groupDTOResponseEntity; + try { + groupDTOResponseEntity = gitlabServiceClient.queryGroupByIid(groupIid, userId); + } catch (Exception e) { + throw new CommonException(e); + } + if (groupDTOResponseEntity != null) { + return groupDTOResponseEntity.getBody(); + } else { + return null; + } + } + } diff --git a/src/main/java/io/choerodon/devops/infra/gitops/ResourceConvertToYamlHandler.java b/src/main/java/io/choerodon/devops/infra/gitops/ResourceConvertToYamlHandler.java index b63d060b29..b3933c2767 100644 --- a/src/main/java/io/choerodon/devops/infra/gitops/ResourceConvertToYamlHandler.java +++ b/src/main/java/io/choerodon/devops/infra/gitops/ResourceConvertToYamlHandler.java @@ -1,25 +1,6 @@ package io.choerodon.devops.infra.gitops; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - import com.alibaba.fastjson.JSONObject; -import io.kubernetes.client.JSON; -import io.kubernetes.client.models.*; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.util.CollectionUtils; -import org.yaml.snakeyaml.DumperOptions; -import org.yaml.snakeyaml.Yaml; -import org.yaml.snakeyaml.nodes.Tag; - import io.choerodon.core.convertor.ApplicationContextHelper; import io.choerodon.core.exception.CommonException; import io.choerodon.devops.api.vo.kubernetes.C7nCertification; @@ -32,6 +13,24 @@ import io.choerodon.devops.infra.util.JsonYamlConversionUtil; import io.choerodon.devops.infra.util.SkipNullRepresenterUtil; import io.choerodon.devops.infra.util.TypeUtil; +import io.kubernetes.client.openapi.JSON; +import io.kubernetes.client.openapi.models.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.util.CollectionUtils; +import org.yaml.snakeyaml.DumperOptions; +import org.yaml.snakeyaml.Yaml; +import org.yaml.snakeyaml.nodes.Tag; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; public class ResourceConvertToYamlHandler { @@ -39,15 +38,13 @@ public class ResourceConvertToYamlHandler { public static final String UPDATE = "update"; private static final String C7NTAG = "!!io.choerodon.devops.api.vo.kubernetes.C7nHelmRelease"; - private static final String INGTAG = "!!io.kubernetes.client.models.V1beta1Ingress"; + private static final String INGTAG = "!!io.kubernetes.client.models.V1Ingress"; private static final String SVCTAG = "!!io.kubernetes.client.models.V1Service"; private static final String CERTTAG = "!!io.choerodon.devops.api.vo.kubernetes.C7nCertification"; private static final String CONFIGMAPTAG = "!!io.kubernetes.client.models.V1ConfigMap"; private static final String SECRET = "!!io.kubernetes.client.models.V1Secret"; private static final String ENDPOINTS = "!!io.kubernetes.client.models.V1Endpoints"; - private static final String PERSISTENT_VOLUME = "!!io.kubernetes.client.models.V1PersistentVolume"; - private static final String PERSISTENT_VOLUME_CLAIM = "!!io.kubernetes.client.models.V1PersistentVolumeClaim"; - private static final String DEPLOYMENT = "!!io.kubernetes.client.models.V1beta2Deployment"; + private static final String DEPLOYMENT = "!!io.kubernetes.client.models.V1Deployment"; private static final List WORKLOAD_RESOURCE_TYPE = new ArrayList<>(); @Value(value = "${devops.deploy.enableDeleteBlankLine:true}") @@ -242,23 +239,6 @@ private void handleWorkload(T t, String objectType, String operationType, String resultBuilder.append("---").append("\n").append(getYamlObject(null, false).dump(workloadResource)).append("\n"); } - private void handleDeployment(T t, String objectType, String operationType, StringBuilder resultBuilder, JSONObject jsonObject) { - Yaml yaml = new Yaml(); - V1beta2Deployment v1beta2Deployment = yaml.loadAs(jsonObject.toJSONString(), V1beta2Deployment.class); - V1beta2Deployment newV1beta2Deployment; - if (objectType.equals(ResourceType.DEPLOYMENT.getType()) && v1beta2Deployment.getMetadata().getName().equals(((V1beta2Deployment) t).getMetadata().getName())) { - if (operationType.equals(UPDATE)) { - newV1beta2Deployment = (V1beta2Deployment) t; - } else { - return; - } - } else { - newV1beta2Deployment = v1beta2Deployment; - } - Tag tag = new Tag(DEPLOYMENT); - resultBuilder.append("\n").append(getYamlObject(tag, true).dump(newV1beta2Deployment).replace(DEPLOYMENT, "---")); - } - private void handleService(T t, String content, String objectType, String operationType, StringBuilder resultBuilder, JSONObject jsonObject) { Yaml yaml3 = new Yaml(); @@ -294,18 +274,18 @@ private void handleService(T t, String content, String objectType, String operat private void handleIngress(T t, Boolean deleteCert, String objectType, String operationType, StringBuilder resultBuilder, JSONObject jsonObject) { Yaml yaml2 = new Yaml(); - V1beta1Ingress v1beta1Ingress = yaml2.loadAs(jsonObject.toJSONString(), V1beta1Ingress.class); - V1beta1Ingress newV1beta1Ingress; + V1Ingress v1beta1Ingress = yaml2.loadAs(jsonObject.toJSONString(), V1Ingress.class); + V1Ingress newV1Ingress; // 如果这个Ingress对象是被修改的对象 - if (objectType.equals(ResourceType.INGRESS.getType()) && v1beta1Ingress.getMetadata().getName().equals(((V1beta1Ingress) t).getMetadata().getName())) { + if (objectType.equals(ResourceType.INGRESS.getType()) && v1beta1Ingress.getMetadata().getName().equals(((V1Ingress) t).getMetadata().getName())) { if (operationType.equals(UPDATE)) { - newV1beta1Ingress = (V1beta1Ingress) t; + newV1Ingress = (V1Ingress) t; if (!deleteCert) { - if (newV1beta1Ingress.getSpec().getTls() != null && !newV1beta1Ingress.getSpec().getTls().isEmpty()) { - newV1beta1Ingress.getSpec().setTls(newV1beta1Ingress.getSpec().getTls()); + if (newV1Ingress.getSpec().getTls() != null && !newV1Ingress.getSpec().getTls().isEmpty()) { + newV1Ingress.getSpec().setTls(newV1Ingress.getSpec().getTls()); } else { - newV1beta1Ingress.getSpec().setTls(v1beta1Ingress.getSpec().getTls()); + newV1Ingress.getSpec().setTls(v1beta1Ingress.getSpec().getTls()); } } } else { @@ -314,10 +294,10 @@ private void handleIngress(T t, Boolean deleteCert, String objectType, String op } } else { // 如果不是,进行保留 - newV1beta1Ingress = v1beta1Ingress; + newV1Ingress = v1beta1Ingress; } Tag tag2 = new Tag(INGTAG); - resultBuilder.append("\n").append(getYamlObject(tag2, true).dump(newV1beta1Ingress).replace(INGTAG, "---")); + resultBuilder.append("\n").append(getYamlObject(tag2, true).dump(newV1Ingress).replace(INGTAG, "---")); } private void handleC7nHelmRelease(T t, String objectType, String operationType, StringBuilder diff --git a/src/main/java/io/choerodon/devops/infra/gitops/YamlConvertToResourceHandler.java b/src/main/java/io/choerodon/devops/infra/gitops/YamlConvertToResourceHandler.java index a0f12af36e..c227bae833 100644 --- a/src/main/java/io/choerodon/devops/infra/gitops/YamlConvertToResourceHandler.java +++ b/src/main/java/io/choerodon/devops/infra/gitops/YamlConvertToResourceHandler.java @@ -1,10 +1,10 @@ package io.choerodon.devops.infra.gitops; +import io.kubernetes.client.openapi.JSON; + import java.util.Map; import java.util.Objects; -import io.kubernetes.client.JSON; - import io.choerodon.devops.infra.exception.GitOpsExplainException; import io.choerodon.devops.infra.util.TypeUtil; diff --git a/src/main/java/io/choerodon/devops/infra/handler/ClusterConnectionHandler.java b/src/main/java/io/choerodon/devops/infra/handler/ClusterConnectionHandler.java index 6f69351428..c052f9abc2 100644 --- a/src/main/java/io/choerodon/devops/infra/handler/ClusterConnectionHandler.java +++ b/src/main/java/io/choerodon/devops/infra/handler/ClusterConnectionHandler.java @@ -107,10 +107,10 @@ public String handDevopsEnvGitRepository(Long projectId, String envCode, Long en ProjectDTO projectDTO = baseServiceClientOperator.queryIamProjectById(projectId); Tenant organizationDTO = baseServiceClientOperator.queryOrganizationById(projectDTO.getOrganizationId()); //本地路径 - String path = GitOpsUtil.getLocalPathToStoreEnv(organizationDTO.getTenantNum(), projectDTO.getCode(), clusterCode, envCode, envId); + String path = GitOpsUtil.getLocalPathToStoreEnv(organizationDTO.getTenantNum(), projectDTO.getDevopsComponentCode(), clusterCode, envCode, envId); //生成环境git仓库ssh地址 String url = GitUtil.getGitlabSshUrl(pattern, gitUtil.getSshUrl(), organizationDTO.getTenantNum(), - projectDTO.getCode(), envCode, EnvironmentType.forValue(envType), clusterCode); + projectDTO.getDevopsComponentCode(), envCode, EnvironmentType.forValue(envType), clusterCode); File file = new File(path); if (!file.exists()) { diff --git a/src/main/java/io/choerodon/devops/infra/handler/RetrofitHandler.java b/src/main/java/io/choerodon/devops/infra/handler/RetrofitHandler.java index 46a9d0c63b..a846aa6fd8 100644 --- a/src/main/java/io/choerodon/devops/infra/handler/RetrofitHandler.java +++ b/src/main/java/io/choerodon/devops/infra/handler/RetrofitHandler.java @@ -1,5 +1,8 @@ package io.choerodon.devops.infra.handler; +import java.io.IOException; +import java.lang.annotation.Annotation; +import java.lang.reflect.Type; import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; import java.security.cert.CertificateException; @@ -10,9 +13,11 @@ import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; -import okhttp3.Interceptor; -import okhttp3.OkHttpClient; -import okhttp3.Request; +import com.google.gson.Gson; +import com.google.gson.TypeAdapter; +import com.google.gson.stream.JsonReader; +import okhttp3.*; +import org.jetbrains.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import retrofit2.Converter; @@ -55,7 +60,7 @@ public static Retrofit initRetrofit(ConfigurationProperties configurationPropert .build(); } - private static Retrofit initRetrofit(ConfigurationProperties configurationProperties, Converter.Factory factory) { + public static Retrofit initRetrofit(ConfigurationProperties configurationProperties, Converter.Factory factory) { String credentials = configurationProperties.getUsername() + ":" + configurationProperties.getPassword(); String token = "Basic " + Base64.getEncoder().encodeToString(credentials.getBytes()); @@ -193,4 +198,35 @@ public static NexusClient getScalarNexusClient(String nexusUrl, String userName, Retrofit retrofit = RetrofitHandler.initRetrofit(configurationProperties, ScalarsConverterFactory.create()); return retrofit.create(NexusClient.class); } + + public static class StringConverter extends Converter.Factory { + @Nullable + @Override + public Converter responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) { + return new StringResponseBodyConverter(); + } + + @Nullable + @Override + public Converter requestBodyConverter(Type type, Annotation[] parameterAnnotations, Annotation[] methodAnnotations, Retrofit retrofit) { + return super.requestBodyConverter(type, parameterAnnotations, methodAnnotations, retrofit); + } + + @Nullable + @Override + public Converter stringConverter(Type type, Annotation[] annotations, Retrofit retrofit) { + return super.stringConverter(type, annotations, retrofit); + } + } + + public static final class StringResponseBodyConverter implements Converter { + StringResponseBodyConverter() { + } + + @Override + public String convert(ResponseBody value) throws IOException { + return value.string(); + } + } + } diff --git a/src/main/java/io/choerodon/devops/infra/mapper/AppServiceHelmRelMapper.java b/src/main/java/io/choerodon/devops/infra/mapper/AppServiceHelmRelMapper.java new file mode 100644 index 0000000000..88fb7ff270 --- /dev/null +++ b/src/main/java/io/choerodon/devops/infra/mapper/AppServiceHelmRelMapper.java @@ -0,0 +1,23 @@ +package io.choerodon.devops.infra.mapper; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; + +import io.choerodon.mybatis.common.BaseMapper; +import io.choerodon.devops.infra.dto.AppServiceHelmRelDTO; + +/** + * 应用服务和helm配置的关联关系表(AppServiceHelmRel)应用服务 + * + * @author hao.wang@zknow.com + * @since 2022-07-15 10:55:52 + */ +public interface AppServiceHelmRelMapper extends BaseMapper { + /** + * 批量插入 + * @param appServiceHelmRelDTOToInsert + */ + void batchInsert(@Param("appServiceHelmRelDTOToInsert") List appServiceHelmRelDTOToInsert); +} + diff --git a/src/main/java/io/choerodon/devops/infra/mapper/AppServiceHelmVersionMapper.java b/src/main/java/io/choerodon/devops/infra/mapper/AppServiceHelmVersionMapper.java new file mode 100644 index 0000000000..59cea69a55 --- /dev/null +++ b/src/main/java/io/choerodon/devops/infra/mapper/AppServiceHelmVersionMapper.java @@ -0,0 +1,25 @@ +package io.choerodon.devops.infra.mapper; + +import java.util.List; +import java.util.Set; + +import org.apache.ibatis.annotations.Param; + +import io.choerodon.devops.api.vo.appversion.AppServiceHelmVersionVO; +import io.choerodon.devops.infra.dto.AppServiceHelmVersionDTO; +import io.choerodon.mybatis.common.BaseMapper; + +/** + * 应用版本表(AppServiceHelmVersion)应用服务 + * + * @author hao.wang@zknow.com + * @since 2022-07-13 16:47:41 + */ +public interface AppServiceHelmVersionMapper extends BaseMapper { + + List listByAppVersionIds(@Param("versionIds") Set versionIds); + + void batchInsert(@Param("appServiceHelmVersionDTOToInsert") List appServiceHelmVersionDTOToInsert); + +} + diff --git a/src/main/java/io/choerodon/devops/infra/mapper/AppServiceImageVersionMapper.java b/src/main/java/io/choerodon/devops/infra/mapper/AppServiceImageVersionMapper.java new file mode 100644 index 0000000000..64990f2d41 --- /dev/null +++ b/src/main/java/io/choerodon/devops/infra/mapper/AppServiceImageVersionMapper.java @@ -0,0 +1,24 @@ +package io.choerodon.devops.infra.mapper; + +import java.util.List; +import java.util.Set; + +import org.apache.ibatis.annotations.Param; + +import io.choerodon.devops.api.vo.appversion.AppServiceImageVersionVO; +import io.choerodon.mybatis.common.BaseMapper; +import io.choerodon.devops.infra.dto.AppServiceImageVersionDTO; + +/** + * 应用版本表(AppServiceImageVersion)应用服务 + * + * @author hao.wang@zknow.com + * @since 2022-07-13 16:47:42 + */ +public interface AppServiceImageVersionMapper extends BaseMapper { + List listByAppVersionIds(@Param("versionIds") Set versionIds); + + void batchInsert(@Param("appServiceImageVersionDTOS") List appServiceImageVersionDTOS); + +} + diff --git a/src/main/java/io/choerodon/devops/infra/mapper/AppServiceInstanceMapper.java b/src/main/java/io/choerodon/devops/infra/mapper/AppServiceInstanceMapper.java index de08a6043d..09ea82210e 100644 --- a/src/main/java/io/choerodon/devops/infra/mapper/AppServiceInstanceMapper.java +++ b/src/main/java/io/choerodon/devops/infra/mapper/AppServiceInstanceMapper.java @@ -48,8 +48,6 @@ int countByOptions(@Param("envId") Long envId, @Param("appServiceId") Long appServiceId, @Param("appServiceInstanceCode") String appServiceInstanceCode); - String queryValueByEnvIdAndAppId(@Param("envId") Long envId, @Param("appServiceId") Long appServiceId); - List listApplicationInstanceOverView(@Param("projectId") Long projectId, @Param("appServiceId") Long appServiceId, @Param("envIds") List envIds); String queryValueByInstanceId(@Param("instanceId") Long instanceId); @@ -85,15 +83,6 @@ String getInstanceResourceDetailJson(@Param("instanceId") Long instanceId, @Param("resourceName") String resourceName, @Param("resourceType") String resourceType); - /** - * hzero不支持级联,后续删除 - * - * @param code - * @param envId - * @return - */ -// void deleteInstanceRelInfo(@Param("instanceId") Long instanceId); - Boolean checkCodeExist(@Param("code") String code, @Param("envId") Long envId); @@ -106,8 +95,6 @@ int countNonDeletedInstancesWithEnv(@Param("envId") Long envId, void updateStatus(@Param("instanceId") Long instanceId, @Param("status") String status); - List listAllDistinctWithoutDeleted(); - List listByProjectIdsAndAppServiceId(@Param("projectIds") Set projectIds, @Param("appServiceId") Long appServiceId); @@ -131,11 +118,6 @@ int countInstanceByCondition( */ List queryByInstanceIds(@Param("instanceIds") List instanceIds); - /** - * 查询指定时间内到现在的应用实例id - */ - List queryInstanceByAppServiceIds(@Param("appServiceIds") List appServiceIds); - /** * 查询实例的版本 * diff --git a/src/main/java/io/choerodon/devops/infra/mapper/AppServiceMapper.java b/src/main/java/io/choerodon/devops/infra/mapper/AppServiceMapper.java index fb28fcd585..cf4b98061f 100644 --- a/src/main/java/io/choerodon/devops/infra/mapper/AppServiceMapper.java +++ b/src/main/java/io/choerodon/devops/infra/mapper/AppServiceMapper.java @@ -217,5 +217,7 @@ void updatePomFields(@Param("id") Long id, List queryApplicationCenter(@Param("projectId") Long projectId, @Param("envId") Long envId, @Param("type") String type, @Param("params") String params); Set listAllIdsByProjectId(@Param("projectId") Long projectId); + + List listProjectIdsByAppIds(@Param("appIds") List appIds); } diff --git a/src/main/java/io/choerodon/devops/infra/mapper/AppServiceMavenVersionMapper.java b/src/main/java/io/choerodon/devops/infra/mapper/AppServiceMavenVersionMapper.java new file mode 100644 index 0000000000..86907b9d8a --- /dev/null +++ b/src/main/java/io/choerodon/devops/infra/mapper/AppServiceMavenVersionMapper.java @@ -0,0 +1,21 @@ +package io.choerodon.devops.infra.mapper; + +import java.util.List; +import java.util.Set; + +import org.apache.ibatis.annotations.Param; + +import io.choerodon.devops.api.vo.appversion.AppServiceMavenVersionVO; +import io.choerodon.mybatis.common.BaseMapper; +import io.choerodon.devops.infra.dto.AppServiceMavenVersionDTO; + +/** + * 应用版本表(AppServiceMavenVersion)应用服务 + * + * @author hao.wang@zknow.com + * @since 2022-07-13 16:47:43 + */ +public interface AppServiceMavenVersionMapper extends BaseMapper { + List listByAppVersionIds(@Param("versionIds") Set versionIds); +} + diff --git a/src/main/java/io/choerodon/devops/infra/mapper/AppServiceVersionMapper.java b/src/main/java/io/choerodon/devops/infra/mapper/AppServiceVersionMapper.java index dfb337dbe1..33ac939c97 100644 --- a/src/main/java/io/choerodon/devops/infra/mapper/AppServiceVersionMapper.java +++ b/src/main/java/io/choerodon/devops/infra/mapper/AppServiceVersionMapper.java @@ -6,7 +6,6 @@ import org.apache.ibatis.annotations.Param; -import io.choerodon.devops.infra.dto.AppServiceLatestVersionDTO; import io.choerodon.devops.infra.dto.AppServiceVersionDTO; import io.choerodon.mybatis.common.BaseMapper; @@ -15,14 +14,6 @@ */ public interface AppServiceVersionMapper extends BaseMapper { - List listByOptions( - @Param("appServiceId") Long appServiceId, - @Param("searchParam") Map searchParam, - @Param("params") List params); - - List listAppNewestVersion(@Param("projectId") Long projectId, - @Param("projectIds") List projectIds); - List listByAppIdAndEnvId(@Param("projectId") Long projectId, @Param("appServiceId") Long appServiceId, @Param("envId") Long envId); @@ -41,50 +32,25 @@ List listByAppServiceIdAndVersion(@Param("appServiceId") L @Param("index") String index, @Param("version") String version); - List listByAppServiceVersionIdForMarket(@Param("appServiceId") Long appServiceId, - @Param("appServiceVersionIds") List appServiceVersionIds, - @Param("searchParam") Map map, - @Param("params") List params, - @Param("index") String index, - @Param("version") String version); - - List listByAppServiceVersionIdForMarketBatch(@Param("appServiceIds") List appServiceIds, - @Param("appServiceVersionIds") List appServiceVersionIds, - @Param("searchParam") Map map, - @Param("params") List params, - @Param("index") String index, - @Param("version") String version); - List listAppServiceDeployedVersion(@Param("projectId") Long projectId, @Param("appServiceId") Long appServiceId); - List listByPublished(@Param("applicationId") Long applicationId); - - List listByAppServiceIdAndVersionIds(@Param("applicationId") Long applicationId); - List listUpgradeVersion(@Param("appServiceServiceId") Long appServiceServiceId); Integer checkByProjectAndVersionId(@Param("projectId") Long projectId, @Param("appServiceServiceId") Long appServiceServiceId); - AppServiceVersionDTO queryNewestVersion(@Param("appServiceId") Long appServiceId); - List listByAppServiceVersionIds(@Param("appServiceServiceIds") List appServiceServiceIds); + AppServiceVersionDTO selectByAppServiceVersionId(@Param("appServiceVersionId") Long appServiceVersionId); + List listByAppServiceIdAndBranch(@Param("appServiceId") Long appServiceId, @Param("branch") String branch); String queryByPipelineId(@Param("pipelineId") Long pipelineId, @Param("branch") String branch, @Param("appServiceId") Long appServiceId); String queryValueByAppServiceId(@Param("appServiceId") Long appServiceId); - void updateRepository(@Param("helmUrl") String url); - List queryByCommitSha(@Param("appServiceId") Long appServiceId, @Param("ref") String ref, @Param("commit") String commit); - - void updateObjectVersionNumber(@Param("versionId") Long versionId); - - void updatePublishTime(); - List listShareVersionByAppId(@Param("appServiceId") Long appServiceId, @Param("params") List params); @@ -113,15 +79,19 @@ List pageShareVersionByAppServiceIdAndVersion(@Param("appS AppServiceVersionDTO queryByShareVersion(@Param("appServiceId") Long appServiceId, @Param("projectId") Long projectId); - List selectAllAppServiceIdWithNullHarborConfig(); + AppServiceVersionDTO queryByCommitShaAndRef(@Param("appServiceId") Long appServiceId, @Param("commitSha") String commitSha, @Param("ref") String ref); - void updateNullHarborVersionToDefaultType(@Param("appServiceId") Long appServiceId); + List listAllVersionsWithHelmConfig(); - void updateNullHarborVersionToCustomType(@Param("appServiceId") Long appServiceId, @Param("configId") Long harborConfigId); + Integer queryCountVersionsWithHelmConfig(); - void updateDefaultHarborRecords(@Param("defaultHarborId") Long defaultHarborId); + /** + * 临时方法,迁移应用服务版本使用,下一个版本可删除 + * + * @return + */ + Integer queryCountVersionsWithHarborConfig(); - void updateCustomHarborRecords(@Param("defaultHarborId") Long defaultHarborId); + List listAllVersionsWithHarborConfig(); - AppServiceVersionDTO queryByCommitShaAndRef(@Param("appServiceId") Long appServiceId, @Param("commitSha") String commitSha, @Param("ref") String ref); } diff --git a/src/main/java/io/choerodon/devops/infra/mapper/CiPipelineAppVersionMapper.java b/src/main/java/io/choerodon/devops/infra/mapper/CiPipelineAppVersionMapper.java new file mode 100644 index 0000000000..bb6072c52c --- /dev/null +++ b/src/main/java/io/choerodon/devops/infra/mapper/CiPipelineAppVersionMapper.java @@ -0,0 +1,15 @@ +package io.choerodon.devops.infra.mapper; + +import io.choerodon.devops.infra.dto.CiPipelineAppVersionDTO; +import io.choerodon.mybatis.common.BaseMapper; + +/** + * 发布应用服务版本步骤生成的流水线记录信息(CiPipelineAppVersion)应用服务 + * + * @author hao.wang@zknow.com + * @since 2022-07-14 16:01:30 + */ +public interface CiPipelineAppVersionMapper extends BaseMapper { + +} + diff --git a/src/main/java/io/choerodon/devops/infra/mapper/CiPipelineMavenMapper.java b/src/main/java/io/choerodon/devops/infra/mapper/CiPipelineMavenMapper.java index 4e56cca282..2ad64bd7f8 100644 --- a/src/main/java/io/choerodon/devops/infra/mapper/CiPipelineMavenMapper.java +++ b/src/main/java/io/choerodon/devops/infra/mapper/CiPipelineMavenMapper.java @@ -1,5 +1,7 @@ package io.choerodon.devops.infra.mapper; +import org.apache.ibatis.annotations.Param; + import io.choerodon.devops.infra.dto.CiPipelineMavenDTO; import io.choerodon.mybatis.common.BaseMapper; @@ -9,4 +11,7 @@ * @description */ public interface CiPipelineMavenMapper extends BaseMapper { + + CiPipelineMavenDTO queryPipelineLatestMaven(@Param("appServiceId") Long appServiceId, + @Param("gitlabPipelineId") Long gitlabPipelineId); } diff --git a/src/main/java/io/choerodon/devops/infra/mapper/CiScheduleVariableMapper.java b/src/main/java/io/choerodon/devops/infra/mapper/CiScheduleVariableMapper.java index 30d865ac3e..01245403e6 100644 --- a/src/main/java/io/choerodon/devops/infra/mapper/CiScheduleVariableMapper.java +++ b/src/main/java/io/choerodon/devops/infra/mapper/CiScheduleVariableMapper.java @@ -1,9 +1,7 @@ package io.choerodon.devops.infra.mapper; -import io.choerodon.mybatis.common.BaseMapper; import io.choerodon.devops.infra.dto.CiScheduleVariableDTO; - -import java.util.List; +import io.choerodon.mybatis.common.BaseMapper; /** * devops_ci_schedule_variable(CiScheduleVariable)应用服务 diff --git a/src/main/java/io/choerodon/devops/infra/mapper/CiTemplateJobMapper.java b/src/main/java/io/choerodon/devops/infra/mapper/CiTemplateJobMapper.java index fe7099e3df..cc27c7419d 100644 --- a/src/main/java/io/choerodon/devops/infra/mapper/CiTemplateJobMapper.java +++ b/src/main/java/io/choerodon/devops/infra/mapper/CiTemplateJobMapper.java @@ -4,7 +4,6 @@ import java.util.Set; import org.apache.ibatis.annotations.Param; -import org.springframework.security.core.parameters.P; import io.choerodon.devops.api.vo.template.CiTemplateJobVO; import io.choerodon.devops.infra.dto.CiTemplateJobDTO; diff --git a/src/main/java/io/choerodon/devops/infra/mapper/DevopsAppServiceHelmRelMapper.java b/src/main/java/io/choerodon/devops/infra/mapper/DevopsAppServiceHelmRelMapper.java new file mode 100644 index 0000000000..97b8d512c0 --- /dev/null +++ b/src/main/java/io/choerodon/devops/infra/mapper/DevopsAppServiceHelmRelMapper.java @@ -0,0 +1,9 @@ +package io.choerodon.devops.infra.mapper; + +import io.choerodon.devops.infra.dto.DevopsAppServiceHelmRelDTO; +import io.choerodon.mybatis.common.BaseMapper; +import org.apache.ibatis.annotations.Param; + +public interface DevopsAppServiceHelmRelMapper extends BaseMapper { + DevopsAppServiceHelmRelDTO queryByAppServiceId(@Param("appServiceId") Long appServiceId); +} diff --git a/src/main/java/io/choerodon/devops/infra/mapper/DevopsCdApiTestInfoMapper.java b/src/main/java/io/choerodon/devops/infra/mapper/DevopsCdApiTestInfoMapper.java index 4f6612d527..c0ca4922c7 100644 --- a/src/main/java/io/choerodon/devops/infra/mapper/DevopsCdApiTestInfoMapper.java +++ b/src/main/java/io/choerodon/devops/infra/mapper/DevopsCdApiTestInfoMapper.java @@ -11,5 +11,6 @@ */ public interface DevopsCdApiTestInfoMapper extends BaseMapper { + Boolean doesApiTestSuiteRelatedWithPipeline(Long suiteId); } diff --git a/src/main/java/io/choerodon/devops/infra/mapper/DevopsConfigMapper.java b/src/main/java/io/choerodon/devops/infra/mapper/DevopsConfigMapper.java index 93ca4f61c2..ca5f2d69c3 100644 --- a/src/main/java/io/choerodon/devops/infra/mapper/DevopsConfigMapper.java +++ b/src/main/java/io/choerodon/devops/infra/mapper/DevopsConfigMapper.java @@ -41,4 +41,7 @@ List listByOptions(@Param("projectId") Long projectId, void updateConfigFieldsNull(@Param("configId") Long configId); List listByConfigs(@Param("configIds") Set configIds); + + List listAllChart(); + } diff --git a/src/main/java/io/choerodon/devops/infra/mapper/DevopsDeploymentMapper.java b/src/main/java/io/choerodon/devops/infra/mapper/DevopsDeploymentMapper.java index 522104f9bf..b4fe9bf7cb 100644 --- a/src/main/java/io/choerodon/devops/infra/mapper/DevopsDeploymentMapper.java +++ b/src/main/java/io/choerodon/devops/infra/mapper/DevopsDeploymentMapper.java @@ -4,7 +4,6 @@ import org.apache.ibatis.annotations.Param; -import io.choerodon.devops.api.vo.DevopsDeployGroupVO; import io.choerodon.devops.api.vo.DevopsDeploymentVO; import io.choerodon.devops.infra.dto.DevopsDeploymentDTO; import io.choerodon.mybatis.common.BaseMapper; diff --git a/src/main/java/io/choerodon/devops/infra/mapper/DevopsEnvCommandMapper.java b/src/main/java/io/choerodon/devops/infra/mapper/DevopsEnvCommandMapper.java index dc8c2157dd..8500dddcb1 100644 --- a/src/main/java/io/choerodon/devops/infra/mapper/DevopsEnvCommandMapper.java +++ b/src/main/java/io/choerodon/devops/infra/mapper/DevopsEnvCommandMapper.java @@ -1,14 +1,13 @@ package io.choerodon.devops.infra.mapper; -import io.choerodon.devops.api.vo.kubernetes.Command; -import io.choerodon.devops.infra.dto.DevopsEnvCommandDTO; -import io.choerodon.devops.infra.enums.ObjectType; -import io.choerodon.mybatis.common.BaseMapper; +import java.sql.Date; +import java.util.List; import org.apache.ibatis.annotations.Param; -import java.sql.Date; -import java.util.List; +import io.choerodon.devops.api.vo.kubernetes.Command; +import io.choerodon.devops.infra.dto.DevopsEnvCommandDTO; +import io.choerodon.mybatis.common.BaseMapper; public interface DevopsEnvCommandMapper extends BaseMapper { diff --git a/src/main/java/io/choerodon/devops/infra/mapper/DevopsEnvResourceMapper.java b/src/main/java/io/choerodon/devops/infra/mapper/DevopsEnvResourceMapper.java index 7d759b33fb..6733f92260 100644 --- a/src/main/java/io/choerodon/devops/infra/mapper/DevopsEnvResourceMapper.java +++ b/src/main/java/io/choerodon/devops/infra/mapper/DevopsEnvResourceMapper.java @@ -4,7 +4,6 @@ import org.apache.ibatis.annotations.Param; -import io.choerodon.devops.api.vo.DevopsEnvResourceVO; import io.choerodon.devops.infra.dto.DevopsEnvResourceDTO; import io.choerodon.mybatis.common.BaseMapper; diff --git a/src/main/java/io/choerodon/devops/infra/mapper/DevopsHelmConfigMapper.java b/src/main/java/io/choerodon/devops/infra/mapper/DevopsHelmConfigMapper.java new file mode 100644 index 0000000000..362d78bfcd --- /dev/null +++ b/src/main/java/io/choerodon/devops/infra/mapper/DevopsHelmConfigMapper.java @@ -0,0 +1,28 @@ +package io.choerodon.devops.infra.mapper; + +import org.apache.ibatis.annotations.Param; + +import io.choerodon.devops.infra.dto.DevopsHelmConfigDTO; +import io.choerodon.mybatis.common.BaseMapper; + +import java.util.List; + +public interface DevopsHelmConfigMapper extends BaseMapper { + void updateAllHelmConfigRepoDefaultToFalse(@Param("projectId") Long projectId); + + void updateHelmConfigRepoDefaultToTrue(@Param("projectId") Long projectId, @Param("helmConfigId") Long helmConfigId); + + void updateDevopsHelmConfigToNonDefaultRepoOnOrganization(@Param("resourceId") Long resourceId); + + boolean checkNameExists(@Param("projectId") Long projectId, @Param("helmConfigId") Long helmConfigId, @Param("name") String name); + + List listHelmConfigWithIdAndName(@Param("resourceId") Long resourceId, @Param("resourceType") String resourceType); + + DevopsHelmConfigDTO selectOneWithIdAndName(@Param("resourceId") Long resourceId, @Param("resourceType") String resourceType, @Param("defaultRepo") Boolean defaultRepo); + + DevopsHelmConfigDTO selectWithIdAndNameByAppServiceId(@Param("appServiceId") Long appServiceId); + + void batchInsert(@Param("devopsHelmConfigDTOS") List devopsHelmConfigDTOS); + + DevopsHelmConfigDTO listObjectVersionNumberById(@Param("helmConfigId") Long helmConfigId); +} diff --git a/src/main/java/io/choerodon/devops/infra/mapper/DevopsHostCommandMapper.java b/src/main/java/io/choerodon/devops/infra/mapper/DevopsHostCommandMapper.java index c47cee485f..ecb57ac415 100644 --- a/src/main/java/io/choerodon/devops/infra/mapper/DevopsHostCommandMapper.java +++ b/src/main/java/io/choerodon/devops/infra/mapper/DevopsHostCommandMapper.java @@ -22,6 +22,8 @@ public interface DevopsHostCommandMapper extends BaseMapper missCommands); List listStagnatedRecord(@Param("hostId") String hostId, @Param("beforeDate") String beforeDate); diff --git a/src/main/java/io/choerodon/devops/infra/mapper/DevopsIssueRelMapper.java b/src/main/java/io/choerodon/devops/infra/mapper/DevopsIssueRelMapper.java index a1538ea592..dc149107db 100644 --- a/src/main/java/io/choerodon/devops/infra/mapper/DevopsIssueRelMapper.java +++ b/src/main/java/io/choerodon/devops/infra/mapper/DevopsIssueRelMapper.java @@ -15,7 +15,7 @@ public interface DevopsIssueRelMapper extends BaseMapper { List listIssueIdsByObjectTypeAndObjectIds(Set objectIds, String object); - Set listRelationByIssueIdAndObjectType(@Param("projectId") Long projectId, @Param("object") String object, @Param("issueId") Long issueId); + Set listRelationByIssueIdAndProjectIdAndObjectType(@Param("projectId") Long projectId, @Param("object") String object, @Param("issueId") Long issueId); List listRelationByIssueIdsAndObjectType(@Param("object") String object, @Param("issueIds") Set issueIds); @@ -38,4 +38,10 @@ public interface DevopsIssueRelMapper extends BaseMapper { List listBranchIdsByCommitIds(@Param("commitIds") Set commitIds); List listCommitRelationByBranchId(@Param("branchId") Long branchId); + + Set listRelationByIssueIdAndObjectType(@Param("object") String object, @Param("issueId") Long issueId); + + Boolean checkIssueBranchRelExist(@Param("value") String value, + @Param("projectId") Long projectId, + @Param("issueId") Long issueId); } diff --git a/src/main/java/io/choerodon/devops/infra/mapper/UserAttrMapper.java b/src/main/java/io/choerodon/devops/infra/mapper/UserAttrMapper.java index d952b4a0f9..3021683ad8 100644 --- a/src/main/java/io/choerodon/devops/infra/mapper/UserAttrMapper.java +++ b/src/main/java/io/choerodon/devops/infra/mapper/UserAttrMapper.java @@ -5,6 +5,7 @@ import org.apache.ibatis.annotations.Param; +import io.choerodon.devops.api.vo.UserAttrVO; import io.choerodon.devops.infra.dto.UserAttrDTO; import io.choerodon.mybatis.common.BaseMapper; @@ -25,4 +26,10 @@ void updateIsGitlabAdmin(@Param("iamUserId") Long iamUserId, void updateByGitlabUserId(@Param("gitlabUserId") Long gitlabUserId, @Param("iamUserId") Long iamUserId, @Param("gitlabUserName") String gitlabUserName); + + List listAllAdmin(); + + void updateGitlabAdminUserToNormalUser(@Param("userIds") List userIds); + + void updateAreAdmin(@Param("iamUserIds") List iamUserIds, @Param("isGitlabAdmin") Boolean isGitlabAdmin); } diff --git a/src/main/java/io/choerodon/devops/infra/mapper/devops_helm_config_mapper.java b/src/main/java/io/choerodon/devops/infra/mapper/devops_helm_config_mapper.java new file mode 100644 index 0000000000..4dd80226ee --- /dev/null +++ b/src/main/java/io/choerodon/devops/infra/mapper/devops_helm_config_mapper.java @@ -0,0 +1,7 @@ +package io.choerodon.devops.infra.mapper; + +import io.choerodon.devops.infra.dto.DevopsHelmConfigDTO; +import io.choerodon.mybatis.common.BaseMapper; + +public interface devops_helm_config_mapper extends BaseMapper { +} diff --git a/src/main/java/io/choerodon/devops/infra/util/AppServiceUtils.java b/src/main/java/io/choerodon/devops/infra/util/AppServiceUtils.java index e6c151b9ef..99c17669ae 100644 --- a/src/main/java/io/choerodon/devops/infra/util/AppServiceUtils.java +++ b/src/main/java/io/choerodon/devops/infra/util/AppServiceUtils.java @@ -1,6 +1,7 @@ package io.choerodon.devops.infra.util; import java.util.Objects; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; @@ -104,7 +105,7 @@ public Boolean checkEnableCreateAppSvcWithSize(Long organizationId, Long project } public void checkCodeExist(String appCode) { - if (StringUtils.isEmpty(appCode)) { + if (!StringUtils.hasText(appCode)) { throw new CommonException("error.code.is.null"); } } diff --git a/src/main/java/io/choerodon/devops/infra/util/ChartUtil.java b/src/main/java/io/choerodon/devops/infra/util/ChartUtil.java index 55dff6f5a0..d6a9698943 100644 --- a/src/main/java/io/choerodon/devops/infra/util/ChartUtil.java +++ b/src/main/java/io/choerodon/devops/infra/util/ChartUtil.java @@ -1,7 +1,5 @@ package io.choerodon.devops.infra.util; -import static io.choerodon.devops.app.eventhandler.constants.HarborRepoConstants.AUTH_TYPE_PULL; - import java.io.File; import java.io.FileOutputStream; import java.io.IOException; @@ -23,14 +21,14 @@ import retrofit2.Retrofit; import io.choerodon.core.exception.CommonException; -import io.choerodon.devops.api.vo.ConfigVO; import io.choerodon.devops.api.vo.chart.ChartDeleteResponseVO; import io.choerodon.devops.api.vo.chart.ChartTagVO; import io.choerodon.devops.app.service.DevopsConfigService; +import io.choerodon.devops.app.service.DevopsHelmConfigService; import io.choerodon.devops.infra.config.ConfigurationProperties; import io.choerodon.devops.infra.dto.AppServiceDTO; import io.choerodon.devops.infra.dto.AppServiceVersionDTO; -import io.choerodon.devops.infra.dto.DevopsConfigDTO; +import io.choerodon.devops.infra.dto.DevopsHelmConfigDTO; import io.choerodon.devops.infra.dto.iam.ProjectDTO; import io.choerodon.devops.infra.dto.iam.Tenant; import io.choerodon.devops.infra.feign.ChartClient; @@ -52,6 +50,8 @@ public class ChartUtil { @Autowired DevopsConfigService devopsConfigService; + @Autowired + DevopsHelmConfigService devopsHelmConfigService; public static void uploadChart(String repository, String organizationCode, String projectCode, File file, @Nullable String username, @Nullable String password) { ConfigurationProperties configurationProperties = new ConfigurationProperties(); @@ -109,13 +109,13 @@ private static String readErrorMessage(Response response, String repository, } public void deleteChart(ChartTagVO chartTagVO) { - DevopsConfigDTO devopsConfigDTO = devopsConfigService.queryRealConfig(chartTagVO.getAppServiceId(), APP_SERVICE, CHART, AUTH_TYPE_PULL); - ConfigVO helmConfig = GSON.fromJson(devopsConfigDTO.getConfig(), ConfigVO.class); + + DevopsHelmConfigDTO devopsHelmConfigDTO = devopsHelmConfigService.queryAppConfig(chartTagVO.getAppServiceId(), chartTagVO.getProjectId(), chartTagVO.getTenantId()); ConfigurationProperties configurationProperties = new ConfigurationProperties(); configurationProperties.setType(CHART); - configurationProperties.setUsername(helmConfig.getUserName()); - configurationProperties.setPassword(helmConfig.getPassword()); + configurationProperties.setUsername(devopsHelmConfigDTO.getUsername()); + configurationProperties.setPassword(devopsHelmConfigDTO.getPassword()); configurationProperties.setBaseUrl(chartTagVO.getRepository().split(chartTagVO.getOrgCode() + "/" + chartTagVO.getProjectCode())[0]); Retrofit retrofit = RetrofitHandler.initRetrofit(configurationProperties); ChartClient chartClient = retrofit.create(ChartClient.class); @@ -130,10 +130,10 @@ public void deleteChart(ChartTagVO chartTagVO) { public void downloadChart(AppServiceVersionDTO appServiceVersionDTO, Tenant organizationDTO, ProjectDTO projectDTO, AppServiceDTO applicationDTO, String destpath) { ConfigurationProperties configurationProperties = new ConfigurationProperties(); configurationProperties.setType(CHART); - configurationProperties.setBaseUrl(appServiceVersionDTO.getRepository().split(organizationDTO.getTenantNum() + "/" + projectDTO.getCode())[0]); + configurationProperties.setBaseUrl(appServiceVersionDTO.getRepository().split(organizationDTO.getTenantNum() + "/" + projectDTO.getDevopsComponentCode())[0]); Retrofit retrofit = RetrofitHandler.initRetrofit(configurationProperties); ChartClient chartClient = retrofit.create(ChartClient.class); - Call getTaz = chartClient.downloadTaz(organizationDTO.getTenantNum(), projectDTO.getCode(), applicationDTO.getCode(), appServiceVersionDTO.getVersion()); + Call getTaz = chartClient.downloadTaz(organizationDTO.getTenantNum(), projectDTO.getDevopsComponentCode(), applicationDTO.getCode(), appServiceVersionDTO.getVersion()); FileOutputStream fos = null; try { Response response = getTaz.execute(); diff --git a/src/main/java/io/choerodon/devops/infra/util/ExternalGitUtil.java b/src/main/java/io/choerodon/devops/infra/util/ExternalGitUtil.java index 4b60235bb9..53feded6e9 100644 --- a/src/main/java/io/choerodon/devops/infra/util/ExternalGitUtil.java +++ b/src/main/java/io/choerodon/devops/infra/util/ExternalGitUtil.java @@ -25,8 +25,6 @@ import org.eclipse.jgit.util.FS; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; import org.springframework.core.io.DefaultResourceLoader; import org.springframework.core.io.ResourceLoader; import org.springframework.stereotype.Component; @@ -34,38 +32,21 @@ import org.springframework.util.StringUtils; import io.choerodon.core.exception.CommonException; -import io.choerodon.devops.app.service.DevopsClusterResourceService; -import io.choerodon.devops.app.service.DevopsEnvironmentService; import io.choerodon.devops.infra.enums.EnvironmentType; -import io.choerodon.devops.infra.feign.operator.BaseServiceClientOperator; -import io.choerodon.devops.infra.mapper.DevopsClusterMapper; /** * 封装调用外部git的接口 */ @Component public class ExternalGitUtil { - public static final String DEV_OPS_REFS = "refs/tags/"; public static final String TEMPLATE = "template"; - private static final String MASTER = "master"; private static final String PATH = "/"; private static final String GIT_SUFFIX = "/.git"; private static final String ERROR_GIT_CLONE = "error.git.clone"; private static final String REPO_NAME = "devops-service-repo"; private static final Logger LOGGER = LoggerFactory.getLogger(ExternalGitUtil.class); - private static final Pattern PATTERN = Pattern.compile("^[-\\+]?[\\d]*$"); private static final String ERROR_GIT_PUSH = "error.git.push"; - @Autowired - private DevopsClusterMapper devopsClusterMapper; - @Autowired - private DevopsEnvironmentService devopsEnvironmentService; - @Autowired - private DevopsClusterResourceService devopsClusterResourceService; - @Autowired - private BaseServiceClientOperator baseServiceClientOperator; private String classPath; - @Value("${services.gitlab.sshUrl}") - private String gitlabSshUrl; /** * 构造方法 @@ -415,13 +396,4 @@ public static void deleteTag(Git git, String tagName) { throw new CommonException("delete tag fail", e); } } - - private void addFile(Git git, String relativePath) throws GitAPIException { - git.add().setUpdate(false).addFilepattern(relativePath).call(); - git.add().setUpdate(true).addFilepattern(relativePath).call(); - } - - private void commitChanges(Git git, String commitMsg) throws GitAPIException { - git.commit().setMessage(commitMsg).call(); - } } diff --git a/src/main/java/io/choerodon/devops/infra/util/GitUtil.java b/src/main/java/io/choerodon/devops/infra/util/GitUtil.java index 7d686292f7..5a134ffb8d 100644 --- a/src/main/java/io/choerodon/devops/infra/util/GitUtil.java +++ b/src/main/java/io/choerodon/devops/infra/util/GitUtil.java @@ -828,7 +828,7 @@ public GitConfigVO getGitConfig(Long clusterId) { devopsEnvironments.forEach(devopsEnvironmentDTO -> { ProjectDTO projectDTO = baseServiceClientOperator.queryIamProjectById(devopsEnvironmentDTO.getProjectId()); Tenant organizationDTO = baseServiceClientOperator.queryOrganizationById(projectDTO.getOrganizationId()); - String repoUrl = GitUtil.getGitlabSshUrl(PATTERN, gitlabSshUrl, organizationDTO.getTenantNum(), projectDTO.getCode(), devopsEnvironmentDTO.getCode(), EnvironmentType.forValue(devopsEnvironmentDTO.getType()), devopsClusterDTO.getCode()); + String repoUrl = GitUtil.getGitlabSshUrl(PATTERN, gitlabSshUrl, organizationDTO.getTenantNum(), projectDTO.getDevopsComponentCode(), devopsEnvironmentDTO.getCode(), EnvironmentType.forValue(devopsEnvironmentDTO.getType()), devopsClusterDTO.getCode()); GitEnvConfigVO gitEnvConfigVO = new GitEnvConfigVO(); gitEnvConfigVO.setEnvId(devopsEnvironmentDTO.getId()); diff --git a/src/main/java/io/choerodon/devops/infra/util/GitlabCiUtil.java b/src/main/java/io/choerodon/devops/infra/util/GitlabCiUtil.java index 694b211408..c03f328987 100644 --- a/src/main/java/io/choerodon/devops/infra/util/GitlabCiUtil.java +++ b/src/main/java/io/choerodon/devops/infra/util/GitlabCiUtil.java @@ -117,19 +117,6 @@ private static String[] simpleSplitLinesToArray(String string) { return string.split(NEWLINE_REGEX); } - /** - * 将字符串按行分割为字符串列表 - * - * @param string 字符串 - * @return 列表 - */ - public static List simpleSplitLinesToList(String string) { - if (StringUtils.isEmpty(string)) { - return Collections.emptyList(); - } - return Arrays.asList(simpleSplitLinesToArray(string)); - } - /** * 将shell按行分割 (支持 \ 符号进行多行连接) * diff --git a/src/main/java/io/choerodon/devops/infra/util/K8sUtil.java b/src/main/java/io/choerodon/devops/infra/util/K8sUtil.java index 12591c04d1..ad9c4c88ff 100644 --- a/src/main/java/io/choerodon/devops/infra/util/K8sUtil.java +++ b/src/main/java/io/choerodon/devops/infra/util/K8sUtil.java @@ -1,10 +1,7 @@ package io.choerodon.devops.infra.util; -import java.util.*; -import java.util.regex.Pattern; - -import io.kubernetes.client.JSON; -import io.kubernetes.client.models.*; +import io.kubernetes.client.openapi.JSON; +import io.kubernetes.client.openapi.models.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.util.CollectionUtils; @@ -13,6 +10,9 @@ import org.yaml.snakeyaml.Yaml; import org.yaml.snakeyaml.nodes.Tag; +import java.util.*; +import java.util.regex.Pattern; + /** * Created by younger on 2018/4/25. */ @@ -49,7 +49,7 @@ public class K8sUtil { */ public static final Pattern LABEL_NAME_PATTERN = Pattern.compile("^([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9]$"); - public static final Pattern PORT_NAME_PATTERN=Pattern.compile("^[0-9a-z]([0-9a-z]+-)*[0-9a-z]*[0-9a-z]$"); + public static final Pattern PORT_NAME_PATTERN = Pattern.compile("^[0-9a-z]([0-9a-z]+-)*[0-9a-z]*[0-9a-z]$"); private K8sUtil() { @@ -244,7 +244,7 @@ public static String makePortString(List servicePorts) { * @param ingress ingress对象 * @return 空的不可修改的Set, 如果没有 */ - public static Set analyzeIngressServices(V1beta1Ingress ingress) { + public static Set analyzeIngressServices(V1Ingress ingress) { if (ingress == null || ingress.getSpec() == null) { return Collections.emptySet(); } @@ -255,17 +255,19 @@ public static Set analyzeIngressServices(V1beta1Ingress ingress) { if (rule.getHttp() != null && !CollectionUtils.isEmpty(rule.getHttp().getPaths())) { rule.getHttp().getPaths().forEach(path -> { if (path.getBackend() != null) { - services.add(path.getBackend().getServiceName()); + // TODO 兼容旧版本 +// services.add(path.getBackend().getServiceName()); } }); } }); } + // TODO 兼容旧版本 // 将默认的backend相关的service加入集合 - if (ingress.getSpec().getBackend() != null) { - services.add(ingress.getSpec().getBackend().getServiceName()); - } +// if (ingress.getSpec().getBackend() != null) { +// services.add(ingress.getSpec().getBackend().getServiceName()); +// } return services; } @@ -295,11 +297,11 @@ public static String makeTargetPortString(List servicePorts) { * @param v1beta1IngressRules ingress对象 * @return string */ - public static String formatHosts(List v1beta1IngressRules) { + public static String formatHosts(List v1beta1IngressRules) { List results = new ArrayList<>(); int max = 3; boolean more = false; - for (V1beta1IngressRule v1beta1IngressRule : v1beta1IngressRules) { + for (V1IngressRule v1beta1IngressRule : v1beta1IngressRules) { if (results.size() == max) { more = true; } @@ -323,7 +325,7 @@ public static String formatHosts(List v1beta1IngressRules) { * @param v1beta1IngressTLS ingress对象 * @return string */ - public static String formatPorts(List v1beta1IngressTLS) { + public static String formatPorts(List v1beta1IngressTLS) { if (v1beta1IngressTLS != null && !v1beta1IngressTLS.isEmpty()) { return "80,443"; } diff --git a/src/main/java/io/choerodon/devops/infra/util/SshUtil.java b/src/main/java/io/choerodon/devops/infra/util/SshUtil.java index c8f68fe3dd..d05934ffac 100644 --- a/src/main/java/io/choerodon/devops/infra/util/SshUtil.java +++ b/src/main/java/io/choerodon/devops/infra/util/SshUtil.java @@ -15,7 +15,6 @@ import net.schmizz.sshj.SSHClient; import net.schmizz.sshj.common.IOUtils; -import net.schmizz.sshj.connection.ConnectionException; import net.schmizz.sshj.connection.channel.direct.Session; import net.schmizz.sshj.transport.verification.PromiscuousVerifier; import net.schmizz.sshj.userauth.keyprovider.KeyProvider; @@ -31,8 +30,6 @@ import io.choerodon.devops.api.vo.HostConnectionVO; import io.choerodon.devops.app.service.impl.DevopsClusterNodeServiceImpl; import io.choerodon.devops.infra.dto.DevopsHostDTO; -import io.choerodon.devops.infra.dto.repo.C7nImageDeployDTO; -import io.choerodon.devops.infra.dto.repo.C7nNexusDeployDTO; import io.choerodon.devops.infra.enums.HostAuthType; import io.choerodon.devops.infra.enums.HostSourceEnum; import io.choerodon.devops.infra.mapper.DevopsHostMapper; @@ -48,11 +45,6 @@ public class SshUtil { * 默认超时时间, 10秒 */ private static final int DEFAULT_TIMEOUT_MILLISECONDS = 10000; - private static final Integer WAIT_SECONDS = 6; - private static final String ERROR_DOCKER_LOGIN = "error.docker.login"; - private static final String ERROR_DOCKER_PULL = "error.docker.pull"; - private static final String ERROR_DOCKER_RUN = "error.docker.run"; - private static final String ERROR_DOWNLOAD_JAY = "error.download.jar"; private static final String CAT_FILE_TEMPLATE = "cat %s"; @@ -141,178 +133,6 @@ public void sshConnect(HostConnectionVO hostConnectionVO, SSHClient ssh) throws } } - public void sshStopJar(SSHClient ssh, String jarName, String workingPath, StringBuilder log) throws IOException { - if (StringUtils.isEmpty(workingPath)) { - workingPath = "."; - } else { - workingPath = workingPath.endsWith("/") ? workingPath.substring(0, workingPath.length() - 1) : workingPath; - } - - if (!StringUtils.isEmpty(jarName)) { - StringBuilder stopJar = new StringBuilder(); - stopJar.append(String.format("ps aux|grep %s | grep -v grep |awk '{print $2}' |xargs kill -9 ", jarName)); - stopJar.append(System.lineSeparator()); - stopJar.append(String.format("rm -f %s/temp-jar/%s", workingPath, jarName)); - stopJar.append(System.lineSeparator()); - stopJar.append(String.format("rm -f %s/temp-log/%s", workingPath, jarName.replace(".jar", ".log"))); - log.append(System.lineSeparator()).append(stopJar.toString()); - Session session = null; - try { - session = ssh.startSession(); - final Session.Command cmd = session.exec(stopJar.toString()); - cmd.join(WAIT_SECONDS, TimeUnit.SECONDS); - String logInfo = IOUtils.readFully(cmd.getInputStream()).toString(); - String errorInfo = IOUtils.readFully(cmd.getErrorStream()).toString(); - log.append(logInfo); - log.append(errorInfo); - } finally { - assert session != null; - session.close(); - } - } - } - - public void sshExec(SSHClient ssh, C7nNexusDeployDTO c7nNexusDeployDTO, String value, String workingPath, StringBuilder log) throws IOException { - StringBuilder cmdStr = new StringBuilder(); - if (StringUtils.isEmpty(workingPath)) { - workingPath = "."; - } else { - workingPath = workingPath.endsWith("/") ? workingPath.substring(0, workingPath.length() - 1) : workingPath; - } - cmdStr.append(String.format("mkdir -p %s/temp-jar && ", workingPath)); - cmdStr.append(String.format("mkdir -p %s/temp-log && ", workingPath)); - Session session = null; - try { - session = ssh.startSession(); - String jarPathAndName = workingPath + "/temp-jar/" + c7nNexusDeployDTO.getJarName(); - // 2.2 - String curlExec = String.format("curl -o %s -u %s:%s %s ", - jarPathAndName, - c7nNexusDeployDTO.getPullUserId(), - c7nNexusDeployDTO.getPullUserPassword(), - c7nNexusDeployDTO.getDownloadUrl()); - cmdStr.append(curlExec).append(" && "); - - // 2.3 - String[] strings = value.split("\n"); - String values = ""; - for (String s : strings) { - if (s.length() > 0 && !s.contains("#") && s.contains("java")) { - values = s; - } - } - if (StringUtils.isEmpty(values) || Boolean.FALSE.equals(checkInstruction("jar", values))) { - throw new CommonException("error.instruction"); - } - - String logName = c7nNexusDeployDTO.getJarName().replace(".jar", ".log"); - String logPathAndName = workingPath + "/temp-log/" + logName; - String javaJarExec = values.replace("${jar}", jarPathAndName); - - cmdStr.append(javaJarExec); - StringBuilder finalCmdStr = new StringBuilder("nohup bash -c \"").append(cmdStr).append("\"").append(String.format(" > %s 2>&1 &", logPathAndName)); - - final Session.Command cmd = session.exec(finalCmdStr.toString()); - cmd.join(WAIT_SECONDS, TimeUnit.SECONDS); - String loggerInfo = IOUtils.readFully(cmd.getInputStream()).toString(); - String loggerError = IOUtils.readFully(cmd.getErrorStream()).toString(); - log.append(System.lineSeparator()).append(finalCmdStr.toString().replace(c7nNexusDeployDTO.getPullUserPassword(), "password")); - log.append(System.lineSeparator()); - log.append(loggerInfo); - log.append(loggerError); - if (loggerError.contains("Unauthorized") || loggerInfo.contains("Unauthorized") || cmd.getExitStatus() != 0) { - throw new CommonException(ERROR_DOWNLOAD_JAY); - } - LOGGER.info(loggerInfo); - LOGGER.info(loggerError); - } finally { - assert session != null; - session.close(); - } - - } - - public void dockerLogin(SSHClient ssh, C7nImageDeployDTO imageTagVo, StringBuilder log) throws IOException { - Session session = null; - try { - session = ssh.startSession(); - String loginExec = String.format("sudo docker login -u '%s' -p %s %s", imageTagVo.getPullAccount(), imageTagVo.getPullPassword(), imageTagVo.getHarborUrl()); - LOGGER.info(loginExec); - Session.Command cmd = session.exec(loginExec); - - String loggerInfo = IOUtils.readFully(cmd.getInputStream()).toString(); - String loggerError = IOUtils.readFully(cmd.getErrorStream()).toString(); - cmd.join(WAIT_SECONDS, TimeUnit.SECONDS); - log.append(System.lineSeparator()).append(loginExec.replace(imageTagVo.getPullPassword(), "password")); - log.append(System.lineSeparator()); - log.append(loggerInfo); - log.append(loggerError); - LOGGER.info(loggerInfo); - LOGGER.info(loggerError); - LOGGER.info("docker login status:{}", cmd.getExitStatus()); - - if (cmd.getExitStatus() != 0) { - throw new CommonException(ERROR_DOCKER_LOGIN); - } - - } finally { - assert session != null; - session.close(); - } - } - - public void dockerPull(SSHClient ssh, C7nImageDeployDTO imageTagVo, StringBuilder log) throws IOException { - Session session = null; - try { - session = ssh.startSession(); - LOGGER.info(imageTagVo.getPullCmd()); - Session.Command cmd = session.exec("sudo " + imageTagVo.getPullCmd()); - log.append(System.lineSeparator()).append("sudo ").append(imageTagVo.getPullCmd()); - String loggerInfo = IOUtils.readFully(cmd.getInputStream()).toString(); - String loggerError = IOUtils.readFully(cmd.getErrorStream()).toString(); - execPullImage(cmd); - log.append(System.lineSeparator()); - log.append(loggerInfo); - log.append(loggerError); - LOGGER.info(loggerInfo); - LOGGER.info(loggerError); - LOGGER.info("docker pull status:{}", cmd.getExitStatus()); - if (cmd.getExitStatus() != 0) { - throw new CommonException(ERROR_DOCKER_PULL); - } - } finally { - assert session != null; - session.close(); - } - } - - public void dockerStop(SSHClient ssh, String containerName, StringBuilder log) throws IOException { - Session session = null; - try { - session = ssh.startSession(); - - // 判断镜像是否存在 存在删除 部署 - StringBuilder dockerRunExec = new StringBuilder(); - dockerRunExec.append("sudo docker stop ").append(containerName).append(" && "); - dockerRunExec.append("sudo docker rm ").append(containerName); - log.append(System.lineSeparator()).append(dockerRunExec.toString()); - Session.Command cmd = session.exec(dockerRunExec.toString()); - cmd.join(WAIT_SECONDS, TimeUnit.SECONDS); - String loggerInfo = IOUtils.readFully(cmd.getInputStream()).toString(); - String loggerError = IOUtils.readFully(cmd.getErrorStream()).toString(); - log.append(System.lineSeparator()); - log.append(loggerInfo); - log.append(loggerError); - LOGGER.info(loggerInfo); - LOGGER.info(loggerError); - LOGGER.info("docker stop status:{}", cmd.getExitStatus()); - } finally { - assert session != null; - session.close(); - } - - } - /** * 执行shell命令。该函数需要一直阻塞直到命令返回 * @@ -345,46 +165,6 @@ public void execCommands(SSHClient sshClient, @Nonnull List commands) th } } - public void dockerRun(SSHClient ssh, String value, String containerName, C7nImageDeployDTO c7nImageDeployDTO, StringBuilder log) throws IOException { - Session session = null; - try { - session = ssh.startSession(); - String[] strings = value.split("\n"); - String values = ""; - for (String s : strings) { - if (s.length() > 0 && !s.contains("#") && s.contains("docker")) { - values = s; - } - } - LOGGER.info("docker run values is {}", values); - if (StringUtils.isEmpty(values) || Boolean.FALSE.equals(checkInstruction("image", values))) { - throw new CommonException("error.instruction"); - } - - // 判断镜像是否存在 存在删除 部署 - StringBuilder dockerRunExec = new StringBuilder(); - dockerRunExec.append(values.replace("${containerName}", containerName).replace("${imageName}", c7nImageDeployDTO.getPullCmd().replace("docker pull", ""))); - Session.Command cmd = session.exec(dockerRunExec.toString()); - String loggerInfo = IOUtils.readFully(cmd.getInputStream()).toString(); - String loggerError = IOUtils.readFully(cmd.getErrorStream()).toString(); - LOGGER.info(loggerInfo); - LOGGER.info(loggerError); - cmd.join(WAIT_SECONDS, TimeUnit.SECONDS); - log.append(System.lineSeparator()).append(dockerRunExec.toString()); - log.append(System.lineSeparator()); - log.append(loggerInfo); - log.append(loggerError); - LOGGER.info("docker run status:{}", cmd.getExitStatus()); - if (cmd.getExitStatus() != 0) { - throw new CommonException(ERROR_DOCKER_RUN); - } - } finally { - assert session != null; - session.close(); - } - - } - private Boolean checkInstruction(String type, String instruction) { if (type.equals("jar")) { return instruction.contains("${jar}"); @@ -442,25 +222,6 @@ private void dtoToHostConnVo(HostConnectionVO hostConnectionVO, DevopsHostDTO de } } - /** - * 解决pull 镜像时间较长 - * 等3分钟 - */ - private void execPullImage(Session.Command cmd) { - for (int i = 0; i < 30; i++) { - if (cmd.getExitStatus() == null) { - LOGGER.info("Pulling the image!!!"); - try { - cmd.join(WAIT_SECONDS, TimeUnit.SECONDS); - } catch (ConnectionException e) { - LOGGER.error("Pulling the image failed", e); - } - } else { - break; - } - } - } - public void uploadPreProcessShell(SSHClient ssh, String suffix) { InputStream shellInputStream = DevopsClusterNodeServiceImpl.class.getResourceAsStream("/shell/pre-process.sh"); Map map = new HashMap<>(); diff --git a/src/main/java/io/kubernetes/client/models/V1NodeSelector.java b/src/main/java/io/kubernetes/client/models/V1NodeSelector.java deleted file mode 100644 index 62ec98b2ab..0000000000 --- a/src/main/java/io/kubernetes/client/models/V1NodeSelector.java +++ /dev/null @@ -1,74 +0,0 @@ -// -// Source code recreated from a .class file by IntelliJ IDEA -// (powered by Fernflower decompiler) -// - -package io.kubernetes.client.models; - -import com.google.gson.annotations.SerializedName; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; - -@ApiModel( - description = "A node selector represents the union of the results of one or more label queries over a set of nodes; that is, it represents the OR of the selectors represented by the node selector terms." -) -public class V1NodeSelector { - public static final String SERIALIZED_NAME_NODE_SELECTOR_TERMS = "nodeSelectorTerms"; - @SerializedName("nodeSelectorTerms") - private List nodeSelectorTerms = new ArrayList(); - - public V1NodeSelector() { - } - - public V1NodeSelector nodeSelectorTerms(List nodeSelectorTerms) { - this.nodeSelectorTerms = nodeSelectorTerms; - return this; - } - - public V1NodeSelector addNodeSelectorTermsItem(V1NodeSelectorTerm nodeSelectorTermsItem) { - this.nodeSelectorTerms.add(nodeSelectorTermsItem); - return this; - } - - @ApiModelProperty( - required = true, - value = "Required. A list of node selector terms. The terms are ORed." - ) - public List getNodeSelectorTerms() { - return this.nodeSelectorTerms; - } - - public void setNodeSelectorTerms(List nodeSelectorTerms) { - this.nodeSelectorTerms = nodeSelectorTerms; - } - - public boolean equals(Object o) { - if (this == o) { - return true; - } else if (o != null && this.getClass() == o.getClass()) { - V1NodeSelector v1NodeSelector = (V1NodeSelector)o; - return Objects.equals(this.nodeSelectorTerms, v1NodeSelector.nodeSelectorTerms); - } else { - return false; - } - } - - public int hashCode() { - return Objects.hash(new Object[]{this.nodeSelectorTerms}); - } - - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("class V1NodeSelector {\n"); - sb.append(" nodeSelectorTerms: ").append(this.toIndentedString(this.nodeSelectorTerms)).append("\n"); - sb.append("}"); - return sb.toString(); - } - - private String toIndentedString(Object o) { - return o == null ? "null" : o.toString().replace("\n", "\n "); - } -} diff --git a/src/main/java/io/kubernetes/client/models/V1NodeSelectorRequirement.java b/src/main/java/io/kubernetes/client/models/V1NodeSelectorRequirement.java deleted file mode 100644 index 991b6792fb..0000000000 --- a/src/main/java/io/kubernetes/client/models/V1NodeSelectorRequirement.java +++ /dev/null @@ -1,119 +0,0 @@ -// -// Source code recreated from a .class file by IntelliJ IDEA -// (powered by Fernflower decompiler) -// - -package io.kubernetes.client.models; - -import com.google.gson.annotations.SerializedName; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; -import javax.annotation.Nullable; - -@ApiModel( - description = "A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values." -) -public class V1NodeSelectorRequirement { - public static final String SERIALIZED_NAME_KEY = "key"; - @SerializedName("key") - private String key; - public static final String SERIALIZED_NAME_OPERATOR = "operator"; - @SerializedName("operator") - private String operator; - public static final String SERIALIZED_NAME_VALUES = "values"; - @SerializedName("values") - private List values = null; - - public V1NodeSelectorRequirement() { - } - - public V1NodeSelectorRequirement key(String key) { - this.key = key; - return this; - } - - @ApiModelProperty( - required = true, - value = "The label key that the selector applies to." - ) - public String getKey() { - return this.key; - } - - public void setKey(String key) { - this.key = key; - } - - public V1NodeSelectorRequirement operator(String operator) { - this.operator = operator; - return this; - } - - @ApiModelProperty( - required = true, - value = "Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt." - ) - public String getOperator() { - return this.operator; - } - - public void setOperator(String operator) { - this.operator = operator; - } - - public V1NodeSelectorRequirement values(List values) { - this.values = values; - return this; - } - - public V1NodeSelectorRequirement addValuesItem(String valuesItem) { - if (this.values == null) { - this.values = new ArrayList(); - } - - this.values.add(valuesItem); - return this; - } - - @Nullable - @ApiModelProperty("An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch.") - public List getValues() { - return this.values; - } - - public void setValues(List values) { - this.values = values; - } - - public boolean equals(Object o) { - if (this == o) { - return true; - } else if (o != null && this.getClass() == o.getClass()) { - V1NodeSelectorRequirement v1NodeSelectorRequirement = (V1NodeSelectorRequirement)o; - return Objects.equals(this.key, v1NodeSelectorRequirement.key) && Objects.equals(this.operator, v1NodeSelectorRequirement.operator) && Objects.equals(this.values, v1NodeSelectorRequirement.values); - } else { - return false; - } - } - - public int hashCode() { - return Objects.hash(new Object[]{this.key, this.operator, this.values}); - } - - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("class V1NodeSelectorRequirement {\n"); - sb.append(" key: ").append(this.toIndentedString(this.key)).append("\n"); - sb.append(" operator: ").append(this.toIndentedString(this.operator)).append("\n"); - sb.append(" values: ").append(this.toIndentedString(this.values)).append("\n"); - sb.append("}"); - return sb.toString(); - } - - private String toIndentedString(Object o) { - return o == null ? "null" : o.toString().replace("\n", "\n "); - } -} diff --git a/src/main/java/io/kubernetes/client/models/V1NodeSelectorTerm.java b/src/main/java/io/kubernetes/client/models/V1NodeSelectorTerm.java deleted file mode 100644 index f5b5d12acf..0000000000 --- a/src/main/java/io/kubernetes/client/models/V1NodeSelectorTerm.java +++ /dev/null @@ -1,107 +0,0 @@ -// -// Source code recreated from a .class file by IntelliJ IDEA -// (powered by Fernflower decompiler) -// - -package io.kubernetes.client.models; - -import com.google.gson.annotations.SerializedName; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; -import javax.annotation.Nullable; - -@ApiModel( - description = "A null or empty node selector term matches no objects. The requirements of them are ANDed. The TopologySelectorTerm type implements a subset of the NodeSelectorTerm." -) -public class V1NodeSelectorTerm { - public static final String SERIALIZED_NAME_MATCH_EXPRESSIONS = "matchExpressions"; - @SerializedName("matchExpressions") - private List matchExpressions = null; - public static final String SERIALIZED_NAME_MATCH_FIELDS = "matchFields"; - @SerializedName("matchFields") - private List matchFields = null; - - public V1NodeSelectorTerm() { - } - - public V1NodeSelectorTerm matchExpressions(List matchExpressions) { - this.matchExpressions = matchExpressions; - return this; - } - - public V1NodeSelectorTerm addMatchExpressionsItem(V1NodeSelectorRequirement matchExpressionsItem) { - if (this.matchExpressions == null) { - this.matchExpressions = new ArrayList(); - } - - this.matchExpressions.add(matchExpressionsItem); - return this; - } - - @Nullable - @ApiModelProperty("A list of node selector requirements by node's labels.") - public List getMatchExpressions() { - return this.matchExpressions; - } - - public void setMatchExpressions(List matchExpressions) { - this.matchExpressions = matchExpressions; - } - - public V1NodeSelectorTerm matchFields(List matchFields) { - this.matchFields = matchFields; - return this; - } - - public V1NodeSelectorTerm addMatchFieldsItem(V1NodeSelectorRequirement matchFieldsItem) { - if (this.matchFields == null) { - this.matchFields = new ArrayList<>(); - } - - this.matchFields.add(matchFieldsItem); - return this; - } - - @Nullable - @ApiModelProperty("A list of node selector requirements by node's fields.") - public List getMatchFields() { - return this.matchFields; - } - - public void setMatchFields(List matchFields) { - this.matchFields = matchFields; - } - - public boolean equals(Object o) { - if (this == o) { - return true; - } else if (o != null && this.getClass() == o.getClass()) { - V1NodeSelectorTerm v1NodeSelectorTerm = (V1NodeSelectorTerm)o; - return Objects.equals(this.matchExpressions, v1NodeSelectorTerm.matchExpressions) && Objects.equals(this.matchFields, v1NodeSelectorTerm.matchFields); - } else { - return false; - } - } - - @Override - public int hashCode() { - return Objects.hash(new Object[]{this.matchExpressions, this.matchFields}); - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("class V1NodeSelectorTerm {\n"); - sb.append(" matchExpressions: ").append(this.toIndentedString(this.matchExpressions)).append("\n"); - sb.append(" matchFields: ").append(this.toIndentedString(this.matchFields)).append("\n"); - sb.append("}"); - return sb.toString(); - } - - private String toIndentedString(Object o) { - return o == null ? "null" : o.toString().replace("\n", "\n "); - } -} diff --git a/src/main/java/io/kubernetes/client/models/V1PersistentVolumeSpec.java b/src/main/java/io/kubernetes/client/models/V1PersistentVolumeSpec.java deleted file mode 100644 index 8223daebe2..0000000000 --- a/src/main/java/io/kubernetes/client/models/V1PersistentVolumeSpec.java +++ /dev/null @@ -1,548 +0,0 @@ -// -// Source code recreated from a .class file by IntelliJ IDEA -// (powered by Fernflower decompiler) -// - -package io.kubernetes.client.models; - -import java.util.*; - -import com.google.gson.annotations.SerializedName; -import io.kubernetes.client.custom.Quantity; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; - -@ApiModel( - description = "PersistentVolumeSpec is the specification of a persistent volume." -) -public class V1PersistentVolumeSpec { - @SerializedName("accessModes") - private List accessModes = null; - @SerializedName("awsElasticBlockStore") - private V1AWSElasticBlockStoreVolumeSource awsElasticBlockStore = null; - @SerializedName("azureDisk") - private V1AzureDiskVolumeSource azureDisk = null; - @SerializedName("azureFile") - private V1AzureFilePersistentVolumeSource azureFile = null; - @SerializedName("capacity") - private Map capacity = null; - @SerializedName("cephfs") - private V1CephFSPersistentVolumeSource cephfs = null; - @SerializedName("cinder") - private V1CinderVolumeSource cinder = null; - @SerializedName("claimRef") - private V1ObjectReference claimRef = null; - @SerializedName("fc") - private V1FCVolumeSource fc = null; - @SerializedName("flexVolume") - private V1FlexVolumeSource flexVolume = null; - @SerializedName("flocker") - private V1FlockerVolumeSource flocker = null; - @SerializedName("gcePersistentDisk") - private V1GCEPersistentDiskVolumeSource gcePersistentDisk = null; - @SerializedName("glusterfs") - private V1GlusterfsVolumeSource glusterfs = null; - @SerializedName("hostPath") - private V1HostPathVolumeSource hostPath = null; - @SerializedName("iscsi") - private V1ISCSIVolumeSource iscsi = null; - @SerializedName("local") - private V1LocalVolumeSource local = null; - @SerializedName("mountOptions") - private List mountOptions = null; - @SerializedName("nfs") - private V1NFSVolumeSource nfs = null; - @SerializedName("persistentVolumeReclaimPolicy") - private String persistentVolumeReclaimPolicy = null; - @SerializedName("photonPersistentDisk") - private V1PhotonPersistentDiskVolumeSource photonPersistentDisk = null; - @SerializedName("portworxVolume") - private V1PortworxVolumeSource portworxVolume = null; - @SerializedName("quobyte") - private V1QuobyteVolumeSource quobyte = null; - @SerializedName("rbd") - private V1RBDVolumeSource rbd = null; - @SerializedName("scaleIO") - private V1ScaleIOPersistentVolumeSource scaleIO = null; - @SerializedName("storageClassName") - private String storageClassName = null; - @SerializedName("storageos") - private V1StorageOSPersistentVolumeSource storageos = null; - @SerializedName("vsphereVolume") - private V1VsphereVirtualDiskVolumeSource vsphereVolume = null; - @SerializedName("nodeAffinity") - private V1VolumeNodeAffinity nodeAffinity; - - public V1PersistentVolumeSpec() { - } - - public V1PersistentVolumeSpec accessModes(List accessModes) { - this.accessModes = accessModes; - return this; - } - - public V1PersistentVolumeSpec addAccessModesItem(String accessModesItem) { - if (this.accessModes == null) { - this.accessModes = new ArrayList<>(); - } - - this.accessModes.add(accessModesItem); - return this; - } - - @ApiModelProperty("AccessModes contains all ways the volume can be mounted. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes") - public List getAccessModes() { - return this.accessModes; - } - - public void setAccessModes(List accessModes) { - this.accessModes = accessModes; - } - - public V1PersistentVolumeSpec awsElasticBlockStore(V1AWSElasticBlockStoreVolumeSource awsElasticBlockStore) { - this.awsElasticBlockStore = awsElasticBlockStore; - return this; - } - - @ApiModelProperty("AWSElasticBlockStore represents an AWS Disk resource that is attached to a kubelet's host machine and then exposed to the pod. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore") - public V1AWSElasticBlockStoreVolumeSource getAwsElasticBlockStore() { - return this.awsElasticBlockStore; - } - - public void setAwsElasticBlockStore(V1AWSElasticBlockStoreVolumeSource awsElasticBlockStore) { - this.awsElasticBlockStore = awsElasticBlockStore; - } - - public V1PersistentVolumeSpec azureDisk(V1AzureDiskVolumeSource azureDisk) { - this.azureDisk = azureDisk; - return this; - } - - @ApiModelProperty("AzureDisk represents an Azure Data Disk mount on the host and bind mount to the pod.") - public V1AzureDiskVolumeSource getAzureDisk() { - return this.azureDisk; - } - - public void setAzureDisk(V1AzureDiskVolumeSource azureDisk) { - this.azureDisk = azureDisk; - } - - public V1PersistentVolumeSpec azureFile(V1AzureFilePersistentVolumeSource azureFile) { - this.azureFile = azureFile; - return this; - } - - @ApiModelProperty("AzureFile represents an Azure File Service mount on the host and bind mount to the pod.") - public V1AzureFilePersistentVolumeSource getAzureFile() { - return this.azureFile; - } - - public void setAzureFile(V1AzureFilePersistentVolumeSource azureFile) { - this.azureFile = azureFile; - } - - public V1PersistentVolumeSpec capacity(Map capacity) { - this.capacity = capacity; - return this; - } - - public V1PersistentVolumeSpec putCapacityItem(String key, Quantity capacityItem) { - if (this.capacity == null) { - this.capacity = new HashMap<>(); - } - - this.capacity.put(key, capacityItem); - return this; - } - - @ApiModelProperty("A description of the persistent volume's resources and capacity. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#capacity") - public Map getCapacity() { - return this.capacity; - } - - public void setCapacity(Map capacity) { - this.capacity = capacity; - } - - public V1PersistentVolumeSpec cephfs(V1CephFSPersistentVolumeSource cephfs) { - this.cephfs = cephfs; - return this; - } - - @ApiModelProperty("CephFS represents a Ceph FS mount on the host that shares a pod's lifetime") - public V1CephFSPersistentVolumeSource getCephfs() { - return this.cephfs; - } - - public void setCephfs(V1CephFSPersistentVolumeSource cephfs) { - this.cephfs = cephfs; - } - - public V1PersistentVolumeSpec cinder(V1CinderVolumeSource cinder) { - this.cinder = cinder; - return this; - } - - @ApiModelProperty("Cinder represents a cinder volume attached and mounted on kubelets host machine More info: https://releases.k8s.io/HEAD/examples/mysql-cinder-pd/README.md") - public V1CinderVolumeSource getCinder() { - return this.cinder; - } - - public void setCinder(V1CinderVolumeSource cinder) { - this.cinder = cinder; - } - - public V1PersistentVolumeSpec claimRef(V1ObjectReference claimRef) { - this.claimRef = claimRef; - return this; - } - - @ApiModelProperty("ClaimRef is part of a bi-directional binding between PersistentVolume and PersistentVolumeClaim. Expected to be non-nil when bound. claim.VolumeName is the authoritative bind between PV and PVC. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#binding") - public V1ObjectReference getClaimRef() { - return this.claimRef; - } - - public void setClaimRef(V1ObjectReference claimRef) { - this.claimRef = claimRef; - } - - public V1PersistentVolumeSpec fc(V1FCVolumeSource fc) { - this.fc = fc; - return this; - } - - @ApiModelProperty("FC represents a Fibre Channel resource that is attached to a kubelet's host machine and then exposed to the pod.") - public V1FCVolumeSource getFc() { - return this.fc; - } - - public void setFc(V1FCVolumeSource fc) { - this.fc = fc; - } - - public V1PersistentVolumeSpec flexVolume(V1FlexVolumeSource flexVolume) { - this.flexVolume = flexVolume; - return this; - } - - @ApiModelProperty("FlexVolume represents a generic volume resource that is provisioned/attached using an exec based plugin. This is an alpha feature and may change in future.") - public V1FlexVolumeSource getFlexVolume() { - return this.flexVolume; - } - - public void setFlexVolume(V1FlexVolumeSource flexVolume) { - this.flexVolume = flexVolume; - } - - public V1PersistentVolumeSpec flocker(V1FlockerVolumeSource flocker) { - this.flocker = flocker; - return this; - } - - @ApiModelProperty("Flocker represents a Flocker volume attached to a kubelet's host machine and exposed to the pod for its usage. This depends on the Flocker control service being running") - public V1FlockerVolumeSource getFlocker() { - return this.flocker; - } - - public void setFlocker(V1FlockerVolumeSource flocker) { - this.flocker = flocker; - } - - public V1PersistentVolumeSpec gcePersistentDisk(V1GCEPersistentDiskVolumeSource gcePersistentDisk) { - this.gcePersistentDisk = gcePersistentDisk; - return this; - } - - @ApiModelProperty("GCEPersistentDisk represents a GCE Disk resource that is attached to a kubelet's host machine and then exposed to the pod. Provisioned by an admin. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk") - public V1GCEPersistentDiskVolumeSource getGcePersistentDisk() { - return this.gcePersistentDisk; - } - - public void setGcePersistentDisk(V1GCEPersistentDiskVolumeSource gcePersistentDisk) { - this.gcePersistentDisk = gcePersistentDisk; - } - - public V1PersistentVolumeSpec glusterfs(V1GlusterfsVolumeSource glusterfs) { - this.glusterfs = glusterfs; - return this; - } - - @ApiModelProperty("Glusterfs represents a Glusterfs volume that is attached to a host and exposed to the pod. Provisioned by an admin. More info: https://releases.k8s.io/HEAD/examples/volumes/glusterfs/README.md") - public V1GlusterfsVolumeSource getGlusterfs() { - return this.glusterfs; - } - - public void setGlusterfs(V1GlusterfsVolumeSource glusterfs) { - this.glusterfs = glusterfs; - } - - public V1PersistentVolumeSpec hostPath(V1HostPathVolumeSource hostPath) { - this.hostPath = hostPath; - return this; - } - - @ApiModelProperty("HostPath represents a directory on the host. Provisioned by a developer or tester. This is useful for single-node development and testing only! On-host storage is not supported in any way and WILL NOT WORK in a multi-node cluster. More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath") - public V1HostPathVolumeSource getHostPath() { - return this.hostPath; - } - - public void setHostPath(V1HostPathVolumeSource hostPath) { - this.hostPath = hostPath; - } - - public V1PersistentVolumeSpec iscsi(V1ISCSIVolumeSource iscsi) { - this.iscsi = iscsi; - return this; - } - - @ApiModelProperty("ISCSI represents an ISCSI Disk resource that is attached to a kubelet's host machine and then exposed to the pod. Provisioned by an admin.") - public V1ISCSIVolumeSource getIscsi() { - return this.iscsi; - } - - public void setIscsi(V1ISCSIVolumeSource iscsi) { - this.iscsi = iscsi; - } - - public V1PersistentVolumeSpec local(V1LocalVolumeSource local) { - this.local = local; - return this; - } - - @ApiModelProperty("Local represents directly-attached storage with node affinity") - public V1LocalVolumeSource getLocal() { - return this.local; - } - - public void setLocal(V1LocalVolumeSource local) { - this.local = local; - } - - public V1PersistentVolumeSpec mountOptions(List mountOptions) { - this.mountOptions = mountOptions; - return this; - } - - public V1PersistentVolumeSpec addMountOptionsItem(String mountOptionsItem) { - if (this.mountOptions == null) { - this.mountOptions = new ArrayList<>(); - } - - this.mountOptions.add(mountOptionsItem); - return this; - } - - @ApiModelProperty("A list of mount options, e.g. [\"ro\", \"soft\"]. Not validated - mount will simply fail if one is invalid. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes/#mount-options") - public List getMountOptions() { - return this.mountOptions; - } - - public void setMountOptions(List mountOptions) { - this.mountOptions = mountOptions; - } - - public V1PersistentVolumeSpec nfs(V1NFSVolumeSource nfs) { - this.nfs = nfs; - return this; - } - - @ApiModelProperty("NFS represents an NFS mount on the host. Provisioned by an admin. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs") - public V1NFSVolumeSource getNfs() { - return this.nfs; - } - - public void setNfs(V1NFSVolumeSource nfs) { - this.nfs = nfs; - } - - public V1PersistentVolumeSpec persistentVolumeReclaimPolicy(String persistentVolumeReclaimPolicy) { - this.persistentVolumeReclaimPolicy = persistentVolumeReclaimPolicy; - return this; - } - - @ApiModelProperty("What happens to a persistent volume when released from its claim. Valid options are Retain (default) and Recycle. Recycling must be supported by the volume plugin underlying this persistent volume. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#reclaiming") - public String getPersistentVolumeReclaimPolicy() { - return this.persistentVolumeReclaimPolicy; - } - - public void setPersistentVolumeReclaimPolicy(String persistentVolumeReclaimPolicy) { - this.persistentVolumeReclaimPolicy = persistentVolumeReclaimPolicy; - } - - public V1PersistentVolumeSpec photonPersistentDisk(V1PhotonPersistentDiskVolumeSource photonPersistentDisk) { - this.photonPersistentDisk = photonPersistentDisk; - return this; - } - - @ApiModelProperty("PhotonPersistentDisk represents a PhotonController persistent disk attached and mounted on kubelets host machine") - public V1PhotonPersistentDiskVolumeSource getPhotonPersistentDisk() { - return this.photonPersistentDisk; - } - - public void setPhotonPersistentDisk(V1PhotonPersistentDiskVolumeSource photonPersistentDisk) { - this.photonPersistentDisk = photonPersistentDisk; - } - - public V1PersistentVolumeSpec portworxVolume(V1PortworxVolumeSource portworxVolume) { - this.portworxVolume = portworxVolume; - return this; - } - - @ApiModelProperty("PortworxVolume represents a portworx volume attached and mounted on kubelets host machine") - public V1PortworxVolumeSource getPortworxVolume() { - return this.portworxVolume; - } - - public void setPortworxVolume(V1PortworxVolumeSource portworxVolume) { - this.portworxVolume = portworxVolume; - } - - public V1PersistentVolumeSpec quobyte(V1QuobyteVolumeSource quobyte) { - this.quobyte = quobyte; - return this; - } - - @ApiModelProperty("Quobyte represents a Quobyte mount on the host that shares a pod's lifetime") - public V1QuobyteVolumeSource getQuobyte() { - return this.quobyte; - } - - public void setQuobyte(V1QuobyteVolumeSource quobyte) { - this.quobyte = quobyte; - } - - public V1PersistentVolumeSpec rbd(V1RBDVolumeSource rbd) { - this.rbd = rbd; - return this; - } - - @ApiModelProperty("RBD represents a Rados Block Device mount on the host that shares a pod's lifetime. More info: https://releases.k8s.io/HEAD/examples/volumes/rbd/README.md") - public V1RBDVolumeSource getRbd() { - return this.rbd; - } - - public void setRbd(V1RBDVolumeSource rbd) { - this.rbd = rbd; - } - - public V1PersistentVolumeSpec scaleIO(V1ScaleIOPersistentVolumeSource scaleIO) { - this.scaleIO = scaleIO; - return this; - } - - @ApiModelProperty("ScaleIO represents a ScaleIO persistent volume attached and mounted on Kubernetes nodes.") - public V1ScaleIOPersistentVolumeSource getScaleIO() { - return this.scaleIO; - } - - public void setScaleIO(V1ScaleIOPersistentVolumeSource scaleIO) { - this.scaleIO = scaleIO; - } - - public V1PersistentVolumeSpec storageClassName(String storageClassName) { - this.storageClassName = storageClassName; - return this; - } - - @ApiModelProperty("Name of StorageClass to which this persistent volume belongs. Empty value means that this volume does not belong to any StorageClass.") - public String getStorageClassName() { - return this.storageClassName; - } - - public void setStorageClassName(String storageClassName) { - this.storageClassName = storageClassName; - } - - public V1PersistentVolumeSpec storageos(V1StorageOSPersistentVolumeSource storageos) { - this.storageos = storageos; - return this; - } - - @ApiModelProperty("StorageOS represents a StorageOS volume that is attached to the kubelet's host machine and mounted into the pod More info: https://releases.k8s.io/HEAD/examples/volumes/storageos/README.md") - public V1StorageOSPersistentVolumeSource getStorageos() { - return this.storageos; - } - - public void setStorageos(V1StorageOSPersistentVolumeSource storageos) { - this.storageos = storageos; - } - - public V1PersistentVolumeSpec vsphereVolume(V1VsphereVirtualDiskVolumeSource vsphereVolume) { - this.vsphereVolume = vsphereVolume; - return this; - } - - @ApiModelProperty("VsphereVolume represents a vSphere volume attached and mounted on kubelets host machine") - public V1VsphereVirtualDiskVolumeSource getVsphereVolume() { - return this.vsphereVolume; - } - - public void setVsphereVolume(V1VsphereVirtualDiskVolumeSource vsphereVolume) { - this.vsphereVolume = vsphereVolume; - } - - @ApiModelProperty("V1VolumeNodeAffinity represents node that volume will be bound to") - public V1VolumeNodeAffinity getNodeAffinity() { - return nodeAffinity; - } - - public void setNodeAffinity(V1VolumeNodeAffinity nodeAffinity) { - this.nodeAffinity = nodeAffinity; - } - - public boolean equals(Object o) { - if (this == o) { - return true; - } else if (o != null && this.getClass() == o.getClass()) { - V1PersistentVolumeSpec v1PersistentVolumeSpec = (V1PersistentVolumeSpec) o; - return Objects.equals(this.accessModes, v1PersistentVolumeSpec.accessModes) && Objects.equals(this.awsElasticBlockStore, v1PersistentVolumeSpec.awsElasticBlockStore) && Objects.equals(this.azureDisk, v1PersistentVolumeSpec.azureDisk) && Objects.equals(this.azureFile, v1PersistentVolumeSpec.azureFile) && Objects.equals(this.capacity, v1PersistentVolumeSpec.capacity) && Objects.equals(this.cephfs, v1PersistentVolumeSpec.cephfs) && Objects.equals(this.cinder, v1PersistentVolumeSpec.cinder) && Objects.equals(this.claimRef, v1PersistentVolumeSpec.claimRef) && Objects.equals(this.fc, v1PersistentVolumeSpec.fc) && Objects.equals(this.flexVolume, v1PersistentVolumeSpec.flexVolume) && Objects.equals(this.flocker, v1PersistentVolumeSpec.flocker) && Objects.equals(this.gcePersistentDisk, v1PersistentVolumeSpec.gcePersistentDisk) && Objects.equals(this.glusterfs, v1PersistentVolumeSpec.glusterfs) && Objects.equals(this.hostPath, v1PersistentVolumeSpec.hostPath) && Objects.equals(this.iscsi, v1PersistentVolumeSpec.iscsi) && Objects.equals(this.local, v1PersistentVolumeSpec.local) && Objects.equals(this.mountOptions, v1PersistentVolumeSpec.mountOptions) && Objects.equals(this.nfs, v1PersistentVolumeSpec.nfs) && Objects.equals(this.persistentVolumeReclaimPolicy, v1PersistentVolumeSpec.persistentVolumeReclaimPolicy) && Objects.equals(this.photonPersistentDisk, v1PersistentVolumeSpec.photonPersistentDisk) && Objects.equals(this.portworxVolume, v1PersistentVolumeSpec.portworxVolume) && Objects.equals(this.quobyte, v1PersistentVolumeSpec.quobyte) && Objects.equals(this.rbd, v1PersistentVolumeSpec.rbd) && Objects.equals(this.scaleIO, v1PersistentVolumeSpec.scaleIO) && Objects.equals(this.storageClassName, v1PersistentVolumeSpec.storageClassName) && Objects.equals(this.storageos, v1PersistentVolumeSpec.storageos) && Objects.equals(this.vsphereVolume, v1PersistentVolumeSpec.vsphereVolume) && Objects.equals(this.nodeAffinity, v1PersistentVolumeSpec.nodeAffinity); - } else { - return false; - } - } - - @Override - public int hashCode() { - return Objects.hash(new Object[]{this.accessModes, this.awsElasticBlockStore, this.azureDisk, this.azureFile, this.capacity, this.cephfs, this.cinder, this.claimRef, this.fc, this.flexVolume, this.flocker, this.gcePersistentDisk, this.glusterfs, this.hostPath, this.iscsi, this.local, this.mountOptions, this.nfs, this.persistentVolumeReclaimPolicy, this.photonPersistentDisk, this.portworxVolume, this.quobyte, this.rbd, this.scaleIO, this.storageClassName, this.storageos, this.vsphereVolume, this.nodeAffinity}); - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("class V1PersistentVolumeSpec {\n"); - sb.append(" accessModes: ").append(this.toIndentedString(this.accessModes)).append("\n"); - sb.append(" awsElasticBlockStore: ").append(this.toIndentedString(this.awsElasticBlockStore)).append("\n"); - sb.append(" azureDisk: ").append(this.toIndentedString(this.azureDisk)).append("\n"); - sb.append(" azureFile: ").append(this.toIndentedString(this.azureFile)).append("\n"); - sb.append(" capacity: ").append(this.toIndentedString(this.capacity)).append("\n"); - sb.append(" cephfs: ").append(this.toIndentedString(this.cephfs)).append("\n"); - sb.append(" cinder: ").append(this.toIndentedString(this.cinder)).append("\n"); - sb.append(" claimRef: ").append(this.toIndentedString(this.claimRef)).append("\n"); - sb.append(" fc: ").append(this.toIndentedString(this.fc)).append("\n"); - sb.append(" flexVolume: ").append(this.toIndentedString(this.flexVolume)).append("\n"); - sb.append(" flocker: ").append(this.toIndentedString(this.flocker)).append("\n"); - sb.append(" gcePersistentDisk: ").append(this.toIndentedString(this.gcePersistentDisk)).append("\n"); - sb.append(" glusterfs: ").append(this.toIndentedString(this.glusterfs)).append("\n"); - sb.append(" hostPath: ").append(this.toIndentedString(this.hostPath)).append("\n"); - sb.append(" iscsi: ").append(this.toIndentedString(this.iscsi)).append("\n"); - sb.append(" local: ").append(this.toIndentedString(this.local)).append("\n"); - sb.append(" mountOptions: ").append(this.toIndentedString(this.mountOptions)).append("\n"); - sb.append(" nfs: ").append(this.toIndentedString(this.nfs)).append("\n"); - sb.append(" persistentVolumeReclaimPolicy: ").append(this.toIndentedString(this.persistentVolumeReclaimPolicy)).append("\n"); - sb.append(" photonPersistentDisk: ").append(this.toIndentedString(this.photonPersistentDisk)).append("\n"); - sb.append(" portworxVolume: ").append(this.toIndentedString(this.portworxVolume)).append("\n"); - sb.append(" quobyte: ").append(this.toIndentedString(this.quobyte)).append("\n"); - sb.append(" rbd: ").append(this.toIndentedString(this.rbd)).append("\n"); - sb.append(" scaleIO: ").append(this.toIndentedString(this.scaleIO)).append("\n"); - sb.append(" storageClassName: ").append(this.toIndentedString(this.storageClassName)).append("\n"); - sb.append(" storageos: ").append(this.toIndentedString(this.storageos)).append("\n"); - sb.append(" vsphereVolume: ").append(this.toIndentedString(this.vsphereVolume)).append("\n"); - sb.append(" nodeAffinity: ").append(this.toIndentedString(this.nodeAffinity)).append("\n"); - sb.append("}"); - return sb.toString(); - } - - private String toIndentedString(Object o) { - return o == null ? "null" : o.toString().replace("\n", "\n "); - } -} diff --git a/src/main/java/io/kubernetes/client/models/V1PodDNSConfig.java b/src/main/java/io/kubernetes/client/models/V1PodDNSConfig.java deleted file mode 100644 index 1025432e0e..0000000000 --- a/src/main/java/io/kubernetes/client/models/V1PodDNSConfig.java +++ /dev/null @@ -1,133 +0,0 @@ -// -// Source code recreated from a .class file by IntelliJ IDEA -// (powered by FernFlower decompiler) -// - -package io.kubernetes.client.models; - -import com.google.gson.annotations.SerializedName; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; -import javax.annotation.Nullable; - -@ApiModel( - description = "PodDNSConfig defines the DNS parameters of a pod in addition to those generated from DNSPolicy." -) -public class V1PodDNSConfig { - public static final String SERIALIZED_NAME_NAMESERVERS = "nameservers"; - @SerializedName("nameservers") - private List nameservers = null; - public static final String SERIALIZED_NAME_OPTIONS = "options"; - @SerializedName("options") - private List options = null; - public static final String SERIALIZED_NAME_SEARCHES = "searches"; - @SerializedName("searches") - private List searches = null; - - public V1PodDNSConfig() { - } - - public V1PodDNSConfig nameservers(List nameservers) { - this.nameservers = nameservers; - return this; - } - - public V1PodDNSConfig addNameserversItem(String nameserversItem) { - if (this.nameservers == null) { - this.nameservers = new ArrayList(); - } - - this.nameservers.add(nameserversItem); - return this; - } - - @Nullable - @ApiModelProperty("A list of DNS name server IP addresses. This will be appended to the base nameservers generated from DNSPolicy. Duplicated nameservers will be removed.") - public List getNameservers() { - return this.nameservers; - } - - public void setNameservers(List nameservers) { - this.nameservers = nameservers; - } - - public V1PodDNSConfig options(List options) { - this.options = options; - return this; - } - - public V1PodDNSConfig addOptionsItem(V1PodDNSConfigOption optionsItem) { - if (this.options == null) { - this.options = new ArrayList(); - } - - this.options.add(optionsItem); - return this; - } - - @Nullable - @ApiModelProperty("A list of DNS resolver options. This will be merged with the base options generated from DNSPolicy. Duplicated entries will be removed. Resolution options given in Options will override those that appear in the base DNSPolicy.") - public List getOptions() { - return this.options; - } - - public void setOptions(List options) { - this.options = options; - } - - public V1PodDNSConfig searches(List searches) { - this.searches = searches; - return this; - } - - public V1PodDNSConfig addSearchesItem(String searchesItem) { - if (this.searches == null) { - this.searches = new ArrayList(); - } - - this.searches.add(searchesItem); - return this; - } - - @Nullable - @ApiModelProperty("A list of DNS search domains for host-name lookup. This will be appended to the base search paths generated from DNSPolicy. Duplicated search paths will be removed.") - public List getSearches() { - return this.searches; - } - - public void setSearches(List searches) { - this.searches = searches; - } - - public boolean equals(Object o) { - if (this == o) { - return true; - } else if (o != null && this.getClass() == o.getClass()) { - V1PodDNSConfig v1PodDNSConfig = (V1PodDNSConfig)o; - return Objects.equals(this.nameservers, v1PodDNSConfig.nameservers) && Objects.equals(this.options, v1PodDNSConfig.options) && Objects.equals(this.searches, v1PodDNSConfig.searches); - } else { - return false; - } - } - - public int hashCode() { - return Objects.hash(new Object[]{this.nameservers, this.options, this.searches}); - } - - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("class V1PodDNSConfig {\n"); - sb.append(" nameservers: ").append(this.toIndentedString(this.nameservers)).append("\n"); - sb.append(" options: ").append(this.toIndentedString(this.options)).append("\n"); - sb.append(" searches: ").append(this.toIndentedString(this.searches)).append("\n"); - sb.append("}"); - return sb.toString(); - } - - private String toIndentedString(Object o) { - return o == null ? "null" : o.toString().replace("\n", "\n "); - } -} diff --git a/src/main/java/io/kubernetes/client/models/V1PodDNSConfigOption.java b/src/main/java/io/kubernetes/client/models/V1PodDNSConfigOption.java deleted file mode 100644 index 99260529eb..0000000000 --- a/src/main/java/io/kubernetes/client/models/V1PodDNSConfigOption.java +++ /dev/null @@ -1,85 +0,0 @@ -// -// Source code recreated from a .class file by IntelliJ IDEA -// (powered by FernFlower decompiler) -// - -package io.kubernetes.client.models; - -import com.google.gson.annotations.SerializedName; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import java.util.Objects; -import javax.annotation.Nullable; - -@ApiModel( - description = "PodDNSConfigOption defines DNS resolver options of a pod." -) -public class V1PodDNSConfigOption { - public static final String SERIALIZED_NAME_NAME = "name"; - @SerializedName("name") - private String name; - public static final String SERIALIZED_NAME_VALUE = "value"; - @SerializedName("value") - private String value; - - public V1PodDNSConfigOption() { - } - - public V1PodDNSConfigOption name(String name) { - this.name = name; - return this; - } - - @Nullable - @ApiModelProperty("Required.") - public String getName() { - return this.name; - } - - public void setName(String name) { - this.name = name; - } - - public V1PodDNSConfigOption value(String value) { - this.value = value; - return this; - } - - @Nullable - @ApiModelProperty("") - public String getValue() { - return this.value; - } - - public void setValue(String value) { - this.value = value; - } - - public boolean equals(Object o) { - if (this == o) { - return true; - } else if (o != null && this.getClass() == o.getClass()) { - V1PodDNSConfigOption v1PodDNSConfigOption = (V1PodDNSConfigOption)o; - return Objects.equals(this.name, v1PodDNSConfigOption.name) && Objects.equals(this.value, v1PodDNSConfigOption.value); - } else { - return false; - } - } - - public int hashCode() { - return Objects.hash(new Object[]{this.name, this.value}); - } - - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("class V1PodDNSConfigOption {\n"); - sb.append(" name: ").append(this.toIndentedString(this.name)).append("\n"); - sb.append(" value: ").append(this.toIndentedString(this.value)).append("\n"); - sb.append("}"); - return sb.toString(); - } - - private String toIndentedString(Object o) { - return o == null ? "null" : o.toString().replace("\n", "\n "); - } -} diff --git a/src/main/java/io/kubernetes/client/models/V1PodSpec.java b/src/main/java/io/kubernetes/client/models/V1PodSpec.java deleted file mode 100644 index cf31133366..0000000000 --- a/src/main/java/io/kubernetes/client/models/V1PodSpec.java +++ /dev/null @@ -1,549 +0,0 @@ -// -// Source code recreated from a .class file by IntelliJ IDEA -// (powered by FernFlower decompiler) -// - -package io.kubernetes.client.models; - -import java.util.*; - -import com.google.gson.annotations.SerializedName; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; - -@ApiModel( - description = "PodSpec is a description of a pod." -) -public class V1PodSpec { - @SerializedName("activeDeadlineSeconds") - private Long activeDeadlineSeconds = null; - @SerializedName("affinity") - private V1Affinity affinity = null; - @SerializedName("automountServiceAccountToken") - private Boolean automountServiceAccountToken = null; - @SerializedName("containers") - private List containers = new ArrayList(); - @SerializedName("dnsPolicy") - private String dnsPolicy = null; - @SerializedName("dnsConfig") - private V1PodDNSConfig dnsConfig = null; - @SerializedName("hostAliases") - private List hostAliases = null; - @SerializedName("hostIPC") - private Boolean hostIPC = null; - @SerializedName("hostNetwork") - private Boolean hostNetwork = null; - @SerializedName("hostPID") - private Boolean hostPID = null; - @SerializedName("hostname") - private String hostname = null; - @SerializedName("imagePullSecrets") - private List imagePullSecrets = null; - @SerializedName("initContainers") - private List initContainers = null; - @SerializedName("nodeName") - private String nodeName = null; - @SerializedName("nodeSelector") - private Map nodeSelector = null; - @SerializedName("priority") - private Integer priority = null; - @SerializedName("priorityClassName") - private String priorityClassName = null; - @SerializedName("restartPolicy") - private String restartPolicy = null; - @SerializedName("schedulerName") - private String schedulerName = null; - @SerializedName("securityContext") - private V1PodSecurityContext securityContext = null; - @SerializedName("serviceAccount") - private String serviceAccount = null; - @SerializedName("serviceAccountName") - private String serviceAccountName = null; - @SerializedName("subdomain") - private String subdomain = null; - @SerializedName("terminationGracePeriodSeconds") - private Long terminationGracePeriodSeconds = null; - @SerializedName("tolerations") - private List tolerations = null; - @SerializedName("volumes") - private List volumes = null; - - public V1PodSpec() { - } - - public V1PodSpec activeDeadlineSeconds(Long activeDeadlineSeconds) { - this.activeDeadlineSeconds = activeDeadlineSeconds; - return this; - } - - @ApiModelProperty("Optional duration in seconds the pod may be active on the node relative to StartTime before the system will actively try to mark it failed and kill associated containers. Value must be a positive integer.") - public Long getActiveDeadlineSeconds() { - return this.activeDeadlineSeconds; - } - - public void setActiveDeadlineSeconds(Long activeDeadlineSeconds) { - this.activeDeadlineSeconds = activeDeadlineSeconds; - } - - public V1PodSpec affinity(V1Affinity affinity) { - this.affinity = affinity; - return this; - } - - @ApiModelProperty("If specified, the pod's scheduling constraints") - public V1Affinity getAffinity() { - return this.affinity; - } - - public void setAffinity(V1Affinity affinity) { - this.affinity = affinity; - } - - public V1PodSpec automountServiceAccountToken(Boolean automountServiceAccountToken) { - this.automountServiceAccountToken = automountServiceAccountToken; - return this; - } - - @ApiModelProperty("AutomountServiceAccountToken indicates whether a service account token should be automatically mounted.") - public Boolean isAutomountServiceAccountToken() { - return this.automountServiceAccountToken; - } - - public void setAutomountServiceAccountToken(Boolean automountServiceAccountToken) { - this.automountServiceAccountToken = automountServiceAccountToken; - } - - public V1PodSpec containers(List containers) { - this.containers = containers; - return this; - } - - public V1PodSpec addContainersItem(V1Container containersItem) { - this.containers.add(containersItem); - return this; - } - - @ApiModelProperty( - required = true, - value = "List of containers belonging to the pod. Containers cannot currently be added or removed. There must be at least one container in a Pod. Cannot be updated." - ) - public List getContainers() { - return this.containers; - } - - public void setContainers(List containers) { - this.containers = containers; - } - - public V1PodSpec dnsPolicy(String dnsPolicy) { - this.dnsPolicy = dnsPolicy; - return this; - } - - public V1PodSpec dnsConfig(V1PodDNSConfig v1PodDNSConfig) { - this.dnsConfig = v1PodDNSConfig; - return this; - } - - public V1PodDNSConfig getDnsConfig() { - return dnsConfig; - } - - public void setDnsConfig(V1PodDNSConfig dnsConfig) { - this.dnsConfig = dnsConfig; - } - - @ApiModelProperty("Set DNS policy for containers within the pod. One of 'ClusterFirstWithHostNet', 'ClusterFirst' or 'Default'. Defaults to \"ClusterFirst\". To have DNS options set along with hostNetwork, you have to specify DNS policy explicitly to 'ClusterFirstWithHostNet'.") - public String getDnsPolicy() { - return this.dnsPolicy; - } - - public void setDnsPolicy(String dnsPolicy) { - this.dnsPolicy = dnsPolicy; - } - - public V1PodSpec hostAliases(List hostAliases) { - this.hostAliases = hostAliases; - return this; - } - - public V1PodSpec addHostAliasesItem(V1HostAlias hostAliasesItem) { - if (this.hostAliases == null) { - this.hostAliases = new ArrayList(); - } - - this.hostAliases.add(hostAliasesItem); - return this; - } - - @ApiModelProperty("HostAliases is an optional list of hosts and IPs that will be injected into the pod's hosts file if specified. This is only valid for non-hostNetwork pods.") - public List getHostAliases() { - return this.hostAliases; - } - - public void setHostAliases(List hostAliases) { - this.hostAliases = hostAliases; - } - - public V1PodSpec hostIPC(Boolean hostIPC) { - this.hostIPC = hostIPC; - return this; - } - - @ApiModelProperty("Use the host's ipc namespace. Optional: Default to false.") - public Boolean isHostIPC() { - return this.hostIPC; - } - - public void setHostIPC(Boolean hostIPC) { - this.hostIPC = hostIPC; - } - - public V1PodSpec hostNetwork(Boolean hostNetwork) { - this.hostNetwork = hostNetwork; - return this; - } - - @ApiModelProperty("Host networking requested for this pod. Use the host's network namespace. If this option is set, the ports that will be used must be specified. Default to false.") - public Boolean isHostNetwork() { - return this.hostNetwork; - } - - public void setHostNetwork(Boolean hostNetwork) { - this.hostNetwork = hostNetwork; - } - - public V1PodSpec hostPID(Boolean hostPID) { - this.hostPID = hostPID; - return this; - } - - @ApiModelProperty("Use the host's pid namespace. Optional: Default to false.") - public Boolean isHostPID() { - return this.hostPID; - } - - public void setHostPID(Boolean hostPID) { - this.hostPID = hostPID; - } - - public V1PodSpec hostname(String hostname) { - this.hostname = hostname; - return this; - } - - @ApiModelProperty("Specifies the hostname of the Pod If not specified, the pod's hostname will be set to a system-defined value.") - public String getHostname() { - return this.hostname; - } - - public void setHostname(String hostname) { - this.hostname = hostname; - } - - public V1PodSpec imagePullSecrets(List imagePullSecrets) { - this.imagePullSecrets = imagePullSecrets; - return this; - } - - public V1PodSpec addImagePullSecretsItem(V1LocalObjectReference imagePullSecretsItem) { - if (this.imagePullSecrets == null) { - this.imagePullSecrets = new ArrayList(); - } - - this.imagePullSecrets.add(imagePullSecretsItem); - return this; - } - - @ApiModelProperty("ImagePullSecrets is an optional list of references to secrets in the same namespace to use for pulling any of the images used by this PodSpec. If specified, these secrets will be passed to individual puller implementations for them to use. For example, in the case of docker, only DockerConfig type secrets are honored. More info: https://kubernetes.io/docs/concepts/containers/images#specifying-imagepullsecrets-on-a-pod") - public List getImagePullSecrets() { - return this.imagePullSecrets; - } - - public void setImagePullSecrets(List imagePullSecrets) { - this.imagePullSecrets = imagePullSecrets; - } - - public V1PodSpec initContainers(List initContainers) { - this.initContainers = initContainers; - return this; - } - - public V1PodSpec addInitContainersItem(V1Container initContainersItem) { - if (this.initContainers == null) { - this.initContainers = new ArrayList(); - } - - this.initContainers.add(initContainersItem); - return this; - } - - @ApiModelProperty("List of initialization containers belonging to the pod. Init containers are executed in order prior to containers being started. If any init container fails, the pod is considered to have failed and is handled according to its restartPolicy. The name for an init container or normal container must be unique among all containers. Init containers may not have Lifecycle actions, Readiness probes, or Liveness probes. The resourceRequirements of an init container are taken into account during scheduling by finding the highest request/limit for each resource type, and then using the max of of that value or the sum of the normal containers. Limits are applied to init containers in a similar fashion. Init containers cannot currently be added or removed. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/") - public List getInitContainers() { - return this.initContainers; - } - - public void setInitContainers(List initContainers) { - this.initContainers = initContainers; - } - - public V1PodSpec nodeName(String nodeName) { - this.nodeName = nodeName; - return this; - } - - @ApiModelProperty("NodeName is a request to schedule this pod onto a specific node. If it is non-empty, the scheduler simply schedules this pod onto that node, assuming that it fits resource requirements.") - public String getNodeName() { - return this.nodeName; - } - - public void setNodeName(String nodeName) { - this.nodeName = nodeName; - } - - public V1PodSpec nodeSelector(Map nodeSelector) { - this.nodeSelector = nodeSelector; - return this; - } - - public V1PodSpec putNodeSelectorItem(String key, String nodeSelectorItem) { - if (this.nodeSelector == null) { - this.nodeSelector = new HashMap(); - } - - this.nodeSelector.put(key, nodeSelectorItem); - return this; - } - - @ApiModelProperty("NodeSelector is a selector which must be true for the pod to fit on a node. Selector which must match a node's labels for the pod to be scheduled on that node. More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/") - public Map getNodeSelector() { - return this.nodeSelector; - } - - public void setNodeSelector(Map nodeSelector) { - this.nodeSelector = nodeSelector; - } - - public V1PodSpec priority(Integer priority) { - this.priority = priority; - return this; - } - - @ApiModelProperty("The priority value. Various system components use this field to find the priority of the pod. When Priority Admission Controller is enabled, it prevents users from setting this field. The admission controller populates this field from PriorityClassName. The higher the value, the higher the priority.") - public Integer getPriority() { - return this.priority; - } - - public void setPriority(Integer priority) { - this.priority = priority; - } - - public V1PodSpec priorityClassName(String priorityClassName) { - this.priorityClassName = priorityClassName; - return this; - } - - @ApiModelProperty("If specified, indicates the pod's priority. \"SYSTEM\" is a special keyword which indicates the highest priority. Any other name must be defined by creating a PriorityClass object with that name. If not specified, the pod priority will be default or zero if there is no default.") - public String getPriorityClassName() { - return this.priorityClassName; - } - - public void setPriorityClassName(String priorityClassName) { - this.priorityClassName = priorityClassName; - } - - public V1PodSpec restartPolicy(String restartPolicy) { - this.restartPolicy = restartPolicy; - return this; - } - - @ApiModelProperty("Restart policy for all containers within the pod. One of Always, OnFailure, Never. Default to Always. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy") - public String getRestartPolicy() { - return this.restartPolicy; - } - - public void setRestartPolicy(String restartPolicy) { - this.restartPolicy = restartPolicy; - } - - public V1PodSpec schedulerName(String schedulerName) { - this.schedulerName = schedulerName; - return this; - } - - @ApiModelProperty("If specified, the pod will be dispatched by specified scheduler. If not specified, the pod will be dispatched by default scheduler.") - public String getSchedulerName() { - return this.schedulerName; - } - - public void setSchedulerName(String schedulerName) { - this.schedulerName = schedulerName; - } - - public V1PodSpec securityContext(V1PodSecurityContext securityContext) { - this.securityContext = securityContext; - return this; - } - - @ApiModelProperty("SecurityContext holds pod-level security attributes and common container settings. Optional: Defaults to empty. See type description for default values of each field.") - public V1PodSecurityContext getSecurityContext() { - return this.securityContext; - } - - public void setSecurityContext(V1PodSecurityContext securityContext) { - this.securityContext = securityContext; - } - - public V1PodSpec serviceAccount(String serviceAccount) { - this.serviceAccount = serviceAccount; - return this; - } - - @ApiModelProperty("DeprecatedServiceAccount is a depreciated alias for ServiceAccountName. Deprecated: Use serviceAccountName instead.") - public String getServiceAccount() { - return this.serviceAccount; - } - - public void setServiceAccount(String serviceAccount) { - this.serviceAccount = serviceAccount; - } - - public V1PodSpec serviceAccountName(String serviceAccountName) { - this.serviceAccountName = serviceAccountName; - return this; - } - - @ApiModelProperty("ServiceAccountName is the name of the ServiceAccount to use to run this pod. More info: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/") - public String getServiceAccountName() { - return this.serviceAccountName; - } - - public void setServiceAccountName(String serviceAccountName) { - this.serviceAccountName = serviceAccountName; - } - - public V1PodSpec subdomain(String subdomain) { - this.subdomain = subdomain; - return this; - } - - @ApiModelProperty("If specified, the fully qualified Pod hostname will be \"...svc.\". If not specified, the pod will not have a domainname at all.") - public String getSubdomain() { - return this.subdomain; - } - - public void setSubdomain(String subdomain) { - this.subdomain = subdomain; - } - - public V1PodSpec terminationGracePeriodSeconds(Long terminationGracePeriodSeconds) { - this.terminationGracePeriodSeconds = terminationGracePeriodSeconds; - return this; - } - - @ApiModelProperty("Optional duration in seconds the pod needs to terminate gracefully. May be decreased in delete request. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period will be used instead. The grace period is the duration in seconds after the processes running in the pod are sent a termination signal and the time when the processes are forcibly halted with a kill signal. Set this value longer than the expected cleanup time for your process. Defaults to 30 seconds.") - public Long getTerminationGracePeriodSeconds() { - return this.terminationGracePeriodSeconds; - } - - public void setTerminationGracePeriodSeconds(Long terminationGracePeriodSeconds) { - this.terminationGracePeriodSeconds = terminationGracePeriodSeconds; - } - - public V1PodSpec tolerations(List tolerations) { - this.tolerations = tolerations; - return this; - } - - public V1PodSpec addTolerationsItem(V1Toleration tolerationsItem) { - if (this.tolerations == null) { - this.tolerations = new ArrayList(); - } - - this.tolerations.add(tolerationsItem); - return this; - } - - @ApiModelProperty("If specified, the pod's tolerations.") - public List getTolerations() { - return this.tolerations; - } - - public void setTolerations(List tolerations) { - this.tolerations = tolerations; - } - - public V1PodSpec volumes(List volumes) { - this.volumes = volumes; - return this; - } - - public V1PodSpec addVolumesItem(V1Volume volumesItem) { - if (this.volumes == null) { - this.volumes = new ArrayList(); - } - - this.volumes.add(volumesItem); - return this; - } - - @ApiModelProperty("List of volumes that can be mounted by containers belonging to the pod. More info: https://kubernetes.io/docs/concepts/storage/volumes") - public List getVolumes() { - return this.volumes; - } - - public void setVolumes(List volumes) { - this.volumes = volumes; - } - - public boolean equals(Object o) { - if (this == o) { - return true; - } else if (o != null && this.getClass() == o.getClass()) { - V1PodSpec v1PodSpec = (V1PodSpec) o; - return Objects.equals(this.activeDeadlineSeconds, v1PodSpec.activeDeadlineSeconds) && Objects.equals(this.affinity, v1PodSpec.affinity) && Objects.equals(this.automountServiceAccountToken, v1PodSpec.automountServiceAccountToken) && Objects.equals(this.containers, v1PodSpec.containers) && Objects.equals(this.dnsPolicy, v1PodSpec.dnsPolicy) && Objects.equals(this.hostAliases, v1PodSpec.hostAliases) && Objects.equals(this.hostIPC, v1PodSpec.hostIPC) && Objects.equals(this.hostNetwork, v1PodSpec.hostNetwork) && Objects.equals(this.hostPID, v1PodSpec.hostPID) && Objects.equals(this.hostname, v1PodSpec.hostname) && Objects.equals(this.imagePullSecrets, v1PodSpec.imagePullSecrets) && Objects.equals(this.initContainers, v1PodSpec.initContainers) && Objects.equals(this.nodeName, v1PodSpec.nodeName) && Objects.equals(this.nodeSelector, v1PodSpec.nodeSelector) && Objects.equals(this.priority, v1PodSpec.priority) && Objects.equals(this.priorityClassName, v1PodSpec.priorityClassName) && Objects.equals(this.restartPolicy, v1PodSpec.restartPolicy) && Objects.equals(this.schedulerName, v1PodSpec.schedulerName) && Objects.equals(this.securityContext, v1PodSpec.securityContext) && Objects.equals(this.serviceAccount, v1PodSpec.serviceAccount) && Objects.equals(this.serviceAccountName, v1PodSpec.serviceAccountName) && Objects.equals(this.subdomain, v1PodSpec.subdomain) && Objects.equals(this.terminationGracePeriodSeconds, v1PodSpec.terminationGracePeriodSeconds) && Objects.equals(this.tolerations, v1PodSpec.tolerations) && Objects.equals(this.volumes, v1PodSpec.volumes); - } else { - return false; - } - } - - public int hashCode() { - return Objects.hash(new Object[]{this.activeDeadlineSeconds, this.affinity, this.automountServiceAccountToken, this.containers, this.dnsPolicy, this.hostAliases, this.hostIPC, this.hostNetwork, this.hostPID, this.hostname, this.imagePullSecrets, this.initContainers, this.nodeName, this.nodeSelector, this.priority, this.priorityClassName, this.restartPolicy, this.schedulerName, this.securityContext, this.serviceAccount, this.serviceAccountName, this.subdomain, this.terminationGracePeriodSeconds, this.tolerations, this.volumes}); - } - - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("class V1PodSpec {\n"); - sb.append(" activeDeadlineSeconds: ").append(this.toIndentedString(this.activeDeadlineSeconds)).append("\n"); - sb.append(" affinity: ").append(this.toIndentedString(this.affinity)).append("\n"); - sb.append(" automountServiceAccountToken: ").append(this.toIndentedString(this.automountServiceAccountToken)).append("\n"); - sb.append(" containers: ").append(this.toIndentedString(this.containers)).append("\n"); - sb.append(" dnsPolicy: ").append(this.toIndentedString(this.dnsPolicy)).append("\n"); - sb.append(" hostAliases: ").append(this.toIndentedString(this.hostAliases)).append("\n"); - sb.append(" hostIPC: ").append(this.toIndentedString(this.hostIPC)).append("\n"); - sb.append(" hostNetwork: ").append(this.toIndentedString(this.hostNetwork)).append("\n"); - sb.append(" hostPID: ").append(this.toIndentedString(this.hostPID)).append("\n"); - sb.append(" hostname: ").append(this.toIndentedString(this.hostname)).append("\n"); - sb.append(" imagePullSecrets: ").append(this.toIndentedString(this.imagePullSecrets)).append("\n"); - sb.append(" initContainers: ").append(this.toIndentedString(this.initContainers)).append("\n"); - sb.append(" nodeName: ").append(this.toIndentedString(this.nodeName)).append("\n"); - sb.append(" nodeSelector: ").append(this.toIndentedString(this.nodeSelector)).append("\n"); - sb.append(" priority: ").append(this.toIndentedString(this.priority)).append("\n"); - sb.append(" priorityClassName: ").append(this.toIndentedString(this.priorityClassName)).append("\n"); - sb.append(" restartPolicy: ").append(this.toIndentedString(this.restartPolicy)).append("\n"); - sb.append(" schedulerName: ").append(this.toIndentedString(this.schedulerName)).append("\n"); - sb.append(" securityContext: ").append(this.toIndentedString(this.securityContext)).append("\n"); - sb.append(" serviceAccount: ").append(this.toIndentedString(this.serviceAccount)).append("\n"); - sb.append(" serviceAccountName: ").append(this.toIndentedString(this.serviceAccountName)).append("\n"); - sb.append(" subdomain: ").append(this.toIndentedString(this.subdomain)).append("\n"); - sb.append(" terminationGracePeriodSeconds: ").append(this.toIndentedString(this.terminationGracePeriodSeconds)).append("\n"); - sb.append(" tolerations: ").append(this.toIndentedString(this.tolerations)).append("\n"); - sb.append(" volumes: ").append(this.toIndentedString(this.volumes)).append("\n"); - sb.append("}"); - return sb.toString(); - } - - private String toIndentedString(Object o) { - return o == null ? "null" : o.toString().replace("\n", "\n "); - } -} diff --git a/src/main/java/io/kubernetes/client/models/V1Secret.java b/src/main/java/io/kubernetes/client/models/V1Secret.java deleted file mode 100644 index a340a274c1..0000000000 --- a/src/main/java/io/kubernetes/client/models/V1Secret.java +++ /dev/null @@ -1,224 +0,0 @@ -/* - * Kubernetes - * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) - * - * OpenAPI spec version: v1.8.11 - * - * - * NOTE: This class is auto generated by the swagger code generator program. - * https://github.com/swagger-api/swagger-codegen.git - * Do not edit the class manually. - */ - - -package io.kubernetes.client.models; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; - -import com.google.gson.annotations.SerializedName; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; - -/** - * ===========复制这个类的主要目的是将data的类型从 Map改为Map - * Secret holds secret data of a certain type. The total bytes of the values in the Data field must be less than MaxSecretSize bytes. - */ -@ApiModel(description = "Secret holds secret data of a certain type. The total bytes of the values in the Data field must be less than MaxSecretSize bytes.") - -public class V1Secret { - @SerializedName("apiVersion") - private String apiVersion = null; - - @SerializedName("data") - private Map data = null; - - @SerializedName("kind") - private String kind = null; - - @SerializedName("metadata") - private V1ObjectMeta metadata = null; - - @SerializedName("stringData") - private Map stringData = null; - - @SerializedName("type") - private String type = null; - - public V1Secret apiVersion(String apiVersion) { - this.apiVersion = apiVersion; - return this; - } - - /** - * APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources - * @return apiVersion - **/ - @ApiModelProperty(value = "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources") - public String getApiVersion() { - return apiVersion; - } - - public void setApiVersion(String apiVersion) { - this.apiVersion = apiVersion; - } - - public V1Secret data(Map data) { - this.data = data; - return this; - } - - public V1Secret putDataItem(String key, String dataItem) { - if (this.data == null) { - this.data = new HashMap<>(); - } - this.data.put(key, dataItem); - return this; - } - - /** - * Data contains the secret data. Each key must consist of alphanumeric characters, '-', '_' or '.'. The serialized form of the secret data is a base64 encoded string, representing the arbitrary (possibly non-string) data value here. Described in https://tools.ietf.org/html/rfc4648#section-4 - * @return data - **/ - @ApiModelProperty(value = "Data contains the secret data. Each key must consist of alphanumeric characters, '-', '_' or '.'. The serialized form of the secret data is a base64 encoded string, representing the arbitrary (possibly non-string) data value here. Described in https://tools.ietf.org/html/rfc4648#section-4") - public Map getData() { - return data; - } - - public void setData(Map data) { - this.data = data; - } - - public V1Secret kind(String kind) { - this.kind = kind; - return this; - } - - /** - * Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds - * @return kind - **/ - @ApiModelProperty(value = "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds") - public String getKind() { - return kind; - } - - public void setKind(String kind) { - this.kind = kind; - } - - public V1Secret metadata(V1ObjectMeta metadata) { - this.metadata = metadata; - return this; - } - - /** - * Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata - * @return metadata - **/ - @ApiModelProperty(value = "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata") - public V1ObjectMeta getMetadata() { - return metadata; - } - - public void setMetadata(V1ObjectMeta metadata) { - this.metadata = metadata; - } - - public V1Secret stringData(Map stringData) { - this.stringData = stringData; - return this; - } - - public V1Secret putStringDataItem(String key, String stringDataItem) { - if (this.stringData == null) { - this.stringData = new HashMap<>(); - } - this.stringData.put(key, stringDataItem); - return this; - } - - /** - * stringData allows specifying non-binary secret data in string form. It is provided as a write-only convenience method. All keys and values are merged into the data field on write, overwriting any existing values. It is never output when reading from the API. - * @return stringData - **/ - @ApiModelProperty(value = "stringData allows specifying non-binary secret data in string form. It is provided as a write-only convenience method. All keys and values are merged into the data field on write, overwriting any existing values. It is never output when reading from the API.") - public Map getStringData() { - return stringData; - } - - public void setStringData(Map stringData) { - this.stringData = stringData; - } - - public V1Secret type(String type) { - this.type = type; - return this; - } - - /** - * Used to facilitate programmatic handling of secret data. - * @return type - **/ - @ApiModelProperty(value = "Used to facilitate programmatic handling of secret data.") - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - - - @Override - public boolean equals(java.lang.Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - V1Secret v1Secret = (V1Secret) o; - return Objects.equals(this.apiVersion, v1Secret.apiVersion) && - Objects.equals(this.data, v1Secret.data) && - Objects.equals(this.kind, v1Secret.kind) && - Objects.equals(this.metadata, v1Secret.metadata) && - Objects.equals(this.stringData, v1Secret.stringData) && - Objects.equals(this.type, v1Secret.type); - } - - @Override - public int hashCode() { - return Objects.hash(apiVersion, data, kind, metadata, stringData, type); - } - - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("class V1Secret {\n"); - - sb.append(" apiVersion: ").append(toIndentedString(apiVersion)).append("\n"); - sb.append(" data: ").append(toIndentedString(data)).append("\n"); - sb.append(" kind: ").append(toIndentedString(kind)).append("\n"); - sb.append(" metadata: ").append(toIndentedString(metadata)).append("\n"); - sb.append(" stringData: ").append(toIndentedString(stringData)).append("\n"); - sb.append(" type: ").append(toIndentedString(type)).append("\n"); - sb.append("}"); - return sb.toString(); - } - - /** - * Convert the given object to string with each line indented by 4 spaces - * (except the first line). - */ - private String toIndentedString(java.lang.Object o) { - if (o == null) { - return "null"; - } - return o.toString().replace("\n", "\n "); - } - -} - diff --git a/src/main/java/io/kubernetes/client/models/V1VolumeNodeAffinity.java b/src/main/java/io/kubernetes/client/models/V1VolumeNodeAffinity.java deleted file mode 100644 index 0879ec0bff..0000000000 --- a/src/main/java/io/kubernetes/client/models/V1VolumeNodeAffinity.java +++ /dev/null @@ -1,69 +0,0 @@ -// -// Source code recreated from a .class file by IntelliJ IDEA -// (powered by Fernflower decompiler) -// - -package io.kubernetes.client.models; - -import com.google.gson.annotations.SerializedName; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; - -import javax.annotation.Nullable; -import java.util.Objects; - -@ApiModel( - description = "VolumeNodeAffinity defines constraints that limit what nodes this volume can be accessed from." -) -public class V1VolumeNodeAffinity { - public static final String SERIALIZED_NAME_REQUIRED = "required"; - @SerializedName("required") - private V1NodeSelector required; - - public V1VolumeNodeAffinity() { - } - - public V1VolumeNodeAffinity required(V1NodeSelector required) { - this.required = required; - return this; - } - - @Nullable - @ApiModelProperty("") - public V1NodeSelector getRequired() { - return this.required; - } - - public void setRequired(V1NodeSelector required) { - this.required = required; - } - - public boolean equals(Object o) { - if (this == o) { - return true; - } else if (o != null && this.getClass() == o.getClass()) { - V1VolumeNodeAffinity v1VolumeNodeAffinity = (V1VolumeNodeAffinity) o; - return Objects.equals(this.required, v1VolumeNodeAffinity.required); - } else { - return false; - } - } - - @Override - public int hashCode() { - return Objects.hash(new Object[]{this.required}); - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("class V1VolumeNodeAffinity {\n"); - sb.append(" required: ").append(this.toIndentedString(this.required)).append("\n"); - sb.append("}"); - return sb.toString(); - } - - private String toIndentedString(Object o) { - return o == null ? "null" : o.toString().replace("\n", "\n "); - } -} diff --git a/src/main/resources/mapper/AppServiceHelmRelMapper.xml b/src/main/resources/mapper/AppServiceHelmRelMapper.xml new file mode 100644 index 0000000000..737b3a9ec7 --- /dev/null +++ b/src/main/resources/mapper/AppServiceHelmRelMapper.xml @@ -0,0 +1,17 @@ + + + + + + insert ignore into devops_app_service_helm_rel( + app_service_id, + helm_config_id) + values + + (#{appServiceHelmRelDTO.appServiceId}, + #{appServiceHelmRelDTO.helmConfigId} + ) + + + + diff --git a/src/main/resources/mapper/AppServiceHelmVersionMapper.xml b/src/main/resources/mapper/AppServiceHelmVersionMapper.xml new file mode 100644 index 0000000000..020d97c033 --- /dev/null +++ b/src/main/resources/mapper/AppServiceHelmVersionMapper.xml @@ -0,0 +1,35 @@ + + + + + insert ignore into devops_app_service_helm_version(app_service_version_id, + helm_config_id, + harbor_repo_type, + harbor_config_id, + value_id, + readme_value_id, + image, + repository) + values + + (#{version.appServiceVersionId}, + #{version.helmConfigId}, + #{version.harborRepoType}, + #{version.harborConfigId}, + #{version.valueId}, + #{version.readmeValueId}, + #{version.image}, + #{version.repository}) + + + + + + diff --git a/src/main/resources/mapper/AppServiceImageVersionMapper.xml b/src/main/resources/mapper/AppServiceImageVersionMapper.xml new file mode 100644 index 0000000000..eafdb5f536 --- /dev/null +++ b/src/main/resources/mapper/AppServiceImageVersionMapper.xml @@ -0,0 +1,25 @@ + + + + + insert ignore into devops_app_service_image_version(app_service_version_id, harbor_repo_type, harbor_config_id, image) + values + + (#{version.appServiceVersionId}, + #{version.harborRepoType}, + #{version.harborConfigId}, + #{version.image}) + + + + + + diff --git a/src/main/resources/mapper/AppServiceInstanceMapper.xml b/src/main/resources/mapper/AppServiceInstanceMapper.xml index 986a69efa6..14e0232a7a 100644 --- a/src/main/resources/mapper/AppServiceInstanceMapper.xml +++ b/src/main/resources/mapper/AppServiceInstanceMapper.xml @@ -265,27 +265,6 @@ - - - SELECT DISTINCT ins.env_id, ins.app_service_id - FROM devops_app_service_instance ins - WHERE ins.status != 'deleted' - - - - + + diff --git a/src/main/resources/mapper/AppServiceMavenVersionMapper.xml b/src/main/resources/mapper/AppServiceMavenVersionMapper.xml new file mode 100644 index 0000000000..d736befdaa --- /dev/null +++ b/src/main/resources/mapper/AppServiceMavenVersionMapper.xml @@ -0,0 +1,15 @@ + + + + + + + diff --git a/src/main/resources/mapper/AppServiceVersionMapper.xml b/src/main/resources/mapper/AppServiceVersionMapper.xml index b6f577b055..d3a3b5fc48 100644 --- a/src/main/resources/mapper/AppServiceVersionMapper.xml +++ b/src/main/resources/mapper/AppServiceVersionMapper.xml @@ -2,77 +2,30 @@ - - - - - - - - @@ -258,41 +148,19 @@ dav.version FROM devops_app_service_version dav + join devops_app_service_helm_version dashv on dashv.app_service_version_id = dav.id JOIN devops_app_service_instance dai ON dai.app_service_version_id = dav.id AND dai.`status` != 'deleted' JOIN devops_env de ON de.id = dai.env_id WHERE de.project_id = #{projectId} - AND dav.repository IS NOT NULL + AND dashv.repository IS NOT NULL AND dav.app_service_id = #{appServiceId} AND de.type ='user' ORDER BY dav.id DESC - - - - - - - - + + @@ -373,29 +291,14 @@ davv.value FROM devops_app_service_version dav - LEFT JOIN devops_app_service_version_value davv - ON davv.id = dav.value_id + left join devops_app_service_helm_version dashv on dashv.app_service_version_id = dav.id + LEFT JOIN devops_app_service_version_value davv ON davv.id = dashv.value_id WHERE dav.app_service_id = #{appServiceId} ORDER BY dav.id DESC LIMIT 1 - - update devops_app_service_version set repository = CONCAT(#{helmUrl},repository); - - - - update devops_app_service_version set object_version_number = 1 where id = #{versionId}; - - - - UPDATE devops_app_service_version dav - SET dav.publish_time = dav.last_update_date - WHERE - dav.is_publish = 1 - - - select * from devops_app_service_version + select + * + from devops_app_service_version where app_service_id=#{appServiceId} and version in(select version from devops_app_service_share_rule where app_service_id=#{appServiceId}) @@ -528,15 +433,16 @@ dasv.id, dasv.version, dasv.app_service_id, - dasv.harbor_config_id, - dasv.repo_type, - dasv.image, + dashv.harbor_config_id, + dashv.harbor_repo_type as repo_type, + dashv.image, das. CODE AS appServiceCode, das.`name` AS appServiceName, das.type AS appServiceType, das.project_id AS projectId FROM devops_app_service_version dasv + left join devops_app_service_helm_version dashv on dashv.app_service_version_id = dasv.id JOIN devops_app_service das ON das.id = dasv.app_service_id WHERE dasv.id in @@ -591,54 +497,32 @@ LIMIT 1 - - - UPDATE - devops_app_service_version - SET harbor_config_id = NULL, - repo_type = 'DEFAULT_REPO' - WHERE harbor_config_id = #{defaultHarborId} - - - - UPDATE - devops_app_service_version - SET repo_type = 'CUSTOM_REPO' - WHERE harbor_config_id IS NOT NULL AND harbor_config_id != #{defaultHarborId} - - - - UPDATE - devops_app_service_version - SET repo_type = 'DEFAULT_REPO' - WHERE app_service_id = #{appServiceId,jdbcType=BIGINT} AND harbor_config_id IS NULL - - - - UPDATE - devops_app_service_version - SET repo_type = 'CUSTOM_REPO', - harbor_config_id = #{configId,jdbcType=BIGINT} - WHERE app_service_id = #{appServiceId,jdbcType=BIGINT} AND harbor_config_id IS NULL - - + + + + + + diff --git a/src/main/resources/mapper/CiPipelineAppVersionMapper.xml b/src/main/resources/mapper/CiPipelineAppVersionMapper.xml new file mode 100644 index 0000000000..af346e250d --- /dev/null +++ b/src/main/resources/mapper/CiPipelineAppVersionMapper.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/main/resources/mapper/CiPipelineMavenMapper.xml b/src/main/resources/mapper/CiPipelineMavenMapper.xml new file mode 100644 index 0000000000..e35a0a0de2 --- /dev/null +++ b/src/main/resources/mapper/CiPipelineMavenMapper.xml @@ -0,0 +1,14 @@ + + + + + + + \ No newline at end of file diff --git a/src/main/resources/mapper/DevopsAppServiceHelmRelMapper.xml b/src/main/resources/mapper/DevopsAppServiceHelmRelMapper.xml new file mode 100644 index 0000000000..bcc136aa6b --- /dev/null +++ b/src/main/resources/mapper/DevopsAppServiceHelmRelMapper.xml @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/src/main/resources/mapper/DevopsCdApiTestInfoMapper.xml b/src/main/resources/mapper/DevopsCdApiTestInfoMapper.xml index ec1aeeea68..c28b7ead72 100644 --- a/src/main/resources/mapper/DevopsCdApiTestInfoMapper.xml +++ b/src/main/resources/mapper/DevopsCdApiTestInfoMapper.xml @@ -1,7 +1,11 @@ - - + diff --git a/src/main/resources/mapper/DevopsConfigMapper.xml b/src/main/resources/mapper/DevopsConfigMapper.xml index c525771b93..892b000743 100644 --- a/src/main/resources/mapper/DevopsConfigMapper.xml +++ b/src/main/resources/mapper/DevopsConfigMapper.xml @@ -145,4 +145,9 @@ WHERE id = #{configId} + \ No newline at end of file diff --git a/src/main/resources/mapper/DevopsHelmConfigMapper.xml b/src/main/resources/mapper/DevopsHelmConfigMapper.xml new file mode 100644 index 0000000000..aaeb6dbc5b --- /dev/null +++ b/src/main/resources/mapper/DevopsHelmConfigMapper.xml @@ -0,0 +1,95 @@ + + + + + UPDATE devops_helm_config + SET repo_default=0 + WHERE resource_id = #{projectId} + AND resource_type = 'project' + + + + UPDATE devops_helm_config + SET repo_default=1 + WHERE id = #{helmConfigId} + AND resource_id = #{projectId} + AND resource_type = 'project' + + + + UPDATE devops_helm_config + SET repo_default=0 + WHERE resource_id = #{resourceId} + AND resource_type = 'organization' + + + + + + + + + + + + insert ignore into devops_helm_config( + id, + name, + resource_type, + resource_id, + url, + username, + password, + repo_private, + repo_default) + values + + (#{devopsHelmConfigDTO.id}, + #{devopsHelmConfigDTO.name}, + #{devopsHelmConfigDTO.resourceType}, + #{devopsHelmConfigDTO.resourceId}, + #{devopsHelmConfigDTO.url}, + #{devopsHelmConfigDTO.username}, + #{devopsHelmConfigDTO.password}, + #{devopsHelmConfigDTO.repoPrivate}, + #{devopsHelmConfigDTO.repoDefault} + ) + + + + + \ No newline at end of file diff --git a/src/main/resources/mapper/DevopsHostAppMapper.xml b/src/main/resources/mapper/DevopsHostAppMapper.xml index c6a822deee..78a4125fb6 100644 --- a/src/main/resources/mapper/DevopsHostAppMapper.xml +++ b/src/main/resources/mapper/DevopsHostAppMapper.xml @@ -110,12 +110,31 @@ + + + + - SELECT dir.object_id, dir.project_id, dir.app_service_code, dir.branch_id FROM devops_issue_rel dir WHERE dir.project_id = #{projectId} @@ -124,4 +124,18 @@ WHERE dir.object='commit' AND dir.branch_id=#{branchId} + + + + \ No newline at end of file diff --git a/src/main/resources/mapper/DevopsPipelineRecordRelMapper.xml b/src/main/resources/mapper/DevopsPipelineRecordRelMapper.xml index 2eea53a9d5..bcb9da6439 100644 --- a/src/main/resources/mapper/DevopsPipelineRecordRelMapper.xml +++ b/src/main/resources/mapper/DevopsPipelineRecordRelMapper.xml @@ -15,8 +15,8 @@ + SELECT iam_user_id, + gitlab_user_id + FROM devops_user + WHERE is_gitlab_admin = 1 + + + + UPDATE devops_user + SET is_gitlab_admin=0 + WHERE iam_user_id + IN + + #{userId} + + + + + UPDATE devops_user + SET is_gitlab_admin=#{isGitlabAdmin} + WHERE iam_user_id + IN + + #{iamUserId} + + \ No newline at end of file diff --git a/src/main/resources/messages/messages_en_US.properties b/src/main/resources/messages/messages_en_US.properties index 9c4376dfa5..537419062a 100644 --- a/src/main/resources/messages/messages_en_US.properties +++ b/src/main/resources/messages/messages_en_US.properties @@ -924,3 +924,13 @@ error.load.host.upgrade.sh=Failed to read the host upgrade command template. error.host.app.name.length=The application name length should be in 0 to 128 error.host.app.code.length=The application code length should be in 0 to 128 error.middleware.code.exists=code exists +error.helm.config.update=Failed to update helm config +error.helm.config.insert=Failed to insert helm config +error.helm.config.site.exist=The helm repo on site does not exist +error.helm.config.name.exists=The name of helm repo already exists. +error.get.helm.chart=Failed to get chart info of helm repo. +error.chart.address.invalid=Invalid chart warehouse address +error.chart.address.unreachable=Chart warehouse is unreachable +error.helm.chart.download=Failed to download chart {0} +error.helm.config.delete=Failed to delete helm config +app.template.name.already.exists=The application template name already exists diff --git a/src/main/resources/messages/messages_zh_CN.properties b/src/main/resources/messages/messages_zh_CN.properties index 38669c3677..15947885c8 100644 --- a/src/main/resources/messages/messages_zh_CN.properties +++ b/src/main/resources/messages/messages_zh_CN.properties @@ -761,7 +761,7 @@ error.stage.name.not.unique=流水线中阶段的名称应该唯一: {0} error.both.repos.and.settings.exist=步骤{0}的repo和mavenSettings值只能填一个 error.maven.settings.not.xml.format=步骤{0}提供的mavenSettings内容不符合xml格式 error.delete.gitlab-ci.file=从master分支删除.gitlab-ci.yaml文件失败,请重试或确认是否在gitlab中设置了master分支不允许任何人push -error.create.or.update.gitlab.ci=从master分支创建或更新.gitlab-ci.yaml文件失败,请重试或确认是否在gitlab中设置了master分支不允许任何人push +error.create.or.update.gitlab.ci=从 {0} 分支创建或更新.gitlab-ci.yaml文件失败,请重试或确认是否在gitlab中设置了 {0} 分支不允许任何人push error.create.pipeline.failed=创建Gitlab CI流水线失败,请检查所选分支是否满足任务执行条件 error.default.sonar.not.exist=没有默认的Sonarqube配置 error.sonar.config.type.not.supported=Sonar配置类型 {0} 暂不支持 @@ -920,4 +920,14 @@ error.load.host.upgrade.sh=读取主机升级命令模版失败 error.host.app.name.length=应用名称长度应该在0~128 error.host.app.code.length=应用code长度应该在0~64 error.middleware.code.exists=编码已存在 -error.key-encrypt.decrypt.abnormal_content=页面失效,请重新访问首页进入 \ No newline at end of file +error.key-encrypt.decrypt.abnormal_content=页面失效,请重新访问首页进入 +error.helm.config.update=更新helm仓库配置失败 +error.helm.config.insert=插入helm仓库配置失败 +error.helm.config.site.exist=平台层helm仓库配置不存在 +error.helm.config.name.exists=helm仓库名称已存在 +error.get.helm.chart=获取helm仓库chart信息失败 +error.chart.address.invalid=无效的chart仓库地址 +error.chart.address.unreachable=chart仓库不可达 +error.helm.chart.download=下载chart包失败 {0} +error.helm.config.delete=删除helm仓库配置失败 +app.template.name.already.exists=应用模板名称已经存在 \ No newline at end of file diff --git a/src/main/resources/script/db/groovy/devops_service/devops_app_service_helm_rel.groovy b/src/main/resources/script/db/groovy/devops_service/devops_app_service_helm_rel.groovy new file mode 100644 index 0000000000..02c623308b --- /dev/null +++ b/src/main/resources/script/db/groovy/devops_service/devops_app_service_helm_rel.groovy @@ -0,0 +1,24 @@ +package script.db.groovy.devops_service + +databaseChangeLog(logicalFilePath: 'dba/devops_app_service_helm_rel.groovy') { + changeSet(author: 'wanghao', id: '2022-07-15-create-table') { + createTable(tableName: "devops_app_service_helm_rel", remarks: '应用服务和helm配置的关联关系表') { + column(name: 'id', type: 'BIGINT UNSIGNED', remarks: '主键,ID', autoIncrement: true) { + constraints(primaryKey: true) + } + column(name: 'app_service_id', type: 'BIGINT UNSIGNED', remarks: '应用服务id,devops_app_service.id') { + constraints(nullable: false) + } + column(name: 'helm_config_id', type: 'BIGINT UNSIGNED', remarks: '配置Id,devops_helm_config.id') { + constraints(nullable: false) + } + column(name: "object_version_number", type: "BIGINT UNSIGNED", defaultValue: "1") + column(name: "created_by", type: "BIGINT UNSIGNED", defaultValue: "0") + column(name: "creation_date", type: "DATETIME", defaultValueComputed: "CURRENT_TIMESTAMP") + column(name: "last_updated_by", type: "BIGINT UNSIGNED", defaultValue: "0") + column(name: "last_update_date", type: "DATETIME", defaultValueComputed: "CURRENT_TIMESTAMP") + } + addUniqueConstraint(tableName: 'devops_app_service_helm_rel', + constraintName: 'devops_app_service_helm_rel_u1', columnNames: 'app_service_id') + } +} \ No newline at end of file diff --git a/src/main/resources/script/db/groovy/devops_service/devops_app_service_helm_version.groovy b/src/main/resources/script/db/groovy/devops_service/devops_app_service_helm_version.groovy new file mode 100644 index 0000000000..a8286a6137 --- /dev/null +++ b/src/main/resources/script/db/groovy/devops_service/devops_app_service_helm_version.groovy @@ -0,0 +1,43 @@ +package script.db.groovy.devops_service + +databaseChangeLog(logicalFilePath: 'dba/devops_app_service_helm_version.groovy') { + changeSet(author: 'wanghao', id: '2022-07-13-create-table') { + createTable(tableName: "devops_app_service_helm_version", remarks: '应用版本表') { + column(name: 'id', type: 'BIGINT UNSIGNED', remarks: '主键,ID', autoIncrement: true) { + constraints(primaryKey: true) + } + column(name: 'app_service_version_id', type: 'BIGINT UNSIGNED', remarks: '应用服务版本,devops_app_service_version.id') { + constraints(nullable: false) + } + column(name: 'helm_config_id', type: 'BIGINT UNSIGNED', remarks: '配置Id,devops_helm_config.id') { + constraints(nullable: false) + } + column(name: 'harbor_repo_type', type: 'VARCHAR(64)', remarks: '仓库类型(DEFAULT_REPO、CUSTOM_REPO)') { + constraints(nullable: false) + } + column(name: 'harbor_config_id', type: 'BIGINT UNSIGNED', remarks: 'harbor仓库配置Id,hrds_prod_repo.rdupm_harbor_repository.id/hrds_prod_repo.rdupm_harbor_custom_repo.id') { + constraints(nullable: false) + } + column(name: 'value_id', type: 'BIGINT UNSIGNED', remarks: 'chart包values ID,devops_app_service_version_value.id') { + constraints(nullable: false) + } + column(name: 'readme_value_id', type: 'BIGINT UNSIGNED', remarks: 'readme value id,devops_app_service_version_readme.id') { + constraints(nullable: false) + } + column(name: 'image', type: 'VARCHAR(255)', remarks: '镜像名') { + constraints(nullable: false) + } + column(name: 'repository', type: 'VARCHAR(255)', remarks: '仓库地址') { + constraints(nullable: false) + } + + column(name: "object_version_number", type: "BIGINT UNSIGNED", defaultValue: "1") + column(name: "created_by", type: "BIGINT UNSIGNED", defaultValue: "0") + column(name: "creation_date", type: "DATETIME", defaultValueComputed: "CURRENT_TIMESTAMP") + column(name: "last_updated_by", type: "BIGINT UNSIGNED", defaultValue: "0") + column(name: "last_update_date", type: "DATETIME", defaultValueComputed: "CURRENT_TIMESTAMP") + } + addUniqueConstraint(tableName: 'devops_app_service_helm_version', + constraintName: 'devops_app_service_helm_version_u1', columnNames: 'app_service_version_id') + } +} \ No newline at end of file diff --git a/src/main/resources/script/db/groovy/devops_service/devops_app_service_image_version.groovy b/src/main/resources/script/db/groovy/devops_service/devops_app_service_image_version.groovy new file mode 100644 index 0000000000..8bc335bfcc --- /dev/null +++ b/src/main/resources/script/db/groovy/devops_service/devops_app_service_image_version.groovy @@ -0,0 +1,31 @@ +package script.db.groovy.devops_service + +databaseChangeLog(logicalFilePath: 'dba/devops_app_service_image_version.groovy') { + changeSet(author: 'wanghao', id: '2022-07-13-create-table') { + createTable(tableName: "devops_app_service_image_version", remarks: '应用版本表') { + column(name: 'id', type: 'BIGINT UNSIGNED', remarks: '主键,ID', autoIncrement: true) { + constraints(primaryKey: true) + } + column(name: 'app_service_version_id', type: 'BIGINT UNSIGNED', remarks: '应用服务版本,devops_app_service_version.id') { + constraints(nullable: false) + } + column(name: 'harbor_repo_type', type: 'VARCHAR(64)', remarks: '仓库类型(DEFAULT_REPO、CUSTOM_REPO)') { + constraints(nullable: false) + } + column(name: 'harbor_config_id', type: 'BIGINT UNSIGNED', remarks: 'harbor仓库配置Id,hrds_prod_repo.rdupm_harbor_repository.id/hrds_prod_repo.rdupm_harbor_custom_repo.id') { + constraints(nullable: false) + } + column(name: 'image', type: 'VARCHAR(255)', remarks: '镜像名') { + constraints(nullable: false) + } + + column(name: "object_version_number", type: "BIGINT UNSIGNED", defaultValue: "1") + column(name: "created_by", type: "BIGINT UNSIGNED", defaultValue: "0") + column(name: "creation_date", type: "DATETIME", defaultValueComputed: "CURRENT_TIMESTAMP") + column(name: "last_updated_by", type: "BIGINT UNSIGNED", defaultValue: "0") + column(name: "last_update_date", type: "DATETIME", defaultValueComputed: "CURRENT_TIMESTAMP") + } + addUniqueConstraint(tableName: 'devops_app_service_image_version', + constraintName: 'devops_app_service_image_version_u1', columnNames: 'app_service_version_id') + } +} \ No newline at end of file diff --git a/src/main/resources/script/db/groovy/devops_service/devops_app_service_maven_version.groovy b/src/main/resources/script/db/groovy/devops_service/devops_app_service_maven_version.groovy new file mode 100644 index 0000000000..769789c620 --- /dev/null +++ b/src/main/resources/script/db/groovy/devops_service/devops_app_service_maven_version.groovy @@ -0,0 +1,35 @@ +package script.db.groovy.devops_service + +databaseChangeLog(logicalFilePath: 'dba/devops_app_service_maven_version.groovy') { + changeSet(author: 'wanghao', id: '2022-07-13-create-table') { + createTable(tableName: "devops_app_service_maven_version", remarks: '应用版本表') { + column(name: 'id', type: 'BIGINT UNSIGNED', remarks: '主键,ID', autoIncrement: true) { + constraints(primaryKey: true) + } + column(name: 'app_service_version_id', type: 'BIGINT UNSIGNED', remarks: '应用服务版本,devops_app_service_version.id') { + constraints(nullable: false) + } + column(name: "group_id", type: "VARCHAR(60)", remarks: "groupId") { + constraints(nullable: false) + } + column(name: "artifact_id", type: "VARCHAR(60)", remarks: "artifactId") { + constraints(nullable: false) + } + column(name: "version", type: "VARCHAR(60)", remarks: "版本") { + constraints(nullable: false) + } + column(name: "nexus_repo_id", type: "BIGINT UNSIGNED", remarks: "nexus仓库id,hrds_prod_repo.rdupm_nexus_repository.repository_id") + column(name: "maven_repo_url", type: "VARCHAR(255)") + column(name: "username", type: "VARCHAR(255)") + column(name: "password", type: "VARCHAR(255)") + + column(name: "object_version_number", type: "BIGINT UNSIGNED", defaultValue: "1") + column(name: "created_by", type: "BIGINT UNSIGNED", defaultValue: "0") + column(name: "creation_date", type: "DATETIME", defaultValueComputed: "CURRENT_TIMESTAMP") + column(name: "last_updated_by", type: "BIGINT UNSIGNED", defaultValue: "0") + column(name: "last_update_date", type: "DATETIME", defaultValueComputed: "CURRENT_TIMESTAMP") + } + addUniqueConstraint(tableName: 'devops_app_service_maven_version', + constraintName: 'devops_app_service_maven_version_u1', columnNames: 'app_service_version_id') + } +} \ No newline at end of file diff --git a/src/main/resources/script/db/groovy/devops_service/devops_ci_pipeline_app_version.groovy b/src/main/resources/script/db/groovy/devops_service/devops_ci_pipeline_app_version.groovy new file mode 100644 index 0000000000..d44e90b226 --- /dev/null +++ b/src/main/resources/script/db/groovy/devops_service/devops_ci_pipeline_app_version.groovy @@ -0,0 +1,31 @@ +package script.db.groovy.devops_service + +databaseChangeLog(logicalFilePath: 'dba/devops_ci_pipeline_app_version.groovy') { + changeSet(author: 'wanghao', id: '2022-07-15-create-table') { + createTable(tableName: "devops_ci_pipeline_app_version", remarks: '发布应用服务版本步骤生成的流水线记录信息') { + column(name: 'id', type: 'BIGINT UNSIGNED', remarks: '主键,ID', autoIncrement: true) { + constraints(primaryKey: true) + } + column(name: 'app_service_id', type: 'BIGINT UNSIGNED', remarks: '应用服务id') { + constraints(nullable: false) + } + column(name: 'gitlab_pipeline_id', type: 'BIGINT UNSIGNED', remarks: 'gitlabPipelineId') { + constraints(nullable: false) + } + column(name: "job_name", type: "VARCHAR(255)", remarks: "任务名称") { + constraints(nullable: false) + } + column(name: "app_service_version_id", type: "BIGINT UNSIGNED", remarks: "关联应用服务版本id,devops_app_service_version.id") { + constraints(nullable: false) + } + + column(name: "object_version_number", type: "BIGINT UNSIGNED", defaultValue: "1") + column(name: "created_by", type: "BIGINT UNSIGNED", defaultValue: "0") + column(name: "creation_date", type: "DATETIME", defaultValueComputed: "CURRENT_TIMESTAMP") + column(name: "last_updated_by", type: "BIGINT UNSIGNED", defaultValue: "0") + column(name: "last_update_date", type: "DATETIME", defaultValueComputed: "CURRENT_TIMESTAMP") + } + addUniqueConstraint(tableName: 'devops_ci_pipeline_app_version', + constraintName: 'devops_ci_pipeline_app_version_u1', columnNames: 'app_service_id,gitlab_pipeline_id,job_name') + } +} diff --git a/src/main/resources/script/db/groovy/devops_service/devops_helm_config.groovy b/src/main/resources/script/db/groovy/devops_service/devops_helm_config.groovy new file mode 100644 index 0000000000..3b7bebdd0e --- /dev/null +++ b/src/main/resources/script/db/groovy/devops_service/devops_helm_config.groovy @@ -0,0 +1,44 @@ +package script.db.groovy.devops_service + +databaseChangeLog(logicalFilePath: 'dba/devops_helm_config.groovy') { + changeSet(author: 'lihao', id: '2022-07-12-create-table') { + createTable(tableName: "devops_helm_config", remarks: 'helm仓库配置表') { + column(name: 'id', type: 'BIGINT UNSIGNED', remarks: '主键,ID', autoIncrement: true) { + constraints(primaryKey: true) + } + column(name: 'name', type: 'VARCHAR(60)', remarks: '仓库名称') { + constraints(nullable: false) + } + column(name: 'url', type: 'text', remarks: 'helm仓库地址 平台层或组织层为仓库地址前缀部分 项目层是完整的仓库地址') { + constraints(nullable: false) + } + + column(name: 'username', type: 'VARCHAR(64)', remarks: '用户名') + column(name: 'password', type: 'VARCHAR(128)', remarks: '密码') + column(name: 'resource_type', type: 'VARCHAR(16)', remarks: '关联该仓库配置的层级 project/organization/site') { + constraints(nullable: false) + } + column(name: 'resource_id', type: 'BIGINT UNSIGNED', remarks: '关联该仓库配置的资源id, 项目id 组织id 平台层为0') { + constraints(nullable: false) + } + column(name: "deleted",type: 'TINYINT(1)',remarks: '软删除 0未删除 1已删除',defaultValue: 0) + column(name: "repo_private", type: 'TINYINT(1)', remarks: '是否私有 0 否 1是', defaultValue: 0) + column(name: 'repo_default', type: 'TINYINT(1)', remarks: '是否为默认仓库', defaultValue: 0) + + column(name: "object_version_number", type: "BIGINT UNSIGNED", defaultValue: "1") + column(name: "created_by", type: "BIGINT UNSIGNED", defaultValue: "0") + column(name: "creation_date", type: "DATETIME", defaultValueComputed: "CURRENT_TIMESTAMP") + column(name: "last_updated_by", type: "BIGINT UNSIGNED", defaultValue: "0") + column(name: "last_update_date", type: "DATETIME", defaultValueComputed: "CURRENT_TIMESTAMP") + } + + addUniqueConstraint(tableName: 'devops_helm_config', constraintName: 'devops_helm_config_u1', columnNames: 'resource_type,resource_id,name') + + createIndex(indexName: "devops_helm_config_n1", tableName: "devops_helm_config") { + column(name: "resource_id") + } + createIndex(indexName: "devops_helm_config_n2", tableName: "devops_helm_config") { + column(name: "resource_type") + } + } +} \ No newline at end of file diff --git a/src/main/resources/script/db/groovy/devops_service/devops_host_command.groovy b/src/main/resources/script/db/groovy/devops_service/devops_host_command.groovy index 6c95b048e8..f70ee86c85 100644 --- a/src/main/resources/script/db/groovy/devops_service/devops_host_command.groovy +++ b/src/main/resources/script/db/groovy/devops_service/devops_host_command.groovy @@ -33,5 +33,10 @@ databaseChangeLog(logicalFilePath: 'dba/devops_host_command.groovy') { } } + changeSet(author: 'lihao', id: '2022-07-18-change-column') { + modifyDataType(tableName: 'devops_host_command', columnName: 'error', newDataType: 'TEXT') + } + + } \ No newline at end of file diff --git a/src/main/resources/script/db/groovy/devops_service/devops_service.groovy b/src/main/resources/script/db/groovy/devops_service/devops_service.groovy index 2903a51232..069a91e0ba 100644 --- a/src/main/resources/script/db/groovy/devops_service/devops_service.groovy +++ b/src/main/resources/script/db/groovy/devops_service/devops_service.groovy @@ -121,4 +121,10 @@ databaseChangeLog(logicalFilePath: 'dba/devops_service.groovy') { } } + changeSet(author: 'lihao', id: '2022-07-26-add-columns') { + addColumn(tableName: 'devops_service') { + column(name: 'cluster_ip', type: 'VARCHAR(128)', remarks: 'cluster_ip', afterColumn: 'external_ip') + } + } + } \ No newline at end of file diff --git a/src/main/resources/script/db/groovy/devops_service/devops_user.groovy b/src/main/resources/script/db/groovy/devops_service/devops_user.groovy index d6e1a07abf..1752c4dea8 100644 --- a/src/main/resources/script/db/groovy/devops_service/devops_user.groovy +++ b/src/main/resources/script/db/groovy/devops_service/devops_user.groovy @@ -46,4 +46,8 @@ databaseChangeLog(logicalFilePath: 'dba/devops_user.groovy') { column(name: "gitlab_user_name") } } + changeSet(author: 'scp', id: '2022-07-06-modify-column') { + modifyDataType(tableName: 'devops_user', columnName: 'gitlab_user_name', newDataType: 'VARCHAR(100)') + } + } \ No newline at end of file diff --git a/src/main/resources/script/db/init-data/devops_service/devops_service/devops_pipeline_template.xlsx b/src/main/resources/script/db/init-data/devops_service/devops_service/devops_pipeline_template.xlsx index 7a09a90153..6e3e7a5b15 100644 Binary files a/src/main/resources/script/db/init-data/devops_service/devops_service/devops_pipeline_template.xlsx and b/src/main/resources/script/db/init-data/devops_service/devops_service/devops_pipeline_template.xlsx differ diff --git a/src/main/resources/script/db/init-data/devops_service/hzero_message/devops-project-message.xlsx b/src/main/resources/script/db/init-data/devops_service/hzero_message/devops-project-message.xlsx index 9bee32b601..07cf9d1b3a 100644 Binary files a/src/main/resources/script/db/init-data/devops_service/hzero_message/devops-project-message.xlsx and b/src/main/resources/script/db/init-data/devops_service/hzero_message/devops-project-message.xlsx differ diff --git a/src/main/resources/script/db/init-data/devops_service/hzero_message/hzero-data-message-template-open.xlsx b/src/main/resources/script/db/init-data/devops_service/hzero_message/hzero-data-message-template-open.xlsx index 74c1bcc716..0ac83f749e 100644 Binary files a/src/main/resources/script/db/init-data/devops_service/hzero_message/hzero-data-message-template-open.xlsx and b/src/main/resources/script/db/init-data/devops_service/hzero_message/hzero-data-message-template-open.xlsx differ diff --git a/src/main/resources/script/db/init-data/devops_service/hzero_platform/devops-menu-label.xlsx b/src/main/resources/script/db/init-data/devops_service/hzero_platform/devops-menu-label.xlsx index 84ca916917..b0c2e3e021 100644 Binary files a/src/main/resources/script/db/init-data/devops_service/hzero_platform/devops-menu-label.xlsx and b/src/main/resources/script/db/init-data/devops_service/hzero_platform/devops-menu-label.xlsx differ diff --git a/src/main/resources/script/db/init-data/devops_service/hzero_platform/hzero-menu-user-role-label.xlsx b/src/main/resources/script/db/init-data/devops_service/hzero_platform/hzero-menu-user-role-label.xlsx index 687b69cf7a..f643c43fef 100644 Binary files a/src/main/resources/script/db/init-data/devops_service/hzero_platform/hzero-menu-user-role-label.xlsx and b/src/main/resources/script/db/init-data/devops_service/hzero_platform/hzero-menu-user-role-label.xlsx differ diff --git a/src/main/resources/shell/ci.sh b/src/main/resources/shell/ci.sh index f8745c2ad5..febe734bb9 100644 --- a/src/main/resources/shell/ci.sh +++ b/src/main/resources/shell/ci.sh @@ -30,6 +30,7 @@ export REPO_TYPE={{ REPO_TYPE }} export HARBOR_CONFIG_ID={{ HARBOR_CONFIG_ID }} # 设置docekr认证配置文件目录 export DOCKER_CONFIG=$PWD/.choerodon/.docker +export CHOERODON_URL={{ CHOERODON_URL }} # 创建docekr认证配置文件目录 mkdir -p $DOCKER_CONFIG @@ -235,6 +236,36 @@ function chart_build() { fi fi +} + +#################################### 发布应用服务版本 #################################### +function publish_app_version() { + # 8位sha值 + export C7N_COMMIT_SHA=$(git log -1 --pretty=format:"%H" | awk '{print substr($1,1,8)}') + + # 通过Choerodon API上传chart包到devops-service + result_upload_to_devops=$(curl -X POST \ + -H 'Expect:' \ + -F "token=${Token}" \ + -F "version=${CI_COMMIT_TAG}" \ + -F "commit=${CI_COMMIT_SHA}" \ + -F "ref=${CI_COMMIT_REF_NAME}" \ + -F "gitlabPipelineId=${CI_PIPELINE_ID}" \ + -F "jobName=${CI_JOB_NAME}" \ + "${CHOERODON_URL}/devops/ci/app_version" \ + -o "${CI_COMMIT_SHA}-ci.response" \ + -w %{http_code}) + # 判断本次上传到devops是否出错 + if [ -e "${CI_COMMIT_SHA}-ci.response" ]; then + response_upload_to_devops=$(cat "${CI_COMMIT_SHA}-ci.response") + rm "${CI_COMMIT_SHA}-ci.response" + if [ "$result_upload_to_devops" != "200" ]; then + echo $response_upload_to_devops + echo "upload to devops error" + exit 1 + fi + fi + } #################################### 下载settings文件 #################################### # $1 fileName 下载settings文件后保存为的文件名称 @@ -274,7 +305,8 @@ function saveImageMetadata() { \"jobName\": \"${CI_JOB_NAME}\", \"imageTag\": \"${DOCKER_REGISTRY}/${GROUP_NAME}/${PROJECT_NAME}:${CI_COMMIT_TAG}\", \"harborRepoId\": ${HARBOR_CONFIG_ID}, - \"repoType\": \"${REPO_TYPE}\" + \"repoType\": \"${REPO_TYPE}\", + \"version\": \"${CI_COMMIT_TAG}\" }" \ -o "${CI_COMMIT_SHA}-ci.response" \ -w %{http_code}) @@ -302,6 +334,7 @@ function saveJarMetadata() { -F "sequence=$3" \ -F "gitlab_pipeline_id=${CI_PIPELINE_ID}" \ -F "job_name=${CI_JOB_NAME}" \ + -F "version=${CI_COMMIT_TAG}" \ -F "file=@pom.xml" \ "${CHOERODON_URL}/devops/ci/save_jar_metadata" \ -o "${CI_COMMIT_SHA}-ci.response" \