store heat env file sent to heat
[so.git] / adapters / mso-adapter-utils / src / main / java / org / onap / so / openstack / utils / MsoHeatUtils.java
index 711fae9..1d75892 100644 (file)
@@ -31,8 +31,8 @@ import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
+import java.util.regex.Matcher;
 import java.util.regex.Pattern;
-import java.util.stream.Collectors;
 import org.onap.logging.ref.slf4j.ONAPLogConstants;
 import org.onap.so.adapters.vdu.CloudInfo;
 import org.onap.so.adapters.vdu.PluginAction;
@@ -55,6 +55,7 @@ import org.onap.so.db.request.beans.InfraActiveRequests;
 import org.onap.so.db.request.client.RequestsDbClient;
 import org.onap.so.logger.ErrorCode;
 import org.onap.so.logger.MessageEnum;
+import org.onap.so.openstack.beans.CreateStackRequest;
 import org.onap.so.openstack.beans.HeatStatus;
 import org.onap.so.openstack.beans.StackInfo;
 import org.onap.so.openstack.exceptions.MsoCloudSiteNotFound;
@@ -79,7 +80,6 @@ import com.woorea.openstack.base.client.OpenStackResponseException;
 import com.woorea.openstack.heat.Heat;
 import com.woorea.openstack.heat.model.CreateStackParam;
 import com.woorea.openstack.heat.model.Events;
-import com.woorea.openstack.heat.model.Resource;
 import com.woorea.openstack.heat.model.Resources;
 import com.woorea.openstack.heat.model.Stack;
 import com.woorea.openstack.heat.model.Stack.Output;
@@ -220,7 +220,6 @@ public class MsoHeatUtils extends MsoCommonUtils implements VduPlugin {
             boolean backout) throws MsoException {
 
         stripMultiCloudInputs(stackInputs);
-
         CreateStackParam createStack =
                 createStackParam(stackName, heatTemplate, stackInputs, timeoutMinutes, environment, files, heatFiles);
         Stack currentStack = createStack(createStack, cloudSiteId, tenantId);
@@ -271,20 +270,14 @@ public class MsoHeatUtils extends MsoCommonUtils implements VduPlugin {
         }
     }
 
+
     protected Stack processCreateStack(String cloudSiteId, String tenantId, int timeoutMinutes, boolean backout,
             Stack heatStack, CreateStackParam stackCreate, boolean keyPairCleanUp) throws MsoException {
-        Stack latestStack;
+        Stack latestStack = null;
         try {
             latestStack = pollStackForStatus(timeoutMinutes, heatStack, CREATE_IN_PROGRESS, cloudSiteId, tenantId);
         } catch (MsoException me) {
-            if (!backout) {
-                logger.info("Exception in Create Stack, stack deletion suppressed", me);
-            } else {
-                logger.info("Exception in Create Stack, stack deletion will be executed", me);
-                handleUnknownCreateStackFailure(heatStack, timeoutMinutes, cloudSiteId, tenantId);
-            }
-            me.addContext(CREATE_STACK);
-            throw me;
+            logger.error("Exception in Create Stack", me);
         }
         return postProcessStackCreate(latestStack, backout, timeoutMinutes, keyPairCleanUp, cloudSiteId, tenantId,
                 stackCreate);
@@ -292,26 +285,43 @@ 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 {
-        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");
+        if (stack == null) {
+            throw new StackCreationException("Unknown Error in Stack Creation");
+        } 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");
+                    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 (MsoException e) {
+                        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);
+                }
             } else {
-                logger.info("Status is not CREATE_COMPLETE, stack deletion will be executed");
-                Stack deletedStack = handleUnknownCreateStackFailure(stack, timeoutMinutes, cloudSiteId, tenantId);
-                throw new StackCreationException("Stack Creation Failed Openstack Status: " + stack.getStackStatus()
-                        + " Status Reason: " + stack.getStackStatusReason()
-                        + " , Rollback of Stack Creation completed with status: " + deletedStack.getStackStatus()
-                        + " Status Reason: " + deletedStack.getStackStatusReason());
+                return stack;
             }
-        } else {
-            return stack;
         }
     }
 
@@ -345,7 +355,10 @@ public class MsoHeatUtils extends MsoCommonUtils implements VduPlugin {
         try {
             ObjectMapper mapper = new ObjectMapper();
             InfraActiveRequests foundRequest = requestDBClient.getInfraActiveRequestbyRequestId(requestId);
-            String stackRequest = mapper.writeValueAsString(request.getParameters());
+            CreateStackRequest createStackRequest = new CreateStackRequest();
+            createStackRequest.setEnvironment(request.getEnvironment());
+            createStackRequest.setParameters(request.getParameters());
+            String stackRequest = mapper.writeValueAsString(createStackRequest);
             CloudApiRequests cloudReq = new CloudApiRequests();
             cloudReq.setCloudIdentifier(stackName);
             cloudReq.setRequestBody(stackRequest);
@@ -395,17 +408,15 @@ public class MsoHeatUtils extends MsoCommonUtils implements VduPlugin {
     protected Stack handleKeyPairConflict(String cloudSiteId, String tenantId, CreateStackParam stackCreate,
             int timeoutMinutes, boolean backout, Stack stack) throws MsoException {
         logger.info("Keypair conflict found on stack, attempting to clean up");
-
-        Resources resources = queryStackResources(cloudSiteId, tenantId, stackCreate.getStackName(), 2);
-        List<Resource> keyPairs = resources.getList().stream()
-                .filter(p -> "OS::Nova::KeyPair".equalsIgnoreCase(p.getType())).collect(Collectors.toList());
-        keyPairs.stream().forEach(keyPair -> {
-            try {
-                novaClient.deleteKeyPair(cloudSiteId, tenantId, keyPair.getLogicalResourceId());
-            } catch (MsoCloudSiteNotFound | NovaClientException e) {
-                logger.warn("Could not delete keypair", e);
+        try {
+            Matcher m = Pattern.compile("'([^']+?)'").matcher(stack.getStackStatusReason());
+            if (m.find()) {
+                novaClient.deleteKeyPair(cloudSiteId, tenantId, m.group(1));
             }
-        });
+        } catch (NovaClientException e) {
+            logger.warn("Could not delete keypair", e);
+        }
+
         handleUnknownCreateStackFailure(stack, timeoutMinutes, cloudSiteId, tenantId);
         Stack newStack = createStack(stackCreate, cloudSiteId, tenantId);
         newStack.setStackName(stackCreate.getStackName());