Skip to content
This repository has been archived by the owner on Oct 2, 2023. It is now read-only.

Commit

Permalink
enhanced api to capture more metadata for deploys (#169)
Browse files Browse the repository at this point in the history
* enhanced api to capture more metadata for deploys

* capture changeReference in deployment metadata
  • Loading branch information
rvema authored Oct 21, 2020
1 parent 1a44275 commit c20cf73
Show file tree
Hide file tree
Showing 4 changed files with 82 additions and 28 deletions.
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@

<properties>
<!-- Dependencies -->
<com.capitalone.dashboard.core.version>3.10.4</com.capitalone.dashboard.core.version>
<com.capitalone.dashboard.core.version>3.10.8</com.capitalone.dashboard.core.version>
<spring-security.version>4.2.18.RELEASE</spring-security.version>
<tomcat.version>8.5.57</tomcat.version>
<commons-beanutils.version>1.9.4</commons-beanutils.version>
Expand Down
47 changes: 27 additions & 20 deletions src/main/java/com/capitalone/dashboard/rest/DeployController.java
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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 {
Expand Down Expand Up @@ -82,6 +80,15 @@ public ResponseEntity<String> createDeployV2(@Valid @RequestBody DeployDataCreat
.body(response);
}

@RequestMapping(value = "/v3/deploy", method = POST,
consumes = APPLICATION_JSON_VALUE, produces = APPLICATION_JSON_VALUE)
public ResponseEntity<String> 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<String> createRundeckBuild(HttpServletRequest request,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<List<Environment>> getDeployStatus(String applicationName);

String createRundeckBuild(Document doc, Map<String, String[]> parameters, String executionId, String status) throws HygieiaException;
String createRundeckBuildV2(Document doc, Map<String, String[]> parameters, String executionId, String status) throws HygieiaException;


}
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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;
Expand All @@ -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;
Expand All @@ -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;
Expand All @@ -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
Expand Down Expand Up @@ -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
Expand All @@ -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);
Expand All @@ -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());

}
Expand Down Expand Up @@ -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<Collector> collectors = collectorRepository.findByCollectorTypeAndName(CollectorType.Build, collectorName);
Optional<Collector> collector = collectors.stream().findFirst();
if(!collector.isPresent()) return;

ObjectId buildCollectorId = collector.get().getId();
Map<String, Object> option = new HashMap<>();
option.put("jobName", request.getJobName());
option.put("jobUrl", request.getJobUrl());
option.put("instanceUrl", request.getInstanceUrl());

List<CollectorItem> buildCollectorItems = IterableUtils.toList(collectorItemRepository.findAllByOptionMapAndCollectorIdsIn(option, Stream.of(buildCollectorId).collect(Collectors.toList())));
Optional<CollectorItem> 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<String, String[]> parameters, String executionId, String status) throws HygieiaException {
Node executionNode = doc.getElementsByTagName("execution").item(0);
Node jobNode = executionNode.getFirstChild();
Expand Down

0 comments on commit c20cf73

Please sign in to comment.