Improve fall out case handling 71/96471/2
authorSmokowski, Steven <steve.smokowski@att.com>
Tue, 1 Oct 2019 13:40:18 +0000 (09:40 -0400)
committerBenjamin, Max (mb388a) <mb388a@att.com>
Tue, 1 Oct 2019 14:13:16 +0000 (10:13 -0400)
Update Openstack adapter to handle fall out cases
with greater stability

Issue-ID: SO-2376
Signed-off-by: Benjamin, Max (mb388a) <mb388a@att.com>
Change-Id: I20116cbd3b63bb29c9bf4ed99e92bd5f2b691da5

31 files changed:
adapters/mso-adapter-utils/src/main/java/org/onap/so/openstack/utils/MsoHeatUtils.java
adapters/mso-adapter-utils/src/main/java/org/onap/so/openstack/utils/MsoMulticloudUtils.java
adapters/mso-adapter-utils/src/main/java/org/onap/so/openstack/utils/StackCreationException.java
adapters/mso-adapter-utils/src/test/java/org/onap/so/openstack/utils/MsoHeatUtilsITTest.java
adapters/mso-adapter-utils/src/test/java/org/onap/so/openstack/utils/MsoHeatUtilsTest.java
adapters/mso-adapter-utils/src/test/java/org/onap/so/openstack/utils/MsoMulticloudUtilsTest.java
adapters/mso-adapter-utils/src/test/resources/__files/OpenstackResponse_Stack_DeleteComplete.json
adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/network/MsoNetworkAdapterImpl.java
adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/vnf/MsoVnfAdapterImpl.java
adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/vnf/VolumeAdapterRestV2.java
adapters/mso-openstack-adapters/src/test/java/org/onap/so/adapters/network/NetworkAdapterRestTest.java
adapters/mso-openstack-adapters/src/test/java/org/onap/so/adapters/vnf/MsoVnfAdapterImplTest.java
adapters/mso-openstack-adapters/src/test/resources/application-test.yaml
bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/exception/ExceptionBuilder.java
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/validations/CloudRegionOrchestrationValidator.java
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/network/mapper/NetworkAdapterObjectMapper.java
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/vnf/mapper/VnfAdapterObjectMapper.java
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/vnf/mapper/VnfAdapterVfModuleObjectMapper.java
bpmn/so-bpmn-tasks/src/test/java/org/onap/so/client/adapter/network/mapper/NetworkAdapterObjectMapperTest.java
bpmn/so-bpmn-tasks/src/test/java/org/onap/so/client/adapter/vnf/mapper/VnfAdapterObjectMapperTest.java
bpmn/so-bpmn-tasks/src/test/resources/__files/BuildingBlocks/NetworkMapper/createNetworkRequest.json
bpmn/so-bpmn-tasks/src/test/resources/__files/BuildingBlocks/VnfAndVfModuleMapper/vnfAdapterCreateVfModuleAddonRequest.json
bpmn/so-bpmn-tasks/src/test/resources/__files/BuildingBlocks/VnfAndVfModuleMapper/vnfAdapterCreateVfModuleRequest.json
bpmn/so-bpmn-tasks/src/test/resources/__files/BuildingBlocks/VnfAndVfModuleMapper/vnfAdapterCreateVfModuleRequestDhcpDisabled.json
bpmn/so-bpmn-tasks/src/test/resources/__files/BuildingBlocks/VnfAndVfModuleMapper/vnfAdapterCreateVfModuleRequestMultipleDhcp.json
bpmn/so-bpmn-tasks/src/test/resources/__files/BuildingBlocks/VnfAndVfModuleMapper/vnfAdapterCreateVfModuleRequestNoUserParams.json
bpmn/so-bpmn-tasks/src/test/resources/__files/BuildingBlocks/VnfAndVfModuleMapper/vnfAdapterCreateVfModuleRequestTrueBackout.json
bpmn/so-bpmn-tasks/src/test/resources/__files/BuildingBlocks/VnfAndVfModuleMapper/vnfAdapterCreateVfModuleRequestWithCloudResources.json
bpmn/so-bpmn-tasks/src/test/resources/__files/BuildingBlocks/VnfAndVfModuleMapper/vnfAdapterCreateVfModuleRequestWithSingleAvailabilityZone.json
bpmn/so-bpmn-tasks/src/test/resources/__files/BuildingBlocks/VnfAndVfModuleMapper/vnfAdapterCreateVfModuleWithNoEnvironmentAndWorkloadContextRequest.json
bpmn/so-bpmn-tasks/src/test/resources/__files/BuildingBlocks/VnfAndVfModuleMapper/vnfAdapterCreateVfModuleWithVolumeGroupRequest.json

