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.exceptions.VnfException;
 
  52 import org.onap.so.adapters.vnfrest.CreateVfModuleRequest;
 
  53 import org.onap.so.adapters.vnfrest.CreateVfModuleResponse;
 
  54 import org.onap.so.adapters.vnfrest.CreateVolumeGroupRequest;
 
  55 import org.onap.so.adapters.vnfrest.CreateVolumeGroupResponse;
 
  56 import org.onap.so.adapters.vnfrest.DeleteVfModuleRequest;
 
  57 import org.onap.so.adapters.vnfrest.DeleteVfModuleResponse;
 
  58 import org.onap.so.adapters.vnfrest.DeleteVolumeGroupRequest;
 
  59 import org.onap.so.adapters.vnfrest.DeleteVolumeGroupResponse;
 
  60 import org.onap.so.adapters.vnfrest.VfModuleRollback;
 
  61 import org.onap.so.adapters.vnfrest.VolumeGroupRollback;
 
  62 import org.onap.so.logging.tasks.AuditMDCSetup;
 
  63 import org.onap.so.openstack.beans.NetworkRollback;
 
  64 import org.onap.so.openstack.beans.RouteTarget;
 
  65 import org.onap.so.openstack.beans.VnfRollback;
 
  66 import org.onap.so.utils.ExternalTaskUtils;
 
  67 import org.slf4j.Logger;
 
  68 import org.slf4j.LoggerFactory;
 
  69 import org.springframework.beans.factory.annotation.Autowired;
 
  70 import org.springframework.stereotype.Component;
 
  73 public class StackService extends ExternalTaskUtils {
 
  75     private static final Logger logger = LoggerFactory.getLogger(StackService.class);
 
  78     private MsoVnfAdapterImpl vnfAdapterImpl;
 
  81     private MsoNetworkAdapterImpl networkAdapterImpl;
 
  84     private AuditMDCSetup mdcSetup;
 
  86     private static final String SHARED = "shared";
 
  87     private static final String EXTERNAL = "external";
 
  89     // TODO set backout earlier in case of exception??
 
  90     public void executeExternalTask(ExternalTask externalTask, ExternalTaskService externalTaskService) {
 
  91         Map<String, Object> variables = new HashMap<>();
 
  92         mdcSetup.setupMDC(externalTask);
 
  93         String xmlRequest = externalTask.getVariable("openstackAdapterTaskRequest");
 
  94         logger.debug("Executing External Task Stack Service. {}", xmlRequest);
 
  95         MutableBoolean success = new MutableBoolean();
 
  96         MutableBoolean backout = new MutableBoolean();
 
  98         Holder<String> canonicalStackId = new Holder<>();
 
  99         String errorMessage = "";
 
 101             if (xmlRequest != null) {
 
 102                 Holder<Map<String, String>> outputs = new Holder<>();
 
 103                 Holder<VnfRollback> vnfRollback = new Holder<>();
 
 104                 Optional<String> requestType = findRequestType(xmlRequest);
 
 105                 Holder<String> networkId = new Holder<>();
 
 106                 Holder<String> neutronNetworkId = new Holder<>();
 
 107                 Holder<String> networkFqdn = new Holder<>();
 
 108                 Holder<Map<String, String>> subnetIdMap = new Holder<>();
 
 109                 Holder<NetworkRollback> networkRollback = new Holder<>();
 
 110                 if ("createVolumeGroupRequest".equals(requestType.get())) {
 
 111                     logger.debug("Executing External Task Stack Service For Create Volume Group");
 
 112                     response = createVolumeGroup(xmlRequest, outputs, vnfRollback, canonicalStackId, backout, success);
 
 113                 } else if ("createVfModuleRequest".equals(requestType.get())) {
 
 114                     logger.debug("Executing External Task Stack Service For Create Vf Module");
 
 115                     response = createVfModule(xmlRequest, outputs, vnfRollback, canonicalStackId, backout, success);
 
 116                 } else if ("deleteVfModuleRequest".equals(requestType.get())) {
 
 117                     logger.debug("Executing External Task Stack Service For Delete Vf Module");
 
 118                     response = deleteVfModule(xmlRequest, outputs, vnfRollback, canonicalStackId, backout, success);
 
 119                 } else if ("deleteVolumeGroupRequest".equals(requestType.get())) {
 
 120                     logger.debug("Executing External Task Stack Service For Delete Volume Group");
 
 121                     response = deleteVolumeGroup(xmlRequest, outputs, vnfRollback, canonicalStackId, backout, success);
 
 122                 } else if ("createNetworkRequest".equals(requestType.get())) {
 
 123                     response = createNetwork(xmlRequest, networkId, neutronNetworkId, networkFqdn, subnetIdMap,
 
 124                             networkRollback, canonicalStackId, backout, success);
 
 125                 } else if ("deleteNetworkRequest".equals(requestType.get())) {
 
 126                     response = deleteNetwork(xmlRequest, canonicalStackId, backout, success);
 
 127                 } else if ("updateNetworkRequest".equals(requestType.get())) {
 
 129                             updateNetwork(xmlRequest, subnetIdMap, networkRollback, canonicalStackId, backout, success);
 
 130                 } else if ("rollbackNetworkRequest".equals(requestType.get())) {
 
 131                     response = rollbackNetwork(xmlRequest, canonicalStackId, backout, success);
 
 134         } catch (Exception e) {
 
 135             logger.error("Error during External Task Stack Service", e);
 
 136             errorMessage = e.getMessage();
 
 138         variables.put("backout", backout.booleanValue());
 
 139         variables.put("WorkflowResponse", response);
 
 140         variables.put("OpenstackInvokeSuccess", success.booleanValue());
 
 141         variables.put("stackId", canonicalStackId.value);
 
 142         variables.put("openstackAdapterErrorMessage", errorMessage);
 
 143         variables.put("PollRollbackStatus", false);
 
 144         variables.put("rollbackPerformed", false);
 
 145         variables.put("OpenstackRollbackSuccess", false);
 
 146         variables.put("OpenstackPollSuccess", false);
 
 148         if (success.isTrue()) {
 
 149             externalTaskService.complete(externalTask, variables);
 
 150             logger.debug("The External Task Id: {}  Successful", externalTask.getId());
 
 152             logger.debug("The External Task Id: {}  Failed. Not Retrying", externalTask.getId());
 
 153             externalTaskService.complete(externalTask, variables);
 
 157     private String createVolumeGroup(String xmlRequest, Holder<Map<String, String>> outputs,
 
 158             Holder<VnfRollback> vnfRollback, Holder<String> canonicalStackId, MutableBoolean backout,
 
 159             MutableBoolean success) throws VnfException {
 
 160         Holder<String> stackId = new Holder<>();
 
 161         CreateVolumeGroupRequest req = JAXB.unmarshal(new StringReader(xmlRequest), CreateVolumeGroupRequest.class);
 
 162         String completeVnfVfModuleType = req.getVnfType() + "::" + req.getVfModuleType();
 
 163         vnfAdapterImpl.createVfModule(req.getCloudSiteId(), req.getCloudOwner(), req.getTenantId(),
 
 164                 completeVnfVfModuleType, req.getVnfVersion(), "", req.getVolumeGroupName(), "", "VOLUME", null, null,
 
 165                 req.getModelCustomizationUuid(), req.getVolumeGroupParams(), false, true, req.getEnableBridge(),
 
 166                 req.getMsoRequest(), stackId, outputs, vnfRollback);
 
 168         backout.setValue(!req.getSuppressBackout());
 
 169         VolumeGroupRollback rb = new VolumeGroupRollback(req.getVolumeGroupId(), stackId.value,
 
 170                 vnfRollback.value.getVnfCreated(), req.getTenantId(), req.getCloudOwner(), req.getCloudSiteId(),
 
 171                 req.getMsoRequest(), req.getMessageId());
 
 172         canonicalStackId.value = stackId.value;
 
 173         CreateVolumeGroupResponse createResponse = new CreateVolumeGroupResponse(req.getVolumeGroupId(), stackId.value,
 
 174                 vnfRollback.value.getVnfCreated(), outputs.value, rb, req.getMessageId());
 
 175         return createResponse.toXmlString();
 
 178     private String createVfModule(String xmlRequest, Holder<Map<String, String>> outputs,
 
 179             Holder<VnfRollback> vnfRollback, Holder<String> canonicalStackId, MutableBoolean backout,
 
 180             MutableBoolean success) throws VnfException {
 
 181         Holder<String> stackId = new Holder<>();
 
 182         CreateVfModuleRequest req = JAXB.unmarshal(new StringReader(xmlRequest), CreateVfModuleRequest.class);
 
 183         String completeVnfVfModuleType = req.getVnfType() + "::" + req.getVfModuleType();
 
 184         vnfAdapterImpl.createVfModule(req.getCloudSiteId(), req.getCloudOwner(), req.getTenantId(),
 
 185                 completeVnfVfModuleType, req.getVnfVersion(), req.getVnfId(), req.getVfModuleName(),
 
 186                 req.getVfModuleId(), req.getRequestType(), req.getVolumeGroupStackId(), req.getBaseVfModuleStackId(),
 
 187                 req.getModelCustomizationUuid(), req.getVfModuleParams(), false, false, req.getEnableBridge(),
 
 188                 req.getMsoRequest(), stackId, outputs, vnfRollback);
 
 190         backout.setValue(req.getBackout());
 
 191         canonicalStackId.value = stackId.value;
 
 192         VfModuleRollback modRollback =
 
 193                 new VfModuleRollback(vnfRollback.value, req.getVfModuleId(), stackId.value, req.getMessageId());
 
 194         CreateVfModuleResponse createResponse = new CreateVfModuleResponse(req.getVnfId(), req.getVfModuleId(),
 
 195                 stackId.value, Boolean.TRUE, outputs.value, modRollback, req.getMessageId());
 
 196         return createResponse.toXmlString();
 
 199     private String deleteVfModule(String xmlRequest, Holder<Map<String, String>> outputs,
 
 200             Holder<VnfRollback> vnfRollback, Holder<String> canonicalStackId, MutableBoolean backout,
 
 201             MutableBoolean success) throws VnfException {
 
 203         DeleteVfModuleRequest req = JAXB.unmarshal(new StringReader(xmlRequest), DeleteVfModuleRequest.class);
 
 204         vnfAdapterImpl.deleteVfModule(req.getCloudSiteId(), req.getCloudOwner(), req.getTenantId(),
 
 205                 req.getVfModuleStackId(), req.getVnfId(), req.getVfModuleId(), req.getModelCustomizationUuid(),
 
 206                 req.getMsoRequest(), outputs);
 
 208         if (outputs != null && outputs.value != null) {
 
 209             canonicalStackId.value = outputs.value.get("canonicalStackId");
 
 211             canonicalStackId.value = req.getVfModuleStackId();
 
 213         DeleteVfModuleResponse deleteResponse = new DeleteVfModuleResponse(req.getVnfId(), req.getVfModuleId(),
 
 214                 Boolean.TRUE, req.getMessageId(), outputs.value);
 
 215         return deleteResponse.toXmlString();
 
 218     private String deleteVolumeGroup(String xmlRequest, Holder<Map<String, String>> outputs,
 
 219             Holder<VnfRollback> vnfRollback, Holder<String> canonicalStackId, MutableBoolean backout,
 
 220             MutableBoolean success) throws VnfException {
 
 222         DeleteVolumeGroupRequest req = JAXB.unmarshal(new StringReader(xmlRequest), DeleteVolumeGroupRequest.class);
 
 224         vnfAdapterImpl.deleteVnf(req.getCloudSiteId(), req.getCloudOwner(), req.getTenantId(),
 
 225                 req.getVolumeGroupStackId(), req.getMsoRequest(), false);
 
 227         canonicalStackId.value = req.getVolumeGroupStackId();
 
 228         DeleteVolumeGroupResponse deleteResponse = new DeleteVolumeGroupResponse(true, req.getMessageId());
 
 229         return deleteResponse.toXmlString();
 
 232     private String createNetwork(String xmlRequest, Holder<String> networkId, Holder<String> neutronNetworkId,
 
 233             Holder<String> networkFqdn, Holder<Map<String, String>> subnetIdMap,
 
 234             Holder<NetworkRollback> networkRollback, Holder<String> canonicalStackId, MutableBoolean backout,
 
 235             MutableBoolean success) throws NetworkException {
 
 236         CreateNetworkRequest req = JAXB.unmarshal(new StringReader(xmlRequest), CreateNetworkRequest.class);
 
 237         HashMap<String, String> params = (HashMap<String, String>) req.getNetworkParams();
 
 238         if (params == null) {
 
 239             params = new HashMap<>();
 
 241         String shared = null;
 
 242         String external = null;
 
 243         String physicalNetworkName = null;
 
 244         List<Integer> vlans = null;
 
 245         List<RouteTarget> routeTargets = null;
 
 246         List<String> fqdns = null;
 
 247         List<String> routeTable = null;
 
 248         if (params.containsKey(SHARED))
 
 249             shared = params.get(SHARED);
 
 250         if (params.containsKey(EXTERNAL))
 
 251             external = params.get(EXTERNAL);
 
 252         if (req.isContrailRequest()) {
 
 253             ContrailNetwork ctn = req.getContrailNetwork();
 
 255                 ctn = new ContrailNetwork();
 
 256                 req.setContrailNetwork(ctn);
 
 258             if (shared == null && ctn.getShared() != null) {
 
 259                 shared = ctn.getShared();
 
 261             if (shared == null && ctn.getExternal() != null) {
 
 262                 external = ctn.getExternal();
 
 264             routeTargets = req.getContrailNetwork().getRouteTargets();
 
 265             fqdns = req.getContrailNetwork().getPolicyFqdns();
 
 266             routeTable = req.getContrailNetwork().getRouteTableFqdns();
 
 268             ProviderVlanNetwork pvn = req.getProviderVlanNetwork();
 
 270                 pvn = new ProviderVlanNetwork();
 
 271                 req.setProviderVlanNetwork(pvn);
 
 273             physicalNetworkName = req.getProviderVlanNetwork().getPhysicalNetworkName();
 
 274             vlans = req.getProviderVlanNetwork().getVlans();
 
 276         networkAdapterImpl.createNetwork(req.getCloudSiteId(), req.getTenantId(), req.getNetworkType(),
 
 277                 req.getModelCustomizationUuid(), req.getNetworkName(), physicalNetworkName, vlans, routeTargets, shared,
 
 278                 external, req.getFailIfExists(), false, req.getSubnets(), fqdns, routeTable, req.getMsoRequest(),
 
 279                 networkId, neutronNetworkId, networkFqdn, subnetIdMap, networkRollback, true);
 
 281         backout.setValue(req.getBackout());
 
 282         canonicalStackId.value = networkRollback.value.getNetworkStackId();
 
 284         CreateNetworkResponse response = new CreateNetworkResponse(req.getNetworkId(), neutronNetworkId.value,
 
 285                 networkRollback.value.getNetworkStackId(), networkFqdn.value, networkRollback.value.getNetworkCreated(),
 
 286                 subnetIdMap.value, networkRollback.value, req.getMessageId());
 
 287         return response.toXmlString();
 
 290     private String deleteNetwork(String xmlRequest, Holder<String> canonicalStackId, MutableBoolean backout,
 
 291             MutableBoolean success) throws NetworkException {
 
 293         DeleteNetworkRequest req = JAXB.unmarshal(new StringReader(xmlRequest), DeleteNetworkRequest.class);
 
 294         Holder<Boolean> networkDeleted = new Holder<>();
 
 296         networkAdapterImpl.deleteNetwork(req.getCloudSiteId(), req.getTenantId(), req.getNetworkType(),
 
 297                 req.getModelCustomizationUuid(), req.getNetworkStackId(), req.getMsoRequest(), networkDeleted, false);
 
 299         canonicalStackId.value = req.getNetworkStackId();
 
 302         DeleteNetworkResponse response =
 
 303                 new DeleteNetworkResponse(req.getNetworkId(), networkDeleted.value, req.getMessageId());
 
 304         return response.toXmlString();
 
 307     private String rollbackNetwork(String xmlRequest, Holder<String> canonicalStackId, MutableBoolean backout,
 
 308             MutableBoolean success) throws NetworkException {
 
 310         RollbackNetworkRequest req = JAXB.unmarshal(new StringReader(xmlRequest), RollbackNetworkRequest.class);
 
 312         NetworkRollback rollback = req.getNetworkRollback();
 
 313         networkAdapterImpl.rollbackNetwork(rollback, false);
 
 315         canonicalStackId.value = rollback.getNetworkStackId();
 
 318         RollbackNetworkResponse response = new RollbackNetworkResponse(true, req.getMessageId());
 
 319         return response.toXmlString();
 
 322     private String updateNetwork(String xmlRequest, Holder<Map<String, String>> subnetIdMap,
 
 323             Holder<NetworkRollback> networkRollback, Holder<String> canonicalStackId, MutableBoolean backout,
 
 324             MutableBoolean success) throws NetworkException {
 
 326         UpdateNetworkRequest req = JAXB.unmarshal(new StringReader(xmlRequest), UpdateNetworkRequest.class);
 
 327         HashMap<String, String> params = (HashMap<String, String>) req.getNetworkParams();
 
 328         if (params == null) {
 
 329             params = new HashMap<>();
 
 331         String shared = null;
 
 332         String external = null;
 
 333         String physicalNetworkName = null;
 
 334         List<Integer> vlans = null;
 
 335         List<RouteTarget> routeTargets = null;
 
 336         List<String> fqdns = null;
 
 337         List<String> routeTable = null;
 
 338         if (params.containsKey(SHARED))
 
 339             shared = params.get(SHARED);
 
 340         if (params.containsKey(EXTERNAL))
 
 341             external = params.get(EXTERNAL);
 
 342         if (req.isContrailRequest()) {
 
 343             ContrailNetwork ctn = req.getContrailNetwork();
 
 345                 ctn = new ContrailNetwork();
 
 346                 req.setContrailNetwork(ctn);
 
 348             if (shared == null && ctn.getShared() != null) {
 
 349                 shared = ctn.getShared();
 
 351             if (shared == null && ctn.getExternal() != null) {
 
 352                 external = ctn.getExternal();
 
 354             routeTargets = req.getContrailNetwork().getRouteTargets();
 
 355             fqdns = req.getContrailNetwork().getPolicyFqdns();
 
 356             routeTable = req.getContrailNetwork().getRouteTableFqdns();
 
 358             ProviderVlanNetwork pvn = req.getProviderVlanNetwork();
 
 360                 pvn = new ProviderVlanNetwork();
 
 361                 req.setProviderVlanNetwork(pvn);
 
 363             physicalNetworkName = req.getProviderVlanNetwork().getPhysicalNetworkName();
 
 364             vlans = req.getProviderVlanNetwork().getVlans();
 
 367         networkAdapterImpl.updateNetwork(req.getCloudSiteId(), req.getTenantId(), req.getNetworkType(),
 
 368                 req.getModelCustomizationUuid(), req.getNetworkStackId(), req.getNetworkName(), physicalNetworkName,
 
 369                 vlans, routeTargets, shared, external, req.getSubnets(), fqdns, routeTable, req.getMsoRequest(),
 
 370                 subnetIdMap, networkRollback);
 
 373         canonicalStackId.value = req.getNetworkStackId();
 
 375         UpdateNetworkResponse response =
 
 376                 new UpdateNetworkResponse(req.getNetworkId(), null, subnetIdMap.value, req.getMessageId());
 
 377         return response.toXmlString();
 
 382     protected Optional<String> findRequestType(String xmlString) {
 
 384             DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
 
 385             DocumentBuilder builder = factory.newDocumentBuilder();
 
 386             org.w3c.dom.Document doc;
 
 387             doc = builder.parse(new ByteArrayInputStream(xmlString.getBytes("UTF-8")));
 
 388             return Optional.of(doc.getDocumentElement().getNodeName());
 
 389         } catch (Exception e) {
 
 390             logger.error("Error Finding Request Type", e);
 
 391             return Optional.empty();