34952a056b00821703510f88b1d839fd5b7dc4a1
[so.git] /
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP - SO
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
12  *
13  *      http://www.apache.org/licenses/LICENSE-2.0
14  *
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=========================================================
21  */
22
23 package org.onap.so.adapters.tasks.orchestration;
24
25 import java.io.ByteArrayInputStream;
26 import java.io.StringReader;
27 import java.util.HashMap;
28 import java.util.Map;
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;
56
57 @Component
58 public class StackService extends ExternalTaskUtils {
59
60     private static final Logger logger = LoggerFactory.getLogger(StackService.class);
61
62     @Autowired
63     private MsoVnfAdapterImpl vnfAdapterImpl;
64
65     @Autowired
66     private AuditMDCSetup mdcSetup;
67
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();
75         String response = "";
76         Holder<String> canonicalStackId = new Holder<>();
77         String errorMessage = "";
78         try {
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);
95                 }
96             }
97         } catch (Exception e) {
98             logger.error("Error during External Task Stack Service", e);
99             errorMessage = e.getMessage();
100         }
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);
110
111         if (success.isTrue()) {
112             externalTaskService.complete(externalTask, variables);
113             logger.debug("The External Task Id: {}  Successful", externalTask.getId());
114         } else {
115             logger.debug("The External Task Id: {}  Failed. Not Retrying", externalTask.getId());
116             externalTaskService.complete(externalTask, variables);
117         }
118     }
119
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);
130         success.setTrue();
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();
139     }
140
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);
152         success.setTrue();
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();
160     }
161
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 {
165         backout.setFalse();
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);
170         success.setTrue();
171         if (outputs != null && outputs.value != null) {
172             canonicalStackId.value = outputs.value.get("canonicalStackId");
173         } else {
174             canonicalStackId.value = req.getVfModuleStackId();
175         }
176         DeleteVfModuleResponse deleteResponse = new DeleteVfModuleResponse(req.getVnfId(), req.getVfModuleId(),
177                 Boolean.TRUE, req.getMessageId(), outputs.value);
178         return deleteResponse.toXmlString();
179     }
180
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 {
184         backout.setFalse();
185         DeleteVolumeGroupRequest req = JAXB.unmarshal(new StringReader(xmlRequest), DeleteVolumeGroupRequest.class);
186
187         vnfAdapterImpl.deleteVnf(req.getCloudSiteId(), req.getCloudOwner(), req.getTenantId(),
188                 req.getVolumeGroupStackId(), req.getMsoRequest(), false);
189         success.setTrue();
190         canonicalStackId.value = req.getVolumeGroupStackId();
191         DeleteVolumeGroupResponse deleteResponse = new DeleteVolumeGroupResponse(true, req.getMessageId());
192         return deleteResponse.toXmlString();
193     }
194
195     protected Optional<String> findRequestType(String xmlString) {
196         try {
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();
205         }
206     }
207 }