Tosca artifacts - Error 500 01/84801/1
authorpriyanshu <pagarwal@amdocs.com>
Wed, 10 Apr 2019 06:48:24 +0000 (12:18 +0530)
committerpriyanshu <pagarwal@amdocs.com>
Wed, 10 Apr 2019 06:50:24 +0000 (12:20 +0530)
Tosca artifacts - Error 500 - Service proxy with WF assigned

Change-Id: I1d75c0b9980ab42c7c825e4423ff4994600dd6fa
Issue-ID: SDC-2232
Signed-off-by: priyanshu <pagarwal@amdocs.com>
catalog-be/src/main/java/org/openecomp/sdc/be/components/validation/InterfaceOperationValidation.java
catalog-be/src/main/java/org/openecomp/sdc/be/tosca/CsarUtils.java
catalog-be/src/main/java/org/openecomp/sdc/be/tosca/ToscaExportHandler.java
catalog-be/src/main/java/org/openecomp/sdc/be/tosca/utils/InterfacesOperationsToscaUtil.java
catalog-be/src/main/java/org/openecomp/sdc/be/tosca/utils/OperationArtifactUtil.java
catalog-be/src/test/java/org/openecomp/sdc/be/tosca/utils/InterfacesOperationsToscaUtilTest.java
catalog-be/src/test/java/org/openecomp/sdc/be/tosca/utils/OperationArtifactUtilTest.java
catalog-model/src/main/java/org/openecomp/sdc/be/model/jsontitan/operations/NodeTemplateOperation.java

