1 package org.onap.so.adapters.tasks.orchestration;
3 import java.io.ByteArrayInputStream;
4 import java.io.StringReader;
5 import java.nio.charset.StandardCharsets;
6 import java.util.HashMap;
8 import java.util.Optional;
9 import javax.xml.XMLConstants;
10 import javax.xml.bind.JAXB;
11 import javax.xml.parsers.DocumentBuilder;
12 import javax.xml.parsers.DocumentBuilderFactory;
13 import javax.xml.ws.Holder;
14 import org.apache.commons.lang3.StringUtils;
15 import org.camunda.bpm.client.task.ExternalTask;
16 import org.camunda.bpm.client.task.ExternalTaskService;
17 import org.onap.so.adapters.network.MsoNetworkAdapterImpl;
18 import org.onap.so.adapters.nwrest.CreateNetworkRequest;
19 import org.onap.so.adapters.vnf.MsoVnfAdapterImpl;
20 import org.onap.so.adapters.vnf.MsoVnfPluginAdapterImpl;
21 import org.onap.so.adapters.vnf.VnfAdapterUtils;
22 import org.onap.so.adapters.vnfrest.CreateVfModuleRequest;
23 import org.onap.so.adapters.vnfrest.CreateVolumeGroupRequest;
24 import org.onap.so.logging.tasks.AuditMDCSetup;
25 import org.onap.so.utils.ExternalTaskUtils;
26 import org.slf4j.Logger;
27 import org.slf4j.LoggerFactory;
28 import org.springframework.beans.factory.annotation.Autowired;
29 import org.springframework.stereotype.Component;
30 import org.w3c.dom.Document;
33 public class RollbackService extends ExternalTaskUtils {
35 private static final Logger logger = LoggerFactory.getLogger(RollbackService.class);
38 private MsoVnfAdapterImpl vnfAdapterImpl;
41 private MsoNetworkAdapterImpl networkAdapterImpl;
44 private VnfAdapterUtils vnfAdapterUtils;
47 private MsoVnfPluginAdapterImpl vnfPluginImpl;
50 private AuditMDCSetup mdcSetup;
52 public void executeExternalTask(ExternalTask externalTask, ExternalTaskService externalTaskService) {
53 mdcSetup.setupMDC(externalTask);
54 logger.debug("Starting External Task Rollback Service");
55 Map<String, Object> variables = new HashMap<>();
56 boolean success = false;
57 boolean pollRollbackStatus = false;
59 String xmlRequest = externalTask.getVariable("openstackAdapterTaskRequest");
60 if (xmlRequest != null) {
61 Optional<String> requestType = findRequestType(xmlRequest);
62 if ("createVolumeGroupRequest".equals(requestType.get())) {
63 logger.debug("Executing External Task Rollback Service for Create Volume Group");
64 CreateVolumeGroupRequest req =
65 JAXB.unmarshal(new StringReader(xmlRequest), CreateVolumeGroupRequest.class);
66 boolean isMulticloud = vnfAdapterUtils.isMulticloudMode(null, req.getCloudSiteId());
68 vnfAdapterImpl.deleteVfModule(req.getCloudSiteId(), req.getCloudOwner(), req.getTenantId(),
69 req.getVolumeGroupName(), null, req.getMsoRequest(), new Holder<>());
70 pollRollbackStatus = true;
73 vnfPluginImpl.deleteVnf(req.getCloudSiteId(), req.getCloudOwner(), req.getTenantId(),
74 req.getVolumeGroupName(), req.getMsoRequest());
75 pollRollbackStatus = false;
78 } else if ("createVfModuleRequest".equals(requestType.get())) {
79 logger.debug("Executing External Task Rollback Service for Create Vf Module");
80 CreateVfModuleRequest req =
81 JAXB.unmarshal(new StringReader(xmlRequest), CreateVfModuleRequest.class);
82 boolean isMulticloud = vnfAdapterUtils.isMulticloudMode(null, req.getCloudSiteId());
84 vnfAdapterImpl.deleteVfModule(req.getCloudSiteId(), req.getCloudOwner(), req.getTenantId(),
85 req.getVfModuleName(), req.getModelCustomizationUuid(), req.getMsoRequest(),
87 pollRollbackStatus = true;
90 pollRollbackStatus = false;
93 } else if ("createNetworkRequest".equals(requestType.get())) {
94 logger.debug("Executing External Task Rollback Service for Create Network");
95 CreateNetworkRequest req = JAXB.unmarshal(new StringReader(xmlRequest), CreateNetworkRequest.class);
96 networkAdapterImpl.deleteNetwork(req.getCloudSiteId(), req.getTenantId(), req.getNetworkType(),
97 req.getModelCustomizationUuid(), req.getNetworkName(), req.getMsoRequest());
98 pollRollbackStatus = true;
102 } catch (Exception e) {
103 logger.error("Error during External Task Rollback Service", e);
105 variables.put("OpenstackRollbackSuccess", success);
106 variables.put("rollbackPerformed", true);
107 variables.put("PollRollbackStatus", pollRollbackStatus);
109 externalTaskService.complete(externalTask, variables);
110 logger.debug("The External Task Id: {} Successful", externalTask.getId());
112 logger.debug("The External Task Id: {} Failed. Not Retrying", externalTask.getId());
113 externalTaskService.complete(externalTask, variables);
117 protected Optional<String> findRequestType(final String xmlString) {
119 final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
120 factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, StringUtils.EMPTY);
121 factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, StringUtils.EMPTY);
123 final DocumentBuilder builder = factory.newDocumentBuilder();
124 final Document doc = builder.parse(new ByteArrayInputStream(xmlString.getBytes(StandardCharsets.UTF_8)));
125 return Optional.of(doc.getDocumentElement().getNodeName());
126 } catch (final Exception e) {
127 logger.error("Error Finding Request Type", e);
128 return Optional.empty();