index b5a97f7..75a8ca0 100644 (file)
@@ -89,6 +89,10 @@ import com.woorea.openstack.heat.model.Stacks;
 @Component
 public class MsoHeatUtils extends MsoCommonUtils implements VduPlugin {
 
+    private static final String CREATE_FAILED = "CREATE_FAILED";
+
+    private static final String DELETE_FAILED = "DELETE_FAILED";
+
     private static final String CREATE_COMPLETE = "CREATE_COMPLETE";
 
     private static final String DELETE_COMPLETE = "DELETE_COMPLETE";
@@ -133,42 +137,7 @@ public class MsoHeatUtils extends MsoCommonUtils implements VduPlugin {
 
     private static final ObjectMapper JSON_MAPPER = new ObjectMapper();
 
-    /**
-     * keep this old method signature here to maintain backwards compatibility. keep others as well. this method does
-     * not include environment, files, or heatFiles
-     */
-    public StackInfo createStack(String cloudSiteId, String cloudOwner, String tenantId, String stackName,
-            String heatTemplate, Map<String, ?> stackInputs, boolean pollForCompletion, int timeoutMinutes)
-            throws MsoException {
-        // Just call the new method with the environment & files variable set to null
-        return this.createStack(cloudSiteId, cloudOwner, tenantId, stackName, null, heatTemplate, stackInputs,
-                pollForCompletion, timeoutMinutes, null, null, null, true);
-    }
-
-    // This method has environment, but not files or heatFiles
-    public StackInfo createStack(String cloudSiteId, String cloudOwner, String tenantId, String stackName,
-            String heatTemplate, Map<String, ?> stackInputs, boolean pollForCompletion, int timeoutMinutes,
-            String environment) throws MsoException {
-        // Just call the new method with the files/heatFiles variables set to null
-        return this.createStack(cloudSiteId, cloudOwner, tenantId, stackName, null, heatTemplate, stackInputs,
-                pollForCompletion, timeoutMinutes, environment, null, null, true);
-    }
-
-    // This method has environment and files, but not heatFiles.
-    public StackInfo createStack(String cloudSiteId, String cloudOwner, String tenantId, String stackName,
-            String heatTemplate, Map<String, ?> stackInputs, boolean pollForCompletion, int timeoutMinutes,
-            String environment, Map<String, Object> files) throws MsoException {
-        return this.createStack(cloudSiteId, cloudOwner, tenantId, stackName, null, heatTemplate, stackInputs,
-                pollForCompletion, timeoutMinutes, environment, files, null, true);
-    }
 
-    // This method has environment, files, heatfiles
-    public StackInfo createStack(String cloudSiteId, String cloudOwner, String tenantId, String stackName,
-            String heatTemplate, Map<String, ?> stackInputs, boolean pollForCompletion, int timeoutMinutes,
-            String environment, Map<String, Object> files, Map<String, Object> heatFiles) throws MsoException {
-        return this.createStack(cloudSiteId, cloudOwner, tenantId, stackName, null, heatTemplate, stackInputs,
-                pollForCompletion, timeoutMinutes, environment, files, heatFiles, true);
-    }
 
     /**
      * Create a new Stack in the specified cloud location and tenant. The Heat template and parameter map are passed in
@@ -211,20 +180,50 @@ public class MsoHeatUtils extends MsoCommonUtils implements VduPlugin {
     @SuppressWarnings("unchecked")
     public StackInfo createStack(String cloudSiteId, String cloudOwner, String tenantId, String stackName,
             VduModelInfo vduModel, String heatTemplate, Map<String, ?> stackInputs, boolean pollForCompletion,
-            int timeoutMinutes, String environment, Map<String, Object> files, Map<String, Object> heatFiles,
-            boolean backout) throws MsoException {
-
+            int timeoutMinutes, String environment, Map<String, Object> nestedTemplates, Map<String, Object> heatFiles,
+            boolean backout, boolean failIfExists) throws MsoException {
         stripMultiCloudInputs(stackInputs);
-        CreateStackParam createStack =
-                createStackParam(stackName, heatTemplate, stackInputs, timeoutMinutes, environment, files, heatFiles);
-        Stack currentStack = createStack(createStack, cloudSiteId, tenantId);
-        currentStack.setStackName(stackName);
-        if (pollForCompletion) {
-            currentStack =
+        CreateStackParam createStack = createStackParam(stackName, heatTemplate, stackInputs, timeoutMinutes,
+                environment, nestedTemplates, heatFiles);
+        Stack currentStack = queryHeatStack(stackName, cloudSiteId, tenantId);
+        if (currentStack != null) {
+            logger.debug("Existing Stack found with Status: {} ", currentStack.getStackStatus());
+            if (CREATE_COMPLETE.equals(currentStack.getStackStatus())) {
+                new StackInfoMapper(currentStack).map();
+            } else if (CREATE_IN_PROGRESS.equals(currentStack.getStackStatus())) {
+                currentStack = processCreateStack(cloudSiteId, tenantId, timeoutMinutes, backout, currentStack,
+                        createStack, true);
+            } else if (CREATE_FAILED.equals(currentStack.getStackStatus())
+                    || DELETE_FAILED.equals(currentStack.getStackStatus())) {
+                try {
                     processCreateStack(cloudSiteId, tenantId, timeoutMinutes, backout, currentStack, createStack, true);
+                } catch (MsoException e) {
+                    if (e instanceof StackCreationException) {
+                        logger.warn("Error during Stack will attempt to recreate stack");
+                        currentStack = createStack(createStack, cloudSiteId, tenantId);
+                        currentStack.setStackName(stackName);
+                        if (pollForCompletion) {
+                            currentStack = processCreateStack(cloudSiteId, tenantId, timeoutMinutes, backout,
+                                    currentStack, createStack, true);
+                        } else {
+                            currentStack = queryHeatStack(currentStack.getStackName() + "/" + currentStack.getId(),
+                                    cloudSiteId, tenantId);
+                        }
+                    } else {
+                        throw e;
+                    }
+                }
+            }
         } else {
-            currentStack =
-                    queryHeatStack(currentStack.getStackName() + "/" + currentStack.getId(), cloudSiteId, tenantId);
+            currentStack = createStack(createStack, cloudSiteId, tenantId);
+            currentStack.setStackName(stackName);
+            if (pollForCompletion) {
+                currentStack = processCreateStack(cloudSiteId, tenantId, timeoutMinutes, backout, currentStack,
+                        createStack, true);
+            } else {
+                currentStack =
+                        queryHeatStack(currentStack.getStackName() + "/" + currentStack.getId(), cloudSiteId, tenantId);
+            }
         }
         return new StackInfoMapper(currentStack).map();
     }
@@ -270,7 +269,8 @@ public class MsoHeatUtils extends MsoCommonUtils implements VduPlugin {
             Stack heatStack, CreateStackParam stackCreate, boolean keyPairCleanUp) throws MsoException {
         Stack latestStack = null;
         try {
-            latestStack = pollStackForStatus(timeoutMinutes, heatStack, CREATE_IN_PROGRESS, cloudSiteId, tenantId);
+            latestStack =
+                    pollStackForStatus(timeoutMinutes, heatStack, CREATE_IN_PROGRESS, cloudSiteId, tenantId, false);
         } catch (MsoException me) {
             logger.error("Exception in Create Stack", me);
         }
@@ -280,47 +280,54 @@ public class MsoHeatUtils extends MsoCommonUtils implements VduPlugin {
 
     protected Stack postProcessStackCreate(Stack stack, boolean backout, int timeoutMinutes, boolean cleanUpKeyPair,
             String cloudSiteId, String tenantId, CreateStackParam stackCreate) throws MsoException {
+        boolean stackCreationFailed = false;
+        boolean stackRollbackFailed = false;
         if (stack == null) {
             throw new StackCreationException("Unknown Error in Stack Creation");
-        }
-
-        logger.info("Performing post processing backout: {} cleanUpKeyPair: {}, stack {}", backout, cleanUpKeyPair,
-                stack);
-        if (!CREATE_COMPLETE.equals(stack.getStackStatus())) {
-            if (cleanUpKeyPair && !Strings.isNullOrEmpty(stack.getStackStatusReason())
-                    && isKeyPairFailure(stack.getStackStatusReason())) {
-                return handleKeyPairConflict(cloudSiteId, tenantId, stackCreate, timeoutMinutes, backout, stack);
-            }
-            if (!backout) {
-                logger.info("Status is not CREATE_COMPLETE, stack deletion suppressed");
-                throw new StackCreationException("Stack rollback suppressed, stack not deleted");
-            } else {
-                logger.info("Status is not CREATE_COMPLETE, stack deletion will be executed");
-                String errorMessage = "Stack Creation Failed Openstack Status: " + stack.getStackStatus()
-                        + " Status Reason: " + stack.getStackStatusReason();
-                try {
-                    Stack deletedStack = handleUnknownCreateStackFailure(stack, timeoutMinutes, cloudSiteId, tenantId);
-                    errorMessage = errorMessage + " , Rollback of Stack Creation completed with status: "
-                            + deletedStack.getStackStatus() + " Status Reason: " + deletedStack.getStackStatusReason();
-                } catch (StackRollbackException se) {
-                    logger.error("Sync Error Deleting Stack during rollback process", se);
-                    errorMessage = errorMessage + se.getMessage();
-                } catch (MsoException e) {
-                    logger.error("Sync Error Deleting Stack during rollback", e);
-
-                    errorMessage =
-                            errorMessage + " , Rollback of Stack Creation failed with sync error: " + e.getMessage();
+        } else {
+            logger.info("Performing post processing backout: {} cleanUpKeyPair: {}, stack {}", backout, cleanUpKeyPair,
+                    stack);
+            if (!CREATE_COMPLETE.equals(stack.getStackStatus())) {
+                if (cleanUpKeyPair && !Strings.isNullOrEmpty(stack.getStackStatusReason())
+                        && isKeyPairFailure(stack.getStackStatusReason())) {
+                    return handleKeyPairConflict(cloudSiteId, tenantId, stackCreate, timeoutMinutes, backout, stack);
+                }
+                if (!backout) {
+                    logger.info("Status is not CREATE_COMPLETE, stack deletion suppressed");
+                    stackCreationFailed = true;
+                    throw new StackCreationException("Stack rollback suppressed, stack not deleted",
+                            stackCreationFailed, stackRollbackFailed);
+                } else {
+                    logger.info("Status is not CREATE_COMPLETE, stack deletion will be executed");
+                    stackCreationFailed = true;
+                    String errorMessage = "Stack Creation Failed Openstack Status: " + stack.getStackStatus()
+                            + " Status Reason: " + stack.getStackStatusReason();
+                    try {
+                        Stack deletedStack =
+                                handleUnknownCreateStackFailure(stack, timeoutMinutes, cloudSiteId, tenantId);
+                        errorMessage = errorMessage + " , Rollback of Stack Creation completed with status: "
+                                + deletedStack.getStackStatus() + " Status Reason: "
+                                + deletedStack.getStackStatusReason();
+                    } catch (MsoException e) {
+                        stackRollbackFailed = true;
+                        logger.error("Sync Error Deleting Stack during rollback", e);
+                        if (e instanceof StackRollbackException) {
+                            errorMessage = errorMessage + e.getMessage();
+                        } else {
+                            errorMessage = errorMessage + " , Rollback of Stack Creation failed with sync error: "
+                                    + e.getMessage();
+                        }
+                    }
+                    throw new StackCreationException(errorMessage, stackCreationFailed, stackRollbackFailed);
                 }
-                throw new StackCreationException(errorMessage);
+            } else {
+                return stack;
             }
-        } else {
-            return stack;
         }
-
     }
 
     protected Stack pollStackForStatus(int timeoutMinutes, Stack stack, String stackStatus, String cloudSiteId,
-            String tenantId) throws MsoException {
+            String tenantId, boolean notFoundIsSuccess) throws MsoException {
         int pollingFrequency =
                 Integer.parseInt(this.environment.getProperty(createPollIntervalProp, CREATE_POLL_INTERVAL_DEFAULT));
         int pollingMultiplier =
@@ -329,9 +336,10 @@ public class MsoHeatUtils extends MsoCommonUtils implements VduPlugin {
         Heat heatClient = getHeatClient(cloudSiteId, tenantId);
         while (true) {
             Stack latestStack = queryHeatStack(heatClient, stack.getStackName() + "/" + stack.getId());
-            if (latestStack != null) {
+            if (latestStack == null && notFoundIsSuccess) {
+                return null;
+            } else if (latestStack != null) {
                 statusHandler.updateStackStatus(latestStack);
-                logger.debug("Polling: {} ({})", latestStack.getStackStatus(), latestStack.getStackName());
                 if (stackStatus.equals(latestStack.getStackStatus())) {
                     if (numberOfPollingAttempts <= 0) {
                         logger.error("Polling of stack timed out with Status: {}", latestStack.getStackStatus());
@@ -342,9 +350,6 @@ public class MsoHeatUtils extends MsoCommonUtils implements VduPlugin {
                 } else {
                     return latestStack;
                 }
-            } else {
-                logger.error("latestStack is null");
-                return null;
             }
         }
     }
@@ -381,17 +386,26 @@ public class MsoHeatUtils extends MsoCommonUtils implements VduPlugin {
     protected Stack handleUnknownCreateStackFailure(Stack stack, int timeoutMinutes, String cloudSiteId,
             String tenantId) throws MsoException {
         if (stack != null && !Strings.isNullOrEmpty(stack.getStackName()) && !Strings.isNullOrEmpty(stack.getId())) {
-            OpenStackRequest<Void> request = getHeatClient(cloudSiteId, tenantId).getStacks()
-                    .deleteByName(stack.getStackName() + "/" + stack.getId());
-            executeAndRecordOpenstackRequest(request);
-            Stack currentStack = pollStackForStatus(timeoutMinutes, stack, DELETE_IN_PROGRESS, cloudSiteId, tenantId);
-            postProcessStackDelete(currentStack);
-            return currentStack;
+            return deleteStack(stack, timeoutMinutes, cloudSiteId, tenantId);
         } else {
             throw new StackCreationException("Cannot Find Stack Name or Id");
         }
     }
 
+    private Stack deleteStack(Stack stack, int timeoutMinutes, String cloudSiteId, String tenantId)
+            throws MsoException {
+        OpenStackRequest<Void> request = getHeatClient(cloudSiteId, tenantId).getStacks()
+                .deleteByName(stack.getStackName() + "/" + stack.getId());
+        executeAndRecordOpenstackRequest(request);
+        Stack currentStack = pollStackForStatus(timeoutMinutes, stack, DELETE_IN_PROGRESS, cloudSiteId, tenantId, true);
+        if (currentStack == null) {
+            return currentStack;
+        } else {
+            postProcessStackDelete(currentStack);
+        }
+        return currentStack;
+    }
+
     protected void postProcessStackDelete(Stack stack) throws MsoException {
         logger.info("Performing post processing on delete stack {}", stack);
         if (stack != null && !Strings.isNullOrEmpty(stack.getStackStatus())) {
@@ -453,7 +467,6 @@ public class MsoHeatUtils extends MsoCommonUtils implements VduPlugin {
         // Query the Stack.
         // An MsoException will propagate transparently to the caller.
         Stack heatStack = queryHeatStack(heatClient, stackName);
-
         if (heatStack == null) {
             // Stack does not exist. Return a StackInfo with status NOTFOUND
             return new StackInfo(stackName, HeatStatus.NOTFOUND);
@@ -484,114 +497,16 @@ public class MsoHeatUtils extends MsoCommonUtils implements VduPlugin {
      * @throws MsoCloudSiteNotFound
      */
     public StackInfo deleteStack(String tenantId, String cloudOwner, String cloudSiteId, String stackName,
-            boolean pollForCompletion) throws MsoException {
-        Heat heatClient = null;
-        try {
-            heatClient = getHeatClient(cloudSiteId, tenantId);
-        } catch (MsoTenantNotFound e) {
-            logger.debug("Tenant with id " + tenantId + "not found.", e);
-            return new StackInfo(stackName, HeatStatus.NOTFOUND);
-        } catch (MsoException me) {
-            logger.error("{} {} Openstack Exception on Token request: ", MessageEnum.RA_CONNECTION_EXCEPTION,
-                    ErrorCode.AvailabilityError.getValue(), me);
-            me.addContext(DELETE_STACK);
-            throw me;
-        }
-
-        // OK if stack not found, perform a query first
-        Stack heatStack = queryHeatStack(heatClient, stackName);
-        if (heatStack == null || DELETE_COMPLETE.equals(heatStack.getStackStatus())) {
-            // Not found. Return a StackInfo with status NOTFOUND
-            return new StackInfo(stackName, HeatStatus.NOTFOUND);
-        }
-
-        // Use canonical name "<stack name>/<stack-id>" to delete.
-        // Otherwise, deletion by name returns a 302 redirect.
-        // NOTE: This is specific to the v1 Orchestration API.
-        String canonicalName = heatStack.getStackName() + "/" + heatStack.getId();
-
-        try {
-            OpenStackRequest<Void> request = null;
-            if (null != heatClient) {
-                request = heatClient.getStacks().deleteByName(canonicalName);
-            } else {
-                logger.debug("Heat Client is NULL");
-            }
-            executeAndRecordOpenstackRequest(request);
-        } catch (OpenStackResponseException e) {
-            if (e.getStatus() == 404) {
-                // Not found. We are OK with this. Return a StackInfo with status NOTFOUND
-                return new StackInfo(stackName, HeatStatus.NOTFOUND);
-            } else {
-                // Convert the OpenStackResponseException to an MsoOpenstackException
-                throw heatExceptionToMsoException(e, DELETE_STACK);
-            }
-        } catch (OpenStackConnectException e) {
-            // Error connecting to Openstack instance. Convert to an MsoException
-            throw heatExceptionToMsoException(e, DELETE_STACK);
-        } catch (RuntimeException e) {
-            // Catch-all
-            throw runtimeExceptionToMsoException(e, DELETE_STACK);
-        }
-
-        // Requery the stack for current status.
-        // It will probably still exist with "DELETE_IN_PROGRESS" status.
-        heatStack = queryHeatStack(heatClient, canonicalName);
-        statusHandler.updateStackStatus(heatStack);
-        if (pollForCompletion) {
-            int pollInterval = Integer
-                    .parseInt(this.environment.getProperty(deletePollIntervalProp, "" + DELETE_POLL_INTERVAL_DEFAULT));
-            int pollTimeout = Integer
-                    .parseInt(this.environment.getProperty(deletePollTimeoutProp, "" + DELETE_POLL_INTERVAL_DEFAULT));
-            statusHandler.updateStackStatus(heatStack);
-            // When querying by canonical name, Openstack returns DELETE_COMPLETE status
-            // instead of "404" (which would result from query by stack name).
-            while (heatStack != null && !DELETE_COMPLETE.equals(heatStack.getStackStatus())) {
-                logger.debug("Stack status: {}", heatStack.getStackStatus());
-
-                if ("DELETE_FAILED".equals(heatStack.getStackStatus())) {
-                    // Throw a 'special case' of MsoOpenstackException to report the Heat status
-                    String error = "Stack delete error (" + heatStack.getStackStatus() + "): "
-                            + heatStack.getStackStatusReason();
-                    MsoOpenstackException me = new MsoOpenstackException(0, "", error);
-                    me.addContext(DELETE_STACK);
-
-                    // Alarm this condition, stack deletion failed
-
-
-                    throw me;
-                }
-
-                if (pollTimeout <= 0) {
-                    logger.error("{} Cloud site: {} Tenant: {} Stack: {} Stack status: {} {} Delete Stack Timeout",
-                            MessageEnum.RA_DELETE_STACK_TIMEOUT, cloudSiteId, tenantId, stackName,
-                            heatStack.getStackStatus(), ErrorCode.AvailabilityError.getValue());
-
-                    // Throw a 'special case' of MsoOpenstackException to report the Heat status
-                    MsoOpenstackException me = new MsoOpenstackException(0, "", "Stack Deletion Timeout");
-                    me.addContext(DELETE_STACK);
-
-                    // Alarm this condition, stack deletion failed
-
-
-                    throw me;
-                }
-
-                sleep(pollInterval * 1000L);
-
-                pollTimeout -= pollInterval;
-                logger.debug("pollTimeout remaining: {}", pollTimeout);
-
-                heatStack = queryHeatStack(heatClient, canonicalName);
-            }
-
-            // The stack is gone when this point is reached
+            boolean pollForCompletion, int timeoutMinutes) throws MsoException {
+        Stack currentStack = queryHeatStack(stackName, cloudSiteId, tenantId);
+        if (currentStack == null || DELETE_COMPLETE.equals(currentStack.getStackStatus())) {
             return new StackInfo(stackName, HeatStatus.NOTFOUND);
+        } else {
+            currentStack = deleteStack(currentStack, timeoutMinutes, cloudSiteId, tenantId);
+            StackInfo stackInfo = new StackInfoMapper(currentStack).map();
+            stackInfo.setName(stackName);
+            return stackInfo;
         }
-        // Return the current status (if not polling, the delete may still be in progress)
-        StackInfo stackInfo = new StackInfoMapper(heatStack).map();
-        stackInfo.setName(stackName);
-        return stackInfo;
     }
 
     /**
@@ -734,7 +649,7 @@ public class MsoHeatUtils extends MsoCommonUtils implements VduPlugin {
             if (!inputs.containsKey(key)) {
                 Object obj = otherStackOutputs.get(key);
                 if (obj instanceof String) {
-                    inputs.put(key, (String) otherStackOutputs.get(key));
+                    inputs.put(key, otherStackOutputs.get(key));
                 } else if (obj instanceof JsonNode) {
                     // This is a bit of mess - but I think it's the least impacting
                     // let's convert it BACK to a string - then it will get converted back later
@@ -1115,11 +1030,11 @@ public class MsoHeatUtils extends MsoCommonUtils implements VduPlugin {
         }
 
         try {
-            StackInfo stackInfo =
-                    createStack(cloudSiteId, cloudOwner, tenantId, instanceName, vduModel, heatTemplate, inputs, true, // poll
-                                                                                                                       // for
-                                                                                                                       // completion
-                            vduModel.getTimeoutMinutes(), heatEnvironment, nestedTemplates, files, rollbackOnFailure);
+            StackInfo stackInfo = createStack(cloudSiteId, cloudOwner, tenantId, instanceName, vduModel, heatTemplate,
+                    inputs, true, // poll
+                                  // for
+                                  // completion
+                    vduModel.getTimeoutMinutes(), heatEnvironment, nestedTemplates, files, rollbackOnFailure, false);
 
             // Populate a vduInstance from the StackInfo
             return stackInfoToVduInstance(stackInfo);
@@ -1160,7 +1075,7 @@ public class MsoHeatUtils extends MsoCommonUtils implements VduPlugin {
 
         try {
             // Delete the Heat stack
-            StackInfo stackInfo = deleteStack(tenantId, cloudOwner, cloudSiteId, instanceId, true);
+            StackInfo stackInfo = deleteStack(tenantId, cloudOwner, cloudSiteId, instanceId, true, timeoutMinutes);
 
             // Populate a VduInstance based on the deleted Cloudify Deployment object
             VduInstance vduInstance = stackInfoToVduInstance(stackInfo);
index 1701cda..3eb3fe1 100644 (file)
@@ -135,7 +135,7 @@ public class MsoMulticloudUtils extends MsoHeatUtils implements VduPlugin {
     public StackInfo createStack(String cloudSiteId, String cloudOwner, String tenantId, String stackName,
             VduModelInfo vduModel, String heatTemplate, Map<String, ?> stackInputs, boolean pollForCompletion,
             int timeoutMinutes, String environment, Map<String, Object> files, Map<String, Object> heatFiles,
-            boolean backout) throws MsoException {
+            boolean backout, boolean failIfExists) throws MsoException {
 
         logger.trace("Started MsoMulticloudUtils.createStack");
 
@@ -881,11 +881,11 @@ public class MsoMulticloudUtils extends MsoHeatUtils implements VduPlugin {
         }
 
         try {
-            StackInfo stackInfo =
-                    createStack(cloudSiteId, cloudOwner, tenantId, instanceName, vduModel, heatTemplate, inputs, true, // poll
-                                                                                                                       // for
-                                                                                                                       // completion
-                            vduModel.getTimeoutMinutes(), heatEnvironment, nestedTemplates, files, rollbackOnFailure);
+            StackInfo stackInfo = createStack(cloudSiteId, cloudOwner, tenantId, instanceName, vduModel, heatTemplate,
+                    inputs, true, // poll
+                                  // for
+                                  // completion
+                    vduModel.getTimeoutMinutes(), heatEnvironment, nestedTemplates, files, rollbackOnFailure, false);
             // Populate a vduInstance from the StackInfo
             return stackInfoToVduInstance(stackInfo);
         } catch (Exception e) {
@@ -957,6 +957,7 @@ public class MsoMulticloudUtils extends MsoHeatUtils implements VduPlugin {
     /*
      * Convert the local DeploymentInfo object (Cloudify-specific) to a generic VduInstance object
      */
+    @Override
     protected VduInstance stackInfoToVduInstance(StackInfo stackInfo) {
         VduInstance vduInstance = new VduInstance();
 
index e3936e3..ab9c8a6 100644 (file)
@@ -24,8 +24,22 @@ import org.onap.so.openstack.exceptions.MsoException;
 
 public class StackCreationException extends MsoException {
 
+    /**
+     * 
+     */
+    private static final long serialVersionUID = 6221508301589330950L;
+
+    boolean stackCreationFailed = false;
+    boolean stackRollbackFailed = false;
+
     public StackCreationException(String error) {
         super(error);
     }
 
+    public StackCreationException(String error, boolean stackCreationFailed, boolean stackRollbackFailed) {
+        super(error);
+        this.stackRollbackFailed = stackRollbackFailed;
+        this.stackCreationFailed = stackCreationFailed;
+    }
+
 }
index 7e783aa..86b1413 100644 (file)
@@ -133,7 +133,7 @@ public class MsoHeatUtilsITTest extends BaseTest {
     @Test
     public void deleteVduTest() throws Exception {
         VduInstance expected = new VduInstance();
-        expected.setVduInstanceId("instanceId");
+        expected.setVduInstanceId("name/stackId");
         expected.setVduInstanceName("instanceId");
         VduStatus status = new VduStatus();
         status.setState(VduStateType.DELETED);
@@ -209,8 +209,8 @@ public class MsoHeatUtilsITTest extends BaseTest {
         StubOpenStack.mockOpenStackResponseAccess(wireMockServer, wireMockPort);
         StubOpenStack.mockOpenStackPostStack_200(wireMockServer, "OpenstackResponse_Stack_Created.json");
         StubOpenStack.mockOpenStackGet(wireMockServer, "TEST-stack/stackId");
-        StackInfo stackInfo = heatUtils.createStack(cloudSite.getId(), "CloudOwner", "tenantId", "TEST-stack",
-                "TEST-heat", new HashMap<>(), false, 1, "TEST-env", new HashMap<>(), new HashMap<>());
+        StackInfo stackInfo = heatUtils.createStack(cloudSite.getId(), "CloudOwner", "tenantId", "TEST-stack", null,
+                "TEST-heat", new HashMap<>(), false, 1, "TEST-env", new HashMap<>(), new HashMap<>(), false, false);
         assertNotNull(stackInfo);
     }
 
index e68364e..92cf96e 100644 (file)
@@ -124,7 +124,7 @@ public class MsoHeatUtilsTest extends MsoHeatUtils {
         latestStack.setStackStatusReason("Stack Finished");
         doReturn(latestStack).when(heatUtils).queryHeatStack(isA(Heat.class), eq("stackName/id"));
         doReturn(heatClient).when(heatUtils).getHeatClient(cloudSiteId, tenantId);
-        Stack actual = heatUtils.pollStackForStatus(1, stack, "CREATE_IN_PROGRESS", cloudSiteId, tenantId);
+        Stack actual = heatUtils.pollStackForStatus(1, stack, "CREATE_IN_PROGRESS", cloudSiteId, tenantId, false);
         Mockito.verify(stackStatusHandler, times(1)).updateStackStatus(latestStack);
         Mockito.verify(heatUtils, times(1)).queryHeatStack(isA(Heat.class), eq("stackName/id"));
         assertEquals(true, actual != null);
@@ -141,7 +141,7 @@ public class MsoHeatUtilsTest extends MsoHeatUtils {
         doNothing().when(stackStatusHandler).updateStackStatus(stack);
         doReturn(stack).when(heatUtils).queryHeatStack(isA(Heat.class), eq("stackName/id"));
         doReturn(heatClient).when(heatUtils).getHeatClient(cloudSiteId, tenantId);
-        Stack actual = heatUtils.pollStackForStatus(1, stack, "CREATE_IN_PROGRESS", cloudSiteId, tenantId);
+        Stack actual = heatUtils.pollStackForStatus(1, stack, "CREATE_IN_PROGRESS", cloudSiteId, tenantId, false);
         Mockito.verify(stackStatusHandler, times(1)).updateStackStatus(stack);
         Mockito.verify(heatUtils, times(1)).queryHeatStack(isA(Heat.class), eq("stackName/id"));
         assertEquals(true, actual != null);
@@ -259,11 +259,12 @@ public class MsoHeatUtilsTest extends MsoHeatUtils {
         doReturn(stackResource).when(heatClient).getStacks();
         doReturn(mockDeleteStack).when(stackResource).deleteByName("stackName/id");
         doReturn(deletedStack).when(heatUtils).pollStackForStatus(120, stack, "DELETE_IN_PROGRESS", cloudSiteId,
-                tenantId);
+                tenantId, true);
 
         heatUtils.handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);
         Mockito.verify(heatUtils, times(1)).executeAndRecordOpenstackRequest(mockDeleteStack);
-        Mockito.verify(heatUtils, times(1)).pollStackForStatus(120, stack, "DELETE_IN_PROGRESS", cloudSiteId, tenantId);
+        Mockito.verify(heatUtils, times(1)).pollStackForStatus(120, stack, "DELETE_IN_PROGRESS", cloudSiteId, tenantId,
+                true);
         Mockito.verify(heatUtils, times(1)).postProcessStackDelete(deletedStack);
     }
 
@@ -357,12 +358,13 @@ public class MsoHeatUtilsTest extends MsoHeatUtils {
         createStackParam.setStackName("stackName");
 
         doReturn(createdStack).when(heatUtils).pollStackForStatus(120, stack, "CREATE_IN_PROGRESS", cloudSiteId,
-                tenantId);
+                tenantId, false);
         doReturn(createdStack).when(heatUtils).postProcessStackCreate(createdStack, true, 120, true, cloudSiteId,
                 tenantId, createStackParam);
 
         heatUtils.processCreateStack(cloudSiteId, tenantId, 120, true, stack, createStackParam, true);
-        Mockito.verify(heatUtils, times(1)).pollStackForStatus(120, stack, "CREATE_IN_PROGRESS", cloudSiteId, tenantId);
+        Mockito.verify(heatUtils, times(1)).pollStackForStatus(120, stack, "CREATE_IN_PROGRESS", cloudSiteId, tenantId,
+                false);
         Mockito.verify(heatUtils, times(1)).postProcessStackCreate(createdStack, true, 120, true, cloudSiteId, tenantId,
                 createStackParam);
     }
@@ -387,11 +389,12 @@ public class MsoHeatUtilsTest extends MsoHeatUtils {
         createStackParam.setStackName("stackName");
 
         doThrow(new StackCreationException("Error")).when(heatUtils).pollStackForStatus(120, stack,
-                "CREATE_IN_PROGRESS", cloudSiteId, tenantId);
+                "CREATE_IN_PROGRESS", cloudSiteId, tenantId, false);
         exceptionRule.expect(MsoException.class);
         exceptionRule.expectMessage("Error");
         heatUtils.processCreateStack(cloudSiteId, tenantId, 120, true, stack, createStackParam, true);
-        Mockito.verify(heatUtils, times(1)).pollStackForStatus(120, stack, "CREATE_IN_PROGRESS", cloudSiteId, tenantId);
+        Mockito.verify(heatUtils, times(1)).pollStackForStatus(120, stack, "CREATE_IN_PROGRESS", cloudSiteId, tenantId,
+                false);
         Mockito.verify(heatUtils, times(1)).postProcessStackCreate(stack, true, 120, true, cloudSiteId, tenantId,
                 createStackParam);
     }
@@ -527,12 +530,13 @@ public class MsoHeatUtilsTest extends MsoHeatUtils {
         createStackParam.setStackName("stackName");
 
         doThrow(new StackCreationException("Error")).when(heatUtils).pollStackForStatus(120, stack,
-                "CREATE_IN_PROGRESS", cloudSiteId, tenantId);
+                "CREATE_IN_PROGRESS", cloudSiteId, tenantId, false);
 
         exceptionRule.expect(MsoException.class);
         exceptionRule.expectMessage("Error");
         heatUtils.processCreateStack(cloudSiteId, tenantId, 120, false, stack, createStackParam, true);
-        Mockito.verify(heatUtils, times(1)).pollStackForStatus(120, stack, "CREATE_IN_PROGRESS", cloudSiteId, tenantId);
+        Mockito.verify(heatUtils, times(1)).pollStackForStatus(120, stack, "CREATE_IN_PROGRESS", cloudSiteId, tenantId,
+                false);
         Mockito.verify(heatUtils, times(0)).handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);
     }
 
index 995db52..44a9bc3 100644 (file)
@@ -24,8 +24,8 @@ import static com.github.tomakehurst.wiremock.client.WireMock.aResponse;
 import static com.github.tomakehurst.wiremock.client.WireMock.delete;
 import static com.github.tomakehurst.wiremock.client.WireMock.get;
 import static com.github.tomakehurst.wiremock.client.WireMock.post;
-import static com.github.tomakehurst.wiremock.client.WireMock.urlPathEqualTo;
 import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo;
+import static com.github.tomakehurst.wiremock.client.WireMock.urlPathEqualTo;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
@@ -95,9 +95,9 @@ public class MsoMulticloudUtilsTest extends BaseTest {
         wireMockServer.stubFor(get(urlEqualTo(MULTICLOUD_GET_PATH)).inScenario("CREATE").whenScenarioStateIs("UPDATING")
                 .willReturn(aResponse().withHeader("Content-Type", "application/json")
                         .withBodyFile("MulticloudGetUpdateResponse.json").withStatus(HttpStatus.SC_OK)));
-        StackInfo result =
-                multicloudUtils.createStack("MTN14", "CloudOwner", "TEST-tenant", "TEST-stack", new VduModelInfo(),
-                        "TEST-heat", new HashMap<>(), true, 200, "TEST-env", new HashMap<>(), new HashMap<>(), false);
+        StackInfo result = multicloudUtils.createStack("MTN14", "CloudOwner", "TEST-tenant", "TEST-stack",
+                new VduModelInfo(), "TEST-heat", new HashMap<>(), true, 200, "TEST-env", new HashMap<>(),
+                new HashMap<>(), false, false);
         wireMockServer.resetScenarios();
         assertNotNull(result);
         assertEquals("TEST-stack", result.getName());
@@ -155,7 +155,8 @@ public class MsoMulticloudUtilsTest extends BaseTest {
             cloudSite.setIdentityService(new CloudIdentity());
             when(cloudConfigMock.getCloudSite("MTN13")).thenReturn(Optional.of(cloudSite));
             multicloudUtilsMock.createStack("MNT14", "CloudOwner", "TEST-tenant", "TEST-stack", new VduModelInfo(),
-                    "TEST-heat", new HashMap<>(), false, 200, "TEST-env", new HashMap<>(), new HashMap<>(), false);
+                    "TEST-heat", new HashMap<>(), false, 200, "TEST-env", new HashMap<>(), new HashMap<>(), false,
+                    false);
         } catch (MsoException e) {
             assertEquals("0 : Multicloud client could not be initialized", e.toString());
             return;
@@ -169,7 +170,8 @@ public class MsoMulticloudUtilsTest extends BaseTest {
             wireMockServer.stubFor(post(urlPathEqualTo(MULTICLOUD_CREATE_PATH)).willReturn(
                     aResponse().withHeader("Content-Type", "application/json").withStatus(HttpStatus.SC_BAD_REQUEST)));
             multicloudUtils.createStack("MTN14", "CloudOwner", "TEST-tenant", "TEST-stack", new VduModelInfo(),
-                    "TEST-heat", new HashMap<>(), false, 200, "TEST-env", new HashMap<>(), new HashMap<>(), false);
+                    "TEST-heat", new HashMap<>(), false, 200, "TEST-env", new HashMap<>(), new HashMap<>(), false,
+                    false);
         } catch (MsoException e) {
             assertEquals("0 : Bad Request", e.toString());
             return;
@@ -181,9 +183,9 @@ public class MsoMulticloudUtilsTest extends BaseTest {
     public void createStackEmptyResponseEntity() throws MsoException {
         wireMockServer.stubFor(post(urlPathEqualTo(MULTICLOUD_CREATE_PATH)).willReturn(
                 aResponse().withHeader("Content-Type", "application/json").withStatus(HttpStatus.SC_CREATED)));
-        StackInfo result =
-                multicloudUtils.createStack("MTN14", "CloudOwner", "TEST-tenant", "TEST-stack", new VduModelInfo(),
-                        "TEST-heat", new HashMap<>(), false, 200, "TEST-env", new HashMap<>(), new HashMap<>(), false);
+        StackInfo result = multicloudUtils.createStack("MTN14", "CloudOwner", "TEST-tenant", "TEST-stack",
+                new VduModelInfo(), "TEST-heat", new HashMap<>(), false, 200, "TEST-env", new HashMap<>(),
+                new HashMap<>(), false, false);
         assertNotNull(result);
         assertEquals("TEST-stack/", result.getName());
     }
index a26a551..ea05b64 100644 (file)
@@ -3,7 +3,7 @@
                "description": null,
                "links": null,
                "stack_status_reason": null,
-               "stack_name": null,
+               "stack_name": "name",
                "updated_time": null,
                "creation_time": null,
                "stack_status": "DELETE_COMPLETE",
index 013c7f8..52b97da 100644 (file)
@@ -24,8 +24,6 @@
 
 package org.onap.so.adapters.network;
 
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -33,7 +31,6 @@ import java.util.Map;
 import java.util.Optional;
 import javax.jws.WebService;
 import javax.xml.ws.Holder;
-import org.onap.so.logger.LoggingAnchor;
 import org.onap.so.adapters.network.beans.ContrailPolicyRef;
 import org.onap.so.adapters.network.beans.ContrailPolicyRefSeq;
 import org.onap.so.adapters.network.beans.ContrailSubnet;
@@ -51,6 +48,7 @@ import org.onap.so.db.catalog.data.repository.NetworkResourceRepository;
 import org.onap.so.db.catalog.utils.MavenLikeVersioning;
 import org.onap.so.entity.MsoRequest;
 import org.onap.so.logger.ErrorCode;
+import org.onap.so.logger.LoggingAnchor;
 import org.onap.so.logger.MessageEnum;
 import org.onap.so.openstack.beans.HeatStatus;
 import org.onap.so.openstack.beans.NetworkInfo;
@@ -74,6 +72,8 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.env.Environment;
 import org.springframework.stereotype.Component;
 import org.springframework.transaction.annotation.Transactional;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
 
 @Component
 @Transactional
@@ -427,7 +427,8 @@ public class MsoNetworkAdapterImpl implements MsoNetworkAdapter {
                 if (backout == null)
                     backout = true;
                 heatStack = heat.createStack(cloudSiteId, CLOUD_OWNER, tenantId, networkName, null, template,
-                        stackParams, true, heatTemplate.getTimeoutMinutes(), null, null, null, backout.booleanValue());
+                        stackParams, true, heatTemplate.getTimeoutMinutes(), null, null, null, backout.booleanValue(),
+                        failIfExists);
             } catch (MsoException me) {
                 me.addContext(CREATE_NETWORK_CONTEXT);
                 logger.error("{} {} Exception creating network type {} in {}/{} ", MessageEnum.RA_CREATE_NETWORK_EXC,
@@ -1015,13 +1016,7 @@ public class MsoNetworkAdapterImpl implements MsoNetworkAdapter {
     @Override
     public void deleteNetwork(String cloudSiteId, String tenantId, String networkType, String modelCustomizationUuid,
             String networkId, MsoRequest msoRequest, Holder<Boolean> networkDeleted) throws NetworkException {
-
         logger.debug("*** DELETE Network adapter with Network: {} in {}/{}", networkId, cloudSiteId, tenantId);
-
-        // Will capture execution time for metrics
-        long startTime = System.currentTimeMillis();
-
-
         if (commonUtils.isNullOrEmpty(cloudSiteId) || commonUtils.isNullOrEmpty(tenantId)
                 || commonUtils.isNullOrEmpty(networkId)) {
             String error = "Missing mandatory parameter cloudSiteId, tenantId or networkId";
@@ -1043,20 +1038,15 @@ public class MsoNetworkAdapterImpl implements MsoNetworkAdapter {
                 networkResource = nrc.getNetworkResource();
             }
         }
+
         String mode = "";
         if (networkResource != null) {
-            logger.debug(LOG_DEBUG_MSG, networkResource);
-
+            logger.debug(LOG_DEBUG_MSG, networkResource.toString());
             mode = networkResource.getOrchestrationMode();
         }
 
         if (NEUTRON_MODE.equals(mode)) {
-
-            // Use MsoNeutronUtils for all NEUTRON commands
-            long deleteNetworkStarttime = System.currentTimeMillis();
             try {
-                // The deleteNetwork function in MsoNeutronUtils returns success if the network
-                // was not found. So don't bother to query first.
                 boolean deleted = neutron.deleteNetwork(networkId, tenantId, cloudSiteId);
                 networkDeleted.value = deleted;
             } catch (MsoException me) {
@@ -1065,21 +1055,10 @@ public class MsoNetworkAdapterImpl implements MsoNetworkAdapter {
                         ErrorCode.DataError.getValue(), networkId, cloudSiteId, tenantId, me);
                 throw new NetworkException(me);
             }
-        } else { // DEFAULT to ("HEAT".equals (mode))
-            long deleteStackStarttime = System.currentTimeMillis();
-
+        } else {
             try {
-                // The deleteStack function in MsoHeatUtils returns NOTFOUND if the stack was not found or if the stack
-                // was deleted.
-                // So query first to report back if stack WAS deleted or just NOTOFUND
-                StackInfo heatStack = null;
-                heatStack = heat.queryStack(cloudSiteId, CLOUD_OWNER, tenantId, networkId);
-                if (heatStack != null && heatStack.getStatus() != HeatStatus.NOTFOUND) {
-                    heat.deleteStack(tenantId, CLOUD_OWNER, cloudSiteId, networkId, true);
-                    networkDeleted.value = true;
-                } else {
-                    networkDeleted.value = false;
-                }
+                heat.deleteStack(tenantId, CLOUD_OWNER, cloudSiteId, networkId, true, 120);
+                networkDeleted.value = true;
             } catch (MsoException me) {
                 me.addContext("DeleteNetwork");
                 logger.error("{} {} Delete Network (heat): {} in {}/{} ", MessageEnum.RA_DELETE_NETWORK_EXC,
@@ -1087,10 +1066,6 @@ public class MsoNetworkAdapterImpl implements MsoNetworkAdapter {
                 throw new NetworkException(me);
             }
         }
-
-
-        // On success, nothing is returned.
-        return;
     }
 
     /**
@@ -1103,9 +1078,6 @@ public class MsoNetworkAdapterImpl implements MsoNetworkAdapter {
      */
     @Override
     public void rollbackNetwork(NetworkRollback rollback) throws NetworkException {
-        // Will capture execution time for metrics
-        long startTime = System.currentTimeMillis();
-
         if (rollback == null) {
             logger.error("{} {} rollback is null", MessageEnum.RA_ROLLBACK_NULL, ErrorCode.DataError.getValue());
             return;
@@ -1119,8 +1091,6 @@ public class MsoNetworkAdapterImpl implements MsoNetworkAdapter {
         String modelCustomizationUuid = rollback.getModelCustomizationUuid();
 
         logger.debug("*** ROLLBACK Network {} in {}/{}", networkId, cloudSiteId, tenantId);
-
-
         // Retrieve the Network Resource definition
         NetworkResource networkResource = null;
         if (commonUtils.isNullOrEmpty(modelCustomizationUuid)) {
@@ -1138,13 +1108,8 @@ public class MsoNetworkAdapterImpl implements MsoNetworkAdapter {
         }
 
         if (rollback.getNetworkCreated()) {
-            // Rolling back a newly created network, so delete it.
             if (NEUTRON_MODE.equals(mode)) {
-                // Use MsoNeutronUtils for all NEUTRON commands
-                long deleteNetworkStarttime = System.currentTimeMillis();
                 try {
-                    // The deleteNetwork function in MsoNeutronUtils returns success if the network
-                    // was not found. So don't bother to query first.
                     neutron.deleteNetwork(networkId, tenantId, cloudSiteId);
                 } catch (MsoException me) {
                     me.addContext("RollbackNetwork");
@@ -1153,12 +1118,9 @@ public class MsoNetworkAdapterImpl implements MsoNetworkAdapter {
                             cloudSiteId, tenantId, me);
                     throw new NetworkException(me);
                 }
-            } else { // DEFAULT to if ("HEAT".equals (mode))
-                long deleteStackStarttime = System.currentTimeMillis();
+            } else {
                 try {
-                    // The deleteStack function in MsoHeatUtils returns success if the stack
-                    // was not found. So don't bother to query first.
-                    heat.deleteStack(tenantId, CLOUD_OWNER, cloudSiteId, networkId, true);
+                    heat.deleteStack(tenantId, CLOUD_OWNER, cloudSiteId, networkId, true, 120);
                 } catch (MsoException me) {
                     me.addContext("RollbackNetwork");
                     logger.error("{} {} Exception - Rollback Network (heat): {} in {}/{} ",
@@ -1168,8 +1130,6 @@ public class MsoNetworkAdapterImpl implements MsoNetworkAdapter {
                 }
             }
         }
-
-        return;
     }
 
     private String validateNetworkParams(NetworkType neutronNetworkType, String networkName, String physicalNetwork,
index af2fa24..2c78e59 100644 (file)
@@ -36,7 +36,6 @@ import java.util.Optional;
 import java.util.concurrent.TimeUnit;
 import javax.jws.WebService;
 import javax.xml.ws.Holder;
-import org.onap.so.logger.LoggingAnchor;
 import org.apache.commons.collections.CollectionUtils;
 import org.onap.so.adapters.valet.GenericValetResponse;
 import org.onap.so.adapters.valet.ValetClient;
@@ -47,7 +46,6 @@ import org.onap.so.adapters.valet.beans.ValetDeleteResponse;
 import org.onap.so.adapters.valet.beans.ValetRollbackResponse;
 import org.onap.so.adapters.valet.beans.ValetStatus;
 import org.onap.so.adapters.valet.beans.ValetUpdateResponse;
-import org.onap.so.adapters.vnf.exceptions.VnfAlreadyExists;
 import org.onap.so.adapters.vnf.exceptions.VnfException;
 import org.onap.so.adapters.vnf.exceptions.VnfNotFound;
 import org.onap.so.client.aai.AAIResourcesClient;
@@ -68,6 +66,7 @@ import org.onap.so.entity.MsoRequest;
 import org.onap.so.heatbridge.HeatBridgeApi;
 import org.onap.so.heatbridge.HeatBridgeImpl;
 import org.onap.so.logger.ErrorCode;
+import org.onap.so.logger.LoggingAnchor;
 import org.onap.so.logger.MessageEnum;
 import org.onap.so.openstack.beans.HeatStatus;
 import org.onap.so.openstack.beans.StackInfo;
@@ -80,6 +79,10 @@ import org.onap.so.openstack.exceptions.MsoHeatNotFoundException;
 import org.onap.so.openstack.utils.MsoHeatEnvironmentEntry;
 import org.onap.so.openstack.utils.MsoHeatUtils;
 import org.onap.so.openstack.utils.MsoHeatUtilsWithUpdate;
+import org.openstack4j.model.compute.Flavor;
+import org.openstack4j.model.compute.Image;
+import org.openstack4j.model.compute.Server;
+import org.openstack4j.model.heat.Resource;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -89,10 +92,6 @@ import org.springframework.transaction.annotation.Transactional;
 import com.fasterxml.jackson.core.JsonParseException;
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
-import org.openstack4j.model.compute.Flavor;
-import org.openstack4j.model.compute.Image;
-import org.openstack4j.model.compute.Server;
-import org.openstack4j.model.heat.Resource;
 
 @WebService(serviceName = "VnfAdapter", endpointInterface = "org.onap.so.adapters.vnf.MsoVnfAdapter",
         targetNamespace = "http://org.onap.so/vnf")
@@ -133,7 +132,7 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
     @Autowired
     private MsoHeatUtilsWithUpdate heatU;
     @Autowired
-    private MsoHeatUtils heat;
+    private MsoHeatUtils msoHeatUtils;
     @Autowired
     private ValetClient vci;
 
@@ -264,7 +263,7 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
 
         StackInfo heatStack;
         try {
-            heatStack = heat.queryStack(cloudSiteId, cloudOwner, tenantId, vnfName);
+            heatStack = msoHeatUtils.queryStack(cloudSiteId, cloudOwner, tenantId, vnfName);
         } catch (MsoException me) {
             me.addContext("QueryVNF");
             // Failed to query the Stack due to an openstack exception.
@@ -317,7 +316,7 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
         logger.debug("Deleting VNF {} in {}", vnfName, cloudSiteId + "/" + tenantId);
 
         try {
-            heat.deleteStack(tenantId, cloudOwner, cloudSiteId, vnfName, true);
+            msoHeatUtils.deleteStack(tenantId, cloudOwner, cloudSiteId, vnfName, true, 118);
         } catch (MsoException me) {
             me.addContext(DELETE_VNF);
             // Failed to query the Stack due to an openstack exception.
@@ -360,7 +359,7 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
         // of NOTFOUND (on success) or FAILED (on error). Also, MsoOpenstackException
         // could be thrown.
         try {
-            heat.deleteStack(tenantId, cloudOwner, cloudSiteId, vnfId, true);
+            msoHeatUtils.deleteStack(tenantId, cloudOwner, cloudSiteId, vnfId, true, 118);
         } catch (MsoException me) {
             // Failed to rollback the Stack due to an openstack exception.
             // Convert to a generic VnfException
@@ -638,96 +637,13 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
             callHeatbridge(baseVfHeatStackId);
         }
 
-        StackInfo heatStack = null;
-        try {
-            if (heat != null) {
-                heatStack = heat.queryStack(cloudSiteId, cloudOwner, tenantId, vfModuleName);
-            } else {
-                throw new MsoHeatNotFoundException();
-            }
-        } catch (MsoException me) {
-            String error = "Create VF Module: Query " + vfModuleName + " in " + cloudOwner + "/" + cloudSiteId + "/"
-                    + tenantId + ": " + me;
-            logger.error(LoggingAnchor.NINE, MessageEnum.RA_QUERY_VNF_ERR.toString(), vfModuleName, cloudOwner,
-                    cloudSiteId, tenantId, OPENSTACK, QUERY_STACK, ErrorCode.DataError.getValue(),
-                    "Exception - " + QUERY_STACK, me);
-            logger.debug(error);
-            // Failed to query the Stack due to an openstack exception.
-            // Convert to a generic VnfException
-            me.addContext(CREATE_VFM_MODULE);
-            throw new VnfException(me);
-        }
-        // more precise handling/messaging if the stack already exists
-        if (heatStack != null && heatStack.getStatus() != HeatStatus.NOTFOUND) {
-            // INIT, CREATED, NOTFOUND, FAILED, BUILDING, DELETING, UNKNOWN, UPDATING, UPDATED
-            HeatStatus status = heatStack.getStatus();
-            if (status == HeatStatus.INIT || status == HeatStatus.BUILDING || status == HeatStatus.DELETING
-                    || status == HeatStatus.UPDATING) {
-                // fail - it's in progress - return meaningful error
-                String error = CREATE_VF_STACK + " " + vfModuleName + " already exists and has status "
-                        + status.toString() + " in " + cloudOwner + "/" + cloudSiteId + "/" + tenantId
-                        + "; please wait for it to complete, or fix manually.";
-                logger.error(LoggingAnchor.NINE, MessageEnum.RA_VNF_ALREADY_EXIST.toString(), vfModuleName, cloudOwner,
-                        cloudSiteId, tenantId, OPENSTACK, QUERY_STACK, ErrorCode.DataError.getValue(),
-                        STACK + " " + vfModuleName + " already exists");
-                logger.debug(error);
-                throw new VnfAlreadyExists(vfModuleName, cloudOwner, cloudSiteId, tenantId,
-                        heatStack.getCanonicalName());
-            }
-            if (status == HeatStatus.FAILED) {
-                // fail - it exists and is in a FAILED state
-                String error = CREATE_VF_STACK + " " + vfModuleName + " already exists and is in FAILED state in "
-                        + cloudOwner + "/" + cloudSiteId + "/" + tenantId + "; requires manual intervention.";
-                logger.error(LoggingAnchor.NINE, MessageEnum.RA_VNF_ALREADY_EXIST.toString(), vfModuleName, cloudOwner,
-                        cloudSiteId, tenantId, OPENSTACK, QUERY_STACK, ErrorCode.DataError.getValue(),
-                        STACK + " " + vfModuleName + " already exists and is " + "in FAILED state");
-                logger.debug(error);
-                throw new VnfAlreadyExists(vfModuleName, cloudOwner, cloudSiteId, tenantId,
-                        heatStack.getCanonicalName());
-            }
-            if (status == HeatStatus.UNKNOWN || status == HeatStatus.UPDATED) {
-                // fail - it exists and is in a FAILED state
-                String error = CREATE_VF_STACK + " " + vfModuleName + " already exists and has status "
-                        + status.toString() + " in " + cloudOwner + "/" + cloudSiteId + "/" + tenantId
-                        + "; requires manual intervention.";
-                logger.error(LoggingAnchor.NINE, MessageEnum.RA_VNF_ALREADY_EXIST.toString(), vfModuleName, cloudOwner,
-                        cloudSiteId, tenantId, OPENSTACK, QUERY_STACK, ErrorCode.DataError.getValue(),
-                        STACK + " " + vfModuleName + " already exists and is " + "in UPDATED or UNKNOWN state");
-                logger.debug(error);
-                throw new VnfAlreadyExists(vfModuleName, cloudOwner, cloudSiteId, tenantId,
-                        heatStack.getCanonicalName());
-            }
-            if (status == HeatStatus.CREATED) {
-                // fail - it exists
-                if (failIfExists != null && failIfExists) {
-                    String error = CREATE_VF_STACK + " " + vfModuleName + " already exists in " + cloudOwner + "/"
-                            + cloudSiteId + "/" + tenantId;
-                    logger.error(LoggingAnchor.NINE, MessageEnum.RA_VNF_ALREADY_EXIST.toString(), vfModuleName,
-                            cloudOwner, cloudSiteId, tenantId, OPENSTACK, QUERY_STACK, ErrorCode.DataError.getValue(),
-                            STACK + " " + vfModuleName + " already exists");
-                    logger.debug(error);
-                    throw new VnfAlreadyExists(vfModuleName, cloudOwner, cloudSiteId, tenantId,
-                            heatStack.getCanonicalName());
-                } else {
-                    logger.debug("Found Existing stack, status={}", heatStack.getStatus());
-                    // Populate the outputs from the existing stack.
-                    vnfId.value = heatStack.getCanonicalName();
-                    outputs.value = copyStringOutputs(heatStack.getOutputs());
-                    rollback.value = vfRollback; // Default rollback - no updates performed
-                }
-            }
-            return;
-
-        }
-
         // handle a nestedStackId if sent- this one would be for the volume - so applies to both Vf and Vnf
         StackInfo nestedHeatStack = null;
-
         Map<String, Object> nestedVolumeOutputs = null;
         if (nestedStackId != null) {
             try {
                 logger.debug("Querying for nestedStackId = {}", nestedStackId);
-                nestedHeatStack = heat.queryStack(cloudSiteId, cloudOwner, tenantId, nestedStackId);
+                nestedHeatStack = msoHeatUtils.queryStack(cloudSiteId, cloudOwner, tenantId, nestedStackId);
             } catch (MsoException me) {
                 // Failed to query the Stack due to an openstack exception.
                 // Convert to a generic VnfException
@@ -761,7 +677,7 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
         if (nestedBaseStackId != null) {
             try {
                 logger.debug("Querying for nestedBaseStackId = {}", nestedBaseStackId);
-                nestedBaseHeatStack = heat.queryStack(cloudSiteId, cloudOwner, tenantId, nestedBaseStackId);
+                nestedBaseHeatStack = msoHeatUtils.queryStack(cloudSiteId, cloudOwner, tenantId, nestedBaseStackId);
             } catch (MsoException me) {
                 // Failed to query the Stack due to an openstack exception.
                 // Convert to a generic VnfException
@@ -790,7 +706,6 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
         }
 
         try {
-            // Retrieve the VF
             VfModule vf = null;
             VnfResource vnfResource = null;
             VfModuleCustomization vfmc = null;
@@ -985,7 +900,7 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
                 logger.debug("Contents of nestedTemplates - to be added to files: on stack:");
                 for (HeatTemplate entry : nestedTemplates) {
                     nestedTemplatesChecked.put(entry.getTemplateName(), entry.getTemplateBody());
-                    logger.debug(entry.getTemplateName() + " -> " + entry.getTemplateBody());
+                    logger.debug("Adding Nested Template", entry.getTemplateName());
                 }
             } else {
                 logger.debug("No nested templates found - nothing to do here");
@@ -1107,13 +1022,13 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
             // Step 1 - convert what we got as inputs (Map<String, String>) to a
             // Map<String, Object> - where the object matches the param type identified in the template
             // This will also not copy over params that aren't identified in the template
-            goldenInputs = heat.convertInputMap(inputs, heatTemplate);
+            goldenInputs = msoHeatUtils.convertInputMap(inputs, heatTemplate);
             // Step 2 - now simply add the outputs as we received them - no need to convert to string
             logger.debug("Now add in the base stack outputs if applicable");
-            heat.copyBaseOutputsToInputs(goldenInputs, baseStackOutputs, parameterNames, aliasToParam);
+            msoHeatUtils.copyBaseOutputsToInputs(goldenInputs, baseStackOutputs, parameterNames, aliasToParam);
             // Step 3 - add the volume inputs if any
             logger.debug("Now add in the volume stack outputs if applicable");
-            heat.copyBaseOutputsToInputs(goldenInputs, nestedVolumeOutputs, parameterNames, aliasToParam);
+            msoHeatUtils.copyBaseOutputsToInputs(goldenInputs, nestedVolumeOutputs, parameterNames, aliasToParam);
 
             for (HeatTemplateParam parm : heatTemplate.getParameters()) {
                 logger.debug("Parameter:'" + parm.getParamName() + "', isRequired=" + parm.isRequired() + ", alias="
@@ -1186,15 +1101,16 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
             // Have the tenant. Now deploy the stack itself
             // Ignore MsoTenantNotFound and MsoStackAlreadyExists exceptions
             // because we already checked for those.
+
+            StackInfo heatStack = null;
             try {
                 if (backout == null) {
                     backout = true;
                 }
-                if (heat != null) {
-
-                    heatStack = heat.createStack(cloudSiteId, cloudOwner, tenantId, vfModuleName, null, template,
-                            goldenInputs, true, heatTemplate.getTimeoutMinutes(), newEnvironmentString,
-                            nestedTemplatesChecked, heatFilesObjects, backout.booleanValue());
+                if (msoHeatUtils != null) {
+                    heatStack = msoHeatUtils.createStack(cloudSiteId, cloudOwner, tenantId, vfModuleName, null,
+                            template, goldenInputs, true, heatTemplate.getTimeoutMinutes(), newEnvironmentString,
+                            nestedTemplatesChecked, heatFilesObjects, backout.booleanValue(), failIfExists);
                 } else {
                     throw new MsoHeatNotFoundException();
                 }
@@ -1251,15 +1167,9 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
     @Override
     public void deleteVfModule(String cloudSiteId, String cloudOwner, String tenantId, String vnfName,
             MsoRequest msoRequest, Holder<Map<String, String>> outputs) throws VnfException {
-
-        logger.debug("Deleting VF {} in ", vnfName, cloudOwner + "/" + cloudSiteId + "/" + tenantId);
-        // Will capture execution time for metrics
-
-        // 1702 capture the output parameters on a delete
-        // so we'll need to query first
         Map<String, Object> stackOutputs;
         try {
-            stackOutputs = heat.queryStackForOutputs(cloudSiteId, cloudOwner, tenantId, vnfName);
+            stackOutputs = msoHeatUtils.queryStackForOutputs(cloudSiteId, cloudOwner, tenantId, vnfName);
         } catch (MsoException me) {
             // Failed to query the Stack due to an openstack exception.
             // Convert to a generic VnfException
@@ -1286,7 +1196,7 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
         }
 
         try {
-            heat.deleteStack(tenantId, cloudOwner, cloudSiteId, vnfName, true);
+            msoHeatUtils.deleteStack(tenantId, cloudOwner, cloudSiteId, vnfName, true, 118);
         } catch (MsoException me) {
             me.addContext(DELETE_VNF);
             // Failed to query the Stack due to an openstack exception.
@@ -1321,9 +1231,6 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
                 logger.error("Exception encountered while sending Confirm to Valet ", e);
             }
         }
-
-        // On success, nothing is returned.
-        return;
     }
 
     @Override
@@ -1417,7 +1324,7 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
         StackInfo heatStack;
         logger.debug("UpdateVfModule - querying for {}", vfModuleName);
         try {
-            heatStack = heat.queryStack(cloudSiteId, cloudOwner, tenantId, vfModuleName);
+            heatStack = msoHeatUtils.queryStack(cloudSiteId, cloudOwner, tenantId, vfModuleName);
         } catch (MsoException me) {
             // Failed to query the Stack due to an openstack exception.
             // Convert to a generic VnfException
@@ -1452,7 +1359,7 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
         if (nestedStackId != null) {
             try {
                 logger.debug("Querying for nestedStackId = {}", nestedStackId);
-                nestedHeatStack = heat.queryStack(cloudSiteId, cloudOwner, tenantId, nestedStackId);
+                nestedHeatStack = msoHeatUtils.queryStack(cloudSiteId, cloudOwner, tenantId, nestedStackId);
             } catch (MsoException me) {
                 // Failed to query the Stack due to an openstack exception.
                 // Convert to a generic VnfException
@@ -1475,7 +1382,7 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
             } else {
                 logger.debug("Found nested heat stack - copying values to inputs *later*");
                 nestedVolumeOutputs = nestedHeatStack.getOutputs();
-                heat.copyStringOutputsToInputs(inputs, nestedHeatStack.getOutputs(), false);
+                msoHeatUtils.copyStringOutputsToInputs(inputs, nestedHeatStack.getOutputs(), false);
             }
         }
         // handle a nestedBaseStackId if sent - this is the stack ID of the base.
@@ -1484,7 +1391,7 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
         if (nestedBaseStackId != null) {
             try {
                 logger.debug("Querying for nestedBaseStackId = {}", nestedBaseStackId);
-                nestedBaseHeatStack = heat.queryStack(cloudSiteId, cloudOwner, tenantId, nestedBaseStackId);
+                nestedBaseHeatStack = msoHeatUtils.queryStack(cloudSiteId, cloudOwner, tenantId, nestedBaseStackId);
             } catch (MsoException me) {
                 // Failed to query the Stack due to an openstack exception.
                 // Convert to a generic VnfException
@@ -1507,14 +1414,10 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
             } else {
                 logger.debug("Found nested base heat stack - copying values to inputs *later*");
                 baseStackOutputs = nestedBaseHeatStack.getOutputs();
-                heat.copyStringOutputsToInputs(inputs, nestedBaseHeatStack.getOutputs(), false);
+                msoHeatUtils.copyStringOutputsToInputs(inputs, nestedBaseHeatStack.getOutputs(), false);
             }
         }
 
-        // Ready to deploy the new VNF
-
-
-
         // Retrieve the VF definition
         VnfResource vnfResource = null;
         VfModule vf = null;
@@ -1924,9 +1827,8 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
                 parsedVfModuleName = "unknown";
             }
             sendResponseToValet = this.valetUpdateRequest(cloudSiteId, cloudOwner, tenantId, heatFilesObjects,
-                    nestedTemplatesChecked, parsedVfModuleName, false, heatTemplate, newEnvironmentString,
-                    (HashMap<String, Object>) goldenInputs, msoRequest, inputs, failRequestOnValetFailure,
-                    valetModifiedParamsHolder);
+                    nestedTemplatesChecked, parsedVfModuleName, false, heatTemplate, newEnvironmentString, goldenInputs,
+                    msoRequest, inputs, failRequestOnValetFailure, valetModifiedParamsHolder);
             if (sendResponseToValet) {
                 goldenInputs = valetModifiedParamsHolder.value;
             }
@@ -2064,7 +1966,7 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
         boolean valetSucceeded = false;
         String valetErrorMessage = "more detail not available";
         try {
-            String keystoneUrl = heat.getCloudSiteKeystoneUrl(cloudSiteId);
+            String keystoneUrl = msoHeatUtils.getCloudSiteKeystoneUrl(cloudSiteId);
             Map<String, Object> files =
                     this.combineGetFilesAndNestedTemplates(heatFilesObjects, nestedTemplatesChecked);
             HeatRequest heatRequest = new HeatRequest(vfModuleName, backout, heatTemplate.getTimeoutMinutes(),
@@ -2126,7 +2028,7 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
         boolean valetSucceeded = false;
         String valetErrorMessage = "more detail not available";
         try {
-            String keystoneUrl = heat.getCloudSiteKeystoneUrl(cloudSiteId);
+            String keystoneUrl = msoHeatUtils.getCloudSiteKeystoneUrl(cloudSiteId);
             Map<String, Object> files =
                     this.combineGetFilesAndNestedTemplates(heatFilesObjects, nestedTemplatesChecked);
             HeatRequest heatRequest = new HeatRequest(vfModuleName, false, heatTemplate.getTimeoutMinutes(),
index 77c9b1e..89eb6a1 100644 (file)
@@ -105,7 +105,6 @@ public class VolumeAdapterRestV2 {
             @ApiResponse(code = 500, message = "create vnfVolume failed, examine entity object for details")})
     public Response createVNFVolumes(@ApiParam(value = "mode", required = true) @QueryParam("mode") String mode,
             @ApiParam(value = "CreateVolumeGroupRequest", required = true) final CreateVolumeGroupRequest req) {
-        logger.debug("createVNFVolumes enter: {}", req.toJsonString());
         CreateVNFVolumesTask task = new CreateVNFVolumesTask(req, mode);
         if (req.isSynchronous()) {
             // This is a synchronous request
index 1f4c205..412abea 100644 (file)
@@ -194,9 +194,7 @@ public class NetworkAdapterRestTest extends BaseRestTestUtils {
     public void testRollbackNetwork() throws IOException {
 
         RollbackNetworkRequest request = new RollbackNetworkRequest();
-
         MsoRequest msoReq = new MsoRequest();
-
         msoReq.setRequestId(MSO_REQUEST_ID);
         msoReq.setServiceInstanceId(MSO_SERVICE_INSTANCE_ID);
 
index 651e2c9..0d972bb 100644 (file)
@@ -40,7 +40,6 @@ import org.junit.Ignore;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
-import org.onap.so.adapters.vnf.exceptions.VnfAlreadyExists;
 import org.onap.so.adapters.vnf.exceptions.VnfException;
 import org.onap.so.adapters.vnf.exceptions.VnfNotFound;
 import org.onap.so.db.catalog.beans.HeatEnvironment;
@@ -50,15 +49,15 @@ import org.onap.so.db.catalog.beans.VfModule;
 import org.onap.so.db.catalog.beans.VfModuleCustomization;
 import org.onap.so.db.catalog.beans.VnfResource;
 import org.onap.so.entity.MsoRequest;
-import org.onap.so.openstack.beans.HeatStatus;
-import org.onap.so.openstack.beans.StackInfo;
 import org.onap.so.openstack.beans.VnfRollback;
 import org.onap.so.openstack.exceptions.MsoException;
 import org.onap.so.openstack.utils.MsoHeatUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import com.github.tomakehurst.wiremock.stubbing.Scenario;
 
 
 public class MsoVnfAdapterImplTest extends BaseRestTestUtils {
+
     @Rule
     public ExpectedException expectedException = ExpectedException.none();
 
@@ -70,18 +69,8 @@ public class MsoVnfAdapterImplTest extends BaseRestTestUtils {
 
     String vnfName = "DEV-VF-1802-it3-pwt3-v6-vSAMP10a-addon2-Replace-1001/stackId";
 
-    @Test
-    @Ignore
-    public void healthCheckVNFTest() {
-        MsoVnfAdapterImpl instance = new MsoVnfAdapterImpl();
-        instance.healthCheck();
-    }
-
     @Test
     public void createVnfTest() throws Exception {
-        StackInfo info = new StackInfo();
-        info.setStatus(HeatStatus.CREATED);
-
         mockOpenStackResponseAccess(wireMockServer, wireMockPort);
         mockOpenStackGetStackVfModule_200(wireMockServer);
 
@@ -90,104 +79,56 @@ public class MsoVnfAdapterImplTest extends BaseRestTestUtils {
         Map<String, Object> map = new HashMap<>();
         map.put("key1", "value1");
         instance.createVfModule("mtn13", "CloudOwner", "88a6ca3ee0394ade9403f075db23167e", "vnf", "1", "", vnfName, "",
-                "VFMOD", "volumeGroupHeatStackId|1", "baseVfHeatStackId", "88a6ca3ee0394ade9403f075db23167e", map,
-                Boolean.FALSE, Boolean.TRUE, Boolean.FALSE, msoRequest, new Holder<>(),
-                new Holder<Map<String, String>>(), new Holder<VnfRollback>());
+                "VFMOD", null, null, "b4ea86b4-253f-11e7-93ae-92361f002671", map, Boolean.TRUE, Boolean.TRUE,
+                Boolean.FALSE, msoRequest, new Holder<>(), new Holder<Map<String, String>>(),
+                new Holder<VnfRollback>());
     }
 
     @Test
-    public void createVnfTest_HeatStatusUpdating() throws Exception {
-        expectedException.expect(VnfAlreadyExists.class);
+    public void createVnfTest_HeatStatusFailed() throws Exception {
         mockOpenStackResponseAccess(wireMockServer, wireMockPort);
-
         wireMockServer.stubFor(get(
                 urlPathEqualTo("/mockPublicUrl/stacks/DEV-VF-1802-it3-pwt3-v6-vSAMP10a-addon2-Replace-1001/stackId"))
                         .willReturn(aResponse().withHeader("Content-Type", "application/json")
-                                .withBodyFile("OpenstackResponse_Stack_Updating_VfModule.json")
-                                .withStatus(HttpStatus.SC_OK)));
-
-        MsoRequest msoRequest = getMsoRequest();
-
-        Map<String, Object> map = new HashMap<>();
-        map.put("key1", "value1");
-        instance.createVfModule("mtn13", "CloudOwner", "88a6ca3ee0394ade9403f075db23167e", "vnf", "1", "", vnfName, "",
-                "VFMOD", "volumeGroupHeatStackId|1", "baseVfHeatStackId", "88a6ca3ee0394ade9403f075db23167e", map,
-                Boolean.FALSE, Boolean.TRUE, Boolean.FALSE, msoRequest, new Holder<>(),
-                new Holder<Map<String, String>>(), new Holder<VnfRollback>());
-    }
-
-    @Test
-    public void createVnfTest_HeatStatusUpdated() throws Exception {
-        expectedException.expect(VnfAlreadyExists.class);
-        mockOpenStackResponseAccess(wireMockServer, wireMockPort);
+                                .withBodyFile("OpenstackResponse_Stack_Failed_VfModule.json")
+                                .withStatus(HttpStatus.SC_OK))
+                        .inScenario("HeatStatusFailure").whenScenarioStateIs(Scenario.STARTED)
+                        .willSetStateTo("HeatStackFailed"));
 
         wireMockServer.stubFor(get(
                 urlPathEqualTo("/mockPublicUrl/stacks/DEV-VF-1802-it3-pwt3-v6-vSAMP10a-addon2-Replace-1001/stackId"))
                         .willReturn(aResponse().withHeader("Content-Type", "application/json")
-                                .withBodyFile("OpenstackResponse_StackId.json").withStatus(HttpStatus.SC_OK)));
+                                .withBodyFile("OpenstackResponse_Stack_Created_VfModule.json")
+                                .withStatus(HttpStatus.SC_OK))
+                        .inScenario("HeatStatusFailure").whenScenarioStateIs("HeatStackFailed")
+                        .willSetStateTo("HeatStackSuccess"));
 
         MsoRequest msoRequest = getMsoRequest();
 
         Map<String, Object> map = new HashMap<>();
         map.put("key1", "value1");
         instance.createVfModule("mtn13", "CloudOwner", "88a6ca3ee0394ade9403f075db23167e", "vnf", "1", "", vnfName, "",
-                "VFMOD", "volumeGroupHeatStackId|1", "baseVfHeatStackId", "88a6ca3ee0394ade9403f075db23167e", map,
-                Boolean.FALSE, Boolean.TRUE, Boolean.FALSE, msoRequest, new Holder<>(),
-                new Holder<Map<String, String>>(), new Holder<VnfRollback>());
+                "VFMOD", null, null, "b4ea86b4-253f-11e7-93ae-92361f002671", map, Boolean.FALSE, Boolean.TRUE,
+                Boolean.FALSE, msoRequest, new Holder<>(), new Holder<Map<String, String>>(),
+                new Holder<VnfRollback>());
     }
 
-    @Test
-    public void createVnfTest_HeatStatusFailed() throws Exception {
-        expectedException.expect(VnfAlreadyExists.class);
-        mockOpenStackResponseAccess(wireMockServer, wireMockPort);
-
-        wireMockServer.stubFor(get(
-                urlPathEqualTo("/mockPublicUrl/stacks/DEV-VF-1802-it3-pwt3-v6-vSAMP10a-addon2-Replace-1001/stackId"))
-                        .willReturn(aResponse().withHeader("Content-Type", "application/json")
-                                .withBodyFile("OpenstackResponse_Stack_Failed_VfModule.json")
-                                .withStatus(HttpStatus.SC_OK)));
-
-        MsoRequest msoRequest = getMsoRequest();
 
-        Map<String, Object> map = new HashMap<>();
-        map.put("key1", "value1");
-        instance.createVfModule("mtn13", "CloudOwner", "88a6ca3ee0394ade9403f075db23167e", "vnf", "1", "", vnfName, "",
-                "VFMOD", "volumeGroupHeatStackId|1", "baseVfHeatStackId", "88a6ca3ee0394ade9403f075db23167e", map,
-                Boolean.FALSE, Boolean.TRUE, Boolean.FALSE, msoRequest, new Holder<>(),
-                new Holder<Map<String, String>>(), new Holder<VnfRollback>());
-    }
 
     @Test
     public void createVnfTest_HeatStatusCreated() throws Exception {
-        expectedException.expect(VnfAlreadyExists.class);
         mockOpenStackResponseAccess(wireMockServer, wireMockPort);
-
         mockOpenStackGetStackVfModule_200(wireMockServer);
-
         MsoRequest msoRequest = getMsoRequest();
-
         Map<String, Object> map = new HashMap<>();
         map.put("key1", "value1");
         instance.createVfModule("mtn13", "CloudOwner", "88a6ca3ee0394ade9403f075db23167e", "vnf", "1", "", vnfName, "",
-                "VFMOD", "volumeGroupHeatStackId|1", "baseVfHeatStackId", "88a6ca3ee0394ade9403f075db23167e", map,
-                Boolean.TRUE, Boolean.TRUE, Boolean.FALSE, msoRequest, new Holder<>(),
-                new Holder<Map<String, String>>(), new Holder<VnfRollback>());
+                "VFMOD", null, null, "b4ea86b4-253f-11e7-93ae-92361f002671", map, Boolean.TRUE, Boolean.TRUE,
+                Boolean.FALSE, msoRequest, new Holder<>(), new Holder<Map<String, String>>(),
+                new Holder<VnfRollback>());
     }
 
 
-    @Test
-    public void createVnfTest_ExceptionInGettingHeat() throws Exception {
-        expectedException.expect(VnfException.class);
-        MsoRequest msoRequest = getMsoRequest();
-
-        Map<String, Object> map = new HashMap<>();
-        map.put("key1", "value1");
-        instance.createVfModule("mtn13", "CloudOwner", "88a6ca3ee0394ade9403f075db23167e", "vnf", "1", "", vnfName, "",
-                "VFMOD", "volumeGroupHeatStackId|1", "baseVfHeatStackId", "88a6ca3ee0394ade9403f075db23167e", map,
-                Boolean.FALSE, Boolean.TRUE, Boolean.FALSE, msoRequest, new Holder<>(),
-                new Holder<Map<String, String>>(), new Holder<VnfRollback>());
-    }
-
     @Test
     public void createVnfTest_NestedHeatStatusNotFound() throws Exception {
         expectedException.expect(VnfException.class);
index 7cc7697..20fd812 100644 (file)
@@ -1,5 +1,3 @@
-# will be used as entry in DB to say SITE OFF/ON for healthcheck
-# MSO Properties go here
 org:
   onap:
     so:
@@ -41,7 +39,7 @@ org:
           default_keystone_reg_ex: "/[vV][0-9]"
           default_tenant_description: ECOMP Tenant
           default_region_type: single
-          default_user_role: admin
+          default_user_role: adminev
           default_success_status_string: Success
           default_no_regions_status_string: no regions
           default_orm_request_path: /v1/orm/customers/
index c26a1cf..903280c 100644 (file)
@@ -26,25 +26,25 @@ import java.io.IOException;
 import java.util.List;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
-import org.onap.so.logger.LoggingAnchor;
 import org.camunda.bpm.engine.delegate.BpmnError;
 import org.camunda.bpm.engine.delegate.DelegateExecution;
 import org.onap.aai.domain.yang.LInterface;
 import org.onap.aai.domain.yang.Vserver;
+import org.onap.logging.filter.base.ONAPComponents;
+import org.onap.logging.filter.base.ONAPComponentsList;
 import org.onap.so.bpmn.common.BuildingBlockExecution;
 import org.onap.so.bpmn.common.DelegateExecutionImpl;
 import org.onap.so.bpmn.core.WorkflowException;
-import org.onap.so.logger.ErrorCode;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.VfModule;
 import org.onap.so.bpmn.servicedecomposition.entities.ResourceKey;
 import org.onap.so.bpmn.servicedecomposition.tasks.ExtractPojosForBB;
 import org.onap.so.client.aai.AAIObjectType;
 import org.onap.so.client.graphinventory.GraphInventoryCommonObjectMapperProvider;
+import org.onap.so.logger.ErrorCode;
+import org.onap.so.logger.LoggingAnchor;
 import org.onap.so.logger.MessageEnum;
 import org.onap.so.objects.audit.AAIObjectAudit;
 import org.onap.so.objects.audit.AAIObjectAuditList;
-import org.onap.logging.filter.base.ONAPComponentsList;
-import org.onap.logging.filter.base.ONAPComponents;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Component;
@@ -187,6 +187,10 @@ public class ExceptionBuilder {
         buildAndThrowWorkflowException(execution, errorCode, msg, extSystemErrorSource);
     }
 
+    /**
+     * @deprecated Please utilize method that specifies where the failure occured
+     */
+    @Deprecated
     public void buildAndThrowWorkflowException(BuildingBlockExecution execution, int errorCode, String errorMessage) {
         if (execution instanceof DelegateExecutionImpl) {
             buildAndThrowWorkflowException(((DelegateExecutionImpl) execution).getDelegateExecution(), errorCode,
index 52d2949..11cac08 100644 (file)
@@ -22,6 +22,7 @@ package org.onap.so.bpmn.infrastructure.validations;
 
 import java.util.Optional;
 import java.util.regex.Pattern;
+import org.onap.logging.filter.base.ONAPComponents;
 import org.onap.so.bpmn.common.BuildingBlockExecution;
 import org.onap.so.bpmn.common.listener.validation.PreBuildingBlockValidator;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.CloudRegion;
@@ -62,7 +63,7 @@ public class CloudRegionOrchestrationValidator implements PreBuildingBlockValida
             }
         } catch (Exception e) {
             logger.error("failed to validate", e);
-            exceptionBuilder.buildAndThrowWorkflowException(execution, 7000, e);
+            exceptionBuilder.buildAndThrowWorkflowException(execution, 7000, e, ONAPComponents.SO);
         }
         return Optional.empty();
     }
index 173e776..d78fa69 100644 (file)
@@ -269,6 +269,7 @@ public class NetworkAdapterObjectMapper {
                 org.onap.so.openstack.beans.Subnet.class) == null) {
             PropertyMap<org.onap.so.bpmn.servicedecomposition.bbobjects.Subnet, org.onap.so.openstack.beans.Subnet> personMap =
                     new PropertyMap<org.onap.so.bpmn.servicedecomposition.bbobjects.Subnet, org.onap.so.openstack.beans.Subnet>() {
+                        @Override
                         protected void configure() {
                             map().setSubnetName(source.getSubnetName());
                             map(source.getSubnetId(), destination.getSubnetId());
@@ -387,7 +388,7 @@ public class NetworkAdapterObjectMapper {
         createNetworkRequest.setSkipAAI(true);
         createNetworkRequest.setBackout(Boolean.TRUE.equals(orchestrationContext.getIsRollbackEnabled()));
         // TODO confirm value - false by default
-        createNetworkRequest.setFailIfExists(true);
+        createNetworkRequest.setFailIfExists(false);
         // NetworkTechnology(NetworkTechnology.NEUTRON); NOOP - default
         return createNetworkRequest;
     }
index a78870a..ebebae3 100644 (file)
@@ -78,7 +78,7 @@ public class VnfAdapterObjectMapper {
 
         createVolumeGroupRequest.setSkipAAI(true);
         createVolumeGroupRequest.setSuppressBackout(Boolean.TRUE.equals(orchestrationContext.getIsRollbackEnabled()));
-        createVolumeGroupRequest.setFailIfExists(true);
+        createVolumeGroupRequest.setFailIfExists(false);
 
         createVolumeGroupRequest.setMsoRequest(createMsoRequest(requestContext, serviceInstance));
 
index 8c13c9b..685531e 100644 (file)
@@ -150,7 +150,7 @@ public class VnfAdapterVfModuleObjectMapper {
 
         createVfModuleRequest.setSkipAAI(true);
         createVfModuleRequest.setBackout(Boolean.TRUE.equals(orchestrationContext.getIsRollbackEnabled()));
-        createVfModuleRequest.setFailIfExists(true);
+        createVfModuleRequest.setFailIfExists(false);
 
         MsoRequest msoRequest = buildMsoRequest(requestContext, serviceInstance);
         createVfModuleRequest.setMsoRequest(msoRequest);
index d6485bd..109dc55 100644 (file)
@@ -106,7 +106,7 @@ public class NetworkAdapterObjectMapperTest extends TestDataSetup {
         expectedCreateNetworkRequest.setNetworkName(l3Network.getNetworkName());
         expectedCreateNetworkRequest.setNetworkType(l3Network.getNetworkType());
         expectedCreateNetworkRequest.setBackout(false);
-        expectedCreateNetworkRequest.setFailIfExists(true);
+        expectedCreateNetworkRequest.setFailIfExists(false);
         expectedCreateNetworkRequest.setNetworkTechnology("CONTRAIL");
         MsoRequest msoRequest = new MsoRequest();
         msoRequest.setRequestId(requestContext.getMsoRequestId());
index 4450e4a..2e77023 100644 (file)
@@ -34,7 +34,6 @@ import java.util.List;
 import java.util.Map;
 import org.junit.After;
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.mockito.MockitoAnnotations;
 import org.mockito.Spy;
@@ -135,7 +134,7 @@ public class VnfAdapterObjectMapperTest {
         expectedCreateVolumeGroupRequest.setSkipAAI(true);
         expectedCreateVolumeGroupRequest
                 .setSuppressBackout(Boolean.TRUE.equals(orchestrationContext.getIsRollbackEnabled()));
-        expectedCreateVolumeGroupRequest.setFailIfExists(true);
+        expectedCreateVolumeGroupRequest.setFailIfExists(false);
 
         MsoRequest msoRequest = new MsoRequest();
         msoRequest.setRequestId(requestContext.getMsoRequestId());
@@ -215,7 +214,7 @@ public class VnfAdapterObjectMapperTest {
         expectedCreateVolumeGroupRequest.setSkipAAI(true);
         expectedCreateVolumeGroupRequest
                 .setSuppressBackout(Boolean.TRUE.equals(orchestrationContext.getIsRollbackEnabled()));
-        expectedCreateVolumeGroupRequest.setFailIfExists(true);
+        expectedCreateVolumeGroupRequest.setFailIfExists(false);
 
         MsoRequest msoRequest = new MsoRequest();
         msoRequest.setRequestId(requestContext.getMsoRequestId());
index d7e282d..19d42dd 100644 (file)
@@ -33,7 +33,7 @@
     "policyFqdns": [],
     "routeTableFqdns": []
   },
-  "failIfExists": true,
+  "failIfExists": false,
   "backout": false,
   "msoRequest": {
     "requestId": "6cfde724-76c7-4747-bcb3-67a59a46ca95",
index f655e9a..5975cb2 100644 (file)
@@ -12,7 +12,7 @@
        "baseVfModuleStackId": "baseVfModuleStackId",
        "skipAAI": true,
        "backout": false,
-       "failIfExists": true,
+       "failIfExists": false,
        "msoRequest": 
        {
                "requestId": "requestId",
index 3387b6d..19acec0 100644 (file)
@@ -10,7 +10,7 @@
        "modelCustomizationUuid": "vfModuleModelCustomizationUuid",
        "skipAAI": true,
        "backout": false,
-       "failIfExists": true,
+       "failIfExists": false,
        "msoRequest": 
        {
                "requestId": "requestId",
index 8721bdc..aa4ada0 100644 (file)
@@ -10,7 +10,7 @@
        "modelCustomizationUuid": "vfModuleModelCustomizationUuid",
        "skipAAI": true,
        "backout": false,
-       "failIfExists": true,
+       "failIfExists": false,
        "msoRequest": 
        {
                "requestId": "requestId",
index 04f6479..f7fb1e9 100644 (file)
@@ -10,7 +10,7 @@
        "modelCustomizationUuid": "vfModuleModelCustomizationUuid",
        "skipAAI": true,
        "backout": false,
-       "failIfExists": true,
+       "failIfExists": false,
        "msoRequest": 
        {
                "requestId": "requestId",
index 1b57fcd..e06f9cb 100644 (file)
@@ -10,7 +10,7 @@
        "modelCustomizationUuid": "vfModuleModelCustomizationUuid",
        "skipAAI": true,
        "backout": false,
-       "failIfExists": true,
+       "failIfExists": false,
        "msoRequest": 
        {
                "requestId": "requestId",
index a13740c..b97bab4 100644 (file)
@@ -10,7 +10,7 @@
        "modelCustomizationUuid": "vfModuleModelCustomizationUuid",
        "skipAAI": true,
        "backout": true,
-       "failIfExists": true,
+       "failIfExists": false,
        "msoRequest": 
        {
                "requestId": "requestId",
index 5468e21..7b78510 100644 (file)
@@ -10,7 +10,7 @@
        "modelCustomizationUuid": "vfModuleModelCustomizationUuid",
        "skipAAI": true,
        "backout": false,
-       "failIfExists": true,
+       "failIfExists": false,
        "msoRequest": 
        {
                "requestId": "requestId",
index 0d10392..a419c2e 100644 (file)
@@ -12,7 +12,7 @@
        "volumeGroupStackId": "volumeGroupStackId",
        "skipAAI": true,
        "backout": false,
-       "failIfExists": true,
+       "failIfExists": false,
        "msoRequest": 
        {
                "requestId": "requestId",