index f84c9a4..30d006f 100644 (file)
@@ -589,7 +589,7 @@ public class InterfaceOperationValidation {
                 ListDataDefinition<OperationInputDefinition> inputs = operationEntry.getValue().getInputs();
                 String expectedOperationIdentifier =
                         interfaceDefinitionEntry.getValue().getType() + "." + operationEntry.getValue().getName();
-                if (!currentOperationIdentifier.equals(expectedOperationIdentifier) && !inputs.isEmpty()) {
+                if (!currentOperationIdentifier.equals(expectedOperationIdentifier) && Objects.nonNull(inputs) && !inputs.isEmpty()) {
                     otherOperationInputs.addAll(inputs.getListToscaDataDefinition());
                 }
             }
index bea65cf..c6dec0b 100644 (file)
@@ -37,6 +37,7 @@ import org.openecomp.sdc.be.dao.cassandra.ArtifactCassandraDao;
 import org.openecomp.sdc.be.dao.cassandra.CassandraOperationStatus;
 import org.openecomp.sdc.be.dao.cassandra.SdcSchemaFilesCassandraDao;
 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
+import org.openecomp.sdc.be.datatypes.enums.OriginTypeEnum;
 import org.openecomp.sdc.be.impl.ComponentsUtils;
 import org.openecomp.sdc.be.model.*;
 import org.openecomp.sdc.be.model.jsontitan.operations.ToscaOperationFacade;
@@ -431,10 +432,10 @@ public class CsarUtils {
        }
 
        private Either<ZipOutputStream, ResponseFormat> writeComponentInterface(Component component, ZipOutputStream zip,
-                       String fileName, boolean isAssociatedResourceComponent) {
+                       String fileName, boolean isAssociatedComponent) {
                try {
                        Either<ToscaRepresentation, ToscaError> componentInterface = toscaExportUtils
-                                       .exportComponentInterface(component, isAssociatedResourceComponent);
+                                       .exportComponentInterface(component, isAssociatedComponent);
                        ToscaRepresentation componentInterfaceYaml = componentInterface.left().value();
                        String mainYaml = componentInterfaceYaml.getMainYaml();
                        String interfaceFileName = DEFINITIONS_PATH + ToscaExportHandler.getInterfaceFilename(fileName);
@@ -872,11 +873,11 @@ public class CsarUtils {
                        ComponentTypeArtifacts componentInstanceArtifacts = componentTypeArtifacts.get(keyAssetName);
                        ArtifactsInfo componentArtifacts2 = componentInstanceArtifacts.getComponentArtifacts();
                        String pathWithAssetName = currentPath + keyAssetName + "/";
-                       Either<ZipOutputStream, ResponseFormat> writeArtifactsInfoToSpecifiedtPath = writeArtifactsInfoToSpecifiedPath(
+                       Either<ZipOutputStream, ResponseFormat> writeArtifactsInfoToSpecifiedPath = writeArtifactsInfoToSpecifiedPath(
                                        mainComponent, componentArtifacts2, zipstream, pathWithAssetName, isInCertificationRequest);
 
-                       if (writeArtifactsInfoToSpecifiedtPath.isRight()) {
-                               return writeArtifactsInfoToSpecifiedtPath;
+                       if (writeArtifactsInfoToSpecifiedPath.isRight()) {
+                               return writeArtifactsInfoToSpecifiedPath;
                        }
                }
 
@@ -1188,7 +1189,7 @@ public class CsarUtils {
        }
 
        private ComponentTypeArtifacts collectComponentTypeArtifacts(Map<String, ComponentTypeArtifacts> resourcesArtifacts,
-                       ComponentInstance componentInstance, Resource fetchedComponent) {
+                       ComponentInstance componentInstance, Component fetchedComponent) {
                String toscaComponentName = componentInstance.getToscaComponentName() + "_v"
                                + componentInstance.getComponentVersion();
 
@@ -1210,15 +1211,21 @@ public class CsarUtils {
                        ComponentInstance componentInstance, Map<String, ComponentTypeArtifacts> resourcesTypeArtifacts,
                        ComponentTypeArtifacts instanceArtifactsLocation) {
                // 1. get the component instance component
-               String componentUid = componentInstance.getComponentUid();
-               Either<Resource, StorageOperationStatus> resource = toscaOperationFacade.getToscaElement(componentUid);
-               if (resource.isRight()) {
+        String componentUid;
+        if (componentInstance.getOriginType() == OriginTypeEnum.ServiceProxy) {
+                       componentUid = componentInstance.getSourceModelUid();
+               }
+               else {
+                       componentUid = componentInstance.getComponentUid();
+               }
+        Either<Component, StorageOperationStatus> component = toscaOperationFacade.getToscaElement(componentUid);
+               if (component.isRight()) {
                        log.error("Failed to fetch resource with id {} for instance {}", componentUid, parentComponent.getUUID());
                        return Either.right(componentsUtils.getResponseFormat(ActionStatus.ASSET_NOT_FOUND_DURING_CSAR_CREATION,
                                        parentComponent.getComponentType().getValue(), parentComponent.getUUID(),
                                        componentInstance.getOriginType().getComponentType().getValue(), componentUid));
                }
-               Resource fetchedComponent = resource.left().value();
+               Component fetchedComponent = component.left().value();
 
                // 2. fill the artifacts for the current component parent type
                ComponentTypeArtifacts componentParentArtifacts = collectComponentTypeArtifacts(resourcesTypeArtifacts,
index d3d4c2d..54cf4cf 100644 (file)
@@ -135,7 +135,7 @@ public class ToscaExportHandler {
     }
 
     public Either<ToscaRepresentation, ToscaError> exportComponentInterface(Component component,
-            boolean isAssociatedResourceComponent) {
+            boolean isAssociatedComponent) {
         if (null == DEFAULT_IMPORTS) {
             log.debug(FAILED_TO_GET_DEFAULT_IMPORTS_CONFIGURATION);
             return Either.right(ToscaError.GENERAL_ERROR);
@@ -145,7 +145,7 @@ public class ToscaExportHandler {
         toscaTemplate.setImports(new ArrayList<>(DEFAULT_IMPORTS));
         Map<String, ToscaNodeType> nodeTypes = new HashMap<>();
         Either<ToscaTemplate, ToscaError> toscaTemplateRes = convertInterfaceNodeType(new HashMap<>(), component,
-                toscaTemplate, nodeTypes, isAssociatedResourceComponent);
+                toscaTemplate, nodeTypes, isAssociatedComponent);
         if (toscaTemplateRes.isRight()) {
             return Either.right(toscaTemplateRes.right().value());
         }
@@ -517,7 +517,7 @@ public class ToscaExportHandler {
     private Either<ToscaTemplate, ToscaError> convertInterfaceNodeType(Map<String, Component> componentsCache,
             Component component, ToscaTemplate toscaNode,
             Map<String, ToscaNodeType> nodeTypes,
-            boolean isAssociatedResourceComponent) {
+            boolean isAssociatedComponent) {
         log.debug("start convert node type for {}", component.getUniqueId());
         ToscaNodeType toscaNodeType = createNodeType(component);
 
@@ -544,7 +544,7 @@ public class ToscaExportHandler {
 
         List<InputDefinition> inputDef = component.getInputs();
         Map<String, ToscaProperty> mergedProperties = new HashMap<>();
-        addInterfaceDefinitionElement(component, toscaNodeType, dataTypes, isAssociatedResourceComponent);
+        addInterfaceDefinitionElement(component, toscaNodeType, dataTypes, isAssociatedComponent);
         if (inputDef != null) {
             addInputsToProperties(dataTypes, inputDef, mergedProperties);
         }
@@ -780,7 +780,7 @@ public class ToscaExportHandler {
                     .getUniqueId(), instInterface));
 
                 interfaces = InterfacesOperationsToscaUtil
-                        .getInterfacesMap(parentComponent, tmpInterfaces, dataTypes, true, true);
+                                     .getInterfacesMap(parentComponent, componentInstance, tmpInterfaces, dataTypes, true, true);
             }
         } else {
             interfaces =
index d69e4f6..87c4bfa 100644 (file)
@@ -29,6 +29,7 @@ import org.apache.commons.collections.MapUtils;
 import org.openecomp.sdc.be.datatypes.elements.OperationDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.OperationInputDefinition;
 import org.openecomp.sdc.be.model.Component;
+import org.openecomp.sdc.be.model.ComponentInstance;
 import org.openecomp.sdc.be.model.DataTypeDefinition;
 import org.openecomp.sdc.be.model.InterfaceDefinition;
 import org.openecomp.sdc.be.model.Product;
@@ -104,7 +105,7 @@ public class InterfacesOperationsToscaUtil {
      */
     public static void addInterfaceDefinitionElement(Component component, ToscaNodeType nodeType,
                                                      Map<String, DataTypeDefinition> dataTypes,
-                                                     boolean isAssociatedResourceComponent) {
+                                                     boolean isAssociatedComponent) {
         if (component instanceof Product) {
             return;
         }
@@ -113,7 +114,7 @@ public class InterfacesOperationsToscaUtil {
             return;
         }
         Map<String, Object> toscaInterfaceDefinitions = getInterfacesMap(component, dataTypes,
-                isAssociatedResourceComponent);
+                isAssociatedComponent);
         if (MapUtils.isNotEmpty(toscaInterfaceDefinitions)) {
             nodeType.setInterfaces(toscaInterfaceDefinitions);
         }
@@ -121,14 +122,15 @@ public class InterfacesOperationsToscaUtil {
 
     private static Map<String, Object> getInterfacesMap(Component component,
                                                         Map<String, DataTypeDefinition> dataTypes,
-                                                        boolean isAssociatedResourceComponent) {
-        return getInterfacesMap(component, component.getInterfaces(), dataTypes, isAssociatedResourceComponent, false);
+                                                        boolean isAssociatedComponent) {
+        return getInterfacesMap(component, null, component.getInterfaces(), dataTypes, isAssociatedComponent, false);
     }
 
     public static Map<String, Object> getInterfacesMap(Component component,
+                                                       ComponentInstance componentInstance,
                                                        Map<String, InterfaceDefinition> interfaces,
                                                        Map<String, DataTypeDefinition> dataTypes,
-                                                       boolean isAssociatedResourceComponent,
+                                                       boolean isAssociatedComponent,
                                                        boolean isServiceProxyInterface) {
         if(MapUtils.isEmpty(interfaces)) {
             return null;
@@ -147,8 +149,8 @@ public class InterfacesOperationsToscaUtil {
                 ToscaLifecycleOperationDefinition toscaOperation = new ToscaLifecycleOperationDefinition();
                 if (isArtifactPresent(operationEntry)) {
                     operationArtifactPath = OperationArtifactUtil
-                            .createOperationArtifactPath(component, operationEntry.getValue(),
-                                    isAssociatedResourceComponent);
+                            .createOperationArtifactPath(component, componentInstance, operationEntry.getValue(),
+                                    isAssociatedComponent);
                     toscaOperation.setImplementation(operationArtifactPath);
                 }
                 toscaOperation.setDescription(operationEntry.getValue().getDescription());
index 0d772cf..b10a888 100644 (file)
@@ -20,6 +20,7 @@ import java.io.File;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Set;
 import java.util.stream.Collectors;
 
@@ -30,6 +31,7 @@ import org.openecomp.sdc.be.datatypes.elements.ArtifactDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.OperationDataDefinition;
 import org.openecomp.sdc.be.model.ArtifactDefinition;
 import org.openecomp.sdc.be.model.Component;
+import org.openecomp.sdc.be.model.ComponentInstance;
 import org.openecomp.sdc.be.model.InterfaceDefinition;
 import org.openecomp.sdc.be.model.Operation;
 import org.openecomp.sdc.be.model.Resource;
@@ -52,22 +54,31 @@ public class OperationArtifactUtil {
      * @param operation     the specific operation name
      * @return the full path including file name for operation's artifacts
      */
-    static String createOperationArtifactPath(Component component, OperationDataDefinition operation,
-                                                     boolean isAssociatedResourceComponent) {
+    static String createOperationArtifactPath(Component component, ComponentInstance componentInstance,
+                                              OperationDataDefinition operation, boolean isAssociatedComponent) {
         if (!(component instanceof Resource || component instanceof Service)) {
             return null;
         }
-        if (isAssociatedResourceComponent) {
-            ResourceMetadataDataDefinition resourceMetadataDataDefinition = (ResourceMetadataDataDefinition)
-                    component.getComponentMetadataDefinition().getMetadataDataDefinition();
-            return createOperationArtifactPathInService(resourceMetadataDataDefinition.getToscaResourceName() +
-                    "_v" + component.getVersion(), operation);
+
+        if (isAssociatedComponent) {
+            // Service Proxy is only in Node Template interface
+            if(componentInstance != null) {
+                return createOperationArtifactPathInService(componentInstance.getToscaComponentName()
+                                                                    + "_v" + component.getVersion(), operation);
+            }
+            // Resource Instance is part of Node Type interface
+            else {
+                ResourceMetadataDataDefinition resourceMetadataDataDefinition =
+                        (ResourceMetadataDataDefinition) component.getComponentMetadataDefinition().getMetadataDataDefinition();
+                return createOperationArtifactPathInService(resourceMetadataDataDefinition.getToscaResourceName()
+                                                                    + "_v" + component.getVersion(), operation);
+            }
         }
-        return createOperationArtifactPathInResource(operation);
+        return createOperationArtifactPathInComponent(operation);
     }
 
 
-    private static String createOperationArtifactPathInResource(OperationDataDefinition operation) {
+    private static String createOperationArtifactPathInComponent(OperationDataDefinition operation) {
         return CsarUtils.ARTIFACTS + File.separator + WordUtils.capitalizeFully(ArtifactGroupTypeEnum.DEPLOYMENT.name())
                 + File.separator + ArtifactTypeEnum.WORKFLOW.name() + File.separator + BPMN_ARTIFACT_PATH
                 + File.separator + operation.getImplementation().getArtifactName();
@@ -89,7 +100,7 @@ public class OperationArtifactUtil {
         }
         Map<String, ArtifactDefinition> interfaceArtifacts = interfaces.values().stream()
                 .flatMap(interfaceDefinition -> interfaceDefinition.getOperationsMap().values().stream())
-                .map(Operation::getImplementationArtifact)
+                .map(Operation::getImplementationArtifact).filter(Objects::nonNull)
                 .collect(Collectors.toMap(ArtifactDataDefinition::getUniqueId,
                         artifactDefinition -> artifactDefinition));
         if (MapUtils.isNotEmpty(interfaceArtifacts)) {
index 3922bc8..7ddf71a 100644 (file)
@@ -192,7 +192,7 @@ public class InterfacesOperationsToscaUtilTest {
         component.setInterfaces(new HashMap<>());
         component.getInterfaces().put(interfaceType, addedInterface);
         Map<String, Object> interfacesMap = InterfacesOperationsToscaUtil
-                .getInterfacesMap(component, component.getInterfaces(), null, false, true);
+                .getInterfacesMap(component, null, component.getInterfaces(), null, false, true);
         ToscaNodeType nodeType = new ToscaNodeType();
         nodeType.setInterfaces(interfacesMap);
         ToscaExportHandler handler = new ToscaExportHandler();
index 9998822..32d0acc 100644 (file)
@@ -33,6 +33,7 @@ import org.openecomp.sdc.be.datatypes.elements.ArtifactDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.OperationDataDefinition;
 import org.openecomp.sdc.be.model.ArtifactDefinition;
 import org.openecomp.sdc.be.model.Component;
+import org.openecomp.sdc.be.model.ComponentInstance;
 import org.openecomp.sdc.be.model.ComponentMetadataDefinition;
 import org.openecomp.sdc.be.model.InterfaceDefinition;
 import org.openecomp.sdc.be.model.Resource;
@@ -58,7 +59,7 @@ public class OperationArtifactUtilTest {
         final ArtifactDataDefinition implementation = new ArtifactDataDefinition();
         implementation.setArtifactName("createBPMN.bpmn");
         op.setImplementation(implementation);
-        final String actualArtifactPath = OperationArtifactUtil.createOperationArtifactPath(component, op, false);
+        final String actualArtifactPath = OperationArtifactUtil.createOperationArtifactPath(component, null, op, false);
         String expectedArtifactPath = CsarUtils.ARTIFACTS + File.separator +
                 WordUtils.capitalizeFully(ArtifactGroupTypeEnum.DEPLOYMENT.name()) + File.separator +
                 ArtifactTypeEnum.WORKFLOW.name() + File.separator + BPMN_ARTIFACT_PATH + File.separator +
@@ -70,17 +71,15 @@ public class OperationArtifactUtilTest {
 
     @Test
     public void testCorrectPathForOperationArtifactsInService() {
-        ResourceMetadataDataDefinition componentMetadataDataDefinition = new ResourceMetadataDataDefinition();
-        componentMetadataDataDefinition.setToscaResourceName("org.openecomp.resource.vf.TestResource");
-        final ComponentMetadataDefinition componentMetadataDefinition =
-                new ComponentMetadataDefinition(componentMetadataDataDefinition);
-        Component component = new Resource(componentMetadataDefinition);
+        Component component = new Resource();
         component.setVersion("1.0");
+        ComponentInstance componentInstance = new ComponentInstance();
+        componentInstance.setToscaComponentName("org.openecomp.resource.vf.TestResource");
         final OperationDataDefinition op = new OperationDataDefinition();
         final ArtifactDataDefinition implementation = new ArtifactDataDefinition();
         implementation.setArtifactName("createBPMN.bpmn");
         op.setImplementation(implementation);
-        final String actualArtifactPath = OperationArtifactUtil.createOperationArtifactPath(component, op, true);
+        final String actualArtifactPath = OperationArtifactUtil.createOperationArtifactPath(component, componentInstance, op, true);
         String expectedArtifactPath = CsarUtils.ARTIFACTS + File.separator +
                 "org.openecomp.resource.vf.TestResource_v1.0" + File.separator +
                 WordUtils.capitalizeFully(ArtifactGroupTypeEnum.DEPLOYMENT.name()) + File.separator +
index 3bb5e13..de396b4 100644 (file)
@@ -379,17 +379,17 @@ public class NodeTemplateOperation extends BaseOperation {
     private Either<ImmutablePair<TopologyTemplate, String>, StorageOperationStatus> addServiceInstanceInterfacesToProxyServiceInstance(TopologyTemplate updatedContainer, ComponentInstance componentInstance) {
         Map<String, Object> interfaces = componentInstance.getInterfaces();
 
-        if(interfaces != null && !interfaces.isEmpty()) {
+        if(MapUtils.isNotEmpty(interfaces)){
             Map<String, InterfaceDataDefinition> interfacesMap = interfaces.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, e -> (InterfaceDataDefinition) e.getValue()));
-            MapInterfaceDataDefinition instIntrefaces = new MapInterfaceDataDefinition(interfacesMap);
+            MapInterfaceDataDefinition instInterfaces = new MapInterfaceDataDefinition(interfacesMap);
 
             Map<String, MapInterfaceDataDefinition> instInterfacesMap = new HashMap<>();
-            instInterfacesMap.put(componentInstance.getUniqueId(), instIntrefaces);
+            instInterfacesMap.put(componentInstance.getUniqueId(), instInterfaces);
             updatedContainer.setComponentInstInterfaces(instInterfacesMap);
 
             StorageOperationStatus status =
                     addToscaDataDeepElementsBlockToToscaElement(updatedContainer.getUniqueId(),
-                            EdgeLabelEnum.INST_INTERFACES, VertexTypeEnum.INST_INTERFACES, instIntrefaces,
+                            EdgeLabelEnum.INST_INTERFACES, VertexTypeEnum.INST_INTERFACES, instInterfaces,
                             componentInstance.getUniqueId());
 
             if(status != StorageOperationStatus.OK) {