2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017-2019 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Modifications Copyright (c) 2019 Samsung
8 * ================================================================================
9 * Licensed under the Apache License, Version 2.0 (the "License");
10 * you may not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
13 * http://www.apache.org/licenses/LICENSE-2.0
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS,
17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
20 * ============LICENSE_END=========================================================
23 package org.onap.so.adapters.tasks.orchestration;
25 import java.io.ByteArrayInputStream;
26 import java.io.StringReader;
27 import java.util.HashMap;
29 import java.util.Optional;
30 import javax.xml.bind.JAXB;
31 import javax.xml.parsers.DocumentBuilder;
32 import javax.xml.parsers.DocumentBuilderFactory;
33 import javax.xml.ws.Holder;
34 import org.apache.commons.lang3.mutable.MutableBoolean;
35 import org.camunda.bpm.client.task.ExternalTask;
36 import org.camunda.bpm.client.task.ExternalTaskService;
37 import org.onap.so.adapters.vnf.MsoVnfAdapterImpl;
38 import org.onap.so.adapters.vnf.exceptions.VnfException;
39 import org.onap.so.adapters.vnfrest.CreateVfModuleRequest;
40 import org.onap.so.adapters.vnfrest.CreateVfModuleResponse;
41 import org.onap.so.adapters.vnfrest.CreateVolumeGroupRequest;
42 import org.onap.so.adapters.vnfrest.CreateVolumeGroupResponse;
43 import org.onap.so.adapters.vnfrest.DeleteVfModuleRequest;
44 import org.onap.so.adapters.vnfrest.DeleteVfModuleResponse;
45 import org.onap.so.adapters.vnfrest.DeleteVolumeGroupRequest;
46 import org.onap.so.adapters.vnfrest.DeleteVolumeGroupResponse;
47 import org.onap.so.adapters.vnfrest.VfModuleRollback;
48 import org.onap.so.adapters.vnfrest.VolumeGroupRollback;
49 import org.onap.so.logging.tasks.AuditMDCSetup;
50 import org.onap.so.openstack.beans.VnfRollback;
51 import org.onap.so.utils.ExternalTaskUtils;
52 import org.slf4j.Logger;
53 import org.slf4j.LoggerFactory;
54 import org.springframework.beans.factory.annotation.Autowired;
55 import org.springframework.stereotype.Component;
58 public class StackService extends ExternalTaskUtils {
60 private static final Logger logger = LoggerFactory.getLogger(StackService.class);
63 private MsoVnfAdapterImpl vnfAdapterImpl;
66 private AuditMDCSetup mdcSetup;
68 public void executeExternalTask(ExternalTask externalTask, ExternalTaskService externalTaskService) {
69 Map<String, Object> variables = new HashMap<>();
70 mdcSetup.setupMDC(externalTask);
71 String xmlRequest = externalTask.getVariable("vnfAdapterTaskRequest");
72 logger.debug("Executing External Task Stack Service. {}", xmlRequest);
73 MutableBoolean success = new MutableBoolean();
74 MutableBoolean backout = new MutableBoolean();
76 Holder<String> canonicalStackId = new Holder<>();
77 String errorMessage = "";
79 if (xmlRequest != null) {
80 Holder<Map<String, String>> outputs = new Holder<>();
81 Holder<VnfRollback> vnfRollback = new Holder<>();
82 Optional<String> requestType = findRequestType(xmlRequest);
83 if ("createVolumeGroupRequest".equals(requestType.get())) {
84 logger.debug("Executing External Task Stack Service For Create Volume Group");
85 response = createVolumeGroup(xmlRequest, outputs, vnfRollback, canonicalStackId, backout, success);
86 } else if ("createVfModuleRequest".equals(requestType.get())) {
87 logger.debug("Executing External Task Stack Service For Create Vf Module");
88 response = createVfModule(xmlRequest, outputs, vnfRollback, canonicalStackId, backout, success);
89 } else if ("deleteVfModuleRequest".equals(requestType.get())) {
90 logger.debug("Executing External Task Stack Service For Delete Vf Module");
91 response = deleteVfModule(xmlRequest, outputs, vnfRollback, canonicalStackId, backout, success);
92 } else if ("deleteVolumeGroupRequest".equals(requestType.get())) {
93 logger.debug("Executing External Task Stack Service For Delete Volume Group");
94 response = deleteVolumeGroup(xmlRequest, outputs, vnfRollback, canonicalStackId, backout, success);
97 } catch (Exception e) {
98 logger.error("Error during External Task Stack Service", e);
99 errorMessage = e.getMessage();
101 variables.put("backout", backout.booleanValue());
102 variables.put("WorkflowResponse", response);
103 variables.put("OpenstackInvokeSuccess", success.booleanValue());
104 variables.put("stackId", canonicalStackId.value);
105 variables.put("openstackAdapterErrorMessage", errorMessage);
106 variables.put("PollRollbackStatus", false);
107 variables.put("rollbackPerformed", false);
108 variables.put("OpenstackRollbackSuccess", false);
109 variables.put("OpenstackPollSuccess", false);
111 if (success.isTrue()) {
112 externalTaskService.complete(externalTask, variables);
113 logger.debug("The External Task Id: {} Successful", externalTask.getId());
115 logger.debug("The External Task Id: {} Failed. Not Retrying", externalTask.getId());
116 externalTaskService.complete(externalTask, variables);
120 private String createVolumeGroup(String xmlRequest, Holder<Map<String, String>> outputs,
121 Holder<VnfRollback> vnfRollback, Holder<String> canonicalStackId, MutableBoolean backout,
122 MutableBoolean success) throws VnfException {
123 Holder<String> stackId = new Holder<>();
124 CreateVolumeGroupRequest req = JAXB.unmarshal(new StringReader(xmlRequest), CreateVolumeGroupRequest.class);
125 String completeVnfVfModuleType = req.getVnfType() + "::" + req.getVfModuleType();
126 vnfAdapterImpl.createVfModule(req.getCloudSiteId(), req.getCloudOwner(), req.getTenantId(),
127 completeVnfVfModuleType, req.getVnfVersion(), "", req.getVolumeGroupName(), "", "VOLUME", null, null,
128 req.getModelCustomizationUuid(), req.getVolumeGroupParams(), false, true, req.getEnableBridge(),
129 req.getMsoRequest(), stackId, outputs, vnfRollback);
131 backout.setValue(!req.getSuppressBackout());
132 VolumeGroupRollback rb = new VolumeGroupRollback(req.getVolumeGroupId(), stackId.value,
133 vnfRollback.value.getVnfCreated(), req.getTenantId(), req.getCloudOwner(), req.getCloudSiteId(),
134 req.getMsoRequest(), req.getMessageId());
135 canonicalStackId.value = stackId.value;
136 CreateVolumeGroupResponse createResponse = new CreateVolumeGroupResponse(req.getVolumeGroupId(), stackId.value,
137 vnfRollback.value.getVnfCreated(), outputs.value, rb, req.getMessageId());
138 return createResponse.toXmlString();
141 private String createVfModule(String xmlRequest, Holder<Map<String, String>> outputs,
142 Holder<VnfRollback> vnfRollback, Holder<String> canonicalStackId, MutableBoolean backout,
143 MutableBoolean success) throws VnfException {
144 Holder<String> stackId = new Holder<>();
145 CreateVfModuleRequest req = JAXB.unmarshal(new StringReader(xmlRequest), CreateVfModuleRequest.class);
146 String completeVnfVfModuleType = req.getVnfType() + "::" + req.getVfModuleType();
147 vnfAdapterImpl.createVfModule(req.getCloudSiteId(), req.getCloudOwner(), req.getTenantId(),
148 completeVnfVfModuleType, req.getVnfVersion(), req.getVnfId(), req.getVfModuleName(),
149 req.getVfModuleId(), req.getRequestType(), req.getVolumeGroupStackId(), req.getBaseVfModuleStackId(),
150 req.getModelCustomizationUuid(), req.getVfModuleParams(), false, false, req.getEnableBridge(),
151 req.getMsoRequest(), stackId, outputs, vnfRollback);
153 backout.setValue(req.getBackout());
154 canonicalStackId.value = stackId.value;
155 VfModuleRollback modRollback =
156 new VfModuleRollback(vnfRollback.value, req.getVfModuleId(), stackId.value, req.getMessageId());
157 CreateVfModuleResponse createResponse = new CreateVfModuleResponse(req.getVnfId(), req.getVfModuleId(),
158 stackId.value, Boolean.TRUE, outputs.value, modRollback, req.getMessageId());
159 return createResponse.toXmlString();
162 private String deleteVfModule(String xmlRequest, Holder<Map<String, String>> outputs,
163 Holder<VnfRollback> vnfRollback, Holder<String> canonicalStackId, MutableBoolean backout,
164 MutableBoolean success) throws VnfException {
166 DeleteVfModuleRequest req = JAXB.unmarshal(new StringReader(xmlRequest), DeleteVfModuleRequest.class);
167 vnfAdapterImpl.deleteVfModule(req.getCloudSiteId(), req.getCloudOwner(), req.getTenantId(),
168 req.getVfModuleStackId(), req.getVnfId(), req.getVfModuleId(), req.getModelCustomizationUuid(),
169 req.getMsoRequest(), outputs);
171 if (outputs != null && outputs.value != null) {
172 canonicalStackId.value = outputs.value.get("canonicalStackId");
174 canonicalStackId.value = req.getVfModuleStackId();
176 DeleteVfModuleResponse deleteResponse = new DeleteVfModuleResponse(req.getVnfId(), req.getVfModuleId(),
177 Boolean.TRUE, req.getMessageId(), outputs.value);
178 return deleteResponse.toXmlString();
181 private String deleteVolumeGroup(String xmlRequest, Holder<Map<String, String>> outputs,
182 Holder<VnfRollback> vnfRollback, Holder<String> canonicalStackId, MutableBoolean backout,
183 MutableBoolean success) throws VnfException {
185 DeleteVolumeGroupRequest req = JAXB.unmarshal(new StringReader(xmlRequest), DeleteVolumeGroupRequest.class);
187 vnfAdapterImpl.deleteVnf(req.getCloudSiteId(), req.getCloudOwner(), req.getTenantId(),
188 req.getVolumeGroupStackId(), req.getMsoRequest(), false);
190 canonicalStackId.value = req.getVolumeGroupStackId();
191 DeleteVolumeGroupResponse deleteResponse = new DeleteVolumeGroupResponse(true, req.getMessageId());
192 return deleteResponse.toXmlString();
195 protected Optional<String> findRequestType(String xmlString) {
197 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
198 DocumentBuilder builder = factory.newDocumentBuilder();
199 org.w3c.dom.Document doc;
200 doc = builder.parse(new ByteArrayInputStream(xmlString.getBytes("UTF-8")));
201 return Optional.of(doc.getDocumentElement().getNodeName());
202 } catch (Exception e) {
203 logger.error("Error Finding Request Type", e);
204 return Optional.empty();