From c20cf73356071d23033fce97374bcbb24b154197 Mon Sep 17 00:00:00 2001 From: Ragha Vema Date: Tue, 20 Oct 2020 23:04:54 -0400 Subject: [PATCH] enhanced api to capture more metadata for deploys (#169) * enhanced api to capture more metadata for deploys * capture changeReference in deployment metadata --- pom.xml | 2 +- .../dashboard/rest/DeployController.java | 47 ++++++++------- .../dashboard/service/DeployService.java | 3 + .../dashboard/service/DeployServiceImpl.java | 58 ++++++++++++++++--- 4 files changed, 82 insertions(+), 28 deletions(-) diff --git a/pom.xml b/pom.xml index 389f37a7..c6f4a3c8 100644 --- a/pom.xml +++ b/pom.xml @@ -59,7 +59,7 @@ - 3.10.4 + 3.10.8 4.2.18.RELEASE 8.5.57 1.9.4 diff --git a/src/main/java/com/capitalone/dashboard/rest/DeployController.java b/src/main/java/com/capitalone/dashboard/rest/DeployController.java index e308fcf6..5afc8190 100644 --- a/src/main/java/com/capitalone/dashboard/rest/DeployController.java +++ b/src/main/java/com/capitalone/dashboard/rest/DeployController.java @@ -1,20 +1,10 @@ package com.capitalone.dashboard.rest; -import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; -import static org.springframework.http.MediaType.TEXT_XML_VALUE; -import static org.springframework.web.bind.annotation.RequestMethod.GET; -import static org.springframework.web.bind.annotation.RequestMethod.POST; - -import java.io.IOException; -import java.util.List; - -import javax.servlet.ServletInputStream; -import javax.servlet.http.HttpServletRequest; -import javax.validation.Valid; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; - +import com.capitalone.dashboard.misc.HygieiaException; +import com.capitalone.dashboard.model.DataResponse; +import com.capitalone.dashboard.model.deploy.Environment; +import com.capitalone.dashboard.request.DeployDataCreateRequest; +import com.capitalone.dashboard.service.DeployService; import org.bson.types.ObjectId; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; @@ -28,11 +18,19 @@ import org.xml.sax.InputSource; import org.xml.sax.SAXException; -import com.capitalone.dashboard.misc.HygieiaException; -import com.capitalone.dashboard.model.DataResponse; -import com.capitalone.dashboard.model.deploy.Environment; -import com.capitalone.dashboard.request.DeployDataCreateRequest; -import com.capitalone.dashboard.service.DeployService; +import javax.servlet.ServletInputStream; +import javax.servlet.http.HttpServletRequest; +import javax.validation.Valid; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import java.io.IOException; +import java.util.List; + +import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; +import static org.springframework.http.MediaType.TEXT_XML_VALUE; +import static org.springframework.web.bind.annotation.RequestMethod.GET; +import static org.springframework.web.bind.annotation.RequestMethod.POST; @RestController public class DeployController { @@ -82,6 +80,15 @@ public ResponseEntity createDeployV2(@Valid @RequestBody DeployDataCreat .body(response); } + @RequestMapping(value = "/v3/deploy", method = POST, + consumes = APPLICATION_JSON_VALUE, produces = APPLICATION_JSON_VALUE) + public ResponseEntity createDeployV3(@Valid @RequestBody DeployDataCreateRequest request) throws HygieiaException { + String response = deployService.createV3(request); + return ResponseEntity + .status(HttpStatus.CREATED) + .body(response); + } + @RequestMapping(value = "/deploy/rundeck", method = POST, consumes = TEXT_XML_VALUE, produces = APPLICATION_JSON_VALUE) public ResponseEntity createRundeckBuild(HttpServletRequest request, diff --git a/src/main/java/com/capitalone/dashboard/service/DeployService.java b/src/main/java/com/capitalone/dashboard/service/DeployService.java index 7c10176e..9287117e 100644 --- a/src/main/java/com/capitalone/dashboard/service/DeployService.java +++ b/src/main/java/com/capitalone/dashboard/service/DeployService.java @@ -23,9 +23,12 @@ public interface DeployService { String create(DeployDataCreateRequest request) throws HygieiaException; String createV2(DeployDataCreateRequest request) throws HygieiaException; + String createV3(DeployDataCreateRequest request) throws HygieiaException; DataResponse> getDeployStatus(String applicationName); String createRundeckBuild(Document doc, Map parameters, String executionId, String status) throws HygieiaException; String createRundeckBuildV2(Document doc, Map parameters, String executionId, String status) throws HygieiaException; + + } diff --git a/src/main/java/com/capitalone/dashboard/service/DeployServiceImpl.java b/src/main/java/com/capitalone/dashboard/service/DeployServiceImpl.java index 197a9aba..f8b08de4 100644 --- a/src/main/java/com/capitalone/dashboard/service/DeployServiceImpl.java +++ b/src/main/java/com/capitalone/dashboard/service/DeployServiceImpl.java @@ -1,6 +1,7 @@ package com.capitalone.dashboard.service; import com.capitalone.dashboard.misc.HygieiaException; +import com.capitalone.dashboard.model.Build; import com.capitalone.dashboard.model.Collector; import com.capitalone.dashboard.model.CollectorItem; import com.capitalone.dashboard.model.CollectorType; @@ -11,6 +12,7 @@ import com.capitalone.dashboard.model.deploy.DeployableUnit; import com.capitalone.dashboard.model.deploy.Environment; import com.capitalone.dashboard.model.deploy.Server; +import com.capitalone.dashboard.repository.BuildRepository; import com.capitalone.dashboard.repository.CollectorItemRepository; import com.capitalone.dashboard.repository.CollectorRepository; import com.capitalone.dashboard.repository.ComponentRepository; @@ -20,6 +22,7 @@ import com.capitalone.dashboard.request.DeployDataCreateRequest; import com.google.common.base.Predicate; import com.google.common.collect.Iterables; +import org.apache.commons.collections4.IterableUtils; import org.apache.commons.lang3.StringUtils; import org.bson.types.ObjectId; import org.springframework.beans.factory.annotation.Autowired; @@ -43,6 +46,7 @@ import java.util.regex.Pattern; import java.util.stream.Collectors; import java.util.stream.IntStream; +import java.util.stream.Stream; import static com.capitalone.dashboard.service.DeployServiceImpl.RundeckXMLParser.getAttributeValue; import static com.capitalone.dashboard.service.DeployServiceImpl.RundeckXMLParser.getChildNodeAttribute; @@ -60,19 +64,23 @@ public class DeployServiceImpl implements DeployService { private final EnvironmentStatusRepository environmentStatusRepository; private final CollectorRepository collectorRepository; private final CollectorItemRepository collectorItemRepository; + private final BuildRepository buildRepository; private final CollectorService collectorService; + @Autowired public DeployServiceImpl(ComponentRepository componentRepository, EnvironmentComponentRepository environmentComponentRepository, EnvironmentStatusRepository environmentStatusRepository, - CollectorRepository collectorRepository, CollectorItemRepository collectorItemRepository, CollectorService collectorService) { + CollectorRepository collectorRepository, CollectorItemRepository collectorItemRepository, + CollectorService collectorService, BuildRepository buildRepository) { this.componentRepository = componentRepository; this.environmentComponentRepository = environmentComponentRepository; this.environmentStatusRepository = environmentStatusRepository; this.collectorRepository = collectorRepository; this.collectorItemRepository = collectorItemRepository; this.collectorService = collectorService; + this.buildRepository = buildRepository; } @Override @@ -174,7 +182,7 @@ public Server apply(EnvironmentStatus status) { } - protected EnvironmentComponent createDeploy(DeployDataCreateRequest request) throws HygieiaException { + protected EnvironmentComponent createDeploy(DeployDataCreateRequest request, boolean associateBuild) throws HygieiaException { /* Step 1: create Collector if not there Step 2: create Collector item if not there @@ -192,7 +200,7 @@ protected EnvironmentComponent createDeploy(DeployDataCreateRequest request) thr throw new HygieiaException("Failed creating Deploy collector item.", HygieiaException.COLLECTOR_ITEM_CREATE_ERROR); } - EnvironmentComponent deploy = createEnvComponent(collectorItem, request); + EnvironmentComponent deploy = createEnvComponent(collectorItem, request, associateBuild); if (deploy == null) { throw new HygieiaException("Failed inserting/updating Deployment information.", HygieiaException.ERROR_INSERTING_DATA); @@ -204,13 +212,19 @@ protected EnvironmentComponent createDeploy(DeployDataCreateRequest request) thr @Override public String create(DeployDataCreateRequest request) throws HygieiaException { - EnvironmentComponent deploy = createDeploy(request); + EnvironmentComponent deploy = createDeploy(request, Boolean.FALSE); return deploy.getId().toString(); } @Override public String createV2(DeployDataCreateRequest request) throws HygieiaException { - EnvironmentComponent deploy = createDeploy(request); + EnvironmentComponent deploy = createDeploy(request, Boolean.FALSE); + return String.format("%s,%s", deploy.getId().toString(), deploy.getCollectorItemId().toString()); + + } + + public String createV3(DeployDataCreateRequest request) throws HygieiaException { + EnvironmentComponent deploy = createDeploy(request, Boolean.TRUE); return String.format("%s,%s", deploy.getId().toString(), deploy.getCollectorItemId().toString()); } @@ -263,28 +277,58 @@ private CollectorItem createCollectorItem(Collector collector, DeployDataCreateR return collectorService.createCollectorItem(tempCi); } - private EnvironmentComponent createEnvComponent(CollectorItem collectorItem, DeployDataCreateRequest request) { + private EnvironmentComponent createEnvComponent(CollectorItem collectorItem, DeployDataCreateRequest request, boolean associateBuild) { EnvironmentComponent deploy = environmentComponentRepository. findByUniqueKey(collectorItem.getId(), request.getArtifactName(), request.getArtifactName(), request.getEndTime()); if (deploy == null) { deploy = new EnvironmentComponent(); } - + deploy.setChangeReference(request.getExecutionId()); deploy.setAsOfDate(System.currentTimeMillis()); deploy.setCollectorItemId(collectorItem.getId()); deploy.setComponentID(request.getArtifactGroup()); deploy.setComponentName(request.getArtifactName()); + deploy.setComponentPath( request.getArtifactPath()); + deploy.setServiceName (request.getAppServiceName()); + deploy.setApplicationName (request.getAppName()); deploy.setComponentVersion(request.getArtifactVersion()); deploy.setCollectorItemId(collectorItem.getId()); deploy.setEnvironmentName(request.getEnvName()); deploy.setEnvironmentUrl(request.getInstanceUrl()); deploy.setJobUrl(request.getJobUrl()); deploy.setDeployTime(request.getEndTime()); + deploy.setJobStageName(request.getStageName()); + deploy.setJobStageStatus(request.getStageStatus()); + if(associateBuild) { + associateBuildToDeploy(request, deploy); + } deploy.setDeployed("SUCCESS".equalsIgnoreCase(request.getDeployStatus())); return environmentComponentRepository.save(deploy); // Save = Update (if ID present) or Insert (if ID not there) } + private void associateBuildToDeploy(DeployDataCreateRequest request, EnvironmentComponent deploy) { + + String collectorName = StringUtils.isNotEmpty(request.getCollectorName()) ? request.getCollectorName() : "Hudson"; + List collectors = collectorRepository.findByCollectorTypeAndName(CollectorType.Build, collectorName); + Optional collector = collectors.stream().findFirst(); + if(!collector.isPresent()) return; + + ObjectId buildCollectorId = collector.get().getId(); + Map option = new HashMap<>(); + option.put("jobName", request.getJobName()); + option.put("jobUrl", request.getJobUrl()); + option.put("instanceUrl", request.getInstanceUrl()); + + List buildCollectorItems = IterableUtils.toList(collectorItemRepository.findAllByOptionMapAndCollectorIdsIn(option, Stream.of(buildCollectorId).collect(Collectors.toList()))); + Optional enabledCollectorItem = buildCollectorItems.stream().filter(CollectorItem::isEnabled).findFirst(); + if(!enabledCollectorItem.isPresent()) return; // Need to handle the case of create build collector item later + + Build build =buildRepository.findByCollectorItemIdAndNumber(enabledCollectorItem.get().getId(), request.getJobNumber()); + if(build == null) return; // Need to handle the case of create build later + deploy.setBuildId(build.getId()); + } + protected DeployDataCreateRequest createRundeck(Document doc, Map parameters, String executionId, String status) throws HygieiaException { Node executionNode = doc.getElementsByTagName("execution").item(0); Node jobNode = executionNode.getFirstChild();