9d217380d6ddf6e2d923f1ab92823d203cde0bdb
[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.List;
29 import java.util.Map;
30 import java.util.Optional;
31 import javax.xml.bind.JAXB;
32 import javax.xml.parsers.DocumentBuilder;
33 import javax.xml.parsers.DocumentBuilderFactory;
34 import javax.xml.ws.Holder;
35 import org.apache.commons.lang3.mutable.MutableBoolean;
36 import org.camunda.bpm.client.task.ExternalTask;
37 import org.camunda.bpm.client.task.ExternalTaskService;
38 import org.onap.so.adapters.network.MsoNetworkAdapterImpl;
39 import org.onap.so.adapters.network.exceptions.NetworkException;
40 import org.onap.so.adapters.nwrest.ContrailNetwork;
41 import org.onap.so.adapters.nwrest.CreateNetworkRequest;
42 import org.onap.so.adapters.nwrest.DeleteNetworkRequest;
43 import org.onap.so.adapters.nwrest.ProviderVlanNetwork;
44 import org.onap.so.adapters.nwrest.RollbackNetworkRequest;
45 import org.onap.so.adapters.nwrest.UpdateNetworkRequest;
46 import org.onap.so.adapters.nwrest.UpdateNetworkResponse;
47 import org.onap.so.adapters.vnf.MsoVnfAdapterImpl;
48 import org.onap.so.adapters.vnf.MsoVnfPluginAdapterImpl;
49 import org.onap.so.adapters.vnf.VnfAdapterUtils;
50 import org.onap.so.adapters.vnf.exceptions.VnfException;
51 import org.onap.so.adapters.vnfrest.CreateVfModuleRequest;
52 import org.onap.so.adapters.vnfrest.CreateVolumeGroupRequest;
53 import org.onap.so.adapters.vnfrest.DeleteVfModuleRequest;
54 import org.onap.so.adapters.vnfrest.DeleteVolumeGroupRequest;
55 import org.onap.so.logging.tasks.AuditMDCSetup;
56 import org.onap.so.openstack.beans.NetworkRollback;
57 import org.onap.so.openstack.beans.RouteTarget;
58 import org.onap.so.utils.ExternalTaskUtils;
59 import org.slf4j.Logger;
60 import org.slf4j.LoggerFactory;
61 import org.springframework.beans.factory.annotation.Autowired;
62 import org.springframework.stereotype.Component;
63
64 @Component
65 public class StackService extends ExternalTaskUtils {
66
67     private static final Logger logger = LoggerFactory.getLogger(StackService.class);
68
69     @Autowired
70     private MsoVnfAdapterImpl vnfAdapterImpl;
71
72     @Autowired
73     private MsoNetworkAdapterImpl networkAdapterImpl;
74
75     @Autowired
76     private MsoVnfPluginAdapterImpl vnfPluginImpl;
77
78     @Autowired
79     private VnfAdapterUtils vnfAdapterUtils;
80
81     @Autowired
82     private AuditMDCSetup mdcSetup;
83
84     private static final String SHARED = "shared";
85     private static final String EXTERNAL = "external";
86
87     public void executeExternalTask(ExternalTask externalTask, ExternalTaskService externalTaskService) {
88         Map<String, Object> variables = new HashMap<>();
89         mdcSetup.setupMDC(externalTask);
90         String xmlRequest = externalTask.getVariable("openstackAdapterTaskRequest");
91         logger.debug("Starting External Task Stack Service. {}", xmlRequest);
92         MutableBoolean success = new MutableBoolean();
93         MutableBoolean backout = new MutableBoolean();
94         MutableBoolean os3Nw = new MutableBoolean();
95         Holder<String> canonicalStackId = new Holder<>();
96         String errorMessage = "";
97         try {
98             if (xmlRequest != null) {
99                 Optional<String> requestType = findRequestType(xmlRequest);
100                 Holder<Map<String, String>> subnetIdMap = new Holder<>();
101                 Holder<NetworkRollback> networkRollback = new Holder<>();
102                 if ("createVolumeGroupRequest".equals(requestType.get())) {
103                     logger.debug("Executing External Task Stack Service For Create Volume Group");
104                     createVolumeGroup(xmlRequest, canonicalStackId, backout, success);
105                 } else if ("createVfModuleRequest".equals(requestType.get())) {
106                     logger.debug("Executing External Task Stack Service For Create Vf Module");
107                     createVfModule(xmlRequest, canonicalStackId, backout, success);
108                 } else if ("deleteVfModuleRequest".equals(requestType.get())) {
109                     logger.debug("Executing External Task Stack Service For Delete Vf Module");
110                     deleteVfModule(xmlRequest, canonicalStackId, backout, success);
111                 } else if ("deleteVolumeGroupRequest".equals(requestType.get())) {
112                     logger.debug("Executing External Task Stack Service For Delete Volume Group");
113                     deleteVolumeGroup(xmlRequest, canonicalStackId, backout, success);
114                 } else if ("createNetworkRequest".equals(requestType.get())) {
115                     createNetwork(xmlRequest, subnetIdMap, networkRollback, canonicalStackId, backout, success, os3Nw);
116                 } else if ("deleteNetworkRequest".equals(requestType.get())) {
117                     deleteNetwork(xmlRequest, canonicalStackId, backout, success);
118                 } else if ("updateNetworkRequest".equals(requestType.get())) {
119                     updateNetwork(xmlRequest, subnetIdMap, networkRollback, canonicalStackId, backout, success);
120                 } else if ("rollbackNetworkRequest".equals(requestType.get())) {
121                     rollbackNetwork(xmlRequest, canonicalStackId, backout, success);
122                 }
123             }
124         } catch (Exception e) {
125             logger.error("Error during External Task Stack Service", e);
126             errorMessage = e.getMessage();
127         }
128         variables.put("backout", backout.booleanValue());
129         variables.put("OpenstackInvokeSuccess", success.booleanValue());
130         variables.put("stackId", canonicalStackId.value);
131         variables.put("openstackAdapterErrorMessage", errorMessage);
132         variables.put("PollRollbackStatus", false);
133         variables.put("rollbackPerformed", false);
134         variables.put("OpenstackRollbackSuccess", false);
135         variables.put("OpenstackPollSuccess", false);
136         variables.put("os3Nw", os3Nw.booleanValue());
137
138         if (success.isTrue()) {
139             externalTaskService.complete(externalTask, variables);
140             logger.debug("The External Task Id: {}  Successful", externalTask.getId());
141         } else {
142             logger.debug("The External Task Id: {}  Failed. Not Retrying", externalTask.getId());
143             externalTaskService.complete(externalTask, variables);
144         }
145     }
146
147     private void createVolumeGroup(String xmlRequest, Holder<String> canonicalStackId, MutableBoolean backout,
148             MutableBoolean success) throws VnfException {
149         CreateVolumeGroupRequest req = JAXB.unmarshal(new StringReader(xmlRequest), CreateVolumeGroupRequest.class);
150         String completeVnfVfModuleType = req.getVnfType() + "::" + req.getVfModuleType();
151         boolean isMulticloud = vnfAdapterUtils.isMulticloudMode(null, req.getCloudSiteId());
152         if (isMulticloud) {
153             vnfPluginImpl.createVfModule(req.getCloudSiteId(), req.getCloudOwner(), req.getTenantId(),
154                     completeVnfVfModuleType, req.getVnfVersion(), "", req.getVolumeGroupName(), "", "VOLUME", null,
155                     null, req.getModelCustomizationUuid(), req.getVolumeGroupParams(), false, true,
156                     req.getEnableBridge(), req.getMsoRequest(), canonicalStackId);
157         } else {
158             vnfAdapterImpl.createVfModule(req.getCloudSiteId(), req.getCloudOwner(), req.getTenantId(),
159                     completeVnfVfModuleType, req.getVnfVersion(), "", req.getVolumeGroupName(), "", "VOLUME", null,
160                     null, req.getModelCustomizationUuid(), req.getVolumeGroupParams(), false, true,
161                     req.getEnableBridge(), req.getMsoRequest(), canonicalStackId);
162         }
163         success.setTrue();
164         backout.setValue(!req.getSuppressBackout());
165     }
166
167     private void createVfModule(String xmlRequest, Holder<String> canonicalStackId, MutableBoolean backout,
168             MutableBoolean success) throws VnfException {
169         CreateVfModuleRequest req = JAXB.unmarshal(new StringReader(xmlRequest), CreateVfModuleRequest.class);
170         String completeVnfVfModuleType = req.getVnfType() + "::" + req.getVfModuleType();
171         boolean isMulticloud = vnfAdapterUtils.isMulticloudMode(null, req.getCloudSiteId());
172         if (isMulticloud) {
173             vnfPluginImpl.createVfModule(req.getCloudSiteId(), req.getCloudOwner(), req.getTenantId(),
174                     completeVnfVfModuleType, req.getVnfVersion(), req.getVnfId(), req.getVfModuleName(),
175                     req.getVfModuleId(), req.getRequestType(), req.getVolumeGroupStackId(),
176                     req.getBaseVfModuleStackId(), req.getModelCustomizationUuid(), req.getVfModuleParams(), false,
177                     false, req.getEnableBridge(), req.getMsoRequest(), canonicalStackId);
178         } else {
179             vnfAdapterImpl.createVfModule(req.getCloudSiteId(), req.getCloudOwner(), req.getTenantId(),
180                     completeVnfVfModuleType, req.getVnfVersion(), req.getVnfId(), req.getVfModuleName(),
181                     req.getVfModuleId(), req.getRequestType(), req.getVolumeGroupStackId(),
182                     req.getBaseVfModuleStackId(), req.getModelCustomizationUuid(), req.getVfModuleParams(), false,
183                     false, req.getEnableBridge(), req.getMsoRequest(), canonicalStackId);
184         }
185         success.setTrue();
186         backout.setValue(req.getBackout());
187     }
188
189     private void deleteVfModule(String xmlRequest, Holder<String> canonicalStackId, MutableBoolean backout,
190             MutableBoolean success) throws VnfException {
191         backout.setFalse();
192         Holder<Map<String, String>> outputs = new Holder<>();
193         DeleteVfModuleRequest req = JAXB.unmarshal(new StringReader(xmlRequest), DeleteVfModuleRequest.class);
194         boolean isMulticloud = vnfAdapterUtils.isMulticloudMode(null, req.getCloudSiteId());
195         if (isMulticloud) {
196             vnfPluginImpl.deleteVfModule(req.getCloudSiteId(), req.getCloudOwner(), req.getTenantId(),
197                     req.getVfModuleStackId(), req.getMsoRequest(), outputs);
198         } else {
199             vnfAdapterImpl.deleteVfModule(req.getCloudSiteId(), req.getCloudOwner(), req.getTenantId(),
200                     req.getVfModuleStackId(), req.getModelCustomizationUuid(), req.getMsoRequest(), outputs);
201         }
202         success.setTrue();
203         if (outputs != null && outputs.value != null) {
204             canonicalStackId.value = outputs.value.get("canonicalStackId");
205         } else {
206             canonicalStackId.value = req.getVfModuleStackId();
207         }
208     }
209
210     private void deleteVolumeGroup(String xmlRequest, Holder<String> canonicalStackId, MutableBoolean backout,
211             MutableBoolean success) throws VnfException {
212         backout.setFalse();
213         DeleteVolumeGroupRequest req = JAXB.unmarshal(new StringReader(xmlRequest), DeleteVolumeGroupRequest.class);
214         vnfAdapterImpl.deleteVfModule(req.getCloudSiteId(), req.getCloudOwner(), req.getTenantId(),
215                 req.getVolumeGroupStackId(), null, req.getMsoRequest(), new Holder<>());
216         success.setTrue();
217         canonicalStackId.value = req.getVolumeGroupStackId();
218     }
219
220     private void createNetwork(String xmlRequest, Holder<Map<String, String>> subnetIdMap,
221             Holder<NetworkRollback> networkRollback, Holder<String> canonicalStackId, MutableBoolean backout,
222             MutableBoolean success, MutableBoolean os3) throws NetworkException {
223
224         Holder<String> networkId = new Holder<>();
225         Holder<String> neutronNetworkId = new Holder<>();
226         Holder<String> networkFqdn = new Holder<>();
227
228         CreateNetworkRequest req = JAXB.unmarshal(new StringReader(xmlRequest), CreateNetworkRequest.class);
229         HashMap<String, String> params = (HashMap<String, String>) req.getNetworkParams();
230         if (params == null) {
231             params = new HashMap<>();
232         }
233         String shared = null;
234         String external = null;
235         String physicalNetworkName = null;
236         List<Integer> vlans = null;
237         List<RouteTarget> routeTargets = null;
238         List<String> fqdns = null;
239         List<String> routeTable = null;
240         if (params.containsKey(SHARED))
241             shared = params.get(SHARED);
242         if (params.containsKey(EXTERNAL))
243             external = params.get(EXTERNAL);
244         if (req.isContrailRequest()) {
245             ContrailNetwork ctn = req.getContrailNetwork();
246             if (ctn == null) {
247                 ctn = new ContrailNetwork();
248                 req.setContrailNetwork(ctn);
249             }
250             if (shared == null && ctn.getShared() != null) {
251                 shared = ctn.getShared();
252             }
253             if (shared == null && ctn.getExternal() != null) {
254                 external = ctn.getExternal();
255             }
256             routeTargets = req.getContrailNetwork().getRouteTargets();
257             fqdns = req.getContrailNetwork().getPolicyFqdns();
258             routeTable = req.getContrailNetwork().getRouteTableFqdns();
259         } else {
260             ProviderVlanNetwork pvn = req.getProviderVlanNetwork();
261             if (pvn == null) {
262                 pvn = new ProviderVlanNetwork();
263                 req.setProviderVlanNetwork(pvn);
264             }
265             physicalNetworkName = req.getProviderVlanNetwork().getPhysicalNetworkName();
266             vlans = req.getProviderVlanNetwork().getVlans();
267         }
268         networkAdapterImpl.createNetwork(req.getCloudSiteId(), req.getTenantId(), req.getNetworkType(),
269                 req.getModelCustomizationUuid(), req.getNetworkName(), physicalNetworkName, vlans, routeTargets, shared,
270                 external, req.getFailIfExists(), false, req.getSubnets(), fqdns, routeTable, req.getMsoRequest(),
271                 networkId, neutronNetworkId, networkFqdn, subnetIdMap, networkRollback, true, os3);
272         success.setTrue();
273         backout.setValue(req.getBackout());
274         canonicalStackId.value = networkRollback.value.getNetworkStackId();
275     }
276
277     private void deleteNetwork(String xmlRequest, Holder<String> canonicalStackId, MutableBoolean backout,
278             MutableBoolean success) throws NetworkException {
279         backout.setFalse();
280         DeleteNetworkRequest req = JAXB.unmarshal(new StringReader(xmlRequest), DeleteNetworkRequest.class);
281         Holder<Boolean> networkDeleted = new Holder<>();
282
283         networkAdapterImpl.deleteNetwork(req.getCloudSiteId(), req.getTenantId(), req.getNetworkType(),
284                 req.getModelCustomizationUuid(), req.getNetworkStackId(), req.getMsoRequest(), networkDeleted, false);
285
286         canonicalStackId.value = req.getNetworkStackId();
287         success.setTrue();
288     }
289
290     private void rollbackNetwork(String xmlRequest, Holder<String> canonicalStackId, MutableBoolean backout,
291             MutableBoolean success) throws NetworkException {
292         backout.setFalse();
293         RollbackNetworkRequest req = JAXB.unmarshal(new StringReader(xmlRequest), RollbackNetworkRequest.class);
294
295         NetworkRollback rollback = req.getNetworkRollback();
296         networkAdapterImpl.rollbackNetwork(rollback, false);
297
298         canonicalStackId.value = rollback.getNetworkStackId();
299         success.setTrue();
300     }
301
302     private String updateNetwork(String xmlRequest, Holder<Map<String, String>> subnetIdMap,
303             Holder<NetworkRollback> networkRollback, Holder<String> canonicalStackId, MutableBoolean backout,
304             MutableBoolean success) throws NetworkException {
305         backout.setFalse();
306         UpdateNetworkRequest req = JAXB.unmarshal(new StringReader(xmlRequest), UpdateNetworkRequest.class);
307         HashMap<String, String> params = (HashMap<String, String>) req.getNetworkParams();
308         if (params == null) {
309             params = new HashMap<>();
310         }
311         String shared = null;
312         String external = null;
313         String physicalNetworkName = null;
314         List<Integer> vlans = null;
315         List<RouteTarget> routeTargets = null;
316         List<String> fqdns = null;
317         List<String> routeTable = null;
318         if (params.containsKey(SHARED))
319             shared = params.get(SHARED);
320         if (params.containsKey(EXTERNAL))
321             external = params.get(EXTERNAL);
322         if (req.isContrailRequest()) {
323             ContrailNetwork ctn = req.getContrailNetwork();
324             if (ctn == null) {
325                 ctn = new ContrailNetwork();
326                 req.setContrailNetwork(ctn);
327             }
328             if (shared == null && ctn.getShared() != null) {
329                 shared = ctn.getShared();
330             }
331             if (shared == null && ctn.getExternal() != null) {
332                 external = ctn.getExternal();
333             }
334             routeTargets = req.getContrailNetwork().getRouteTargets();
335             fqdns = req.getContrailNetwork().getPolicyFqdns();
336             routeTable = req.getContrailNetwork().getRouteTableFqdns();
337         } else {
338             ProviderVlanNetwork pvn = req.getProviderVlanNetwork();
339             if (pvn == null) {
340                 pvn = new ProviderVlanNetwork();
341                 req.setProviderVlanNetwork(pvn);
342             }
343             physicalNetworkName = req.getProviderVlanNetwork().getPhysicalNetworkName();
344             vlans = req.getProviderVlanNetwork().getVlans();
345         }
346
347         networkAdapterImpl.updateNetwork(req.getCloudSiteId(), req.getTenantId(), req.getNetworkType(),
348                 req.getModelCustomizationUuid(), req.getNetworkStackId(), req.getNetworkName(), physicalNetworkName,
349                 vlans, routeTargets, shared, external, req.getSubnets(), fqdns, routeTable, req.getMsoRequest(),
350                 subnetIdMap, networkRollback);
351
352         success.setTrue();
353         canonicalStackId.value = req.getNetworkStackId();
354
355         UpdateNetworkResponse response =
356                 new UpdateNetworkResponse(req.getNetworkId(), null, subnetIdMap.value, req.getMessageId());
357         return response.toXmlString();
358     }
359
360
361
362     protected Optional<String> findRequestType(String xmlString) {
363         try {
364             DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
365             DocumentBuilder builder = factory.newDocumentBuilder();
366             org.w3c.dom.Document doc;
367             doc = builder.parse(new ByteArrayInputStream(xmlString.getBytes("UTF-8")));
368             return Optional.of(doc.getDocumentElement().getNodeName());
369         } catch (Exception e) {
370             logger.error("Error Finding Request Type", e);
371             return Optional.empty();
372         }
373     }
374 }