store heat env file sent to heat
[so.git] / adapters / mso-adapter-utils / src / main / java / org / onap / so / openstack / utils / MsoHeatUtils.java
index b634b0c..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);
@@ -253,7 +252,7 @@ public class MsoHeatUtils extends MsoCommonUtils implements VduPlugin {
     protected Stack createStack(CreateStackParam stack, String cloudSiteId, String tenantId) throws MsoException {
         try {
             OpenStackRequest<Stack> request = getHeatClient(cloudSiteId, tenantId).getStacks().create(stack);
-            saveStackRequest(request, MDC.get(ONAPLogConstants.MDCs.REQUEST_ID), stack.getStackName());
+            saveStackRequest(stack, MDC.get(ONAPLogConstants.MDCs.REQUEST_ID), stack.getStackName());
             return executeAndRecordOpenstackRequest(request);
         } catch (OpenStackResponseException e) {
             if (e.getStatus() == 409) {
@@ -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;
         }
     }
 
@@ -341,11 +351,14 @@ public class MsoHeatUtils extends MsoCommonUtils implements VduPlugin {
         }
     }
 
-    protected void saveStackRequest(OpenStackRequest<Stack> request, String requestId, String stackName) {
+    protected void saveStackRequest(CreateStackParam request, String requestId, String stackName) {
         try {
             ObjectMapper mapper = new ObjectMapper();
             InfraActiveRequests foundRequest = requestDBClient.getInfraActiveRequestbyRequestId(requestId);
-            String stackRequest = mapper.writeValueAsString(request.entity());
+            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());
@@ -1239,7 +1250,7 @@ public class MsoHeatUtils extends MsoCommonUtils implements VduPlugin {
         Heat heatClient = getHeatClient(cloudSiteId, tenantId);
         OpenStackRequest<Resources> request =
                 heatClient.getResources().listResources(stackName).queryParam("nested_depth", nestedDepth);
-        return executeAndRecordOpenstackRequest(request);
+        return executeAndRecordOpenstackRequest(request, false);
     }
 
     public Events queryStackEvents(String cloudSiteId, String tenantId, String stackName, String stackId,
@@ -1247,7 +1258,7 @@ public class MsoHeatUtils extends MsoCommonUtils implements VduPlugin {
         Heat heatClient = getHeatClient(cloudSiteId, tenantId);
         OpenStackRequest<Events> request =
                 heatClient.getEvents().listEvents(stackName, stackId).queryParam("nested_depth", nestedDepth);
-        return executeAndRecordOpenstackRequest(request);
+        return executeAndRecordOpenstackRequest(request, false);
     }
 
     public Stacks queryStacks(String cloudSiteId, String tenantId, int limit, String marker)
@@ -1261,14 +1272,14 @@ public class MsoHeatUtils extends MsoCommonUtils implements VduPlugin {
         }
         OpenStackRequest<Stacks> request =
                 heatClient.getStacks().list().queryParam("limit", limit).queryParam("marker", marker);
-        return executeAndRecordOpenstackRequest(request);
+        return executeAndRecordOpenstackRequest(request, false);
     }
 
     public <R> R executeHeatClientRequest(String url, String cloudSiteId, String tenantId, Class<R> returnType)
             throws MsoException {
         Heat heatClient = getHeatClient(cloudSiteId, tenantId);
         OpenStackRequest<R> request = heatClient.get(url, returnType);
-        return executeAndRecordOpenstackRequest(request);
+        return executeAndRecordOpenstackRequest(request, false);
     }
 
     protected void sleep(long time) {