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;
28 import java.util.List;
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.CreateNetworkResponse;
43 import org.onap.so.adapters.nwrest.DeleteNetworkRequest;
44 import org.onap.so.adapters.nwrest.DeleteNetworkResponse;
45 import org.onap.so.adapters.nwrest.ProviderVlanNetwork;
46 import org.onap.so.adapters.nwrest.RollbackNetworkRequest;
47 import org.onap.so.adapters.nwrest.RollbackNetworkResponse;
48 import org.onap.so.adapters.nwrest.UpdateNetworkRequest;
49 import org.onap.so.adapters.nwrest.UpdateNetworkResponse;
50 import org.onap.so.adapters.vnf.MsoVnfAdapterImpl;
51 import org.onap.so.adapters.vnf.MsoVnfPluginAdapterImpl;
52 import org.onap.so.adapters.vnf.VnfAdapterUtils;
53 import org.onap.so.adapters.vnf.exceptions.VnfException;
54 import org.onap.so.adapters.vnfrest.CreateVfModuleRequest;
55 import org.onap.so.adapters.vnfrest.CreateVfModuleResponse;
56 import org.onap.so.adapters.vnfrest.CreateVolumeGroupRequest;
57 import org.onap.so.adapters.vnfrest.CreateVolumeGroupResponse;
58 import org.onap.so.adapters.vnfrest.DeleteVfModuleRequest;
59 import org.onap.so.adapters.vnfrest.DeleteVfModuleResponse;
60 import org.onap.so.adapters.vnfrest.DeleteVolumeGroupRequest;
61 import org.onap.so.adapters.vnfrest.DeleteVolumeGroupResponse;
62 import org.onap.so.adapters.vnfrest.VfModuleRollback;
63 import org.onap.so.adapters.vnfrest.VolumeGroupRollback;
64 import org.onap.so.logging.tasks.AuditMDCSetup;
65 import org.onap.so.openstack.beans.NetworkRollback;
66 import org.onap.so.openstack.beans.RouteTarget;
67 import org.onap.so.openstack.beans.VnfRollback;
68 import org.onap.so.utils.ExternalTaskUtils;
69 import org.slf4j.Logger;
70 import org.slf4j.LoggerFactory;
71 import org.springframework.beans.factory.annotation.Autowired;
72 import org.springframework.stereotype.Component;
75 public class StackService extends ExternalTaskUtils {
77 private static final Logger logger = LoggerFactory.getLogger(StackService.class);
80 private MsoVnfAdapterImpl vnfAdapterImpl;
83 private MsoNetworkAdapterImpl networkAdapterImpl;
86 private MsoVnfPluginAdapterImpl vnfPluginImpl;
89 private VnfAdapterUtils vnfAdapterUtils;
92 private AuditMDCSetup mdcSetup;
94 private static final String SHARED = "shared";
95 private static final String EXTERNAL = "external";
97 // TODO set backout earlier in case of exception??
98 public void executeExternalTask(ExternalTask externalTask, ExternalTaskService externalTaskService) {
99 Map<String, Object> variables = new HashMap<>();
100 mdcSetup.setupMDC(externalTask);
101 String xmlRequest = externalTask.getVariable("openstackAdapterTaskRequest");
102 logger.debug("Starting External Task Stack Service. {}", xmlRequest);
103 MutableBoolean success = new MutableBoolean();
104 MutableBoolean backout = new MutableBoolean();
105 String response = "";
106 Holder<String> canonicalStackId = new Holder<>();
107 String errorMessage = "";
109 if (xmlRequest != null) {
110 Holder<Map<String, String>> outputs = new Holder<>();
111 Holder<VnfRollback> vnfRollback = new Holder<>();
112 Optional<String> requestType = findRequestType(xmlRequest);
113 Holder<String> networkId = new Holder<>();
114 Holder<String> neutronNetworkId = new Holder<>();
115 Holder<String> networkFqdn = new Holder<>();
116 Holder<Map<String, String>> subnetIdMap = new Holder<>();
117 Holder<NetworkRollback> networkRollback = new Holder<>();
118 if ("createVolumeGroupRequest".equals(requestType.get())) {
119 logger.debug("Executing External Task Stack Service For Create Volume Group");
120 response = createVolumeGroup(xmlRequest, outputs, vnfRollback, canonicalStackId, backout, success);
121 } else if ("createVfModuleRequest".equals(requestType.get())) {
122 logger.debug("Executing External Task Stack Service For Create Vf Module");
123 response = createVfModule(xmlRequest, outputs, vnfRollback, canonicalStackId, backout, success);
124 } else if ("deleteVfModuleRequest".equals(requestType.get())) {
125 logger.debug("Executing External Task Stack Service For Delete Vf Module");
126 response = deleteVfModule(xmlRequest, outputs, vnfRollback, canonicalStackId, backout, success);
127 } else if ("deleteVolumeGroupRequest".equals(requestType.get())) {
128 logger.debug("Executing External Task Stack Service For Delete Volume Group");
129 response = deleteVolumeGroup(xmlRequest, outputs, vnfRollback, canonicalStackId, backout, success);
130 } else if ("createNetworkRequest".equals(requestType.get())) {
131 response = createNetwork(xmlRequest, networkId, neutronNetworkId, networkFqdn, subnetIdMap,
132 networkRollback, canonicalStackId, backout, success);
133 } else if ("deleteNetworkRequest".equals(requestType.get())) {
134 response = deleteNetwork(xmlRequest, canonicalStackId, backout, success);
135 } else if ("updateNetworkRequest".equals(requestType.get())) {
137 updateNetwork(xmlRequest, subnetIdMap, networkRollback, canonicalStackId, backout, success);
138 } else if ("rollbackNetworkRequest".equals(requestType.get())) {
139 response = rollbackNetwork(xmlRequest, canonicalStackId, backout, success);
142 } catch (Exception e) {
143 logger.error("Error during External Task Stack Service", e);
144 errorMessage = e.getMessage();
146 variables.put("backout", backout.booleanValue());
147 variables.put("WorkflowResponse", response);
148 variables.put("OpenstackInvokeSuccess", success.booleanValue());
149 variables.put("stackId", canonicalStackId.value);
150 variables.put("openstackAdapterErrorMessage", errorMessage);
151 variables.put("PollRollbackStatus", false);
152 variables.put("rollbackPerformed", false);
153 variables.put("OpenstackRollbackSuccess", false);
154 variables.put("OpenstackPollSuccess", false);
156 if (success.isTrue()) {
157 externalTaskService.complete(externalTask, variables);
158 logger.debug("The External Task Id: {} Successful", externalTask.getId());
160 logger.debug("The External Task Id: {} Failed. Not Retrying", externalTask.getId());
161 externalTaskService.complete(externalTask, variables);
165 private String createVolumeGroup(String xmlRequest, Holder<Map<String, String>> outputs,
166 Holder<VnfRollback> vnfRollback, Holder<String> canonicalStackId, MutableBoolean backout,
167 MutableBoolean success) throws VnfException {
168 Holder<String> stackId = new Holder<>();
169 CreateVolumeGroupRequest req = JAXB.unmarshal(new StringReader(xmlRequest), CreateVolumeGroupRequest.class);
170 String completeVnfVfModuleType = req.getVnfType() + "::" + req.getVfModuleType();
171 boolean isMulticloud = vnfAdapterUtils.isMulticloudMode(null, req.getCloudSiteId());
173 vnfPluginImpl.createVfModule(req.getCloudSiteId(), req.getCloudOwner(), req.getTenantId(),
174 completeVnfVfModuleType, req.getVnfVersion(), "", req.getVolumeGroupName(), "", "VOLUME", null,
175 null, req.getModelCustomizationUuid(), req.getVolumeGroupParams(), false, true,
176 req.getEnableBridge(), req.getMsoRequest(), stackId, outputs, vnfRollback);
178 vnfAdapterImpl.createVfModule(req.getCloudSiteId(), req.getCloudOwner(), req.getTenantId(),
179 completeVnfVfModuleType, req.getVnfVersion(), "", req.getVolumeGroupName(), "", "VOLUME", null,
180 null, req.getModelCustomizationUuid(), req.getVolumeGroupParams(), false, true,
181 req.getEnableBridge(), req.getMsoRequest(), stackId, outputs, vnfRollback);
184 backout.setValue(!req.getSuppressBackout());
185 VolumeGroupRollback rb = new VolumeGroupRollback(req.getVolumeGroupId(), stackId.value,
186 vnfRollback.value.getVnfCreated(), req.getTenantId(), req.getCloudOwner(), req.getCloudSiteId(),
187 req.getMsoRequest(), req.getMessageId());
188 canonicalStackId.value = stackId.value;
189 CreateVolumeGroupResponse createResponse = new CreateVolumeGroupResponse(req.getVolumeGroupId(), stackId.value,
190 vnfRollback.value.getVnfCreated(), outputs.value, rb, req.getMessageId());
191 return createResponse.toXmlString();
194 private String createVfModule(String xmlRequest, Holder<Map<String, String>> outputs,
195 Holder<VnfRollback> vnfRollback, Holder<String> canonicalStackId, MutableBoolean backout,
196 MutableBoolean success) throws VnfException {
197 Holder<String> stackId = new Holder<>();
198 CreateVfModuleRequest req = JAXB.unmarshal(new StringReader(xmlRequest), CreateVfModuleRequest.class);
199 String completeVnfVfModuleType = req.getVnfType() + "::" + req.getVfModuleType();
200 boolean isMulticloud = vnfAdapterUtils.isMulticloudMode(null, req.getCloudSiteId());
202 vnfPluginImpl.createVfModule(req.getCloudSiteId(), req.getCloudOwner(), req.getTenantId(),
203 completeVnfVfModuleType, req.getVnfVersion(), req.getVnfId(), req.getVfModuleName(),
204 req.getVfModuleId(), req.getRequestType(), req.getVolumeGroupStackId(),
205 req.getBaseVfModuleStackId(), req.getModelCustomizationUuid(), req.getVfModuleParams(), false,
206 false, req.getEnableBridge(), req.getMsoRequest(), stackId, outputs, vnfRollback);
208 vnfAdapterImpl.createVfModule(req.getCloudSiteId(), req.getCloudOwner(), req.getTenantId(),
209 completeVnfVfModuleType, req.getVnfVersion(), req.getVnfId(), req.getVfModuleName(),
210 req.getVfModuleId(), req.getRequestType(), req.getVolumeGroupStackId(),
211 req.getBaseVfModuleStackId(), req.getModelCustomizationUuid(), req.getVfModuleParams(), false,
212 false, req.getEnableBridge(), req.getMsoRequest(), stackId, outputs, vnfRollback);
215 backout.setValue(req.getBackout());
216 canonicalStackId.value = stackId.value;
217 VfModuleRollback modRollback =
218 new VfModuleRollback(vnfRollback.value, req.getVfModuleId(), stackId.value, req.getMessageId());
219 CreateVfModuleResponse createResponse = new CreateVfModuleResponse(req.getVnfId(), req.getVfModuleId(),
220 stackId.value, Boolean.TRUE, outputs.value, modRollback, req.getMessageId());
221 return createResponse.toXmlString();
224 private String deleteVfModule(String xmlRequest, Holder<Map<String, String>> outputs,
225 Holder<VnfRollback> vnfRollback, Holder<String> canonicalStackId, MutableBoolean backout,
226 MutableBoolean success) throws VnfException {
228 DeleteVfModuleRequest req = JAXB.unmarshal(new StringReader(xmlRequest), DeleteVfModuleRequest.class);
229 boolean isMulticloud = vnfAdapterUtils.isMulticloudMode(null, req.getCloudSiteId());
231 vnfPluginImpl.deleteVfModule(req.getCloudSiteId(), req.getCloudOwner(), req.getTenantId(),
232 req.getVfModuleStackId(), req.getMsoRequest(), outputs);
234 vnfAdapterImpl.deleteVfModule(req.getCloudSiteId(), req.getCloudOwner(), req.getTenantId(),
235 req.getVfModuleStackId(), req.getVnfId(), req.getVfModuleId(), req.getModelCustomizationUuid(),
236 req.getMsoRequest(), outputs);
239 if (outputs != null && outputs.value != null) {
240 canonicalStackId.value = outputs.value.get("canonicalStackId");
242 canonicalStackId.value = req.getVfModuleStackId();
244 DeleteVfModuleResponse deleteResponse = new DeleteVfModuleResponse(req.getVnfId(), req.getVfModuleId(),
245 Boolean.TRUE, req.getMessageId(), outputs.value);
246 return deleteResponse.toXmlString();
249 private String deleteVolumeGroup(String xmlRequest, Holder<Map<String, String>> outputs,
250 Holder<VnfRollback> vnfRollback, Holder<String> canonicalStackId, MutableBoolean backout,
251 MutableBoolean success) throws VnfException {
253 DeleteVolumeGroupRequest req = JAXB.unmarshal(new StringReader(xmlRequest), DeleteVolumeGroupRequest.class);
254 vnfAdapterImpl.deleteVnf(req.getCloudSiteId(), req.getCloudOwner(), req.getTenantId(),
255 req.getVolumeGroupStackId(), req.getMsoRequest(), false);
257 canonicalStackId.value = req.getVolumeGroupStackId();
258 DeleteVolumeGroupResponse deleteResponse = new DeleteVolumeGroupResponse(true, req.getMessageId());
259 return deleteResponse.toXmlString();
262 private String createNetwork(String xmlRequest, Holder<String> networkId, Holder<String> neutronNetworkId,
263 Holder<String> networkFqdn, Holder<Map<String, String>> subnetIdMap,
264 Holder<NetworkRollback> networkRollback, Holder<String> canonicalStackId, MutableBoolean backout,
265 MutableBoolean success) throws NetworkException {
266 CreateNetworkRequest req = JAXB.unmarshal(new StringReader(xmlRequest), CreateNetworkRequest.class);
267 HashMap<String, String> params = (HashMap<String, String>) req.getNetworkParams();
268 if (params == null) {
269 params = new HashMap<>();
271 String shared = null;
272 String external = null;
273 String physicalNetworkName = null;
274 List<Integer> vlans = null;
275 List<RouteTarget> routeTargets = null;
276 List<String> fqdns = null;
277 List<String> routeTable = null;
278 if (params.containsKey(SHARED))
279 shared = params.get(SHARED);
280 if (params.containsKey(EXTERNAL))
281 external = params.get(EXTERNAL);
282 if (req.isContrailRequest()) {
283 ContrailNetwork ctn = req.getContrailNetwork();
285 ctn = new ContrailNetwork();
286 req.setContrailNetwork(ctn);
288 if (shared == null && ctn.getShared() != null) {
289 shared = ctn.getShared();
291 if (shared == null && ctn.getExternal() != null) {
292 external = ctn.getExternal();
294 routeTargets = req.getContrailNetwork().getRouteTargets();
295 fqdns = req.getContrailNetwork().getPolicyFqdns();
296 routeTable = req.getContrailNetwork().getRouteTableFqdns();
298 ProviderVlanNetwork pvn = req.getProviderVlanNetwork();
300 pvn = new ProviderVlanNetwork();
301 req.setProviderVlanNetwork(pvn);
303 physicalNetworkName = req.getProviderVlanNetwork().getPhysicalNetworkName();
304 vlans = req.getProviderVlanNetwork().getVlans();
306 networkAdapterImpl.createNetwork(req.getCloudSiteId(), req.getTenantId(), req.getNetworkType(),
307 req.getModelCustomizationUuid(), req.getNetworkName(), physicalNetworkName, vlans, routeTargets, shared,
308 external, req.getFailIfExists(), false, req.getSubnets(), fqdns, routeTable, req.getMsoRequest(),
309 networkId, neutronNetworkId, networkFqdn, subnetIdMap, networkRollback, true);
311 backout.setValue(req.getBackout());
312 canonicalStackId.value = networkRollback.value.getNetworkStackId();
314 CreateNetworkResponse response = new CreateNetworkResponse(req.getNetworkId(), neutronNetworkId.value,
315 networkRollback.value.getNetworkStackId(), networkFqdn.value, networkRollback.value.getNetworkCreated(),
316 subnetIdMap.value, networkRollback.value, req.getMessageId());
317 return response.toXmlString();
320 private String deleteNetwork(String xmlRequest, Holder<String> canonicalStackId, MutableBoolean backout,
321 MutableBoolean success) throws NetworkException {
323 DeleteNetworkRequest req = JAXB.unmarshal(new StringReader(xmlRequest), DeleteNetworkRequest.class);
324 Holder<Boolean> networkDeleted = new Holder<>();
326 networkAdapterImpl.deleteNetwork(req.getCloudSiteId(), req.getTenantId(), req.getNetworkType(),
327 req.getModelCustomizationUuid(), req.getNetworkStackId(), req.getMsoRequest(), networkDeleted, false);
329 canonicalStackId.value = req.getNetworkStackId();
332 DeleteNetworkResponse response =
333 new DeleteNetworkResponse(req.getNetworkId(), networkDeleted.value, req.getMessageId());
334 return response.toXmlString();
337 private String rollbackNetwork(String xmlRequest, Holder<String> canonicalStackId, MutableBoolean backout,
338 MutableBoolean success) throws NetworkException {
340 RollbackNetworkRequest req = JAXB.unmarshal(new StringReader(xmlRequest), RollbackNetworkRequest.class);
342 NetworkRollback rollback = req.getNetworkRollback();
343 networkAdapterImpl.rollbackNetwork(rollback, false);
345 canonicalStackId.value = rollback.getNetworkStackId();
348 RollbackNetworkResponse response = new RollbackNetworkResponse(true, req.getMessageId());
349 return response.toXmlString();
352 private String updateNetwork(String xmlRequest, Holder<Map<String, String>> subnetIdMap,
353 Holder<NetworkRollback> networkRollback, Holder<String> canonicalStackId, MutableBoolean backout,
354 MutableBoolean success) throws NetworkException {
356 UpdateNetworkRequest req = JAXB.unmarshal(new StringReader(xmlRequest), UpdateNetworkRequest.class);
357 HashMap<String, String> params = (HashMap<String, String>) req.getNetworkParams();
358 if (params == null) {
359 params = new HashMap<>();
361 String shared = null;
362 String external = null;
363 String physicalNetworkName = null;
364 List<Integer> vlans = null;
365 List<RouteTarget> routeTargets = null;
366 List<String> fqdns = null;
367 List<String> routeTable = null;
368 if (params.containsKey(SHARED))
369 shared = params.get(SHARED);
370 if (params.containsKey(EXTERNAL))
371 external = params.get(EXTERNAL);
372 if (req.isContrailRequest()) {
373 ContrailNetwork ctn = req.getContrailNetwork();
375 ctn = new ContrailNetwork();
376 req.setContrailNetwork(ctn);
378 if (shared == null && ctn.getShared() != null) {
379 shared = ctn.getShared();
381 if (shared == null && ctn.getExternal() != null) {
382 external = ctn.getExternal();
384 routeTargets = req.getContrailNetwork().getRouteTargets();
385 fqdns = req.getContrailNetwork().getPolicyFqdns();
386 routeTable = req.getContrailNetwork().getRouteTableFqdns();
388 ProviderVlanNetwork pvn = req.getProviderVlanNetwork();
390 pvn = new ProviderVlanNetwork();
391 req.setProviderVlanNetwork(pvn);
393 physicalNetworkName = req.getProviderVlanNetwork().getPhysicalNetworkName();
394 vlans = req.getProviderVlanNetwork().getVlans();
397 networkAdapterImpl.updateNetwork(req.getCloudSiteId(), req.getTenantId(), req.getNetworkType(),
398 req.getModelCustomizationUuid(), req.getNetworkStackId(), req.getNetworkName(), physicalNetworkName,
399 vlans, routeTargets, shared, external, req.getSubnets(), fqdns, routeTable, req.getMsoRequest(),
400 subnetIdMap, networkRollback);
403 canonicalStackId.value = req.getNetworkStackId();
405 UpdateNetworkResponse response =
406 new UpdateNetworkResponse(req.getNetworkId(), null, subnetIdMap.value, req.getMessageId());
407 return response.toXmlString();
412 protected Optional<String> findRequestType(String xmlString) {
414 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
415 DocumentBuilder builder = factory.newDocumentBuilder();
416 org.w3c.dom.Document doc;
417 doc = builder.parse(new ByteArrayInputStream(xmlString.getBytes("UTF-8")));
418 return Optional.of(doc.getDocumentElement().getNodeName());
419 } catch (Exception e) {
420 logger.error("Error Finding Request Type", e);
421 return Optional.empty();