Support for Test Topology Auto Design- Service Import 84/112684/13
authorzhaoxiangjun666 <xjzhaop@isoftstone.com>
Thu, 10 Sep 2020 06:01:50 +0000 (14:01 +0800)
committerzhaoxiangjun666 <xjzhaop@isoftstone.com>
Mon, 21 Sep 2020 12:39:48 +0000 (20:39 +0800)
Add some test code and use lombok in catalog-model
Test Topology Auto Design (NFV Testing Automatic Platform)
Delete useless test code and add test code for new function

Issue-ID: SDC-3179
Issue-ID: SDC-3085
Signed-off-by: zhaoxiangjun666 <xjzhaop@isoftstone.com>
Change-Id: I7f555633a00848c273014caa18ea0e30d0b22113

65 files changed:
catalog-be/src/main/java/org/openecomp/sdc/be/components/csar/CsarArtifactsAndGroupsBusinessLogic.java
catalog-be/src/main/java/org/openecomp/sdc/be/components/csar/CsarBusinessLogic.java
catalog-be/src/main/java/org/openecomp/sdc/be/components/csar/YamlTemplateParsingHandler.java
catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/AbstractTemplateBusinessLogic.java [new file with mode: 0644]
catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ArtifactsBusinessLogic.java
catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ComponentBusinessLogic.java
catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ComponentInstanceBusinessLogic.java
catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/CompositionBusinessLogic.java
catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ImportUtils.java
catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ResourceBusinessLogic.java
catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ResourceImportManager.java
catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ServiceBusinessLogic.java
catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ServiceImportBusinessLogic.java [new file with mode: 0644]
catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ServiceImportManager.java [new file with mode: 0644]
catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ServiceImportParseLogic.java [new file with mode: 0644]
catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/utils/CreateServiceFromYamlParameter.java [new file with mode: 0644]
catalog-be/src/main/java/org/openecomp/sdc/be/components/validation/ServiceDistributionValidation.java
catalog-be/src/main/java/org/openecomp/sdc/be/externalapi/servlet/AbstractTemplateServlet.java [new file with mode: 0644]
catalog-be/src/main/java/org/openecomp/sdc/be/externalapi/servlet/representation/AbstractResourceInfo.java [new file with mode: 0644]
catalog-be/src/main/java/org/openecomp/sdc/be/externalapi/servlet/representation/AbstractTemplateInfo.java [new file with mode: 0644]
catalog-be/src/main/java/org/openecomp/sdc/be/externalapi/servlet/representation/CopyServiceInfo.java [new file with mode: 0644]
catalog-be/src/main/java/org/openecomp/sdc/be/externalapi/servlet/representation/ReplaceVNFInfo.java [new file with mode: 0644]
catalog-be/src/main/java/org/openecomp/sdc/be/impl/ComponentsUtils.java
catalog-be/src/main/java/org/openecomp/sdc/be/info/ServiceVersionInfo.java
catalog-be/src/main/java/org/openecomp/sdc/be/servlets/AbstractValidationsServlet.java
catalog-be/src/main/java/org/openecomp/sdc/be/servlets/ComponentInstanceServlet.java
catalog-be/src/main/java/org/openecomp/sdc/be/servlets/ResourcesServlet.java
catalog-be/src/main/java/org/openecomp/sdc/be/servlets/ServiceServlet.java
catalog-be/src/main/java/org/openecomp/sdc/be/servlets/ServiceUploadServlet.java [new file with mode: 0644]
catalog-be/src/main/java/org/openecomp/sdc/be/tosca/CsarUtils.java
catalog-be/src/main/java/org/openecomp/sdc/be/tosca/ToscaUtils.java
catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/ServiceImportBusinessLogicTest.java [new file with mode: 0644]
catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/ServiceImportBussinessLogicBaseTestSetup.java [new file with mode: 0644]
catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/ServiceImportManagerTest.java [new file with mode: 0644]
catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/ServiceImportParseLogicTest.java [new file with mode: 0644]
catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/utils/CreateServiceFromYamlParameterTest.java [new file with mode: 0644]
catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/utils/YamlTemplateParsingHandlerTest.java
catalog-be/src/test/java/org/openecomp/sdc/be/externalapi/servlet/AbstractTemplateServletTest.java [new file with mode: 0644]
catalog-be/src/test/java/org/openecomp/sdc/be/externalapi/servlet/representation/AbstractResourceInfoTest.java [new file with mode: 0644]
catalog-be/src/test/java/org/openecomp/sdc/be/externalapi/servlet/representation/AbstractTemplateInfoTest.java [new file with mode: 0644]
catalog-be/src/test/java/org/openecomp/sdc/be/externalapi/servlet/representation/CopyServiceInfoTest.java [new file with mode: 0644]
catalog-be/src/test/java/org/openecomp/sdc/be/externalapi/servlet/representation/ReplaceVNFInfoTest.java [new file with mode: 0644]
catalog-be/src/test/java/org/openecomp/sdc/be/servlets/ResourceServletTest.java
catalog-be/src/test/java/org/openecomp/sdc/be/servlets/ServiceUploadServletTest.java [new file with mode: 0644]
catalog-be/src/test/resources/normativeTypes/service_import_template.yml [new file with mode: 0644]
catalog-dao/src/main/java/org/openecomp/sdc/be/dao/api/ActionStatus.java
catalog-dao/src/main/java/org/openecomp/sdc/be/resources/data/auditing/AuditingActionEnum.java
catalog-model/src/main/java/org/openecomp/sdc/be/model/Service.java
catalog-model/src/main/java/org/openecomp/sdc/be/model/UploadServiceInfo.java [new file with mode: 0644]
catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/operations/NodeTemplateOperation.java
catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/operations/ToscaOperationFacade.java
catalog-model/src/test/java/org/openecomp/sdc/be/model/UploadServiceInfoTest.java [new file with mode: 0644]
catalog-model/src/test/java/org/openecomp/sdc/be/model/jsonjanusgraph/operations/ToscaOperationFacadeTest.java
catalog-ui/src/app/models/components/component.ts
catalog-ui/src/app/models/components/service.ts
catalog-ui/src/app/ng2/pages/home/home.component.html
catalog-ui/src/app/ng2/pages/home/home.component.ts
catalog-ui/src/app/services/components/component-service.ts
catalog-ui/src/app/utils/component-factory.ts
catalog-ui/src/app/view-models/workspace/tabs/general/general-view-model.ts
catalog-ui/src/app/view-models/workspace/workspace-view-model.ts
common-app-api/src/main/java/org/openecomp/sdc/common/api/ArtifactTypeEnum.java
common-app-api/src/main/java/org/openecomp/sdc/common/api/Constants.java
common-be/src/main/java/org/openecomp/sdc/be/datatypes/components/ServiceMetadataDataDefinition.java
common-be/src/main/java/org/openecomp/sdc/be/datatypes/enums/ResourceTypeEnum.java

index 697d6fa..c34a006 100644 (file)
@@ -71,6 +71,7 @@ import org.openecomp.sdc.be.impl.ComponentsUtils;
 import org.openecomp.sdc.be.info.ArtifactTemplateInfo;
 import org.openecomp.sdc.be.info.MergedArtifactInfo;
 import org.openecomp.sdc.be.model.ArtifactDefinition;
+import org.openecomp.sdc.be.model.Component;
 import org.openecomp.sdc.be.model.ComponentParametersView;
 import org.openecomp.sdc.be.model.GroupDefinition;
 import org.openecomp.sdc.be.model.GroupProperty;
@@ -79,6 +80,7 @@ import org.openecomp.sdc.be.model.HeatParameterDefinition;
 import org.openecomp.sdc.be.model.Operation;
 import org.openecomp.sdc.be.model.PropertyDefinition;
 import org.openecomp.sdc.be.model.Resource;
+import org.openecomp.sdc.be.model.Service;
 import org.openecomp.sdc.be.model.User;
 import org.openecomp.sdc.be.model.heat.HeatParameterType;
 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ArtifactsOperations;
@@ -137,21 +139,48 @@ public class CsarArtifactsAndGroupsBusinessLogic extends BaseBusinessLogic {
                 .right()
                 .map(rf -> { componentsUtils.auditResource(rf, csarInfo.getModifier(), resource, AuditingActionEnum.IMPORT_RESOURCE); return rf;})
                 .left()
-                .bind(this::getResourcetFromGraph);
+                .bind(c -> checkoutRes(c));
     }
 
+    private Either<Resource, ResponseFormat> checkoutRes(Component component) {
+        Either<? extends Component, ResponseFormat> checkoutRes = getResourcetFromGraph(component);
+        Resource resource1 = (Resource) checkoutRes.left().value();
+        Either<Resource, ResponseFormat> checkoutRes1 = Either.left(resource1);
+        return checkoutRes1;
+    }
+
+    public Either<Service, ResponseFormat> createResourceArtifactsFromCsar(CsarInfo csarInfo, Service resource,
+            String artifactsMetaFile, String artifactsMetaFileName, List<ArtifactDefinition> createdArtifacts
+    ) {
 
-    public Either<Resource, ResponseFormat> updateResourceArtifactsFromCsar(CsarInfo csarInfo, Resource resource,
+        log.debug("parseResourceArtifactsInfoFromFile start");
+        return parseResourceArtifactsInfoFromFile(resource, artifactsMetaFile, artifactsMetaFileName)
+                .left()
+                .bind(p -> createResourceArtifacts(csarInfo, resource, p, createdArtifacts))
+                .right()
+                .map(rf -> rf)
+                .left()
+                .bind(c -> {
+                    Either<? extends Component, ResponseFormat> checkoutRes = getResourcetFromGraph(c);
+                    Service resource1 = (Service) checkoutRes.left().value();
+                    Either<Service, ResponseFormat> checkoutRes1 = Either.left(resource1);
+                    return checkoutRes1;
+                });
+    }
+       
+    public Either<Component, ResponseFormat> updateResourceArtifactsFromCsar(CsarInfo csarInfo, Component resource,
             String artifactsMetaFile, String artifactsMetaFileName, List<ArtifactDefinition> createdNewArtifacts,
             boolean shouldLock, boolean inTransaction){
 
-        Resource updatedResource = resource;
+        Component updatedResource = resource;
 
         Either<Map<String, List<ArtifactTemplateInfo>>, ResponseFormat> parseResourceInfoFromYamlEither = parseResourceArtifactsInfoFromFile(
                 updatedResource, artifactsMetaFile, artifactsMetaFileName);
         if (parseResourceInfoFromYamlEither.isRight()) {
             ResponseFormat responseFormat = parseResourceInfoFromYamlEither.right().value();
-            componentsUtils.auditResource(responseFormat, csarInfo.getModifier(), resource, AuditingActionEnum.IMPORT_RESOURCE);
+            if (resource instanceof Resource) {
+                componentsUtils.auditResource(responseFormat, csarInfo.getModifier(), (Resource) resource, AuditingActionEnum.IMPORT_RESOURCE);
+            }
             return Either.right(responseFormat);
         }
 
@@ -183,8 +212,8 @@ public class CsarArtifactsAndGroupsBusinessLogic extends BaseBusinessLogic {
         Collection<List<ArtifactTemplateInfo>> parsedArifactsCollection = parsedArtifactsMap.values();
 
         Either<Map<ArtifactTemplateInfo, Set<ArtifactTemplateInfo>>, ResponseFormat> parsedArtifactsPerGroupEither = createArtifactsTemplateCollection(csarInfo, updatedResource, createdNewArtifacts,
-                                                                                                                                                       createdDeploymentArtifactsAfterDelete, labelCounter, parsedArifactsCollection);
-        if(parsedArtifactsPerGroupEither.isRight()){
+                createdDeploymentArtifactsAfterDelete, labelCounter, parsedArifactsCollection);
+        if (parsedArtifactsPerGroupEither.isRight()) {
             log.error("Failed to parse artifacts. Status is {} ", parsedArtifactsPerGroupEither.right().value());
             return Either.right(parsedArtifactsPerGroupEither.right().value());
         }
@@ -207,7 +236,7 @@ public class CsarArtifactsAndGroupsBusinessLogic extends BaseBusinessLogic {
                 artifactsToDelete, groupToDelete, jsonMasterArtifacts, createdDeploymentArtifactsAfterDelete);
 
         List<ArtifactDefinition> deletedArtifacts = new ArrayList<>();
-        Either<Resource, ResponseFormat> deletedArtifactsEither = deleteArtifactsInUpdateCsarFlow(
+        Either<Component, ResponseFormat> deletedArtifactsEither = deleteArtifactsInUpdateCsarFlow(
                 updatedResource, csarInfo.getModifier(), shouldLock, inTransaction, artifactsToDelete, groupToDelete, deletedArtifacts);
         if (deletedArtifactsEither.isRight()) {
             log.debug("Failed to delete artifacts. Status is {} ", deletedArtifactsEither.right().value());
@@ -222,7 +251,7 @@ public class CsarArtifactsAndGroupsBusinessLogic extends BaseBusinessLogic {
 
         ////////////// dissociate, associate or create
         ////////////// artifacts////////////////////////////
-        Either<Resource, ResponseFormat> assDissotiateEither = associateAndDissociateArtifactsToGroup(csarInfo,
+        Either<Component, ResponseFormat> assDissotiateEither = associateAndDissociateArtifactsToGroup(csarInfo,
                 updatedResource, createdNewArtifacts, labelCounter,
                 createdDeploymentArtifactsAfterDelete, mergedgroup, deletedArtifacts);
         groups = updatedResource.getGroups();
@@ -239,37 +268,37 @@ public class CsarArtifactsAndGroupsBusinessLogic extends BaseBusinessLogic {
 
         // update vfModule names
         Set<GroupDefinition> groupForAssociateWithMembers = mergedgroup.keySet();
-        Either<Resource, ResponseFormat> validateUpdateVfGroupNamesRes = updateVfModuleNames(createdNewArtifacts,
+        Either<Component, ResponseFormat> validateUpdateVfGroupNamesRes = updateVfModuleNames(createdNewArtifacts,
                 updatedResource, groups, createdDeploymentArtifactsAfterDelete, groupForAssociateWithMembers);
         if (validateUpdateVfGroupNamesRes != null) return validateUpdateVfGroupNamesRes;
 
         //////////////// create new artifacts in update
         //////////////// flow////////////////////////////
         List<ArtifactTemplateInfo> newArtifactsGroup = createNewArtifcats(parsedGroup, groupArtifact);
-        Either<Resource, ResponseFormat> validateGroupNamesRes = handleArtifactsInGroup(csarInfo, createdNewArtifacts,
+        Either<Component, ResponseFormat> validateGroupNamesRes = handleArtifactsInGroup(csarInfo, createdNewArtifacts,
                 updatedResource, groups, createdDeploymentArtifactsAfterDelete, labelCounter, newArtifactsGroup);
         if (validateGroupNamesRes != null) return validateGroupNamesRes;
 
         // updatedGroup
-        Either<Resource, ResponseFormat> updateVersionEither = updateGroupVersion(updatedResource, groupForAssociateWithMembers);
+        Either<Component, ResponseFormat> updateVersionEither = updateGroupVersion(updatedResource, groupForAssociateWithMembers);
         if (updateVersionEither != null) return updateVersionEither;
         if (!CollectionUtils.isEmpty(artifactsWithoutGroups)) {
             for (ArtifactTemplateInfo t : artifactsWithoutGroups) {
                 List<ArtifactTemplateInfo> artifacts = new ArrayList<>();
                 artifacts.add(t);
-                Either<Resource, ResponseFormat> resStatus = createGroupDeploymentArtifactsFromCsar(csarInfo, updatedResource,
+                Either<Component, ResponseFormat> resStatus = createGroupDeploymentArtifactsFromCsar(csarInfo, updatedResource,
                         artifacts, createdNewArtifacts, createdDeploymentArtifactsAfterDelete, labelCounter);
                 if (checkResponse(resStatus)) return resStatus;
             }
 
         }
 
-        Either<Resource, StorageOperationStatus> eitherGetResource = toscaOperationFacade.getToscaElement(updatedResource.getUniqueId());
+        Either<Component, StorageOperationStatus> eitherGetResource = toscaOperationFacade.getToscaElement(updatedResource.getUniqueId());
         return mapResult(eitherGetResource, updatedResource);
     }
 
-    private Either<Resource, ResponseFormat> handleArtifactsInGroup(CsarInfo csarInfo, List<ArtifactDefinition> createdNewArtifacts,
-                                                                    Resource updatedResource, List<GroupDefinition> groups,
+    private Either<Component, ResponseFormat> handleArtifactsInGroup(CsarInfo csarInfo, List<ArtifactDefinition> createdNewArtifacts,
+                                                                    Component updatedResource, List<GroupDefinition> groups,
                                                                     List<ArtifactDefinition> createdDeploymentArtifactsAfterDelete,
                                                                     int labelCounter, List<ArtifactTemplateInfo> newArtifactsGroup) {
         if (!newArtifactsGroup.isEmpty()) {
@@ -280,18 +309,18 @@ public class CsarArtifactsAndGroupsBusinessLogic extends BaseBusinessLogic {
             if (validateGroupNamesRes.isRight()) {
                 return Either.right(validateGroupNamesRes.right().value());
             }
-            Either<Resource, ResponseFormat> resStatus = createGroupDeploymentArtifactsFromCsar(csarInfo, updatedResource,
+            Either<Component, ResponseFormat> resStatus = createGroupDeploymentArtifactsFromCsar(csarInfo, updatedResource,
                     newArtifactsGroup, createdNewArtifacts, createdDeploymentArtifactsAfterDelete, labelCounter);
           checkResponse(resStatus);
         }
         return null;
     }
 
-    private boolean checkResponse(Either<Resource, ResponseFormat> resStatus) {
+    private boolean checkResponse(Either<Component, ResponseFormat> resStatus) {
         return (resStatus.isRight());
     }
 
-    private Either<Resource, ResponseFormat> updateVfModuleNames(List<ArtifactDefinition> createdNewArtifacts, Resource updatedResource, List<GroupDefinition> groups, List<ArtifactDefinition> createdDeploymentArtifactsAfterDelete, Set<GroupDefinition> groupForAssociateWithMembers) {
+    private Either<Component, ResponseFormat> updateVfModuleNames(List<ArtifactDefinition> createdNewArtifacts, Component updatedResource, List<GroupDefinition> groups, List<ArtifactDefinition> createdDeploymentArtifactsAfterDelete, Set<GroupDefinition> groupForAssociateWithMembers) {
         if (!CollectionUtils.isEmpty(groups)) {
             Either<List<GroupDefinition>, ResponseFormat> validateUpdateVfGroupNamesRes = groupBusinessLogic
                     .validateUpdateVfGroupNamesOnGraph(groups, updatedResource);
@@ -303,7 +332,7 @@ public class CsarArtifactsAndGroupsBusinessLogic extends BaseBusinessLogic {
         return null;
     }
 
-    private Either<Resource, ResponseFormat> updateGroupVersion(Resource updatedResource, Set<GroupDefinition> groupForAssociateWithMembers) {
+    private Either<Component, ResponseFormat> updateGroupVersion(Component updatedResource, Set<GroupDefinition> groupForAssociateWithMembers) {
         if (!groupForAssociateWithMembers.isEmpty()) {
 
             List<GroupDefinition> groupsId = groupForAssociateWithMembers.stream()
@@ -341,7 +370,7 @@ public class CsarArtifactsAndGroupsBusinessLogic extends BaseBusinessLogic {
         return Character.isDigit(artifactLabel.charAt(artifactLabel.length()-1));
     }
 
-    private Either<Resource, ResponseFormat> mapResult(Either<Resource, StorageOperationStatus> result, Resource resource) {
+    private Either<Component, ResponseFormat> mapResult(Either<Component, StorageOperationStatus> result, Component resource) {
         return result.right()
                      .map(status -> componentsUtils.getResponseFormatByResource(
                              componentsUtils.convertFromStorageResponse(status), resource));
@@ -396,7 +425,7 @@ public class CsarArtifactsAndGroupsBusinessLogic extends BaseBusinessLogic {
     }
 
 
-    private void deleteGroupsByType(List<GroupDefinition> groups, String groupType, Resource resource) {
+    private void deleteGroupsByType(List<GroupDefinition> groups, String groupType, Component resource) {
         if(groups != null){
             List<GroupDefinition> listToDelete =  groups.stream()
                                                         .filter(g -> g.getType().equals(groupType))
@@ -452,11 +481,11 @@ public class CsarArtifactsAndGroupsBusinessLogic extends BaseBusinessLogic {
     }
 
 
-    private Either<Resource, ResponseFormat> createResourceArtifacts(CsarInfo csarInfo, Resource resource,
+    private Either<Component, ResponseFormat> createResourceArtifacts(CsarInfo csarInfo, Component resource,
             Map<String, List<ArtifactTemplateInfo>> artifactsMap,
             List<ArtifactDefinition> createdArtifacts) {
 
-        Either<Resource, ResponseFormat> resStatus = Either.left(resource);
+        Either<Component, ResponseFormat> resStatus = Either.left(resource);
 
         Collection<List<ArtifactTemplateInfo>> arifactsCollection = artifactsMap.values();
 
@@ -476,7 +505,7 @@ public class CsarArtifactsAndGroupsBusinessLogic extends BaseBusinessLogic {
 
 
     private Either<Map<ArtifactTemplateInfo, Set<ArtifactTemplateInfo>>, ResponseFormat> createArtifactsTemplateCollection(
-            CsarInfo csarInfo, Resource resource,
+               CsarInfo csarInfo, Component resource,
             List<ArtifactDefinition> createdNewArtifacts,
             List<ArtifactDefinition> createdDeploymentArtifactsAfterDelete, int labelCounter,
             Collection<List<ArtifactTemplateInfo>> parsedArifactsCollection) {
@@ -498,7 +527,7 @@ public class CsarArtifactsAndGroupsBusinessLogic extends BaseBusinessLogic {
                 } else {
                     List<ArtifactTemplateInfo> arrtifacts = new ArrayList<>();
                     arrtifacts.add(parsedGroupTemplate);
-                    Either<Resource, ResponseFormat> resStatus = createGroupDeploymentArtifactsFromCsar(csarInfo,
+                    Either<Component, ResponseFormat> resStatus = createGroupDeploymentArtifactsFromCsar(csarInfo,
                             resource, arrtifacts, createdNewArtifacts, createdDeploymentArtifactsAfterDelete,
                             labelCounter);
                     if (resStatus.isRight()) {
@@ -514,7 +543,7 @@ public class CsarArtifactsAndGroupsBusinessLogic extends BaseBusinessLogic {
 
     @SuppressWarnings({ "unchecked", "static-access" })
     public Either<Map<String, List<ArtifactTemplateInfo>>, ResponseFormat> parseResourceArtifactsInfoFromFile(
-            Resource resource, String artifactsMetaFile, String artifactFileName) {
+            Component resource, String artifactsMetaFile, String artifactFileName) {
 
         try {
             JsonObject jsonElement = new JsonObject();
@@ -622,8 +651,8 @@ public class CsarArtifactsAndGroupsBusinessLogic extends BaseBusinessLogic {
 
 
 
-    private Either<Resource, ResponseFormat> createGroupDeploymentArtifactsFromCsar(CsarInfo csarInfo,
-            Resource resource, List<ArtifactTemplateInfo> artifactsTemplateList,
+    private Either<Component, ResponseFormat> createGroupDeploymentArtifactsFromCsar(CsarInfo csarInfo,
+            Component resource, List<ArtifactTemplateInfo> artifactsTemplateList,
             List<ArtifactDefinition> createdArtifacts, int labelCounter) {
         List<GroupDefinition> createdGroups = resource.getGroups();
         List<GroupDefinition> heatGroups = null;
@@ -637,7 +666,7 @@ public class CsarArtifactsAndGroupsBusinessLogic extends BaseBusinessLogic {
             Set<String> artifactsUUIDGroup = new HashSet<>();
 
             log.debug("createDeploymentArtifactsFromCsar start");
-            Either<Resource, ResponseFormat> resStatus = createDeploymentArtifactFromCsar(csarInfo, ARTIFACTS_PATH, resource, artifactsGroup,
+            Either<Component, ResponseFormat> resStatus = createDeploymentArtifactFromCsar(csarInfo, ARTIFACTS_PATH, resource, artifactsGroup,
                     artifactsUUIDGroup, groupTemplateInfo, createdArtifacts, labelCounter);
             log.debug("createDeploymentArtifactsFromCsar end");
             if (resStatus.isRight()) {
@@ -707,10 +736,10 @@ public class CsarArtifactsAndGroupsBusinessLogic extends BaseBusinessLogic {
         return Either.left(groupDefinition);
     }
 
-    private Either<Resource, ResponseFormat> createDeploymentArtifactFromCsar(CsarInfo csarInfo, String artifactPath,
-            Resource resource, Set<String> artifactsGroup, Set<String> artifactsUUIDGroup,
+    private Either<Component, ResponseFormat> createDeploymentArtifactFromCsar(CsarInfo csarInfo, String artifactPath,
+            Component resource, Set<String> artifactsGroup, Set<String> artifactsUUIDGroup,
             ArtifactTemplateInfo artifactTemplateInfo, List<ArtifactDefinition> createdArtifacts, int labelCounter) {
-        Either<Resource, ResponseFormat> resStatus = Either.left(resource);
+        Either<Component, ResponseFormat> resStatus = Either.left(resource);
 
         String artifactUid = "";
         String artifactEnvUid = "";
@@ -801,7 +830,7 @@ public class CsarArtifactsAndGroupsBusinessLogic extends BaseBusinessLogic {
 
     }
 
-    private Either<ArtifactDefinition, ResponseFormat> createDeploymentArtifact(CsarInfo csarInfo, Resource resource,
+    private Either<ArtifactDefinition, ResponseFormat> createDeploymentArtifact(CsarInfo csarInfo, Component resource,
                                                                                 String artifactPath, ArtifactTemplateInfo artifactTemplateInfo, List<ArtifactDefinition> createdArtifacts,
                                                                                 int label) {
         int updatedlabel = label;
@@ -847,10 +876,10 @@ public class CsarArtifactsAndGroupsBusinessLogic extends BaseBusinessLogic {
 
 
 
-    private Either<ArtifactDefinition, ResponseFormat> updateHeatParamsFromCsar(Resource resource, CsarInfo csarInfo,
+    private Either<ArtifactDefinition, ResponseFormat> updateHeatParamsFromCsar(Component resource, CsarInfo csarInfo,
             ArtifactTemplateInfo artifactTemplateInfo, ArtifactDefinition currentInfo, boolean isUpdateEnv) {
 
-        Resource updatedResource = resource;
+        Component updatedResource = resource;
         Either<ArtifactDefinition, ResponseFormat> resStatus = Either.left(currentInfo);
         if (artifactTemplateInfo.getEnv() != null && !artifactTemplateInfo.getEnv().isEmpty()) {
 
@@ -920,7 +949,7 @@ public class CsarArtifactsAndGroupsBusinessLogic extends BaseBusinessLogic {
 
     }
 
-    private Either<ArtifactDefinition, ResponseFormat> updateHeatParams(Resource resource,
+    private Either<ArtifactDefinition, ResponseFormat> updateHeatParams(Component resource,
             ArtifactDefinition currentInfo, List<HeatParameterDefinition> updatedHeatEnvParams) {
 
         Either<ArtifactDefinition, ResponseFormat> resStatus = Either.left(currentInfo);
@@ -973,7 +1002,7 @@ public class CsarArtifactsAndGroupsBusinessLogic extends BaseBusinessLogic {
     }
 
     public Either<Either<ArtifactDefinition, Operation>, ResponseFormat> createOrUpdateCsarArtifactFromJson(
-            Resource resource, User user, Map<String, Object> json, ArtifactOperationInfo operation) {
+            Component resource, User user, Map<String, Object> json, ArtifactOperationInfo operation) {
 
         String jsonStr = gson.toJson(json);
         ArtifactDefinition artifactDefinitionFromJson = RepresentationUtils.convertJsonToArtifactDefinition(jsonStr,
@@ -1231,11 +1260,11 @@ public class CsarArtifactsAndGroupsBusinessLogic extends BaseBusinessLogic {
         return groupArtifact;
     }
 
-    private Either<Resource, ResponseFormat> deleteArtifactsInUpdateCsarFlow(Resource resource,
+    private Either<Component, ResponseFormat> deleteArtifactsInUpdateCsarFlow(Component resource,
             User user, boolean shouldLock, boolean inTransaction, Set<ArtifactDefinition> artifactsToDelete,
             Map<String, List<ArtifactDefinition>> groupToDelete, List<ArtifactDefinition> deletedArtifacts) {
 
-        Resource updatedResource = resource;
+        Component updatedResource = resource;
 
         String resourceId = updatedResource.getUniqueId();
         if (!artifactsToDelete.isEmpty()) {
@@ -1279,8 +1308,8 @@ public class CsarArtifactsAndGroupsBusinessLogic extends BaseBusinessLogic {
         Either<Resource, StorageOperationStatus> eitherGerResource = toscaOperationFacade
                 .getToscaElement(updatedResource.getUniqueId());
         if (eitherGerResource.isRight()) {
-            ResponseFormat responseFormat = componentsUtils.getResponseFormatByResource(
-                    componentsUtils.convertFromStorageResponse(eitherGerResource.right().value()), updatedResource);
+            ResponseFormat responseFormat = componentsUtils.getResponseFormatByComponent(
+                    componentsUtils.convertFromStorageResponse(eitherGerResource.right().value()), updatedResource, resource.getComponentType());
 
             return Either.right(responseFormat);
 
@@ -1302,14 +1331,14 @@ public class CsarArtifactsAndGroupsBusinessLogic extends BaseBusinessLogic {
         }
     }
 
-    private Either<Resource, ResponseFormat> createGroupDeploymentArtifactsFromCsar(CsarInfo csarInfo,
-            Resource resource, List<ArtifactTemplateInfo> artifactsTemplateList,
+    private Either<Component, ResponseFormat> createGroupDeploymentArtifactsFromCsar(CsarInfo csarInfo,
+            Component resource, List<ArtifactTemplateInfo> artifactsTemplateList,
             List<ArtifactDefinition> createdNewArtifacts, List<ArtifactDefinition> artifactsFromResource,
             int labelCounter) {
 
-        Resource updatedResource = resource;
+        Component updatedResource = resource;
 
-        Either<Resource, ResponseFormat> resStatus = Either.left(updatedResource);
+        Either<Component, ResponseFormat> resStatus = Either.left(updatedResource);
         List<GroupDefinition> createdGroups = updatedResource.getGroups();
         List<GroupDefinition> heatGroups = null;
         if (createdGroups != null && !createdGroups.isEmpty()) {
@@ -1388,10 +1417,10 @@ public class CsarArtifactsAndGroupsBusinessLogic extends BaseBusinessLogic {
         return resStatus;
     }
 
-    private Either<Resource, ResponseFormat> createDeploymentArtifactsFromCsar(CsarInfo csarInfo, Resource resource,
+    private Either<Component, ResponseFormat> createDeploymentArtifactsFromCsar(CsarInfo csarInfo, Component resource,
             Set<String> artifactsGroup, Set<String> artifactsUUIDGroup, ArtifactTemplateInfo artifactTemplateInfo,
             List<ArtifactDefinition> createdArtifacts, List<ArtifactDefinition> artifactsFromResource, int labelCounter) {
-        Either<Resource, ResponseFormat> resStatus = Either.left(resource);
+        Either<Component, ResponseFormat> resStatus = Either.left(resource);
         String artifactFileName = artifactTemplateInfo.getFileName();
         String artifactUid = "";
         String artifactUUID = "";
@@ -1487,13 +1516,13 @@ public class CsarArtifactsAndGroupsBusinessLogic extends BaseBusinessLogic {
         return resStatus;
     }
 
-    private Either<Resource, ResponseFormat> associateAndDissociateArtifactsToGroup(CsarInfo csarInfo,
-                                                                                    Resource resource, List<ArtifactDefinition> createdNewArtifacts, int labelCounter,
+    private Either<Component, ResponseFormat> associateAndDissociateArtifactsToGroup(CsarInfo csarInfo,
+                                                                                    Component resource, List<ArtifactDefinition> createdNewArtifacts, int labelCounter,
                                                                                     List<ArtifactDefinition> createdDeploymentArtifactsAfterDelete,
                                                                                     Map<GroupDefinition, MergedArtifactInfo> mergedgroup, List<ArtifactDefinition> deletedArtifacts) {
         Map<GroupDefinition, List<ArtifactTemplateInfo>> artifactsToAssotiate = new HashMap<>();
         Map<GroupDefinition, List<ImmutablePair<ArtifactDefinition, ArtifactTemplateInfo>>> artifactsToUpdateMap = new HashMap<>();
-        Either<Resource, ResponseFormat> resEither;
+        Either<Component, ResponseFormat> resEither;
         for (Entry<GroupDefinition, MergedArtifactInfo> entry : mergedgroup.entrySet()) {
             List<ArtifactDefinition> dissArtifactsInGroup = entry.getValue()
                     .getListToDissotiateArtifactFromGroup(deletedArtifacts);
@@ -1649,8 +1678,8 @@ public class CsarArtifactsAndGroupsBusinessLogic extends BaseBusinessLogic {
                 .getToscaElement(resource.getUniqueId(), parametersView);
 
         if (eitherGerResource.isRight()) {
-            ResponseFormat responseFormat = componentsUtils.getResponseFormatByResource(
-                    componentsUtils.convertFromStorageResponse(eitherGerResource.right().value()), resource);
+            ResponseFormat responseFormat = componentsUtils.getResponseFormatByComponent(
+                    componentsUtils.convertFromStorageResponse(eitherGerResource.right().value()), resource, resource.getComponentType());
 
             resEither = Either.right(responseFormat);
             return resEither;
@@ -1661,7 +1690,7 @@ public class CsarArtifactsAndGroupsBusinessLogic extends BaseBusinessLogic {
     }
 
     private Either<ArtifactDefinition, ResponseFormat> updateDeploymentArtifactsFromCsar(CsarInfo csarInfo,
-            Resource resource, ArtifactDefinition oldArtifact, ArtifactTemplateInfo artifactTemplateInfo,
+            Component resource, ArtifactDefinition oldArtifact, ArtifactTemplateInfo artifactTemplateInfo,
             List<ArtifactDefinition> updatedArtifacts, List<ArtifactTemplateInfo> updatedRequiredArtifacts) {
 
         Either<ArtifactDefinition, ResponseFormat> resStatus = null;
@@ -1763,15 +1792,57 @@ public class CsarArtifactsAndGroupsBusinessLogic extends BaseBusinessLogic {
         return Either.left(updatedResource);
     }
 
-    private Either<Resource, ResponseFormat>  getResourcetFromGraph(Resource component){
+    public Either<Service, ResponseFormat> deleteVFModules(Service resource, CsarInfo csarInfo, boolean shouldLock, boolean inTransaction) {
+        Service updatedResource = resource;
+        List<GroupDefinition> groupsToDelete = updatedResource.getGroups();
+        if (groupsToDelete != null && !groupsToDelete.isEmpty()) {
+            List<GroupDefinition> vfGroupsToDelete = groupsToDelete.stream().filter(g -> g.getType().equals(Constants.DEFAULT_GROUP_VF_MODULE)).collect(Collectors.toList());
+            Either<Service, ResponseFormat> eitherGetResource = deleteVfGroups(vfGroupsToDelete, updatedResource, csarInfo, shouldLock, inTransaction);
+            if (eitherGetResource.isRight()) {
+                return Either.right(eitherGetResource.right().value());
+            }
+            updatedResource = eitherGetResource.left().value();
+        }
+        return Either.left(updatedResource);
+    }
+
+    private Either<Service, ResponseFormat> deleteVfGroups(List<GroupDefinition> vfGroupsToDelete, Service resource, CsarInfo csarInfo, boolean shouldLock, boolean inTransaction) {
+        ResponseFormat responseFormat;
+        if (vfGroupsToDelete != null && !vfGroupsToDelete.isEmpty()) {
+            for (GroupDefinition gr : vfGroupsToDelete) {
+                List<String> artifacts = gr.getArtifacts();
+                for (String artifactId : artifacts) {
+                    Either<ArtifactDefinition, ResponseFormat> handleDelete = artifactsBusinessLogic.handleDelete(resource.getUniqueId(), artifactId, csarInfo.getModifier(),
+                            resource, shouldLock, inTransaction);
+                    if (handleDelete.isRight()) {
+                        log.debug("Couldn't delete  artifact {}", artifactId);
+                        return Either.right(handleDelete.right().value());
+                    }
+                }
+            }
+            groupBusinessLogic.deleteGroups(resource, vfGroupsToDelete);
+
+            Either<Service, StorageOperationStatus> eitherGetResource = toscaOperationFacade.getToscaElement(resource.getUniqueId());
+            if (eitherGetResource.isRight()) {
+                responseFormat = componentsUtils.getResponseFormatByComponent(componentsUtils.convertFromStorageResponse(eitherGetResource.right().value()), resource, resource.getComponentType());
+
+                return Either.right(responseFormat);
+            }
+            resource = eitherGetResource.left().value();
+            return Either.left(resource);
+        }
+        responseFormat = componentsUtils.getResponseFormatByComponent(ActionStatus.INVALID_CONTENT, resource, resource.getComponentType());
+        return Either.right(responseFormat);
+    }
+
+
+    private Either<? extends Component, ResponseFormat> getResourcetFromGraph(Component component) {
         log.debug("getResource start");
         return toscaOperationFacade.getToscaElement(component.getUniqueId())
                 .right()
-                .map(rf ->  componentsUtils.getResponseFormatByResource(componentsUtils.convertFromStorageResponse(rf), component))
+                .map(rf -> componentsUtils.getResponseFormatByComponent(componentsUtils.convertFromStorageResponse(rf), component, component.getComponentType()))
                 .left()
-                .map (c -> (Resource) c);
-
-
+                .map(c -> c);
     }
 
 }
index e16f08b..15cde43 100644 (file)
@@ -28,11 +28,14 @@ import org.openecomp.sdc.be.components.impl.CsarValidationUtils;
 import org.openecomp.sdc.be.components.impl.GroupBusinessLogic;
 import org.openecomp.sdc.be.components.impl.exceptions.ByActionStatusComponentException;
 import org.openecomp.sdc.be.components.impl.exceptions.ByResponseFormatComponentException;
+import org.openecomp.sdc.be.components.impl.exceptions.ComponentException;
 import org.openecomp.sdc.be.config.BeEcompErrorManager;
 import org.openecomp.sdc.be.dao.api.ActionStatus;
+import org.openecomp.sdc.be.model.Component;
 import org.openecomp.sdc.be.model.NodeTypeInfo;
 import org.openecomp.sdc.be.model.ParsedToscaYamlInfo;
 import org.openecomp.sdc.be.model.Resource;
+import org.openecomp.sdc.be.model.Service;
 import org.openecomp.sdc.be.model.User;
 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ArtifactsOperations;
 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.InterfaceOperation;
@@ -98,6 +101,21 @@ public class CsarBusinessLogic extends BaseBusinessLogic {
         }
     }
 
+    public void validateCsarBeforeCreate(Service resource, String csarUUID) {
+        // check if VF with the same Csar UUID or with he same name already
+        // exists
+        StorageOperationStatus status = toscaOperationFacade.validateCsarUuidUniqueness(csarUUID);
+        log.debug("enter validateCsarBeforeCreate,get status:{}", status);
+        if (status == StorageOperationStatus.ENTITY_ALREADY_EXISTS) {
+            log.debug("Failed to create resource {}, csarUUID {} already exist for a different VF ",
+                    resource.getSystemName(), csarUUID);
+        } else if (status != StorageOperationStatus.OK) {
+            log.debug("Failed to validate uniqueness of CsarUUID {} for resource", csarUUID,
+                    resource.getSystemName());
+            throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(status));
+        }
+    }
+
     public CsarInfo getCsarInfo(Resource resource, Resource oldResource,User user, Map<String, byte[]> payload, String csarUUID){
         Map<String, byte[]> csar = getCsar(resource, user, payload, csarUUID);
         ImmutablePair<String, String> toscaYamlCsarStatus = validateAndParseCsar(resource,
@@ -120,11 +138,32 @@ public class CsarBusinessLogic extends BaseBusinessLogic {
                 toscaYamlCsarStatus.getKey(), toscaYamlCsarStatus.getValue(), true);
     }
 
+    public CsarInfo getCsarInfo(Service service, Service oldResource,User user, Map<String, byte[]> payload, String csarUUID){
+        Map<String, byte[]> csar = getCsar(service, user, payload, csarUUID);
+        ImmutablePair<String, String> toscaYamlCsarStatus = validateAndParseCsar(service,
+                user, csar, csarUUID)
+                                                                    .left().on(this::throwComponentException);
 
-    public ParsedToscaYamlInfo getParsedToscaYamlInfo(String topologyTemplateYaml, String yamlName, Map<String, NodeTypeInfo> nodeTypesInfo, CsarInfo csarInfo, String nodeName) {
+        String checksum = CsarValidationUtils.getToscaYamlChecksum(csar,
+                csarUUID, componentsUtils).left().on(r->logAndThrowComponentException(r, "Failed to calculate checksum for casrUUID {} error {} ", csarUUID));
+        if (oldResource!=null && !checksum.equals(
+                oldResource.getComponentMetadataDefinition().getMetadataDataDefinition().getImportedToscaChecksum())) {
+            log.debug("The checksum of main template yaml of csar with csarUUID {} is not equal to the previous one, existing checksum is {}, new one is {}.", csarUUID,
+                    oldResource.getComponentMetadataDefinition().getMetadataDataDefinition()
+                            .getImportedToscaChecksum(),
+                    checksum);
+            oldResource.getComponentMetadataDefinition().getMetadataDataDefinition()
+                    .setImportedToscaChecksum(checksum);
+        }
+
+        return new CsarInfo(user, csarUUID, csar, service.getName(),
+                toscaYamlCsarStatus.getKey(), toscaYamlCsarStatus.getValue(), true);
+    }
+       
+    public ParsedToscaYamlInfo getParsedToscaYamlInfo(String topologyTemplateYaml, String yamlName, Map<String, NodeTypeInfo> nodeTypesInfo, CsarInfo csarInfo, String nodeName, Component component) {
         return yamlHandler.parseResourceInfoFromYAML(
                 yamlName, topologyTemplateYaml, csarInfo.getCreatedNodesToscaResourceNames(), nodeTypesInfo,
-                nodeName);
+                nodeName, component);
     }
 
     private String logAndThrowComponentException(ResponseFormat responseFormat, String logMessage, String ...params) {
@@ -136,9 +175,9 @@ public class CsarBusinessLogic extends BaseBusinessLogic {
         throw new ByResponseFormatComponentException(responseFormat);
     }
 
-    private Either<ImmutablePair<String, String>, ResponseFormat> validateAndParseCsar(Resource resource, User user,
+    private Either<ImmutablePair<String, String>, ResponseFormat> validateAndParseCsar(Component component, User user,
                                                                                       Map<String, byte[]> payload, String csarUUID) {
-        Map<String, byte[]> csar = getCsar(resource, user, payload, csarUUID);
+        Map<String, byte[]> csar = getCsar(component, user, payload, csarUUID);
         Either<Boolean, ResponseFormat> validateCsarStatus = CsarValidationUtils.validateCsar(csar,
                 csarUUID, componentsUtils);
         if (validateCsarStatus.isRight()) {
@@ -146,7 +185,10 @@ public class CsarBusinessLogic extends BaseBusinessLogic {
             log.debug("Error when validate csar with ID {}, error: {}", csarUUID, responseFormat);
             BeEcompErrorManager.getInstance()
                     .logBeDaoSystemError(CREATING_RESOURCE_FROM_CSAR_FETCHING_CSAR_WITH_ID + csarUUID + FAILED);
-            componentsUtils.auditResource(responseFormat, user, resource, AuditingActionEnum.CREATE_RESOURCE);
+            if(component instanceof Resource){
+                componentsUtils.auditResource(responseFormat, user, (Resource)component, AuditingActionEnum.CREATE_RESOURCE);
+            }
+
             return Either.right(responseFormat);
         }
 
@@ -158,13 +200,15 @@ public class CsarBusinessLogic extends BaseBusinessLogic {
             log.debug("Error when try to get csar toscayamlFile with csar ID {}, error: {}", csarUUID, responseFormat);
             BeEcompErrorManager.getInstance()
                     .logBeDaoSystemError(CREATING_RESOURCE_FROM_CSAR_FETCHING_CSAR_WITH_ID + csarUUID + FAILED);
-            componentsUtils.auditResource(responseFormat, user, resource, AuditingActionEnum.CREATE_RESOURCE);
+            if(component instanceof Resource) {
+                componentsUtils.auditResource(responseFormat, user, (Resource)component, AuditingActionEnum.CREATE_RESOURCE);
+            }
             return Either.right(responseFormat);
         }
         return toscaYamlCsarStatus;
     }
 
-    private Map<String, byte[]> getCsar(Resource resource, User user, Map<String, byte[]> payload, String csarUUID) {
+    private Map<String, byte[]> getCsar(Component component, User user, Map<String, byte[]> payload, String csarUUID) {
         if (payload != null) {
             return payload;
         }
@@ -176,7 +220,11 @@ public class CsarBusinessLogic extends BaseBusinessLogic {
                     .logBeDaoSystemError(CREATING_RESOURCE_FROM_CSAR_FETCHING_CSAR_WITH_ID + csarUUID + FAILED);
             ResponseFormat responseFormat = componentsUtils
                     .getResponseFormat(componentsUtils.convertFromStorageResponse(value), csarUUID);
-            componentsUtils.auditResource(responseFormat, user, resource, AuditingActionEnum.CREATE_RESOURCE);
+            if(component instanceof Resource){
+                Resource newResource = (Resource) component;
+                componentsUtils.auditResource(responseFormat, user, newResource, AuditingActionEnum.CREATE_RESOURCE);
+            }
+
             throw new StorageException(csar.right().value());
         }
         return csar.left().value();
@@ -187,4 +235,44 @@ public class CsarBusinessLogic extends BaseBusinessLogic {
         componentsUtils.auditResource(errorResponse, user, resource, auditingAction);
         throw new ByResponseFormatComponentException(errorResponse, params);
     }
+
+    private Map<String, byte[]> getCsar(User user, Map<String, byte[]> payload, String csarUUID) {
+        if (payload != null) {
+            return payload;
+        }
+        Either<Map<String, byte[]>, StorageOperationStatus> csar = csarOperation.getCsar(csarUUID, user);
+        if (csar.isRight()) {
+            StorageOperationStatus value = csar.right().value();
+            log.debug("#getCsar - failed to fetch csar with ID {}, error: {}", csarUUID, value);
+            throw new StorageException(value);
+        }
+        return csar.left().value();
+    }
+
+    private Either<ImmutablePair<String, String>, ResponseFormat> validateAndParseCsar(Service service, User user,
+        Map<String, byte[]> payload, String csarUUID) {
+        Map<String, byte[]> csar = getCsar(service, user, payload, csarUUID);
+        Either<Boolean, ResponseFormat> validateCsarStatus = CsarValidationUtils.validateCsar(csar,
+            csarUUID, componentsUtils);
+        if (validateCsarStatus.isRight()) {
+            ResponseFormat responseFormat = validateCsarStatus.right().value();
+            log.debug("Error when validate csar with ID {}, error: {}", csarUUID, responseFormat);
+            BeEcompErrorManager.getInstance()
+                .logBeDaoSystemError(CREATING_RESOURCE_FROM_CSAR_FETCHING_CSAR_WITH_ID + csarUUID + FAILED);
+
+            return Either.right(responseFormat);
+        }
+
+        Either<ImmutablePair<String, String>, ResponseFormat> toscaYamlCsarStatus = CsarValidationUtils
+            .getToscaYaml(csar, csarUUID, componentsUtils);
+
+        if (toscaYamlCsarStatus.isRight()) {
+            ResponseFormat responseFormat = toscaYamlCsarStatus.right().value();
+            log.debug("Error when try to get csar toscayamlFile with csar ID {}, error: {}", csarUUID, responseFormat);
+            BeEcompErrorManager.getInstance()
+                .logBeDaoSystemError(CREATING_RESOURCE_FROM_CSAR_FETCHING_CSAR_WITH_ID + csarUUID + FAILED);
+            return Either.right(responseFormat);
+        }
+        return toscaYamlCsarStatus;
+    }
 }
index 41dc3a6..9636885 100644 (file)
@@ -54,6 +54,7 @@ import org.openecomp.sdc.be.model.NodeTypeInfo;
 import org.openecomp.sdc.be.model.ParsedToscaYamlInfo;
 import org.openecomp.sdc.be.model.PolicyDefinition;
 import org.openecomp.sdc.be.model.PolicyTypeDefinition;
+import org.openecomp.sdc.be.model.Resource;
 import org.openecomp.sdc.be.model.UploadArtifactInfo;
 import org.openecomp.sdc.be.model.UploadCapInfo;
 import org.openecomp.sdc.be.model.UploadComponentInstanceInfo;
@@ -129,7 +130,7 @@ public class YamlTemplateParsingHandler {
     }
 
     public ParsedToscaYamlInfo parseResourceInfoFromYAML(String fileName, String resourceYml, Map<String, String> createdNodesToscaResourceNames,
-                                                         Map<String, NodeTypeInfo> nodeTypesInfo, String nodeName) {
+                                                         Map<String, NodeTypeInfo> nodeTypesInfo, String nodeName, org.openecomp.sdc.be.model.Component component) {
         log.debug("#parseResourceInfoFromYAML - Going to parse yaml {} ", fileName);
         Map<String, Object> mappedToscaTemplate = getMappedToscaTemplate(fileName, resourceYml, nodeTypesInfo, nodeName);
         ParsedToscaYamlInfo parsedToscaYamlInfo = new ParsedToscaYamlInfo();
@@ -140,7 +141,9 @@ public class YamlTemplateParsingHandler {
         parsedToscaYamlInfo.setInputs(getInputs(mappedToscaTemplate));
         parsedToscaYamlInfo.setInstances(getInstances(fileName, mappedToscaTemplate, createdNodesToscaResourceNames));
         parsedToscaYamlInfo.setGroups(getGroups(fileName, mappedToscaTemplate));
-        parsedToscaYamlInfo.setPolicies(getPolicies(fileName, mappedToscaTemplate));
+        if(component instanceof Resource){
+            parsedToscaYamlInfo.setPolicies(getPolicies(fileName, mappedToscaTemplate));
+        }
         log.debug("#parseResourceInfoFromYAML - The yaml {} has been parsed ", fileName);
         return parsedToscaYamlInfo;
     }
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/AbstractTemplateBusinessLogic.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/AbstractTemplateBusinessLogic.java
new file mode 100644 (file)
index 0000000..95422f4
--- /dev/null
@@ -0,0 +1,187 @@
+/*
+ * Copyright (C) 2020 CMCC, Inc. and others. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.openecomp.sdc.be.components.impl;
+
+import fj.data.Either;
+import org.apache.commons.lang3.tuple.ImmutablePair;
+import org.openecomp.sdc.be.components.validation.ServiceDistributionValidation;
+import org.openecomp.sdc.be.dao.janusgraph.JanusGraphOperationStatus;
+import org.openecomp.sdc.be.externalapi.servlet.representation.AbstractResourceInfo;
+import org.openecomp.sdc.be.externalapi.servlet.representation.AbstractTemplateInfo;
+import org.openecomp.sdc.be.model.*;
+import org.openecomp.sdc.be.model.category.CategoryDefinition;
+import org.openecomp.sdc.be.model.category.SubCategoryDefinition;
+import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ArtifactsOperations;
+import org.openecomp.sdc.be.model.jsonjanusgraph.operations.InterfaceOperation;
+import org.openecomp.sdc.be.model.operations.api.*;
+import org.openecomp.sdc.be.model.operations.impl.DaoStatusConverter;
+import org.openecomp.sdc.be.model.operations.impl.InterfaceLifecycleOperation;
+import org.openecomp.sdc.common.log.wrappers.Logger;
+import org.openecomp.sdc.exception.ResponseFormat;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+
+@org.springframework.stereotype.Component("abstractTemplateBusinessLogic")
+public class AbstractTemplateBusinessLogic extends BaseBusinessLogic {
+
+    private static final String INITIAL_VERSION = "0.1";
+
+    private static final Logger log = Logger.getLogger(AbstractTemplateBusinessLogic.class);
+
+    @Autowired
+    ServiceDistributionValidation serviceDistributionValidation;
+
+    @Autowired
+    protected ServiceImportManager serviceImportManager;
+
+    @Autowired
+    protected ServiceBusinessLogic serviceBusinessLogic;
+
+    @Autowired
+    public AbstractTemplateBusinessLogic(IElementOperation elementDao, IGroupOperation groupOperation,
+                                         IGroupInstanceOperation groupInstanceOperation, IGroupTypeOperation groupTypeOperation,
+                                         InterfaceOperation interfaceOperation,
+                                         InterfaceLifecycleOperation interfaceLifecycleTypeOperation, ArtifactsOperations artifactToscaOperation) {
+        super(elementDao, groupOperation, groupInstanceOperation, groupTypeOperation,
+                interfaceOperation, interfaceLifecycleTypeOperation, artifactToscaOperation);
+    }
+
+    public Either<AbstractTemplateInfo, ResponseFormat> getServiceAbstractStatus(List<? extends Component> componentList) {
+        AbstractTemplateInfo abstractTemplateInfo = new AbstractTemplateInfo();
+        if (componentList == null || componentList.isEmpty()) {
+            return Either.left(abstractTemplateInfo);
+        }
+
+        for (Component curr : componentList) {
+            Service service = (Service) curr;
+            List<ComponentInstance> componentInstances = service.getComponentInstances();
+            List<RequirementCapabilityRelDef> componentInstancesRelations = service.getComponentInstancesRelations();
+            abstractTemplateInfo.setServiceUniqueId(service.getUniqueId());
+            String serviceUniqueId = abstractTemplateInfo.getServiceUniqueId();
+            Either<Boolean, ResponseFormat> isAbstractResourceData = getEveryServiceAbstractStatus(componentInstances, abstractTemplateInfo, componentInstancesRelations, serviceUniqueId);
+            if (isAbstractResourceData.isRight()) {
+                return Either.right(isAbstractResourceData.right().value());
+            }
+        }
+
+        return Either.left(abstractTemplateInfo);
+    }
+
+    private Either<Boolean, ResponseFormat> getEveryServiceAbstractStatus(List<ComponentInstance> componentInstances, AbstractTemplateInfo abstractTemplateInfo,
+                                                                          List<RequirementCapabilityRelDef> componentInstancesRelations, String serviceUniqueId) {
+        Map<String, ImmutablePair<String, String>> uuidDuplicatesMap = new HashMap<>();
+        List<AbstractResourceInfo> abstractResourceInfoList = new ArrayList<>();
+        Boolean isContainAbstractResource = false;
+
+        for (ComponentInstance componentInstance : componentInstances) {
+            String componentUid = componentInstance.getComponentUid();
+            String invariantUUID, resourceUUID;
+            if (!uuidDuplicatesMap.containsKey(componentUid)) {
+                Either<Resource, StorageOperationStatus> eitherResource = toscaOperationFacade
+                        .getToscaElement(componentInstance.getComponentUid());
+                if (eitherResource.isRight()) {
+                    log.debug("getEveryServiceAbstractStatus: Failed getting resource with UUid: {}",
+                            componentInstance.getComponentUid());
+                    ResponseFormat responseFormat = componentsUtils.getResponseFormat(eitherResource.right().value());
+                    return Either.right(responseFormat);
+                } else {
+                    final Resource resource = eitherResource.left().value();
+                    invariantUUID = resource.getInvariantUUID();
+                    resourceUUID = resource.getUUID();
+                    ImmutablePair<String, String> uuidInvariantUUIDPair = new ImmutablePair<>(resourceUUID,
+                            invariantUUID);
+                    uuidDuplicatesMap.put(componentUid, uuidInvariantUUIDPair);
+
+                    Either<List<AbstractResourceInfo>, ResponseFormat> abstractResourceEither = getAbstractResourceInfoList(resource, componentInstancesRelations, serviceUniqueId);
+                    if (abstractResourceEither.isRight()) {
+                        return Either.right(abstractResourceEither.right().value());
+                    }
+                    abstractResourceInfoList = abstractResourceEither.left().value();
+                    isContainAbstractResource = true;
+                }
+            }
+        }
+        abstractTemplateInfo.setIsAbstractTemplate(isContainAbstractResource);
+        abstractTemplateInfo.setAbstractResourceInfoList(abstractResourceInfoList);
+        return Either.left(isContainAbstractResource);
+    }
+
+    private Either<List<AbstractResourceInfo>, ResponseFormat> getAbstractResourceInfoList(Resource resource, List<RequirementCapabilityRelDef> componentInstancesRelations, String serviceUniqueId) {
+        List<AbstractResourceInfo> abstractResourceInfoList = new ArrayList<>();
+        boolean isAbstract = getIsAbstract(resource.getCategories());
+        log.debug("before if isAbstract,get resource:{}", resource);
+        if (!isAbstract) {
+            log.debug("getAbstractResourceInfoList:Resource is not Abstract");
+            ResponseFormat responseFormat = componentsUtils.getResponseFormat(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(JanusGraphOperationStatus.NOT_FOUND));
+            return Either.right(responseFormat);
+        }
+        log.debug("getAbstractResourceInfoList:Resource is Abstract");
+
+        AbstractResourceInfo abstractResourceInfo = getAbstractResourceInfo(resource, componentInstancesRelations, serviceUniqueId);
+        abstractResourceInfoList.add(abstractResourceInfo);
+        return Either.left(abstractResourceInfoList);
+    }
+
+    private AbstractResourceInfo getAbstractResourceInfo(Resource resource,List<RequirementCapabilityRelDef> componentInstancesRelations,String serviceUniqueId){
+        AbstractResourceInfo abstractResourceInfo = new AbstractResourceInfo();
+        abstractResourceInfo.setAbstractResourceUUid(resource.getUUID());
+        abstractResourceInfo.setAbstractResourceName(resource.getName());
+        abstractResourceInfo.setAbstractResourceUniqueId(resource.getUniqueId());
+        String uniqueId = serviceUniqueId + "." + resource.getUniqueId() + "." + resource.getNormalizedName();
+
+        List<RequirementCapabilityRelDef> resourceComponentInstancesRelations = new ArrayList<>();
+        log.debug("get serviceUniqueId:{},get UniqueId:{},get NormalizedName:{}",
+                serviceUniqueId, resource.getUniqueId(), resource.getNormalizedName());
+        log.debug("get is Abstract,componentInstancesRelations:{}", componentInstancesRelations);
+        for (RequirementCapabilityRelDef componentInstancesRelation : componentInstancesRelations) {
+            log.debug("for componentInstancesRelation,get componentInstancesRelation:{}", componentInstancesRelation);
+            String fromNode = componentInstancesRelation.getFromNode();
+            log.debug("for componentInstancesRelation,get fromNode:{},uniqueId:{}", fromNode,uniqueId);
+            if (fromNode.toUpperCase().contains(uniqueId.toUpperCase())) {
+                RequirementCapabilityRelDef resourceComponentInstancesRelation = new RequirementCapabilityRelDef();
+                log.debug("fromNode contains name,get componentInstancesRelation:{}", componentInstancesRelation);
+                resourceComponentInstancesRelation.setFromNode(componentInstancesRelation.getFromNode());
+                resourceComponentInstancesRelation.setOriginUI(componentInstancesRelation.isOriginUI());
+                resourceComponentInstancesRelation.setRelationships(componentInstancesRelation.getRelationships());
+                resourceComponentInstancesRelation.setToNode(componentInstancesRelation.getToNode());
+                resourceComponentInstancesRelation.setUid(componentInstancesRelation.getUid());
+                resourceComponentInstancesRelations.add(resourceComponentInstancesRelation);
+            }
+        }
+        abstractResourceInfo.setComponentInstancesRelations(resourceComponentInstancesRelations);
+        return abstractResourceInfo;
+    }
+
+    private boolean getIsAbstract(List<CategoryDefinition> categories) {
+        boolean anAbstract = false;
+        if (categories != null && !categories.isEmpty()) {
+            CategoryDefinition categoryDef = categories.get(0);
+            if (categoryDef != null && categoryDef.getName() != null && categoryDef.getName()
+                    .equals(ImportUtils.Constants.ABSTRACT_CATEGORY_NAME)) {
+                SubCategoryDefinition subCategoryDef = categoryDef.getSubcategories().get(0);
+                if (subCategoryDef != null && subCategoryDef.getName().equals(ImportUtils.Constants.ABSTRACT_SUBCATEGORY)) {
+                    anAbstract = true;
+                }
+            }
+        }
+        return anAbstract;
+    }
+}
index cac36cb..c9e0a44 100644 (file)
@@ -4491,7 +4491,7 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
         return uploadedArtifacts;
     }
 
-    public Either<ArtifactDefinition, Operation> handleLoadedArtifact(Resource component, User user, ArtifactOperationInfo operation, boolean shouldLock, boolean inTransaction,
+    public Either<ArtifactDefinition, Operation> handleLoadedArtifact(Component component, User user, ArtifactOperationInfo operation, boolean shouldLock, boolean inTransaction,
                                                                       ComponentTypeEnum componentType, ArtifactDefinition artifactDefinition) {
         AuditingActionEnum auditingAction = detectAuditingType(operation, "");
         String componentId = component.getUniqueId();
index ba1500c..34236eb 100644 (file)
@@ -296,6 +296,39 @@ public abstract class ComponentBusinessLogic extends BaseBusinessLogic {
         return Either.left(result);
     }
 
+    protected void validateIcon(User user, Component component, AuditingActionEnum actionEnum) {
+        log.debug("validate Icon");
+        ComponentTypeEnum type = component.getComponentType();
+        String icon = component.getIcon();
+        if (!ValidationUtils.validateStringNotEmpty(icon)) {
+            log.info("icon is missing.");
+            ResponseFormat errorResponse = componentsUtils.getResponseFormat(ActionStatus.COMPONENT_MISSING_ICON, type.getValue());
+            componentsUtils.auditComponentAdmin(errorResponse, user, component, actionEnum, type);
+            throw new ComponentException(ActionStatus.COMPONENT_MISSING_ICON, type.getValue());
+        }
+        try {
+            validateIcon(icon, type);
+        } catch(ComponentException e){
+            ResponseFormat responseFormat = e.getResponseFormat() != null ? e.getResponseFormat()
+                    : componentsUtils.getResponseFormat(e.getActionStatus(), e.getParams());
+            componentsUtils.auditComponentAdmin(responseFormat, user, component, actionEnum, type);
+            throw e;
+        }
+    }
+
+    private void validateIcon(String icon, ComponentTypeEnum type) {
+        if (icon != null) {
+            if (!ValidationUtils.validateIconLength(icon)) {
+                log.debug("icon exceeds max length");
+                throw new ComponentException(ActionStatus.COMPONENT_ICON_EXCEEDS_LIMIT, type.getValue(), "" + ValidationUtils.ICON_MAX_LENGTH);
+            }
+
+            if (!ValidationUtils.validateIcon(icon)) {
+                log.info("icon is invalid.");
+                throw new ComponentException(ActionStatus.COMPONENT_INVALID_ICON, type.getValue());
+            }
+        }
+    }
 
     protected void checkComponentFieldsForOverrideAttempt(Component component) {
         if (component.getLifecycleState() != null) {
@@ -331,6 +364,24 @@ public abstract class ComponentBusinessLogic extends BaseBusinessLogic {
         }
     }
 
+    protected void validateComponentFieldsBeforeCreate(User user, Component component, AuditingActionEnum actionEnum) {
+        // validate component name uniqueness
+        log.debug("validate component name ");
+        componentNameValidator.validateAndCorrectField(user, component, actionEnum);
+        // validate description
+        log.debug("validate description");
+        componentDescriptionValidator.validateAndCorrectField(user, component, actionEnum);
+        // validate tags
+        log.debug("validate tags");
+        componentTagsValidator.validateAndCorrectField(user, component, actionEnum);
+        // validate contact info
+        log.debug("validate contact info");
+        componentContactIdValidator.validateAndCorrectField(user, component, actionEnum);
+        // validate icon
+        log.debug("validate icon");
+        validateIcon(user, component, actionEnum);
+    }
+       
     public CapReqDef getRequirementsAndCapabilities(String componentId, ComponentTypeEnum componentTypeEnum, String userId) {
 
         validateUserExists(userId);
index e7d8dd5..ffccc97 100644 (file)
@@ -421,6 +421,138 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
         }
     }
 
+    /**
+     * Try using either to make a judgment
+     * @param containerComponentParam
+     * @param containerComponentId
+     * @param userId
+     * @param resourceInstance
+     * @return
+     */
+
+    public Either<ComponentInstance, ResponseFormat> createRealComponentInstance(String containerComponentParam, String containerComponentId, String userId, ComponentInstance resourceInstance) {
+        log.debug("enter createRealComponentInstance");
+        return createRealComponentInstance(containerComponentParam, containerComponentId, userId, resourceInstance, false, true);
+    }
+    /**
+     * Try using either to make a judgment
+     *
+     * @param inTransaction
+     * @param needLock
+     * @param containerComponentParam
+     * @param containerComponentId
+     * @param userId
+     * @param resourceInstance
+     * @return
+     */
+    public Either<ComponentInstance, ResponseFormat> createRealComponentInstance(String containerComponentParam, String containerComponentId, String userId, ComponentInstance resourceInstance, boolean inTransaction, boolean needLock) {
+
+        log.debug("enter createRealComponentInstance");
+        Component origComponent = null;
+        User user;
+        org.openecomp.sdc.be.model.Component containerComponent = null;
+        ComponentTypeEnum containerComponentType;
+        try {
+            user = validateUserExists(userId);
+            validateUserNotEmpty(user, "Create component instance");
+            validateJsonBody(resourceInstance, ComponentInstance.class);
+            containerComponentType = validateComponentType(containerComponentParam);
+            containerComponent = validateComponentExists(containerComponentId, containerComponentType, null);
+
+            log.debug("enter createRealComponentInstance,validate user json success");
+            if (ModelConverter.isAtomicComponent(containerComponent)) {
+                log.debug("Cannot attach resource instances to container resource of type {}", containerComponent.assetType());
+                throw new ByActionStatusComponentException(ActionStatus.RESOURCE_CANNOT_CONTAIN_RESOURCE_INSTANCES, containerComponent.assetType());
+            }
+
+            validateCanWorkOnComponent(containerComponent, userId);
+            log.debug("enter createRealComponentInstance,validateCanWorkOnComponent success");
+
+            if (resourceInstance != null && containerComponentType != null) {
+                log.debug("enter createRealComponentInstance,start create ComponentInstance");
+                OriginTypeEnum originType = resourceInstance.getOriginType();
+                validateInstanceName(resourceInstance);
+                if (originType == OriginTypeEnum.ServiceProxy) {
+
+                    log.debug("enter createRealComponentInstance,originType equals ServiceProxy");
+                    Either<Component, StorageOperationStatus> serviceProxyOrigin = toscaOperationFacade.getLatestByName("serviceProxy");
+                    if (isServiceProxyOrigin(serviceProxyOrigin)) {
+                        throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(serviceProxyOrigin.right().value()));
+                    }
+                    origComponent = serviceProxyOrigin.left().value();
+
+                    StorageOperationStatus fillProxyRes = fillInstanceData(resourceInstance, origComponent);
+                    if (isFillProxyRes(fillProxyRes)) {
+                        throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(fillProxyRes));
+                    }
+                } else {
+                    log.debug("enter createRealComponentInstance,originType is not ServiceProxy");
+                    origComponent = getAndValidateOriginComponentOfComponentInstance(containerComponent, resourceInstance);
+                }
+                validateOriginAndResourceInstanceTypes(containerComponent, origComponent, originType);
+                validateResourceInstanceState(containerComponent, origComponent);
+                overrideFields(origComponent, resourceInstance);
+                compositionBusinessLogic.validateAndSetDefaultCoordinates(resourceInstance);
+                log.debug("enter createRealComponentInstance,final validate success");
+            }
+            return createRealComponent(needLock, containerComponent, origComponent, resourceInstance, user);
+
+        } catch (ComponentException e) {
+            log.debug("create Real Component Instance failed");
+            throw e;
+        }
+    }
+
+    private Either<ComponentInstance, ResponseFormat> createRealComponent(boolean needLock, Component containerComponent, Component origComponent, ComponentInstance resourceInstance, User user) {
+
+        log.debug("enter createRealComponent");
+        boolean failed = false;
+        try {
+
+            ComponentInstance lockComponent = isNeedLock(needLock, containerComponent);
+            if (lockComponent != null) {
+                return Either.left(lockComponent);
+            }
+            log.debug(TRY_TO_CREATE_ENTRY_ON_GRAPH);
+            return createRealComponentInstanceOnGraph(containerComponent, origComponent, resourceInstance, user);
+        } catch (ComponentException e) {
+            failed = true;
+            throw e;
+        } finally {
+            if (needLock)
+                unlockComponent(failed, containerComponent);
+        }
+    }
+
+    private Either<ComponentInstance, ResponseFormat> createRealComponentInstanceOnGraph(org.openecomp.sdc.be.model.Component containerComponent, Component originComponent, ComponentInstance componentInstance, User user) {
+        Either<ComponentInstance, ResponseFormat> resultOp;
+        log.debug("enter createRealComponentInstanceOnGraph");
+
+        Either<ImmutablePair<Component, String>, StorageOperationStatus> result = toscaOperationFacade.addComponentInstanceToTopologyTemplate(containerComponent, originComponent, componentInstance, false, user);
+
+        if (result.isRight()) {
+            log.debug("enter createRealComponentInstanceOnGraph,result is right");
+            ActionStatus status = componentsUtils.convertFromStorageResponse(result.right().value());
+            log.debug(FAILED_TO_CREATE_ENTRY_ON_GRAPH_FOR_COMPONENT_INSTANCE, componentInstance.getName());
+            return Either.right(componentsUtils.getResponseFormat(status));
+        }
+
+        log.debug(ENTITY_ON_GRAPH_IS_CREATED);
+        log.debug("enter createRealComponentInstanceOnGraph,Entity on graph is created.");
+        Component updatedComponent = result.left().value().getLeft();
+        Map<String, String> existingEnvVersions = new HashMap<>();
+        // TODO existingEnvVersions ??
+        addComponentInstanceArtifacts(updatedComponent, componentInstance, originComponent, user, existingEnvVersions);
+
+        Optional<ComponentInstance> updatedInstanceOptional = updatedComponent.getComponentInstances().stream().filter(ci -> ci.getUniqueId().equals(result.left().value().getRight())).findFirst();
+        if (!updatedInstanceOptional.isPresent()) {
+            log.debug("Failed to fetch new added component instance {} from component {}", componentInstance.getName(), containerComponent.getName());
+            throw new ByActionStatusComponentException(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND_ON_CONTAINER, componentInstance.getName());
+        }
+        log.debug("enter createRealComponentInstanceOnGraph,and final success");
+        return Either.left(updatedInstanceOptional.get());
+    }
+
     private void overrideFields(Component origComponent, ComponentInstance resourceInstance) {
         resourceInstance.setComponentVersion(origComponent.getVersion());
         resourceInstance.setIcon(origComponent.getIcon());
@@ -1158,6 +1290,67 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
         }
         return componentInstance;
     }
+       
+        /**
+     * Try to modify the delete and return two cases
+     *
+     * @param containerComponentParam
+     * @param containerComponentId
+     * @param componentInstanceId
+     * @param userId
+     * @return
+     */
+    public Either<ComponentInstance, ResponseFormat> deleteAbstractComponentInstance(String containerComponentParam, String containerComponentId, String componentInstanceId, String userId) {
+        log.debug("enter deleteAbstractComponentInstance");
+        validateUserExists(userId);
+
+        final ComponentTypeEnum containerComponentType = validateComponentType(containerComponentParam);
+
+        org.openecomp.sdc.be.model.Component containerComponent = validateComponentExists(containerComponentId, containerComponentType, null);
+        validateCanWorkOnComponent(containerComponent, userId);
+
+        boolean failed = false;
+        ComponentInstance deletedRelatedInst;
+        try {
+            if (containerComponent instanceof Service) {
+                ComponentInstance componentInstance = containerComponent.getComponentInstanceById(componentInstanceId).get();
+                Either<String, StorageOperationStatus> deleteServiceFilterEither =
+                    nodeFilterOperation.deleteNodeFilter((Service) containerComponent, componentInstanceId);
+                if (deleteServiceFilterEither.isRight()) {
+                    log.debug("enter deleteAbstractComponentInstance:deleteServiceFilterEither is right, filed");
+                    ActionStatus status = componentsUtils.convertFromStorageResponse(deleteServiceFilterEither.right().value(),
+                            containerComponentType);
+                    janusGraphDao.rollback();
+                   return Either.right(componentsUtils.getResponseFormat(status, componentInstance.getName()));
+                }
+                Either<ComponentInstance, ResponseFormat> resultOp = deleteNodeFiltersFromComponentInstance((Service) containerComponent,
+                        componentInstance, ComponentTypeEnum.SERVICE, userId);
+                if (resultOp.isRight()) {
+                    log.debug("enter deleteAbstractComponentInstance:resultOp is right, filed");
+                    janusGraphDao.rollback();
+                    return resultOp;
+                }
+            }
+            log.debug("enter deleteAbstractComponentInstance:");
+            lockComponent(containerComponent, "deleteComponentInstance");
+            ComponentInstance deletedCompInstance = deleteComponentInstance(containerComponent, componentInstanceId, containerComponentType);
+
+            deletedRelatedInst = deleteForwardingPathsRelatedTobeDeletedComponentInstance(containerComponentId,
+                    containerComponentType, deletedCompInstance);
+            ActionStatus onDeleteOperationsStatus = onChangeInstanceOperationOrchestrator.doOnDeleteInstanceOperations(containerComponent, componentInstanceId);
+            log.debug("enter deleteAbstractComponentInstance,get onDeleteOperationsStatus:{}",onDeleteOperationsStatus);
+            if (ActionStatus.OK != onDeleteOperationsStatus) {
+                throw new ByActionStatusComponentException(onDeleteOperationsStatus);
+            }
+        } catch (ComponentException e) {
+            failed = true;
+            throw e;
+        } finally {
+            unlockComponent(failed, containerComponent);
+        }
+        log.debug("enter deleteAbstractComponentInstance,deleted RelatedInst success");
+        return Either.left(deletedRelatedInst);
+    }
 
     public Either<ComponentInstance, ResponseFormat> deleteNodeFiltersFromComponentInstance(
         final Component component,
index 0790c4b..20e796e 100644 (file)
@@ -29,6 +29,7 @@ import org.openecomp.sdc.be.datatypes.enums.OriginTypeEnum;
 import org.openecomp.sdc.be.model.ComponentInstance;
 import org.openecomp.sdc.be.model.RequirementCapabilityRelDef;
 import org.openecomp.sdc.be.model.Resource;
+import org.openecomp.sdc.be.model.Service;
 import org.openecomp.sdc.common.log.wrappers.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
@@ -83,6 +84,20 @@ public class CompositionBusinessLogic {
                     userId, resource.getComponentInstances(), false);
         }
     }
+       
+    protected void setPositionsForComponentInstances(Service service, String userId) {
+        boolean isNotAllPositionsCalculated = service.getComponentInstances() == null
+                                                      || service.getComponentInstances().stream().anyMatch(p -> (p.getPosX() == null || p.getPosX().isEmpty()) || (p.getPosY() == null || p.getPosY().isEmpty()));
+        if (isNotAllPositionsCalculated &&  service.getComponentInstances() != null) {
+            // Arrange Icons In Spiral Pattern
+            Map<ImmutablePair<Double, Double>, ComponentInstance> componentInstanceLocations = buildSpiralPatternPositioningForComponentInstances(service);
+            // Set Relative Locations According to Canvas Size
+            componentInstanceLocations.entrySet().forEach(this::setRelativePosition);
+            // Update in DB
+            componentInstanceBusinessLogic.updateComponentInstance(ComponentTypeEnum.SERVICE_PARAM_NAME, service, service.getUniqueId(),
+                    userId, service.getComponentInstances(), false);
+        }
+    }
 
     private void setRelativePosition(Entry<ImmutablePair<Double, Double>, ComponentInstance> entry) {
         int xCenter = CANVAS_WIDTH / 2;
@@ -120,13 +135,23 @@ public class CompositionBusinessLogic {
         return String.valueOf(offsetedCanvasPosition);
     }
 
-    protected Map<ImmutablePair<Double, Double>, ComponentInstance> buildSpiralPatternPositioningForComponentInstances(Resource resource) {
+    protected Map<ImmutablePair<Double, Double>, ComponentInstance> buildSpiralPatternPositioningForComponentInstances(
+            org.openecomp.sdc.be.model.Component component) {
 
         Map<ImmutablePair<Double, Double>, ComponentInstance> componentInstanceLocations = new HashMap<>();
 
         List<ComponentInstance> componentInstances = new ArrayList<>();
-        componentInstances.addAll(resource.getComponentInstances());
-        Map<ComponentInstance, List<ComponentInstance>> connectededCps = getCpsConnectedToVFC(componentInstances, resource);
+        if (component instanceof Resource){
+            Resource resource = (Resource) component;
+            List<ComponentInstance> componentInstanceList = resource.getComponentInstances();
+            componentInstances.addAll(componentInstanceList);
+        }else if (component instanceof Service){
+            Service service = (Service) component;
+            List<ComponentInstance> componentInstanceList = service.getComponentInstances();
+            componentInstances.addAll(componentInstanceList);
+        }
+
+        Map<ComponentInstance, List<ComponentInstance>> connectededCps = getCpsConnectedToVFC(componentInstances, component);
         // Remove all cp that are connected from the list
         componentInstances.removeAll(connectededCps.values().stream().flatMap(Collection::stream).collect(Collectors.toList()));
 
@@ -186,9 +211,17 @@ public class CompositionBusinessLogic {
         }
     }
 
-    protected Map<ComponentInstance, List<ComponentInstance>> getCpsConnectedToVFC(List<ComponentInstance> allComponentInstances, Resource vf) {
+    protected Map<ComponentInstance, List<ComponentInstance>> getCpsConnectedToVFC(List<ComponentInstance> allComponentInstances, org.openecomp.sdc.be.model.Component component) {
         Map<ComponentInstance, List<ComponentInstance>> vfcWithItsCps = new HashMap<>();
-        List<RequirementCapabilityRelDef> allRelations = vf.getComponentInstancesRelations();
+        List<RequirementCapabilityRelDef> allRelations = new ArrayList<>();
+        if (component instanceof Resource){
+            Resource vf = (Resource) component;
+            allRelations = vf.getComponentInstancesRelations();
+        }else if (component instanceof Service){
+            Service sv = (Service) component;
+            allRelations = sv.getComponentInstancesRelations();
+        }
+
         for (ComponentInstance curr : allComponentInstances) {
             // Filters Only CPs
             if (curr.getOriginType() == OriginTypeEnum.CP) {
index 4db44d3..f04eca1 100644 (file)
@@ -182,6 +182,7 @@ public final class ImportUtils {
         public static final String CVFC_DESCRIPTION = "Complex node type that is used as nested type in VF";
         public static final String ESCAPED_DOUBLE_QUOTE = "\"";
         public static final String QUOTE = "'";
+        public static final String VF_DESCRIPTION = "Nested VF in service";
 
         private Constants() {
         }
index ffac13b..50b2941 100644 (file)
@@ -603,7 +603,7 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
                ParsedToscaYamlInfo uploadComponentInstanceInfoMap;
                try {
                        uploadComponentInstanceInfoMap = csarBusinessLogic.getParsedToscaYamlInfo(yamlFileContent, yamlFileName,
-                                       nodeTypesInfo, csarInfo, nodeName);
+                                       nodeTypesInfo, csarInfo, nodeName, oldResource);
                        Map<String, UploadComponentInstanceInfo> instances = uploadComponentInstanceInfoMap.getInstances();
             if (MapUtils.isEmpty(instances) && newResource.getResourceType() != ResourceTypeEnum.PNF) {
                 throw new ByActionStatusComponentException(ActionStatus.NOT_TOPOLOGY_TOSCA_TEMPLATE, yamlFileName);
@@ -1193,7 +1193,7 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
                List<ArtifactDefinition> createdArtifacts = new ArrayList<>();
                Resource createdResource;
                try {
-            ParsedToscaYamlInfo parsedToscaYamlInfo = csarBusinessLogic.getParsedToscaYamlInfo(topologyTemplateYaml, yamlName, nodeTypesInfo, csarInfo, nodeName);
+            ParsedToscaYamlInfo parsedToscaYamlInfo = csarBusinessLogic.getParsedToscaYamlInfo(topologyTemplateYaml, yamlName, nodeTypesInfo, csarInfo, nodeName, resource);
             if (MapUtils.isEmpty(parsedToscaYamlInfo.getInstances()) && resource.getResourceType() != ResourceTypeEnum.PNF) {
                 throw new ByActionStatusComponentException(ActionStatus.NOT_TOPOLOGY_TOSCA_TEMPLATE, yamlName);
             }
@@ -2317,9 +2317,15 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
                                        createArtifactsFromCsar = csarArtifactsAndGroupsBusinessLogic.createResourceArtifactsFromCsar(
                                                        csarInfo, resource, artifactsContents, artifactsFileName, createdArtifacts);
                                } else {
-                                       createArtifactsFromCsar = csarArtifactsAndGroupsBusinessLogic.updateResourceArtifactsFromCsar(
+                                       Either<Component, ResponseFormat> result  = csarArtifactsAndGroupsBusinessLogic.updateResourceArtifactsFromCsar(
                                                        csarInfo, resource, artifactsContents, artifactsFileName, createdArtifacts, shouldLock,
                                                        inTransaction);
+                                       if ((result.left().value() instanceof Resource) && result.isLeft()) {
+                                               Resource service1 = (Resource) result.left().value();
+                                               createArtifactsFromCsar = Either.left(service1);
+                                       } else {
+                                               createArtifactsFromCsar = Either.right(result.right().value());
+                                       }
                                }
 
                                if (createArtifactsFromCsar.isRight()) {
index dbcaee4..4e6628c 100644 (file)
@@ -128,6 +128,16 @@ public class ResourceImportManager {
 
     private AuditingManager auditingManager;
     private ResourceBusinessLogic resourceBusinessLogic;
+    public ServiceBusinessLogic getServiceBusinessLogic() {
+        return serviceBusinessLogic;
+    }
+
+    public void setServiceBusinessLogic(ServiceBusinessLogic serviceBusinessLogic) {
+        this.serviceBusinessLogic = serviceBusinessLogic;
+    }
+
+    @Autowired
+    private ServiceBusinessLogic serviceBusinessLogic;
     private InterfaceOperationBusinessLogic interfaceOperationBusinessLogic;
 
     private IGraphLockOperation graphLockOperation;
index 552fbb0..a38ffe9 100644 (file)
@@ -179,6 +179,7 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic {
     private static final String STATUS_SUCCESS_200 = "200";
     private static final String STATUS_DEPLOYED = "DEPLOYED";
     static final String IS_VALID = "isValid";
+    private static final String PLACE_HOLDER_RESOURCE_TYPES = "validForResourceTypes";
 
     private ForwardingPathOperation forwardingPathOperation;
     private AuditCassandraDao auditCassandraDao;
@@ -2271,12 +2272,51 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic {
 
     @Override
     public void setDeploymentArtifactsPlaceHolder(Component component, User user) {
-        Service service = (Service) component;
-        Map<String, ArtifactDefinition> artifactMap = service.getDeploymentArtifacts();
-        if (artifactMap == null) {
-            artifactMap = new HashMap<>();
+        if(component instanceof Service){
+            Service service = (Service) component;
+            Map<String, ArtifactDefinition> artifactMap = service.getDeploymentArtifacts();
+            if (artifactMap == null) {
+                artifactMap = new HashMap<>();
+            }
+            service.setDeploymentArtifacts(artifactMap);
+        }else if(component instanceof Resource){
+            Resource resource = (Resource) component;
+            Map<String, ArtifactDefinition> artifactMap = resource.getDeploymentArtifacts();
+            if (artifactMap == null) {
+                artifactMap = new HashMap<>();
+            }
+            Map<String, Object> deploymentResourceArtifacts = ConfigurationManager.getConfigurationManager()
+                                                                      .getConfiguration().getDeploymentResourceArtifacts();
+            if (deploymentResourceArtifacts != null) {
+                Map<String, ArtifactDefinition> finalArtifactMap = artifactMap;
+                deploymentResourceArtifacts.forEach((k, v)->processDeploymentResourceArtifacts(user, resource, finalArtifactMap, k,v));
+            }
+            resource.setDeploymentArtifacts(artifactMap);
+        }
+
+    }
+
+    private void processDeploymentResourceArtifacts(User user, Resource resource, Map<String, ArtifactDefinition> artifactMap, String k, Object v) {
+        Map<String, Object> artifactDetails = (Map<String, Object>) v;
+        Object object = artifactDetails.get(PLACE_HOLDER_RESOURCE_TYPES);
+        if (object != null) {
+            List<String> artifactTypes = (List<String>) object;
+            if (!artifactTypes.contains(resource.getResourceType().name())) {
+                return;
+            }
+        } else {
+            log.info("resource types for artifact placeholder {} were not defined. default is all resources",
+                    k);
+        }
+        if (artifactsBusinessLogic != null) {
+            ArtifactDefinition artifactDefinition = artifactsBusinessLogic.createArtifactPlaceHolderInfo(
+                    resource.getUniqueId(), k, (Map<String, Object>) v,
+                    user, ArtifactGroupTypeEnum.DEPLOYMENT);
+            if (artifactDefinition != null
+                    && !artifactMap.containsKey(artifactDefinition.getArtifactLabel())) {
+                artifactMap.put(artifactDefinition.getArtifactLabel(), artifactDefinition);
+            }
         }
-        service.setDeploymentArtifacts(artifactMap);
     }
 
     @Override
@@ -2520,4 +2560,9 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic {
     public void setServiceCreationPluginList(List<ServiceCreationPlugin> serviceCreationPluginList) {
         this.serviceCreationPluginList = serviceCreationPluginList;
     }
+
+    public boolean isServiceExist(String serviceName) {
+        Either<Service, StorageOperationStatus> latestByName = toscaOperationFacade.getLatestByServiceName(serviceName);
+        return latestByName.isLeft();
+    }
 }
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ServiceImportBusinessLogic.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ServiceImportBusinessLogic.java
new file mode 100644 (file)
index 0000000..857c5e3
--- /dev/null
@@ -0,0 +1,3141 @@
+/*
+ * Copyright (C) 2020 CMCC, Inc. and others. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.openecomp.sdc.be.components.impl;
+
+import static java.util.stream.Collectors.joining;
+import static java.util.stream.Collectors.toList;
+import static java.util.stream.Collectors.toMap;
+import static org.apache.commons.collections.CollectionUtils.isNotEmpty;
+import static org.openecomp.sdc.be.components.impl.ImportUtils.findFirstToscaStringElement;
+import static org.openecomp.sdc.be.components.impl.ImportUtils.getPropertyJsonStringValue;
+import static org.openecomp.sdc.be.tosca.CsarUtils.VF_NODE_TYPE_ARTIFACTS_PATH_PATTERN;
+
+import fj.data.Either;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.EnumMap;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import java.util.regex.Pattern;
+
+import lombok.Getter;
+import lombok.Setter;
+import org.apache.commons.codec.binary.Base64;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.collections.MapUtils;
+import org.apache.commons.collections4.ListUtils;
+import org.apache.commons.lang3.tuple.ImmutablePair;
+import org.openecomp.sdc.be.components.csar.CsarArtifactsAndGroupsBusinessLogic;
+import org.openecomp.sdc.be.components.csar.CsarBusinessLogic;
+import org.openecomp.sdc.be.components.csar.CsarInfo;
+import org.openecomp.sdc.be.components.distribution.engine.IDistributionEngine;
+import org.openecomp.sdc.be.components.impl.ArtifactsBusinessLogic.ArtifactOperationEnum;
+import org.openecomp.sdc.be.components.impl.artifact.ArtifactOperationInfo;
+import org.openecomp.sdc.be.components.impl.exceptions.ByResponseFormatComponentException;
+import org.openecomp.sdc.be.components.impl.exceptions.ComponentException;
+import org.openecomp.sdc.be.components.impl.utils.CINodeFilterUtils;
+import org.openecomp.sdc.be.components.impl.utils.CreateServiceFromYamlParameter;
+import org.openecomp.sdc.be.components.lifecycle.LifecycleBusinessLogic;
+import org.openecomp.sdc.be.components.lifecycle.LifecycleChangeInfoWithAction;
+import org.openecomp.sdc.be.components.merge.resource.ResourceDataMergeBusinessLogic;
+import org.openecomp.sdc.be.components.path.ForwardingPathValidator;
+import org.openecomp.sdc.be.components.validation.NodeFilterValidator;
+import org.openecomp.sdc.be.components.validation.ServiceDistributionValidation;
+import org.openecomp.sdc.be.components.validation.component.ComponentContactIdValidator;
+import org.openecomp.sdc.be.components.validation.component.ComponentDescriptionValidator;
+import org.openecomp.sdc.be.components.validation.component.ComponentIconValidator;
+import org.openecomp.sdc.be.components.validation.component.ComponentNameValidator;
+import org.openecomp.sdc.be.components.validation.component.ComponentProjectCodeValidator;
+import org.openecomp.sdc.be.components.validation.component.ComponentTagsValidator;
+import org.openecomp.sdc.be.components.validation.component.ComponentValidator;
+import org.openecomp.sdc.be.config.BeEcompErrorManager;
+import org.openecomp.sdc.be.config.ConfigurationManager;
+import org.openecomp.sdc.be.dao.api.ActionStatus;
+import org.openecomp.sdc.be.dao.janusgraph.JanusGraphOperationStatus;
+import org.openecomp.sdc.be.dao.jsongraph.types.JsonParseFlagEnum;
+import org.openecomp.sdc.be.datamodel.utils.ArtifactUtils;
+import org.openecomp.sdc.be.datamodel.utils.UiComponentDataConverter;
+import org.openecomp.sdc.be.datatypes.elements.ArtifactDataDefinition;
+import org.openecomp.sdc.be.datatypes.elements.AttributeDataDefinition;
+import org.openecomp.sdc.be.datatypes.elements.CapabilityDataDefinition;
+import org.openecomp.sdc.be.datatypes.elements.GetInputValueDataDefinition;
+import org.openecomp.sdc.be.datatypes.elements.ListCapabilityDataDefinition;
+import org.openecomp.sdc.be.datatypes.elements.ListRequirementDataDefinition;
+import org.openecomp.sdc.be.datatypes.elements.PropertyDataDefinition;
+import org.openecomp.sdc.be.datatypes.elements.RequirementDataDefinition;
+import org.openecomp.sdc.be.datatypes.enums.ComponentFieldsEnum;
+import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
+import org.openecomp.sdc.be.datatypes.enums.CreatedFrom;
+import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
+import org.openecomp.sdc.be.datatypes.enums.ResourceTypeEnum;
+import org.openecomp.sdc.be.impl.ComponentsUtils;
+import org.openecomp.sdc.be.info.NodeTypeInfoToUpdateArtifacts;
+import org.openecomp.sdc.be.model.ArtifactDefinition;
+import org.openecomp.sdc.be.model.CapabilityDefinition;
+import org.openecomp.sdc.be.model.CapabilityRequirementRelationship;
+import org.openecomp.sdc.be.model.CapabilityTypeDefinition;
+import org.openecomp.sdc.be.model.Component;
+import org.openecomp.sdc.be.model.ComponentInstance;
+import org.openecomp.sdc.be.model.ComponentInstanceInput;
+import org.openecomp.sdc.be.model.ComponentInstanceProperty;
+import org.openecomp.sdc.be.model.ComponentParametersView;
+import org.openecomp.sdc.be.model.DataTypeDefinition;
+import org.openecomp.sdc.be.model.DistributionStatusEnum;
+import org.openecomp.sdc.be.model.GroupDefinition;
+import org.openecomp.sdc.be.model.InputDefinition;
+import org.openecomp.sdc.be.model.InterfaceDefinition;
+import org.openecomp.sdc.be.model.LifeCycleTransitionEnum;
+import org.openecomp.sdc.be.model.LifecycleStateEnum;
+import org.openecomp.sdc.be.model.NodeTypeInfo;
+import org.openecomp.sdc.be.model.Operation;
+import org.openecomp.sdc.be.model.ParsedToscaYamlInfo;
+import org.openecomp.sdc.be.model.PropertyDefinition;
+import org.openecomp.sdc.be.model.RelationshipImpl;
+import org.openecomp.sdc.be.model.RelationshipInfo;
+import org.openecomp.sdc.be.model.RequirementCapabilityRelDef;
+import org.openecomp.sdc.be.model.RequirementDefinition;
+import org.openecomp.sdc.be.model.Resource;
+import org.openecomp.sdc.be.model.Service;
+import org.openecomp.sdc.be.model.UploadCapInfo;
+import org.openecomp.sdc.be.model.UploadComponentInstanceInfo;
+import org.openecomp.sdc.be.model.UploadInfo;
+import org.openecomp.sdc.be.model.UploadNodeFilterInfo;
+import org.openecomp.sdc.be.model.UploadPropInfo;
+import org.openecomp.sdc.be.model.UploadReqInfo;
+import org.openecomp.sdc.be.model.UploadResourceInfo;
+import org.openecomp.sdc.be.model.User;
+import org.openecomp.sdc.be.model.category.CategoryDefinition;
+import org.openecomp.sdc.be.model.category.SubCategoryDefinition;
+import org.openecomp.sdc.be.model.jsonjanusgraph.datamodel.ToscaElement;
+import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ArtifactsOperations;
+import org.openecomp.sdc.be.model.jsonjanusgraph.operations.InterfaceOperation;
+import org.openecomp.sdc.be.model.jsonjanusgraph.operations.NodeFilterOperation;
+import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ToscaOperationFacade;
+import org.openecomp.sdc.be.model.jsonjanusgraph.utils.ModelConverter;
+import org.openecomp.sdc.be.model.operations.StorageException;
+import org.openecomp.sdc.be.model.operations.api.ICapabilityTypeOperation;
+import org.openecomp.sdc.be.model.operations.api.IElementOperation;
+import org.openecomp.sdc.be.model.operations.api.IGroupInstanceOperation;
+import org.openecomp.sdc.be.model.operations.api.IGroupOperation;
+import org.openecomp.sdc.be.model.operations.api.IGroupTypeOperation;
+import org.openecomp.sdc.be.model.operations.api.IInterfaceLifecycleOperation;
+import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
+import org.openecomp.sdc.be.model.operations.impl.DaoStatusConverter;
+import org.openecomp.sdc.be.model.operations.impl.InterfaceLifecycleOperation;
+import org.openecomp.sdc.be.model.operations.impl.UniqueIdBuilder;
+import org.openecomp.sdc.be.model.operations.utils.ComponentValidationUtils;
+import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum;
+import org.openecomp.sdc.be.resources.data.auditing.model.ResourceVersionInfo;
+import org.openecomp.sdc.be.tosca.CsarUtils;
+import org.openecomp.sdc.be.utils.CommonBeUtils;
+import org.openecomp.sdc.be.utils.TypeUtils;
+import org.openecomp.sdc.common.api.ArtifactGroupTypeEnum;
+import org.openecomp.sdc.common.api.ArtifactTypeEnum;
+import org.openecomp.sdc.common.api.Constants;
+import org.openecomp.sdc.common.datastructure.Wrapper;
+import org.openecomp.sdc.common.kpi.api.ASDCKpiApi;
+import org.openecomp.sdc.common.log.wrappers.Logger;
+import org.openecomp.sdc.common.util.GeneralUtility;
+import org.openecomp.sdc.common.util.ValidationUtils;
+import org.openecomp.sdc.exception.ResponseFormat;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.yaml.snakeyaml.DumperOptions;
+import org.yaml.snakeyaml.Yaml;
+
+@Getter
+@Setter
+@org.springframework.stereotype.Component("serviceImportBusinessLogic")
+public class ServiceImportBusinessLogic{
+
+    private final UiComponentDataConverter uiComponentDataConverter;
+    private static final String INITIAL_VERSION = "0.1";
+    private static final String CREATE_RESOURCE = "Create Resource";
+    private static final String IN_RESOURCE = "  in resource {} ";
+    private static final String COMPONENT_INSTANCE_WITH_NAME = "component instance with name ";
+    private static final String COMPONENT_INSTANCE_WITH_NAME_IN_RESOURCE = "component instance with name {}  in resource {} ";
+    private static final String CERTIFICATION_ON_IMPORT = "certification on import";
+    private static final String VALIDATE_DERIVED_BEFORE_UPDATE = "validate derived before update";
+    private static final String PLACE_HOLDER_RESOURCE_TYPES = "validForResourceTypes";
+    private static final String CREATE_RESOURCE_VALIDATE_CAPABILITY_TYPES = "Create Resource - validateCapabilityTypesCreate";
+    private static final String CATEGORY_IS_EMPTY = "Resource category is empty";
+
+
+    @Autowired
+    private ServiceBusinessLogic serviceBusinessLogic;
+    public ServiceBusinessLogic getServiceBusinessLogic() {
+        return serviceBusinessLogic;
+    }
+
+    public void setServiceBusinessLogic(
+        ServiceBusinessLogic serviceBusinessLogic) {
+        this.serviceBusinessLogic = serviceBusinessLogic;
+    }
+
+    @Autowired
+    private CsarBusinessLogic csarBusinessLogic;
+    @Autowired
+    protected ComponentsUtils componentsUtils;
+    @Autowired
+    protected ToscaOperationFacade toscaOperationFacade;
+    @Autowired
+    private CsarArtifactsAndGroupsBusinessLogic csarArtifactsAndGroupsBusinessLogic;
+    @Autowired
+    private LifecycleBusinessLogic lifecycleBusinessLogic;
+    @Autowired
+    private CompositionBusinessLogic compositionBusinessLogic;
+    @Autowired
+    private ResourceDataMergeBusinessLogic resourceDataMergeBusinessLogic;
+    @Autowired
+    private ServiceImportParseLogic serviceImportParseLogic;
+
+    private static final Logger log = Logger.getLogger(ServiceImportBusinessLogic.class);
+    @Autowired
+    public ServiceImportBusinessLogic(IElementOperation elementDao,
+        IGroupOperation groupOperation,
+        IGroupInstanceOperation groupInstanceOperation,
+        IGroupTypeOperation groupTypeOperation,
+        GroupBusinessLogic groupBusinessLogic,
+        InterfaceOperation interfaceOperation,
+        InterfaceLifecycleOperation interfaceLifecycleTypeOperation,
+        ArtifactsBusinessLogic artifactsBusinessLogic,
+        IDistributionEngine distributionEngine, ComponentInstanceBusinessLogic componentInstanceBusinessLogic,
+        ServiceDistributionValidation serviceDistributionValidation, ForwardingPathValidator forwardingPathValidator,
+        UiComponentDataConverter uiComponentDataConverter, NodeFilterOperation serviceFilterOperation,
+        NodeFilterValidator serviceFilterValidator, ArtifactsOperations artifactToscaOperation,
+        ComponentContactIdValidator componentContactIdValidator,
+        ComponentNameValidator componentNameValidator,
+        ComponentTagsValidator componentTagsValidator,
+        ComponentValidator componentValidator,
+        ComponentIconValidator componentIconValidator,
+        ComponentProjectCodeValidator componentProjectCodeValidator,
+        ComponentDescriptionValidator componentDescriptionValidator) {
+        this.componentInstanceBusinessLogic = componentInstanceBusinessLogic;
+        this.uiComponentDataConverter = uiComponentDataConverter;
+    }
+
+    private final ComponentInstanceBusinessLogic componentInstanceBusinessLogic;
+
+    public Service createService(Service service, AuditingActionEnum auditingAction, User user, Map<String, byte[]> csarUIPayload, String payloadName) {
+        log.debug("enter createService");
+        service.setCreatorUserId(user.getUserId());
+        service.setState(LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT);
+        service.setVersion(INITIAL_VERSION);
+        service.setConformanceLevel(ConfigurationManager.getConfigurationManager().getConfiguration().getToscaConformanceLevel());
+        service.setDistributionStatus(DistributionStatusEnum.DISTRIBUTION_NOT_APPROVED);
+        service.setInstantiationType("A-la-carte");
+        service.setEnvironmentContext("General_Revenue-Bearing");
+        service.setEcompGeneratedNaming(true);
+
+        try {
+            serviceBusinessLogic.validateServiceBeforeCreate(service, user, auditingAction);
+
+            log.debug("enter createService,validateServiceBeforeCreate success");
+            String csarUUID = payloadName == null ? service.getCsarUUID() : payloadName;
+
+            log.debug("enter createService,get csarUUID:{}", csarUUID);
+            csarBusinessLogic.validateCsarBeforeCreate(service, csarUUID);
+            log.debug("CsarUUID is {} - going to create resource from CSAR", csarUUID);
+            return createServiceFromCsar(service, user, csarUIPayload, csarUUID);
+        }catch (Exception e){
+            log.debug("Exception occured when createService,error is:{}",e.getMessage(),e);
+            //ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR);
+            throw new ComponentException(ActionStatus.GENERAL_ERROR);
+        }
+    }
+
+    protected Service createServiceFromCsar(Service service, User user, Map<String, byte[]> csarUIPayload, String csarUUID) {
+        log.trace("************* created successfully from YAML, resource TOSCA ");
+        try {
+            CsarInfo csarInfo = csarBusinessLogic.getCsarInfo(service, null, user, csarUIPayload, csarUUID);
+
+            Map<String, NodeTypeInfo> nodeTypesInfo = csarInfo.extractNodeTypesInfo();
+            Either<Map<String, EnumMap<ArtifactOperationEnum, List<ArtifactDefinition>>>, ResponseFormat> findNodeTypesArtifactsToHandleRes = serviceImportParseLogic
+                    .findNodeTypesArtifactsToHandle(
+                            nodeTypesInfo, csarInfo, service);
+            if (findNodeTypesArtifactsToHandleRes.isRight()) {
+                log.debug("failed to find node types for update with artifacts during import csar {}. ",
+                        csarInfo.getCsarUUID());
+                throw new ComponentException(findNodeTypesArtifactsToHandleRes.right().value());
+            }
+            Service cService = createServiceFromYaml(service, csarInfo.getMainTemplateContent(), csarInfo.getMainTemplateName(),
+                    nodeTypesInfo, csarInfo, findNodeTypesArtifactsToHandleRes.left().value(), true, false,
+                    null);
+            return cService;
+        }catch (Exception e){
+            log.debug("Exception occured when createServiceFromCsar,error is:{}",e.getMessage(),e);
+            throw new ComponentException(ActionStatus.GENERAL_ERROR);
+        }
+    }
+
+    protected Service createServiceFromYaml(Service service, String topologyTemplateYaml,
+                                          String yamlName, Map<String, NodeTypeInfo> nodeTypesInfo, CsarInfo csarInfo,
+                                          Map<String, EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<ArtifactDefinition>>> nodeTypesArtifactsToCreate,
+                                          boolean shouldLock, boolean inTransaction, String nodeName) {
+
+        List<ArtifactDefinition> createdArtifacts = new ArrayList<>();
+        Service createdService;
+        CreateServiceFromYamlParameter csfyp = new CreateServiceFromYamlParameter();
+        try {
+            ParsedToscaYamlInfo
+                    parsedToscaYamlInfo = csarBusinessLogic.getParsedToscaYamlInfo(topologyTemplateYaml, yamlName, nodeTypesInfo, csarInfo, nodeName, service);
+            if (MapUtils.isEmpty(parsedToscaYamlInfo.getInstances())) {
+                throw new ComponentException(ActionStatus.NOT_TOPOLOGY_TOSCA_TEMPLATE, yamlName);
+            }
+            log.debug("#createResourceFromYaml - Going to create resource {} and RIs ", service.getName());
+            csfyp.setYamlName(yamlName);
+            csfyp.setParsedToscaYamlInfo(parsedToscaYamlInfo);
+            csfyp.setCreatedArtifacts(createdArtifacts);
+            csfyp.setTopologyTemplateYaml(topologyTemplateYaml);
+            csfyp.setNodeTypesInfo(nodeTypesInfo);
+            csfyp.setCsarInfo(csarInfo);
+            csfyp.setNodeName(nodeName);
+
+            createdService = createServiceAndRIsFromYaml(service, false, nodeTypesArtifactsToCreate, shouldLock, inTransaction, csfyp);
+            log.debug("#createResourceFromYaml - The resource {} has been created ", service.getName());
+        } catch (ComponentException e) {
+            log.debug("create Service From Yaml failed,get ComponentException:{}", e);
+            throw e;
+        } catch (StorageException e) {
+            log.debug("create Service From Yaml failed,get StorageException:{}", e);
+            throw e;
+        }
+        return createdService;
+    }
+
+    protected Service createServiceAndRIsFromYaml(Service service, boolean isNormative,
+                                                Map<String, EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<ArtifactDefinition>>> nodeTypesArtifactsToCreate,
+                                                boolean shouldLock, boolean inTransaction, CreateServiceFromYamlParameter csfyp) {
+
+        List<ArtifactDefinition> nodeTypesNewCreatedArtifacts = new ArrayList<>();
+        String yamlName = csfyp.getYamlName();
+        ParsedToscaYamlInfo parsedToscaYamlInfo = csfyp.getParsedToscaYamlInfo();
+        List<ArtifactDefinition> createdArtifacts = csfyp.getCreatedArtifacts();
+        String topologyTemplateYaml = csfyp.getTopologyTemplateYaml();
+        Map<String, NodeTypeInfo> nodeTypesInfo = csfyp.getNodeTypesInfo();
+        CsarInfo csarInfo = csfyp.getCsarInfo();
+        String nodeName = csfyp.getNodeName();
+
+        if (shouldLock) {
+            Either<Boolean, ResponseFormat> lockResult = serviceBusinessLogic.lockComponentByName(service.getSystemName(), service, CREATE_RESOURCE);
+            if (lockResult.isRight()) {
+                serviceImportParseLogic.rollback(inTransaction, service, createdArtifacts, nodeTypesNewCreatedArtifacts);
+                throw new ComponentException(lockResult.right().value());
+            }
+            log.debug("name is locked {} status = {}", service.getSystemName(), lockResult);
+        }
+        try {
+            log.trace("************* createResourceFromYaml before full create resource {}", yamlName);
+            service = serviceImportParseLogic.createServiceTransaction(service, csarInfo.getModifier(), isNormative);
+            log.trace("************* Going to add inputs from yaml {}", yamlName);
+
+            Map<String, InputDefinition> inputs = parsedToscaYamlInfo.getInputs();
+            service = serviceImportParseLogic.createInputsOnService(service, inputs);
+            log.trace("************* Finish to add inputs from yaml {}", yamlName);
+
+            Map<String, UploadComponentInstanceInfo> uploadComponentInstanceInfoMap = parsedToscaYamlInfo
+                    .getInstances();
+            log.trace("************* Going to create nodes, RI's and Relations  from yaml {}", yamlName);
+
+            service = createRIAndRelationsFromYaml(yamlName, service, uploadComponentInstanceInfoMap,
+                    topologyTemplateYaml, nodeTypesNewCreatedArtifacts, nodeTypesInfo, csarInfo,
+                    nodeTypesArtifactsToCreate, nodeName);
+            log.trace("************* Finished to create nodes, RI and Relation  from yaml {}", yamlName);
+            Either<Map<String, GroupDefinition>, ResponseFormat> validateUpdateVfGroupNamesRes = serviceBusinessLogic.groupBusinessLogic
+                    .validateUpdateVfGroupNames(parsedToscaYamlInfo.getGroups(), service.getSystemName());
+            if (validateUpdateVfGroupNamesRes.isRight()) {
+                serviceImportParseLogic.rollback(inTransaction, service, createdArtifacts, nodeTypesNewCreatedArtifacts);
+                throw new ComponentException(validateUpdateVfGroupNamesRes.right().value());
+            }
+            Map<String, GroupDefinition> groups;
+            log.trace("************* Going to add groups from yaml {}", yamlName);
+
+            if (!validateUpdateVfGroupNamesRes.left().value().isEmpty()) {
+                groups = validateUpdateVfGroupNamesRes.left().value();
+            } else {
+                groups = parsedToscaYamlInfo.getGroups();
+            }
+
+            Either<Service, ResponseFormat> createGroupsOnResource = createGroupsOnResource(service, groups);
+            if (createGroupsOnResource.isRight()) {
+                serviceImportParseLogic.rollback(inTransaction, service, createdArtifacts, nodeTypesNewCreatedArtifacts);
+                throw new ComponentException(createGroupsOnResource.right().value());
+            }
+            service = createGroupsOnResource.left().value();
+            log.trace("************* Going to add artifacts from yaml {}", yamlName);
+
+            NodeTypeInfoToUpdateArtifacts nodeTypeInfoToUpdateArtifacts = new NodeTypeInfoToUpdateArtifacts(nodeName,
+                    nodeTypesArtifactsToCreate);
+
+            Either<Service, ResponseFormat> createArtifactsEither = createOrUpdateArtifacts(
+                    ArtifactsBusinessLogic.ArtifactOperationEnum.CREATE, createdArtifacts, yamlName,
+                    csarInfo, service, nodeTypeInfoToUpdateArtifacts, inTransaction, shouldLock);
+            if (createArtifactsEither.isRight()) {
+                serviceImportParseLogic.rollback(inTransaction, service, createdArtifacts, nodeTypesNewCreatedArtifacts);
+                throw new ComponentException(createArtifactsEither.right().value());
+            }
+            service = serviceImportParseLogic.getServiceWithGroups(createArtifactsEither.left().value().getUniqueId());
+            ASDCKpiApi.countCreatedResourcesKPI();
+            return service;
+        } catch (ComponentException | StorageException e) {
+            serviceImportParseLogic.rollback(inTransaction, service, createdArtifacts, nodeTypesNewCreatedArtifacts);
+            throw e;
+        } finally {
+            if (!inTransaction) {
+                serviceBusinessLogic.janusGraphDao.commit();
+            }
+            if (shouldLock) {
+                serviceBusinessLogic.graphLockOperation.unlockComponentByName(service.getSystemName(), service.getUniqueId(),
+                        NodeTypeEnum.Resource);
+            }
+        }
+    }
+
+    protected Either<Resource, ResponseFormat> createOrUpdateArtifacts(
+            ArtifactsBusinessLogic.ArtifactOperationEnum operation, List<ArtifactDefinition> createdArtifacts,
+            String yamlFileName, CsarInfo csarInfo, Resource preparedResource,
+            NodeTypeInfoToUpdateArtifacts nodeTypeInfoToUpdateArtifacts, boolean inTransaction, boolean shouldLock) {
+
+        String nodeName = nodeTypeInfoToUpdateArtifacts.getNodeName();
+        Resource resource = preparedResource;
+
+        Map<String, EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<ArtifactDefinition>>> nodeTypesArtifactsToHandle = nodeTypeInfoToUpdateArtifacts
+                .getNodeTypesArtifactsToHandle();
+        if (preparedResource.getResourceType() == ResourceTypeEnum.VF) {
+            if (nodeName != null && nodeTypesArtifactsToHandle.get(nodeName) != null && !nodeTypesArtifactsToHandle.get(nodeName).isEmpty()) {
+                Either<List<ArtifactDefinition>, ResponseFormat> handleNodeTypeArtifactsRes =
+                        handleNodeTypeArtifacts(preparedResource, nodeTypesArtifactsToHandle.get(nodeName), createdArtifacts, csarInfo.getModifier(), inTransaction, true);
+                if (handleNodeTypeArtifactsRes.isRight()) {
+                    return Either.right(handleNodeTypeArtifactsRes.right().value());
+                }
+            }
+        } else {
+            Either<Resource, ResponseFormat> createdCsarArtifactsEither = handleVfCsarArtifacts(preparedResource, csarInfo, createdArtifacts,
+                    new ArtifactOperationInfo(false, false, operation), shouldLock, inTransaction);
+            log.trace("************* Finished to add artifacts from yaml {}", yamlFileName);
+            if (createdCsarArtifactsEither.isRight()) {
+                return createdCsarArtifactsEither;
+            }
+            resource = createdCsarArtifactsEither.left().value();
+        }
+        return Either.left(resource);
+    }
+
+    protected Either<Resource, ResponseFormat> handleVfCsarArtifacts(Resource resource, CsarInfo csarInfo,
+                                                                   List<ArtifactDefinition> createdArtifacts, ArtifactOperationInfo artifactOperation, boolean shouldLock,
+                                                                   boolean inTransaction) {
+        if (csarInfo.getCsar() != null) {
+            createOrUpdateSingleNonMetaArtifactToComstants(resource, csarInfo, artifactOperation, shouldLock, inTransaction);
+
+            Either<Resource, ResponseFormat> eitherCreateResult = createOrUpdateNonMetaArtifacts(csarInfo, resource,
+                    createdArtifacts, shouldLock, inTransaction, artifactOperation);
+            if (eitherCreateResult.isRight()) {
+                return Either.right(eitherCreateResult.right().value());
+            }
+            Either<Resource, StorageOperationStatus> eitherGerResource = toscaOperationFacade.getToscaElement(resource.getUniqueId());
+            if (eitherGerResource.isRight()) {
+                ResponseFormat responseFormat = componentsUtils.getResponseFormatByResource(
+                        componentsUtils.convertFromStorageResponse(eitherGerResource.right().value()), resource);
+                return Either.right(responseFormat);
+            }
+            resource = eitherGerResource.left().value();
+            Either<ImmutablePair<String, String>, ResponseFormat> artifacsMetaCsarStatus = CsarValidationUtils.getArtifactsMeta(csarInfo.getCsar(), csarInfo.getCsarUUID(), componentsUtils);
+
+            if (artifacsMetaCsarStatus.isLeft()) {
+                return getResourceResponseFormatEither(resource, csarInfo, createdArtifacts, artifactOperation, shouldLock, inTransaction, artifacsMetaCsarStatus);
+            } else {
+                return csarArtifactsAndGroupsBusinessLogic.deleteVFModules(resource, csarInfo, shouldLock, inTransaction);
+            }
+        }
+        return Either.left(resource);
+    }
+
+    protected void createOrUpdateSingleNonMetaArtifactToComstants(Resource resource, CsarInfo csarInfo, ArtifactOperationInfo artifactOperation, boolean shouldLock, boolean inTransaction) {
+        String vendorLicenseModelId = null;
+        String vfLicenseModelId = null;
+        if (artifactOperation.getArtifactOperationEnum() == ArtifactOperationEnum.UPDATE) {
+            Map<String, ArtifactDefinition> deploymentArtifactsMap = resource.getDeploymentArtifacts();
+            if (deploymentArtifactsMap != null && !deploymentArtifactsMap.isEmpty()) {
+                for (Map.Entry<String, ArtifactDefinition> artifactEntry : deploymentArtifactsMap.entrySet()) {
+                    if (artifactEntry.getValue().getArtifactName().equalsIgnoreCase(Constants.VENDOR_LICENSE_MODEL)) {
+                        vendorLicenseModelId = artifactEntry.getValue().getUniqueId();
+                    }
+                    if (artifactEntry.getValue().getArtifactName().equalsIgnoreCase(Constants.VF_LICENSE_MODEL)) {
+                        vfLicenseModelId = artifactEntry.getValue().getUniqueId();
+                    }
+                }
+            }
+        }
+        createOrUpdateSingleNonMetaArtifact(resource, csarInfo,
+                CsarUtils.ARTIFACTS_PATH + Constants.VENDOR_LICENSE_MODEL, Constants.VENDOR_LICENSE_MODEL,
+                ArtifactTypeEnum.VENDOR_LICENSE.getType(), ArtifactGroupTypeEnum.DEPLOYMENT,
+                Constants.VENDOR_LICENSE_LABEL, Constants.VENDOR_LICENSE_DISPLAY_NAME,
+                Constants.VENDOR_LICENSE_DESCRIPTION, vendorLicenseModelId, artifactOperation, null, true, shouldLock,
+                inTransaction);
+        createOrUpdateSingleNonMetaArtifact(resource, csarInfo,
+                CsarUtils.ARTIFACTS_PATH + Constants.VF_LICENSE_MODEL, Constants.VF_LICENSE_MODEL,
+                ArtifactTypeEnum.VF_LICENSE.getType(), ArtifactGroupTypeEnum.DEPLOYMENT, Constants.VF_LICENSE_LABEL,
+                Constants.VF_LICENSE_DISPLAY_NAME, Constants.VF_LICENSE_DESCRIPTION, vfLicenseModelId,
+                artifactOperation, null, true, shouldLock, inTransaction);
+    }
+
+    protected Either<Resource, ResponseFormat> getResourceResponseFormatEither(Resource resource, CsarInfo csarInfo, List<ArtifactDefinition> createdArtifacts, ArtifactOperationInfo artifactOperation, boolean shouldLock, boolean inTransaction, Either<ImmutablePair<String, String>, ResponseFormat> artifacsMetaCsarStatus) {
+        try {
+            String artifactsFileName = artifacsMetaCsarStatus.left().value().getKey();
+            String artifactsContents = artifacsMetaCsarStatus.left().value().getValue();
+            Either<Resource, ResponseFormat> createArtifactsFromCsar;
+            if (ArtifactOperationEnum.isCreateOrLink(artifactOperation.getArtifactOperationEnum())) {
+                createArtifactsFromCsar = csarArtifactsAndGroupsBusinessLogic
+                    .createResourceArtifactsFromCsar(csarInfo, resource, artifactsContents, artifactsFileName,
+                        createdArtifacts);
+            } else {
+                Either<Component, ResponseFormat> result = csarArtifactsAndGroupsBusinessLogic
+                    .updateResourceArtifactsFromCsar(csarInfo, resource, artifactsContents, artifactsFileName,
+                        createdArtifacts, shouldLock, inTransaction);
+                if ((result.left().value() instanceof Resource) && result.isLeft()) {
+                    Resource service1 = (Resource) result.left().value();
+                    createArtifactsFromCsar = Either.left(service1);
+                } else {
+                    createArtifactsFromCsar = Either.right(result.right().value());
+                }
+            }
+            if (createArtifactsFromCsar.isRight()) {
+                log.debug("Couldn't create artifacts from artifacts.meta");
+                return Either.right(createArtifactsFromCsar.right().value());
+            }
+            return Either.left(createArtifactsFromCsar.left().value());
+        }catch(Exception e)
+        {
+            log.debug("Exception occured in getResourceResponseFormatEither, message:{}", e.getMessage(), e);
+            return Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
+        }
+    }
+
+    protected Either<Resource, ResponseFormat> createOrUpdateNonMetaArtifacts(CsarInfo csarInfo, Resource resource,
+                                                                            List<ArtifactDefinition> createdArtifacts, boolean shouldLock, boolean inTransaction,
+                                                                            ArtifactOperationInfo artifactOperation) {
+        Either<Resource, ResponseFormat> resStatus = null;
+        Map<String, Set<List<String>>> collectedWarningMessages = new HashMap<>();
+        try {
+            Either<List<CsarUtils.NonMetaArtifactInfo>, String> artifactPathAndNameList = getValidArtifactNames(csarInfo, collectedWarningMessages);
+            if (artifactPathAndNameList.isRight()) {
+                return Either.right(getComponentsUtils().getResponseFormatByArtifactId(
+                        ActionStatus.ARTIFACT_NAME_INVALID, artifactPathAndNameList.right().value()));
+            }
+            EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<CsarUtils.NonMetaArtifactInfo>> vfCsarArtifactsToHandle = null;
+
+            if (ArtifactsBusinessLogic.ArtifactOperationEnum.isCreateOrLink(artifactOperation.getArtifactOperationEnum())) {
+                vfCsarArtifactsToHandle = new EnumMap<>(ArtifactsBusinessLogic.ArtifactOperationEnum.class);
+                vfCsarArtifactsToHandle.put(artifactOperation.getArtifactOperationEnum(), artifactPathAndNameList.left().value());
+            } else {
+                Either<EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<CsarUtils.NonMetaArtifactInfo>>, ResponseFormat> findVfCsarArtifactsToHandleRes = findVfCsarArtifactsToHandle(
+                        resource, artifactPathAndNameList.left().value(), csarInfo.getModifier());
+                if (findVfCsarArtifactsToHandleRes.isRight()) {
+                    resStatus = Either.right(findVfCsarArtifactsToHandleRes.right().value());
+                }
+                if (resStatus == null) {
+                    vfCsarArtifactsToHandle = findVfCsarArtifactsToHandleRes.left().value();
+                }
+            }
+            if (resStatus == null && vfCsarArtifactsToHandle != null) {
+                resStatus = processCsarArtifacts(csarInfo, resource, createdArtifacts, shouldLock, inTransaction, resStatus, vfCsarArtifactsToHandle);
+            }
+            if (resStatus == null) {
+                resStatus = Either.left(resource);
+            }
+        } catch (Exception e) {
+            resStatus = Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
+            log.debug("Exception occured in createNonMetaArtifacts, message:{}", e.getMessage(), e);
+        } finally {
+            CsarUtils.handleWarningMessages(collectedWarningMessages);
+        }
+        return resStatus;
+    }
+
+    protected Either<EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<CsarUtils.NonMetaArtifactInfo>>, ResponseFormat> findVfCsarArtifactsToHandle(
+            Resource resource, List<CsarUtils.NonMetaArtifactInfo> artifactPathAndNameList, User user) {
+
+        List<ArtifactDefinition> existingArtifacts = new ArrayList<>();
+        if (resource.getDeploymentArtifacts() != null && !resource.getDeploymentArtifacts().isEmpty()) {
+            existingArtifacts.addAll(resource.getDeploymentArtifacts().values());
+        }
+        if (resource.getArtifacts() != null && !resource.getArtifacts().isEmpty()) {
+            existingArtifacts.addAll(resource.getArtifacts().values());
+        }
+        existingArtifacts = existingArtifacts.stream()
+                .filter(this::isNonMetaArtifact).collect(toList());
+
+        List<String> artifactsToIgnore = new ArrayList<>();
+        if (resource.getGroups() != null) {
+            resource.getGroups().stream().forEach(g -> {
+                if (g.getArtifacts() != null && !g.getArtifacts().isEmpty()) {
+                    artifactsToIgnore.addAll(g.getArtifacts());
+                }
+            });
+        }
+        existingArtifacts = existingArtifacts.stream()
+                .filter(a -> !artifactsToIgnore.contains(a.getUniqueId())).collect(toList());
+        return organizeVfCsarArtifactsByArtifactOperation(artifactPathAndNameList, existingArtifacts, resource, user);
+    }
+
+    protected boolean isNonMetaArtifact(ArtifactDefinition artifact) {
+        boolean result = true;
+        if (artifact.getMandatory() || artifact.getArtifactName() == null || !isValidArtifactType(artifact)) {
+            result = false;
+        }
+        return result;
+    }
+
+    private boolean isValidArtifactType(ArtifactDefinition artifact) {
+        boolean result = true;
+        if (artifact.getArtifactType() == null
+                || ArtifactTypeEnum.findType(artifact.getArtifactType()).equals(ArtifactTypeEnum.VENDOR_LICENSE)
+                || ArtifactTypeEnum.findType(artifact.getArtifactType()).equals(ArtifactTypeEnum.VF_LICENSE)) {
+            result = false;
+        }
+        return result;
+    }
+
+    protected Either<EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<CsarUtils.NonMetaArtifactInfo>>, ResponseFormat> organizeVfCsarArtifactsByArtifactOperation(
+            List<CsarUtils.NonMetaArtifactInfo> artifactPathAndNameList, List<ArtifactDefinition> existingArtifactsToHandle,
+            Resource resource, User user) {
+
+        EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<CsarUtils.NonMetaArtifactInfo>> nodeTypeArtifactsToHandle = new EnumMap<>(
+                ArtifactsBusinessLogic.ArtifactOperationEnum.class);
+        Wrapper<ResponseFormat> responseWrapper = new Wrapper<>();
+        Either<EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<CsarUtils.NonMetaArtifactInfo>>, ResponseFormat> nodeTypeArtifactsToHandleRes = Either
+                .left(nodeTypeArtifactsToHandle);
+        try {
+            // add all found Csar artifacts to list to upload
+            List<CsarUtils.NonMetaArtifactInfo> artifactsToUpload = new ArrayList<>(artifactPathAndNameList);
+            List<CsarUtils.NonMetaArtifactInfo> artifactsToUpdate = new ArrayList<>();
+            List<CsarUtils.NonMetaArtifactInfo> artifactsToDelete = new ArrayList<>();
+            for (CsarUtils.NonMetaArtifactInfo currNewArtifact : artifactPathAndNameList) {
+                ArtifactDefinition foundArtifact;
+                if (!existingArtifactsToHandle.isEmpty()) {
+                    foundArtifact = existingArtifactsToHandle.stream()
+                            .filter(a -> a.getArtifactName().equals(currNewArtifact.getArtifactName())).findFirst()
+                            .orElse(null);
+                    if (foundArtifact != null) {
+                        if (ArtifactTypeEnum.findType(foundArtifact.getArtifactType()).equals(currNewArtifact
+                                .getArtifactType())) {
+                            if (!foundArtifact.getArtifactChecksum().equals(currNewArtifact.getArtifactChecksum())) {
+                                currNewArtifact.setArtifactUniqueId(foundArtifact.getUniqueId());
+                                artifactsToUpdate.add(currNewArtifact);
+                            }
+                            existingArtifactsToHandle.remove(foundArtifact);
+                            artifactsToUpload.remove(currNewArtifact);
+                        } else {
+                            log.debug("Can't upload two artifact with the same name {}.",
+                                    currNewArtifact.getArtifactName());
+                            ResponseFormat responseFormat = ResponseFormatManager.getInstance().getResponseFormat(
+                                    ActionStatus.ARTIFACT_ALREADY_EXIST_IN_DIFFERENT_TYPE_IN_CSAR,
+                                    currNewArtifact.getArtifactName(), currNewArtifact.getArtifactType(),
+                                    foundArtifact.getArtifactType());
+                            AuditingActionEnum auditingAction = serviceBusinessLogic.artifactsBusinessLogic
+                                    .detectAuditingType(new ArtifactOperationInfo(false, false,
+                                            ArtifactsBusinessLogic.ArtifactOperationEnum.CREATE), foundArtifact.getArtifactChecksum());
+                            serviceBusinessLogic.artifactsBusinessLogic.handleAuditing(auditingAction, resource, resource.getUniqueId(),
+                                    user, null, null, foundArtifact.getUniqueId(), responseFormat,
+                                    resource.getComponentType(), null);
+                            responseWrapper.setInnerElement(responseFormat);
+                            break;
+                        }
+                    }
+                }
+            }
+            if (responseWrapper.isEmpty()) {
+                for (ArtifactDefinition currArtifact : existingArtifactsToHandle) {
+                    if (currArtifact.getIsFromCsar()) {
+                        artifactsToDelete.add(new CsarUtils.NonMetaArtifactInfo(currArtifact.getArtifactName(), null, ArtifactTypeEnum.findType(currArtifact.getArtifactType()), currArtifact.getArtifactGroupType(), null, currArtifact.getUniqueId(), currArtifact.getIsFromCsar()));
+                    } else {
+                        artifactsToUpdate.add(new CsarUtils.NonMetaArtifactInfo(currArtifact.getArtifactName(), null, ArtifactTypeEnum.findType(currArtifact.getArtifactType()), currArtifact.getArtifactGroupType(), null, currArtifact.getUniqueId(), currArtifact.getIsFromCsar()));
+
+                    }
+                }
+            }
+            if (responseWrapper.isEmpty()) {
+                if (!artifactsToUpload.isEmpty()) {
+                    nodeTypeArtifactsToHandle.put(ArtifactsBusinessLogic.ArtifactOperationEnum.CREATE, artifactsToUpload);
+                }
+                if (!artifactsToUpdate.isEmpty()) {
+                    nodeTypeArtifactsToHandle.put(ArtifactsBusinessLogic.ArtifactOperationEnum.UPDATE, artifactsToUpdate);
+                }
+                if (!artifactsToDelete.isEmpty()) {
+                    nodeTypeArtifactsToHandle.put(ArtifactsBusinessLogic.ArtifactOperationEnum.DELETE, artifactsToDelete);
+                }
+            }
+            if (!responseWrapper.isEmpty()) {
+                nodeTypeArtifactsToHandleRes = Either.right(responseWrapper.getInnerElement());
+            }
+        } catch (Exception e) {
+            ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR);
+            responseWrapper.setInnerElement(responseFormat);
+            log.debug("Exception occured when findNodeTypeArtifactsToHandle, error is:{}", e.getMessage(), e);
+            nodeTypeArtifactsToHandleRes = Either.right(responseWrapper.getInnerElement());
+        }
+        return nodeTypeArtifactsToHandleRes;
+    }
+
+    protected Either<Resource, ResponseFormat> processCsarArtifacts(CsarInfo csarInfo, Resource resource, List<ArtifactDefinition> createdArtifacts, boolean shouldLock, boolean inTransaction, Either<Resource, ResponseFormat> resStatus, EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<CsarUtils.NonMetaArtifactInfo>> vfCsarArtifactsToHandle) {
+        for (Map.Entry<ArtifactsBusinessLogic.ArtifactOperationEnum, List<CsarUtils.NonMetaArtifactInfo>> currArtifactOperationPair : vfCsarArtifactsToHandle
+                .entrySet()) {
+            Optional<ResponseFormat> optionalCreateInDBError =
+                    currArtifactOperationPair.getValue().stream()
+                            .map(e -> createOrUpdateSingleNonMetaArtifact(resource, csarInfo, e.getPath(),
+                                    e.getArtifactName(), e.getArtifactType(),
+                                    e.getArtifactGroupType(), e.getArtifactLabel(), e.getDisplayName(),
+                                    CsarUtils.ARTIFACT_CREATED_FROM_CSAR, e.getArtifactUniqueId(),
+                                    new ArtifactOperationInfo(false, false,
+                                            currArtifactOperationPair.getKey()),
+                                    createdArtifacts, e.isFromCsar(), shouldLock, inTransaction))
+                            .filter(Either::isRight).
+                            map(e -> e.right().value()).
+                            findAny();
+            if (optionalCreateInDBError.isPresent()) {
+                resStatus = Either.right(optionalCreateInDBError.get());
+                break;
+            }
+        }
+        return resStatus;
+    }
+
+    protected Either<Boolean, ResponseFormat> createOrUpdateSingleNonMetaArtifact(Resource resource, CsarInfo csarInfo,
+                                                                                String artifactPath, String artifactFileName, String artifactType, ArtifactGroupTypeEnum artifactGroupType,
+                                                                                String artifactLabel, String artifactDisplayName, String artifactDescription, String artifactId,
+                                                                                ArtifactOperationInfo operation, List<ArtifactDefinition> createdArtifacts, boolean isFromCsar, boolean shouldLock,
+                                                                                boolean inTransaction) {
+        byte[] artifactFileBytes = null;
+
+        if (csarInfo.getCsar().containsKey(artifactPath)) {
+            artifactFileBytes = csarInfo.getCsar().get(artifactPath);
+        }
+        Either<Boolean, ResponseFormat> result = Either.left(true);
+        if (operation.getArtifactOperationEnum() == ArtifactsBusinessLogic.ArtifactOperationEnum.UPDATE || operation.getArtifactOperationEnum() == ArtifactsBusinessLogic.ArtifactOperationEnum.DELETE) {
+            if (serviceImportParseLogic.isArtifactDeletionRequired(artifactId, artifactFileBytes, isFromCsar)) {
+                Either<ArtifactDefinition, ResponseFormat> handleDelete = serviceBusinessLogic.artifactsBusinessLogic.handleDelete(resource.getUniqueId(), artifactId, csarInfo.getModifier(), resource,
+                        shouldLock, inTransaction);
+                if (handleDelete.isRight()) {
+                    result = Either.right(handleDelete.right().value());
+                }
+                return result;
+            }
+            if (org.apache.commons.lang.StringUtils.isEmpty(artifactId) && artifactFileBytes != null) {
+                operation = new ArtifactOperationInfo(false, false,
+                        ArtifactsBusinessLogic.ArtifactOperationEnum.CREATE);
+            }
+        }
+        if (artifactFileBytes != null) {
+            Map<String, Object> vendorLicenseModelJson = ArtifactUtils
+                    .buildJsonForUpdateArtifact(artifactId, artifactFileName,
+                            artifactType, artifactGroupType, artifactLabel, artifactDisplayName, artifactDescription,
+                            artifactFileBytes, null, isFromCsar);
+            Either<Either<ArtifactDefinition, Operation>, ResponseFormat> eitherNonMetaArtifacts = csarArtifactsAndGroupsBusinessLogic.createOrUpdateCsarArtifactFromJson(
+                    resource, csarInfo.getModifier(), vendorLicenseModelJson, operation);
+            serviceImportParseLogic
+                    .addNonMetaCreatedArtifactsToSupportRollback(operation, createdArtifacts, eitherNonMetaArtifacts);
+            if (eitherNonMetaArtifacts.isRight()) {
+                BeEcompErrorManager.getInstance()
+                        .logInternalFlowError("UploadLicenseArtifact", "Failed to upload license artifact: "
+                                        + artifactFileName + "With csar uuid: " + csarInfo.getCsarUUID(),
+                                BeEcompErrorManager.ErrorSeverity.WARNING);
+                return Either.right(eitherNonMetaArtifacts.right().value());
+            }
+        }
+        return result;
+    }
+
+    public Either<List<ArtifactDefinition>, ResponseFormat> handleNodeTypeArtifacts(Resource nodeTypeResource,
+                                                                                    Map<ArtifactsBusinessLogic.ArtifactOperationEnum, List<ArtifactDefinition>> nodeTypeArtifactsToHandle,
+                                                                                    List<ArtifactDefinition> createdArtifacts, User user, boolean inTransaction, boolean ignoreLifecycleState) {
+        List<ArtifactDefinition> handleNodeTypeArtifactsRequestRes;
+        Either<List<ArtifactDefinition>, ResponseFormat> handleNodeTypeArtifactsRes = null;
+        Either<Resource, ResponseFormat> changeStateResponse;
+        try {
+            changeStateResponse = checkoutResource(nodeTypeResource, user, inTransaction);
+            if (changeStateResponse.isRight()) {
+                return Either.right(changeStateResponse.right().value());
+            }
+            nodeTypeResource = changeStateResponse.left().value();
+
+            List<ArtifactDefinition> handledNodeTypeArtifacts = new ArrayList<>();
+            log.debug("************* Going to handle artifacts of node type resource {}. ", nodeTypeResource.getName());
+            for (Map.Entry<ArtifactsBusinessLogic.ArtifactOperationEnum, List<ArtifactDefinition>> curOperationEntry : nodeTypeArtifactsToHandle
+                    .entrySet()) {
+                ArtifactsBusinessLogic.ArtifactOperationEnum curOperation = curOperationEntry.getKey();
+                List<ArtifactDefinition> curArtifactsToHandle = curOperationEntry.getValue();
+                if (curArtifactsToHandle != null && !curArtifactsToHandle.isEmpty()) {
+                    log.debug("************* Going to {} artifact to vfc {}", curOperation.name(),
+                            nodeTypeResource.getName());
+                    handleNodeTypeArtifactsRequestRes = serviceBusinessLogic.artifactsBusinessLogic
+                            .handleArtifactsRequestForInnerVfcComponent(curArtifactsToHandle, nodeTypeResource, user,
+                                    createdArtifacts, new ArtifactOperationInfo(false,
+                                            ignoreLifecycleState, curOperation),
+                                    false, inTransaction);
+                    if (ArtifactsBusinessLogic.ArtifactOperationEnum.isCreateOrLink(curOperation)) {
+                        createdArtifacts.addAll(handleNodeTypeArtifactsRequestRes);
+                    }
+                    handledNodeTypeArtifacts.addAll(handleNodeTypeArtifactsRequestRes);
+                }
+            }
+            if (handleNodeTypeArtifactsRes == null) {
+                handleNodeTypeArtifactsRes = Either.left(handledNodeTypeArtifacts);
+            }
+        } catch (Exception e) {
+            ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR);
+            handleNodeTypeArtifactsRes = Either.right(responseFormat);
+            log.debug("Exception occured when handleVfcArtifacts, error is:{}", e.getMessage(), e);
+        }
+        return handleNodeTypeArtifactsRes;
+    }
+
+    protected Either<Resource, ResponseFormat> checkoutResource(Resource resource, User user, boolean inTransaction) {
+        Either<Resource, ResponseFormat> checkoutResourceRes;
+        try {
+            if (!resource.getComponentMetadataDefinition().getMetadataDataDefinition().getState()
+                    .equals(LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT.name())) {
+                Either<? extends Component, ResponseFormat> checkoutRes = lifecycleBusinessLogic.changeComponentState(
+                        resource.getComponentType(), resource.getUniqueId(), user, LifeCycleTransitionEnum.CHECKOUT,
+                        new LifecycleChangeInfoWithAction(CERTIFICATION_ON_IMPORT,
+                                LifecycleChangeInfoWithAction.LifecycleChanceActionEnum.CREATE_FROM_CSAR),
+                        inTransaction, true);
+                if (checkoutRes.isRight()) {
+                    checkoutResourceRes = Either.right(checkoutRes.right().value());
+                } else {
+                    checkoutResourceRes = Either.left((Resource) checkoutRes.left().value());
+                }
+            } else {
+                checkoutResourceRes = Either.left(resource);
+            }
+        } catch (Exception e) {
+            ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR);
+            checkoutResourceRes = Either.right(responseFormat);
+            log.debug("Exception occured when checkoutResource {} , error is:{}", resource.getName(), e.getMessage(),
+                    e);
+        }
+        return checkoutResourceRes;
+    }
+
+    protected Either<Service, ResponseFormat> createOrUpdateArtifacts(
+            ArtifactsBusinessLogic.ArtifactOperationEnum operation, List<ArtifactDefinition> createdArtifacts,
+            String yamlFileName, CsarInfo csarInfo, Service preparedService,
+            NodeTypeInfoToUpdateArtifacts nodeTypeInfoToUpdateArtifacts, boolean inTransaction, boolean shouldLock) {
+
+        String nodeName = nodeTypeInfoToUpdateArtifacts.getNodeName();
+        Service resource = preparedService;
+        Map<String, EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<ArtifactDefinition>>> nodeTypesArtifactsToHandle = nodeTypeInfoToUpdateArtifacts
+                .getNodeTypesArtifactsToHandle();
+
+        Either<Service, ResponseFormat> createdCsarArtifactsEither = handleVfCsarArtifacts(preparedService, csarInfo, createdArtifacts,
+                new ArtifactOperationInfo(false, false, operation), shouldLock, inTransaction);
+        log.trace("************* Finished to add artifacts from yaml {}", yamlFileName);
+        if (createdCsarArtifactsEither.isRight()) {
+            return createdCsarArtifactsEither;
+        }
+        resource = createdCsarArtifactsEither.left().value();
+        return Either.left(resource);
+    }
+
+    protected Either<Service, ResponseFormat> handleVfCsarArtifacts(Service service, CsarInfo csarInfo,
+                                                                  List<ArtifactDefinition> createdArtifacts, ArtifactOperationInfo artifactOperation, boolean shouldLock,
+                                                                  boolean inTransaction) {
+
+        if (csarInfo.getCsar() != null) {
+            String vendorLicenseModelId = null;
+            String vfLicenseModelId = null;
+            if (artifactOperation.getArtifactOperationEnum() == ArtifactsBusinessLogic.ArtifactOperationEnum.UPDATE) {
+                Map<String, ArtifactDefinition> deploymentArtifactsMap = service.getDeploymentArtifacts();
+                if (deploymentArtifactsMap != null && !deploymentArtifactsMap.isEmpty()) {
+                    for (Map.Entry<String, ArtifactDefinition> artifactEntry : deploymentArtifactsMap.entrySet()) {
+                        if (artifactEntry.getValue().getArtifactName().equalsIgnoreCase(Constants.VENDOR_LICENSE_MODEL)) {
+                            vendorLicenseModelId = artifactEntry.getValue().getUniqueId();
+                        }
+                        if (artifactEntry.getValue().getArtifactName().equalsIgnoreCase(Constants.VF_LICENSE_MODEL)) {
+                            vfLicenseModelId = artifactEntry.getValue().getUniqueId();
+                        }
+                    }
+                }
+            }
+            createOrUpdateSingleNonMetaArtifact(service, csarInfo,
+                    CsarUtils.ARTIFACTS_PATH + Constants.VENDOR_LICENSE_MODEL, Constants.VENDOR_LICENSE_MODEL,
+                    ArtifactTypeEnum.VENDOR_LICENSE.getType(), ArtifactGroupTypeEnum.DEPLOYMENT,
+                    Constants.VENDOR_LICENSE_LABEL, Constants.VENDOR_LICENSE_DISPLAY_NAME,
+                    Constants.VENDOR_LICENSE_DESCRIPTION, vendorLicenseModelId, artifactOperation, null, true, shouldLock,
+                    inTransaction);
+            createOrUpdateSingleNonMetaArtifact(service, csarInfo,
+                    CsarUtils.ARTIFACTS_PATH + Constants.VF_LICENSE_MODEL, Constants.VF_LICENSE_MODEL,
+                    ArtifactTypeEnum.VF_LICENSE.getType(), ArtifactGroupTypeEnum.DEPLOYMENT, Constants.VF_LICENSE_LABEL,
+                    Constants.VF_LICENSE_DISPLAY_NAME, Constants.VF_LICENSE_DESCRIPTION, vfLicenseModelId,
+                    artifactOperation, null, true, shouldLock, inTransaction);
+
+            Either<Service, ResponseFormat> eitherCreateResult = createOrUpdateNonMetaArtifacts(csarInfo, service,
+                    createdArtifacts, shouldLock, inTransaction, artifactOperation);
+            if (eitherCreateResult.isRight()) {
+                return Either.right(eitherCreateResult.right().value());
+            }
+            Either<Service, StorageOperationStatus> eitherGerResource = toscaOperationFacade
+                    .getToscaElement(service.getUniqueId());
+            if (eitherGerResource.isRight()) {
+                ResponseFormat responseFormat = componentsUtils.getResponseFormatByComponent(
+                        componentsUtils.convertFromStorageResponse(eitherGerResource.right().value()), service, ComponentTypeEnum.SERVICE);
+                return Either.right(responseFormat);
+            }
+            service = eitherGerResource.left().value();
+            Either<ImmutablePair<String, String>, ResponseFormat> artifacsMetaCsarStatus = CsarValidationUtils.getArtifactsMeta(csarInfo.getCsar(), csarInfo.getCsarUUID(), componentsUtils);
+
+            if (artifacsMetaCsarStatus.isLeft()) {
+                String artifactsFileName = artifacsMetaCsarStatus.left().value().getKey();
+                String artifactsContents = artifacsMetaCsarStatus.left().value().getValue();
+                Either<Service, ResponseFormat> createArtifactsFromCsar;
+                if (ArtifactsBusinessLogic.ArtifactOperationEnum.isCreateOrLink(artifactOperation.getArtifactOperationEnum())) {
+                    createArtifactsFromCsar = csarArtifactsAndGroupsBusinessLogic.createResourceArtifactsFromCsar(csarInfo, service, artifactsContents, artifactsFileName, createdArtifacts);
+                } else {
+                    Either<Component, ResponseFormat> result = csarArtifactsAndGroupsBusinessLogic.updateResourceArtifactsFromCsar(csarInfo, service, artifactsContents, artifactsFileName, createdArtifacts, shouldLock, inTransaction);
+                    if ((result.left().value() instanceof Service) && result.isLeft()) {
+                        Service service1 = (Service) result.left().value();
+                        createArtifactsFromCsar = Either.left(service1);
+                    } else {
+                        createArtifactsFromCsar = Either.right(result.right().value());
+                    }
+                }
+                if (createArtifactsFromCsar.isRight()) {
+                    log.debug("Couldn't create artifacts from artifacts.meta");
+                    return Either.right(createArtifactsFromCsar.right().value());
+                }
+                return Either.left(createArtifactsFromCsar.left().value());
+            } else {
+                return csarArtifactsAndGroupsBusinessLogic.deleteVFModules(service, csarInfo, shouldLock, inTransaction);
+            }
+        }
+        return Either.left(service);
+    }
+
+    protected Either<Service, ResponseFormat> createOrUpdateNonMetaArtifacts(CsarInfo csarInfo, Service resource,
+                                                                           List<ArtifactDefinition> createdArtifacts, boolean shouldLock, boolean inTransaction,
+                                                                           ArtifactOperationInfo artifactOperation) {
+        Either<Service, ResponseFormat> resStatus = null;
+        Map<String, Set<List<String>>> collectedWarningMessages = new HashMap<>();
+
+        try {
+            Either<List<CsarUtils.NonMetaArtifactInfo>, String> artifactPathAndNameList = getValidArtifactNames(csarInfo, collectedWarningMessages);
+            if (artifactPathAndNameList.isRight()) {
+                return Either.right(getComponentsUtils().getResponseFormatByArtifactId(
+                        ActionStatus.ARTIFACT_NAME_INVALID, artifactPathAndNameList.right().value()));
+            }
+            EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<CsarUtils.NonMetaArtifactInfo>> vfCsarArtifactsToHandle = null;
+
+            if (ArtifactsBusinessLogic.ArtifactOperationEnum.isCreateOrLink(artifactOperation.getArtifactOperationEnum())) {
+                vfCsarArtifactsToHandle = new EnumMap<>(ArtifactsBusinessLogic.ArtifactOperationEnum.class);
+                vfCsarArtifactsToHandle.put(artifactOperation.getArtifactOperationEnum(), artifactPathAndNameList.left().value());
+            } else {
+                Either<EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<CsarUtils.NonMetaArtifactInfo>>, ResponseFormat> findVfCsarArtifactsToHandleRes = findVfCsarArtifactsToHandle(
+                        resource, artifactPathAndNameList.left().value(), csarInfo.getModifier());
+
+                if (findVfCsarArtifactsToHandleRes.isRight()) {
+                    resStatus = Either.right(findVfCsarArtifactsToHandleRes.right().value());
+                }
+                if (resStatus == null) {
+                    vfCsarArtifactsToHandle = findVfCsarArtifactsToHandleRes.left().value();
+                }
+            }
+            if (resStatus == null && vfCsarArtifactsToHandle != null) {
+                resStatus = processCsarArtifacts(csarInfo, resource, createdArtifacts, shouldLock, inTransaction, resStatus, vfCsarArtifactsToHandle);
+            }
+            if (resStatus == null) {
+                resStatus = Either.left(resource);
+            }
+        } catch (Exception e) {
+            resStatus = Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
+            log.debug("Exception occured in createNonMetaArtifacts, message:{}", e.getMessage(), e);
+        } finally {
+            CsarUtils.handleWarningMessages(collectedWarningMessages);
+        }
+        return resStatus;
+    }
+
+    protected Either<EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<CsarUtils.NonMetaArtifactInfo>>, ResponseFormat> findVfCsarArtifactsToHandle(
+            Service resource, List<CsarUtils.NonMetaArtifactInfo> artifactPathAndNameList, User user) {
+        List<ArtifactDefinition> existingArtifacts = new ArrayList<>();
+        if (resource.getDeploymentArtifacts() != null && !resource.getDeploymentArtifacts().isEmpty()) {
+            existingArtifacts.addAll(resource.getDeploymentArtifacts().values());
+        }
+        if (resource.getArtifacts() != null && !resource.getArtifacts().isEmpty()) {
+            existingArtifacts.addAll(resource.getArtifacts().values());
+        }
+        existingArtifacts = existingArtifacts.stream().filter(this::isNonMetaArtifact).collect(toList());
+
+        List<String> artifactsToIgnore = new ArrayList<>();
+        if (resource.getGroups() != null) {
+            resource.getGroups().stream().forEach(g -> {
+                if (g.getArtifacts() != null && !g.getArtifacts().isEmpty()) {
+                    artifactsToIgnore.addAll(g.getArtifacts());
+                }
+            });
+        }
+        existingArtifacts = existingArtifacts.stream()
+                .filter(a -> !artifactsToIgnore.contains(a.getUniqueId())).collect(toList());
+        return organizeVfCsarArtifactsByArtifactOperation(artifactPathAndNameList, existingArtifacts, resource, user);
+    }
+
+    protected Either<EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<CsarUtils.NonMetaArtifactInfo>>, ResponseFormat> organizeVfCsarArtifactsByArtifactOperation(
+            List<CsarUtils.NonMetaArtifactInfo> artifactPathAndNameList, List<ArtifactDefinition> existingArtifactsToHandle,
+            Service resource, User user) {
+        EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<CsarUtils.NonMetaArtifactInfo>> nodeTypeArtifactsToHandle = new EnumMap<>(
+                ArtifactsBusinessLogic.ArtifactOperationEnum.class);
+        Wrapper<ResponseFormat> responseWrapper = new Wrapper<>();
+        Either<EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<CsarUtils.NonMetaArtifactInfo>>, ResponseFormat> nodeTypeArtifactsToHandleRes = Either
+                .left(nodeTypeArtifactsToHandle);
+        try {
+            List<CsarUtils.NonMetaArtifactInfo> artifactsToUpload = new ArrayList<>(artifactPathAndNameList);
+            List<CsarUtils.NonMetaArtifactInfo> artifactsToUpdate = new ArrayList<>();
+            List<CsarUtils.NonMetaArtifactInfo> artifactsToDelete = new ArrayList<>();
+            for (CsarUtils.NonMetaArtifactInfo currNewArtifact : artifactPathAndNameList) {
+                ArtifactDefinition foundArtifact;
+
+                if (!existingArtifactsToHandle.isEmpty()) {
+                    foundArtifact = existingArtifactsToHandle.stream()
+                            .filter(a -> a.getArtifactName().equals(currNewArtifact.getArtifactName())).findFirst()
+                            .orElse(null);
+                    if (foundArtifact != null) {
+                        if (ArtifactTypeEnum.findType(foundArtifact.getArtifactType()).equals(currNewArtifact
+                                .getArtifactType())) {
+                            if (!foundArtifact.getArtifactChecksum().equals(currNewArtifact.getArtifactChecksum())) {
+                                currNewArtifact.setArtifactUniqueId(foundArtifact.getUniqueId());
+                                artifactsToUpdate.add(currNewArtifact);
+                            }
+                            existingArtifactsToHandle.remove(foundArtifact);
+                            artifactsToUpload.remove(currNewArtifact);
+                        } else {
+                            log.debug("Can't upload two artifact with the same name {}.",
+                                    currNewArtifact.getArtifactName());
+                            ResponseFormat responseFormat = ResponseFormatManager.getInstance().getResponseFormat(
+                                    ActionStatus.ARTIFACT_ALREADY_EXIST_IN_DIFFERENT_TYPE_IN_CSAR,
+                                    currNewArtifact.getArtifactName(), currNewArtifact.getArtifactType(),
+                                    foundArtifact.getArtifactType());
+                            AuditingActionEnum auditingAction = serviceBusinessLogic.artifactsBusinessLogic
+                                    .detectAuditingType(new ArtifactOperationInfo(false, false,
+                                            ArtifactsBusinessLogic.ArtifactOperationEnum.CREATE), foundArtifact.getArtifactChecksum());
+                            serviceBusinessLogic.artifactsBusinessLogic.handleAuditing(auditingAction, resource, resource.getUniqueId(),
+                                    user, null, null, foundArtifact.getUniqueId(), responseFormat,
+                                    resource.getComponentType(), null);
+                            responseWrapper.setInnerElement(responseFormat);
+                            break;
+                        }
+                    }
+                }
+            }
+            if (responseWrapper.isEmpty()) {
+                for (ArtifactDefinition currArtifact : existingArtifactsToHandle) {
+                    if (currArtifact.getIsFromCsar()) {
+                        artifactsToDelete.add(new CsarUtils.NonMetaArtifactInfo(currArtifact.getArtifactName(), null, ArtifactTypeEnum.findType(currArtifact.getArtifactType()), currArtifact.getArtifactGroupType(), null, currArtifact.getUniqueId(), currArtifact.getIsFromCsar()));
+                    } else {
+                        artifactsToUpdate.add(new CsarUtils.NonMetaArtifactInfo(currArtifact.getArtifactName(), null, ArtifactTypeEnum.findType(currArtifact.getArtifactType()), currArtifact.getArtifactGroupType(), null, currArtifact.getUniqueId(), currArtifact.getIsFromCsar()));
+                    }
+                }
+            }
+            if (responseWrapper.isEmpty()) {
+                if (!artifactsToUpload.isEmpty()) {
+                    nodeTypeArtifactsToHandle.put(ArtifactsBusinessLogic.ArtifactOperationEnum.CREATE, artifactsToUpload);
+                }
+                if (!artifactsToUpdate.isEmpty()) {
+                    nodeTypeArtifactsToHandle.put(ArtifactsBusinessLogic.ArtifactOperationEnum.UPDATE, artifactsToUpdate);
+                }
+                if (!artifactsToDelete.isEmpty()) {
+                    nodeTypeArtifactsToHandle.put(ArtifactsBusinessLogic.ArtifactOperationEnum.DELETE, artifactsToDelete);
+                }
+            }
+            if (!responseWrapper.isEmpty()) {
+                nodeTypeArtifactsToHandleRes = Either.right(responseWrapper.getInnerElement());
+            }
+        } catch (Exception e) {
+            ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR);
+            responseWrapper.setInnerElement(responseFormat);
+            log.debug("Exception occured when findNodeTypeArtifactsToHandle, error is:{}", e.getMessage(), e);
+            nodeTypeArtifactsToHandleRes = Either.right(responseWrapper.getInnerElement());
+        }
+        return nodeTypeArtifactsToHandleRes;
+    }
+
+    protected Either<Service, ResponseFormat> processCsarArtifacts(CsarInfo csarInfo, Service resource, List<ArtifactDefinition> createdArtifacts, boolean shouldLock, boolean inTransaction, Either<Service, ResponseFormat> resStatus, EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<CsarUtils.NonMetaArtifactInfo>> vfCsarArtifactsToHandle) {
+        for (Map.Entry<ArtifactsBusinessLogic.ArtifactOperationEnum, List<CsarUtils.NonMetaArtifactInfo>> currArtifactOperationPair : vfCsarArtifactsToHandle
+                .entrySet()) {
+            Optional<ResponseFormat> optionalCreateInDBError =
+                    currArtifactOperationPair.getValue().stream()
+                            .map(e -> createOrUpdateSingleNonMetaArtifact(resource, csarInfo, e.getPath(),
+                                    e.getArtifactName(), e.getArtifactType(),
+                                    e.getArtifactGroupType(), e.getArtifactLabel(), e.getDisplayName(),
+                                    CsarUtils.ARTIFACT_CREATED_FROM_CSAR, e.getArtifactUniqueId(),
+                                    new ArtifactOperationInfo(false, false,
+                                            currArtifactOperationPair.getKey()),
+                                    createdArtifacts, e.isFromCsar(), shouldLock, inTransaction))
+                            .filter(Either::isRight).
+                            map(e -> e.right().value()).
+                            findAny();
+            if (optionalCreateInDBError.isPresent()) {
+                resStatus = Either.right(optionalCreateInDBError.get());
+                break;
+            }
+        }
+        return resStatus;
+    }
+
+    public ComponentsUtils getComponentsUtils() {
+        return this.componentsUtils;
+    }
+
+    public void setComponentsUtils(ComponentsUtils componentsUtils) {
+        this.componentsUtils = componentsUtils;
+    }
+
+    protected Either<List<CsarUtils.NonMetaArtifactInfo>, String> getValidArtifactNames(CsarInfo csarInfo, Map<String, Set<List<String>>> collectedWarningMessages) {
+        List<CsarUtils.NonMetaArtifactInfo> artifactPathAndNameList =
+                csarInfo.getCsar().entrySet().stream()
+                        .filter(e -> Pattern.compile(VF_NODE_TYPE_ARTIFACTS_PATH_PATTERN).matcher(e.getKey())
+                                .matches())
+                        .map(e -> CsarUtils.validateNonMetaArtifact(e.getKey(), e.getValue(),
+                                collectedWarningMessages))
+                        .filter(Either::isLeft)
+                        .map(e -> e.left().value())
+                        .collect(toList());
+        Pattern englishNumbersAndUnderScoresOnly = Pattern.compile(CsarUtils.VALID_ENGLISH_ARTIFACT_NAME);
+        for (CsarUtils.NonMetaArtifactInfo nonMetaArtifactInfo : artifactPathAndNameList) {
+            if (!englishNumbersAndUnderScoresOnly.matcher(nonMetaArtifactInfo.getDisplayName()).matches()) {
+                return Either.right(nonMetaArtifactInfo.getArtifactName());
+            }
+        }
+        return Either.left(artifactPathAndNameList);
+    }
+
+    protected Either<Boolean, ResponseFormat> createOrUpdateSingleNonMetaArtifact(Service service, CsarInfo csarInfo,
+                                                                                String artifactPath, String artifactFileName, String artifactType, ArtifactGroupTypeEnum artifactGroupType,
+                                                                                String artifactLabel, String artifactDisplayName, String artifactDescription, String artifactId,
+                                                                                ArtifactOperationInfo operation, List<ArtifactDefinition> createdArtifacts, boolean isFromCsar, boolean shouldLock,
+                                                                                boolean inTransaction) {
+        byte[] artifactFileBytes = null;
+        if (csarInfo.getCsar().containsKey(artifactPath)) {
+            artifactFileBytes = csarInfo.getCsar().get(artifactPath);
+        }
+        Either<Boolean, ResponseFormat> result = Either.left(true);
+        if (operation.getArtifactOperationEnum() == ArtifactsBusinessLogic.ArtifactOperationEnum.UPDATE || operation.getArtifactOperationEnum() == ArtifactsBusinessLogic.ArtifactOperationEnum.DELETE) {
+            if (serviceImportParseLogic.isArtifactDeletionRequired(artifactId, artifactFileBytes, isFromCsar)) {
+                Either<ArtifactDefinition, ResponseFormat> handleDelete = serviceBusinessLogic.artifactsBusinessLogic.handleDelete(service.getUniqueId(), artifactId, csarInfo.getModifier(), service,
+                        shouldLock, inTransaction);
+                if (handleDelete.isRight()) {
+                    result = Either.right(handleDelete.right().value());
+                }
+                return result;
+            }
+            if (org.apache.commons.lang.StringUtils.isEmpty(artifactId) && artifactFileBytes != null) {
+                operation = new ArtifactOperationInfo(false, false,
+                        ArtifactsBusinessLogic.ArtifactOperationEnum.CREATE);
+            }
+        }
+        if (artifactFileBytes != null) {
+            Map<String, Object> vendorLicenseModelJson = ArtifactUtils.buildJsonForUpdateArtifact(artifactId, artifactFileName,
+                    artifactType, artifactGroupType, artifactLabel, artifactDisplayName, artifactDescription,
+                    artifactFileBytes, null, isFromCsar);
+            Either<Either<ArtifactDefinition, Operation>, ResponseFormat> eitherNonMetaArtifacts = csarArtifactsAndGroupsBusinessLogic.createOrUpdateCsarArtifactFromJson(
+                    service, csarInfo.getModifier(), vendorLicenseModelJson, operation);
+            serviceImportParseLogic
+                    .addNonMetaCreatedArtifactsToSupportRollback(operation, createdArtifacts, eitherNonMetaArtifacts);
+            if (eitherNonMetaArtifacts.isRight()) {
+                BeEcompErrorManager.getInstance()
+                        .logInternalFlowError("UploadLicenseArtifact", "Failed to upload license artifact: "
+                                        + artifactFileName + "With csar uuid: " + csarInfo.getCsarUUID(),
+                                BeEcompErrorManager.ErrorSeverity.WARNING);
+                return Either.right(eitherNonMetaArtifacts.right().value());
+            }
+        }
+        return result;
+    }
+
+    protected Either<Service, ResponseFormat> createGroupsOnResource(Service service,
+                                                                   Map<String, GroupDefinition> groups) {
+        if (groups != null && !groups.isEmpty()) {
+            List<GroupDefinition> groupsAsList = updateGroupsMembersUsingResource(groups, service);
+            serviceImportParseLogic.handleGroupsProperties(service, groups);
+            serviceImportParseLogic.fillGroupsFinalFields(groupsAsList);
+            Either<List<GroupDefinition>, ResponseFormat> createGroups = serviceBusinessLogic.groupBusinessLogic.createGroups(service,
+                    groupsAsList, true);
+            if (createGroups.isRight()) {
+                return Either.right(createGroups.right().value());
+            }
+        } else {
+            return Either.left(service);
+        }
+        Either<Service, StorageOperationStatus> updatedResource = toscaOperationFacade
+                .getToscaElement(service.getUniqueId());
+        if (updatedResource.isRight()) {
+            ResponseFormat responseFormat = componentsUtils.getResponseFormatByComponent(
+                    componentsUtils.convertFromStorageResponse(updatedResource.right().value()), service, ComponentTypeEnum.SERVICE);
+            return Either.right(responseFormat);
+        }
+        return Either.left(updatedResource.left().value());
+    }
+
+    protected List<GroupDefinition> updateGroupsMembersUsingResource(Map<String, GroupDefinition> groups, Service component) {
+        List<GroupDefinition> result = new ArrayList<>();
+        List<ComponentInstance> componentInstances = component.getComponentInstances();
+        if (groups != null) {
+            Either<Boolean, ResponseFormat> validateCyclicGroupsDependencies = serviceImportParseLogic.validateCyclicGroupsDependencies(groups);
+            if (validateCyclicGroupsDependencies.isRight()) {
+                throw new ComponentException(validateCyclicGroupsDependencies.right().value());
+            }
+            for (Map.Entry<String, GroupDefinition> entry : groups.entrySet()) {
+                String groupName = entry.getKey();
+                GroupDefinition groupDefinition = entry.getValue();
+                GroupDefinition updatedGroupDefinition = new GroupDefinition(groupDefinition);
+                updatedGroupDefinition.setMembers(null);
+                Map<String, String> members = groupDefinition.getMembers();
+                if (members != null) {
+                    serviceImportParseLogic
+                            .updateGroupMembers(groups, updatedGroupDefinition, component, componentInstances, groupName, members);
+                }
+                result.add(updatedGroupDefinition);
+            }
+        }
+        return result;
+    }
+
+
+    protected Resource createRIAndRelationsFromYaml(String yamlName, Resource resource,
+                                                  Map<String, UploadComponentInstanceInfo> uploadComponentInstanceInfoMap,
+                                                  String topologyTemplateYaml, List<ArtifactDefinition> nodeTypesNewCreatedArtifacts,
+                                                  Map<String, NodeTypeInfo> nodeTypesInfo, CsarInfo csarInfo,
+                                                  Map<String, EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<ArtifactDefinition>>> nodeTypesArtifactsToCreate,
+                                                  String nodeName) {
+        try {
+            log.debug("************* Going to create all nodes {}", yamlName);
+            handleNodeTypes(yamlName, resource, topologyTemplateYaml, false, nodeTypesArtifactsToCreate, nodeTypesNewCreatedArtifacts,
+                    nodeTypesInfo, csarInfo, nodeName);
+            log.debug("************* Going to create all resource instances {}", yamlName);
+            resource = createResourceInstances(yamlName, resource,
+                    uploadComponentInstanceInfoMap, csarInfo.getCreatedNodes());
+            log.debug("************* Finished to create all resource instances {}", yamlName);
+            resource = createResourceInstancesRelations(csarInfo.getModifier(), yamlName, resource, uploadComponentInstanceInfoMap);
+            log.debug("************* Going to create positions {}", yamlName);
+            compositionBusinessLogic.setPositionsForComponentInstances(resource, csarInfo.getModifier().getUserId());
+            log.debug("************* Finished to set positions {}", yamlName);
+            return resource;
+        } catch (Exception e) {
+            throw new ComponentException(ActionStatus.GENERAL_ERROR);
+        }
+    }
+
+    protected Resource createResourceInstancesRelations(User user, String yamlName, Resource resource,
+                                                      Map<String, UploadComponentInstanceInfo> uploadResInstancesMap) {
+        log.debug("#createResourceInstancesRelations - Going to create relations ");
+        List<ComponentInstance> componentInstancesList = resource.getComponentInstances();
+        if (((MapUtils.isEmpty(uploadResInstancesMap) || CollectionUtils.isEmpty(componentInstancesList)) &&
+                resource.getResourceType() != ResourceTypeEnum.PNF)) { // PNF can have no resource instances
+            log.debug("#createResourceInstancesRelations - No instances found in the resource {} is empty, yaml template file name {}, ", resource.getUniqueId(), yamlName);
+            BeEcompErrorManager.getInstance().logInternalDataError("createResourceInstancesRelations", "No instances found in a resource or nn yaml template. ", BeEcompErrorManager.ErrorSeverity.ERROR);
+            throw new ComponentException(componentsUtils.getResponseFormat(ActionStatus.NOT_TOPOLOGY_TOSCA_TEMPLATE, yamlName));
+        }
+        Map<String, List<ComponentInstanceProperty>> instProperties = new HashMap<>();
+        Map<ComponentInstance, Map<String, List<CapabilityDefinition>>> instCapabilities = new HashMap<>();
+        Map<ComponentInstance, Map<String, List<RequirementDefinition>>> instRequirements = new HashMap<>();
+        Map<String, Map<String, ArtifactDefinition>> instDeploymentArtifacts = new HashMap<>();
+        Map<String, Map<String, ArtifactDefinition>> instArtifacts = new HashMap<>();
+        Map<String, List<AttributeDataDefinition>> instAttributes = new HashMap<>();
+        Map<String, Resource> originCompMap = new HashMap<>();
+        List<RequirementCapabilityRelDef> relations = new ArrayList<>();
+        Map<String, List<ComponentInstanceInput>> instInputs = new HashMap<>();
+
+        log.debug("enter ServiceImportBusinessLogic createResourceInstancesRelations#createResourceInstancesRelations - Before get all datatypes. ");
+        Either<Map<String, DataTypeDefinition>, JanusGraphOperationStatus> allDataTypes = serviceBusinessLogic.dataTypeCache.getAll();
+        if (allDataTypes.isRight()) {
+            JanusGraphOperationStatus status = allDataTypes.right().value();
+            BeEcompErrorManager.getInstance().logInternalFlowError("UpdatePropertyValueOnComponentInstance",
+                    "Failed to update property value on instance. Status is " + status, BeEcompErrorManager.ErrorSeverity.ERROR);
+            throw new ComponentException(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(
+                    DaoStatusConverter.convertJanusGraphStatusToStorageStatus(status)), yamlName));
+        }
+        Resource finalResource = resource;
+        uploadResInstancesMap
+                .values()
+                .forEach(i -> processComponentInstance(yamlName, finalResource, componentInstancesList, allDataTypes,
+                        instProperties, instCapabilities, instRequirements, instDeploymentArtifacts,
+                        instArtifacts, instAttributes, originCompMap, instInputs, i));
+        serviceImportParseLogic.associateComponentInstancePropertiesToComponent(yamlName, resource, instProperties);
+        serviceImportParseLogic.associateComponentInstanceInputsToComponent(yamlName, resource, instInputs);
+        serviceImportParseLogic
+                .associateDeploymentArtifactsToInstances(user, yamlName, resource, instDeploymentArtifacts);
+        serviceImportParseLogic.associateArtifactsToInstances(yamlName, resource, instArtifacts);
+        serviceImportParseLogic.associateOrAddCalculatedCapReq(yamlName, resource, instCapabilities, instRequirements);
+        serviceImportParseLogic.associateInstAttributeToComponentToInstances(yamlName, resource, instAttributes);
+        resource = serviceImportParseLogic.getResourceAfterCreateRelations(resource);
+
+        serviceImportParseLogic
+                .addRelationsToRI(yamlName, resource, uploadResInstancesMap, componentInstancesList, relations);
+        serviceImportParseLogic.associateResourceInstances(yamlName, resource, relations);
+        handleSubstitutionMappings(resource, uploadResInstancesMap);
+        log.debug("************* in create relations, getResource start");
+        Either<Resource, StorageOperationStatus> eitherGetResource = toscaOperationFacade.getToscaElement(resource.getUniqueId());
+        log.debug("************* in create relations, getResource end");
+        if (eitherGetResource.isRight()) {
+            throw new ComponentException(componentsUtils.getResponseFormatByResource(
+                    componentsUtils.convertFromStorageResponse(eitherGetResource.right().value()), resource));
+        }
+        return eitherGetResource.left().value();
+    }
+
+    protected void processComponentInstance(String yamlName, Resource resource, List<ComponentInstance> componentInstancesList, Either<Map<String, DataTypeDefinition>, JanusGraphOperationStatus> allDataTypes, Map<String, List<ComponentInstanceProperty>> instProperties, Map<ComponentInstance, Map<String, List<CapabilityDefinition>>> instCapabilties, Map<ComponentInstance, Map<String, List<RequirementDefinition>>> instRequirements, Map<String, Map<String, ArtifactDefinition>> instDeploymentArtifacts, Map<String, Map<String, ArtifactDefinition>> instArtifacts, Map<String, List<AttributeDataDefinition>> instAttributes, Map<String, Resource> originCompMap, Map<String, List<ComponentInstanceInput>> instInputs, UploadComponentInstanceInfo uploadComponentInstanceInfo) {
+        Optional<ComponentInstance> currentCompInstanceOpt = componentInstancesList.stream()
+                .filter(i -> i.getName().equals(uploadComponentInstanceInfo.getName()))
+                .findFirst();
+        if (!currentCompInstanceOpt.isPresent()) {
+            log.debug(COMPONENT_INSTANCE_WITH_NAME_IN_RESOURCE, uploadComponentInstanceInfo.getName(),
+                    resource.getUniqueId());
+            BeEcompErrorManager.getInstance().logInternalDataError(
+                    COMPONENT_INSTANCE_WITH_NAME + uploadComponentInstanceInfo.getName() + IN_RESOURCE,
+                    resource.getUniqueId(), BeEcompErrorManager.ErrorSeverity.ERROR);
+            ResponseFormat responseFormat = componentsUtils
+                    .getResponseFormat(ActionStatus.NOT_TOPOLOGY_TOSCA_TEMPLATE, yamlName);
+            throw new ComponentException(responseFormat);
+        }
+        ComponentInstance currentCompInstance = currentCompInstanceOpt.get();
+        String resourceInstanceId = currentCompInstance.getUniqueId();
+        Resource originResource = getOriginResource(yamlName, originCompMap, currentCompInstance);
+        log.debug("enter processComponentInstance,get originResource Requirements:{}",
+                originResource.getRequirements());
+        if (MapUtils.isNotEmpty(originResource.getRequirements())) {
+            instRequirements.put(currentCompInstance, originResource.getRequirements());
+        }
+        if (MapUtils.isNotEmpty(originResource.getCapabilities())) {
+            processComponentInstanceCapabilities(allDataTypes, instCapabilties, uploadComponentInstanceInfo,
+                    currentCompInstance, originResource);
+        }
+        if (originResource.getDeploymentArtifacts() != null && !originResource.getDeploymentArtifacts().isEmpty()) {
+            instDeploymentArtifacts.put(resourceInstanceId, originResource.getDeploymentArtifacts());
+        }
+        if (originResource.getArtifacts() != null && !originResource.getArtifacts().isEmpty()) {
+            instArtifacts.put(resourceInstanceId, originResource.getArtifacts());
+        }
+        if (originResource.getAttributes() != null && !originResource.getAttributes().isEmpty()) {
+            instAttributes.put(resourceInstanceId, originResource.getAttributes());
+        }
+        if (originResource.getResourceType() != ResourceTypeEnum.VF) {
+            ResponseFormat addPropertiesValueToRiRes = addPropertyValuesToRi(uploadComponentInstanceInfo, resource,
+                    originResource, currentCompInstance, instProperties, allDataTypes.left().value());
+            if (addPropertiesValueToRiRes.getStatus() != 200) {
+                throw new ComponentException(addPropertiesValueToRiRes);
+            }
+        } else {
+            addInputsValuesToRi(uploadComponentInstanceInfo, resource,
+                    originResource, currentCompInstance, instInputs, allDataTypes.left().value());
+        }
+    }
+
+    protected void addInputsValuesToRi(UploadComponentInstanceInfo uploadComponentInstanceInfo,
+                                     Resource resource, Resource originResource, ComponentInstance currentCompInstance,
+                                     Map<String, List<ComponentInstanceInput>> instInputs, Map<String, DataTypeDefinition> allDataTypes) {
+        Map<String, List<UploadPropInfo>> propMap = uploadComponentInstanceInfo.getProperties();
+        try {
+            if (MapUtils.isNotEmpty(propMap)) {
+                Map<String, InputDefinition> currPropertiesMap = new HashMap<>();
+                List<ComponentInstanceInput> instPropList = new ArrayList<>();
+
+                if (CollectionUtils.isEmpty(originResource.getInputs())) {
+                    log.debug("failed to find properties ");
+                    throw new ComponentException(componentsUtils.getResponseFormat(ActionStatus.PROPERTY_NOT_FOUND));
+                }
+                originResource.getInputs().forEach(p -> serviceImportParseLogic.addInput(currPropertiesMap, p));
+                for (List<UploadPropInfo> propertyList : propMap.values()) {
+                    processProperty(resource, currentCompInstance, allDataTypes, currPropertiesMap, instPropList, propertyList);
+                }
+                currPropertiesMap.values().forEach(p -> instPropList.add(new ComponentInstanceInput(p)));
+                instInputs.put(currentCompInstance.getUniqueId(), instPropList);
+            }
+        } catch (Exception e) {
+            log.debug("failed to add Inputs Values To Ri");
+            throw new ComponentException(ActionStatus.GENERAL_ERROR);
+        }
+    }
+
+    protected void processProperty(Resource resource, ComponentInstance currentCompInstance, Map<String, DataTypeDefinition> allDataTypes, Map<String, InputDefinition> currPropertiesMap, List<ComponentInstanceInput> instPropList, List<UploadPropInfo> propertyList) {
+        UploadPropInfo propertyInfo = propertyList.get(0);
+        String propName = propertyInfo.getName();
+        if (!currPropertiesMap.containsKey(propName)) {
+            throw new ComponentException(componentsUtils.getResponseFormat(ActionStatus.PROPERTY_NOT_FOUND,
+                    propName));
+        }
+        InputDefinition curPropertyDef = currPropertiesMap.get(propName);
+        ComponentInstanceInput property = null;
+
+        String value = null;
+        List<GetInputValueDataDefinition> getInputs = null;
+        boolean isValidate = true;
+        if (propertyInfo.getValue() != null) {
+            getInputs = propertyInfo.getGet_input();
+            isValidate = getInputs == null || getInputs.isEmpty();
+            if (isValidate) {
+                value = getPropertyJsonStringValue(propertyInfo.getValue(),
+                        curPropertyDef.getType());
+            } else {
+                value = getPropertyJsonStringValue(propertyInfo.getValue(),
+                        TypeUtils.ToscaTagNamesEnum.GET_INPUT.getElementName());
+            }
+        }
+        String innerType = null;
+        property = new ComponentInstanceInput(curPropertyDef, value, null);
+        String validPropertyVAlue = serviceBusinessLogic.validatePropValueBeforeCreate(property, value, isValidate, allDataTypes);
+        property.setValue(validPropertyVAlue);
+
+        if (isNotEmpty(getInputs)) {
+            List<GetInputValueDataDefinition> getInputValues = new ArrayList<>();
+            for (GetInputValueDataDefinition getInput : getInputs) {
+                List<InputDefinition> inputs = resource.getInputs();
+                if (CollectionUtils.isEmpty(inputs)) {
+                    throw new ComponentException(componentsUtils.getResponseFormat(ActionStatus.INVALID_CONTENT));
+                }
+
+                Optional<InputDefinition> optional = inputs.stream()
+                        .filter(p -> p.getName().equals(getInput.getInputName())).findAny();
+                if (!optional.isPresent()) {
+                    throw new ComponentException(componentsUtils.getResponseFormat(ActionStatus.INVALID_CONTENT));
+                }
+                InputDefinition input = optional.get();
+                getInput.setInputId(input.getUniqueId());
+                getInputValues.add(getInput);
+
+                GetInputValueDataDefinition getInputIndex = getInput.getGetInputIndex();
+                processGetInput(getInputValues, inputs, getInputIndex);
+            }
+            property.setGetInputValues(getInputValues);
+        }
+        instPropList.add(property);
+        currPropertiesMap.remove(property.getName());
+    }
+
+    protected void handleSubstitutionMappings(Resource resource, Map<String, UploadComponentInstanceInfo> uploadResInstancesMap) {
+        if (resource.getResourceType() == ResourceTypeEnum.VF) {
+            Either<Resource, StorageOperationStatus> getResourceRes = toscaOperationFacade.getToscaFullElement(resource.getUniqueId());
+            if (getResourceRes.isRight()) {
+                ResponseFormat responseFormat = componentsUtils.getResponseFormatByResource(
+                        componentsUtils.convertFromStorageResponse(getResourceRes.right().value()), resource);
+                throw new ComponentException(responseFormat);
+            }
+            getResourceRes = updateCalculatedCapReqWithSubstitutionMappings(getResourceRes.left().value(),
+                    uploadResInstancesMap);
+            if (getResourceRes.isRight()) {
+                ResponseFormat responseFormat = componentsUtils.getResponseFormatByResource(
+                        componentsUtils.convertFromStorageResponse(getResourceRes.right().value()), resource);
+                throw new ComponentException(responseFormat);
+            }
+        }
+    }
+
+    protected Resource createResourceInstances(String yamlName, Resource resource,
+                                             Map<String, UploadComponentInstanceInfo> uploadResInstancesMap,
+                                             Map<String, Resource> nodeNamespaceMap) {
+        Either<Resource, ResponseFormat> eitherResource = null;
+        log.debug("createResourceInstances is {} - going to create resource instanse from CSAR", yamlName);
+        if (MapUtils.isEmpty(uploadResInstancesMap) && resource.getResourceType() != ResourceTypeEnum.PNF) { // PNF can have no resource instances
+            ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.NOT_TOPOLOGY_TOSCA_TEMPLATE);
+            throw new ComponentException(responseFormat);
+        }
+        Map<String, Resource> existingNodeTypeMap = new HashMap<>();
+        if (MapUtils.isNotEmpty(nodeNamespaceMap)) {
+            nodeNamespaceMap.forEach((k, v) -> existingNodeTypeMap.put(v.getToscaResourceName(), v));
+        }
+        Map<ComponentInstance, Resource> resourcesInstancesMap = new HashMap<>();
+        uploadResInstancesMap
+                .values()
+                .forEach(i -> createAndAddResourceInstance(i, yamlName, resource, nodeNamespaceMap, existingNodeTypeMap, resourcesInstancesMap));
+
+        if (MapUtils.isNotEmpty(resourcesInstancesMap)) {
+            try {
+                toscaOperationFacade.associateComponentInstancesToComponent(resource,
+                        resourcesInstancesMap, false, false);
+            } catch (StorageException exp) {
+                if (exp.getStorageOperationStatus() != null && exp.getStorageOperationStatus() != StorageOperationStatus.OK) {
+                    log.debug("Failed to add component instances to container component {}", resource.getName());
+                    ResponseFormat responseFormat = componentsUtils
+                            .getResponseFormat(componentsUtils.convertFromStorageResponse(exp.getStorageOperationStatus()));
+                    eitherResource = Either.right(responseFormat);
+                    throw new ByResponseFormatComponentException(eitherResource.right().value());
+                }
+            }
+        }
+        log.debug("*************Going to get resource {}", resource.getUniqueId());
+        Either<Resource, StorageOperationStatus> eitherGetResource = toscaOperationFacade
+                .getToscaElement(resource.getUniqueId(), serviceImportParseLogic.getComponentWithInstancesFilter());
+        log.debug("*************finished to get resource {}", resource.getUniqueId());
+        if (eitherGetResource.isRight()) {
+            ResponseFormat responseFormat = componentsUtils.getResponseFormatByResource(
+                    componentsUtils.convertFromStorageResponse(eitherGetResource.right().value()), resource);
+            throw new ComponentException(responseFormat);
+        }
+        if (CollectionUtils.isEmpty(eitherGetResource.left().value().getComponentInstances()) &&
+                resource.getResourceType() != ResourceTypeEnum.PNF) { // PNF can have no resource instances
+            log.debug("Error when create resource instance from csar. ComponentInstances list empty");
+            BeEcompErrorManager.getInstance().logBeDaoSystemError(
+                    "Error when create resource instance from csar. ComponentInstances list empty");
+            throw new ComponentException(componentsUtils.getResponseFormat(ActionStatus.NOT_TOPOLOGY_TOSCA_TEMPLATE));
+        }
+        return eitherGetResource.left().value();
+    }
+
+    protected void handleNodeTypes(String yamlName, Resource resource,
+                                 String topologyTemplateYaml, boolean needLock,
+                                 Map<String, EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<ArtifactDefinition>>> nodeTypesArtifactsToHandle,
+                                 List<ArtifactDefinition> nodeTypesNewCreatedArtifacts, Map<String, NodeTypeInfo> nodeTypesInfo,
+                                 CsarInfo csarInfo, String nodeName) {
+        try {
+            for (Map.Entry<String, NodeTypeInfo> nodeTypeEntry : nodeTypesInfo.entrySet()) {
+                if (nodeTypeEntry.getValue().isNested()) {
+
+                    handleNestedVfc(resource, nodeTypesArtifactsToHandle, nodeTypesNewCreatedArtifacts,
+                            nodeTypesInfo, csarInfo, nodeTypeEntry.getKey());
+                    log.trace("************* finished to create node {}", nodeTypeEntry.getKey());
+                }
+            }
+            Map<String, Object> mappedToscaTemplate = null;
+            if (org.apache.commons.lang.StringUtils.isNotEmpty(nodeName) && MapUtils.isNotEmpty(nodeTypesInfo)
+                    && nodeTypesInfo.containsKey(nodeName)) {
+                mappedToscaTemplate = nodeTypesInfo.get(nodeName).getMappedToscaTemplate();
+            }
+            if (MapUtils.isEmpty(mappedToscaTemplate)) {
+                mappedToscaTemplate = (Map<String, Object>) new Yaml().load(topologyTemplateYaml);
+            }
+            createResourcesFromYamlNodeTypesList(yamlName, resource, mappedToscaTemplate, needLock, nodeTypesArtifactsToHandle,
+                    nodeTypesNewCreatedArtifacts, nodeTypesInfo, csarInfo);
+        } catch (ComponentException e) {
+            ResponseFormat responseFormat = e.getResponseFormat() != null ? e.getResponseFormat()
+                    : componentsUtils.getResponseFormat(e.getActionStatus(), e.getParams());
+            componentsUtils.auditResource(responseFormat, csarInfo.getModifier(), resource, AuditingActionEnum.IMPORT_RESOURCE);
+            throw e;
+        } catch (StorageException e) {
+            ResponseFormat responseFormat = componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(e.getStorageOperationStatus()));
+            componentsUtils.auditResource(responseFormat, csarInfo.getModifier(), resource, AuditingActionEnum.IMPORT_RESOURCE);
+            throw e;
+        }catch (Exception e){
+            log.debug("Exception occured when handleNodeTypes, error is:{}", e.getMessage(), e);
+            throw new ComponentException(ActionStatus.GENERAL_ERROR);
+        }
+    }
+
+    protected Resource handleNestedVfc(Resource resource, Map<String, EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<ArtifactDefinition>>> nodesArtifactsToHandle,
+                                     List<ArtifactDefinition> createdArtifacts, Map<String, NodeTypeInfo> nodesInfo, CsarInfo csarInfo,
+                                     String nodeName) {
+        String yamlName = nodesInfo.get(nodeName).getTemplateFileName();
+        Map<String, Object> nestedVfcJsonMap = nodesInfo.get(nodeName).getMappedToscaTemplate();
+
+        log.debug("************* Going to create node types from yaml {}", yamlName);
+        createResourcesFromYamlNodeTypesList(yamlName, resource, nestedVfcJsonMap, false,
+                nodesArtifactsToHandle, createdArtifacts, nodesInfo, csarInfo);
+
+        if (nestedVfcJsonMap.containsKey(TypeUtils.ToscaTagNamesEnum.TOPOLOGY_TEMPLATE.getElementName())) {
+            log.debug("************* Going to handle complex VFC from yaml {}", yamlName);
+            resource = handleComplexVfc(resource, nodesArtifactsToHandle, createdArtifacts, nodesInfo,
+                    csarInfo, nodeName, yamlName);
+        }
+        return resource;
+    }
+
+    protected Resource handleComplexVfc(Resource resource, Map<String, EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<ArtifactDefinition>>> nodesArtifactsToHandle,
+                                      List<ArtifactDefinition> createdArtifacts, Map<String, NodeTypeInfo> nodesInfo, CsarInfo csarInfo,
+                                      String nodeName, String yamlName) {
+        Resource oldComplexVfc = null;
+        Resource newComplexVfc = serviceImportParseLogic.buildValidComplexVfc(resource, csarInfo, nodeName, nodesInfo);
+        Either<Resource, StorageOperationStatus> oldComplexVfcRes = toscaOperationFacade
+                .getFullLatestComponentByToscaResourceName(newComplexVfc.getToscaResourceName());
+        if (oldComplexVfcRes.isRight() && oldComplexVfcRes.right().value() == StorageOperationStatus.NOT_FOUND) {
+            oldComplexVfcRes = toscaOperationFacade.getFullLatestComponentByToscaResourceName(
+                    serviceImportParseLogic.buildNestedToscaResourceName(ResourceTypeEnum.VF.name(), csarInfo.getVfResourceName(),
+                            nodeName).getRight());
+        }
+        if (oldComplexVfcRes.isRight() && oldComplexVfcRes.right().value() != StorageOperationStatus.NOT_FOUND) {
+            throw new ComponentException(ActionStatus.GENERAL_ERROR);
+        } else if (oldComplexVfcRes.isLeft()) {
+            log.debug(VALIDATE_DERIVED_BEFORE_UPDATE);
+            Either<Boolean, ResponseFormat> eitherValidation = serviceImportParseLogic.validateNestedDerivedFromDuringUpdate(
+                    oldComplexVfcRes.left().value(), newComplexVfc,
+                    ValidationUtils.hasBeenCertified(oldComplexVfcRes.left().value().getVersion()));
+            if (eitherValidation.isLeft()) {
+                oldComplexVfc = oldComplexVfcRes.left().value();
+            }
+        }
+        newComplexVfc = handleComplexVfc(nodesArtifactsToHandle, createdArtifacts, nodesInfo, csarInfo, nodeName, yamlName,
+                oldComplexVfc, newComplexVfc);
+        csarInfo.getCreatedNodesToscaResourceNames().put(nodeName, newComplexVfc.getToscaResourceName());
+        LifecycleChangeInfoWithAction lifecycleChangeInfo = new LifecycleChangeInfoWithAction(
+                CERTIFICATION_ON_IMPORT, LifecycleChangeInfoWithAction.LifecycleChanceActionEnum.CREATE_FROM_CSAR);
+        log.debug("Going to certify cvfc {}. ", newComplexVfc.getName());
+        final Resource result = serviceImportParseLogic
+                .propagateStateToCertified(csarInfo.getModifier(), newComplexVfc, lifecycleChangeInfo, true, false,
+                        true);
+        csarInfo.getCreatedNodes().put(nodeName, result);
+        csarInfo.removeNodeFromQueue();
+        return result;
+    }
+
+    public Map<String, Resource> createResourcesFromYamlNodeTypesList(String yamlName, Resource resource, Map<String, Object> mappedToscaTemplate, boolean needLock,
+                                                                      Map<String, EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<ArtifactDefinition>>> nodeTypesArtifactsToHandle,
+                                                                      List<ArtifactDefinition> nodeTypesNewCreatedArtifacts, Map<String, NodeTypeInfo> nodeTypesInfo,
+                                                                      CsarInfo csarInfo) {
+        Either<String, ImportUtils.ResultStatusEnum> toscaVersion = findFirstToscaStringElement(mappedToscaTemplate,
+                TypeUtils.ToscaTagNamesEnum.TOSCA_VERSION);
+        if (toscaVersion.isRight()) {
+            throw new ComponentException(ActionStatus.INVALID_TOSCA_TEMPLATE);
+        }
+        Map<String, Object> mapToConvert = new HashMap<>();
+        mapToConvert.put(TypeUtils.ToscaTagNamesEnum.TOSCA_VERSION.getElementName(), toscaVersion.left().value());
+        Map<String, Object> nodeTypes = serviceImportParseLogic.getNodeTypesFromTemplate(mappedToscaTemplate);
+        createNodeTypes(yamlName, resource, needLock, nodeTypesArtifactsToHandle, nodeTypesNewCreatedArtifacts, nodeTypesInfo, csarInfo, mapToConvert, nodeTypes);
+        return csarInfo.getCreatedNodes();
+    }
+
+    protected void createNodeTypes(String yamlName, Resource resource, boolean needLock, Map<String, EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<ArtifactDefinition>>> nodeTypesArtifactsToHandle, List<ArtifactDefinition> nodeTypesNewCreatedArtifacts, Map<String, NodeTypeInfo> nodeTypesInfo, CsarInfo csarInfo, Map<String, Object> mapToConvert, Map<String, Object> nodeTypes) {
+        Iterator<Map.Entry<String, Object>> nodesNameValueIter = nodeTypes.entrySet().iterator();
+        Resource vfcCreated = null;
+        while (nodesNameValueIter.hasNext()) {
+            Map.Entry<String, Object> nodeType = nodesNameValueIter.next();
+            Map<ArtifactsBusinessLogic.ArtifactOperationEnum, List<ArtifactDefinition>> nodeTypeArtifactsToHandle = nodeTypesArtifactsToHandle == null
+                    || nodeTypesArtifactsToHandle.isEmpty() ? null
+                    : nodeTypesArtifactsToHandle.get(nodeType.getKey());
+
+            if (nodeTypesInfo.containsKey(nodeType.getKey())) {
+                log.trace("************* Going to handle nested vfc {}", nodeType.getKey());
+                vfcCreated = handleNestedVfc(resource,
+                        nodeTypesArtifactsToHandle, nodeTypesNewCreatedArtifacts, nodeTypesInfo, csarInfo,
+                        nodeType.getKey());
+                log.trace("************* Finished to handle nested vfc {}", nodeType.getKey());
+            } else if (csarInfo.getCreatedNodesToscaResourceNames() != null
+                    && !csarInfo.getCreatedNodesToscaResourceNames().containsKey(nodeType.getKey())) {
+                log.trace("************* Going to create node {}", nodeType.getKey());
+                ImmutablePair<Resource, ActionStatus> resourceCreated = createNodeTypeResourceFromYaml(yamlName, nodeType, csarInfo.getModifier(), mapToConvert,
+                        resource, needLock, nodeTypeArtifactsToHandle, nodeTypesNewCreatedArtifacts, true,
+                        csarInfo, true);
+                log.debug("************* Finished to create node {}", nodeType.getKey());
+
+                vfcCreated = resourceCreated.getLeft();
+                csarInfo.getCreatedNodesToscaResourceNames().put(nodeType.getKey(),
+                        vfcCreated.getToscaResourceName());
+            }
+            if (vfcCreated != null) {
+                csarInfo.getCreatedNodes().put(nodeType.getKey(), vfcCreated);
+            }
+            mapToConvert.remove(TypeUtils.ToscaTagNamesEnum.NODE_TYPES.getElementName());
+        }
+    }
+
+    protected ImmutablePair<Resource, ActionStatus> createNodeTypeResourceFromYaml(
+            String yamlName, Map.Entry<String, Object> nodeNameValue, User user, Map<String, Object> mapToConvert,
+            Resource resourceVf, boolean needLock,
+            Map<ArtifactsBusinessLogic.ArtifactOperationEnum, List<ArtifactDefinition>> nodeTypeArtifactsToHandle,
+            List<ArtifactDefinition> nodeTypesNewCreatedArtifacts, boolean forceCertificationAllowed, CsarInfo csarInfo,
+            boolean isNested) {
+        UploadResourceInfo resourceMetaData = serviceImportParseLogic
+                .fillResourceMetadata(yamlName, resourceVf, nodeNameValue.getKey(), user);
+
+        String singleVfcYaml = serviceImportParseLogic.buildNodeTypeYaml(nodeNameValue, mapToConvert,
+                resourceMetaData.getResourceType(), csarInfo);
+        user = serviceBusinessLogic.validateUser(user, "CheckIn Resource", resourceVf, AuditingActionEnum.CHECKIN_RESOURCE, true);
+        return serviceImportParseLogic.createResourceFromNodeType(singleVfcYaml, resourceMetaData, user, true, needLock,
+                nodeTypeArtifactsToHandle, nodeTypesNewCreatedArtifacts, forceCertificationAllowed, csarInfo,
+                nodeNameValue.getKey(), isNested);
+    }
+
+    protected Service createRIAndRelationsFromYaml(String yamlName, Service service,
+                                                 Map<String, UploadComponentInstanceInfo> uploadComponentInstanceInfoMap,
+                                                 String topologyTemplateYaml, List<ArtifactDefinition> nodeTypesNewCreatedArtifacts,
+                                                 Map<String, NodeTypeInfo> nodeTypesInfo, CsarInfo csarInfo,
+                                                 Map<String, EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<ArtifactDefinition>>> nodeTypesArtifactsToCreate,
+                                                 String nodeName) {
+        log.debug("************* Going to create all nodes {}", yamlName);
+        handleServiceNodeTypes(yamlName, service, topologyTemplateYaml, false, nodeTypesArtifactsToCreate, nodeTypesNewCreatedArtifacts, nodeTypesInfo, csarInfo, nodeName);
+        log.debug("************* Going to create all resource instances {}", yamlName);
+        service = createServiceInstances(yamlName, service, uploadComponentInstanceInfoMap, csarInfo.getCreatedNodes());
+        log.debug("************* Going to create all relations {}", yamlName);
+        service = createServiceInstancesRelations(csarInfo.getModifier(), yamlName, service, uploadComponentInstanceInfoMap);
+        log.debug("************* Going to create positions {}", yamlName);
+        compositionBusinessLogic.setPositionsForComponentInstances(service, csarInfo.getModifier().getUserId());
+        log.debug("************* Finished to set positions {}", yamlName);
+        return service;
+    }
+
+    protected Service createServiceInstancesRelations(User user, String yamlName, Service service,
+                                                    Map<String, UploadComponentInstanceInfo> uploadResInstancesMap) {
+        log.debug("#createResourceInstancesRelations - Going to create relations ");
+        List<ComponentInstance> componentInstancesList = service.getComponentInstances();
+        if (((MapUtils.isEmpty(uploadResInstancesMap) || CollectionUtils.isEmpty(componentInstancesList)))) { // PNF can have no resource instances
+            log.debug("#createResourceInstancesRelations - No instances found in the resource {} is empty, yaml template file name {}, ", service.getUniqueId(), yamlName);
+            BeEcompErrorManager.getInstance().logInternalDataError("createResourceInstancesRelations", "No instances found in a resource or nn yaml template. ", BeEcompErrorManager.ErrorSeverity.ERROR);
+            throw new ComponentException(componentsUtils.getResponseFormat(ActionStatus.NOT_TOPOLOGY_TOSCA_TEMPLATE, yamlName));
+        }
+        Map<String, List<ComponentInstanceProperty>> instProperties = new HashMap<>();
+        Map<ComponentInstance, Map<String, List<CapabilityDefinition>>> instCapabilities = new HashMap<>();
+        Map<ComponentInstance, Map<String, List<RequirementDefinition>>> instRequirements = new HashMap<>();
+        Map<String, Map<String, ArtifactDefinition>> instDeploymentArtifacts = new HashMap<>();
+        Map<String, Map<String, ArtifactDefinition>> instArtifacts = new HashMap<>();
+        Map<String, List<AttributeDataDefinition>> instAttributes = new HashMap<>();
+        Map<String, Resource> originCompMap = new HashMap<>();
+        List<RequirementCapabilityRelDef> relations = new ArrayList<>();
+        Map<String, List<ComponentInstanceInput>> instInputs = new HashMap<>();
+
+        log.debug("enter ServiceImportBusinessLogic  createServiceInstancesRelations#createResourceInstancesRelations - Before get all datatypes. ");
+        Either<Map<String, DataTypeDefinition>, JanusGraphOperationStatus> allDataTypes = serviceBusinessLogic.dataTypeCache.getAll();
+        if (allDataTypes.isRight()) {
+            JanusGraphOperationStatus status = allDataTypes.right().value();
+            BeEcompErrorManager.getInstance().logInternalFlowError("UpdatePropertyValueOnComponentInstance",
+                    "Failed to update property value on instance. Status is " + status, BeEcompErrorManager.ErrorSeverity.ERROR);
+            throw new ComponentException(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(
+                    DaoStatusConverter.convertJanusGraphStatusToStorageStatus(status)), yamlName));
+        }
+        Service finalResource = service;
+        uploadResInstancesMap
+                .values()
+                .forEach(i -> processComponentInstance(yamlName, finalResource, componentInstancesList, allDataTypes,
+                        instProperties, instCapabilities, instRequirements, instDeploymentArtifacts,
+                        instArtifacts, instAttributes, originCompMap, instInputs, i));
+        serviceImportParseLogic.associateComponentInstancePropertiesToComponent(yamlName, service, instProperties);
+        serviceImportParseLogic.associateComponentInstanceInputsToComponent(yamlName, service, instInputs);
+        serviceImportParseLogic.associateDeploymentArtifactsToInstances(user, yamlName, service, instDeploymentArtifacts);
+        serviceImportParseLogic.associateArtifactsToInstances(yamlName, service, instArtifacts);
+        serviceImportParseLogic.associateOrAddCalculatedCapReq(yamlName, service, instCapabilities, instRequirements);
+        log.debug("enter createServiceInstancesRelations test,instRequirements:{},instCapabilities:{}",
+                instRequirements, instCapabilities);
+        serviceImportParseLogic.associateInstAttributeToComponentToInstances(yamlName, service, instAttributes);
+        ToscaElement serviceTemplate = ModelConverter.convertToToscaElement(service);
+        Map<String, ListCapabilityDataDefinition> capabilities = serviceTemplate.getCapabilities();
+        Map<String, ListRequirementDataDefinition> requirements = serviceTemplate.getRequirements();
+
+        serviceImportParseLogic.associateCapabilitiesToService(yamlName, service, capabilities);
+        serviceImportParseLogic.associateRequirementsToService(yamlName, service, requirements);
+        service = getResourceAfterCreateRelations(service);
+
+        addRelationsToRI(yamlName, service, uploadResInstancesMap, componentInstancesList, relations);
+        serviceImportParseLogic.associateResourceInstances(yamlName, service, relations);
+        handleSubstitutionMappings(service, uploadResInstancesMap);
+        log.debug("************* in create relations, getResource start");
+        Either<Service, StorageOperationStatus> eitherGetResource = toscaOperationFacade.getToscaElement(service.getUniqueId());
+        log.debug("************* in create relations, getResource end");
+        if (eitherGetResource.isRight()) {
+            throw new ComponentException(componentsUtils.getResponseFormatByComponent(
+                    componentsUtils.convertFromStorageResponse(eitherGetResource.right().value()), service, service.getComponentType()));
+        }
+        return eitherGetResource.left().value();
+    }
+
+    protected void processComponentInstance(String yamlName, Service service, List<ComponentInstance> componentInstancesList, Either<Map<String, DataTypeDefinition>, JanusGraphOperationStatus> allDataTypes, Map<String, List<ComponentInstanceProperty>> instProperties, Map<ComponentInstance, Map<String, List<CapabilityDefinition>>> instCapabilties, Map<ComponentInstance, Map<String, List<RequirementDefinition>>> instRequirements, Map<String, Map<String, ArtifactDefinition>> instDeploymentArtifacts, Map<String, Map<String, ArtifactDefinition>> instArtifacts, Map<String, List<AttributeDataDefinition>> instAttributes, Map<String, Resource> originCompMap, Map<String, List<ComponentInstanceInput>> instInputs, UploadComponentInstanceInfo uploadComponentInstanceInfo) {
+        log.debug("enter ServiceImportBusinessLogic processComponentInstance");
+        Optional<ComponentInstance> currentCompInstanceOpt = componentInstancesList.stream()
+                .filter(i -> i.getName().equals(uploadComponentInstanceInfo.getName()))
+                .findFirst();
+        if (!currentCompInstanceOpt.isPresent()) {
+            log.debug(COMPONENT_INSTANCE_WITH_NAME_IN_RESOURCE, uploadComponentInstanceInfo.getName(),
+                    service.getUniqueId());
+            BeEcompErrorManager.getInstance().logInternalDataError(
+                    COMPONENT_INSTANCE_WITH_NAME + uploadComponentInstanceInfo.getName() + IN_RESOURCE,
+                    service.getUniqueId(), BeEcompErrorManager.ErrorSeverity.ERROR);
+            ResponseFormat responseFormat = componentsUtils
+                    .getResponseFormat(ActionStatus.NOT_TOPOLOGY_TOSCA_TEMPLATE, yamlName);
+            throw new ComponentException(responseFormat);
+        }
+        ComponentInstance currentCompInstance = currentCompInstanceOpt.get();
+        String resourceInstanceId = currentCompInstance.getUniqueId();
+        Resource originResource = getOriginResource(yamlName, originCompMap, currentCompInstance);
+
+        if (MapUtils.isNotEmpty(originResource.getRequirements())) {
+            instRequirements.put(currentCompInstance, originResource.getRequirements());
+        }
+        if (MapUtils.isNotEmpty(originResource.getCapabilities())) {
+            processComponentInstanceCapabilities(allDataTypes, instCapabilties, uploadComponentInstanceInfo,
+                    currentCompInstance, originResource);
+        }
+        if (originResource.getDeploymentArtifacts() != null && !originResource.getDeploymentArtifacts().isEmpty()) {
+            instDeploymentArtifacts.put(resourceInstanceId, originResource.getDeploymentArtifacts());
+        }
+        if (originResource.getArtifacts() != null && !originResource.getArtifacts().isEmpty()) {
+            instArtifacts.put(resourceInstanceId, originResource.getArtifacts());
+        }
+        if (originResource.getAttributes() != null && !originResource.getAttributes().isEmpty()) {
+            instAttributes.put(resourceInstanceId, originResource.getAttributes());
+        }
+        if (originResource.getResourceType() != ResourceTypeEnum.VF) {
+            ResponseFormat addPropertiesValueToRiRes = addPropertyValuesToRi(uploadComponentInstanceInfo, service,
+                    originResource, currentCompInstance, instProperties, allDataTypes.left().value());
+            if (addPropertiesValueToRiRes.getStatus() != 200) {
+                throw new ComponentException(addPropertiesValueToRiRes);
+            }
+        } else {
+            addInputsValuesToRi(uploadComponentInstanceInfo, service,
+                    originResource, currentCompInstance, instInputs, allDataTypes.left().value());
+        }
+    }
+
+    protected void addInputsValuesToRi(UploadComponentInstanceInfo uploadComponentInstanceInfo,
+                                     Service resource, Resource originResource, ComponentInstance currentCompInstance,
+                                     Map<String, List<ComponentInstanceInput>> instInputs, Map<String, DataTypeDefinition> allDataTypes) {
+        Map<String, List<UploadPropInfo>> propMap = uploadComponentInstanceInfo.getProperties();
+        if (MapUtils.isNotEmpty(propMap)) {
+            Map<String, InputDefinition> currPropertiesMap = new HashMap<>();
+            List<ComponentInstanceInput> instPropList = new ArrayList<>();
+
+            if (CollectionUtils.isEmpty(originResource.getInputs())) {
+                log.debug("failed to find properties ");
+                throw new ComponentException(componentsUtils.getResponseFormat(ActionStatus.PROPERTY_NOT_FOUND));
+            }
+            originResource.getInputs().forEach(p -> serviceImportParseLogic.addInput(currPropertiesMap, p));
+            for (List<UploadPropInfo> propertyList : propMap.values()) {
+                processProperty(resource, currentCompInstance, allDataTypes, currPropertiesMap, instPropList, propertyList);
+            }
+            currPropertiesMap.values().forEach(p -> instPropList.add(new ComponentInstanceInput(p)));
+            instInputs.put(currentCompInstance.getUniqueId(), instPropList);
+        }
+    }
+
+    protected void processProperty(Service resource, ComponentInstance currentCompInstance, Map<String, DataTypeDefinition> allDataTypes, Map<String, InputDefinition> currPropertiesMap, List<ComponentInstanceInput> instPropList, List<UploadPropInfo> propertyList) {
+        UploadPropInfo propertyInfo = propertyList.get(0);
+        String propName = propertyInfo.getName();
+        if (!currPropertiesMap.containsKey(propName)) {
+            log.debug("failed to find property {} ", propName);
+            throw new ComponentException(componentsUtils.getResponseFormat(ActionStatus.PROPERTY_NOT_FOUND,
+                    propName));
+        }
+        InputDefinition curPropertyDef = currPropertiesMap.get(propName);
+        ComponentInstanceInput property = null;
+
+        String value = null;
+        List<GetInputValueDataDefinition> getInputs = null;
+        boolean isValidate = true;
+        if (propertyInfo.getValue() != null) {
+            getInputs = propertyInfo.getGet_input();
+            isValidate = getInputs == null || getInputs.isEmpty();
+            if (isValidate) {
+                value = getPropertyJsonStringValue(propertyInfo.getValue(),
+                        curPropertyDef.getType());
+            } else {
+                value = getPropertyJsonStringValue(propertyInfo.getValue(),
+                        TypeUtils.ToscaTagNamesEnum.GET_INPUT.getElementName());
+            }
+        }
+        String innerType = null;
+        property = new ComponentInstanceInput(curPropertyDef, value, null);
+        String validPropertyVAlue = serviceBusinessLogic.validatePropValueBeforeCreate(property, value, isValidate, allDataTypes);
+        property.setValue(validPropertyVAlue);
+
+        if (isNotEmpty(getInputs)) {
+            List<GetInputValueDataDefinition> getInputValues = new ArrayList<>();
+            for (GetInputValueDataDefinition getInput : getInputs) {
+                List<InputDefinition> inputs = resource.getInputs();
+                if (CollectionUtils.isEmpty(inputs)) {
+                    throw new ComponentException(componentsUtils.getResponseFormat(ActionStatus.INVALID_CONTENT));
+                }
+                Optional<InputDefinition> optional = inputs.stream()
+                        .filter(p -> p.getName().equals(getInput.getInputName())).findAny();
+                if (!optional.isPresent()) {
+                    throw new ComponentException(componentsUtils.getResponseFormat(ActionStatus.INVALID_CONTENT));
+                }
+                InputDefinition input = optional.get();
+                getInput.setInputId(input.getUniqueId());
+                getInputValues.add(getInput);
+
+                GetInputValueDataDefinition getInputIndex = getInput.getGetInputIndex();
+                processGetInput(getInputValues, inputs, getInputIndex);
+            }
+            property.setGetInputValues(getInputValues);
+        }
+        instPropList.add(property);
+        currPropertiesMap.remove(property.getName());
+    }
+
+    protected void processGetInput(List<GetInputValueDataDefinition> getInputValues, List<InputDefinition> inputs, GetInputValueDataDefinition getInputIndex) {
+        Optional<InputDefinition> optional;
+        if (getInputIndex != null) {
+            optional = inputs.stream().filter(p -> p.getName().equals(getInputIndex.getInputName()))
+                    .findAny();
+            if (!optional.isPresent()) {
+                log.debug("Failed to find input {} ", getInputIndex.getInputName());
+                throw new ComponentException(componentsUtils.getResponseFormat(ActionStatus.INVALID_CONTENT));
+            }
+            InputDefinition inputIndex = optional.get();
+            getInputIndex.setInputId(inputIndex.getUniqueId());
+            getInputValues.add(getInputIndex);
+        }
+    }
+
+    protected ResponseFormat addPropertyValuesToRi(UploadComponentInstanceInfo uploadComponentInstanceInfo,
+                                                 Resource resource, Resource originResource, ComponentInstance currentCompInstance,
+                                                 Map<String, List<ComponentInstanceProperty>> instProperties, Map<String, DataTypeDefinition> allDataTypes) {
+        Map<String, List<UploadPropInfo>> propMap = uploadComponentInstanceInfo.getProperties();
+        Map<String, PropertyDefinition> currPropertiesMap = new HashMap<>();
+
+        List<PropertyDefinition> listFromMap = originResource.getProperties();
+        if ((propMap != null && !propMap.isEmpty()) && (listFromMap == null || listFromMap.isEmpty())) {
+            log.debug("failed to find properties ");
+            return componentsUtils.getResponseFormat(ActionStatus.PROPERTY_NOT_FOUND);
+        }
+        if (listFromMap == null || listFromMap.isEmpty()) {
+            return componentsUtils.getResponseFormat(ActionStatus.OK);
+        }
+        for (PropertyDefinition prop : listFromMap) {
+            String propName = prop.getName();
+            if (!currPropertiesMap.containsKey(propName)) {
+                currPropertiesMap.put(propName, prop);
+            }
+        }
+        List<ComponentInstanceProperty> instPropList = new ArrayList<>();
+        if (propMap != null && propMap.size() > 0) {
+            for (List<UploadPropInfo> propertyList : propMap.values()) {
+                UploadPropInfo propertyInfo = propertyList.get(0);
+                String propName = propertyInfo.getName();
+                if (!currPropertiesMap.containsKey(propName)) {
+                    log.debug("failed to find property {} ", propName);
+                    return componentsUtils.getResponseFormat(ActionStatus.PROPERTY_NOT_FOUND,
+                            propName);
+                }
+                PropertyDefinition curPropertyDef = currPropertiesMap.get(propName);
+                ComponentInstanceProperty property = null;
+
+                String value = null;
+                List<GetInputValueDataDefinition> getInputs = null;
+                boolean isValidate = true;
+                if (propertyInfo.getValue() != null) {
+                    getInputs = propertyInfo.getGet_input();
+                    isValidate = getInputs == null || getInputs.isEmpty();
+                    if (isValidate) {
+                        value = getPropertyJsonStringValue(propertyInfo.getValue(),
+                                curPropertyDef.getType());
+                    } else {
+                        value = getPropertyJsonStringValue(propertyInfo.getValue(),
+                                TypeUtils.ToscaTagNamesEnum.GET_INPUT.getElementName());
+                    }
+                }
+                String innerType = null;
+                property = new ComponentInstanceProperty(curPropertyDef, value, null);
+
+                String validatePropValue = serviceBusinessLogic.validatePropValueBeforeCreate(property, value, isValidate, allDataTypes);
+                property.setValue(validatePropValue);
+
+                if (getInputs != null && !getInputs.isEmpty()) {
+                    List<GetInputValueDataDefinition> getInputValues = new ArrayList<>();
+                    for (GetInputValueDataDefinition getInput : getInputs) {
+                        List<InputDefinition> inputs = resource.getInputs();
+                        if (inputs == null || inputs.isEmpty()) {
+                            log.debug("Failed to add property {} to instance. Inputs list is empty ", property);
+                            serviceBusinessLogic.rollbackWithException(ActionStatus.INPUTS_NOT_FOUND, property.getGetInputValues()
+                                    .stream()
+                                    .map(GetInputValueDataDefinition::getInputName)
+                                    .collect(toList()).toString());
+                        }
+                        InputDefinition input = serviceImportParseLogic.findInputByName(inputs, getInput);
+                        getInput.setInputId(input.getUniqueId());
+                        getInputValues.add(getInput);
+
+                        GetInputValueDataDefinition getInputIndex = getInput.getGetInputIndex();
+                        if (getInputIndex != null) {
+                            input = serviceImportParseLogic.findInputByName(inputs, getInputIndex);
+                            getInputIndex.setInputId(input.getUniqueId());
+                            getInputValues.add(getInputIndex);
+                        }
+                    }
+                    property.setGetInputValues(getInputValues);
+                }
+                instPropList.add(property);
+                currPropertiesMap.remove(property.getName());
+            }
+        }
+        if (!currPropertiesMap.isEmpty()) {
+            for (PropertyDefinition value : currPropertiesMap.values()) {
+                instPropList.add(new ComponentInstanceProperty(value));
+            }
+        }
+        instProperties.put(currentCompInstance.getUniqueId(), instPropList);
+        return componentsUtils.getResponseFormat(ActionStatus.OK);
+    }
+
+    protected ResponseFormat addPropertyValuesToRi(UploadComponentInstanceInfo uploadComponentInstanceInfo,
+                                                 Service service, Resource originResource, ComponentInstance currentCompInstance,
+                                                 Map<String, List<ComponentInstanceProperty>> instProperties, Map<String, DataTypeDefinition> allDataTypes) {
+        Map<String, List<UploadPropInfo>> propMap = uploadComponentInstanceInfo.getProperties();
+        Map<String, PropertyDefinition> currPropertiesMap = new HashMap<>();
+
+        List<PropertyDefinition> listFromMap = originResource.getProperties();
+        if ((propMap != null && !propMap.isEmpty()) && (listFromMap == null || listFromMap.isEmpty())) {
+            log.debug("failed to find properties ");
+            return componentsUtils.getResponseFormat(ActionStatus.PROPERTY_NOT_FOUND);
+        }
+        if (listFromMap == null || listFromMap.isEmpty()) {
+            return componentsUtils.getResponseFormat(ActionStatus.OK);
+        }
+        for (PropertyDefinition prop : listFromMap) {
+            String propName = prop.getName();
+            if (!currPropertiesMap.containsKey(propName)) {
+                currPropertiesMap.put(propName, prop);
+            }
+        }
+        List<ComponentInstanceProperty> instPropList = new ArrayList<>();
+        if (propMap != null && propMap.size() > 0) {
+            for (List<UploadPropInfo> propertyList : propMap.values()) {
+
+                UploadPropInfo propertyInfo = propertyList.get(0);
+                String propName = propertyInfo.getName();
+                if (!currPropertiesMap.containsKey(propName)) {
+                    log.debug("failed to find property {} ", propName);
+                    return componentsUtils.getResponseFormat(ActionStatus.PROPERTY_NOT_FOUND,
+                            propName);
+                }
+                PropertyDefinition curPropertyDef = currPropertiesMap.get(propName);
+                ComponentInstanceProperty property = null;
+
+                String value = null;
+                List<GetInputValueDataDefinition> getInputs = null;
+                boolean isValidate = true;
+                if (propertyInfo.getValue() != null) {
+                    getInputs = propertyInfo.getGet_input();
+                    isValidate = getInputs == null || getInputs.isEmpty();
+                    if (isValidate) {
+                        value = getPropertyJsonStringValue(propertyInfo.getValue(),
+                                curPropertyDef.getType());
+                    } else {
+                        value = getPropertyJsonStringValue(propertyInfo.getValue(),
+                                TypeUtils.ToscaTagNamesEnum.GET_INPUT.getElementName());
+                    }
+                }
+                String innerType = null;
+                property = new ComponentInstanceProperty(curPropertyDef, value, null);
+
+                String validatePropValue = serviceBusinessLogic.validatePropValueBeforeCreate(property, value, isValidate, allDataTypes);
+                property.setValue(validatePropValue);
+
+                if (getInputs != null && !getInputs.isEmpty()) {
+                    List<GetInputValueDataDefinition> getInputValues = new ArrayList<>();
+                    for (GetInputValueDataDefinition getInput : getInputs) {
+                        List<InputDefinition> inputs = service.getInputs();
+                        if (inputs == null || inputs.isEmpty()) {
+                            log.debug("Failed to add property {} to instance. Inputs list is empty ", property);
+                            serviceBusinessLogic.rollbackWithException(ActionStatus.INPUTS_NOT_FOUND, property.getGetInputValues()
+                                    .stream()
+                                    .map(GetInputValueDataDefinition::getInputName)
+                                    .collect(toList()).toString());
+                        }
+                        InputDefinition input = serviceImportParseLogic.findInputByName(inputs, getInput);
+                        getInput.setInputId(input.getUniqueId());
+                        getInputValues.add(getInput);
+
+                        GetInputValueDataDefinition getInputIndex = getInput.getGetInputIndex();
+                        if (getInputIndex != null) {
+                            input = serviceImportParseLogic.findInputByName(inputs, getInputIndex);
+                            getInputIndex.setInputId(input.getUniqueId());
+                            getInputValues.add(getInputIndex);
+                        }
+                    }
+                    property.setGetInputValues(getInputValues);
+                }
+                instPropList.add(property);
+                currPropertiesMap.remove(property.getName());
+            }
+        }
+        if (!currPropertiesMap.isEmpty()) {
+            for (PropertyDefinition value : currPropertiesMap.values()) {
+                instPropList.add(new ComponentInstanceProperty(value));
+            }
+        }
+        instProperties.put(currentCompInstance.getUniqueId(), instPropList);
+        return componentsUtils.getResponseFormat(ActionStatus.OK);
+    }
+
+    protected void processComponentInstanceCapabilities(Either<Map<String, DataTypeDefinition>, JanusGraphOperationStatus> allDataTypes, Map<ComponentInstance, Map<String, List<CapabilityDefinition>>> instCapabilties, UploadComponentInstanceInfo uploadComponentInstanceInfo, ComponentInstance currentCompInstance, Resource originResource) {
+        log.debug("enter processComponentInstanceCapabilities");
+        Map<String, List<CapabilityDefinition>> originCapabilities;
+        if (MapUtils.isNotEmpty(uploadComponentInstanceInfo.getCapabilities())) {
+            originCapabilities = new HashMap<>();
+            Map<String, Map<String, UploadPropInfo>> newPropertiesMap = new HashMap<>();
+            originResource.getCapabilities().forEach((k, v) -> serviceImportParseLogic
+                    .addCapabilities(originCapabilities, k, v));
+            uploadComponentInstanceInfo.getCapabilities().values().forEach(l -> serviceImportParseLogic
+                    .addCapabilitiesProperties(newPropertiesMap, l));
+            updateCapabilityPropertiesValues(allDataTypes, originCapabilities, newPropertiesMap);
+        } else {
+            originCapabilities = originResource.getCapabilities();
+        }
+        instCapabilties.put(currentCompInstance, originCapabilities);
+    }
+
+    protected void updateCapabilityPropertiesValues(Either<Map<String, DataTypeDefinition>, JanusGraphOperationStatus> allDataTypes, Map<String, List<CapabilityDefinition>> originCapabilities, Map<String, Map<String, UploadPropInfo>> newPropertiesMap) {
+        originCapabilities.values().stream()
+                .flatMap(Collection::stream)
+                .filter(c -> newPropertiesMap.containsKey(c.getName()))
+                .forEach(c -> updatePropertyValues(c.getProperties(), newPropertiesMap.get(c.getName()), allDataTypes.left().value()));
+    }
+
+    protected void updatePropertyValues(List<ComponentInstanceProperty> properties, Map<String, UploadPropInfo> newProperties,
+                                      Map<String, DataTypeDefinition> allDataTypes) {
+        properties.forEach(p -> updatePropertyValue(p, newProperties.get(p.getName()), allDataTypes));
+    }
+
+    protected String updatePropertyValue(ComponentInstanceProperty property, UploadPropInfo propertyInfo,
+                                       Map<String, DataTypeDefinition> allDataTypes) {
+        String value = null;
+        List<GetInputValueDataDefinition> getInputs = null;
+        boolean isValidate = true;
+        if (null != propertyInfo && propertyInfo.getValue() != null) {
+            getInputs = propertyInfo.getGet_input();
+            isValidate = getInputs == null || getInputs.isEmpty();
+            if (isValidate) {
+                value = getPropertyJsonStringValue(propertyInfo.getValue(), property.getType());
+            } else {
+                value = getPropertyJsonStringValue(propertyInfo.getValue(),
+                        TypeUtils.ToscaTagNamesEnum.GET_INPUT.getElementName());
+            }
+        }
+        property.setValue(value);
+        return serviceBusinessLogic.validatePropValueBeforeCreate(property, value, isValidate, allDataTypes);
+    }
+
+    protected Resource getOriginResource(String yamlName, Map<String, Resource> originCompMap, ComponentInstance currentCompInstance) {
+        Resource originResource;
+        log.debug("after enter ServiceImportBusinessLogic processComponentInstance, enter getOriginResource");
+        if (!originCompMap.containsKey(currentCompInstance.getComponentUid())) {
+            Either<Resource, StorageOperationStatus> getOriginResourceRes = toscaOperationFacade
+                    .getToscaFullElement(currentCompInstance.getComponentUid());
+            if (getOriginResourceRes.isRight()) {
+                ResponseFormat responseFormat = componentsUtils.getResponseFormat(
+                        componentsUtils.convertFromStorageResponse(getOriginResourceRes.right().value()), yamlName);
+                throw new ComponentException(responseFormat);
+            }
+            originResource = getOriginResourceRes.left().value();
+            originCompMap.put(originResource.getUniqueId(), originResource);
+        } else {
+            originResource = originCompMap.get(currentCompInstance.getComponentUid());
+        }
+        return originResource;
+    }
+
+    protected void handleSubstitutionMappings(Service service, Map<String, UploadComponentInstanceInfo> uploadResInstancesMap) {
+        if (false) {
+            Either<Resource, StorageOperationStatus> getResourceRes = toscaOperationFacade.getToscaFullElement(service.getUniqueId());
+            if (getResourceRes.isRight()) {
+                ResponseFormat responseFormat = componentsUtils.getResponseFormatByComponent(
+                        componentsUtils.convertFromStorageResponse(getResourceRes.right().value()), service, ComponentTypeEnum.SERVICE);
+                throw new ComponentException(responseFormat);
+            }
+            getResourceRes = updateCalculatedCapReqWithSubstitutionMappings(getResourceRes.left().value(),
+                    uploadResInstancesMap);
+            if (getResourceRes.isRight()) {
+                ResponseFormat responseFormat = componentsUtils.getResponseFormatByComponent(
+                        componentsUtils.convertFromStorageResponse(getResourceRes.right().value()), service, ComponentTypeEnum.SERVICE);
+                throw new ComponentException(responseFormat);
+            }
+        }
+    }
+
+    protected Either<Resource, StorageOperationStatus> updateCalculatedCapReqWithSubstitutionMappings(Resource resource,
+                                                                                                    Map<String, UploadComponentInstanceInfo> uploadResInstancesMap) {
+        Either<Resource, StorageOperationStatus> updateRes = null;
+        Map<ComponentInstance, Map<String, List<CapabilityDefinition>>> updatedInstCapabilities = new HashMap<>();
+        Map<ComponentInstance, Map<String, List<RequirementDefinition>>> updatedInstRequirements = new HashMap<>();
+        StorageOperationStatus status = toscaOperationFacade
+                .deleteAllCalculatedCapabilitiesRequirements(resource.getUniqueId());
+        if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
+            log.debug(
+                    "Failed to delete all calculated capabilities and requirements of resource {} upon update. Status is {}",
+                    resource.getUniqueId(), status);
+            updateRes = Either.right(status);
+        }
+        if (updateRes == null) {
+            fillUpdatedInstCapabilitiesRequirements(resource.getComponentInstances(), uploadResInstancesMap,
+                    updatedInstCapabilities, updatedInstRequirements);
+            status = toscaOperationFacade.associateOrAddCalculatedCapReq(updatedInstCapabilities, updatedInstRequirements,
+                    resource);
+            if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
+                updateRes = Either.right(status);
+            }
+        }
+        if (updateRes == null) {
+            updateRes = Either.left(resource);
+        }
+        return updateRes;
+    }
+
+    protected void fillUpdatedInstCapabilitiesRequirements(List<ComponentInstance> componentInstances,
+                                                         Map<String, UploadComponentInstanceInfo> uploadResInstancesMap,
+                                                         Map<ComponentInstance, Map<String, List<CapabilityDefinition>>> updatedInstCapabilities,
+                                                         Map<ComponentInstance, Map<String, List<RequirementDefinition>>> updatedInstRequirements) {
+        componentInstances.stream().forEach(i -> {
+            fillUpdatedInstCapabilities(updatedInstCapabilities, i,
+                    uploadResInstancesMap.get(i.getName()).getCapabilitiesNamesToUpdate());
+            fillUpdatedInstRequirements(updatedInstRequirements, i,
+                    uploadResInstancesMap.get(i.getName()).getRequirementsNamesToUpdate());
+        });
+    }
+
+    protected void fillUpdatedInstCapabilities(
+            Map<ComponentInstance, Map<String, List<CapabilityDefinition>>> updatedInstCapabilties,
+            ComponentInstance instance, Map<String, String> capabilitiesNamesToUpdate) {
+        Map<String, List<CapabilityDefinition>> updatedCapabilities = new HashMap<>();
+        Set<String> updatedCapNames = new HashSet<>();
+        if (MapUtils.isNotEmpty(capabilitiesNamesToUpdate)) {
+            for (Map.Entry<String, List<CapabilityDefinition>> requirements : instance.getCapabilities().entrySet()) {
+                updatedCapabilities.put(requirements.getKey(),
+                        requirements.getValue().stream()
+                                .filter(c -> capabilitiesNamesToUpdate.containsKey(c.getName())
+                                        && !updatedCapNames.contains(capabilitiesNamesToUpdate.get(c.getName())))
+                                .map(c -> {
+                                    c.setParentName(c.getName());
+                                    c.setName(capabilitiesNamesToUpdate.get(c.getName()));
+                                    updatedCapNames.add(c.getName());
+                                    return c;
+                                }).collect(toList()));
+            }
+        }
+        if (MapUtils.isNotEmpty(updatedCapabilities)) {
+            updatedInstCapabilties.put(instance, updatedCapabilities);
+        }
+    }
+
+    protected void fillUpdatedInstRequirements(
+            Map<ComponentInstance, Map<String, List<RequirementDefinition>>> updatedInstRequirements,
+            ComponentInstance instance, Map<String, String> requirementsNamesToUpdate) {
+        Map<String, List<RequirementDefinition>> updatedRequirements = new HashMap<>();
+        Set<String> updatedReqNames = new HashSet<>();
+        if (MapUtils.isNotEmpty(requirementsNamesToUpdate)) {
+            for (Map.Entry<String, List<RequirementDefinition>> requirements : instance.getRequirements().entrySet()) {
+                updatedRequirements.put(requirements.getKey(),
+                        requirements.getValue().stream()
+                                .filter(r -> requirementsNamesToUpdate.containsKey(r.getName())
+                                        && !updatedReqNames.contains(requirementsNamesToUpdate.get(r.getName())))
+                                .map(r -> {
+                                    r.setParentName(r.getName());
+                                    r.setName(requirementsNamesToUpdate.get(r.getName()));
+                                    updatedReqNames.add(r.getName());
+                                    return r;
+                                }).collect(toList()));
+            }
+        }
+        if (MapUtils.isNotEmpty(updatedRequirements)) {
+            updatedInstRequirements.put(instance, updatedRequirements);
+        }
+    }
+
+    protected void addRelationsToRI(String yamlName, Service service, Map<String, UploadComponentInstanceInfo> uploadResInstancesMap, List<ComponentInstance> componentInstancesList, List<RequirementCapabilityRelDef> relations) {
+        for (Map.Entry<String, UploadComponentInstanceInfo> entry : uploadResInstancesMap.entrySet()) {
+            UploadComponentInstanceInfo uploadComponentInstanceInfo = entry.getValue();
+            ComponentInstance currentCompInstance = null;
+            for (ComponentInstance compInstance : componentInstancesList) {
+                if (compInstance.getName().equals(uploadComponentInstanceInfo.getName())) {
+                    currentCompInstance = compInstance;
+                    break;
+                }
+            }
+            if (currentCompInstance == null) {
+                log.debug(COMPONENT_INSTANCE_WITH_NAME_IN_RESOURCE, uploadComponentInstanceInfo.getName(),
+                        service.getUniqueId());
+                BeEcompErrorManager.getInstance().logInternalDataError(
+                        COMPONENT_INSTANCE_WITH_NAME + uploadComponentInstanceInfo.getName() + IN_RESOURCE,
+                        service.getUniqueId(), BeEcompErrorManager.ErrorSeverity.ERROR);
+                ResponseFormat responseFormat = componentsUtils
+                        .getResponseFormat(ActionStatus.NOT_TOPOLOGY_TOSCA_TEMPLATE, yamlName);
+                throw new ComponentException(responseFormat);
+            }
+
+            ResponseFormat addRelationToRiRes = addRelationToRI(yamlName, service, entry.getValue(), relations);
+            if (addRelationToRiRes.getStatus() != 200) {
+                throw new ComponentException(addRelationToRiRes);
+            }
+        }
+    }
+
+    protected ResponseFormat addRelationToRI(String yamlName, Service service,
+                                           UploadComponentInstanceInfo nodesInfoValue, List<RequirementCapabilityRelDef> relations) {
+        List<ComponentInstance> componentInstancesList = service.getComponentInstances();
+        ComponentInstance currentCompInstance = null;
+        for (ComponentInstance compInstance : componentInstancesList) {
+            if (compInstance.getName().equals(nodesInfoValue.getName())) {
+                currentCompInstance = compInstance;
+                break;
+            }
+        }
+        if (currentCompInstance == null) {
+            log.debug(COMPONENT_INSTANCE_WITH_NAME_IN_RESOURCE, nodesInfoValue.getName(),
+                    service.getUniqueId());
+            BeEcompErrorManager.getInstance().logInternalDataError(
+                    COMPONENT_INSTANCE_WITH_NAME + nodesInfoValue.getName() + IN_RESOURCE,
+                    service.getUniqueId(), BeEcompErrorManager.ErrorSeverity.ERROR);
+            return componentsUtils.getResponseFormat(ActionStatus.NOT_TOPOLOGY_TOSCA_TEMPLATE,
+                    yamlName);
+        }
+        String resourceInstanceId = currentCompInstance.getUniqueId();
+        Map<String, List<UploadReqInfo>> regMap = nodesInfoValue.getRequirements();
+
+        if (regMap != null) {
+            Iterator<Map.Entry<String, List<UploadReqInfo>>> nodesRegValue = regMap.entrySet().iterator();
+            while (nodesRegValue.hasNext()) {
+                Map.Entry<String, List<UploadReqInfo>> nodesRegInfoEntry = nodesRegValue.next();
+                List<UploadReqInfo> uploadRegInfoList = nodesRegInfoEntry.getValue();
+                for (UploadReqInfo uploadRegInfo : uploadRegInfoList) {
+                    log.debug("Going to create  relation {}", uploadRegInfo.getName());
+                    String regName = uploadRegInfo.getName();
+                    RequirementCapabilityRelDef regCapRelDef = new RequirementCapabilityRelDef();
+                    regCapRelDef.setFromNode(resourceInstanceId);
+                    log.debug("try to find available requirement {} ", regName);
+                    Either<RequirementDefinition, ResponseFormat> eitherReqStatus = serviceImportParseLogic.findAviableRequiremen(regName,
+                            yamlName, nodesInfoValue, currentCompInstance,
+                            uploadRegInfo.getCapabilityName());
+                    if (eitherReqStatus.isRight()) {
+                        log.debug("failed to find available requirement {} status is {}", regName,
+                                eitherReqStatus.right().value());
+                        return eitherReqStatus.right().value();
+                    }
+
+                    RequirementDefinition validReq = eitherReqStatus.left().value();
+                    List<CapabilityRequirementRelationship> reqAndRelationshipPairList = regCapRelDef
+                            .getRelationships();
+                    if (reqAndRelationshipPairList == null) {
+                        reqAndRelationshipPairList = new ArrayList<>();
+                    }
+                    RelationshipInfo reqAndRelationshipPair = new RelationshipInfo();
+                    reqAndRelationshipPair.setRequirement(regName);
+                    reqAndRelationshipPair.setRequirementOwnerId(validReq.getOwnerId());
+                    reqAndRelationshipPair.setRequirementUid(validReq.getUniqueId());
+                    RelationshipImpl relationship = new RelationshipImpl();
+                    relationship.setType(validReq.getCapability());
+                    reqAndRelationshipPair.setRelationships(relationship);
+
+                    ComponentInstance currentCapCompInstance = null;
+                    for (ComponentInstance compInstance : componentInstancesList) {
+                        if (compInstance.getName().equals(uploadRegInfo.getNode())) {
+                            currentCapCompInstance = compInstance;
+                            break;
+                        }
+                    }
+                    if (currentCapCompInstance == null) {
+                        log.debug("The component instance  with name {} not found on resource {} ",
+                                uploadRegInfo.getNode(), service.getUniqueId());
+                        BeEcompErrorManager.getInstance().logInternalDataError(
+                                COMPONENT_INSTANCE_WITH_NAME + uploadRegInfo.getNode() + IN_RESOURCE,
+                                service.getUniqueId(), BeEcompErrorManager.ErrorSeverity.ERROR);
+                        return componentsUtils
+                                .getResponseFormat(ActionStatus.NOT_TOPOLOGY_TOSCA_TEMPLATE, yamlName);
+                    }
+                    regCapRelDef.setToNode(currentCapCompInstance.getUniqueId());
+                    log.debug("try to find aviable Capability  req name is {} ", validReq.getName());
+                    CapabilityDefinition aviableCapForRel = serviceImportParseLogic.findAvailableCapabilityByTypeOrName(validReq,
+                            currentCapCompInstance, uploadRegInfo);
+                    reqAndRelationshipPair.setCapability(aviableCapForRel.getName());
+                    reqAndRelationshipPair.setCapabilityUid(aviableCapForRel.getUniqueId());
+                    reqAndRelationshipPair.setCapabilityOwnerId(aviableCapForRel.getOwnerId());
+                    if (aviableCapForRel == null) {
+                        BeEcompErrorManager.getInstance().logInternalDataError(
+                                "aviable capability was not found. req name is " + validReq.getName()
+                                        + " component instance is " + currentCapCompInstance.getUniqueId(),
+                                service.getUniqueId(), BeEcompErrorManager.ErrorSeverity.ERROR);
+                        return componentsUtils
+                                .getResponseFormat(ActionStatus.NOT_TOPOLOGY_TOSCA_TEMPLATE, yamlName);
+                    }
+                    CapabilityRequirementRelationship capReqRel = new CapabilityRequirementRelationship();
+                    capReqRel.setRelation(reqAndRelationshipPair);
+                    reqAndRelationshipPairList.add(capReqRel);
+                    regCapRelDef.setRelationships(reqAndRelationshipPairList);
+                    relations.add(regCapRelDef);
+                }
+            }
+        }
+        return componentsUtils.getResponseFormat(ActionStatus.OK, yamlName);
+    }
+
+    protected Service getResourceAfterCreateRelations(Service service) {
+        ComponentParametersView parametersView = serviceImportParseLogic.getComponentFilterAfterCreateRelations();
+        Either<Service, StorageOperationStatus> eitherGetResource = toscaOperationFacade
+                .getToscaElement(service.getUniqueId(), parametersView);
+        if (eitherGetResource.isRight()) {
+            serviceImportParseLogic.throwComponentExceptionByResource(eitherGetResource.right().value(), service);
+        }
+        return eitherGetResource.left().value();
+    }
+
+    protected Service createServiceInstances(String yamlName, Service service,
+                                           Map<String, UploadComponentInstanceInfo> uploadResInstancesMap,
+                                           Map<String, Resource> nodeNamespaceMap) {
+        Either<Resource, ResponseFormat> eitherResource = null;
+        log.debug("createResourceInstances is {} - going to create resource instanse from CSAR", yamlName);
+        if (MapUtils.isEmpty(uploadResInstancesMap)) { // PNF can have no resource instances
+            ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.NOT_TOPOLOGY_TOSCA_TEMPLATE);
+            throw new ComponentException(responseFormat);
+        }
+        Map<String, Resource> existingNodeTypeMap = new HashMap<>();
+        if (MapUtils.isNotEmpty(nodeNamespaceMap)) {
+            nodeNamespaceMap.forEach((k, v) -> existingNodeTypeMap.put(v.getToscaResourceName(), v));
+        }
+        Map<ComponentInstance, Resource> resourcesInstancesMap = new HashMap<>();
+        uploadResInstancesMap
+                .values()
+                .forEach(i -> createAndAddResourceInstance(i, yamlName, service, nodeNamespaceMap, existingNodeTypeMap, resourcesInstancesMap));
+
+        if (MapUtils.isNotEmpty(resourcesInstancesMap)) {
+            try {
+                toscaOperationFacade.associateComponentInstancesToComponent(service,
+                        resourcesInstancesMap, false, false);
+            } catch (StorageException exp) {
+                if (exp.getStorageOperationStatus() != null && exp.getStorageOperationStatus() != StorageOperationStatus.OK) {
+                    log.debug("Failed to add component instances to container component {}", service.getName());
+                    ResponseFormat responseFormat = componentsUtils
+                            .getResponseFormat(componentsUtils.convertFromStorageResponse(exp.getStorageOperationStatus()));
+                    eitherResource = Either.right(responseFormat);
+                    throw new ComponentException(eitherResource.right().value());
+                }
+            }
+        }
+        Either<Service, StorageOperationStatus> eitherGetResource = toscaOperationFacade
+                .getToscaElement(service.getUniqueId(), serviceImportParseLogic.getComponentWithInstancesFilter());
+        log.debug("*************finished to get resource {}", service.getUniqueId());
+        if (eitherGetResource.isRight()) {
+            ResponseFormat responseFormat = componentsUtils.getResponseFormatByComponent(
+                    componentsUtils.convertFromStorageResponse(eitherGetResource.right().value()), service, ComponentTypeEnum.SERVICE);
+            throw new ComponentException(responseFormat);
+        }
+        if (CollectionUtils.isEmpty(eitherGetResource.left().value().getComponentInstances())) { // PNF can have no resource instances
+            log.debug("Error when create resource instance from csar. ComponentInstances list empty");
+            BeEcompErrorManager.getInstance().logBeDaoSystemError(
+                    "Error when create resource instance from csar. ComponentInstances list empty");
+            throw new ComponentException(componentsUtils.getResponseFormat(ActionStatus.NOT_TOPOLOGY_TOSCA_TEMPLATE));
+        }
+        return eitherGetResource.left().value();
+    }
+
+    protected void createAndAddResourceInstance(UploadComponentInstanceInfo uploadComponentInstanceInfo, String yamlName,
+                                              Resource resource, Map<String, Resource> nodeNamespaceMap, Map<String, Resource> existingnodeTypeMap, Map<ComponentInstance, Resource> resourcesInstancesMap) {
+        Either<Resource, ResponseFormat> eitherResource;
+        log.debug("*************Going to create  resource instances {}", uploadComponentInstanceInfo.getName());
+        try {
+            if (nodeNamespaceMap.containsKey(uploadComponentInstanceInfo.getType())) {
+                uploadComponentInstanceInfo
+                        .setType(nodeNamespaceMap.get(uploadComponentInstanceInfo.getType()).getToscaResourceName());
+            }
+            Resource refResource = validateResourceInstanceBeforeCreate(yamlName, uploadComponentInstanceInfo,
+                    existingnodeTypeMap);
+
+            ComponentInstance componentInstance = new ComponentInstance();
+            componentInstance.setComponentUid(refResource.getUniqueId());
+
+            Collection<String> directives = uploadComponentInstanceInfo.getDirectives();
+            if (directives != null && !directives.isEmpty()) {
+                componentInstance.setDirectives(new ArrayList<>(directives));
+            }
+            UploadNodeFilterInfo uploadNodeFilterInfo = uploadComponentInstanceInfo.getUploadNodeFilterInfo();
+            if (uploadNodeFilterInfo != null) {
+                componentInstance.setNodeFilter(new CINodeFilterUtils().getNodeFilterDataDefinition(uploadNodeFilterInfo,
+                        componentInstance.getUniqueId()));
+            }
+
+            ComponentTypeEnum containerComponentType = resource.getComponentType();
+            NodeTypeEnum containerNodeType = containerComponentType.getNodeType();
+            if (containerNodeType.equals(NodeTypeEnum.Resource)
+                    && MapUtils.isNotEmpty(uploadComponentInstanceInfo.getCapabilities())
+                    && MapUtils.isNotEmpty(refResource.getCapabilities())) {
+                serviceImportParseLogic.setCapabilityNamesTypes(refResource.getCapabilities(), uploadComponentInstanceInfo.getCapabilities());
+                Map<String, List<CapabilityDefinition>> validComponentInstanceCapabilities = serviceImportParseLogic.getValidComponentInstanceCapabilities(
+                        refResource.getUniqueId(), refResource.getCapabilities(),
+                        uploadComponentInstanceInfo.getCapabilities());
+                componentInstance.setCapabilities(validComponentInstanceCapabilities);
+            }
+            if (!existingnodeTypeMap.containsKey(uploadComponentInstanceInfo.getType())) {
+                ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.INVALID_NODE_TEMPLATE,
+                        yamlName, uploadComponentInstanceInfo.getName(), uploadComponentInstanceInfo.getType());
+                throw new ComponentException(responseFormat);
+            }
+            Resource origResource = existingnodeTypeMap.get(uploadComponentInstanceInfo.getType());
+            componentInstance.setName(uploadComponentInstanceInfo.getName());
+            componentInstance.setIcon(origResource.getIcon());
+            resourcesInstancesMap.put(componentInstance, origResource);
+        } catch (Exception e) {
+            throw new ComponentException(ActionStatus.GENERAL_ERROR,e.getMessage());
+        }
+    }
+
+    protected void createAndAddResourceInstance(UploadComponentInstanceInfo uploadComponentInstanceInfo, String yamlName,
+                                              Service service, Map<String, Resource> nodeNamespaceMap, Map<String, Resource> existingnodeTypeMap, Map<ComponentInstance, Resource> resourcesInstancesMap) {
+        Either<Resource, ResponseFormat> eitherResource;
+        log.debug("*************Going to create  resource instances {}", uploadComponentInstanceInfo.getName());
+        try {
+            if (nodeNamespaceMap.containsKey(uploadComponentInstanceInfo.getType())) {
+                uploadComponentInstanceInfo
+                        .setType(nodeNamespaceMap.get(uploadComponentInstanceInfo.getType()).getToscaResourceName());
+            }
+            Resource refResource = validateResourceInstanceBeforeCreate(yamlName, uploadComponentInstanceInfo,
+                    existingnodeTypeMap);
+
+            ComponentInstance componentInstance = new ComponentInstance();
+            componentInstance.setComponentUid(refResource.getUniqueId());
+            Collection<String> directives = uploadComponentInstanceInfo.getDirectives();
+            if (directives != null && !directives.isEmpty()) {
+                componentInstance.setDirectives(new ArrayList<>(directives));
+            }
+            UploadNodeFilterInfo uploadNodeFilterInfo = uploadComponentInstanceInfo.getUploadNodeFilterInfo();
+            if (uploadNodeFilterInfo != null) {
+                componentInstance.setNodeFilter(new CINodeFilterUtils().getNodeFilterDataDefinition(uploadNodeFilterInfo,
+                        componentInstance.getUniqueId()));
+            }
+
+            ComponentTypeEnum containerComponentType = service.getComponentType();
+            NodeTypeEnum containerNodeType = containerComponentType.getNodeType();
+            if (containerNodeType.equals(NodeTypeEnum.Resource)
+                    && MapUtils.isNotEmpty(uploadComponentInstanceInfo.getCapabilities())
+                    && MapUtils.isNotEmpty(refResource.getCapabilities())) {
+                serviceImportParseLogic.setCapabilityNamesTypes(refResource.getCapabilities(), uploadComponentInstanceInfo.getCapabilities());
+                Map<String, List<CapabilityDefinition>> validComponentInstanceCapabilities = serviceImportParseLogic.getValidComponentInstanceCapabilities(
+                        refResource.getUniqueId(), refResource.getCapabilities(),
+                        uploadComponentInstanceInfo.getCapabilities());
+                componentInstance.setCapabilities(validComponentInstanceCapabilities);
+            }
+            if (!existingnodeTypeMap.containsKey(uploadComponentInstanceInfo.getType())) {
+                log.debug(
+                        "createResourceInstances - not found lates version for resource instance with name {} and type ",
+                        uploadComponentInstanceInfo.getName(), uploadComponentInstanceInfo.getType());
+                ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.INVALID_NODE_TEMPLATE,
+                        yamlName, uploadComponentInstanceInfo.getName(), uploadComponentInstanceInfo.getType());
+                throw new ComponentException(responseFormat);
+            }
+            Resource origResource = existingnodeTypeMap.get(uploadComponentInstanceInfo.getType());
+            componentInstance.setName(uploadComponentInstanceInfo.getName());
+            componentInstance.setIcon(origResource.getIcon());
+            resourcesInstancesMap.put(componentInstance, origResource);
+        } catch (Exception e) {
+            throw new ComponentException(ActionStatus.GENERAL_ERROR,e.getMessage());
+        }
+    }
+
+    protected Resource validateResourceInstanceBeforeCreate(String yamlName, UploadComponentInstanceInfo uploadComponentInstanceInfo,
+                                                          Map<String, Resource> nodeNamespaceMap) {
+        Resource refResource;
+        try {
+            if (nodeNamespaceMap.containsKey(uploadComponentInstanceInfo.getType())) {
+                refResource = nodeNamespaceMap.get(uploadComponentInstanceInfo.getType());
+            } else {
+                Either<Resource, StorageOperationStatus> findResourceEither = toscaOperationFacade
+                        .getLatestResourceByToscaResourceName(uploadComponentInstanceInfo.getType());
+                if (findResourceEither.isRight()) {
+                    ResponseFormat responseFormat = componentsUtils.getResponseFormat(
+                            componentsUtils.convertFromStorageResponse(findResourceEither.right().value()));
+                    throw new ComponentException(responseFormat);
+                }
+                refResource = findResourceEither.left().value();
+                nodeNamespaceMap.put(refResource.getToscaResourceName(), refResource);
+            }
+            String componentState = refResource.getComponentMetadataDefinition().getMetadataDataDefinition().getState();
+            if (componentState.equals(LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT.name())) {
+                ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.ILLEGAL_COMPONENT_STATE,
+                        refResource.getComponentType().getValue(), refResource.getName(), componentState);
+                throw new ComponentException(responseFormat);
+            }
+            if (!ModelConverter.isAtomicComponent(refResource) && refResource.getResourceType() != ResourceTypeEnum.VF) {
+                log.debug("validateResourceInstanceBeforeCreate -  ref resource type is  ", refResource.getResourceType());
+                ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.INVALID_NODE_TEMPLATE,
+                        yamlName, uploadComponentInstanceInfo.getName(), uploadComponentInstanceInfo.getType());
+                throw new ComponentException(responseFormat);
+            }
+            return refResource;
+        } catch (Exception e) {
+            throw new ComponentException(ActionStatus.GENERAL_ERROR,e.getMessage());
+        }
+    }
+
+    protected void handleServiceNodeTypes(String yamlName, Service service,
+                                        String topologyTemplateYaml, boolean needLock,
+                                        Map<String, EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<ArtifactDefinition>>> nodeTypesArtifactsToHandle,
+                                        List<ArtifactDefinition> nodeTypesNewCreatedArtifacts, Map<String, NodeTypeInfo> nodeTypesInfo,
+                                        CsarInfo csarInfo, String nodeName) {
+        try {
+            for (Map.Entry<String, NodeTypeInfo> nodeTypeEntry : nodeTypesInfo.entrySet()) {
+                boolean isResourceNotExisted = validateResourceNotExisted(nodeTypeEntry.getKey());
+                if (nodeTypeEntry.getValue().isNested() && isResourceNotExisted) {
+                    handleNestedVF(service, nodeTypesArtifactsToHandle, nodeTypesNewCreatedArtifacts,
+                            nodeTypesInfo, csarInfo, nodeTypeEntry.getKey());
+                    log.trace("************* finished to create node {}", nodeTypeEntry.getKey());
+                }
+            }
+            Map<String, Object> mappedToscaTemplate = null;
+            if (org.apache.commons.lang.StringUtils.isNotEmpty(nodeName) && MapUtils.isNotEmpty(nodeTypesInfo)
+                    && nodeTypesInfo.containsKey(nodeName)) {
+                mappedToscaTemplate = nodeTypesInfo.get(nodeName).getMappedToscaTemplate();
+            }
+            if (MapUtils.isEmpty(mappedToscaTemplate)) {
+                mappedToscaTemplate = (Map<String, Object>) new Yaml().load(topologyTemplateYaml);
+            }
+            createResourcesFromYamlNodeTypesList(yamlName, service, mappedToscaTemplate, needLock, nodeTypesArtifactsToHandle,
+                    nodeTypesNewCreatedArtifacts, nodeTypesInfo, csarInfo);
+        } catch (ComponentException e) {
+            throw e;
+        } catch (StorageException e) {
+            throw e;
+        }catch (Exception e){
+                   log.debug("Exception occured when handleServiceNodeTypes, error is:{}", e.getMessage(), e);
+            throw new ComponentException(ActionStatus.GENERAL_ERROR);
+        }
+    }
+
+    protected boolean validateResourceNotExisted(String type) {
+        try {
+            Either<Resource, StorageOperationStatus> latestResource = toscaOperationFacade.getLatestResourceByToscaResourceName(type);
+            return latestResource.isRight() ? true : false;
+        } catch (Exception e) {
+                   log.debug("Exception occured when validateResourceNotExisted, error is:{}", e.getMessage(), e);
+            throw new ComponentException(ActionStatus.GENERAL_ERROR);
+        }
+    }
+
+    protected Resource handleNestedVF(Service service, Map<String, EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<ArtifactDefinition>>> nodesArtifactsToHandle,
+                                    List<ArtifactDefinition> createdArtifacts, Map<String, NodeTypeInfo> nodesInfo, CsarInfo csarInfo,
+                                    String nodeName) {
+        try {
+            String yamlName = nodesInfo.get(nodeName).getTemplateFileName();
+            Map<String, Object> nestedVfcJsonMap = nodesInfo.get(nodeName).getMappedToscaTemplate();
+
+            createResourcesFromYamlNodeTypesList(yamlName, service, nestedVfcJsonMap, false,
+                    nodesArtifactsToHandle, createdArtifacts, nodesInfo, csarInfo);
+            log.debug("************* Finished to create node types from yaml {}", yamlName);
+
+            if (nestedVfcJsonMap.containsKey(TypeUtils.ToscaTagNamesEnum.TOPOLOGY_TEMPLATE.getElementName())) {
+                log.debug("************* Going to handle complex VFC from yaml {}", yamlName);
+                Resource resource = handleComplexVfc(nodesArtifactsToHandle, createdArtifacts, nodesInfo,
+                        csarInfo, nodeName, yamlName);
+                return resource;
+            }
+            return new Resource();
+        } catch (Exception e) {
+            log.debug("Exception occured when handleNestedVF, error is:{}", e.getMessage(), e);
+            throw new ComponentException(ActionStatus.GENERAL_ERROR);
+        }
+    }
+
+    protected Resource handleNestedVfc(Service service, Map<String, EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<ArtifactDefinition>>> nodesArtifactsToHandle,
+                                     List<ArtifactDefinition> createdArtifacts, Map<String, NodeTypeInfo> nodesInfo, CsarInfo csarInfo,
+                                     String nodeName) {
+        try {
+            String yamlName = nodesInfo.get(nodeName).getTemplateFileName();
+            Map<String, Object> nestedVfcJsonMap = nodesInfo.get(nodeName).getMappedToscaTemplate();
+            createResourcesFromYamlNodeTypesList(yamlName, service, nestedVfcJsonMap, false,
+                    nodesArtifactsToHandle, createdArtifacts, nodesInfo, csarInfo);
+            log.debug("************* Finished to create node types from yaml {}", yamlName);
+
+            if (nestedVfcJsonMap.containsKey(TypeUtils.ToscaTagNamesEnum.TOPOLOGY_TEMPLATE.getElementName())) {
+                log.debug("************* Going to handle complex VFC from yaml {}", yamlName);
+                Resource resource = handleComplexVfc(nodesArtifactsToHandle, createdArtifacts, nodesInfo,
+                        csarInfo, nodeName, yamlName);
+                return resource;
+            }
+            return new Resource();
+        }  catch (Exception e) {
+            log.debug("Exception occured when handleNestedVFc, error is:{}", e.getMessage(), e);
+            throw new ComponentException(ActionStatus.GENERAL_ERROR);
+        }
+    }
+
+    protected Resource handleComplexVfc(Map<String, EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<ArtifactDefinition>>> nodesArtifactsToHandle,
+                                      List<ArtifactDefinition> createdArtifacts, Map<String, NodeTypeInfo> nodesInfo, CsarInfo csarInfo,
+                                      String nodeName, String yamlName) {
+        try {
+            Resource oldComplexVfc = null;
+            Resource newComplexVfc = serviceImportParseLogic.buildValidComplexVfc(csarInfo, nodeName, nodesInfo);
+            Either<Resource, StorageOperationStatus> oldComplexVfcRes = toscaOperationFacade
+                    .getFullLatestComponentByToscaResourceName(newComplexVfc.getToscaResourceName());
+            if (oldComplexVfcRes.isRight() && oldComplexVfcRes.right().value() == StorageOperationStatus.NOT_FOUND) {
+                oldComplexVfcRes = toscaOperationFacade.getFullLatestComponentByToscaResourceName(
+                        serviceImportParseLogic.buildNestedToscaResourceName(ResourceTypeEnum.VF.name(), csarInfo.getVfResourceName(),
+                                nodeName).getRight());
+            }
+            if (oldComplexVfcRes.isRight() && oldComplexVfcRes.right().value() != StorageOperationStatus.NOT_FOUND) {
+                log.debug("Failed to fetch previous complex VFC by tosca resource name {}. Status is {}. ",
+                        newComplexVfc.getToscaResourceName(), oldComplexVfcRes.right().value());
+                throw new ComponentException(ActionStatus.GENERAL_ERROR);
+            } else if (oldComplexVfcRes.isLeft()) {
+                log.debug(VALIDATE_DERIVED_BEFORE_UPDATE);
+                Either<Boolean, ResponseFormat> eitherValidation = serviceImportParseLogic.validateNestedDerivedFromDuringUpdate(
+                        oldComplexVfcRes.left().value(), newComplexVfc,
+                        ValidationUtils.hasBeenCertified(oldComplexVfcRes.left().value().getVersion()));
+                if (eitherValidation.isLeft()) {
+                    oldComplexVfc = oldComplexVfcRes.left().value();
+                }
+            }
+            newComplexVfc = handleComplexVfc(nodesArtifactsToHandle, createdArtifacts, nodesInfo, csarInfo, nodeName, yamlName,
+                    oldComplexVfc, newComplexVfc);
+            csarInfo.getCreatedNodesToscaResourceNames().put(nodeName, newComplexVfc.getToscaResourceName());
+            LifecycleChangeInfoWithAction lifecycleChangeInfo = new LifecycleChangeInfoWithAction(
+                    CERTIFICATION_ON_IMPORT, LifecycleChangeInfoWithAction.LifecycleChanceActionEnum.CREATE_FROM_CSAR);
+            log.debug("Going to certify cvfc {}. ", newComplexVfc.getName());
+            final Resource result = serviceImportParseLogic
+                    .propagateStateToCertified(csarInfo.getModifier(), newComplexVfc, lifecycleChangeInfo, true, false,
+                            true);
+            csarInfo.getCreatedNodes().put(nodeName, result);
+            csarInfo.removeNodeFromQueue();
+            return result;
+        } catch (Exception e) {
+            log.debug("Exception occured when handleComplexVfc, error is:{}", e.getMessage(), e);
+            throw new ComponentException(ActionStatus.GENERAL_ERROR);
+        }
+    }
+
+    protected Resource handleComplexVfc(Map<String, EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<ArtifactDefinition>>> nodesArtifactsToHandle,
+                                      List<ArtifactDefinition> createdArtifacts, Map<String, NodeTypeInfo> nodesInfo, CsarInfo csarInfo,
+                                      String nodeName, String yamlName, Resource oldComplexVfc, Resource newComplexVfc) {
+        Resource handleComplexVfcRes;
+        try {
+            Map<String, Object> mappedToscaTemplate = nodesInfo.get(nodeName).getMappedToscaTemplate();
+            String yamlContent = new String(csarInfo.getCsar().get(yamlName));
+            Map<String, NodeTypeInfo> newNodeTypesInfo = nodesInfo.entrySet().stream()
+                    .collect(toMap(Map.Entry::getKey, e -> e.getValue().getUnmarkedCopy()));
+            CsarInfo.markNestedVfc(mappedToscaTemplate, newNodeTypesInfo);
+            if (oldComplexVfc == null) {
+                handleComplexVfcRes = createResourceFromYaml(newComplexVfc, yamlContent, yamlName, newNodeTypesInfo,
+                        csarInfo, nodesArtifactsToHandle, false, true, nodeName);
+            } else {
+                handleComplexVfcRes = updateResourceFromYaml(oldComplexVfc, newComplexVfc,
+                        AuditingActionEnum.UPDATE_RESOURCE_METADATA, createdArtifacts, yamlContent, yamlName, csarInfo,
+                        newNodeTypesInfo, nodesArtifactsToHandle, nodeName, true);
+            }
+            return handleComplexVfcRes;
+        } catch (Exception e) {
+            log.debug("Exception occured when handleComplexVfc, error is:{}", e.getMessage(), e);
+            throw new ComponentException(ActionStatus.GENERAL_ERROR);
+        }
+    }
+
+    protected Resource updateResourceFromYaml(Resource oldRresource, Resource newRresource,
+                                            AuditingActionEnum actionEnum, List<ArtifactDefinition> createdArtifacts,
+                                            String yamlFileName, String yamlFileContent, CsarInfo csarInfo, Map<String, NodeTypeInfo> nodeTypesInfo,
+                                            Map<String, EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<ArtifactDefinition>>> nodeTypesArtifactsToHandle,
+                                            String nodeName, boolean isNested) {
+        boolean inTransaction = true;
+        boolean shouldLock = false;
+        Resource preparedResource = null;
+        ParsedToscaYamlInfo uploadComponentInstanceInfoMap = null;
+        try {
+            uploadComponentInstanceInfoMap = csarBusinessLogic.getParsedToscaYamlInfo(yamlFileContent, yamlFileName, nodeTypesInfo, csarInfo, nodeName, oldRresource);
+            Map<String, UploadComponentInstanceInfo> instances = uploadComponentInstanceInfoMap.getInstances();
+            if (MapUtils.isEmpty(instances) && newRresource.getResourceType() != ResourceTypeEnum.PNF) {
+                throw new ComponentException(ActionStatus.NOT_TOPOLOGY_TOSCA_TEMPLATE, yamlFileName);
+            }
+            preparedResource = updateExistingResourceByImport(newRresource, oldRresource, csarInfo.getModifier(),
+                    inTransaction, shouldLock, isNested).left;
+            log.trace("YAML topology file found in CSAR, file name: {}, contents: {}", yamlFileName, yamlFileContent);
+            serviceImportParseLogic.handleResourceGenericType(preparedResource);
+            handleNodeTypes(yamlFileName, preparedResource, yamlFileContent,
+                    shouldLock, nodeTypesArtifactsToHandle, createdArtifacts, nodeTypesInfo, csarInfo, nodeName);
+            preparedResource = serviceImportParseLogic
+                    .createInputsOnResource(preparedResource, uploadComponentInstanceInfoMap.getInputs());
+            preparedResource = createResourceInstances(yamlFileName, preparedResource, instances, csarInfo.getCreatedNodes());
+            preparedResource = createResourceInstancesRelations(csarInfo.getModifier(), yamlFileName, preparedResource, instances);
+        } catch (ComponentException e) {
+            ResponseFormat responseFormat = e.getResponseFormat() == null ? componentsUtils.getResponseFormat(e.getActionStatus(), e.getParams()) : e.getResponseFormat();
+            log.debug("#updateResourceFromYaml - failed to update resource from yaml {} .The error is {}", yamlFileName, responseFormat);
+            componentsUtils.auditResource(responseFormat, csarInfo.getModifier(), preparedResource == null ? oldRresource : preparedResource, actionEnum);
+            throw e;
+        } catch (StorageException e) {
+            ResponseFormat responseFormat = componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(e.getStorageOperationStatus()));
+            log.debug("#updateResourceFromYaml - failed to update resource from yaml {} .The error is {}", yamlFileName, responseFormat);
+            componentsUtils.auditResource(responseFormat, csarInfo.getModifier(), preparedResource == null ? oldRresource : preparedResource, actionEnum);
+            throw e;
+        }
+        Either<Map<String, GroupDefinition>, ResponseFormat> validateUpdateVfGroupNamesRes = serviceBusinessLogic.groupBusinessLogic
+                .validateUpdateVfGroupNames(uploadComponentInstanceInfoMap.getGroups(),
+                        preparedResource.getSystemName());
+        if (validateUpdateVfGroupNamesRes.isRight()) {
+            throw new ComponentException(validateUpdateVfGroupNamesRes.right().value());
+        }
+        Map<String, GroupDefinition> groups;
+        if (!validateUpdateVfGroupNamesRes.left().value().isEmpty()) {
+            groups = validateUpdateVfGroupNamesRes.left().value();
+        } else {
+            groups = uploadComponentInstanceInfoMap.getGroups();
+        }
+        serviceImportParseLogic.handleGroupsProperties(preparedResource, groups);
+        preparedResource = serviceImportParseLogic.updateGroupsOnResource(preparedResource, groups);
+        NodeTypeInfoToUpdateArtifacts nodeTypeInfoToUpdateArtifacts = new NodeTypeInfoToUpdateArtifacts(nodeName,
+                nodeTypesArtifactsToHandle);
+
+        Either<Resource, ResponseFormat> updateArtifactsEither = createOrUpdateArtifacts(
+                ArtifactsBusinessLogic.ArtifactOperationEnum.UPDATE, createdArtifacts, yamlFileName,
+                csarInfo, preparedResource, nodeTypeInfoToUpdateArtifacts, inTransaction, shouldLock);
+        if (updateArtifactsEither.isRight()) {
+            log.debug("failed to update artifacts {}", updateArtifactsEither.right().value());
+            throw new ComponentException(updateArtifactsEither.right().value());
+        }
+        preparedResource = serviceImportParseLogic.getResourceWithGroups(updateArtifactsEither.left().value().getUniqueId());
+
+        ActionStatus mergingPropsAndInputsStatus = resourceDataMergeBusinessLogic.mergeResourceEntities(oldRresource, preparedResource);
+        if (mergingPropsAndInputsStatus != ActionStatus.OK) {
+            ResponseFormat responseFormat = componentsUtils.getResponseFormatByResource(mergingPropsAndInputsStatus,
+                    preparedResource);
+            throw new ComponentException(responseFormat);
+        }
+        compositionBusinessLogic.setPositionsForComponentInstances(preparedResource, csarInfo.getModifier().getUserId());
+        return preparedResource;
+    }
+
+    protected Resource createResourceFromYaml(Resource resource, String topologyTemplateYaml,
+                                            String yamlName, Map<String, NodeTypeInfo> nodeTypesInfo, CsarInfo csarInfo,
+                                            Map<String, EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<ArtifactDefinition>>> nodeTypesArtifactsToCreate,
+                                            boolean shouldLock, boolean inTransaction, String nodeName) {
+        List<ArtifactDefinition> createdArtifacts = new ArrayList<>();
+        Resource createdResource;
+        try {
+            ParsedToscaYamlInfo parsedToscaYamlInfo = csarBusinessLogic.getParsedToscaYamlInfo(topologyTemplateYaml, yamlName, nodeTypesInfo, csarInfo, nodeName, resource);
+            if (MapUtils.isEmpty(parsedToscaYamlInfo.getInstances()) && resource.getResourceType() != ResourceTypeEnum.PNF) {
+                throw new ComponentException(ActionStatus.NOT_TOPOLOGY_TOSCA_TEMPLATE, yamlName);
+            }
+            log.debug("#createResourceFromYaml - Going to create resource {} and RIs ", resource.getName());
+            createdResource = createResourceAndRIsFromYaml(yamlName, resource,
+                    parsedToscaYamlInfo, AuditingActionEnum.IMPORT_RESOURCE, false, createdArtifacts, topologyTemplateYaml,
+                    nodeTypesInfo, csarInfo, nodeTypesArtifactsToCreate, shouldLock, inTransaction, nodeName);
+            log.debug("#createResourceFromYaml - The resource {} has been created ", resource.getName());
+        } catch (ComponentException e) {
+            ResponseFormat responseFormat = e.getResponseFormat() == null ? componentsUtils.getResponseFormat(e.getActionStatus(), e.getParams()) : e.getResponseFormat();
+            componentsUtils.auditResource(responseFormat, csarInfo.getModifier(), resource, AuditingActionEnum.IMPORT_RESOURCE);
+            throw e;
+        } catch (StorageException e) {
+            ResponseFormat responseFormat = componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(e.getStorageOperationStatus()));
+            componentsUtils.auditResource(responseFormat, csarInfo.getModifier(), resource, AuditingActionEnum.IMPORT_RESOURCE);
+            throw e;
+        }
+        return createdResource;
+    }
+
+    protected Resource createResourceAndRIsFromYaml(String yamlName, Resource resource,
+                                                  ParsedToscaYamlInfo parsedToscaYamlInfo, AuditingActionEnum actionEnum, boolean isNormative,
+                                                  List<ArtifactDefinition> createdArtifacts, String topologyTemplateYaml,
+                                                  Map<String, NodeTypeInfo> nodeTypesInfo, CsarInfo csarInfo,
+                                                  Map<String, EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<ArtifactDefinition>>> nodeTypesArtifactsToCreate,
+                                                  boolean shouldLock, boolean inTransaction, String nodeName) {
+        List<ArtifactDefinition> nodeTypesNewCreatedArtifacts = new ArrayList<>();
+        if (shouldLock) {
+            Either<Boolean, ResponseFormat> lockResult = serviceBusinessLogic.lockComponentByName(resource.getSystemName(), resource,
+                    CREATE_RESOURCE);
+            if (lockResult.isRight()) {
+                serviceImportParseLogic.rollback(inTransaction, resource, createdArtifacts, nodeTypesNewCreatedArtifacts);
+                throw new ComponentException(lockResult.right().value());
+            }
+            log.debug("name is locked {} status = {}", resource.getSystemName(), lockResult);
+        }
+        try {
+            log.trace("************* createResourceFromYaml before full create resource {}", yamlName);
+            Resource genericResource = serviceBusinessLogic.fetchAndSetDerivedFromGenericType(resource);
+            resource = createResourceTransaction(resource,
+                    csarInfo.getModifier(), isNormative);
+            log.trace("************* Going to add inputs from yaml {}", yamlName);
+
+            Map<String, Object> yamlMap = ImportUtils.loadYamlAsStrictMap(csarInfo.getMainTemplateContent());
+            Map<String, Object> metadata = (Map<String, Object>) yamlMap.get("metadata");
+            String type = (String) metadata.get("type");
+            if (resource.shouldGenerateInputs() && !"Service".equalsIgnoreCase(type))
+                serviceBusinessLogic.generateAndAddInputsFromGenericTypeProperties(resource, genericResource);
+            Map<String, InputDefinition> inputs = parsedToscaYamlInfo.getInputs();
+            resource = serviceImportParseLogic.createInputsOnResource(resource, inputs);
+            Map<String, UploadComponentInstanceInfo> uploadComponentInstanceInfoMap = parsedToscaYamlInfo
+                    .getInstances();
+            resource = createRIAndRelationsFromYaml(yamlName, resource, uploadComponentInstanceInfoMap,
+                    topologyTemplateYaml, nodeTypesNewCreatedArtifacts, nodeTypesInfo, csarInfo,
+                    nodeTypesArtifactsToCreate, nodeName);
+            log.trace("************* Finished to create nodes, RI and Relation  from yaml {}", yamlName);
+            // validate update vf module group names
+            Either<Map<String, GroupDefinition>, ResponseFormat> validateUpdateVfGroupNamesRes = serviceBusinessLogic.groupBusinessLogic
+                    .validateUpdateVfGroupNames(parsedToscaYamlInfo.getGroups(), resource.getSystemName());
+            if (validateUpdateVfGroupNamesRes.isRight()) {
+                serviceImportParseLogic.rollback(inTransaction, resource, createdArtifacts, nodeTypesNewCreatedArtifacts);
+                throw new ComponentException(validateUpdateVfGroupNamesRes.right().value());
+            }
+            Map<String, GroupDefinition> groups;
+            log.trace("************* Going to add groups from yaml {}", yamlName);
+
+            if (!validateUpdateVfGroupNamesRes.left().value().isEmpty()) {
+                groups = validateUpdateVfGroupNamesRes.left().value();
+            } else {
+                groups = parsedToscaYamlInfo.getGroups();
+            }
+
+            Either<Resource, ResponseFormat> createGroupsOnResource = createGroupsOnResource(resource,
+                    groups);
+            if (createGroupsOnResource.isRight()) {
+                serviceImportParseLogic.rollback(inTransaction, resource, createdArtifacts, nodeTypesNewCreatedArtifacts);
+                throw new ComponentException(createGroupsOnResource.right().value());
+            }
+            resource = createGroupsOnResource.left().value();
+            log.trace("************* Going to add artifacts from yaml {}", yamlName);
+
+            NodeTypeInfoToUpdateArtifacts nodeTypeInfoToUpdateArtifacts = new NodeTypeInfoToUpdateArtifacts(nodeName, nodeTypesArtifactsToCreate);
+
+            Either<Resource, ResponseFormat> createArtifactsEither = createOrUpdateArtifacts(
+                    ArtifactsBusinessLogic.ArtifactOperationEnum.CREATE, createdArtifacts, yamlName,
+                    csarInfo, resource, nodeTypeInfoToUpdateArtifacts, inTransaction, shouldLock);
+            if (createArtifactsEither.isRight()) {
+                serviceImportParseLogic.rollback(inTransaction, resource, createdArtifacts, nodeTypesNewCreatedArtifacts);
+                throw new ComponentException(createArtifactsEither.right().value());
+            }
+
+            resource = serviceImportParseLogic.getResourceWithGroups(createArtifactsEither.left().value().getUniqueId());
+            ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.CREATED);
+            componentsUtils.auditResource(responseFormat, csarInfo.getModifier(), resource, actionEnum);
+            ASDCKpiApi.countCreatedResourcesKPI();
+            return resource;
+        } catch (ComponentException | StorageException e) {
+            serviceImportParseLogic.rollback(inTransaction, resource, createdArtifacts, nodeTypesNewCreatedArtifacts);
+            throw e;
+        } finally {
+            if (!inTransaction) {
+                serviceBusinessLogic.janusGraphDao.commit();
+            }
+            if (shouldLock) {
+                serviceBusinessLogic.graphLockOperation.unlockComponentByName(resource.getSystemName(), resource.getUniqueId(), NodeTypeEnum.Resource);
+            }
+        }
+    }
+
+    protected Either<Resource, ResponseFormat> createGroupsOnResource(Resource resource,
+                                                                    Map<String, GroupDefinition> groups) {
+        if (groups != null && !groups.isEmpty()) {
+            List<GroupDefinition> groupsAsList = updateGroupsMembersUsingResource(
+                    groups, resource);
+            serviceImportParseLogic.handleGroupsProperties(resource, groups);
+            serviceImportParseLogic.fillGroupsFinalFields(groupsAsList);
+            Either<List<GroupDefinition>, ResponseFormat> createGroups = serviceBusinessLogic.groupBusinessLogic.createGroups(resource,
+                    groupsAsList, true);
+            if (createGroups.isRight()) {
+                return Either.right(createGroups.right().value());
+            }
+        } else {
+            return Either.left(resource);
+        }
+        Either<Resource, StorageOperationStatus> updatedResource = toscaOperationFacade
+                .getToscaElement(resource.getUniqueId());
+        if (updatedResource.isRight()) {
+            ResponseFormat responseFormat = componentsUtils.getResponseFormatByResource(
+                    componentsUtils.convertFromStorageResponse(updatedResource.right().value()), resource);
+            return Either.right(responseFormat);
+        }
+        return Either.left(updatedResource.left().value());
+    }
+
+    protected List<GroupDefinition> updateGroupsMembersUsingResource(Map<String, GroupDefinition> groups, Resource component) {
+        List<GroupDefinition> result = new ArrayList<>();
+        List<ComponentInstance> componentInstances = component.getComponentInstances();
+
+        if (groups != null) {
+            Either<Boolean, ResponseFormat> validateCyclicGroupsDependencies = serviceImportParseLogic.validateCyclicGroupsDependencies(groups);
+            if (validateCyclicGroupsDependencies.isRight()) {
+                throw new ComponentException(validateCyclicGroupsDependencies.right().value());
+            }
+            for (Map.Entry<String, GroupDefinition> entry : groups.entrySet()) {
+                String groupName = entry.getKey();
+                GroupDefinition groupDefinition = entry.getValue();
+                GroupDefinition updatedGroupDefinition = new GroupDefinition(groupDefinition);
+                updatedGroupDefinition.setMembers(null);
+                Map<String, String> members = groupDefinition.getMembers();
+                if (members != null) {
+                    updateGroupMembers(groups, updatedGroupDefinition, component, componentInstances, groupName, members);
+                }
+                result.add(updatedGroupDefinition);
+            }
+        }
+        return result;
+    }
+
+    protected void updateGroupMembers(Map<String, GroupDefinition> groups, GroupDefinition updatedGroupDefinition, Resource component, List<ComponentInstance> componentInstances, String groupName, Map<String, String> members) {
+        Set<String> compInstancesNames = members.keySet();
+        if (CollectionUtils.isEmpty(componentInstances)) {
+            String membersAstString = compInstancesNames.stream().collect(joining(","));
+            log.debug("The members: {}, in group: {}, cannot be found in component {}. There are no component instances.",
+                    membersAstString, groupName, component.getNormalizedName());
+            throw new ComponentException(componentsUtils.getResponseFormat(
+                    ActionStatus.GROUP_INVALID_COMPONENT_INSTANCE, membersAstString, groupName,
+                    component.getNormalizedName(), serviceImportParseLogic.getComponentTypeForResponse(component)));
+        }
+        Map<String, String> memberNames = componentInstances.stream()
+                .collect(toMap(ComponentInstance::getName, ComponentInstance::getUniqueId));
+        memberNames.putAll(groups.keySet().stream().collect(toMap(g -> g, g -> "")));
+        Map<String, String> relevantInstances = memberNames.entrySet().stream()
+                .filter(n -> compInstancesNames.contains(n.getKey()))
+                .collect(toMap(Map.Entry::getKey, Map.Entry::getValue));
+
+        if (relevantInstances == null || relevantInstances.size() != compInstancesNames.size()) {
+            List<String> foundMembers = new ArrayList<>();
+            if (relevantInstances != null) {
+                foundMembers = relevantInstances.keySet().stream().collect(toList());
+            }
+            compInstancesNames.removeAll(foundMembers);
+            String membersAstString = compInstancesNames.stream().collect(joining(","));
+            throw new ComponentException(componentsUtils.getResponseFormat(
+                    ActionStatus.GROUP_INVALID_COMPONENT_INSTANCE, membersAstString, groupName,
+                    component.getNormalizedName(), serviceImportParseLogic.getComponentTypeForResponse(component)));
+        }
+        updatedGroupDefinition.setMembers(relevantInstances);
+    }
+
+    protected Resource createResourceTransaction(Resource resource, User user,
+                                               boolean isNormative) {
+        Either<Boolean, StorageOperationStatus> eitherValidation = toscaOperationFacade.validateComponentNameExists(
+                resource.getName(), resource.getResourceType(), resource.getComponentType());
+        if (eitherValidation.isRight()) {
+            ResponseFormat errorResponse = componentsUtils
+                    .getResponseFormat(componentsUtils.convertFromStorageResponse(eitherValidation.right().value()));
+            throw new ComponentException(errorResponse);
+        }
+        if (eitherValidation.left().value()) {
+            log.debug("resource with name: {}, already exists", resource.getName());
+            ResponseFormat errorResponse = componentsUtils.getResponseFormat(ActionStatus.COMPONENT_NAME_ALREADY_EXIST,
+                    ComponentTypeEnum.RESOURCE.getValue(), resource.getName());
+            throw new ComponentException(errorResponse);
+        }
+        log.debug("send resource {} to dao for create", resource.getName());
+        serviceImportParseLogic.createArtifactsPlaceHolderData(resource, user);
+        if (!isNormative) {
+            log.debug("enrich resource with creator, version and state");
+            resource.setLifecycleState(LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT);
+            resource.setVersion(INITIAL_VERSION);
+            resource.setHighestVersion(true);
+            if (resource.getResourceType() != null && resource.getResourceType() != ResourceTypeEnum.VF) {
+                resource.setAbstract(false);
+            }
+        }
+        return toscaOperationFacade.createToscaComponent(resource)
+                .left()
+                .on(r -> serviceImportParseLogic.throwComponentExceptionByResource(r, resource));
+    }
+
+    protected ImmutablePair<Resource, ActionStatus> updateExistingResourceByImport(
+            Resource newResource, Resource oldResource, User user, boolean inTransaction, boolean needLock,
+            boolean isNested) {
+        String lockedResourceId = oldResource.getUniqueId();
+        log.debug("found resource: name={}, id={}, version={}, state={}", oldResource.getName(), lockedResourceId,
+                oldResource.getVersion(), oldResource.getLifecycleState());
+        ImmutablePair<Resource, ActionStatus> resourcePair = null;
+        try {
+            serviceBusinessLogic.lockComponent(lockedResourceId, oldResource, needLock, "Update Resource by Import");
+            oldResource = serviceImportParseLogic
+                    .prepareResourceForUpdate(oldResource, newResource, user, inTransaction, false);
+            serviceImportParseLogic.mergeOldResourceMetadataWithNew(oldResource, newResource);
+            serviceImportParseLogic.validateResourceFieldsBeforeUpdate(oldResource, newResource, inTransaction, isNested);
+            serviceImportParseLogic
+                    .validateCapabilityTypesCreate(user, serviceImportParseLogic.getCapabilityTypeOperation(), newResource, AuditingActionEnum.IMPORT_RESOURCE, inTransaction);
+            newResource.setContactId(newResource.getContactId().toLowerCase());
+            newResource.setCreatorUserId(user.getUserId());
+            newResource.setCreatorFullName(user.getFullName());
+            newResource.setLastUpdaterUserId(user.getUserId());
+            newResource.setLastUpdaterFullName(user.getFullName());
+            newResource.setUniqueId(oldResource.getUniqueId());
+            newResource.setVersion(oldResource.getVersion());
+            newResource.setInvariantUUID(oldResource.getInvariantUUID());
+            newResource.setLifecycleState(oldResource.getLifecycleState());
+            newResource.setUUID(oldResource.getUUID());
+            newResource.setNormalizedName(oldResource.getNormalizedName());
+            newResource.setSystemName(oldResource.getSystemName());
+            if (oldResource.getCsarUUID() != null) {
+                newResource.setCsarUUID(oldResource.getCsarUUID());
+            }
+            if (oldResource.getImportedToscaChecksum() != null) {
+                newResource.setImportedToscaChecksum(oldResource.getImportedToscaChecksum());
+            }
+            if (newResource.getDerivedFromGenericType() == null || newResource.getDerivedFromGenericType().isEmpty()) {
+                newResource.setDerivedFromGenericType(oldResource.getDerivedFromGenericType());
+            }
+            if (newResource.getDerivedFromGenericVersion() == null || newResource.getDerivedFromGenericVersion().isEmpty()) {
+                newResource.setDerivedFromGenericVersion(oldResource.getDerivedFromGenericVersion());
+            }
+            if (newResource.getToscaArtifacts() == null || newResource.getToscaArtifacts().isEmpty()) {
+                serviceBusinessLogic.setToscaArtifactsPlaceHolders(newResource, user);
+            }
+            if (newResource.getInterfaces() == null || newResource.getInterfaces().isEmpty()) {
+                newResource.setInterfaces(oldResource.getInterfaces());
+            }
+            if (CollectionUtils.isEmpty(newResource.getProperties())) {
+                newResource.setProperties(oldResource.getProperties());
+            }
+
+            Either<Resource, StorageOperationStatus> overrideResource = toscaOperationFacade
+                    .overrideComponent(newResource, oldResource);
+            if (overrideResource.isRight()) {
+                ResponseFormat responseFormat = new ResponseFormat();
+                serviceBusinessLogic.throwComponentException(responseFormat);
+            }
+            log.debug("Resource updated successfully!!!");
+            resourcePair = new ImmutablePair<>(overrideResource.left().value(),
+                    ActionStatus.OK);
+            return resourcePair;
+        } finally {
+            if (resourcePair == null) {
+                BeEcompErrorManager.getInstance().logBeSystemError("Change LifecycleState - Certify");
+                serviceBusinessLogic.janusGraphDao.rollback();
+            } else if (!inTransaction) {
+                serviceBusinessLogic.janusGraphDao.commit();
+            }
+            if (needLock) {
+                log.debug("unlock resource {}", lockedResourceId);
+                serviceBusinessLogic.graphLockOperation.unlockComponent(lockedResourceId, NodeTypeEnum.Resource);
+            }
+        }
+    }
+
+    protected Map<String, Resource> createResourcesFromYamlNodeTypesList(String yamlName, Service service, Map<String, Object> mappedToscaTemplate, boolean needLock,
+                                                                      Map<String, EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<ArtifactDefinition>>> nodeTypesArtifactsToHandle,
+                                                                      List<ArtifactDefinition> nodeTypesNewCreatedArtifacts, Map<String, NodeTypeInfo> nodeTypesInfo,
+                                                                      CsarInfo csarInfo) {
+        try {
+            Either<String, ImportUtils.ResultStatusEnum> toscaVersion = findFirstToscaStringElement(mappedToscaTemplate,
+                    TypeUtils.ToscaTagNamesEnum.TOSCA_VERSION);
+            if (toscaVersion.isRight()) {
+                throw new ComponentException(ActionStatus.INVALID_TOSCA_TEMPLATE);
+            }
+            Map<String, Object> mapToConvert = new HashMap<>();
+            mapToConvert.put(TypeUtils.ToscaTagNamesEnum.TOSCA_VERSION.getElementName(), toscaVersion.left().value());
+            Map<String, Object> nodeTypes = serviceImportParseLogic.getNodeTypesFromTemplate(mappedToscaTemplate);
+            createNodeTypes(yamlName, service, needLock, nodeTypesArtifactsToHandle, nodeTypesNewCreatedArtifacts, nodeTypesInfo, csarInfo, mapToConvert, nodeTypes);
+            return csarInfo.getCreatedNodes();
+        } catch (Exception e) {
+                       log.debug("Exception occured when createResourcesFromYamlNodeTypesList,error is:{}",e.getMessage(),e);
+            throw  new ComponentException(ActionStatus.GENERAL_ERROR);
+        }
+    }
+
+    protected void createNodeTypes(String yamlName, Service service, boolean needLock, Map<String, EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<ArtifactDefinition>>> nodeTypesArtifactsToHandle, List<ArtifactDefinition> nodeTypesNewCreatedArtifacts, Map<String, NodeTypeInfo> nodeTypesInfo, CsarInfo csarInfo, Map<String, Object> mapToConvert, Map<String, Object> nodeTypes) {
+        Iterator<Map.Entry<String, Object>> nodesNameValueIter = nodeTypes.entrySet().iterator();
+        Resource vfcCreated = null;
+        while (nodesNameValueIter.hasNext()) {
+            Map.Entry<String, Object> nodeType = nodesNameValueIter.next();
+            Map<ArtifactsBusinessLogic.ArtifactOperationEnum, List<ArtifactDefinition>> nodeTypeArtifactsToHandle = nodeTypesArtifactsToHandle == null
+                    || nodeTypesArtifactsToHandle.isEmpty() ? null
+                    : nodeTypesArtifactsToHandle.get(nodeType.getKey());
+
+            if (nodeTypesInfo.containsKey(nodeType.getKey())) {
+                vfcCreated = handleNestedVfc(service,
+                        nodeTypesArtifactsToHandle, nodeTypesNewCreatedArtifacts, nodeTypesInfo, csarInfo,
+                        nodeType.getKey());
+                log.trace("************* Finished to handle nested vfc {}", nodeType.getKey());
+            } else if (csarInfo.getCreatedNodesToscaResourceNames() != null
+                    && !csarInfo.getCreatedNodesToscaResourceNames().containsKey(nodeType.getKey())) {
+                ImmutablePair<Resource, ActionStatus> resourceCreated = serviceImportParseLogic
+                        .createNodeTypeResourceFromYaml(yamlName, nodeType, csarInfo.getModifier(), mapToConvert,
+                                service, needLock, nodeTypeArtifactsToHandle, nodeTypesNewCreatedArtifacts, true,
+                                csarInfo, true);
+                log.debug("************* Finished to create node {}", nodeType.getKey());
+
+                vfcCreated = resourceCreated.getLeft();
+                csarInfo.getCreatedNodesToscaResourceNames().put(nodeType.getKey(),
+                        vfcCreated.getName());
+            }
+            if (vfcCreated != null) {
+                csarInfo.getCreatedNodes().put(nodeType.getKey(), vfcCreated);
+            }
+            mapToConvert.remove(TypeUtils.ToscaTagNamesEnum.NODE_TYPES.getElementName());
+        }
+    }
+
+}
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ServiceImportManager.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ServiceImportManager.java
new file mode 100644 (file)
index 0000000..8e7c1e8
--- /dev/null
@@ -0,0 +1,116 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * Copyright (C) 2020 CMCC Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdc.be.components.impl;
+
+
+import javax.servlet.ServletContext;
+import org.openecomp.sdc.be.datatypes.components.ServiceMetadataDataDefinition;
+import org.openecomp.sdc.be.impl.WebAppContextWrapper;
+import org.openecomp.sdc.be.model.Service;
+import org.openecomp.sdc.be.model.UploadServiceInfo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.web.context.WebApplicationContext;
+
+
+//upload Service model by Shiyong1989@hotmail.com
+@Component("ServiceImportManager")
+public class ServiceImportManager {
+
+  private ServletContext servletContext;
+
+  private ResponseFormatManager responseFormatManager;
+
+  @Autowired
+  private ServiceBusinessLogic serviceBusinessLogic;
+
+  public ServiceImportBusinessLogic getServiceImportBusinessLogic() {
+    return serviceImportBusinessLogic;
+  }
+
+  public void setServiceImportBusinessLogic(
+      ServiceImportBusinessLogic serviceImportBusinessLogic) {
+    this.serviceImportBusinessLogic = serviceImportBusinessLogic;
+  }
+
+  @Autowired
+  private ServiceImportBusinessLogic serviceImportBusinessLogic;
+
+  public boolean isServiceExist(String serviceName) {
+    return serviceBusinessLogic.isServiceExist(serviceName);
+  }
+
+
+  public ServiceBusinessLogic getServiceBusinessLogic() {
+    return serviceBusinessLogic;
+  }
+
+  public void setServiceBusinessLogic(
+      ServiceBusinessLogic serviceBusinessLogic) {
+    this.serviceBusinessLogic = serviceBusinessLogic;
+  }
+
+
+  public void populateServiceMetadata(UploadServiceInfo serviceMetaData, Service service) {
+    if (service != null && serviceMetaData != null) {
+      service.setDescription(serviceMetaData.getDescription());
+      service.setTags(serviceMetaData.getTags());
+      service.setCategories(serviceMetaData.getCategories());
+      service.setContactId(serviceMetaData.getContactId());
+      service.setName(serviceMetaData.getName());
+      service.setIcon(serviceMetaData.getServiceIconPath());
+      service.setServiceVendorModelNumber(serviceMetaData.getServiceVendorModelNumber());
+      ServiceMetadataDataDefinition serviceMetadataDataDefinition = (ServiceMetadataDataDefinition) service
+          .getComponentMetadataDefinition().getMetadataDataDefinition();
+      serviceMetadataDataDefinition.getServiceVendorModelNumber();
+      service.setServiceType("");
+      service.setProjectCode(serviceMetaData.getProjectCode());
+      if (serviceMetaData.getVendorName() != null) {
+        service.setVendorName(serviceMetaData.getVendorName());
+      }
+      if (serviceMetaData.getVendorRelease() != null) {
+        service.setVendorRelease(serviceMetaData.getVendorRelease());
+      }
+    }
+  }
+
+  public void populateRealServiceMetadata(UploadServiceInfo serviceMetaData, Service service) {
+    if (service != null && serviceMetaData != null) {
+      service.setTags(serviceMetaData.getTags());
+      service.setContactId(serviceMetaData.getContactId());
+      service.setName(serviceMetaData.getName());
+    }
+  }
+
+  public synchronized void init(ServletContext servletContext) {
+    if (this.servletContext == null) {
+      this.servletContext = servletContext;
+      responseFormatManager = ResponseFormatManager.getInstance();
+      serviceBusinessLogic = getServiceBL(servletContext);
+    }
+  }
+
+  private ServiceBusinessLogic getServiceBL(ServletContext context) {
+    WebAppContextWrapper webApplicationContextWrapper = (WebAppContextWrapper) context.getAttribute(org.openecomp.sdc.common.api.Constants.WEB_APPLICATION_CONTEXT_WRAPPER_ATTR);
+    WebApplicationContext webApplicationContext = webApplicationContextWrapper.getWebAppContext(context);
+    return webApplicationContext.getBean(ServiceBusinessLogic.class);
+  }
+}
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ServiceImportParseLogic.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ServiceImportParseLogic.java
new file mode 100644 (file)
index 0000000..65576d1
--- /dev/null
@@ -0,0 +1,2602 @@
+/*
+ * Copyright (C) 2020 CMCC, Inc. and others. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.openecomp.sdc.be.components.impl;
+
+
+import fj.data.Either;
+import lombok.Getter;
+import lombok.Setter;
+import org.apache.commons.codec.binary.Base64;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.collections.MapUtils;
+import org.apache.commons.lang3.tuple.ImmutablePair;
+import org.openecomp.sdc.be.components.csar.CsarInfo;
+import org.openecomp.sdc.be.components.impl.artifact.ArtifactOperationInfo;
+import org.openecomp.sdc.be.components.impl.exceptions.ByResponseFormatComponentException;
+import org.openecomp.sdc.be.components.impl.exceptions.ComponentException;
+import org.openecomp.sdc.be.components.lifecycle.LifecycleBusinessLogic;
+import org.openecomp.sdc.be.components.lifecycle.LifecycleChangeInfoWithAction;
+import org.openecomp.sdc.be.config.BeEcompErrorManager;
+import org.openecomp.sdc.be.config.ConfigurationManager;
+import org.openecomp.sdc.be.dao.api.ActionStatus;
+import org.openecomp.sdc.be.datatypes.elements.*;
+import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
+import org.openecomp.sdc.be.datatypes.enums.CreatedFrom;
+import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
+import org.openecomp.sdc.be.datatypes.enums.ResourceTypeEnum;
+import org.openecomp.sdc.be.impl.ComponentsUtils;
+import org.openecomp.sdc.be.model.*;
+import org.openecomp.sdc.be.model.category.CategoryDefinition;
+import org.openecomp.sdc.be.model.category.SubCategoryDefinition;
+import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ToscaOperationFacade;
+import org.openecomp.sdc.be.model.jsonjanusgraph.utils.ModelConverter;
+import org.openecomp.sdc.be.model.operations.api.ICapabilityTypeOperation;
+import org.openecomp.sdc.be.model.operations.api.IInterfaceLifecycleOperation;
+import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
+import org.openecomp.sdc.be.model.operations.impl.UniqueIdBuilder;
+import org.openecomp.sdc.be.model.operations.utils.ComponentValidationUtils;
+import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum;
+import org.openecomp.sdc.be.resources.data.auditing.model.ResourceVersionInfo;
+import org.openecomp.sdc.be.tosca.CsarUtils;
+import org.openecomp.sdc.be.utils.CommonBeUtils;
+import org.openecomp.sdc.be.utils.TypeUtils;
+import org.openecomp.sdc.common.api.ArtifactGroupTypeEnum;
+import org.openecomp.sdc.common.api.ArtifactTypeEnum;
+import org.openecomp.sdc.common.api.Constants;
+import org.openecomp.sdc.common.log.wrappers.Logger;
+import org.openecomp.sdc.common.util.GeneralUtility;
+import org.openecomp.sdc.common.util.ValidationUtils;
+import org.openecomp.sdc.exception.ResponseFormat;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.yaml.snakeyaml.DumperOptions;
+import org.yaml.snakeyaml.Yaml;
+
+import java.util.*;
+import java.util.function.Function;
+
+import static java.util.stream.Collectors.*;
+import static org.apache.commons.collections.CollectionUtils.isNotEmpty;
+
+@Getter
+@Setter
+@org.springframework.stereotype.Component
+public class ServiceImportParseLogic {
+
+    private static final String INITIAL_VERSION = "0.1";
+    private static final String CREATE_RESOURCE = "Create Resource";
+    private static final String IN_RESOURCE = "  in resource {} ";
+    private static final String COMPONENT_INSTANCE_WITH_NAME = "component instance with name ";
+    private static final String COMPONENT_INSTANCE_WITH_NAME_IN_RESOURCE = "component instance with name {}  in resource {} ";
+    private static final String CERTIFICATION_ON_IMPORT = "certification on import";
+    private static final String VALIDATE_DERIVED_BEFORE_UPDATE = "validate derived before update";
+    private static final String PLACE_HOLDER_RESOURCE_TYPES = "validForResourceTypes";
+    private static final String CREATE_RESOURCE_VALIDATE_CAPABILITY_TYPES = "Create Resource - validateCapabilityTypesCreate";
+    private static final String CATEGORY_IS_EMPTY = "Resource category is empty";
+
+
+    @Autowired
+    private ServiceBusinessLogic serviceBusinessLogic;
+    public ServiceBusinessLogic getServiceBusinessLogic() {
+        return serviceBusinessLogic;
+    }
+
+    public void setServiceBusinessLogic(
+            ServiceBusinessLogic serviceBusinessLogic) {
+        this.serviceBusinessLogic = serviceBusinessLogic;
+    }
+
+    @Autowired
+    protected ComponentsUtils componentsUtils;
+    @Autowired
+    protected ToscaOperationFacade toscaOperationFacade;
+    @Autowired
+    private LifecycleBusinessLogic lifecycleBusinessLogic;
+    @Autowired
+    private InputsBusinessLogic inputsBusinessLogic;
+    @Autowired
+    private ResourceImportManager resourceImportManager;
+    @Autowired
+    private IInterfaceLifecycleOperation interfaceTypeOperation = null;
+    private static final Logger log = Logger.getLogger(ServiceImportParseLogic.class);
+
+    @Autowired
+    private ICapabilityTypeOperation capabilityTypeOperation = null;
+
+    public ICapabilityTypeOperation getCapabilityTypeOperation() {
+        return capabilityTypeOperation;
+    }
+
+    public void setCapabilityTypeOperation(ICapabilityTypeOperation capabilityTypeOperation) {
+        this.capabilityTypeOperation = capabilityTypeOperation;
+    }
+
+    public Either<Map<String, EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<ArtifactDefinition>>>, ResponseFormat> findNodeTypesArtifactsToHandle(
+            Map<String, NodeTypeInfo> nodeTypesInfo, CsarInfo csarInfo, Service oldResource) {
+
+        Map<String, EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<ArtifactDefinition>>> nodeTypesArtifactsToHandle = new HashMap<>();
+        Either<Map<String, EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<ArtifactDefinition>>>, ResponseFormat> nodeTypesArtifactsToHandleRes
+                = Either.left(nodeTypesArtifactsToHandle);
+
+        try {
+            Map<String, List<ArtifactDefinition>> extractedVfcsArtifacts = CsarUtils.extractVfcsArtifactsFromCsar(csarInfo.getCsar());
+            Map<String, ImmutablePair<String, String>> extractedVfcToscaNames =
+                    extractVfcToscaNames(nodeTypesInfo, oldResource.getName(), csarInfo);
+            log.debug("Going to fetch node types for resource with name {} during import csar with UUID {}. ",
+                    oldResource.getName(), csarInfo.getCsarUUID());
+            extractedVfcToscaNames.forEach((namespace, vfcToscaNames) -> findAddNodeTypeArtifactsToHandle(csarInfo, nodeTypesArtifactsToHandle, oldResource,
+                    extractedVfcsArtifacts,
+                    namespace, vfcToscaNames));
+        } catch (Exception e) {
+            ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR);
+            nodeTypesArtifactsToHandleRes = Either.right(responseFormat);
+            log.debug("Exception occured when findNodeTypesUpdatedArtifacts, error is:{}", e.getMessage(), e);
+        }
+        return nodeTypesArtifactsToHandleRes;
+    }
+
+    private Map<String, ImmutablePair<String, String>> extractVfcToscaNames(Map<String, NodeTypeInfo> nodeTypesInfo,
+                                                                            String vfResourceName, CsarInfo csarInfo) {
+        Map<String, ImmutablePair<String, String>> vfcToscaNames = new HashMap<>();
+
+        Map<String, Object> nodes = extractAllNodes(nodeTypesInfo, csarInfo);
+        if (!nodes.isEmpty()) {
+            Iterator<Map.Entry<String, Object>> nodesNameEntry = nodes.entrySet().iterator();
+            while (nodesNameEntry.hasNext()) {
+                Map.Entry<String, Object> nodeType = nodesNameEntry.next();
+                ImmutablePair<String, String> toscaResourceName = buildNestedToscaResourceName(
+                        ResourceTypeEnum.VFC.name(), vfResourceName, nodeType.getKey());
+                vfcToscaNames.put(nodeType.getKey(), toscaResourceName);
+            }
+        }
+        for (NodeTypeInfo cvfc : nodeTypesInfo.values()) {
+            vfcToscaNames.put(cvfc.getType(),
+                    buildNestedToscaResourceName(ResourceTypeEnum.VF.name(), vfResourceName, cvfc.getType()));
+        }
+        return vfcToscaNames;
+    }
+
+    public String buildNodeTypeYaml(Map.Entry<String, Object> nodeNameValue, Map<String, Object> mapToConvert,
+                                     String nodeResourceType, CsarInfo csarInfo) {
+        // We need to create a Yaml from each node_types in order to create
+        // resource from each node type using import normative flow.
+        DumperOptions options = new DumperOptions();
+        options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
+        Yaml yaml = new Yaml(options);
+
+        Map<String, Object> node = new HashMap<>();
+        node.put(buildNestedToscaResourceName(nodeResourceType, csarInfo.getVfResourceName(), nodeNameValue.getKey())
+                .getLeft(), nodeNameValue.getValue());
+        mapToConvert.put(TypeUtils.ToscaTagNamesEnum.NODE_TYPES.getElementName(), node);
+
+        return yaml.dumpAsMap(mapToConvert);
+    }
+
+    ImmutablePair<String, String> buildNestedToscaResourceName(String nodeResourceType, String vfResourceName,
+                                                               String nodeTypeFullName) {
+        String actualType;
+        String actualVfName;
+        if (ResourceTypeEnum.CVFC.name().equals(nodeResourceType)) {
+            actualVfName = vfResourceName + ResourceTypeEnum.CVFC.name();
+            actualType = ResourceTypeEnum.VFC.name();
+        } else {
+            actualVfName = vfResourceName;
+            actualType = nodeResourceType;
+        }
+        String nameWithouNamespacePrefix;
+        try {
+            StringBuilder toscaResourceName = new StringBuilder(Constants.USER_DEFINED_RESOURCE_NAMESPACE_PREFIX);
+            if (!nodeTypeFullName.contains(Constants.USER_DEFINED_RESOURCE_NAMESPACE_PREFIX)){
+                nameWithouNamespacePrefix = nodeTypeFullName;
+            } else {
+                nameWithouNamespacePrefix = nodeTypeFullName
+                        .substring(Constants.USER_DEFINED_RESOURCE_NAMESPACE_PREFIX.length());
+            }
+            String[] findTypes = nameWithouNamespacePrefix.split("\\.");
+            String resourceType = findTypes[0];
+            String actualName = nameWithouNamespacePrefix.substring(resourceType.length());
+
+            if (actualName.startsWith(Constants.ABSTRACT)) {
+                toscaResourceName.append(resourceType.toLowerCase()).append('.')
+                        .append(ValidationUtils.convertToSystemName(actualVfName));
+            } else {
+                toscaResourceName.append(actualType.toLowerCase()).append('.').append(ValidationUtils.convertToSystemName(actualVfName));
+                //toscaResourceName.append(actualType.toLowerCase());
+            }
+            StringBuilder previousToscaResourceName = new StringBuilder(toscaResourceName);
+            return new ImmutablePair<>(toscaResourceName.append(actualName.toLowerCase()).toString(),
+                    previousToscaResourceName
+                            .append(actualName.substring(actualName.split("\\.")[1].length() + 1).toLowerCase())
+                            .toString());
+        } catch (Exception e) {
+            ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.INVALID_TOSCA_TEMPLATE);
+            log.debug("Exception occured when buildNestedToscaResourceName, error is:{}", e.getMessage(), e);
+            throw new ComponentException(ActionStatus.INVALID_TOSCA_TEMPLATE, vfResourceName);
+        }
+    }
+
+    private Map<String, Object> extractAllNodes(Map<String, NodeTypeInfo> nodeTypesInfo, CsarInfo csarInfo) {
+        Map<String, Object> nodes = new HashMap<>();
+        for (NodeTypeInfo nodeTypeInfo : nodeTypesInfo.values()) {
+            extractNodeTypes(nodes, nodeTypeInfo.getMappedToscaTemplate());
+        }
+        extractNodeTypes(nodes, csarInfo.getMappedToscaMainTemplate());
+        return nodes;
+    }
+
+    private void extractNodeTypes(Map<String, Object> nodes, Map<String, Object> mappedToscaTemplate) {
+        Either<Map<String, Object>, ImportUtils.ResultStatusEnum> eitherNodeTypes = ImportUtils
+                .findFirstToscaMapElement(mappedToscaTemplate, TypeUtils.ToscaTagNamesEnum.NODE_TYPES);
+        if (eitherNodeTypes.isLeft()) {
+            nodes.putAll(eitherNodeTypes.left().value());
+        }
+    }
+
+    protected void findAddNodeTypeArtifactsToHandle(CsarInfo csarInfo, Map<String, EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<ArtifactDefinition>>> nodeTypesArtifactsToHandle,
+                                                  Service resource, Map<String, List<ArtifactDefinition>> extractedVfcsArtifacts, String namespace, ImmutablePair<String, String> vfcToscaNames){
+
+        EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<ArtifactDefinition>> curNodeTypeArtifactsToHandle = null;
+        log.debug("Going to fetch node type with tosca name {}. ", vfcToscaNames.getLeft());
+        Resource curNodeType = findVfcResource(csarInfo, resource, vfcToscaNames.getLeft(), vfcToscaNames.getRight(), null);
+        if (!MapUtils.isEmpty(extractedVfcsArtifacts)) {
+            List<ArtifactDefinition> currArtifacts = new ArrayList<>();
+            if (extractedVfcsArtifacts.containsKey(namespace)) {
+                handleAndAddExtractedVfcsArtifacts(currArtifacts, extractedVfcsArtifacts.get(namespace));
+            }
+            curNodeTypeArtifactsToHandle = findNodeTypeArtifactsToHandle(curNodeType, currArtifacts);
+        } else if (curNodeType != null) {
+            // delete all artifacts if have not received artifacts from
+            // csar
+            try {
+                curNodeTypeArtifactsToHandle = new EnumMap<>(ArtifactsBusinessLogic.ArtifactOperationEnum.class);
+                List<ArtifactDefinition> artifactsToDelete = new ArrayList<>();
+                // delete all informational artifacts
+                artifactsToDelete.addAll(curNodeType.getArtifacts().values().stream()
+                    .filter(a -> a.getArtifactGroupType() == ArtifactGroupTypeEnum.INFORMATIONAL)
+                    .collect(toList()));
+                // delete all deployment artifacts
+                artifactsToDelete.addAll(curNodeType.getDeploymentArtifacts().values());
+                if (!artifactsToDelete.isEmpty()) {
+                    curNodeTypeArtifactsToHandle
+                        .put(ArtifactsBusinessLogic.ArtifactOperationEnum.DELETE, artifactsToDelete);
+                }
+            } catch (Exception e) {
+                ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.INVALID_TOSCA_TEMPLATE);
+                log.debug("Exception occured when findAddNodeTypeArtifactsToHandle, error is:{}", e.getMessage(), e);
+                throw new ComponentException(ActionStatus.INVALID_TOSCA_TEMPLATE, vfcToscaNames.getLeft());
+            }
+        }
+        if (MapUtils.isNotEmpty(curNodeTypeArtifactsToHandle)) {
+            nodeTypesArtifactsToHandle.put(namespace, curNodeTypeArtifactsToHandle);
+        }
+    }
+
+    protected void handleAndAddExtractedVfcsArtifacts(List<ArtifactDefinition> vfcArtifacts,
+                                                    List<ArtifactDefinition> artifactsToAdd) {
+        List<String> vfcArtifactNames = vfcArtifacts.stream().map(ArtifactDataDefinition::getArtifactName)
+                .collect(toList());
+        artifactsToAdd.stream().forEach(a -> {
+            if (!vfcArtifactNames.contains(a.getArtifactName())) {
+                vfcArtifacts.add(a);
+            } else {
+                log.debug("Can't upload two artifact with the same name {}. ", a.getArtifactName());
+            }
+        });
+    }
+
+    protected Resource findVfcResource(CsarInfo csarInfo, Service resource, String currVfcToscaName, String previousVfcToscaName, StorageOperationStatus status) {
+        if (status != null && status != StorageOperationStatus.NOT_FOUND) {
+            log.debug("Error occured during fetching node type with tosca name {}, error: {}", currVfcToscaName, status);
+            throw new ComponentException(componentsUtils.convertFromStorageResponse(status), csarInfo.getCsarUUID());
+        } else if (org.apache.commons.lang.StringUtils.isNotEmpty(currVfcToscaName)) {
+            return (Resource)toscaOperationFacade.getLatestByToscaResourceName(currVfcToscaName)
+                    .left()
+                    .on(st -> findVfcResource(csarInfo, resource, previousVfcToscaName, null, st));
+        }
+        return null;
+    }
+
+    protected EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<ArtifactDefinition>> findNodeTypeArtifactsToHandle(
+            Resource curNodeType, List<ArtifactDefinition> extractedArtifacts) {
+
+        EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<ArtifactDefinition>> nodeTypeArtifactsToHandle = null;
+        try {
+            List<ArtifactDefinition> artifactsToUpload = new ArrayList<>(extractedArtifacts);
+            List<ArtifactDefinition> artifactsToUpdate = new ArrayList<>();
+            List<ArtifactDefinition> artifactsToDelete = new ArrayList<>();
+            processExistingNodeTypeArtifacts(extractedArtifacts, artifactsToUpload, artifactsToUpdate, artifactsToDelete,
+                    collectExistingArtifacts(curNodeType));
+            nodeTypeArtifactsToHandle = putFoundArtifacts(artifactsToUpload, artifactsToUpdate, artifactsToDelete);
+        } catch (Exception e) {
+            log.debug("Exception occured when findNodeTypeArtifactsToHandle, error is:{}", e.getMessage(), e);
+            throw new ComponentException(ActionStatus.GENERAL_ERROR);
+        }
+        return nodeTypeArtifactsToHandle;
+    }
+
+    protected Map<String, ArtifactDefinition> collectExistingArtifacts(Resource curNodeType) {
+        Map<String, ArtifactDefinition> existingArtifacts = new HashMap<>();
+        if (curNodeType == null) {
+            return existingArtifacts;
+        }
+        if (MapUtils.isNotEmpty(curNodeType.getDeploymentArtifacts())) {
+            existingArtifacts.putAll(curNodeType.getDeploymentArtifacts());
+        }
+        if (MapUtils.isNotEmpty(curNodeType.getArtifacts())) {
+            existingArtifacts
+                    .putAll(curNodeType.getArtifacts().entrySet()
+                            .stream()
+                            .filter(e -> e.getValue().getArtifactGroupType() == ArtifactGroupTypeEnum.INFORMATIONAL)
+                            .collect(toMap(Map.Entry::getKey, Map.Entry::getValue)));
+        }
+        return existingArtifacts;
+    }
+
+    protected EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<ArtifactDefinition>> putFoundArtifacts(List<ArtifactDefinition> artifactsToUpload, List<ArtifactDefinition> artifactsToUpdate, List<ArtifactDefinition> artifactsToDelete) {
+        EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<ArtifactDefinition>> nodeTypeArtifactsToHandle = null;
+        if (!artifactsToUpload.isEmpty() || !artifactsToUpdate.isEmpty() || !artifactsToDelete.isEmpty()) {
+            nodeTypeArtifactsToHandle = new EnumMap<>(ArtifactsBusinessLogic.ArtifactOperationEnum.class);
+            if (!artifactsToUpload.isEmpty()) {
+                nodeTypeArtifactsToHandle.put(ArtifactsBusinessLogic.ArtifactOperationEnum.CREATE, artifactsToUpload);
+            }
+            if (!artifactsToUpdate.isEmpty()) {
+                nodeTypeArtifactsToHandle.put(ArtifactsBusinessLogic.ArtifactOperationEnum.UPDATE, artifactsToUpdate);
+            }
+            if (!artifactsToDelete.isEmpty()) {
+                nodeTypeArtifactsToHandle.put(ArtifactsBusinessLogic.ArtifactOperationEnum.DELETE, artifactsToDelete);
+            }
+        }
+        return nodeTypeArtifactsToHandle;
+    }
+
+    protected void processExistingNodeTypeArtifacts(List<ArtifactDefinition> extractedArtifacts, List<ArtifactDefinition> artifactsToUpload,
+        List<ArtifactDefinition> artifactsToUpdate, List<ArtifactDefinition> artifactsToDelete,
+        Map<String, ArtifactDefinition> existingArtifacts) {
+        try {
+            if (!existingArtifacts.isEmpty()) {
+                extractedArtifacts.stream()
+                    .forEach(a -> processNodeTypeArtifact(artifactsToUpload, artifactsToUpdate, existingArtifacts, a));
+                artifactsToDelete.addAll(existingArtifacts.values());
+            }
+        } catch (Exception e) {
+            log.debug("Exception occured when processExistingNodeTypeArtifacts, error is:{}", e.getMessage(), e);
+            throw new ComponentException(ActionStatus.GENERAL_ERROR);
+        }
+
+    }
+
+    protected void processNodeTypeArtifact(List<ArtifactDefinition> artifactsToUpload, List<ArtifactDefinition> artifactsToUpdate, Map<String, ArtifactDefinition> existingArtifacts, ArtifactDefinition currNewArtifact) {
+        Optional<ArtifactDefinition> foundArtifact = existingArtifacts.values()
+                .stream()
+                .filter(a -> a.getArtifactName().equals(currNewArtifact.getArtifactName()))
+                .findFirst();
+        if (foundArtifact.isPresent()) {
+            if (foundArtifact.get().getArtifactType().equals(currNewArtifact.getArtifactType())) {
+                updateFoundArtifact(artifactsToUpdate, currNewArtifact, foundArtifact.get());
+                existingArtifacts.remove(foundArtifact.get().getArtifactLabel());
+                artifactsToUpload.remove(currNewArtifact);
+            } else {
+                log.debug("Can't upload two artifact with the same name {}.", currNewArtifact.getArtifactName());
+                throw new ComponentException(ActionStatus.ARTIFACT_ALREADY_EXIST_IN_DIFFERENT_TYPE_IN_CSAR,
+                        currNewArtifact.getArtifactName(), currNewArtifact.getArtifactType(),
+                        foundArtifact.get().getArtifactType());
+            }
+        }
+    }
+
+    protected void updateFoundArtifact(List<ArtifactDefinition> artifactsToUpdate, ArtifactDefinition currNewArtifact, ArtifactDefinition foundArtifact) {
+        if (!foundArtifact.getArtifactChecksum().equals(currNewArtifact.getArtifactChecksum())) {
+            foundArtifact.setPayload(currNewArtifact.getPayloadData());
+            foundArtifact.setPayloadData(
+                    Base64.encodeBase64String(currNewArtifact.getPayloadData()));
+            foundArtifact.setArtifactChecksum(GeneralUtility
+                    .calculateMD5Base64EncodedByByteArray(currNewArtifact.getPayloadData()));
+            artifactsToUpdate.add(foundArtifact);
+        }
+    }
+
+    public void addNonMetaCreatedArtifactsToSupportRollback(ArtifactOperationInfo operation,
+                                                             List<ArtifactDefinition> createdArtifacts,
+                                                             Either<Either<ArtifactDefinition, Operation>, ResponseFormat> eitherNonMetaArtifacts) {
+        if (ArtifactsBusinessLogic.ArtifactOperationEnum.isCreateOrLink(operation.getArtifactOperationEnum()) && createdArtifacts != null
+                && eitherNonMetaArtifacts.isLeft()) {
+            Either<ArtifactDefinition, Operation> eitherResult = eitherNonMetaArtifacts.left().value();
+            if (eitherResult.isLeft()) {
+                createdArtifacts.add(eitherResult.left().value());
+            }
+        }
+    }
+
+    public boolean isArtifactDeletionRequired(String artifactId, byte[] artifactFileBytes, boolean isFromCsar) {
+        return !org.apache.commons.lang.StringUtils.isEmpty(artifactId) && artifactFileBytes == null && isFromCsar;
+    }
+
+    public void fillGroupsFinalFields(List<GroupDefinition> groupsAsList) {
+        groupsAsList.forEach(groupDefinition -> {
+            groupDefinition.setInvariantName(groupDefinition.getName());
+            groupDefinition.setCreatedFrom(CreatedFrom.CSAR);
+        });
+    }
+
+    public String getComponentTypeForResponse(Component component) {
+        String componentTypeForResponse = "SERVICE";
+        if (component instanceof Resource) {
+            componentTypeForResponse = ((Resource) component).getResourceType().name();
+        }
+        return componentTypeForResponse;
+    }
+
+    protected boolean isfillGroupMemebersRecursivlyStopCondition(String groupName, Map<String, GroupDefinition> allGroups,
+                                                               Set<String> allGroupMembers) {
+
+        boolean stop = false;
+        // In Case Not Group Stop
+        if (!allGroups.containsKey(groupName)) {
+            stop = true;
+        }
+        // In Case Group Has no members stop
+        if (!stop) {
+            GroupDefinition groupDefinition = allGroups.get(groupName);
+            stop = MapUtils.isEmpty(groupDefinition.getMembers());
+
+        }
+        // In Case all group members already contained stop
+        if (!stop) {
+            final Set<String> allMembers = allGroups.get(groupName).getMembers().keySet();
+            Set<String> membersOfTypeGroup = allMembers.stream().
+                    // Filter In Only Group members
+                            filter(allGroups::containsKey).
+                    // Collect
+                            collect(toSet());
+            stop = allGroupMembers.containsAll(membersOfTypeGroup);
+        }
+        return stop;
+    }
+
+    public Resource buildValidComplexVfc(Resource resource, CsarInfo csarInfo, String nodeName,
+                                          Map<String, NodeTypeInfo> nodesInfo) {
+
+        Resource complexVfc = buildComplexVfcMetadata(resource, csarInfo, nodeName, nodesInfo);
+        log.debug("************* Going to validate complex VFC from yaml {}", complexVfc.getName());
+        csarInfo.addNodeToQueue(nodeName);
+        return validateResourceBeforeCreate(complexVfc, csarInfo.getModifier(),
+                AuditingActionEnum.IMPORT_RESOURCE, true, csarInfo);
+    }
+
+    public Resource validateResourceBeforeCreate(Resource resource, User user, AuditingActionEnum actionEnum, boolean inTransaction, CsarInfo csarInfo) {
+
+        validateResourceFieldsBeforeCreate(user, resource, actionEnum, inTransaction);
+        validateCapabilityTypesCreate(user, getCapabilityTypeOperation(), resource, actionEnum, inTransaction);
+        validateLifecycleTypesCreate(user, resource, actionEnum);
+        validateResourceType(user, resource, actionEnum);
+        resource.setCreatorUserId(user.getUserId());
+        resource.setCreatorFullName(user.getFirstName() + " " + user.getLastName());
+        resource.setContactId(resource.getContactId().toLowerCase());
+        if (org.apache.commons.lang.StringUtils.isEmpty(resource.getToscaResourceName()) && !ModelConverter.isAtomicComponent(resource)) {
+            String resourceSystemName;
+            if (csarInfo != null && org.apache.commons.lang.StringUtils.isNotEmpty(csarInfo.getVfResourceName())) {
+                resourceSystemName = ValidationUtils.convertToSystemName(csarInfo.getVfResourceName());
+            } else {
+                resourceSystemName = resource.getSystemName();
+            }
+            resource.setToscaResourceName(CommonBeUtils
+                    .generateToscaResourceName(resource.getResourceType().name().toLowerCase(), resourceSystemName));
+        }
+
+        // Generate invariant UUID - must be here and not in operation since it
+        // should stay constant during clone
+        // TODO
+        String invariantUUID = UniqueIdBuilder.buildInvariantUUID();
+        resource.setInvariantUUID(invariantUUID);
+
+        return resource;
+    }
+
+    protected Either<Boolean, ResponseFormat> validateResourceType(User user, Resource resource,
+                                                                 AuditingActionEnum actionEnum) {
+        Either<Boolean, ResponseFormat> eitherResult = Either.left(true);
+        if (resource.getResourceType() == null) {
+            log.debug("Invalid resource type for resource");
+            ResponseFormat errorResponse = componentsUtils.getResponseFormat(ActionStatus.INVALID_CONTENT);
+            eitherResult = Either.right(errorResponse);
+            componentsUtils.auditResource(errorResponse, user, resource, actionEnum);
+        }
+        return eitherResult;
+    }
+
+    protected Either<Boolean, ResponseFormat> validateLifecycleTypesCreate(User user, Resource resource,
+                                                                         AuditingActionEnum actionEnum) {
+        Either<Boolean, ResponseFormat> eitherResult = Either.left(true);
+        if (resource.getInterfaces() != null && resource.getInterfaces().size() > 0) {
+            log.debug("validate interface lifecycle Types Exist");
+            Iterator<InterfaceDefinition> intItr = resource.getInterfaces().values().iterator();
+            while (intItr.hasNext() && eitherResult.isLeft()) {
+                InterfaceDefinition interfaceDefinition = intItr.next();
+                String intType = interfaceDefinition.getUniqueId();
+                Either<InterfaceDefinition, StorageOperationStatus> eitherCapTypeFound = interfaceTypeOperation
+                        .getInterface(intType);
+                if (eitherCapTypeFound.isRight()) {
+                    if (eitherCapTypeFound.right().value() == StorageOperationStatus.NOT_FOUND) {
+                        BeEcompErrorManager.getInstance().logBeGraphObjectMissingError(
+                                "Create Resource - validateLifecycleTypesCreate", "Interface", intType);
+                        log.debug("Lifecycle Type: {} is required by resource: {} but does not exist in the DB",
+                                intType, resource.getName());
+                        BeEcompErrorManager.getInstance()
+                                .logBeDaoSystemError("Create Resource - validateLifecycleTypesCreate");
+                        log.debug("request to data model failed with error: {}",
+                                eitherCapTypeFound.right().value().name());
+                    }
+                    ResponseFormat errorResponse = componentsUtils
+                            .getResponseFormat(ActionStatus.MISSING_LIFECYCLE_TYPE, intType);
+                    eitherResult = Either.right(errorResponse);
+                    componentsUtils.auditResource(errorResponse, user, resource, actionEnum);
+                }
+            }
+        }
+        return eitherResult;
+    }
+
+    public Either<Boolean, ResponseFormat> validateCapabilityTypesCreate(User user,
+                                                                          ICapabilityTypeOperation capabilityTypeOperation, Resource resource, AuditingActionEnum actionEnum,
+                                                                          boolean inTransaction) {
+
+        Either<Boolean, ResponseFormat> eitherResult = Either.left(true);
+        if (resource.getCapabilities() != null && resource.getCapabilities().size() > 0) {
+            log.debug("validate capability Types Exist - capabilities section");
+
+            for (Map.Entry<String, List<CapabilityDefinition>> typeEntry : resource.getCapabilities().entrySet()) {
+
+                eitherResult = validateCapabilityTypeExists(user, capabilityTypeOperation, resource, actionEnum,
+                        eitherResult, typeEntry, inTransaction);
+                if (eitherResult.isRight()) {
+                    return Either.right(eitherResult.right().value());
+                }
+            }
+        }
+        if (resource.getRequirements() != null && resource.getRequirements().size() > 0) {
+            log.debug("validate capability Types Exist - requirements section");
+            for (String type : resource.getRequirements().keySet()) {
+                eitherResult = validateCapabilityTypeExists(user, capabilityTypeOperation, resource,
+                        resource.getRequirements().get(type), actionEnum, eitherResult, type, inTransaction);
+                if (eitherResult.isRight()) {
+                    return Either.right(eitherResult.right().value());
+                }
+            }
+        }
+        return eitherResult;
+    }
+
+    protected Either<Boolean, ResponseFormat> validateCapabilityTypeExists(User user,
+                                                                         ICapabilityTypeOperation capabilityTypeOperation, Resource resource, AuditingActionEnum actionEnum,
+                                                                         Either<Boolean, ResponseFormat> eitherResult, Map.Entry<String, List<CapabilityDefinition>> typeEntry,
+                                                                         boolean inTransaction) {
+        Either<CapabilityTypeDefinition, StorageOperationStatus> eitherCapTypeFound = capabilityTypeOperation
+                .getCapabilityType(typeEntry.getKey(), inTransaction);
+        if (eitherCapTypeFound.isRight()) {
+            if (eitherCapTypeFound.right().value() == StorageOperationStatus.NOT_FOUND) {
+                BeEcompErrorManager.getInstance().logBeGraphObjectMissingError(
+                        CREATE_RESOURCE_VALIDATE_CAPABILITY_TYPES, "Capability Type", typeEntry.getKey());
+                log.debug("Capability Type: {} is required by resource: {} but does not exist in the DB",
+                        typeEntry.getKey(), resource.getName());
+                BeEcompErrorManager.getInstance()
+                        .logBeDaoSystemError(CREATE_RESOURCE_VALIDATE_CAPABILITY_TYPES);
+            }
+            log.debug("Trying to get capability type {} failed with error: {}", typeEntry.getKey(),
+                    eitherCapTypeFound.right().value().name());
+            ResponseFormat errorResponse = componentsUtils.getResponseFormat(ActionStatus.MISSING_CAPABILITY_TYPE,
+                    typeEntry.getKey());
+            eitherResult = Either.right(errorResponse);
+            componentsUtils.auditResource(errorResponse, user, resource, actionEnum);
+            return Either.right(eitherResult.right().value());
+        }
+        CapabilityTypeDefinition capabilityTypeDefinition = eitherCapTypeFound.left().value();
+        if (capabilityTypeDefinition.getProperties() != null) {
+            for (CapabilityDefinition capDef : typeEntry.getValue()) {
+                List<ComponentInstanceProperty> properties = capDef.getProperties();
+                if (properties == null || properties.isEmpty()) {
+                    properties = new ArrayList<>();
+                    for (Map.Entry<String, PropertyDefinition> prop : capabilityTypeDefinition.getProperties().entrySet()) {
+                        ComponentInstanceProperty newProp = new ComponentInstanceProperty(prop.getValue());
+                        properties.add(newProp);
+                    }
+                } else {
+                    for (Map.Entry<String, PropertyDefinition> prop : capabilityTypeDefinition.getProperties().entrySet()) {
+                        PropertyDefinition porpFromDef = prop.getValue();
+                        List<ComponentInstanceProperty> propsToAdd = new ArrayList<>();
+                        for (ComponentInstanceProperty cip : properties) {
+                            if (!cip.getName().equals(porpFromDef.getName())) {
+                                ComponentInstanceProperty newProp = new ComponentInstanceProperty(porpFromDef);
+                                propsToAdd.add(newProp);
+                            }
+                        }
+                        if (!propsToAdd.isEmpty()) {
+                            properties.addAll(propsToAdd);
+                        }
+                    }
+                }
+                capDef.setProperties(properties);
+            }
+        }
+        return eitherResult;
+    }
+
+    protected Either<Boolean, ResponseFormat> validateCapabilityTypeExists(User user,
+                                                                         ICapabilityTypeOperation capabilityTypeOperation, Resource resource, List<?> validationObjects,
+                                                                         AuditingActionEnum actionEnum, Either<Boolean, ResponseFormat> eitherResult, String type,
+                                                                         boolean inTransaction) {
+        try {
+            Either<CapabilityTypeDefinition, StorageOperationStatus> eitherCapTypeFound = capabilityTypeOperation
+                .getCapabilityType(type, inTransaction);
+            if (eitherCapTypeFound.isRight()) {
+                if (eitherCapTypeFound.right().value() == StorageOperationStatus.NOT_FOUND) {
+                    BeEcompErrorManager.getInstance().logBeGraphObjectMissingError(
+                        CREATE_RESOURCE_VALIDATE_CAPABILITY_TYPES, "Capability Type", type);
+                    log.debug("Capability Type: {} is required by resource: {} but does not exist in the DB", type,
+                        resource.getName());
+                    BeEcompErrorManager.getInstance()
+                        .logBeDaoSystemError(CREATE_RESOURCE_VALIDATE_CAPABILITY_TYPES);
+                }
+                log.debug("Trying to get capability type {} failed with error: {}", type,
+                    eitherCapTypeFound.right().value().name());
+                ResponseFormat errorResponse = null;
+                if (type != null) {
+                    errorResponse = componentsUtils.getResponseFormat(ActionStatus.MISSING_CAPABILITY_TYPE, type);
+                } else {
+                    errorResponse = componentsUtils.getResponseFormatByElement(ActionStatus.MISSING_CAPABILITY_TYPE,
+                        validationObjects);
+                }
+                eitherResult = Either.right(errorResponse);
+                componentsUtils.auditResource(errorResponse, user, resource, actionEnum);
+            }
+
+        } catch (Exception e) {
+            log.debug("Exception occured when validateCapabilityTypeExists, error is:{}", e.getMessage(), e);
+            throw new ComponentException(ActionStatus.INVALID_TOSCA_TEMPLATE, resource.getName());
+        }
+        return eitherResult;
+    }
+
+    protected Either<Boolean, ResponseFormat> validateResourceFieldsBeforeCreate(User user, Resource resource,
+                                                                               AuditingActionEnum actionEnum, boolean inTransaction) {
+        serviceBusinessLogic.validateComponentFieldsBeforeCreate(user, resource, actionEnum);
+        // validate category
+        log.debug("validate category");
+        validateCategory(user, resource, actionEnum, inTransaction);
+        // validate vendor name & release & model number
+        log.debug("validate vendor name");
+        validateVendorName(user, resource, actionEnum);
+        log.debug("validate vendor release");
+        validateVendorReleaseName(user, resource, actionEnum);
+        log.debug("validate resource vendor model number");
+        validateResourceVendorModelNumber(user, resource, actionEnum);
+        // validate cost
+        log.debug("validate cost");
+        validateCost(resource);
+        // validate licenseType
+        log.debug("validate licenseType");
+        validateLicenseType(user, resource, actionEnum);
+        // validate template (derived from)
+        log.debug("validate derived from");
+        if (!ModelConverter.isAtomicComponent(resource) && resource.getResourceType() != ResourceTypeEnum.VF) {
+            resource.setDerivedFrom(null);
+        }
+        validateDerivedFromExist(user, resource, actionEnum);
+        serviceBusinessLogic.checkComponentFieldsForOverrideAttempt(resource);
+        String currentCreatorFullName = resource.getCreatorFullName();
+        if (currentCreatorFullName != null) {
+            log.debug("Resource Creator fullname is automatically set and cannot be updated");
+        }
+
+        String currentLastUpdaterFullName = resource.getLastUpdaterFullName();
+        if (currentLastUpdaterFullName != null) {
+            log.debug("Resource LastUpdater fullname is automatically set and cannot be updated");
+        }
+
+        Long currentLastUpdateDate = resource.getLastUpdateDate();
+        if (currentLastUpdateDate != null) {
+            log.debug("Resource last update date is automatically set and cannot be updated");
+        }
+
+        Boolean currentAbstract = resource.isAbstract();
+        if (currentAbstract != null) {
+            log.debug("Resource abstract is automatically set and cannot be updated");
+        }
+
+        return Either.left(true);
+    }
+
+    protected void validateDerivedFromExist(User user, Resource resource,  AuditingActionEnum actionEnum) {
+        if (resource.getDerivedFrom() == null || resource.getDerivedFrom().isEmpty()) {
+            return;
+        }
+        String templateName = resource.getDerivedFrom().get(0);
+        Either<Boolean, StorageOperationStatus> dataModelResponse = toscaOperationFacade
+                .validateToscaResourceNameExists(templateName);
+        if (dataModelResponse.isRight()) {
+            StorageOperationStatus storageStatus = dataModelResponse.right().value();
+            BeEcompErrorManager.getInstance().logBeDaoSystemError("Create Resource - validateDerivedFromExist");
+            log.debug("request to data model failed with error: {}", storageStatus);
+            ResponseFormat responseFormat = componentsUtils
+                    .getResponseFormatByResource(componentsUtils.convertFromStorageResponse(storageStatus), resource);
+            log.trace("audit before sending response");
+            componentsUtils.auditResource(responseFormat, user, resource, actionEnum);
+            throw new ComponentException(componentsUtils.convertFromStorageResponse(storageStatus));
+        } else if (!dataModelResponse.left().value()) {
+            log.info("resource template with name: {}, does not exists", templateName);
+            ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.PARENT_RESOURCE_NOT_FOUND);
+            componentsUtils.auditResource(responseFormat, user, resource, actionEnum);
+            throw new ComponentException(ActionStatus.PARENT_RESOURCE_NOT_FOUND);
+        }
+    }
+
+    protected void validateLicenseType(User user, Resource resource,
+                                     AuditingActionEnum actionEnum) {
+        log.debug("validate licenseType");
+        String licenseType = resource.getLicenseType();
+        if (licenseType != null) {
+            List<String> licenseTypes = ConfigurationManager.getConfigurationManager().getConfiguration()
+                    .getLicenseTypes();
+            if (!licenseTypes.contains(licenseType)) {
+                log.debug("License type {} isn't configured", licenseType);
+                ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.INVALID_CONTENT);
+                if (actionEnum != null) {
+                    // In update case, no audit is required
+                    componentsUtils.auditResource(responseFormat, user, resource, actionEnum);
+                }
+                throw new ComponentException(ActionStatus.INVALID_CONTENT);
+            }
+        }
+    }
+
+    protected void validateCost(Resource resource) {
+        String cost = resource.getCost();
+        if (cost != null) {
+            if (!ValidationUtils.validateCost(cost)) {
+                log.debug("resource cost is invalid.");
+                throw new ComponentException(ActionStatus.INVALID_CONTENT);
+            }
+        }
+    }
+
+    protected void validateResourceVendorModelNumber(User user, Resource resource, AuditingActionEnum actionEnum) {
+        String resourceVendorModelNumber = resource.getResourceVendorModelNumber();
+        if (org.apache.commons.lang.StringUtils.isNotEmpty(resourceVendorModelNumber)) {
+            if (!ValidationUtils.validateResourceVendorModelNumberLength(resourceVendorModelNumber)) {
+                log.info("resource vendor model number exceeds limit.");
+                ResponseFormat errorResponse = componentsUtils.getResponseFormat(
+                        ActionStatus.RESOURCE_VENDOR_MODEL_NUMBER_EXCEEDS_LIMIT,
+                        "" + ValidationUtils.RESOURCE_VENDOR_MODEL_NUMBER_MAX_LENGTH);
+                componentsUtils.auditResource(errorResponse, user, resource, actionEnum);
+                throw new ComponentException(ActionStatus.RESOURCE_VENDOR_MODEL_NUMBER_EXCEEDS_LIMIT,
+                        "" + ValidationUtils.RESOURCE_VENDOR_MODEL_NUMBER_MAX_LENGTH);
+            }
+            // resource vendor model number is currently validated as vendor
+            // name
+            if (!ValidationUtils.validateVendorName(resourceVendorModelNumber)) {
+                log.info("resource vendor model number  is not valid.");
+                ResponseFormat errorResponse = componentsUtils
+                        .getResponseFormat(ActionStatus.INVALID_RESOURCE_VENDOR_MODEL_NUMBER);
+                componentsUtils.auditResource(errorResponse, user, resource, actionEnum);
+                throw new ComponentException(ActionStatus.INVALID_RESOURCE_VENDOR_MODEL_NUMBER);
+            }
+        }
+    }
+
+    public void validateVendorReleaseName(User user, Resource resource, AuditingActionEnum actionEnum) {
+        String vendorRelease = resource.getVendorRelease();
+        log.debug("validate vendor relese name");
+        if (!ValidationUtils.validateStringNotEmpty(vendorRelease)) {
+            log.info("vendor relese name is missing.");
+            ResponseFormat errorResponse = componentsUtils.getResponseFormat(ActionStatus.MISSING_VENDOR_RELEASE);
+            componentsUtils.auditResource(errorResponse, user, resource, actionEnum);
+            throw new ComponentException(ActionStatus.MISSING_VENDOR_RELEASE);
+        }
+
+        validateVendorReleaseName(vendorRelease, user, resource, actionEnum);
+    }
+
+    public void validateVendorReleaseName(String vendorRelease, User user, Resource resource, AuditingActionEnum actionEnum) {
+        if (vendorRelease != null) {
+            if (!ValidationUtils.validateVendorReleaseLength(vendorRelease)) {
+                log.info("vendor release exceds limit.");
+                ResponseFormat errorResponse = componentsUtils.getResponseFormat(
+                        ActionStatus.VENDOR_RELEASE_EXCEEDS_LIMIT, "" + ValidationUtils.VENDOR_RELEASE_MAX_LENGTH);
+                componentsUtils.auditResource(errorResponse, user, resource, actionEnum);
+                throw new ComponentException(ActionStatus.VENDOR_RELEASE_EXCEEDS_LIMIT, "" + ValidationUtils.VENDOR_RELEASE_MAX_LENGTH);
+            }
+
+            if (!ValidationUtils.validateVendorRelease(vendorRelease)) {
+                log.info("vendor release  is not valid.");
+                ResponseFormat errorResponse = componentsUtils.getResponseFormat(ActionStatus.INVALID_VENDOR_RELEASE);
+                componentsUtils.auditResource(errorResponse, user, resource, actionEnum);
+                throw new ComponentException(ActionStatus.INVALID_VENDOR_RELEASE);
+            }
+        }
+    }
+
+    protected void validateCategory(User user, Resource resource,
+                                  AuditingActionEnum actionEnum, boolean inTransaction) {
+
+        List<CategoryDefinition> categories = resource.getCategories();
+        if (CollectionUtils.isEmpty(categories)) {
+            log.debug(CATEGORY_IS_EMPTY);
+            ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.COMPONENT_MISSING_CATEGORY,
+                    ComponentTypeEnum.RESOURCE.getValue());
+            componentsUtils.auditResource(responseFormat, user, resource, actionEnum);
+            throw new ComponentException(ActionStatus.COMPONENT_MISSING_CATEGORY,
+                    ComponentTypeEnum.RESOURCE.getValue());
+        }
+        if (categories.size() > 1) {
+            log.debug("Must be only one category for resource");
+            throw new ComponentException(ActionStatus.COMPONENT_TOO_MUCH_CATEGORIES, ComponentTypeEnum.RESOURCE.getValue());
+        }
+        CategoryDefinition category = categories.get(0);
+        List<SubCategoryDefinition> subcategories = category.getSubcategories();
+        if (CollectionUtils.isEmpty(subcategories)) {
+            log.debug("Missinig subcategory for resource");
+            throw new ComponentException(ActionStatus.COMPONENT_MISSING_SUBCATEGORY);
+        }
+        if (subcategories.size() > 1) {
+            log.debug("Must be only one sub category for resource");
+            throw new ComponentException(ActionStatus.RESOURCE_TOO_MUCH_SUBCATEGORIES);
+        }
+
+        SubCategoryDefinition subcategory = subcategories.get(0);
+
+        if (!ValidationUtils.validateStringNotEmpty(category.getName())) {
+            log.debug(CATEGORY_IS_EMPTY);
+            ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.COMPONENT_MISSING_CATEGORY,
+                    ComponentTypeEnum.RESOURCE.getValue());
+            componentsUtils.auditResource(responseFormat, user, resource, actionEnum);
+            throw new ComponentException(ActionStatus.COMPONENT_MISSING_CATEGORY,
+                    ComponentTypeEnum.RESOURCE.getValue());
+        }
+        if (!ValidationUtils.validateStringNotEmpty(subcategory.getName())) {
+            log.debug(CATEGORY_IS_EMPTY);
+            ResponseFormat responseFormat = componentsUtils.getResponseFormat(
+                    ActionStatus.COMPONENT_MISSING_SUBCATEGORY, ComponentTypeEnum.RESOURCE.getValue());
+            componentsUtils.auditResource(responseFormat, user, resource, actionEnum);
+            throw new ComponentException(ActionStatus.COMPONENT_MISSING_SUBCATEGORY, ComponentTypeEnum.RESOURCE.getValue());
+        }
+
+        validateCategoryListed(category, subcategory, user, resource, actionEnum, inTransaction);
+    }
+
+    protected void validateCategoryListed(CategoryDefinition category, SubCategoryDefinition subcategory,
+                                        User user, Resource resource, AuditingActionEnum actionEnum, boolean inTransaction) {
+        ResponseFormat responseFormat;
+        if (category != null && subcategory != null) {
+            try {
+                log.debug("validating resource category {} against valid categories list", category);
+                Either<List<CategoryDefinition>, ActionStatus> categories = serviceBusinessLogic.elementDao
+                    .getAllCategories(NodeTypeEnum.ResourceNewCategory, inTransaction);
+                if (categories.isRight()) {
+                    log.debug("failed to retrieve resource categories from Titan");
+                    responseFormat = componentsUtils.getResponseFormat(categories.right().value());
+                    componentsUtils.auditResource(responseFormat, user, resource, actionEnum);
+                    throw new ComponentException(categories.right().value());
+                }
+                List<CategoryDefinition> categoryList = categories.left().value();
+                Optional<CategoryDefinition> foundCategory = categoryList.stream()
+                    .filter(cat -> cat.getName().equals(category.getName()))
+                    .findFirst();
+                if (!foundCategory.isPresent()) {
+                    log.debug(
+                        "Category {} is not part of resource category group. Resource category valid values are {}",
+                        category, categoryList);
+                    failOnInvalidCategory(user, resource, actionEnum);
+                }
+                Optional<SubCategoryDefinition> foundSubcategory = foundCategory.get()
+                    .getSubcategories()
+                    .stream()
+                    .filter(subcat -> subcat.getName().equals(subcategory.getName()))
+                    .findFirst();
+                if (!foundSubcategory.isPresent()) {
+                    log.debug(
+                        "SubCategory {} is not part of resource category group. Resource subcategory valid values are {}",
+                        subcategory, foundCategory.get().getSubcategories());
+                    failOnInvalidCategory(user, resource, actionEnum);
+                }
+            }catch(Exception e){
+                log.debug("Exception occured when validateCategoryListed, error is:{}", e.getMessage(), e);
+                throw new ComponentException(ActionStatus.GENERAL_ERROR);
+            }
+        }
+    }
+
+    protected void failOnInvalidCategory(User user, Resource resource, AuditingActionEnum actionEnum) {
+        ResponseFormat responseFormat;
+        responseFormat = componentsUtils.getResponseFormat(ActionStatus.COMPONENT_INVALID_CATEGORY,
+                ComponentTypeEnum.RESOURCE.getValue());
+        componentsUtils.auditResource(responseFormat, user, resource, actionEnum);
+        throw new ComponentException(ActionStatus.COMPONENT_INVALID_CATEGORY,
+                ComponentTypeEnum.RESOURCE.getValue());
+    }
+
+    protected void validateVendorName(User user, Resource resource,
+                                    AuditingActionEnum actionEnum) {
+        String vendorName = resource.getVendorName();
+        if (!ValidationUtils.validateStringNotEmpty(vendorName)) {
+            log.info("vendor name is missing.");
+            ResponseFormat errorResponse = componentsUtils.getResponseFormat(ActionStatus.MISSING_VENDOR_NAME);
+            componentsUtils.auditResource(errorResponse, user, resource, actionEnum);
+            throw new ComponentException(ActionStatus.MISSING_VENDOR_NAME);
+        }
+        validateVendorName(vendorName, user, resource, actionEnum);
+    }
+
+    protected void validateVendorName(String vendorName, User user, Resource resource,
+                                    AuditingActionEnum actionEnum) {
+        if (vendorName != null) {
+            if (!ValidationUtils.validateVendorNameLength(vendorName)) {
+                log.info("vendor name exceds limit.");
+                ResponseFormat errorResponse = componentsUtils.getResponseFormat(ActionStatus.VENDOR_NAME_EXCEEDS_LIMIT,
+                        "" + ValidationUtils.VENDOR_NAME_MAX_LENGTH);
+                componentsUtils.auditResource(errorResponse, user, resource, actionEnum);
+                throw new ComponentException(ActionStatus.VENDOR_NAME_EXCEEDS_LIMIT,
+                        "" + ValidationUtils.VENDOR_NAME_MAX_LENGTH);
+            }
+
+            if (!ValidationUtils.validateVendorName(vendorName)) {
+                log.info("vendor name  is not valid.");
+                ResponseFormat errorResponse = componentsUtils.getResponseFormat(ActionStatus.INVALID_VENDOR_NAME);
+                componentsUtils.auditResource(errorResponse, user, resource, actionEnum);
+                throw new ComponentException(ActionStatus.INVALID_VENDOR_NAME);
+            }
+        }
+    }
+
+    private Resource buildComplexVfcMetadata(Resource resourceVf, CsarInfo csarInfo, String nodeName,
+                                             Map<String, NodeTypeInfo> nodesInfo) {
+        Resource cvfc = new Resource();
+        NodeTypeInfo nodeTypeInfo = nodesInfo.get(nodeName);
+        cvfc.setName(buildCvfcName(csarInfo.getVfResourceName(), nodeName));
+        cvfc.setNormalizedName(ValidationUtils.normaliseComponentName(cvfc.getName()));
+        cvfc.setSystemName(ValidationUtils.convertToSystemName(cvfc.getName()));
+        cvfc.setResourceType(ResourceTypeEnum.VF);
+        cvfc.setAbstract(true);
+        cvfc.setDerivedFrom(nodeTypeInfo.getDerivedFrom());
+        cvfc.setDescription(ImportUtils.Constants.CVFC_DESCRIPTION);
+        cvfc.setIcon(ImportUtils.Constants.DEFAULT_ICON);
+        cvfc.setContactId(csarInfo.getModifier().getUserId());
+        cvfc.setCreatorUserId(csarInfo.getModifier().getUserId());
+        cvfc.setVendorName(resourceVf.getVendorName());
+        cvfc.setVendorRelease(resourceVf.getVendorRelease());
+        cvfc.setResourceVendorModelNumber(resourceVf.getResourceVendorModelNumber());
+        cvfc.setToscaResourceName(
+                buildNestedToscaResourceName(ResourceTypeEnum.VF.name(), csarInfo.getVfResourceName(), nodeName)
+                        .getLeft());
+        cvfc.setInvariantUUID(UniqueIdBuilder.buildInvariantUUID());
+
+        List<String> tags = new ArrayList<>();
+        tags.add(cvfc.getName());
+        cvfc.setTags(tags);
+
+        CategoryDefinition category = new CategoryDefinition();
+        category.setName(ImportUtils.Constants.ABSTRACT_CATEGORY_NAME);
+        SubCategoryDefinition subCategory = new SubCategoryDefinition();
+        subCategory.setName(ImportUtils.Constants.ABSTRACT_SUBCATEGORY);
+        category.addSubCategory(subCategory);
+        List<CategoryDefinition> categories = new ArrayList<>();
+        categories.add(category);
+        cvfc.setCategories(categories);
+
+        cvfc.setVersion(ImportUtils.Constants.FIRST_NON_CERTIFIED_VERSION);
+        cvfc.setLifecycleState(ImportUtils.Constants.NORMATIVE_TYPE_LIFE_CYCLE_NOT_CERTIFIED_CHECKOUT);
+        cvfc.setHighestVersion(ImportUtils.Constants.NORMATIVE_TYPE_HIGHEST_VERSION);
+
+        return cvfc;
+    }
+
+    private String buildCvfcName(String resourceVfName, String nodeName) {
+        String nameWithouNamespacePrefix = nodeName
+                .substring(Constants.USER_DEFINED_RESOURCE_NAMESPACE_PREFIX.length());
+        String[] findTypes = nameWithouNamespacePrefix.split("\\.");
+        String resourceType = findTypes[0];
+        String resourceName = resourceVfName + "-" + nameWithouNamespacePrefix.substring(resourceType.length() + 1);
+        return addCvfcSuffixToResourceName(resourceName);
+    }
+
+    private String addCvfcSuffixToResourceName(String resourceName) {
+        return resourceName + "VF";
+    }
+
+    public UploadResourceInfo fillResourceMetadata(String yamlName, Resource resourceVf,
+                                                    String nodeName, User user) {
+        UploadResourceInfo resourceMetaData = new UploadResourceInfo();
+
+        // validate nodetype name prefix
+        if (!nodeName.startsWith(Constants.USER_DEFINED_RESOURCE_NAMESPACE_PREFIX)) {
+            log.debug("invalid nodeName:{} does not start with {}.", nodeName,
+                    Constants.USER_DEFINED_RESOURCE_NAMESPACE_PREFIX);
+            throw new ComponentException(ActionStatus.INVALID_NODE_TEMPLATE,
+                    yamlName, resourceMetaData.getName(), nodeName);
+        }
+
+        String actualName = this.getNodeTypeActualName(nodeName);
+        String namePrefix = nodeName.replace(actualName, "");
+        String resourceType = namePrefix.substring(Constants.USER_DEFINED_RESOURCE_NAMESPACE_PREFIX.length());
+
+        // if we import from csar, the node_type name can be
+        // org.openecomp.resource.abstract.node_name - in this case we always
+        // create a vfc
+        if (resourceType.equals(Constants.ABSTRACT)) {
+            resourceType = ResourceTypeEnum.VFC.name().toLowerCase();
+        }
+        // validating type
+        if (!ResourceTypeEnum.containsName(resourceType.toUpperCase())) {
+            log.debug("invalid resourceType:{} the type is not one of the valide types:{}.", resourceType.toUpperCase(),
+                    ResourceTypeEnum.values());
+            throw new ComponentException(ActionStatus.INVALID_NODE_TEMPLATE,
+                    yamlName, resourceMetaData.getName(), nodeName);
+        }
+
+        // Setting name
+        resourceMetaData.setName(resourceVf.getSystemName() + actualName);
+
+        // Setting type from name
+        String type = resourceType.toUpperCase();
+        resourceMetaData.setResourceType(type);
+
+        resourceMetaData.setDescription(ImportUtils.Constants.INNER_VFC_DESCRIPTION);
+        resourceMetaData.setIcon(ImportUtils.Constants.DEFAULT_ICON);
+        resourceMetaData.setContactId(user.getUserId());
+        resourceMetaData.setVendorName(resourceVf.getVendorName());
+        resourceMetaData.setVendorRelease(resourceVf.getVendorRelease());
+
+        // Setting tag
+        List<String> tags = new ArrayList<>();
+        tags.add(resourceMetaData.getName());
+        resourceMetaData.setTags(tags);
+
+        // Setting category
+        CategoryDefinition category = new CategoryDefinition();
+        category.setName(ImportUtils.Constants.ABSTRACT_CATEGORY_NAME);
+        SubCategoryDefinition subCategory = new SubCategoryDefinition();
+        subCategory.setName(ImportUtils.Constants.ABSTRACT_SUBCATEGORY);
+        category.addSubCategory(subCategory);
+        List<CategoryDefinition> categories = new ArrayList<>();
+        categories.add(category);
+        resourceMetaData.setCategories(categories);
+
+        return resourceMetaData;
+    }
+
+    protected String getNodeTypeActualName(String fullName) {
+        String nameWithouNamespacePrefix = fullName
+                .substring(Constants.USER_DEFINED_RESOURCE_NAMESPACE_PREFIX.length());
+        String[] findTypes = nameWithouNamespacePrefix.split("\\.");
+        String resourceType = findTypes[0];
+        return nameWithouNamespacePrefix.substring(resourceType.length());
+    }
+
+    public void addInput(Map<String, InputDefinition> currPropertiesMap, InputDefinition prop) {
+        String propName = prop.getName();
+        if (!currPropertiesMap.containsKey(propName)) {
+            currPropertiesMap.put(propName, prop);
+        }
+    }
+
+    public Either<RequirementDefinition, ResponseFormat> findAviableRequiremen(String regName, String yamlName,
+                                                                                UploadComponentInstanceInfo uploadComponentInstanceInfo, ComponentInstance currentCompInstance,
+                                                                                String capName) {
+        Map<String, List<RequirementDefinition>> comInstRegDefMap = currentCompInstance.getRequirements();
+        List<RequirementDefinition> list = comInstRegDefMap.get(capName);
+        RequirementDefinition validRegDef = null;
+        if (list == null) {
+            for (Map.Entry<String, List<RequirementDefinition>> entry : comInstRegDefMap.entrySet()) {
+                for (RequirementDefinition reqDef : entry.getValue()) {
+                    if (reqDef.getName().equals(regName)) {
+                        if (reqDef.getMaxOccurrences() != null
+                                && !reqDef.getMaxOccurrences().equals(RequirementDataDefinition.MAX_OCCURRENCES)) {
+                            String leftOccurrences = reqDef.getLeftOccurrences();
+                            if (leftOccurrences == null) {
+                                leftOccurrences = reqDef.getMaxOccurrences();
+                            }
+                            int left = Integer.parseInt(leftOccurrences);
+                            if (left > 0) {
+                                --left;
+                                reqDef.setLeftOccurrences(String.valueOf(left));
+                                validRegDef = reqDef;
+                                break;
+                            } else {
+                                continue;
+                            }
+                        } else {
+                            validRegDef = reqDef;
+                            break;
+                        }
+
+                    }
+                }
+                if (validRegDef != null) {
+                    break;
+                }
+            }
+        } else {
+            for (RequirementDefinition reqDef : list) {
+                if (reqDef.getName().equals(regName)) {
+                    if (reqDef.getMaxOccurrences() != null
+                            && !reqDef.getMaxOccurrences().equals(RequirementDataDefinition.MAX_OCCURRENCES)) {
+                        String leftOccurrences = reqDef.getLeftOccurrences();
+                        if (leftOccurrences == null) {
+                            leftOccurrences = reqDef.getMaxOccurrences();
+                        }
+                        int left = Integer.parseInt(leftOccurrences);
+                        if (left > 0) {
+                            --left;
+                            reqDef.setLeftOccurrences(String.valueOf(left));
+                            validRegDef = reqDef;
+                            break;
+                        } else {
+                            continue;
+                        }
+                    } else {
+                        validRegDef = reqDef;
+                        break;
+                    }
+                }
+            }
+        }
+        if (validRegDef == null) {
+            ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.INVALID_NODE_TEMPLATE,
+                    yamlName, uploadComponentInstanceInfo.getName(), uploadComponentInstanceInfo.getType());
+            return Either.right(responseFormat);
+        }
+        return Either.left(validRegDef);
+    }
+
+    public CapabilityDefinition findAvailableCapabilityByTypeOrName(RequirementDefinition validReq,
+                                                                     ComponentInstance currentCapCompInstance, UploadReqInfo uploadReqInfo) {
+        try {
+            if (null == uploadReqInfo.getCapabilityName()
+                || validReq.getCapability().equals(uploadReqInfo.getCapabilityName())) {
+                // get by capability type
+                return findAvailableCapability(validReq, currentCapCompInstance);
+            }
+            return findAvailableCapability(validReq, currentCapCompInstance, uploadReqInfo);
+        }catch (Exception e){
+            log.debug("Exception occured when findAvailableCapabilityByTypeOrName, error is:{}", e.getMessage(), e);
+            throw new ComponentException(ActionStatus.GENERAL_ERROR);
+        }
+    }
+
+    protected CapabilityDefinition findAvailableCapability(RequirementDefinition validReq, ComponentInstance instance) {
+        Map<String, List<CapabilityDefinition>> capMap = instance.getCapabilities();
+        if (capMap.containsKey(validReq.getCapability())) {
+            List<CapabilityDefinition> capList = capMap.get(validReq.getCapability());
+
+            for (CapabilityDefinition cap : capList) {
+                if (isBoundedByOccurrences(cap)) {
+                    String leftOccurrences = cap.getLeftOccurrences() != null ?
+                            cap.getLeftOccurrences() : cap.getMaxOccurrences();
+                    int left = Integer.parseInt(leftOccurrences);
+                    if (left > 0) {
+                        --left;
+                        cap.setLeftOccurrences(String.valueOf(left));
+                        return cap;
+                    }
+                } else {
+                    return cap;
+                }
+            }
+        }
+        return null;
+    }
+
+    protected CapabilityDefinition findAvailableCapability(RequirementDefinition validReq,
+                                                         ComponentInstance currentCapCompInstance, UploadReqInfo uploadReqInfo) {
+        CapabilityDefinition cap = null;
+        Map<String, List<CapabilityDefinition>> capMap = currentCapCompInstance.getCapabilities();
+        if (!capMap.containsKey(validReq.getCapability())) {
+            return null;
+        }
+        Optional<CapabilityDefinition> capByName = capMap.get(validReq.getCapability()).stream()
+                .filter(p -> p.getName().equals(uploadReqInfo.getCapabilityName())).findAny();
+        if (!capByName.isPresent()) {
+            return null;
+        }
+        cap = capByName.get();
+
+        if (isBoundedByOccurrences(cap)) {
+            String leftOccurrences = cap.getLeftOccurrences();
+            int left = Integer.parseInt(leftOccurrences);
+            if (left > 0) {
+                --left;
+                cap.setLeftOccurrences(String.valueOf(left));
+
+            }
+
+        }
+        return cap;
+    }
+
+    private boolean isBoundedByOccurrences(CapabilityDefinition cap) {
+        return cap.getMaxOccurrences() != null && !cap.getMaxOccurrences().equals(CapabilityDataDefinition.MAX_OCCURRENCES);
+    }
+
+    public ComponentParametersView getComponentFilterAfterCreateRelations() {
+        ComponentParametersView parametersView = new ComponentParametersView();
+        parametersView.disableAll();
+        parametersView.setIgnoreComponentInstances(false);
+        parametersView.setIgnoreComponentInstancesProperties(false);
+        parametersView.setIgnoreCapabilities(false);
+        parametersView.setIgnoreRequirements(false);
+        parametersView.setIgnoreGroups(false);
+        return parametersView;
+    }
+
+    public ComponentParametersView getComponentWithInstancesFilter() {
+        ComponentParametersView parametersView = new ComponentParametersView();
+        parametersView.disableAll();
+        parametersView.setIgnoreComponentInstances(false);
+        parametersView.setIgnoreInputs(false);
+        // inputs are read when creating
+        // property values on instances
+        parametersView.setIgnoreUsers(false);
+        return parametersView;
+    }
+
+    protected void addValidComponentInstanceCapabilities(String key, List<UploadCapInfo> capabilities, String resourceId, Map<String, List<CapabilityDefinition>> defaultCapabilities, Map<String, List<CapabilityDefinition>> validCapabilitiesMap){
+        String capabilityType = capabilities.get(0).getType();
+        if (defaultCapabilities.containsKey(capabilityType)) {
+            CapabilityDefinition defaultCapability = getCapability(resourceId, defaultCapabilities, capabilityType);
+            validateCapabilityProperties(capabilities, resourceId, defaultCapability);
+            List<CapabilityDefinition> validCapabilityList = new ArrayList<>();
+            validCapabilityList.add(defaultCapability);
+            validCapabilitiesMap.put(key, validCapabilityList);
+        } else {
+            throw new ComponentException(componentsUtils.getResponseFormat(ActionStatus.MISSING_CAPABILITY_TYPE, capabilityType));
+        }
+    }
+
+    protected CapabilityDefinition getCapability(String resourceId, Map<String, List<CapabilityDefinition>> defaultCapabilities, String capabilityType) {
+        CapabilityDefinition defaultCapability;
+        if (isNotEmpty(defaultCapabilities.get(capabilityType).get(0).getProperties())) {
+            defaultCapability = defaultCapabilities.get(capabilityType).get(0);
+        } else {
+            Either<Component, StorageOperationStatus> getFullComponentRes = toscaOperationFacade
+                    .getToscaFullElement(resourceId);
+            if (getFullComponentRes.isRight()) {
+                log.debug("Failed to get full component {}. Status is {}. ", resourceId,
+                        getFullComponentRes.right().value());
+                throw new ComponentException(componentsUtils.getResponseFormat(ActionStatus.COMPONENT_NOT_FOUND,
+                        resourceId));
+            }
+            defaultCapability = getFullComponentRes.left().value().getCapabilities().get(capabilityType).get(0);
+        }
+        return defaultCapability;
+    }
+
+    protected void validateCapabilityProperties(List<UploadCapInfo> capabilities, String resourceId, CapabilityDefinition defaultCapability) {
+        if (CollectionUtils.isEmpty(defaultCapability.getProperties())
+                && isNotEmpty(capabilities.get(0).getProperties())) {
+            log.debug("Failed to validate capability {} of component {}. Property list is empty. ",
+                    defaultCapability.getName(), resourceId);
+            log.debug(
+                    "Failed to update capability property values. Property list of fetched capability {} is empty. ",
+                    defaultCapability.getName());
+            throw new ComponentException(componentsUtils.getResponseFormat(ActionStatus.PROPERTY_NOT_FOUND, resourceId));
+        } else if (isNotEmpty(capabilities.get(0).getProperties())) {
+            validateUniquenessUpdateUploadedComponentInstanceCapability(defaultCapability, capabilities.get(0));
+        }
+    }
+
+    protected void validateUniquenessUpdateUploadedComponentInstanceCapability(
+            CapabilityDefinition defaultCapability, UploadCapInfo uploadedCapability) {
+        List<ComponentInstanceProperty> validProperties = new ArrayList<>();
+        Map<String, PropertyDefinition> defaultProperties = defaultCapability.getProperties().stream()
+                .collect(toMap(PropertyDefinition::getName, Function
+                        .identity()));
+        List<UploadPropInfo> uploadedProperties = uploadedCapability.getProperties();
+        for (UploadPropInfo property : uploadedProperties) {
+            String propertyName = property.getName().toLowerCase();
+            String propertyType = property.getType();
+            ComponentInstanceProperty validProperty;
+            if (defaultProperties.containsKey(propertyName) && propertTypeEqualsTo(defaultProperties, propertyName, propertyType)) {
+                throw new ComponentException(componentsUtils.getResponseFormat(ActionStatus.PROPERTY_NAME_ALREADY_EXISTS,
+                        propertyName));
+            }
+            validProperty = new ComponentInstanceProperty();
+            validProperty.setName(propertyName);
+            if (property.getValue() != null) {
+                validProperty.setValue(property.getValue().toString());
+            }
+            validProperty.setDescription(property.getDescription());
+            validProperty.setPassword(property.isPassword());
+            validProperties.add(validProperty);
+        }
+        defaultCapability.setProperties(validProperties);
+    }
+
+    private boolean propertTypeEqualsTo(Map<String, PropertyDefinition> defaultProperties, String propertyName, String propertyType) {
+        return propertyType != null && !defaultProperties.get(propertyName).getType().equals(propertyType);
+    }
+
+    public void setDeploymentArtifactsPlaceHolder(Component component, User user) {
+        if(component instanceof Service){
+            Service service = (Service) component;
+            Map<String, ArtifactDefinition> artifactMap = service.getDeploymentArtifacts();
+            if (artifactMap == null) {
+                artifactMap = new HashMap<>();
+            }
+            service.setDeploymentArtifacts(artifactMap);
+        }else if(component instanceof Resource){
+            Resource resource = (Resource) component;
+            Map<String, ArtifactDefinition> artifactMap = resource.getDeploymentArtifacts();
+            if (artifactMap == null) {
+                artifactMap = new HashMap<>();
+            }
+            Map<String, Object> deploymentResourceArtifacts = ConfigurationManager.getConfigurationManager()
+                    .getConfiguration().getDeploymentResourceArtifacts();
+            if (deploymentResourceArtifacts != null) {
+                Map<String, ArtifactDefinition> finalArtifactMap = artifactMap;
+                deploymentResourceArtifacts.forEach((k, v)->processDeploymentResourceArtifacts(user, resource, finalArtifactMap, k,v));
+            }
+            resource.setDeploymentArtifacts(artifactMap);
+        }
+
+    }
+
+    protected void processDeploymentResourceArtifacts(User user, Resource resource, Map<String, ArtifactDefinition> artifactMap, String k, Object v) {
+        boolean shouldCreateArtifact = true;
+        Map<String, Object> artifactDetails = (Map<String, Object>) v;
+        Object object = artifactDetails.get(PLACE_HOLDER_RESOURCE_TYPES);
+        if (object != null) {
+            List<String> artifactTypes = (List<String>) object;
+            if (!artifactTypes.contains(resource.getResourceType().name())) {
+                shouldCreateArtifact = false;
+                return;
+            }
+        } else {
+            log.info("resource types for artifact placeholder {} were not defined. default is all resources",
+                    k);
+        }
+        if (shouldCreateArtifact) {
+            if (serviceBusinessLogic.artifactsBusinessLogic != null) {
+                ArtifactDefinition artifactDefinition = serviceBusinessLogic.artifactsBusinessLogic.createArtifactPlaceHolderInfo(
+                        resource.getUniqueId(), k, (Map<String, Object>) v,
+                        user, ArtifactGroupTypeEnum.DEPLOYMENT);
+                if (artifactDefinition != null
+                        && !artifactMap.containsKey(artifactDefinition.getArtifactLabel())) {
+                    artifactMap.put(artifactDefinition.getArtifactLabel(), artifactDefinition);
+                }
+            }
+        }
+    }
+
+    public void mergeOldResourceMetadataWithNew(Resource oldResource, Resource newResource) {
+
+        if (newResource.getTags() == null || newResource.getTags().isEmpty()) {
+            newResource.setTags(oldResource.getTags());
+        }
+
+        if (newResource.getDescription() == null) {
+            newResource.setDescription(oldResource.getDescription());
+        }
+
+
+        if (newResource.getContactId() == null) {
+            newResource.setContactId(oldResource.getContactId());
+        }
+
+        newResource.setCategories(oldResource.getCategories());
+
+    }
+
+    protected Resource buildComplexVfcMetadata(CsarInfo csarInfo, String nodeName,
+                                             Map<String, NodeTypeInfo> nodesInfo) {
+        Resource cvfc = new Resource();
+        NodeTypeInfo nodeTypeInfo = nodesInfo.get(nodeName);
+        cvfc.setName(buildCvfcName(csarInfo.getVfResourceName(), nodeName));
+        cvfc.setNormalizedName(ValidationUtils.normaliseComponentName(cvfc.getName()));
+        cvfc.setSystemName(ValidationUtils.convertToSystemName(cvfc.getName()));
+        cvfc.setResourceType(ResourceTypeEnum.VF);
+        cvfc.setAbstract(true);
+        cvfc.setDerivedFrom(nodeTypeInfo.getDerivedFrom());
+        cvfc.setDescription(ImportUtils.Constants.VF_DESCRIPTION);
+        cvfc.setIcon(ImportUtils.Constants.DEFAULT_ICON);
+        cvfc.setContactId(csarInfo.getModifier().getUserId());
+        cvfc.setCreatorUserId(csarInfo.getModifier().getUserId());
+        cvfc.setVendorName("cmri");
+        cvfc.setVendorRelease("1.0");
+        cvfc.setResourceVendorModelNumber("");
+        cvfc.setToscaResourceName(
+                buildNestedToscaResourceName(ResourceTypeEnum.VF.name(), csarInfo.getVfResourceName(), nodeName)
+                        .getLeft());
+        cvfc.setInvariantUUID(UniqueIdBuilder.buildInvariantUUID());
+
+        List<String> tags = new ArrayList<>();
+        tags.add(cvfc.getName());
+        cvfc.setTags(tags);
+
+        CategoryDefinition category = new CategoryDefinition();
+        category.setName(ImportUtils.Constants.ABSTRACT_CATEGORY_NAME);
+        SubCategoryDefinition subCategory = new SubCategoryDefinition();
+        subCategory.setName(ImportUtils.Constants.ABSTRACT_SUBCATEGORY);
+        category.addSubCategory(subCategory);
+        List<CategoryDefinition> categories = new ArrayList<>();
+        categories.add(category);
+        cvfc.setCategories(categories);
+
+        cvfc.setVersion(ImportUtils.Constants.FIRST_NON_CERTIFIED_VERSION);
+        cvfc.setLifecycleState(ImportUtils.Constants.NORMATIVE_TYPE_LIFE_CYCLE_NOT_CERTIFIED_CHECKOUT);
+        cvfc.setHighestVersion(ImportUtils.Constants.NORMATIVE_TYPE_HIGHEST_VERSION);
+
+        return cvfc;
+    }
+
+    public Boolean validateResourceCreationFromNodeType(Resource resource, User creator) {
+        validateDerivedFromNotEmpty(creator, resource, AuditingActionEnum.CREATE_RESOURCE);
+        return true;
+    }
+
+    private void validateDerivedFromNotEmpty(User user, Resource resource, AuditingActionEnum actionEnum) {
+        log.debug("validate resource derivedFrom field");
+        if ((resource.getDerivedFrom() == null) || (resource.getDerivedFrom().isEmpty())
+                || (resource.getDerivedFrom().get(0)) == null || (resource.getDerivedFrom().get(0).trim().isEmpty())) {
+            log.info("derived from (template) field is missing for the resource");
+            ResponseFormat responseFormat = componentsUtils
+                    .getResponseFormat(ActionStatus.MISSING_DERIVED_FROM_TEMPLATE);
+            componentsUtils.auditResource(responseFormat, user, resource, actionEnum);
+
+            throw new ComponentException(ActionStatus.MISSING_DERIVED_FROM_TEMPLATE);
+        }
+    }
+
+    public Service createInputsOnService(Service service, Map<String, InputDefinition> inputs) {
+        List<InputDefinition> resourceProperties = service.getInputs();
+        if (MapUtils.isNotEmpty(inputs)|| isNotEmpty(resourceProperties)) {
+
+            Either<List<InputDefinition>, ResponseFormat> createInputs = inputsBusinessLogic.createInputsInGraph(inputs,
+                    service);
+            if (createInputs.isRight()) {
+                throw new ComponentException(createInputs.right().value());
+            }
+        } else {
+            return service;
+        }
+        Either<Service, StorageOperationStatus> updatedResource = toscaOperationFacade
+                .getToscaElement(service.getUniqueId());
+        if (updatedResource.isRight()) {
+            throw new ComponentException(componentsUtils.getResponseFormatByComponent(
+                    componentsUtils.convertFromStorageResponse(updatedResource.right().value()), service, ComponentTypeEnum.SERVICE));
+        }
+        return updatedResource.left().value();
+    }
+
+
+    public Service createServiceTransaction(Service service, User user, boolean isNormative) {
+        // validate resource name uniqueness
+        log.debug("validate resource name");
+        Either<Boolean, StorageOperationStatus> eitherValidation = toscaOperationFacade.validateComponentNameExists(
+                service.getName(), null, service.getComponentType());
+        if (eitherValidation.isRight()) {
+            log.debug("Failed to validate component name {}. Status is {}. ", service.getName(),
+                    eitherValidation.right().value());
+            ResponseFormat errorResponse = componentsUtils
+                    .getResponseFormat(componentsUtils.convertFromStorageResponse(eitherValidation.right().value()));
+            throw new ComponentException(errorResponse);
+        }
+        if (eitherValidation.left().value()) {
+            log.debug("resource with name: {}, already exists", service.getName());
+            ResponseFormat errorResponse = componentsUtils.getResponseFormat(ActionStatus.COMPONENT_NAME_ALREADY_EXIST,
+                    ComponentTypeEnum.RESOURCE.getValue(), service.getName());
+            throw new ComponentException(errorResponse);
+        }
+
+        log.debug("send resource {} to dao for create", service.getName());
+
+        createArtifactsPlaceHolderData(service, user);
+        // enrich object
+        if (!isNormative) {
+            log.debug("enrich resource with creator, version and state");
+            service.setLifecycleState(LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT);
+            service.setVersion(INITIAL_VERSION);
+            service.setHighestVersion(true);
+        }
+        return toscaOperationFacade.createToscaComponent(service)
+                .left()
+                .on(r->throwComponentExceptionByResource(r, service));
+    }
+
+    public Service throwComponentExceptionByResource(StorageOperationStatus status, Service service) {
+        ResponseFormat responseFormat = componentsUtils.getResponseFormatByComponent(
+                componentsUtils.convertFromStorageResponse(status), service, ComponentTypeEnum.SERVICE);
+        throw new ComponentException(responseFormat);
+    }
+
+
+    protected void createArtifactsPlaceHolderData(Service service, User user) {
+        setInformationalArtifactsPlaceHolder(service, user);
+        serviceBusinessLogic.setDeploymentArtifactsPlaceHolder(service, user);
+        serviceBusinessLogic.setToscaArtifactsPlaceHolders(service, user);
+    }
+
+    @SuppressWarnings("unchecked")
+    protected void setInformationalArtifactsPlaceHolder(Service service, User user) {
+        Map<String, ArtifactDefinition> artifactMap = service.getArtifacts();
+        if (artifactMap == null) {
+            artifactMap = new HashMap<>();
+        }
+        String resourceUniqueId = service.getUniqueId();
+        List<String> exludeResourceCategory = ConfigurationManager.getConfigurationManager().getConfiguration()
+                .getExcludeResourceCategory();
+        List<String> exludeResourceType = ConfigurationManager.getConfigurationManager().getConfiguration()
+                .getExcludeResourceType();
+        Map<String, Object> informationalResourceArtifacts = ConfigurationManager.getConfigurationManager()
+                .getConfiguration().getInformationalResourceArtifacts();
+        List<CategoryDefinition> categories = service.getCategories();
+        boolean isCreateArtifact = true;
+        if (exludeResourceCategory != null) {
+            String category = categories.get(0).getName();
+            isCreateArtifact = exludeResourceCategory.stream().noneMatch(e->e.equalsIgnoreCase(category));
+        }
+
+        if (informationalResourceArtifacts != null && isCreateArtifact) {
+            Set<String> keys = informationalResourceArtifacts.keySet();
+            for (String informationalResourceArtifactName : keys) {
+                Map<String, Object> artifactInfoMap = (Map<String, Object>) informationalResourceArtifacts
+                        .get(informationalResourceArtifactName);
+                ArtifactDefinition artifactDefinition = serviceBusinessLogic.artifactsBusinessLogic.createArtifactPlaceHolderInfo(
+                        resourceUniqueId, informationalResourceArtifactName, artifactInfoMap, user,
+                        ArtifactGroupTypeEnum.INFORMATIONAL);
+                artifactMap.put(artifactDefinition.getArtifactLabel(), artifactDefinition);
+
+            }
+        }
+        service.setArtifacts(artifactMap);
+    }
+
+    public void rollback(boolean inTransaction, Service service, List<ArtifactDefinition> createdArtifacts, List<ArtifactDefinition> nodeTypesNewCreatedArtifacts) {
+        if(!inTransaction) {
+            serviceBusinessLogic.janusGraphDao.rollback();
+        }
+        if (isNotEmpty(createdArtifacts) && isNotEmpty(nodeTypesNewCreatedArtifacts)) {
+            createdArtifacts.addAll(nodeTypesNewCreatedArtifacts);
+            log.debug("Found {} newly created artifacts to deleted, the component name: {}",createdArtifacts.size(), service.getName());
+        }
+    }
+
+    public Map<String,Object> getNodeTypesFromTemplate(Map<String, Object> mappedToscaTemplate) {
+        return ImportUtils.findFirstToscaMapElement(mappedToscaTemplate, TypeUtils.ToscaTagNamesEnum.NODE_TYPES)
+                .left().orValue(HashMap::new);
+    }
+
+    private Resource nodeForceCertification(Resource resource, User user,
+                                            LifecycleChangeInfoWithAction lifecycleChangeInfo, boolean inTransaction, boolean needLock) {
+        return lifecycleBusinessLogic.forceResourceCertification(resource, user, lifecycleChangeInfo, inTransaction,
+                needLock);
+    }
+
+    private Resource nodeFullCertification(String uniqueId, User user,
+                                           LifecycleChangeInfoWithAction lifecycleChangeInfo, boolean inTransaction, boolean needLock) {
+        Either<Resource, ResponseFormat> resourceResponse = lifecycleBusinessLogic.changeState(uniqueId, user, LifeCycleTransitionEnum.CERTIFY, lifecycleChangeInfo,
+                inTransaction, needLock);
+        if(resourceResponse.isRight()){
+            throw new ByResponseFormatComponentException(resourceResponse.right().value());
+        }
+        return resourceResponse.left().value();
+    }
+
+    public Either<Boolean, ResponseFormat> validateNestedDerivedFromDuringUpdate(Resource currentResource,
+                                                                                  Resource updateInfoResource, boolean hasBeenCertified) {
+
+        List<String> currentDerivedFrom = currentResource.getDerivedFrom();
+        List<String> updatedDerivedFrom = updateInfoResource.getDerivedFrom();
+        if (currentDerivedFrom == null || currentDerivedFrom.isEmpty() || updatedDerivedFrom == null
+                || updatedDerivedFrom.isEmpty()) {
+            log.trace("Update normative types");
+            return Either.left(true);
+        }
+
+        String derivedFromCurrent = currentDerivedFrom.get(0);
+        String derivedFromUpdated = updatedDerivedFrom.get(0);
+
+        if (!derivedFromCurrent.equals(derivedFromUpdated)) {
+            if (!hasBeenCertified) {
+                validateDerivedFromExist(null, updateInfoResource, null);
+            } else {
+                Either<Boolean, ResponseFormat> validateDerivedFromExtending = validateDerivedFromExtending(null,
+                        currentResource, updateInfoResource, null);
+
+                if (validateDerivedFromExtending.isRight() || !validateDerivedFromExtending.left().value()) {
+                    log.debug("Derived from cannot be updated if it doesnt inherits directly or extends inheritance");
+                    return validateDerivedFromExtending;
+                }
+            }
+        }
+        return Either.left(true);
+    }
+
+    protected Either<Boolean, ResponseFormat> validateDerivedFromExtending(User user, Resource currentResource,
+                                                                         Resource updateInfoResource, AuditingActionEnum actionEnum) {
+        String currentTemplateName = currentResource.getDerivedFrom().get(0);
+        String updatedTemplateName = updateInfoResource.getDerivedFrom().get(0);
+
+        Either<Boolean, StorageOperationStatus> dataModelResponse = toscaOperationFacade
+                .validateToscaResourceNameExtends(currentTemplateName, updatedTemplateName);
+        if (dataModelResponse.isRight()) {
+            StorageOperationStatus storageStatus = dataModelResponse.right().value();
+            BeEcompErrorManager.getInstance()
+                    .logBeDaoSystemError("Create/Update Resource - validateDerivingFromExtendingType");
+            ResponseFormat responseFormat = componentsUtils.getResponseFormatByResource(
+                    componentsUtils.convertFromStorageResponse(storageStatus), currentResource);
+            log.trace("audit before sending response");
+            componentsUtils.auditResource(responseFormat, user, currentResource, actionEnum);
+            return Either.right(responseFormat);
+        }
+
+        if (!dataModelResponse.left().value()) {
+            log.info("resource template with name {} does not inherit as original {}", updatedTemplateName,
+                    currentTemplateName);
+            ResponseFormat responseFormat = componentsUtils
+                    .getResponseFormat(ActionStatus.PARENT_RESOURCE_DOES_NOT_EXTEND);
+            componentsUtils.auditResource(responseFormat, user, currentResource, actionEnum);
+
+            return Either.right(responseFormat);
+
+        }
+        return Either.left(true);
+    }
+
+    public void validateResourceFieldsBeforeUpdate(Resource currentResource, Resource updateInfoResource,
+                                                    boolean inTransaction, boolean isNested) {
+        validateFields(currentResource, updateInfoResource, inTransaction, isNested);
+    }
+
+
+    private void validateFields(Resource currentResource, Resource updateInfoResource, boolean inTransaction, boolean isNested) {
+        boolean hasBeenCertified = ValidationUtils.hasBeenCertified(currentResource.getVersion());
+        log.debug("validate resource name before update");
+        validateResourceName(currentResource, updateInfoResource, hasBeenCertified, isNested);
+        log.debug("validate description before update");
+        serviceBusinessLogic.componentDescriptionValidator.validateAndCorrectField(null, updateInfoResource, null);
+        log.debug("validate icon before update");
+        log.debug("validate tags before update");
+        serviceBusinessLogic.componentTagsValidator.validateAndCorrectField(null, updateInfoResource, null);
+        log.debug("validate vendor name before update");
+        log.debug("validate resource vendor model number before update");
+        log.debug("validate vendor release before update");
+        log.debug("validate contact info before update");
+        serviceBusinessLogic.componentContactIdValidator.validateAndCorrectField(null, updateInfoResource, null);
+        log.debug(VALIDATE_DERIVED_BEFORE_UPDATE);
+        log.debug("validate category before update");
+    }
+
+
+    protected void validateResourceName(Resource currentResource, Resource updateInfoResource,
+                                      boolean hasBeenCertified, boolean isNested) {
+        String resourceNameUpdated = updateInfoResource.getName();
+        if (!isResourceNameEquals(currentResource, updateInfoResource)) {
+            if (isNested || !hasBeenCertified) {
+                serviceBusinessLogic.componentNameValidator.validateAndCorrectField(null, updateInfoResource, null);
+                currentResource.setName(resourceNameUpdated);
+                currentResource.setNormalizedName(ValidationUtils.normaliseComponentName(resourceNameUpdated));
+                currentResource.setSystemName(ValidationUtils.convertToSystemName(resourceNameUpdated));
+
+            } else {
+                log.info("Resource name: {}, cannot be updated once the resource has been certified once.",
+                        resourceNameUpdated);
+                throw new ComponentException(ActionStatus.RESOURCE_NAME_CANNOT_BE_CHANGED);
+            }
+        }
+    }
+
+    protected boolean isResourceNameEquals(Resource currentResource, Resource updateInfoResource) {
+        String resourceNameUpdated = updateInfoResource.getName();
+        String resourceNameCurrent = currentResource.getName();
+        if (resourceNameCurrent.equals(resourceNameUpdated)) {
+            return true;
+        }
+        return currentResource.getResourceType().equals(ResourceTypeEnum.VF) &&
+                resourceNameUpdated.equals(addCvfcSuffixToResourceName(resourceNameCurrent));
+    }
+
+    public Resource prepareResourceForUpdate(Resource oldResource, Resource newResource, User user,
+                                              boolean inTransaction, boolean needLock) {
+
+        if (!ComponentValidationUtils.canWorkOnResource(oldResource, user.getUserId())) {
+            // checkout
+            return lifecycleBusinessLogic.changeState(
+                    oldResource.getUniqueId(), user, LifeCycleTransitionEnum.CHECKOUT,
+                    new LifecycleChangeInfoWithAction("update by import"), inTransaction, needLock)
+                    .left()
+                    .on(response -> failOnChangeState(response, user, oldResource, newResource));
+        }
+        return oldResource;
+    }
+
+    protected Resource failOnChangeState(ResponseFormat response, User user, Resource oldResource, Resource newResource) {
+        log.info("resource {} cannot be updated. reason={}", oldResource.getUniqueId(),
+                response.getFormattedMessage());
+        componentsUtils.auditResource(response, user, newResource, AuditingActionEnum.IMPORT_RESOURCE,
+                ResourceVersionInfo.newBuilder()
+                        .state(oldResource.getLifecycleState().name())
+                        .version(oldResource.getVersion())
+                        .build());
+        throw new ComponentException(response);
+    }
+
+    public Resource handleResourceGenericType(Resource resource) {
+        Resource genericResource = serviceBusinessLogic.fetchAndSetDerivedFromGenericType(resource);
+        if (resource.shouldGenerateInputs()) {
+            serviceBusinessLogic.generateAndAddInputsFromGenericTypeProperties(resource, genericResource);
+        }
+        return genericResource;
+    }
+
+    public Resource createInputsOnResource(Resource resource, Map<String, InputDefinition> inputs) {
+        List<InputDefinition> resourceProperties = resource.getInputs();
+        if (MapUtils.isNotEmpty(inputs)|| isNotEmpty(resourceProperties)) {
+
+            Either<List<InputDefinition>, ResponseFormat> createInputs = inputsBusinessLogic.createInputsInGraph(inputs,
+                    resource);
+            if (createInputs.isRight()) {
+                throw new ComponentException(createInputs.right().value());
+            }
+        } else {
+            return resource;
+        }
+        Either<Resource, StorageOperationStatus> updatedResource = toscaOperationFacade
+                .getToscaElement(resource.getUniqueId());
+        if (updatedResource.isRight()) {
+            throw new ComponentException(componentsUtils.getResponseFormatByResource(
+                    componentsUtils.convertFromStorageResponse(updatedResource.right().value()), resource));
+        }
+        return updatedResource.left().value();
+    }
+
+    protected void updateOrCreateGroups(Resource resource, Map<String, GroupDefinition> groups) {
+        List<GroupDefinition> groupsFromResource = resource.getGroups();
+        List<GroupDefinition> groupsAsList = updateGroupsMembersUsingResource(groups, new Service());
+        List<GroupDefinition> groupsToUpdate = new ArrayList<>();
+        List<GroupDefinition> groupsToDelete = new ArrayList<>();
+        List<GroupDefinition> groupsToCreate = new ArrayList<>();
+        if (isNotEmpty(groupsFromResource)) {
+            addGroupsToCreateOrUpdate(groupsFromResource, groupsAsList, groupsToUpdate, groupsToCreate);
+            addGroupsToDelete(groupsFromResource, groupsAsList, groupsToDelete);
+        } else {
+            groupsToCreate.addAll(groupsAsList);
+        }
+        if (isNotEmpty(groupsToCreate)) {
+            fillGroupsFinalFields(groupsToCreate);
+            if (isNotEmpty(groupsFromResource)) {
+                serviceBusinessLogic.groupBusinessLogic.addGroups(resource,
+                        groupsToCreate, true)
+                        .left()
+                        .on(serviceBusinessLogic::throwComponentException);
+            } else {
+                serviceBusinessLogic.groupBusinessLogic.createGroups(resource,
+                        groupsToCreate, true)
+                        .left()
+                        .on(serviceBusinessLogic::throwComponentException);
+            }
+        }
+        if (isNotEmpty(groupsToDelete)) {
+            serviceBusinessLogic.groupBusinessLogic.deleteGroups(resource, groupsToDelete)
+                    .left()
+                    .on(serviceBusinessLogic::throwComponentException);
+        }
+        if (isNotEmpty(groupsToUpdate)) {
+            serviceBusinessLogic.groupBusinessLogic.updateGroups(resource, groupsToUpdate, true)
+                    .left()
+                    .on(serviceBusinessLogic::throwComponentException);
+        }
+    }
+
+    protected void addGroupsToCreateOrUpdate(List<GroupDefinition> groupsFromResource, List<GroupDefinition> groupsAsList, List<GroupDefinition> groupsToUpdate, List<GroupDefinition> groupsToCreate) {
+        for (GroupDefinition group : groupsAsList) {
+            Optional<GroupDefinition> op = groupsFromResource.stream()
+                    .filter(p -> p.getInvariantName().equalsIgnoreCase(group.getInvariantName())).findAny();
+            if (op.isPresent()) {
+                GroupDefinition groupToUpdate = op.get();
+                groupToUpdate.setMembers(group.getMembers());
+                groupToUpdate.setCapabilities(group.getCapabilities());
+                groupToUpdate.setProperties(group.getProperties());
+                groupsToUpdate.add(groupToUpdate);
+            } else {
+                groupsToCreate.add(group);
+            }
+        }
+    }
+
+    protected void addGroupsToDelete(List<GroupDefinition> groupsFromResource, List<GroupDefinition> groupsAsList, List<GroupDefinition> groupsToDelete) {
+        for (GroupDefinition group : groupsFromResource) {
+            Optional<GroupDefinition> op = groupsAsList.stream()
+                    .filter(p -> p.getName().equalsIgnoreCase(group.getName())).findAny();
+            if (!op.isPresent() && (group.getArtifacts() == null || group.getArtifacts().isEmpty())) {
+                groupsToDelete.add(group);
+            }
+        }
+    }
+
+    protected List<GroupDefinition> updateGroupsMembersUsingResource(Map<String, GroupDefinition> groups, Service component) {
+
+        List<GroupDefinition> result = new ArrayList<>();
+        List<ComponentInstance> componentInstances = component.getComponentInstances();
+
+        if (groups != null) {
+            Either<Boolean, ResponseFormat> validateCyclicGroupsDependencies = validateCyclicGroupsDependencies(groups);
+            if (validateCyclicGroupsDependencies.isRight()) {
+                throw new ComponentException(validateCyclicGroupsDependencies.right().value());
+            }
+            for (Map.Entry<String, GroupDefinition> entry : groups.entrySet()) {
+                String groupName = entry.getKey();
+                GroupDefinition groupDefinition = entry.getValue();
+                GroupDefinition updatedGroupDefinition = new GroupDefinition(groupDefinition);
+                updatedGroupDefinition.setMembers(null);
+                Map<String, String> members = groupDefinition.getMembers();
+                if (members != null) {
+                    updateGroupMembers(groups, updatedGroupDefinition, component, componentInstances, groupName, members);
+                }
+                result.add(updatedGroupDefinition);
+            }
+        }
+        return result;
+    }
+
+    public void updateGroupMembers(Map<String, GroupDefinition> groups, GroupDefinition updatedGroupDefinition, Service component, List<ComponentInstance> componentInstances, String groupName, Map<String, String> members) {
+        Set<String> compInstancesNames = members.keySet();
+
+        if (CollectionUtils.isEmpty(componentInstances)) {
+            String membersAstString = compInstancesNames.stream().collect(joining(","));
+            log.debug("The members: {}, in group: {}, cannot be found in component {}. There are no component instances.",
+                    membersAstString, groupName, component.getNormalizedName());
+            throw new ComponentException(componentsUtils.getResponseFormat(
+                    ActionStatus.GROUP_INVALID_COMPONENT_INSTANCE, membersAstString, groupName,
+                    component.getNormalizedName(), getComponentTypeForResponse(component)));
+        }
+        // Find all component instances with the member names
+        Map<String, String> memberNames = componentInstances.stream()
+                .collect(toMap(ComponentInstance::getName, ComponentInstance::getUniqueId));
+        memberNames.putAll(groups.keySet().stream().collect(toMap(g -> g, g -> "")));
+        Map<String, String> relevantInstances = memberNames.entrySet().stream()
+                .filter(n -> compInstancesNames.contains(n.getKey()))
+                .collect(toMap(Map.Entry::getKey, Map.Entry::getValue));
+
+        if (relevantInstances == null || relevantInstances.size() != compInstancesNames.size()) {
+
+            List<String> foundMembers = new ArrayList<>();
+            if (relevantInstances != null) {
+                foundMembers = relevantInstances.keySet().stream().collect(toList());
+            }
+            compInstancesNames.removeAll(foundMembers);
+            String membersAstString = compInstancesNames.stream().collect(joining(","));
+            log.debug("The members: {}, in group: {}, cannot be found in component: {}", membersAstString,
+                    groupName, component.getNormalizedName());
+            throw new ComponentException(componentsUtils.getResponseFormat(
+                    ActionStatus.GROUP_INVALID_COMPONENT_INSTANCE, membersAstString, groupName,
+                    component.getNormalizedName(), getComponentTypeForResponse(component)));
+        }
+        updatedGroupDefinition.setMembers(relevantInstances);
+    }
+
+    public Either<Boolean, ResponseFormat> validateCyclicGroupsDependencies(Map<String, GroupDefinition> allGroups) {
+
+        Either<Boolean, ResponseFormat> result = Either.left(true);
+        try {
+            Iterator<Map.Entry<String, GroupDefinition>> allGroupsItr = allGroups.entrySet().iterator();
+            while (allGroupsItr.hasNext() && result.isLeft()) {
+                Map.Entry<String, GroupDefinition> groupAEntry = allGroupsItr.next();
+                // Fetches a group member A
+                String groupAName = groupAEntry.getKey();
+                // Finds all group members in group A
+                Set<String> allGroupAMembersNames = new HashSet<>();
+                fillAllGroupMemebersRecursivly(groupAEntry.getKey(), allGroups, allGroupAMembersNames);
+                // If A is a group member of itself found cyclic dependency
+                if (allGroupAMembersNames.contains(groupAName)) {
+                    ResponseFormat responseFormat = componentsUtils
+                            .getResponseFormat(ActionStatus.GROUP_HAS_CYCLIC_DEPENDENCY, groupAName);
+                    result = Either.right(responseFormat);
+                }
+            }
+        } catch (Exception e) {
+            ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR);
+            result = Either.right(responseFormat);
+            log.debug("Exception occured when validateCyclicGroupsDependencies, error is:{}", e.getMessage(), e);
+        }
+        return result;
+    }
+
+    protected void fillAllGroupMemebersRecursivly(String groupName, Map<String, GroupDefinition> allGroups,
+                                                Set<String> allGroupMembers) {
+
+        // Found Cyclic dependency
+        if (isfillGroupMemebersRecursivlyStopCondition(groupName, allGroups, allGroupMembers)) {
+            return;
+        }
+        GroupDefinition groupDefinition = allGroups.get(groupName);
+        // All Members Of Current Group Resource Instances & Other Groups
+        Set<String> currGroupMembers = groupDefinition.getMembers().keySet();
+        // Filtered Members Of Current Group containing only members which
+        // are groups
+        List<String> currGroupFilteredMembers = currGroupMembers.stream().
+                // Keep Only Elements of type group and not Resource Instances
+                        filter(allGroups::containsKey).
+                // Add Filtered Elements to main Set
+                        peek(allGroupMembers::add).
+                // Collect results
+                        collect(toList());
+
+        // Recursively call the method for all the filtered group members
+        for (String innerGroupName : currGroupFilteredMembers) {
+            fillAllGroupMemebersRecursivly(innerGroupName, allGroups, allGroupMembers);
+        }
+    }
+
+    public ImmutablePair<Resource, ActionStatus> createResourceFromNodeType(String nodeTypeYaml, UploadResourceInfo resourceMetaData, User creator, boolean isInTransaction, boolean needLock,
+                                                                            Map<ArtifactsBusinessLogic.ArtifactOperationEnum, List<ArtifactDefinition>> nodeTypeArtifactsToHandle,
+                                                                            List<ArtifactDefinition> nodeTypesNewCreatedArtifacts, boolean forceCertificationAllowed, CsarInfo csarInfo,
+                                                                            String nodeName, boolean isNested) {
+
+        LifecycleChangeInfoWithAction lifecycleChangeInfo = new LifecycleChangeInfoWithAction(CERTIFICATION_ON_IMPORT,
+                LifecycleChangeInfoWithAction.LifecycleChanceActionEnum.CREATE_FROM_CSAR);
+
+        Function<Resource, Boolean> validator = resource -> validateResourceCreationFromNodeType(
+                resource, creator);
+
+        return resourceImportManager.importCertifiedResource(nodeTypeYaml, resourceMetaData, creator, validator,
+                lifecycleChangeInfo, isInTransaction, true, needLock, nodeTypeArtifactsToHandle,
+                nodeTypesNewCreatedArtifacts, forceCertificationAllowed, csarInfo, nodeName, isNested);
+    }
+
+    public ImmutablePair<Resource, ActionStatus> createNodeTypeResourceFromYaml(
+            String yamlName, Map.Entry<String, Object> nodeNameValue, User user, Map<String, Object> mapToConvert,
+            Service resourceVf, boolean needLock,
+            Map<ArtifactsBusinessLogic.ArtifactOperationEnum, List<ArtifactDefinition>> nodeTypeArtifactsToHandle,
+            List<ArtifactDefinition> nodeTypesNewCreatedArtifacts, boolean forceCertificationAllowed, CsarInfo csarInfo,
+            boolean isNested) {
+
+        UploadResourceInfo resourceMetaData = fillResourceMetadata(yamlName, resourceVf, nodeNameValue.getKey(), user);
+
+        String singleVfcYaml = buildNodeTypeYaml(nodeNameValue, mapToConvert,
+                resourceMetaData.getResourceType(), csarInfo);
+        user = serviceBusinessLogic.validateUser(user, "CheckIn Resource", resourceVf, AuditingActionEnum.CHECKIN_RESOURCE, true);
+        return createResourceFromNodeType(singleVfcYaml, resourceMetaData, user, true, needLock,
+                nodeTypeArtifactsToHandle, nodeTypesNewCreatedArtifacts, forceCertificationAllowed, csarInfo,
+                nodeNameValue.getKey(), isNested);
+    }
+
+    protected UploadResourceInfo fillResourceMetadata(String yamlName, Service resourceVf,
+                                                    String nodeName, User user) {
+        UploadResourceInfo resourceMetaData = new UploadResourceInfo();
+
+        // validate nodetype name prefix
+        if (!nodeName.startsWith(Constants.USER_DEFINED_RESOURCE_NAMESPACE_PREFIX)) {
+            log.debug("invalid nodeName:{} does not start with {}.", nodeName,
+                    Constants.USER_DEFINED_RESOURCE_NAMESPACE_PREFIX);
+            throw new ComponentException(ActionStatus.INVALID_NODE_TEMPLATE,
+                    yamlName, resourceMetaData.getName(), nodeName);
+        }
+
+        String actualName = this.getNodeTypeActualName(nodeName);
+        String namePrefix = nodeName.replace(actualName, "");
+        String resourceType = namePrefix.substring(Constants.USER_DEFINED_RESOURCE_NAMESPACE_PREFIX.length());
+
+        // if we import from csar, the node_type name can be
+        // org.openecomp.resource.abstract.node_name - in this case we always
+        // create a vfc
+        if (resourceType.equals(Constants.ABSTRACT)) {
+            resourceType = ResourceTypeEnum.VFC.name().toLowerCase();
+        }
+        // validating type
+        if (!ResourceTypeEnum.containsName(resourceType.toUpperCase())) {
+            log.debug("invalid resourceType:{} the type is not one of the valide types:{}.", resourceType.toUpperCase(),
+                    ResourceTypeEnum.values());
+            throw new ComponentException(ActionStatus.INVALID_NODE_TEMPLATE,
+                    yamlName, resourceMetaData.getName(), nodeName);
+        }
+
+        // Setting name
+        resourceMetaData.setName(resourceVf.getSystemName() + actualName);
+
+        // Setting type from name
+        String type = resourceType.toUpperCase();
+        resourceMetaData.setResourceType(type);
+
+        resourceMetaData.setDescription(ImportUtils.Constants.INNER_VFC_DESCRIPTION);
+        resourceMetaData.setIcon(ImportUtils.Constants.DEFAULT_ICON);
+        resourceMetaData.setContactId(user.getUserId());
+
+        // Setting tag
+        List<String> tags = new ArrayList<>();
+        tags.add(resourceMetaData.getName());
+        resourceMetaData.setTags(tags);
+
+        // Setting category
+        CategoryDefinition category = new CategoryDefinition();
+        category.setName(ImportUtils.Constants.ABSTRACT_CATEGORY_NAME);
+        SubCategoryDefinition subCategory = new SubCategoryDefinition();
+        subCategory.setName(ImportUtils.Constants.ABSTRACT_SUBCATEGORY);
+        category.addSubCategory(subCategory);
+        List<CategoryDefinition> categories = new ArrayList<>();
+        categories.add(category);
+        resourceMetaData.setCategories(categories);
+
+        return resourceMetaData;
+    }
+
+
+    public Resource propagateStateToCertified(User user, Resource resource,
+                                              LifecycleChangeInfoWithAction lifecycleChangeInfo, boolean inTransaction, boolean needLock,
+                                              boolean forceCertificationAllowed) {
+
+        Either<Resource, ResponseFormat> result = null;
+        try {
+            if (resource.getLifecycleState() != LifecycleStateEnum.CERTIFIED && forceCertificationAllowed
+                    && lifecycleBusinessLogic.isFirstCertification(resource.getVersion())) {
+                nodeForceCertification(resource, user, lifecycleChangeInfo, inTransaction, needLock);
+            }
+            if (resource.getLifecycleState() == LifecycleStateEnum.CERTIFIED) {
+                Either<ArtifactDefinition, Operation> eitherPopulated = serviceBusinessLogic.populateToscaArtifacts(
+                        resource, user, false, inTransaction, needLock);
+                return resource;
+            }
+            return nodeFullCertification(resource.getUniqueId(), user, lifecycleChangeInfo, inTransaction, needLock);
+        } catch (Exception e) {
+            log.debug("The exception has occurred upon certification of resource {}. ", resource.getName(), e);
+            throw e;
+        } finally {
+            if (result == null || result.isRight()) {
+                BeEcompErrorManager.getInstance().logBeSystemError("Change LifecycleState - Certify");
+                if (!inTransaction) {
+                    serviceBusinessLogic.janusGraphDao.rollback();
+                }
+            } else if (!inTransaction) {
+                serviceBusinessLogic.janusGraphDao.commit();
+            }
+        }
+    }
+
+    public Resource buildValidComplexVfc(CsarInfo csarInfo, String nodeName,
+                                          Map<String, NodeTypeInfo> nodesInfo) {
+
+        Resource complexVfc = buildComplexVfcMetadata(csarInfo, nodeName, nodesInfo);
+        log.debug("************* Going to validate complex VFC from yaml {}", complexVfc.getName());
+        csarInfo.addNodeToQueue(nodeName);
+        return validateResourceBeforeCreate(complexVfc, csarInfo.getModifier(),
+                AuditingActionEnum.IMPORT_RESOURCE, true, csarInfo);
+    }
+
+    public Resource updateGroupsOnResource(Resource resource, Map<String, GroupDefinition> groups) {
+        if (MapUtils.isEmpty(groups)) {
+            return resource;
+        } else {
+            updateOrCreateGroups(resource, groups);
+        }
+        Either<Resource, StorageOperationStatus> updatedResource = toscaOperationFacade
+                .getToscaElement(resource.getUniqueId());
+        if (updatedResource.isRight()) {
+            throw new ComponentException(componentsUtils.getResponseFormatByResource(
+                    componentsUtils.convertFromStorageResponse(updatedResource.right().value()), resource));
+        }
+        return updatedResource.left().value();
+    }
+
+    protected void setInformationalArtifactsPlaceHolder(Resource resource, User user) {
+        Map<String, ArtifactDefinition> artifactMap = resource.getArtifacts();
+        if (artifactMap == null) {
+            artifactMap = new HashMap<>();
+        }
+        String resourceUniqueId = resource.getUniqueId();
+        List<String> exludeResourceCategory = ConfigurationManager.getConfigurationManager().getConfiguration()
+                .getExcludeResourceCategory();
+        List<String> exludeResourceType = ConfigurationManager.getConfigurationManager().getConfiguration()
+                .getExcludeResourceType();
+        Map<String, Object> informationalResourceArtifacts = ConfigurationManager.getConfigurationManager()
+                .getConfiguration().getInformationalResourceArtifacts();
+        List<CategoryDefinition> categories = resource.getCategories();
+        boolean isCreateArtifact = true;
+        if (exludeResourceCategory != null) {
+            String category = categories.get(0).getName();
+            isCreateArtifact = exludeResourceCategory.stream().noneMatch(e->e.equalsIgnoreCase(category));
+        }
+        if (isCreateArtifact && exludeResourceType != null) {
+            String resourceType = resource.getResourceType().name();
+            isCreateArtifact = exludeResourceType.stream().noneMatch(e->e.equalsIgnoreCase(resourceType));
+        }
+        if (informationalResourceArtifacts != null && isCreateArtifact) {
+            Set<String> keys = informationalResourceArtifacts.keySet();
+            for (String informationalResourceArtifactName : keys) {
+                Map<String, Object> artifactInfoMap = (Map<String, Object>) informationalResourceArtifacts
+                        .get(informationalResourceArtifactName);
+                ArtifactDefinition artifactDefinition = serviceBusinessLogic.artifactsBusinessLogic.createArtifactPlaceHolderInfo(
+                        resourceUniqueId, informationalResourceArtifactName, artifactInfoMap, user,
+                        ArtifactGroupTypeEnum.INFORMATIONAL);
+                artifactMap.put(artifactDefinition.getArtifactLabel(), artifactDefinition);
+
+            }
+        }
+        resource.setArtifacts(artifactMap);
+    }
+
+    public void rollback(boolean inTransaction, Resource resource, List<ArtifactDefinition> createdArtifacts, List<ArtifactDefinition> nodeTypesNewCreatedArtifacts) {
+        if(!inTransaction) {
+            serviceBusinessLogic.janusGraphDao.rollback();
+        }
+        if (isNotEmpty(createdArtifacts) && isNotEmpty(nodeTypesNewCreatedArtifacts)) {
+            createdArtifacts.addAll(nodeTypesNewCreatedArtifacts);
+            log.debug("Found {} newly created artifacts to deleted, the component name: {}",createdArtifacts.size(), resource.getName());
+        }
+    }
+
+    public void createArtifactsPlaceHolderData(Resource resource, User user) {
+        setInformationalArtifactsPlaceHolder(resource, user);
+        setDeploymentArtifactsPlaceHolder(resource, user);
+        serviceBusinessLogic.setToscaArtifactsPlaceHolders(resource, user);
+    }
+
+    public void handleGroupsProperties(Service service, Map<String, GroupDefinition> groups) {
+        List<InputDefinition> inputs = service.getInputs();
+        if (MapUtils.isNotEmpty(groups)) {
+            groups.values()
+                    .stream()
+                    .filter(g -> isNotEmpty(g.getProperties()))
+                    .flatMap(g -> g.getProperties().stream())
+                    .forEach(p -> handleGetInputs(p, inputs));
+        }
+    }
+
+    public void handleGroupsProperties(Resource resource, Map<String, GroupDefinition> groups) {
+        List<InputDefinition> inputs = resource.getInputs();
+        if (MapUtils.isNotEmpty(groups)) {
+            groups.values()
+                    .stream()
+                    .filter(g -> isNotEmpty(g.getProperties()))
+                    .flatMap(g -> g.getProperties().stream())
+                    .forEach(p -> handleGetInputs(p, inputs));
+        }
+    }
+
+    protected void handleGetInputs(PropertyDataDefinition property, List<InputDefinition> inputs) {
+        if (isNotEmpty(property.getGetInputValues())) {
+            if (inputs == null || inputs.isEmpty()) {
+                log.debug("Failed to add property {} to group. Inputs list is empty ", property);
+                serviceBusinessLogic.rollbackWithException(ActionStatus.INPUTS_NOT_FOUND, property.getGetInputValues()
+                        .stream()
+                        .map(GetInputValueDataDefinition::getInputName)
+                        .collect(toList()).toString());
+            }
+            ListIterator<GetInputValueDataDefinition> getInputValuesIter = property.getGetInputValues().listIterator();
+            while (getInputValuesIter.hasNext()) {
+                GetInputValueDataDefinition getInput = getInputValuesIter.next();
+                InputDefinition input = findInputByName(inputs, getInput);
+                getInput.setInputId(input.getUniqueId());
+                if (getInput.getGetInputIndex() != null) {
+                    GetInputValueDataDefinition getInputIndex = getInput.getGetInputIndex();
+                    input = findInputByName(inputs, getInputIndex);
+                    getInputIndex.setInputId(input.getUniqueId());
+                    getInputValuesIter.add(getInputIndex);
+                }
+            }
+        }
+    }
+
+    public InputDefinition findInputByName(List<InputDefinition> inputs, GetInputValueDataDefinition getInput) {
+        Optional<InputDefinition> inputOpt = inputs.stream()
+                .filter(p -> p.getName().equals(getInput.getInputName()))
+                .findFirst();
+        if (!inputOpt.isPresent()) {
+            log.debug("#findInputByName - Failed to find the input {} ", getInput.getInputName());
+            serviceBusinessLogic.rollbackWithException(ActionStatus.INPUTS_NOT_FOUND, getInput.getInputName());
+        }
+        return inputOpt.get();
+    }
+
+    public void associateComponentInstancePropertiesToComponent(String yamlName, Resource resource, Map<String, List<ComponentInstanceProperty>> instProperties) {
+        Either<Map<String, List<ComponentInstanceProperty>>, StorageOperationStatus> addPropToInst = toscaOperationFacade
+                .associateComponentInstancePropertiesToComponent(instProperties, resource.getUniqueId());
+        if (addPropToInst.isRight()) {
+            log.debug("failed to associate properties of resource {} status is {}", resource.getUniqueId(),
+                    addPropToInst.right().value());
+            throw new ComponentException(componentsUtils.getResponseFormat(
+                    componentsUtils.convertFromStorageResponse(addPropToInst.right().value()), yamlName));
+        }
+    }
+
+    public void associateComponentInstanceInputsToComponent(String yamlName, Resource resource, Map<String, List<ComponentInstanceInput>> instInputs) {
+        if (MapUtils.isNotEmpty(instInputs)) {
+            Either<Map<String, List<ComponentInstanceInput>>, StorageOperationStatus> addInputToInst = toscaOperationFacade
+                    .associateComponentInstanceInputsToComponent(instInputs, resource.getUniqueId());
+            if (addInputToInst.isRight()) {
+                log.debug("failed to associate inputs value of resource {} status is {}", resource.getUniqueId(),
+                        addInputToInst.right().value());
+                throw new ComponentException(componentsUtils.getResponseFormat(
+                        componentsUtils.convertFromStorageResponse(addInputToInst.right().value()), yamlName));
+            }
+        }
+    }
+
+    public void associateDeploymentArtifactsToInstances(User user, String yamlName, Resource resource, Map<String, Map<String, ArtifactDefinition>> instDeploymentArtifacts) {
+        StorageOperationStatus addArtToInst = toscaOperationFacade
+                .associateDeploymentArtifactsToInstances(instDeploymentArtifacts, resource, user);
+        if (addArtToInst != StorageOperationStatus.OK && addArtToInst != StorageOperationStatus.NOT_FOUND) {
+            log.debug("failed to associate artifact of resource {} status is {}", resource.getUniqueId(), addArtToInst);
+            throw new ComponentException(componentsUtils
+                    .getResponseFormat(componentsUtils.convertFromStorageResponse(addArtToInst), yamlName));
+        }
+    }
+
+    public void associateArtifactsToInstances(String yamlName, Resource resource, Map<String, Map<String, ArtifactDefinition>> instArtifacts) {
+
+        StorageOperationStatus addArtToInst;
+
+        addArtToInst = toscaOperationFacade.associateArtifactsToInstances(instArtifacts, resource);
+        if (addArtToInst != StorageOperationStatus.OK && addArtToInst != StorageOperationStatus.NOT_FOUND) {
+            log.debug("failed to associate artifact of resource {} status is {}", resource.getUniqueId(), addArtToInst);
+            throw new ComponentException(componentsUtils
+                    .getResponseFormat(componentsUtils.convertFromStorageResponse(addArtToInst), yamlName));
+        }
+    }
+
+    public void associateOrAddCalculatedCapReq(String yamlName, Resource resource, Map<ComponentInstance, Map<String, List<CapabilityDefinition>>> instCapabilities, Map<ComponentInstance, Map<String, List<RequirementDefinition>>> instRequirements) {
+
+        StorageOperationStatus addArtToInst;
+        addArtToInst = toscaOperationFacade.associateOrAddCalculatedCapReq(instCapabilities, instRequirements,
+                resource);
+        if (addArtToInst != StorageOperationStatus.OK && addArtToInst != StorageOperationStatus.NOT_FOUND) {
+            log.debug("failed to associate cap and req of resource {} status is {}", resource.getUniqueId(),
+                    addArtToInst);
+            throw new ComponentException(componentsUtils
+                    .getResponseFormat(componentsUtils.convertFromStorageResponse(addArtToInst), yamlName));
+        }
+    }
+
+    public void associateInstAttributeToComponentToInstances(String yamlName, Resource resource, Map<String, List<AttributeDataDefinition>> instAttributes) {
+
+        StorageOperationStatus addArtToInst;
+        addArtToInst = toscaOperationFacade.associateInstAttributeToComponentToInstances(instAttributes,
+                resource);
+        if (addArtToInst != StorageOperationStatus.OK && addArtToInst != StorageOperationStatus.NOT_FOUND) {
+            log.debug("failed to associate attributes of resource {} status is {}", resource.getUniqueId(),
+                    addArtToInst);
+            throw new ComponentException(componentsUtils
+                    .getResponseFormat(componentsUtils.convertFromStorageResponse(addArtToInst), yamlName));
+        }
+    }
+
+    public Resource getResourceAfterCreateRelations(Resource resource) {
+        ComponentParametersView parametersView = getComponentFilterAfterCreateRelations();
+        Either<Resource, StorageOperationStatus> eitherGetResource = toscaOperationFacade
+                .getToscaElement(resource.getUniqueId(), parametersView);
+
+        if (eitherGetResource.isRight()) {
+            throwComponentExceptionByResource(eitherGetResource.right().value(),resource);
+        }
+        return eitherGetResource.left().value();
+    }
+
+    public Resource throwComponentExceptionByResource(StorageOperationStatus status, Resource resource) {
+        ResponseFormat responseFormat = componentsUtils.getResponseFormatByResource(
+                componentsUtils.convertFromStorageResponse(status), resource);
+        throw new ComponentException(responseFormat);
+    }
+
+    public void setCapabilityNamesTypes(Map<String, List<CapabilityDefinition>> originCapabilities,
+                                         Map<String, List<UploadCapInfo>> uploadedCapabilities) {
+        for (Map.Entry<String, List<UploadCapInfo>> currEntry : uploadedCapabilities.entrySet()) {
+            if (originCapabilities.containsKey(currEntry.getKey())) {
+                currEntry.getValue().stream().forEach(cap -> cap.setType(currEntry.getKey()));
+            }
+        }
+        for (Map.Entry<String, List<CapabilityDefinition>> capabilities : originCapabilities.entrySet()) {
+            capabilities.getValue().stream().forEach(cap -> {
+                if (uploadedCapabilities.containsKey(cap.getName())) {
+                    uploadedCapabilities.get(cap.getName()).stream().forEach(c -> {
+                        c.setName(cap.getName());
+                        c.setType(cap.getType());
+                    });
+                }
+            });
+        }
+    }
+
+    public Map<String, List<CapabilityDefinition>> getValidComponentInstanceCapabilities(
+            String resourceId, Map<String, List<CapabilityDefinition>> defaultCapabilities,
+            Map<String, List<UploadCapInfo>> uploadedCapabilities) {
+
+        Map<String, List<CapabilityDefinition>> validCapabilitiesMap = new HashMap<>();
+        uploadedCapabilities.forEach((k,v)->addValidComponentInstanceCapabilities(k,v,resourceId,defaultCapabilities,validCapabilitiesMap));
+        return validCapabilitiesMap;
+    }
+
+    public void associateComponentInstanceInputsToComponent(String yamlName, Service service, Map<String, List<ComponentInstanceInput>> instInputs) {
+        if (MapUtils.isNotEmpty(instInputs)) {
+            Either<Map<String, List<ComponentInstanceInput>>, StorageOperationStatus> addInputToInst = toscaOperationFacade
+                    .associateComponentInstanceInputsToComponent(instInputs, service.getUniqueId());
+            if (addInputToInst.isRight()) {
+                log.debug("failed to associate inputs value of resource {} status is {}", service.getUniqueId(),
+                        addInputToInst.right().value());
+                throw new ComponentException(componentsUtils.getResponseFormat(
+                        componentsUtils.convertFromStorageResponse(addInputToInst.right().value()), yamlName));
+            }
+        }
+    }
+
+    public void associateComponentInstancePropertiesToComponent(String yamlName, Service service, Map<String, List<ComponentInstanceProperty>> instProperties) {
+        Either<Map<String, List<ComponentInstanceProperty>>, StorageOperationStatus> addPropToInst = toscaOperationFacade
+                .associateComponentInstancePropertiesToComponent(instProperties, service.getUniqueId());
+        if (addPropToInst.isRight()) {
+            throw new ComponentException(componentsUtils.getResponseFormat(
+                    componentsUtils.convertFromStorageResponse(addPropToInst.right().value()), yamlName));
+        }
+    }
+
+    public void associateDeploymentArtifactsToInstances(User user, String yamlName, Service resource, Map<String, Map<String, ArtifactDefinition>> instDeploymentArtifacts) {
+        StorageOperationStatus addArtToInst = toscaOperationFacade
+                .associateDeploymentArtifactsToInstances(instDeploymentArtifacts, resource, user);
+        if (addArtToInst != StorageOperationStatus.OK && addArtToInst != StorageOperationStatus.NOT_FOUND) {
+            log.debug("failed to associate artifact of resource {} status is {}", resource.getUniqueId(), addArtToInst);
+            throw new ComponentException(componentsUtils
+                    .getResponseFormat(componentsUtils.convertFromStorageResponse(addArtToInst), yamlName));
+        }
+    }
+
+    public void associateArtifactsToInstances(String yamlName, Service resource, Map<String, Map<String, ArtifactDefinition>> instArtifacts) {
+        StorageOperationStatus addArtToInst;
+
+        addArtToInst = toscaOperationFacade.associateArtifactsToInstances(instArtifacts, resource);
+        if (addArtToInst != StorageOperationStatus.OK && addArtToInst != StorageOperationStatus.NOT_FOUND) {
+            log.debug("failed to associate artifact of resource {} status is {}", resource.getUniqueId(), addArtToInst);
+            throw new ComponentException(componentsUtils
+                    .getResponseFormat(componentsUtils.convertFromStorageResponse(addArtToInst), yamlName));
+        }
+    }
+
+    public void associateOrAddCalculatedCapReq(String yamlName, Service resource, Map<ComponentInstance, Map<String, List<CapabilityDefinition>>> instCapabilities, Map<ComponentInstance, Map<String, List<RequirementDefinition>>> instRequirements) {
+        StorageOperationStatus addArtToInst;
+        addArtToInst = toscaOperationFacade.associateOrAddCalculatedCapReq(instCapabilities, instRequirements,
+                resource);
+        log.debug("enter associateOrAddCalculatedCapReq,get instCapabilities:{},get instRequirements:{}",
+                instCapabilities, instRequirements);
+        if (addArtToInst != StorageOperationStatus.OK && addArtToInst != StorageOperationStatus.NOT_FOUND) {
+            log.debug("failed to associate cap and req of resource {} status is {}", resource.getUniqueId(),
+                    addArtToInst);
+            throw new ComponentException(componentsUtils
+                    .getResponseFormat(componentsUtils.convertFromStorageResponse(addArtToInst), yamlName));
+        }
+    }
+
+    public void associateInstAttributeToComponentToInstances(String yamlName, Service resource, Map<String, List<AttributeDataDefinition>> instAttributes) {
+        StorageOperationStatus addArtToInst;
+
+        addArtToInst = toscaOperationFacade.associateInstAttributeToComponentToInstances(instAttributes,
+                resource);
+        if (addArtToInst != StorageOperationStatus.OK && addArtToInst != StorageOperationStatus.NOT_FOUND) {
+            log.debug("failed to associate attributes of resource {} status is {}", resource.getUniqueId(),
+                    addArtToInst);
+            throw new ComponentException(componentsUtils
+                    .getResponseFormat(componentsUtils.convertFromStorageResponse(addArtToInst), yamlName));
+        }
+    }
+
+    public void associateRequirementsToService(String yamlName, Service resource, Map<String, ListRequirementDataDefinition> requirements) {
+        StorageOperationStatus addReqToService;
+        addReqToService = toscaOperationFacade.associateRequirementsToService(requirements,
+                resource.getUniqueId());
+        if (addReqToService != StorageOperationStatus.OK && addReqToService != StorageOperationStatus.NOT_FOUND) {
+            log.debug("failed to associate attributes of resource {} status is {}", resource.getUniqueId(),
+                    addReqToService);
+            throw new ComponentException(componentsUtils
+                    .getResponseFormat(componentsUtils.convertFromStorageResponse(addReqToService), yamlName));
+        }
+    }
+
+    public void associateCapabilitiesToService(String yamlName, Service resource, Map<String,ListCapabilityDataDefinition> capabilities) {
+        StorageOperationStatus addCapToService;
+        addCapToService = toscaOperationFacade.associateCapabilitiesToService(capabilities,
+                resource.getUniqueId());
+        if (addCapToService != StorageOperationStatus.OK && addCapToService != StorageOperationStatus.NOT_FOUND) {
+            log.debug("failed to associate attributes of resource {} status is {}", resource.getUniqueId(),
+                    addCapToService);
+            throw new ComponentException(componentsUtils
+                    .getResponseFormat(componentsUtils.convertFromStorageResponse(addCapToService), yamlName));
+        }
+    }
+
+    public void associateResourceInstances(String yamlName, Service service, List<RequirementCapabilityRelDef> relations) {
+        Either<List<RequirementCapabilityRelDef>, StorageOperationStatus> relationsEither = toscaOperationFacade.associateResourceInstances(service, service.getUniqueId(), relations);
+
+        if (relationsEither.isRight() && relationsEither.right().value() != StorageOperationStatus.NOT_FOUND) {
+            StorageOperationStatus status = relationsEither.right().value();
+            log.debug("failed to associate instances of service {} status is {}", service.getUniqueId(),
+                    status);
+            throw new ComponentException(componentsUtils
+                    .getResponseFormat(componentsUtils.convertFromStorageResponse(status), yamlName));
+        }
+    }
+
+    public void addCapabilities(Map<String, List<CapabilityDefinition>> originCapabilities, String type, List<CapabilityDefinition> capabilities) {
+        List<CapabilityDefinition> list = capabilities.stream().map(CapabilityDefinition::new)
+                .collect(toList());
+        originCapabilities.put(type, list);
+    }
+
+    public void addCapabilitiesProperties(Map<String, Map<String, UploadPropInfo>> newPropertiesMap, List<UploadCapInfo> capabilities) {
+        for (UploadCapInfo capability : capabilities) {
+            if (isNotEmpty(capability.getProperties())) {
+                newPropertiesMap.put(capability.getName(), capability.getProperties().stream()
+                        .collect(toMap(UploadInfo::getName, p -> p)));
+            }
+        }
+    }
+
+    public Service getServiceWithGroups(String resourceId) {
+
+        ComponentParametersView filter = new ComponentParametersView();
+        filter.setIgnoreGroups(false);
+        Either<Service, StorageOperationStatus> updatedResource = toscaOperationFacade.getToscaElement(resourceId, filter);
+        if (updatedResource.isRight()) {
+            serviceBusinessLogic.rollbackWithException(componentsUtils.convertFromStorageResponse(updatedResource.right().value()), resourceId);
+        }
+        return updatedResource.left().value();
+    }
+
+    public Resource getResourceWithGroups(String resourceId) {
+
+        ComponentParametersView filter = new ComponentParametersView();
+        filter.setIgnoreGroups(false);
+        Either<Resource, StorageOperationStatus> updatedResource = toscaOperationFacade.getToscaElement(resourceId, filter);
+        if (updatedResource.isRight()) {
+            serviceBusinessLogic.rollbackWithException(componentsUtils.convertFromStorageResponse(updatedResource.right().value()), resourceId);
+        }
+        return updatedResource.left().value();
+    }
+
+    public void associateResourceInstances(String yamlName, Resource resource, List<RequirementCapabilityRelDef> relations) {
+
+        Either<List<RequirementCapabilityRelDef>, StorageOperationStatus> relationsEither = toscaOperationFacade.associateResourceInstances(resource, resource.getUniqueId(), relations);
+        if (relationsEither.isRight() && relationsEither.right().value() != StorageOperationStatus.NOT_FOUND) {
+            StorageOperationStatus status = relationsEither.right().value();
+            log.debug("failed to associate instances of resource {} status is {}", resource.getUniqueId(),
+                    status);
+            throw new ComponentException(componentsUtils
+                    .getResponseFormat(componentsUtils.convertFromStorageResponse(status), yamlName));
+        }
+    }
+
+    public void addRelationsToRI(String yamlName, Resource resource, Map<String, UploadComponentInstanceInfo> uploadResInstancesMap, List<ComponentInstance> componentInstancesList, List<RequirementCapabilityRelDef> relations) {
+        for (Map.Entry<String, UploadComponentInstanceInfo> entry : uploadResInstancesMap.entrySet()) {
+            UploadComponentInstanceInfo uploadComponentInstanceInfo = entry.getValue();
+            ComponentInstance currentCompInstance = null;
+            for (ComponentInstance compInstance : componentInstancesList) {
+
+                if (compInstance.getName().equals(uploadComponentInstanceInfo.getName())) {
+                    currentCompInstance = compInstance;
+                    break;
+                }
+            }
+            if (currentCompInstance == null) {
+                log.debug(COMPONENT_INSTANCE_WITH_NAME_IN_RESOURCE, uploadComponentInstanceInfo.getName(),
+                        resource.getUniqueId());
+                BeEcompErrorManager.getInstance().logInternalDataError(
+                        COMPONENT_INSTANCE_WITH_NAME + uploadComponentInstanceInfo.getName() + IN_RESOURCE,
+                        resource.getUniqueId(), BeEcompErrorManager.ErrorSeverity.ERROR);
+                ResponseFormat responseFormat = componentsUtils
+                        .getResponseFormat(ActionStatus.NOT_TOPOLOGY_TOSCA_TEMPLATE, yamlName);
+                throw new ComponentException(responseFormat);
+            }
+
+            ResponseFormat addRelationToRiRes = addRelationToRI(yamlName, resource, entry.getValue(), relations);
+            if (addRelationToRiRes.getStatus() != 200) {
+                throw new ComponentException(addRelationToRiRes);
+            }
+        }
+    }
+
+    protected ResponseFormat addRelationToRI(String yamlName, Resource resource,
+                                           UploadComponentInstanceInfo nodesInfoValue, List<RequirementCapabilityRelDef> relations) {
+        List<ComponentInstance> componentInstancesList = resource.getComponentInstances();
+        ComponentInstance currentCompInstance = null;
+
+        for (ComponentInstance compInstance : componentInstancesList) {
+
+            if (compInstance.getName().equals(nodesInfoValue.getName())) {
+                currentCompInstance = compInstance;
+                break;
+            }
+        }
+        if (currentCompInstance == null) {
+            log.debug(COMPONENT_INSTANCE_WITH_NAME_IN_RESOURCE, nodesInfoValue.getName(),
+                    resource.getUniqueId());
+            BeEcompErrorManager.getInstance().logInternalDataError(
+                    COMPONENT_INSTANCE_WITH_NAME + nodesInfoValue.getName() + IN_RESOURCE,
+                    resource.getUniqueId(), BeEcompErrorManager.ErrorSeverity.ERROR);
+            return componentsUtils.getResponseFormat(ActionStatus.NOT_TOPOLOGY_TOSCA_TEMPLATE,
+                    yamlName);
+        }
+        String resourceInstanceId = currentCompInstance.getUniqueId();
+        Map<String, List<UploadReqInfo>> regMap = nodesInfoValue.getRequirements();
+
+        if (regMap != null) {
+            Iterator<Map.Entry<String, List<UploadReqInfo>>> nodesRegValue = regMap.entrySet().iterator();
+            while (nodesRegValue.hasNext()) {
+                Map.Entry<String, List<UploadReqInfo>> nodesRegInfoEntry = nodesRegValue.next();
+                List<UploadReqInfo> uploadRegInfoList = nodesRegInfoEntry.getValue();
+                for (UploadReqInfo uploadRegInfo : uploadRegInfoList) {
+                    log.debug("Going to create  relation {}", uploadRegInfo.getName());
+                    String regName = uploadRegInfo.getName();
+                    RequirementCapabilityRelDef regCapRelDef = new RequirementCapabilityRelDef();
+                    regCapRelDef.setFromNode(resourceInstanceId);
+                    log.debug("try to find available requirement {} ", regName);
+                    Either<RequirementDefinition, ResponseFormat> eitherReqStatus = findAviableRequiremen(regName,
+                            yamlName, nodesInfoValue, currentCompInstance,
+                            uploadRegInfo.getCapabilityName());
+                    if (eitherReqStatus.isRight()) {
+                        return eitherReqStatus.right().value();
+                    }
+
+                    RequirementDefinition validReq = eitherReqStatus.left().value();
+                    List<CapabilityRequirementRelationship> reqAndRelationshipPairList = regCapRelDef
+                            .getRelationships();
+                    if (reqAndRelationshipPairList == null) {
+                        reqAndRelationshipPairList = new ArrayList<>();
+                    }
+                    RelationshipInfo reqAndRelationshipPair = new RelationshipInfo();
+                    reqAndRelationshipPair.setRequirement(regName);
+                    reqAndRelationshipPair.setRequirementOwnerId(validReq.getOwnerId());
+                    reqAndRelationshipPair.setRequirementUid(validReq.getUniqueId());
+                    RelationshipImpl relationship = new RelationshipImpl();
+                    relationship.setType(validReq.getCapability());
+                    reqAndRelationshipPair.setRelationships(relationship);
+
+                    ComponentInstance currentCapCompInstance = null;
+                    for (ComponentInstance compInstance : componentInstancesList) {
+                        if (compInstance.getName().equals(uploadRegInfo.getNode())) {
+                            currentCapCompInstance = compInstance;
+                            break;
+                        }
+                    }
+
+                    if (currentCapCompInstance == null) {
+                        log.debug("The component instance  with name {} not found on resource {} ",
+                                uploadRegInfo.getNode(), resource.getUniqueId());
+                        BeEcompErrorManager.getInstance().logInternalDataError(
+                                COMPONENT_INSTANCE_WITH_NAME + uploadRegInfo.getNode() + IN_RESOURCE,
+                                resource.getUniqueId(), BeEcompErrorManager.ErrorSeverity.ERROR);
+                        return componentsUtils
+                                .getResponseFormat(ActionStatus.NOT_TOPOLOGY_TOSCA_TEMPLATE, yamlName);
+                    }
+                    regCapRelDef.setToNode(currentCapCompInstance.getUniqueId());
+                    log.debug("try to find aviable Capability  req name is {} ", validReq.getName());
+                    CapabilityDefinition aviableCapForRel = findAvailableCapabilityByTypeOrName(validReq,
+                            currentCapCompInstance, uploadRegInfo);
+                    reqAndRelationshipPair.setCapability(aviableCapForRel.getName());
+                    reqAndRelationshipPair.setCapabilityUid(aviableCapForRel.getUniqueId());
+                    reqAndRelationshipPair.setCapabilityOwnerId(aviableCapForRel.getOwnerId());
+                    if (aviableCapForRel == null) {
+                        BeEcompErrorManager.getInstance().logInternalDataError(
+                                "aviable capability was not found. req name is " + validReq.getName()
+                                        + " component instance is " + currentCapCompInstance.getUniqueId(),
+                                resource.getUniqueId(), BeEcompErrorManager.ErrorSeverity.ERROR);
+                        return componentsUtils
+                                .getResponseFormat(ActionStatus.NOT_TOPOLOGY_TOSCA_TEMPLATE, yamlName);
+                    }
+                    CapabilityRequirementRelationship capReqRel = new CapabilityRequirementRelationship();
+                    capReqRel.setRelation(reqAndRelationshipPair);
+                    reqAndRelationshipPairList.add(capReqRel);
+                    regCapRelDef.setRelationships(reqAndRelationshipPairList);
+                    relations.add(regCapRelDef);
+                }
+            }
+        } else if (resource.getResourceType() != ResourceTypeEnum.VF) {
+            return componentsUtils.getResponseFormat(ActionStatus.OK, yamlName);
+        }
+        return componentsUtils.getResponseFormat(ActionStatus.OK);
+    }
+
+}
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/utils/CreateServiceFromYamlParameter.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/utils/CreateServiceFromYamlParameter.java
new file mode 100644 (file)
index 0000000..5d2f26a
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2020 CMCC, Inc. and others. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.openecomp.sdc.be.components.impl.utils;
+
+import lombok.Getter;
+import lombok.Setter;
+import org.openecomp.sdc.be.components.csar.CsarInfo;
+import org.openecomp.sdc.be.model.ArtifactDefinition;
+import org.openecomp.sdc.be.model.NodeTypeInfo;
+import org.openecomp.sdc.be.model.ParsedToscaYamlInfo;
+
+import java.util.List;
+import java.util.Map;
+@Getter
+@Setter
+public class CreateServiceFromYamlParameter {
+    private String yamlName;
+    private ParsedToscaYamlInfo parsedToscaYamlInfo;
+    private List<ArtifactDefinition> createdArtifacts;
+    private String topologyTemplateYaml;
+    private Map<String, NodeTypeInfo> nodeTypesInfo;
+    private CsarInfo csarInfo;
+    private boolean shouldLock;
+    private boolean inTransaction;
+    private String nodeName;
+}
index 118ca5b..695ee58 100644 (file)
@@ -72,6 +72,12 @@ public class ServiceDistributionValidation {
         }
     }
 
+    public void validateAbstractServiceRequest(String serviceUUID, User modifier) {
+        validateUserExists(modifier.getUserId());
+        Service abstractService = validateServiceExists(serviceUUID);
+        validateDistributionServiceLifeCycleState(abstractService);
+    }
+       
     private Service validateServiceExists(String serviceUUID) {
         if (StringUtils.isEmpty(serviceUUID.trim())) {
             ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.BAD_REQUEST_MISSING_RESOURCE);
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/externalapi/servlet/AbstractTemplateServlet.java b/catalog-be/src/main/java/org/openecomp/sdc/be/externalapi/servlet/AbstractTemplateServlet.java
new file mode 100644 (file)
index 0000000..0320a0a
--- /dev/null
@@ -0,0 +1,321 @@
+/*
+ * Copyright (C) 2020 CMCC, Inc. and others. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.openecomp.sdc.be.externalapi.servlet;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.jcabi.aspects.Loggable;
+import fj.data.Either;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.media.ArraySchema;
+import io.swagger.v3.oas.annotations.media.Content;
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.responses.ApiResponse;
+import io.swagger.v3.oas.annotations.servers.Server;
+import io.swagger.v3.oas.annotations.servers.Servers;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.tags.Tags;
+
+import java.io.IOException;
+import java.util.List;
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.*;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+
+import org.openecomp.sdc.be.components.impl.*;
+import org.openecomp.sdc.be.components.impl.aaf.AafPermission;
+import org.openecomp.sdc.be.components.impl.aaf.PermissionAllowed;
+import org.openecomp.sdc.be.components.impl.exceptions.ByResponseFormatComponentException;
+import org.openecomp.sdc.be.config.BeEcompErrorManager;
+import org.openecomp.sdc.be.dao.api.ActionStatus;
+import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
+import org.openecomp.sdc.be.externalapi.servlet.representation.AbstractTemplateInfo;
+import org.openecomp.sdc.be.externalapi.servlet.representation.CopyServiceInfo;
+import org.openecomp.sdc.be.impl.ComponentsUtils;
+import org.openecomp.sdc.be.impl.ServletUtils;
+import org.openecomp.sdc.be.model.*;
+import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum;
+import org.openecomp.sdc.be.resources.data.auditing.model.DistributionData;
+import org.openecomp.sdc.be.resources.data.auditing.model.ResourceCommonInfo;
+import org.openecomp.sdc.be.servlets.*;
+import org.openecomp.sdc.be.user.UserBusinessLogic;
+import org.openecomp.sdc.common.api.Constants;
+import org.openecomp.sdc.common.datastructure.Wrapper;
+import org.openecomp.sdc.common.log.elements.LoggerSupportability;
+import org.openecomp.sdc.common.log.enums.LoggerSupportabilityActions;
+import org.openecomp.sdc.common.log.enums.StatusCode;
+import org.openecomp.sdc.common.log.wrappers.Logger;
+import org.openecomp.sdc.exception.ResponseFormat;
+import org.springframework.stereotype.Controller;
+
+/**
+ * This servlet provides external interfaces related to abstract templates.
+ *
+ * @author hekeguang
+ */
+
+@Loggable(prepend = true, value = Loggable.DEBUG, trim = false)
+@Path("/v1/catalog")
+@Tags({@Tag(name = "SDC External APIs")})
+@Servers({@Server(url = "/sdc")})
+@Controller
+
+public class AbstractTemplateServlet extends AbstractValidationsServlet {
+
+    @Context
+    private HttpServletRequest request;
+
+    private final ElementBusinessLogic elementBusinessLogic;
+    private final AbstractTemplateBusinessLogic abstractTemplateBusinessLogic;
+
+    private final ServiceBusinessLogic serviceBusinessLogic;
+    private final ResourceBusinessLogic resourceBusinessLogic;
+
+    private static final Logger log = Logger.getLogger(AbstractTemplateServlet.class);
+    private static final LoggerSupportability loggerSupportability = LoggerSupportability.getLogger(AbstractTemplateServlet.class.getName());
+
+    @Inject
+    public AbstractTemplateServlet(UserBusinessLogic userBusinessLogic,
+                                   ComponentInstanceBusinessLogic componentInstanceBL, ComponentsUtils componentsUtils,
+                                   ServletUtils servletUtils, ResourceImportManager resourceImportManager,
+                                   ElementBusinessLogic elementBusinessLogic,
+                                   AbstractTemplateBusinessLogic abstractTemplateBusinessLogic, ServiceBusinessLogic serviceBusinessLogic, ResourceBusinessLogic resourceBusinessLogic) {
+        super(userBusinessLogic, componentInstanceBL, componentsUtils, servletUtils, resourceImportManager);
+        this.elementBusinessLogic = elementBusinessLogic;
+        this.abstractTemplateBusinessLogic = abstractTemplateBusinessLogic;
+        this.serviceBusinessLogic = serviceBusinessLogic;
+        this.resourceBusinessLogic = resourceBusinessLogic;
+    }
+
+    private Wrapper<ResponseFormat> validateRequestHeaders(String instanceIdHeader, String userId) {
+        Wrapper<ResponseFormat> responseWrapper = new Wrapper<>();
+        if (responseWrapper.isEmpty()) {
+            validateXECOMPInstanceIDHeader(instanceIdHeader, responseWrapper);
+        }
+        if (responseWrapper.isEmpty()) {
+            validateHttpCspUserIdHeader(userId, responseWrapper);
+        }
+        return responseWrapper;
+    }
+
+    /**
+     * @param requestId
+     * @param instanceIdHeader
+     * @param accept
+     * @param authorization
+     * @param uuid
+     * @return
+     */
+    @GET
+    @Path("/abstract/service/serviceUUID/{uuid}/status")
+    @Produces(MediaType.APPLICATION_JSON)
+    @Operation(description = "Fetch abstract status of service", method = "GET",
+            summary = "Return whether the service is a virtual service", responses = {@ApiResponse(responseCode = "200",
+            description = "The check result of whether the service is an abstract service is returned",
+            content = @Content(array = @ArraySchema(schema = @Schema(implementation = AbstractTemplateInfo.class)))),
+            @ApiResponse(responseCode = "400", description = "Missing  'X-ECOMP-InstanceID'  HTTP header - POL5001"),
+            @ApiResponse(responseCode = "401",
+                    description = "ECOMP component  should authenticate itself  and  to  re-send  again  HTTP  request  with its Basic Authentication credentials - POL5002"),
+            @ApiResponse(responseCode = "403", description = "ECOMP component is not authorized - POL5003"),
+            @ApiResponse(responseCode = "404",
+                    description = "Error: Requested '%1' (uuid) resource was not found - SVC4063"),
+            @ApiResponse(responseCode = "405",
+                    description = "Method  Not Allowed  :  Invalid HTTP method type used ( PUT,DELETE,POST will be rejected) - POL4050"),
+            @ApiResponse(responseCode = "500",
+                    description = "The GET request failed either due to internal SDC problem. ECOMP Component should continue the attempts to get the needed information - POL5000")})
+    @PermissionAllowed(AafPermission.PermNames.READ_VALUE)
+    public Response getServiceAbstractStatus(
+            @Parameter(description = "X-ECOMP-RequestID header",
+                    required = false) @HeaderParam(value = Constants.X_ECOMP_REQUEST_ID_HEADER) String requestId,
+            @Parameter(description = "X-ECOMP-InstanceID header", required = true) @HeaderParam(
+                    value = Constants.X_ECOMP_INSTANCE_ID_HEADER) final String instanceIdHeader,
+            @Parameter(description = "Determines the format of the body of the response",
+                    required = false) @HeaderParam(value = Constants.ACCEPT_HEADER) String accept,
+            @Parameter(description = "The username and password",
+                    required = true) @HeaderParam(value = Constants.AUTHORIZATION_HEADER) String authorization,
+            @Parameter(description = "The requested asset uuid",
+                    required = true) @PathParam("uuid") final String uuid) throws IOException {
+
+        Response response = null;
+        ResponseFormat responseFormat = null;
+        AuditingActionEnum auditingActionEnum = AuditingActionEnum.GET_TEMPLATE_ABSTRACT_STATUS;
+        String requestURI = request.getRequestURI();
+        String url = request.getMethod() + " " + requestURI;
+        log.debug("getServiceAbstractStatus: Start handle request of {}", url);
+
+        String assetType = "services";
+        ComponentTypeEnum componentType = ComponentTypeEnum.findByParamName(assetType);
+        ResourceCommonInfo resourceCommonInfo = new ResourceCommonInfo(componentType.getValue());
+        DistributionData distributionData = new DistributionData(instanceIdHeader, requestURI);
+        // Mandatory
+        if (instanceIdHeader == null || instanceIdHeader.isEmpty()) {
+            log.debug("getServiceAbstractStatus: Missing X-ECOMP-InstanceID header");
+            responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.MISSING_X_ECOMP_INSTANCE_ID);
+            getComponentsUtils().auditExternalGetAsset(responseFormat, auditingActionEnum, distributionData,
+                    resourceCommonInfo, requestId, uuid);
+            return buildErrorResponse(responseFormat);
+        }
+
+        try {
+
+            Either<List<? extends Component>, ResponseFormat> assetTypeData = elementBusinessLogic.getCatalogComponentsByUuidAndAssetType(assetType, uuid);
+
+            if (assetTypeData.isRight()) {
+                log.debug("getServiceAbstractStatus: Service Fetching Failed");
+                responseFormat = assetTypeData.right().value();
+                getComponentsUtils().auditExternalGetAsset(responseFormat, auditingActionEnum, distributionData,
+                        resourceCommonInfo, requestId, uuid);
+
+                return buildErrorResponse(responseFormat);
+            }
+            resourceCommonInfo.setResourceName(assetTypeData.left().value().iterator().next().getName());
+            log.debug("getServiceAbstractStatus: Service Fetching Success");
+            Either<AbstractTemplateInfo, ResponseFormat> resMetadata = abstractTemplateBusinessLogic.getServiceAbstractStatus(assetTypeData.left().value());
+            if (resMetadata.isRight()) {
+                log.debug("getServiceAbstractStatus: Service abstract status get Failed");
+                responseFormat = resMetadata.right().value();
+
+                getComponentsUtils().auditExternalGetAsset(responseFormat, auditingActionEnum, distributionData,
+                        resourceCommonInfo, requestId, uuid);
+                return buildErrorResponse(responseFormat);
+            }
+            Object result = RepresentationUtils.toRepresentation(resMetadata.left().value());
+            responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.OK);
+            getComponentsUtils().auditExternalGetAsset(responseFormat, auditingActionEnum, distributionData,
+                    resourceCommonInfo, requestId, uuid);
+
+            response = buildOkResponse(responseFormat, result);
+            return response;
+
+        } catch (Exception e) {
+            BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Fetch abstract status of service");
+            log.debug("getServiceAbstractStatus: Fetch abstract status of service with exception", e);
+            throw e;
+        }
+    }
+
+    /**
+     * @param requestId
+     * @param instanceIdHeader
+     * @param accept
+     * @param authorization
+     * @param uuid
+     * @return
+     */
+    @POST
+    @Path("/abstract/service/serviceUUID/{uuid}/copy")
+    @Produces(MediaType.APPLICATION_JSON)
+    @Operation(description = "Copy a new service based on the existing service", method = "POST",
+            summary = "Return whether the copy service is successful", responses = {@ApiResponse(responseCode = "200",
+            description = "ECOMP component is authenticated and list of Catalog Assets Metadata is returned",
+            content = @Content(array = @ArraySchema(schema = @Schema(implementation = AbstractTemplateInfo.class)))),
+            @ApiResponse(responseCode = "400", description = "Missing  'X-ECOMP-InstanceID'  HTTP header - POL5001"),
+            @ApiResponse(responseCode = "401",
+                    description = "ECOMP component  should authenticate itself  and  to  re-send  again  HTTP  request  with its Basic Authentication credentials - POL5002"),
+            @ApiResponse(responseCode = "403", description = "ECOMP component is not authorized - POL5003"),
+            @ApiResponse(responseCode = "404",
+                    description = "Error: Requested '%1' (uuid) resource was not found - SVC4063"),
+            @ApiResponse(responseCode = "405",
+                    description = "Method  Not Allowed  :  Invalid HTTP method type used ( PUT,DELETE,POST will be rejected) - POL4050"),
+            @ApiResponse(responseCode = "500",
+                    description = "The GET request failed either due to internal SDC problem. ECOMP Component should continue the attempts to get the needed information - POL5000"),
+            @ApiResponse(responseCode = "409", description = "Service already exist")})
+    @PermissionAllowed(AafPermission.PermNames.WRITE_VALUE)
+    public Response copyExistService(
+            @Parameter(description = "The user id",
+                    required = true) @HeaderParam(value = Constants.USER_ID_HEADER) final String userId,
+            @Parameter(description = "X-ECOMP-RequestID header",
+                    required = false) @HeaderParam(value = Constants.X_ECOMP_REQUEST_ID_HEADER) String requestId,
+            @Parameter(description = "X-ECOMP-InstanceID header", required = true) @HeaderParam(
+                    value = Constants.X_ECOMP_INSTANCE_ID_HEADER) final String instanceIdHeader,
+            @Parameter(description = "Determines the format of the body of the response",
+                    required = false) @HeaderParam(value = Constants.ACCEPT_HEADER) String accept,
+            @Parameter(description = "The username and password",
+                    required = true) @HeaderParam(value = Constants.AUTHORIZATION_HEADER) String authorization,
+            @Parameter(description = "The requested asset uuid",
+                    required = true) @PathParam("uuid") final String uuid,
+            @Parameter(hidden = true) String data) throws IOException {
+
+
+        String url = request.getMethod() + " " + request.getRequestURI();
+        log.debug("copyExistService: Start handle request of {}", url);
+        User modifier = new User();
+        modifier.setUserId(userId);
+        log.debug("modifier id is {}", userId);
+        loggerSupportability.log(LoggerSupportabilityActions.CREATE_SERVICE, StatusCode.STARTED, "Starting to create a service by user {} ", userId);
+
+        validateNotEmptyBody(data);
+
+        Either<CopyServiceInfo, ResponseFormat> convertResponse = parseToCopyServiceInfo(data, modifier);
+        if (convertResponse.isRight()) {
+            throw new ByResponseFormatComponentException(convertResponse.right().value());
+        }
+
+        String assetType = "services";
+        CopyServiceInfo copyServiceInfo = convertResponse.left().value();
+        Either<List<? extends Component>, ResponseFormat> assetTypeData = elementBusinessLogic.getCatalogComponentsByUuidAndAssetType(assetType, uuid);
+
+        if (assetTypeData.isRight() || assetTypeData.left().value().size() != 1) {
+            log.debug("getServiceAbstractStatus: Service Fetching Failed");
+            throw new ByResponseFormatComponentException(assetTypeData.right().value());
+        }
+
+        log.debug("getServiceAbstractStatus: Service Fetching Success");
+
+        Service service = (Service) assetTypeData.left().value().get(0);
+        List<String> tags = service.getTags();
+        if (tags != null && !tags.isEmpty()) {
+            for (int i = tags.size() - 1; i >= 0; i--) {
+                String tag = tags.get(i);
+                if (service.getName().equals(tag)) {
+                    tags.remove(tag);
+                }
+            }
+        }
+        service.setName(copyServiceInfo.getNewServiceName());
+        tags.add(copyServiceInfo.getNewServiceName());
+        Either<Service, ResponseFormat> actionResponse = serviceBusinessLogic.createService(service, modifier);
+
+        if (actionResponse.isRight()) {
+            log.debug("Failed to create service");
+            throw new ByResponseFormatComponentException(actionResponse.right().value());
+        }
+
+        loggerSupportability.log(LoggerSupportabilityActions.CREATE_SERVICE, service.getComponentMetadataForSupportLog(), StatusCode.COMPLETE, "Service {} has been copyied by user {} ", service.getName(), userId);
+
+        return buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.CREATED), actionResponse.left().value());
+
+    }
+
+    public Either<CopyServiceInfo, ResponseFormat> parseToCopyServiceInfo(String serviceJson, User user) {
+        return getComponentsUtils().convertJsonToObjectUsingObjectMapper(serviceJson, user, CopyServiceInfo.class, AuditingActionEnum.CREATE_RESOURCE, ComponentTypeEnum.SERVICE);
+    }
+
+    private CopyServiceInfo convertJsonToServiceInfo(String data) {
+        ObjectMapper mapper = new ObjectMapper();
+        try {
+            return mapper.readValue(data, CopyServiceInfo.class);
+        } catch (IOException e) {
+            log.error("#convertJsonToServiceInfo - json deserialization failed with error: ", e);
+            return new CopyServiceInfo();
+        }
+    }
+}
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/externalapi/servlet/representation/AbstractResourceInfo.java b/catalog-be/src/main/java/org/openecomp/sdc/be/externalapi/servlet/representation/AbstractResourceInfo.java
new file mode 100644 (file)
index 0000000..6bb8356
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2020 CMCC, Inc. and others. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.openecomp.sdc.be.externalapi.servlet.representation;
+
+import lombok.Getter;
+import lombok.Setter;
+import org.openecomp.sdc.be.model.RequirementCapabilityRelDef;
+
+import java.util.List;
+
+@Getter
+@Setter
+public class AbstractResourceInfo {
+
+    private String abstractResourceUUid;
+    private String abstractResourceName;
+    //获得abstractResourceUniqueId
+    private String abstractResourceUniqueId;
+    //private String abstractResourceNormalizedName;
+    //获得componentInstancesRelations
+    private List<RequirementCapabilityRelDef> componentInstancesRelations;
+}
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/externalapi/servlet/representation/AbstractTemplateInfo.java b/catalog-be/src/main/java/org/openecomp/sdc/be/externalapi/servlet/representation/AbstractTemplateInfo.java
new file mode 100644 (file)
index 0000000..ba4cde7
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2020 CMCC, Inc. and others. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.openecomp.sdc.be.externalapi.servlet.representation;
+
+import java.util.List;
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class AbstractTemplateInfo {
+
+    private String serviceUUid;
+    private Boolean isAbstractTemplate;
+    //获得serviceUniqueId
+    private String serviceUniqueId;
+    private List<AbstractResourceInfo> abstractResourceInfoList;
+}
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/externalapi/servlet/representation/CopyServiceInfo.java b/catalog-be/src/main/java/org/openecomp/sdc/be/externalapi/servlet/representation/CopyServiceInfo.java
new file mode 100644 (file)
index 0000000..078d282
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2020 CMCC, Inc. and others. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.openecomp.sdc.be.externalapi.servlet.representation;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class CopyServiceInfo {
+    private String newServiceUUid;
+
+    private String newServiceName;
+
+    private String oldServiceUUid;
+}
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/externalapi/servlet/representation/ReplaceVNFInfo.java b/catalog-be/src/main/java/org/openecomp/sdc/be/externalapi/servlet/representation/ReplaceVNFInfo.java
new file mode 100644 (file)
index 0000000..db312e5
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2020 CMCC, Inc. and others. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.openecomp.sdc.be.externalapi.servlet.representation;
+
+import lombok.Getter;
+import lombok.Setter;
+import org.openecomp.sdc.be.model.ComponentInstance;
+import org.openecomp.sdc.be.model.RequirementCapabilityRelDef;
+
+import java.util.List;
+
+@Getter
+@Setter
+public class ReplaceVNFInfo {
+    /*
+        delete vnf param
+     */
+    private String serviceUniqueId;
+
+    private String abstractResourceUniqueId;
+
+    /*
+        add vnf param
+     */
+    private ComponentInstance realVNFComponentInstance;
+
+    //private List<RequirementCapabilityRelDef> componentInstancesRelations;
+}
index d3a8644..7ac2089 100644 (file)
@@ -226,7 +226,7 @@ public class ComponentsUtils {
      * @param resource
      * @return
      */
-    public ResponseFormat getResponseFormatByResource(ActionStatus actionStatus, Resource resource) {
+    public ResponseFormat getResponseFormatByResource(ActionStatus actionStatus, Component resource) {
         if (resource == null) {
             return getResponseFormat(actionStatus);
         }
index 185c1a4..09ac674 100644 (file)
@@ -20,6 +20,7 @@
 
 package org.openecomp.sdc.be.info;
 
+import com.google.common.annotations.VisibleForTesting;
 import lombok.Getter;
 import lombok.Setter;
 
@@ -29,6 +30,9 @@ public class ServiceVersionInfo {
     private String version;
     private String url;
 
+    @VisibleForTesting
+    ServiceVersionInfo() {}
+
     public ServiceVersionInfo(String serviceName, String serviceVersion, String context) {
         super();
         this.version = serviceVersion;
@@ -36,4 +40,55 @@ public class ServiceVersionInfo {
         sb.append("services/").append(serviceName).append("/").append(serviceVersion);
         url = sb.toString();
     }
+
+
+    private String artifactUuid;
+    private String state;
+    private String distributionStatus;
+
+
+    public static Builder newBuilder() {
+        return new Builder();
+    }
+
+    public String getArtifactUuid() {
+        return artifactUuid;
+    }
+    public String getState() {
+        return state;
+    }
+    public String getDistributionStatus() { return distributionStatus; }
+
+
+    public static class Builder {
+        private final ServiceVersionInfo instance;
+
+        private Builder() {
+            instance = new ServiceVersionInfo();
+        }
+
+        public Builder artifactUuid(String artifactUuid) {
+            instance.artifactUuid = artifactUuid;
+            return this;
+        }
+
+        public Builder state(String state) {
+            instance.state = state;
+            return this;
+        }
+
+        public Builder version(String version) {
+            instance.version = version;
+            return this;
+        }
+
+        public Builder distributionStatus(String distributionStatus) {
+            instance.distributionStatus = distributionStatus;
+            return this;
+        }
+
+        public ServiceVersionInfo build() {
+            return instance;
+        }
+    }
 }
index 0cdf872..cb0cc23 100644 (file)
@@ -28,6 +28,7 @@ import com.google.gson.JsonSyntaxException;
 import fj.data.Either;
 import java.io.File;
 import java.io.FileInputStream;
+import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
 import java.lang.reflect.Type;
@@ -52,6 +53,7 @@ import org.openecomp.sdc.be.components.impl.ImportUtils;
 import org.openecomp.sdc.be.components.impl.ImportUtils.ResultStatusEnum;
 import org.openecomp.sdc.be.components.impl.ImportUtils.ToscaElementTypeEnum;
 import org.openecomp.sdc.be.components.impl.ResourceImportManager;
+import org.openecomp.sdc.be.components.impl.ServiceImportManager;
 import org.openecomp.sdc.be.components.impl.exceptions.ByActionStatusComponentException;
 import org.openecomp.sdc.be.components.impl.exceptions.ByResponseFormatComponentException;
 import org.openecomp.sdc.be.components.impl.exceptions.ComponentException;
@@ -62,12 +64,17 @@ import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
 import org.openecomp.sdc.be.datatypes.enums.ResourceTypeEnum;
 import org.openecomp.sdc.be.impl.ComponentsUtils;
 import org.openecomp.sdc.be.impl.ServletUtils;
+import org.openecomp.sdc.be.impl.WebAppContextWrapper;
 import org.openecomp.sdc.be.model.ArtifactDefinition;
+import org.openecomp.sdc.be.model.Component;
 import org.openecomp.sdc.be.model.Resource;
+import org.openecomp.sdc.be.model.Service;
 import org.openecomp.sdc.be.model.UploadResourceInfo;
+import org.openecomp.sdc.be.model.UploadServiceInfo;
 import org.openecomp.sdc.be.model.User;
 import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum;
 import org.openecomp.sdc.be.servlets.ResourceUploadServlet.ResourceAuthorityTypeEnum;
+import org.openecomp.sdc.be.servlets.ServiceUploadServlet.ServiceAuthorityTypeEnum;
 import org.openecomp.sdc.be.user.Role;
 import org.openecomp.sdc.be.user.UserBusinessLogic;
 import org.openecomp.sdc.be.utils.TypeUtils;
@@ -80,6 +87,7 @@ import org.openecomp.sdc.common.util.YamlToObjectConverter;
 import org.openecomp.sdc.common.zip.ZipUtils;
 import org.openecomp.sdc.common.zip.exception.ZipException;
 import org.openecomp.sdc.exception.ResponseFormat;
+import org.springframework.web.context.WebApplicationContext;
 import org.yaml.snakeyaml.Yaml;
 
 public abstract class AbstractValidationsServlet extends BeGenericServlet {
@@ -94,12 +102,13 @@ public abstract class AbstractValidationsServlet extends BeGenericServlet {
         TOSCA_SIMPLE_YAML_PREFIX + "1_1",
         TOSCA_SIMPLE_YAML_PREFIX + "1_2",
         TOSCA_SIMPLE_YAML_PREFIX + "1_3");
-    private static final List<String> TOSCA_YML_CSAR_VALID_SUFFIX = Arrays.asList(".yml", ".yaml", ".csar");
+    private static final List<String> TOSCA_YML_CSAR_VALID_SUFFIX = Arrays.asList(".yml", ".yaml", ".csar", ".meta");
 
     protected ServletUtils servletUtils;
     protected ResourceImportManager resourceImportManager;
     protected final ComponentInstanceBusinessLogic componentInstanceBusinessLogic;
 
+    protected ServiceImportManager serviceImportManager;
 
     public AbstractValidationsServlet(UserBusinessLogic userBusinessLogic,
         ComponentInstanceBusinessLogic componentInstanceBL, ComponentsUtils componentsUtils,
@@ -113,6 +122,16 @@ public abstract class AbstractValidationsServlet extends BeGenericServlet {
     protected void init() {
     }
 
+    protected synchronized void initSpringFromContext() {
+        if (serviceImportManager == null) {
+            ServletContext context = servletRequest.getSession().getServletContext();
+            WebAppContextWrapper webApplicationContextWrapper = (WebAppContextWrapper) context
+                    .getAttribute(Constants.WEB_APPLICATION_CONTEXT_WRAPPER_ATTR);
+            WebApplicationContext webApplicationContext = webApplicationContextWrapper.getWebAppContext(context);
+            serviceImportManager = webApplicationContext.getBean(ServiceImportManager.class);
+        }
+    }
+
     protected void validateResourceDoesNotExist(Wrapper<Response> responseWrapper, User user, String resourceName) {
         if (resourceImportManager.isResourceExist(resourceName)) {
             ResponseFormat responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.RESOURCE_ALREADY_EXISTS);
@@ -483,19 +502,23 @@ public abstract class AbstractValidationsServlet extends BeGenericServlet {
 
     private void validateToscaTemplatePayloadName(Wrapper<Response> responseWrapper, UploadResourceInfo uploadResourceInfo, User user) {
         String toscaTemplatePayloadName = uploadResourceInfo.getPayloadName();
-        boolean isValidSuffix = false;
-        if (toscaTemplatePayloadName != null && !toscaTemplatePayloadName.isEmpty()) {
-            for (String validSuffix : TOSCA_YML_CSAR_VALID_SUFFIX) {
-                isValidSuffix = isValidSuffix || toscaTemplatePayloadName.toLowerCase().endsWith(validSuffix);
-            }
-        }
+        boolean isValidSuffix = isToscaTemplatePayloadNameValid(responseWrapper, toscaTemplatePayloadName);
         if (!isValidSuffix) {
             ResponseFormat responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.INVALID_TOSCA_FILE_EXTENSION);
             Response errorResponse = buildErrorResponse(responseFormat);
             getComponentsUtils().auditResource(responseFormat, user, uploadResourceInfo.getName(), AuditingActionEnum.IMPORT_RESOURCE);
             responseWrapper.setInnerElement(errorResponse);
         }
+    }
 
+    private boolean isToscaTemplatePayloadNameValid(Wrapper<Response> responseWrapper, String toscaTemplatePayloadName) {
+        boolean isValidSuffix = false;
+        if (toscaTemplatePayloadName != null && !toscaTemplatePayloadName.isEmpty()) {
+            for (String validSuffix : TOSCA_YML_CSAR_VALID_SUFFIX) {
+                isValidSuffix = isValidSuffix || toscaTemplatePayloadName.toLowerCase().endsWith(validSuffix);
+            }
+        }
+        return isValidSuffix;
     }
 
     private void validateMD5(Wrapper<Response> responseWrapper, User user, UploadResourceInfo resourceInfo, HttpServletRequest request, String resourceInfoJsonString) {
@@ -721,19 +744,29 @@ public abstract class AbstractValidationsServlet extends BeGenericServlet {
         return new ImmutablePair<>(newResource, actionStatus);
     }
 
-    private Resource throwComponentException(ResponseFormat responseFormat) {
+    protected Resource throwComponentException(ResponseFormat responseFormat) {
         throw new ByResponseFormatComponentException(responseFormat);
     }
 
     private void getAndValidateCsarYaml(Map<String, byte[]> csarUIPayload, Resource resource, User user, String csarUUID) {
+        getAndValidateComponentCsarYaml(csarUIPayload, resource, user, csarUUID);
+    }
+
+    private void getAndValidateComponentCsarYaml(Map<String, byte[]> csarUIPayload, Component component, User user, String csarUUID) {
 
         Either<ImmutablePair<String, String>, ResponseFormat> getToscaYamlRes = CsarValidationUtils.getToscaYaml(csarUIPayload, csarUUID, getComponentsUtils());
 
         if (getToscaYamlRes.isRight()) {
             ResponseFormat responseFormat = getToscaYamlRes.right().value();
             log.debug("Error when try to get csar toscayamlFile with csar ID {}, error: {}", csarUUID, responseFormat);
-            BeEcompErrorManager.getInstance().logBeDaoSystemError("Creating resource from CSAR: fetching CSAR with id " + csarUUID + " failed");
-            getComponentsUtils().auditResource(responseFormat, user, resource, AuditingActionEnum.CREATE_RESOURCE);
+            if (component instanceof Resource) {
+                BeEcompErrorManager.getInstance()
+                    .logBeDaoSystemError("Creating resource from CSAR: fetching CSAR with id " + csarUUID + " failed");
+                getComponentsUtils().auditResource(responseFormat, user, (Resource)component, AuditingActionEnum.CREATE_RESOURCE);
+            }else {
+                BeEcompErrorManager.getInstance()
+                    .logBeDaoSystemError("Creating service from CSAR: fetching CSAR with id " + csarUUID + " failed");
+            }
             throwComponentException(responseFormat);
         }
         String toscaYaml = getToscaYamlRes.left().value().getValue();
@@ -743,7 +776,9 @@ public abstract class AbstractValidationsServlet extends BeGenericServlet {
         boolean isValid = yamlConvertor.isValidYaml(toscaYaml.getBytes());
         if (!isValid) {
             ResponseFormat responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.INVALID_YAML_FILE);
-            getComponentsUtils().auditResource(responseFormat, user, resource, AuditingActionEnum.IMPORT_RESOURCE);
+            if (component instanceof Resource) {
+                getComponentsUtils().auditResource(responseFormat, user, (Resource)component, AuditingActionEnum.IMPORT_RESOURCE);
+            }
             throwComponentException(responseFormat);
         }
 
@@ -764,7 +799,10 @@ public abstract class AbstractValidationsServlet extends BeGenericServlet {
 
         if (!isValid) {
             ResponseFormat responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.INVALID_TOSCA_TEMPLATE);
-            getComponentsUtils().auditResource(responseFormat, user, resource, AuditingActionEnum.IMPORT_RESOURCE);
+            if (component instanceof Resource) {
+                log.debug("enter getAndValidateComponentCsarYaml,component instanceof Resource");
+                getComponentsUtils().auditResource(responseFormat, user, (Resource)component, AuditingActionEnum.IMPORT_RESOURCE);
+            }
             throwComponentException(responseFormat);
         }
     }
@@ -780,23 +818,32 @@ public abstract class AbstractValidationsServlet extends BeGenericServlet {
             List<UploadArtifactInfo> artifactList = resourceInfoObject.getArtifactList();
             if (artifactList != null) {
                 Map<String, ArtifactDefinition> artifactsHM = new HashMap<>();
-                for (UploadArtifactInfo artifact : artifactList) {
-                    ArtifactDefinition artifactDef = new ArtifactDefinition();
-                    artifactDef.setArtifactName(artifact.getArtifactName());
-                    artifactDef.setArtifactType(artifact.getArtifactType().getType());
-                    artifactDef.setDescription(artifact.getArtifactDescription());
-                    artifactDef.setPayloadData(artifact.getArtifactData());
-                    artifactDef.setArtifactRef(artifact.getArtifactPath());
-                    artifactsHM.put(artifactDef.getArtifactName(), artifactDef);
-                }
+                buildArtifactsHM(artifactList, artifactsHM);
                 resource.setArtifacts(artifactsHM);
             }
         }
     }
 
+    private void buildArtifactsHM(List<UploadArtifactInfo> artifactList, Map<String, ArtifactDefinition> artifactsHM){
+        for (UploadArtifactInfo artifact : artifactList) {
+            ArtifactDefinition artifactDef = new ArtifactDefinition();
+            artifactDef.setArtifactName(artifact.getArtifactName());
+            artifactDef.setArtifactType(artifact.getArtifactType().getType());
+            artifactDef.setDescription(artifact.getArtifactDescription());
+            artifactDef.setPayloadData(artifact.getArtifactData());
+            artifactDef.setArtifactRef(artifact.getArtifactPath());
+            artifactsHM.put(artifactDef.getArtifactName(), artifactDef);
+        }
+    }
+
     private Map<String, byte[]> getCsarFromPayload(UploadResourceInfo innerElement) {
         String csarUUID = innerElement.getPayloadName();
         String payloadData = innerElement.getPayloadData();
+
+        return getComponentCsarFromPayload(csarUUID, payloadData);
+    }
+
+    private Map<String, byte[]> getComponentCsarFromPayload(String csarUUID, String payloadData){
         if (payloadData == null) {
             log.info("Failed to decode received csar {}", csarUUID);
             throw new ByActionStatusComponentException(ActionStatus.CSAR_NOT_FOUND, csarUUID);
@@ -911,4 +958,373 @@ public abstract class AbstractValidationsServlet extends BeGenericServlet {
             throw new ByActionStatusComponentException(ActionStatus.MISSING_BODY);
         }
     }
+
+    protected void commonServiceGeneralValidations(
+        Wrapper<Response> responseWrapper, Wrapper<User> userWrapper,
+        Wrapper<UploadServiceInfo> uploadServiceInfoWrapper, ServiceAuthorityTypeEnum serviceAuthorityEnum,
+        String userUserId,
+        String serviceInfoJsonString) {
+
+        if (responseWrapper.isEmpty()) {
+            validateUserExist(responseWrapper, userWrapper, userUserId);
+        }
+
+        if (responseWrapper.isEmpty()) {
+            validateUserRole(responseWrapper, userWrapper.getInnerElement(), serviceAuthorityEnum);
+        }
+
+        if (responseWrapper.isEmpty()) {
+            validateAndFillServiceJson(responseWrapper, uploadServiceInfoWrapper, userWrapper.getInnerElement(),
+                serviceAuthorityEnum, serviceInfoJsonString);
+        }
+
+        if (responseWrapper.isEmpty()) {
+            validateToscaTemplatePayloadName(responseWrapper, uploadServiceInfoWrapper.getInnerElement(),
+                userWrapper.getInnerElement());
+        }
+
+    }
+
+    protected void validateUserRole(Wrapper<Response> errorResponseWrapper, User user,
+        ServiceAuthorityTypeEnum serviceAuthority) {
+        log.debug("validate user role");
+        if (serviceAuthority == ServiceAuthorityTypeEnum.NORMATIVE_TYPE_BE) {
+            if (!user.getRole().equals(Role.ADMIN.name())) {
+                log.info("user is not in appropriate role to perform action");
+                ResponseFormat responseFormat =
+                    getComponentsUtils().getResponseFormat(ActionStatus.RESTRICTED_OPERATION);
+                log.debug("audit before sending response");
+                Response response = buildErrorResponse(responseFormat);
+                errorResponseWrapper.setInnerElement(response);
+            }
+        } else {
+            validateUserRole(errorResponseWrapper, user);
+        }
+
+    }
+
+    protected void validateAndFillServiceJson(Wrapper<Response> responseWrapper,
+        Wrapper<UploadServiceInfo> uploadServiceInfoWrapper, User user,
+        ServiceAuthorityTypeEnum serviceAuthorityEnum, String serviceInfo) {
+        boolean isValid;
+        try {
+            log.debug("The received json is {}", serviceInfo);
+            UploadServiceInfo serviceInfoObject = gson.fromJson(serviceInfo, UploadServiceInfo.class);
+            if (serviceInfoObject == null) {
+                isValid = false;
+            } else {
+                if (!serviceAuthorityEnum.isBackEndImport()) {
+                    isValid =
+                        serviceInfoObject.getPayloadName() != null && !serviceInfoObject.getPayloadName().isEmpty();
+                    //only service name is checked
+                } else {
+                    isValid = true;
+                }
+                uploadServiceInfoWrapper.setInnerElement(serviceInfoObject);
+                log.debug("get isValid:{},serviceInfoObject get name:{},get tags:{},getContactId:{}," +
+                                " getPayloadName:{}",isValid,
+                        uploadServiceInfoWrapper.getInnerElement().getName(),
+                        uploadServiceInfoWrapper.getInnerElement().getTags(),
+                        uploadServiceInfoWrapper.getInnerElement().getContactId(),
+                        uploadServiceInfoWrapper.getInnerElement().getPayloadName());
+            }
+
+        } catch (JsonSyntaxException e) {
+            log.debug("enter validateAndFillServiceJson,Invalid json was received. {}", e.getMessage(), e);
+            isValid = false;
+
+        }
+        if (!isValid) {
+            log.info("Invalid json was received.");
+            ResponseFormat responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.INVALID_CONTENT);
+            Response errorResp = buildErrorResponse(responseFormat);
+            responseWrapper.setInnerElement(errorResp);
+        }
+    }
+
+    protected void validateToscaTemplatePayloadName(Wrapper<Response> responseWrapper,
+        UploadServiceInfo uploadServiceInfo, User user) {
+        String toscaTemplatePayloadName = uploadServiceInfo.getPayloadName();
+        boolean isValidSuffix = isToscaTemplatePayloadNameValid(responseWrapper, toscaTemplatePayloadName);
+        if (!isValidSuffix) {
+            ResponseFormat responseFormat =
+                getComponentsUtils().getResponseFormat(ActionStatus.INVALID_TOSCA_FILE_EXTENSION);
+            Response errorResponse = buildErrorResponse(responseFormat);
+            responseWrapper.setInnerElement(errorResponse);
+        }
+
+    }
+
+
+    protected void specificServiceAuthorityValidations(Wrapper<Response> responseWrapper,
+        Wrapper<UploadServiceInfo> uploadServiceInfoWrapper, Wrapper<String> yamlStringWrapper, User user,
+        HttpServletRequest request, String serviceInfoJsonString, ServiceAuthorityTypeEnum serviceAuthorityEnum)
+        throws FileNotFoundException {
+
+        if (responseWrapper.isEmpty()) {
+            // UI Only Validation
+            if (!serviceAuthorityEnum.isBackEndImport()) {
+                importUIValidations(responseWrapper, uploadServiceInfoWrapper.getInnerElement(), user, request,
+                    serviceInfoJsonString);
+            }
+
+            // User Defined Type Services
+            if (serviceAuthorityEnum.isUserTypeService() && !CsarValidationUtils.isCsarPayloadName(
+                uploadServiceInfoWrapper.getInnerElement().getPayloadName())) {
+                if (responseWrapper.isEmpty()) {
+                    validatePayloadNameSpace(responseWrapper, uploadServiceInfoWrapper.getInnerElement(), user,
+                        yamlStringWrapper.getInnerElement());
+                }
+
+            }
+        }
+    }
+
+    protected void importUIValidations(Wrapper<Response> responseWrapper, UploadServiceInfo serviceInfo, User user,
+        HttpServletRequest request, String serviceInfoJsonString) {
+        if (responseWrapper.isEmpty()) {
+            validateMD5(responseWrapper, user, serviceInfo, request, serviceInfoJsonString);
+        }
+        if (responseWrapper.isEmpty() && request != null && request.getMethod() != null && request.getMethod()
+            .equals("POST")) {
+            validateServiceDoesNotExist(responseWrapper, user, serviceInfo.getName());
+        }
+    }
+
+    protected void validatePayloadNameSpace(Wrapper<Response> responseWrapper, UploadServiceInfo serviceInfo, User user,
+        String toscaPayload) {
+        boolean isValid;
+        String nameSpace = "";
+        Map<String, Object> mappedToscaTemplate = (Map<String, Object>) new Yaml().load(toscaPayload);
+        Either<Map<String, Object>, ResultStatusEnum> toscaElement =
+            ImportUtils.findFirstToscaMapElement(mappedToscaTemplate, TypeUtils.ToscaTagNamesEnum.NODE_TYPES);
+        if (toscaElement.isRight() || toscaElement.left().value().size() != 1) {
+            isValid = false;
+        } else {
+            nameSpace = toscaElement.left().value().keySet().iterator().next();
+            isValid = nameSpace.startsWith(Constants.USER_DEFINED_SERVICE_NAMESPACE_PREFIX);
+            log.debug("enter validatePayloadNameSpace,get nameSpace:{},get Valid is:{}",nameSpace,isValid);
+        }
+        if (!isValid) {
+            ResponseFormat responseFormat =
+                getComponentsUtils().getResponseFormat(ActionStatus.INVALID_SERVICE_NAMESPACE);
+            Response errorResponse = buildErrorResponse(responseFormat);
+            responseWrapper.setInnerElement(errorResponse);
+        } else {
+            String str1 = nameSpace.substring(Constants.USER_DEFINED_SERVICE_NAMESPACE_PREFIX.length());
+            String[] findTypes = str1.split("\\.");
+            if (ResourceTypeEnum.containsName(findTypes[0].toUpperCase())) {
+                String type = findTypes[0].toUpperCase();
+                serviceInfo.setServiceType(type);
+            } else {
+                serviceInfo.setServiceType(ResourceTypeEnum.SERVICE.name());
+            }
+        }
+
+    }
+
+    protected void validateMD5(Wrapper<Response> responseWrapper, User user, UploadServiceInfo serviceInfo,
+        HttpServletRequest request, String serviceInfoJsonString) {
+        boolean isValid;
+        String recievedMD5 = request.getHeader(Constants.MD5_HEADER);
+        if (recievedMD5 == null) {
+            isValid = false;
+        } else {
+            String calculateMD5 = GeneralUtility.calculateMD5Base64EncodedByString(serviceInfoJsonString);
+            isValid = calculateMD5.equals(recievedMD5);
+        }
+        if (!isValid) {
+            ResponseFormat responseFormat =
+                getComponentsUtils().getResponseFormat(ActionStatus.INVALID_SERVICE_CHECKSUM);
+            Response errorResponse = buildErrorResponse(responseFormat);
+            responseWrapper.setInnerElement(errorResponse);
+        }
+    }
+
+
+    protected void validateServiceDoesNotExist(Wrapper<Response> responseWrapper, User user, String serviceName) {
+        if (serviceImportManager.isServiceExist(serviceName)) {
+            ResponseFormat responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.SERVICE_ALREADY_EXISTS);
+            Response errorResponse = buildErrorResponse(responseFormat);
+            responseWrapper.setInnerElement(errorResponse);
+        }
+    }
+
+    protected void handleImportService(Wrapper<Response> responseWrapper, User user,
+        UploadServiceInfo serviceInfoObject, String yamlAsString, ServiceAuthorityTypeEnum authority,
+        boolean createNewVersion, String serviceUniqueId) throws ZipException {
+
+        Response response = null;
+        Object representation = null;
+        ImmutablePair<Service, ActionStatus> importedServiceStatus = null;
+        if (CsarValidationUtils.isCsarPayloadName(serviceInfoObject.getPayloadName())) {
+            log.debug("import service from csar");
+            importedServiceStatus = importServiceFromUICsar(serviceInfoObject, user, serviceUniqueId);
+        }
+
+        if (importedServiceStatus != null) {
+            try {
+                representation = RepresentationUtils.toRepresentation(importedServiceStatus.left);
+            } catch (IOException e) {
+                log.debug("Error while building service representation : {}", e.getMessage(), e);
+            }
+            response = buildOkResponse(getComponentsUtils().getResponseFormat(importedServiceStatus.right),
+                representation);
+        }
+        responseWrapper.setInnerElement(response);
+    }
+
+    private ImmutablePair<Service, ActionStatus> importServiceFromUICsar(UploadServiceInfo serviceInfoObject, User user,
+        String serviceUniqueId) throws ZipException {
+
+        Service newService;
+        ImmutablePair<Service, ActionStatus> result = null;
+        ActionStatus actionStatus;
+        Service service = new Service();
+        String payloadName = serviceInfoObject.getPayloadName();
+        fillServiceFromServiceInfoObject(service, serviceInfoObject);
+
+        Map<String, byte[]> csarUIPayloadRes = getCsarFromPayload(serviceInfoObject);
+
+        getAndValidateCsarYaml(csarUIPayloadRes, service, user, payloadName);
+
+        newService = serviceImportManager.getServiceImportBusinessLogic()
+            .createService(service, AuditingActionEnum.CREATE_SERVICE, user, csarUIPayloadRes,
+                payloadName);
+        actionStatus = ActionStatus.CREATED;
+
+        return new ImmutablePair<>(newService, actionStatus);
+    }
+
+
+    private void fillServiceFromServiceInfoObject(Service service, UploadServiceInfo serviceInfoObject) {
+        serviceImportManager.populateServiceMetadata(serviceInfoObject, service);
+        fillArtifacts(service, serviceInfoObject);
+
+    }
+
+    private Map<String, byte[]> getCsarFromPayload(UploadServiceInfo innerElement)
+        throws ZipException {
+        String csarUUID = innerElement.getPayloadName();
+        String payloadData = innerElement.getPayloadData();
+        return getComponentCsarFromPayload(csarUUID, payloadData);
+    }
+
+    private void getAndValidateCsarYaml(Map<String, byte[]> csarUIPayload, Service service, User user,
+        String csarUUID) {
+        getAndValidateComponentCsarYaml(csarUIPayload, service, user, csarUUID);
+    }
+
+    private void fillArtifacts(Service service, UploadServiceInfo serviceInfoObject) {
+        if (service != null && serviceInfoObject != null) {
+            List<UploadArtifactInfo> artifactList = serviceInfoObject.getArtifactList();
+            if (artifactList != null) {
+                Map<String, ArtifactDefinition> artifactsHM = new HashMap<>();
+                buildArtifactsHM(artifactList, artifactsHM);
+                service.setArtifacts(artifactsHM);
+            }
+        }
+    }
+    /**
+     * import service payload to postman
+     * @param responseWrapper
+     * @param uploadServiceInfoWrapper
+     * @param yamlStringWrapper
+     * @param user
+     * @param serviceInfoJsonString
+     * @param serviceAuthorityEnum
+     * @param file
+     * @throws ZipException
+     */
+    protected void fillServicePayload(Wrapper<Response> responseWrapper, Wrapper<UploadServiceInfo> uploadServiceInfoWrapper, Wrapper<String> yamlStringWrapper, User user, String serviceInfoJsonString, ServiceAuthorityTypeEnum serviceAuthorityEnum,
+                                      File file) throws ZipException {
+        log.debug("enter fillServicePayload");
+        if (responseWrapper.isEmpty()) {
+            log.debug("enter fillServicePayload,get responseWrapper is empty");
+            if (serviceAuthorityEnum.isBackEndImport()) {
+                // PrePayload Validations
+                if (responseWrapper.isEmpty()) {
+                    validateDataNotNull(responseWrapper, file, serviceInfoJsonString);
+                }
+                if (responseWrapper.isEmpty()){
+                    log.debug("enter fillServicePayload,responseWrapper is empty");
+                }
+                if(!serviceAuthorityEnum.equals(ServiceAuthorityTypeEnum.CSAR_TYPE_BE)){
+                    if (responseWrapper.isEmpty()) {
+                        validateZip(responseWrapper, file, uploadServiceInfoWrapper.getInnerElement().getPayloadName());
+                    }
+
+                    // Fill PayLoad From File
+                    if (responseWrapper.isEmpty()) {
+                        fillToscaTemplateFromZip(yamlStringWrapper, uploadServiceInfoWrapper.getInnerElement().getPayloadName(), file);
+                    }
+                }else{
+
+                    log.debug("enter fillServicePayload,ServiceAuthorityTypeEnum is CSAR_TYPE_BE");
+                    if (responseWrapper.isEmpty()) {
+                        validateCsar(responseWrapper, file, uploadServiceInfoWrapper.getInnerElement().getPayloadName());
+                    }
+                    if (!responseWrapper.isEmpty()) {
+                        log.debug("enter fillServicePayload,get responseWrapper:{}", responseWrapper);
+                    }
+                    // Fill PayLoad From File
+                    if (responseWrapper.isEmpty()) {
+                        fillServicePayloadDataFromFile(responseWrapper, uploadServiceInfoWrapper.getInnerElement(), file);
+                    }
+
+                }
+
+            } else {
+                // Fill PayLoad From JSON
+                if (responseWrapper.isEmpty()) {
+                    fillServiceToscaTemplateFromJson(responseWrapper, yamlStringWrapper, user, uploadServiceInfoWrapper.getInnerElement());
+                }
+            }
+
+        }
+
+    }
+
+    protected void fillServicePayloadDataFromFile(Wrapper<Response> responseWrapper, UploadServiceInfo uploadServiceInfoWrapper, File file)  {
+        try(InputStream fileInputStream = new FileInputStream(file)){
+
+            log.debug("enter fillServicePayloadDataFromFile");
+            byte [] data = new byte[(int)file.length()];
+            if( fileInputStream.read(data) == -1){
+                log.info("Invalid json was received.");
+                ResponseFormat responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.INVALID_CONTENT);
+
+                Response errorResp = buildErrorResponse(responseFormat);
+                responseWrapper.setInnerElement(errorResp);
+            }
+            String payloadData =  Base64.encodeBase64String(data);
+            uploadServiceInfoWrapper.setPayloadData(payloadData);
+            log.debug("enter fillServicePayloadDataFromFile,get payloadData:{}",
+                    uploadServiceInfoWrapper.getPayloadData());
+
+            log.debug("enter fillServicePayloadDataFromFile,get uploadService:{}",uploadServiceInfoWrapper);
+
+        } catch (IOException e) {
+            log.info("Invalid json was received or Error while closing input Stream.");
+            log.debug("Invalid json was received or Error while closing input Stream. {}", e.getMessage(), e);
+            ResponseFormat responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.INVALID_CONTENT);
+
+            Response errorResp = buildErrorResponse(responseFormat);
+            responseWrapper.setInnerElement(errorResp);
+        }
+    }
+
+    private void fillServiceToscaTemplateFromJson(Wrapper<Response> responseWrapper, Wrapper<String> yamlStringWrapper, User user, UploadServiceInfo serviceInfo) {
+        if (serviceInfo.getPayloadData() == null || serviceInfo.getPayloadData().isEmpty()) {
+            ResponseFormat responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.INVALID_RESOURCE_PAYLOAD);
+            Response errorResponse = buildErrorResponse(responseFormat);
+            getComponentsUtils().auditResource(responseFormat, user, serviceInfo.getName(), AuditingActionEnum.IMPORT_RESOURCE);
+            responseWrapper.setInnerElement(errorResponse);
+        } else {
+            String toscaPayload = serviceInfo.getPayloadData();
+            String decodedPayload = new String(Base64.decodeBase64(toscaPayload));
+            yamlStringWrapper.setInnerElement(decodedPayload);
+        }
+    }
+
 }
index 5c3bd85..0896891 100644 (file)
@@ -71,6 +71,7 @@ import org.openecomp.sdc.be.components.impl.aaf.AafPermission;
 import org.openecomp.sdc.be.components.impl.aaf.PermissionAllowed;
 import org.openecomp.sdc.be.components.impl.exceptions.BusinessLogicException;
 import org.openecomp.sdc.be.components.impl.exceptions.ByActionStatusComponentException;
+import org.openecomp.sdc.be.components.impl.exceptions.ByResponseFormatComponentException;
 import org.openecomp.sdc.be.components.impl.exceptions.ComponentException;
 import org.openecomp.sdc.be.config.BeEcompErrorManager;
 import org.openecomp.sdc.be.dao.api.ActionStatus;
@@ -79,6 +80,7 @@ import org.openecomp.sdc.be.datatypes.elements.CINodeFilterDataDefinition;
 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
 import org.openecomp.sdc.be.datatypes.enums.CreatedFrom;
 import org.openecomp.sdc.be.datatypes.enums.JsonPresentationFields;
+import org.openecomp.sdc.be.externalapi.servlet.representation.ReplaceVNFInfo;
 import org.openecomp.sdc.be.impl.ComponentsUtils;
 import org.openecomp.sdc.be.impl.ServletUtils;
 import org.openecomp.sdc.be.info.CreateAndAssotiateInfo;
@@ -1623,4 +1625,100 @@ public class ComponentInstanceServlet extends AbstractValidationsServlet {
         return Either.left(Arrays.asList(convertStatus.left().value()));
     }
 
+    @POST
+    @Path("/services/replaceVNF")
+    @Operation(description = "Replace new VNF based on the existing VNF", method = "POST",
+            summary = "Return whether the replace VNF is successful", responses = {
+            @ApiResponse(responseCode = "200", description = "ECOMP component is authenticated and list of Catalog Assets Metadata is returned",
+                    content = @Content(array = @ArraySchema(schema = @Schema(implementation = ReplaceVNFInfo.class)))),
+            @ApiResponse(responseCode = "400", description = "Missing  'X-ECOMP-InstanceID'  HTTP header - POL5001"),
+            @ApiResponse(responseCode = "401",
+                    description = "ECOMP component  should authenticate itself  and  to  re-send  again  HTTP  request  with its Basic Authentication credentials - POL5002"),
+            @ApiResponse(responseCode = "403", description = "ECOMP component is not authorized - POL5003"),
+            @ApiResponse(responseCode = "404",
+                    description = "Error: Requested '%1' (uuid) resource was not found - SVC4063"),
+            @ApiResponse(responseCode = "405",
+                    description = "Method  Not Allowed  :  Invalid HTTP method type used ( PUT,DELETE,POST will be rejected) - POL4050"),
+            @ApiResponse(responseCode = "500",
+                    description = "The GET request failed either due to internal SDC problem. ECOMP Component should continue the attempts to get the needed information - POL5000"),
+            @ApiResponse(responseCode = "409", description = "Service already exist")})
+    @PermissionAllowed(AafPermission.PermNames.INTERNAL_ALL_VALUE)
+    public Response replaceVNF(
+            @Parameter(description = "The user id",
+                    required = true) @HeaderParam(value = Constants.USER_ID_HEADER) String userId,
+            @Parameter(description = "X-ECOMP-RequestID header",
+                    required = false) @HeaderParam(value = Constants.X_ECOMP_REQUEST_ID_HEADER) String requestId,
+            @Parameter(description = "X-ECOMP-InstanceID header", required = true)
+            @HeaderParam(value = Constants.X_ECOMP_INSTANCE_ID_HEADER) final String instanceIdHeader,
+            @Parameter(description = "Determines the format of the body of the response",
+                    required = false) @HeaderParam(value = Constants.ACCEPT_HEADER) String accept,
+            @Parameter(description = "The username and password",
+                    required = true) @HeaderParam(value = Constants.AUTHORIZATION_HEADER) String authorization,
+            @Context final HttpServletRequest request,
+            @Parameter(description = "Resource object to be created", required = true) String data) {
+
+        String url = request.getMethod() + " " + request.getRequestURI();
+        log.debug("replaceVNF: Start handle request of {}", url);
+        User modifier = new User();
+        modifier.setUserId(userId);
+        log.debug("replaceVNF:modifier id is {}", userId);
+        validateNotEmptyBody(data);
+
+        Either<ReplaceVNFInfo, ResponseFormat> convertResponse = parseToReplaceVNFInfo(data, modifier);
+        if (convertResponse.isRight()) {
+            throw new ByResponseFormatComponentException(convertResponse.right().value());
+        }
+
+        log.debug("replaceVNF:get ReplaceVNFInfo success");
+
+        String containerComponentType = "services";
+        ReplaceVNFInfo replaceVNFInfo = convertResponse.left().value();
+        String serviceUniqueId = replaceVNFInfo.getServiceUniqueId();
+        String abstractResourceUniqueId = replaceVNFInfo.getAbstractResourceUniqueId();
+        
+        ComponentInstance componentInstance = replaceVNFInfo.getRealVNFComponentInstance();
+        log.debug("replaceVNF:get ReplaceVNFInfo,serviceUniqueId:{},abstractResourceUniqueId:{}",
+                serviceUniqueId,abstractResourceUniqueId);
+        try {
+            /**
+             * delete vnf
+             */
+            ComponentTypeEnum componentTypeEnum = ComponentTypeEnum.findByParamName(containerComponentType);
+            if (componentInstanceBusinessLogic == null) {
+                log.debug("replaceVNF:Unsupported component type {}", containerComponentType);
+                return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.UNSUPPORTED_ERROR, containerComponentType));
+            }
+            Either<ComponentInstance, ResponseFormat> componentInstanceEither = componentInstanceBusinessLogic.deleteAbstractComponentInstance(containerComponentType, serviceUniqueId, abstractResourceUniqueId, userId);
+            if (componentInstanceEither.isRight()) {
+                log.debug("replaceVNF:delete Abstract ComponentInstance field");
+                return buildErrorResponse(componentInstanceEither.right().value());
+            }
+            /**
+             * add vnf
+             */
+            log.debug("replaceVNF,start add vnf");
+            componentInstance.setInvariantName(null);
+            componentInstance.setCreatedFrom(CreatedFrom.UI);
+
+            Either<ComponentInstance, ResponseFormat> realComponentInstance = componentInstanceBusinessLogic.createRealComponentInstance(containerComponentType, serviceUniqueId, userId, componentInstance);
+            if (realComponentInstance.isRight()) {
+                log.debug("replaceVNF:filed to add vnf");
+                return buildErrorResponse(realComponentInstance.right().value());
+            }
+            ComponentInstance newComponentInstance = realComponentInstance.left().value();
+            log.debug("replaceVNF:success to add vnf");
+            
+            return buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK), newComponentInstance);
+        } catch (Exception e) {
+            BeEcompErrorManager.getInstance().logBeRestApiGeneralError("replaceVNF");
+            log.debug("replaceVNF with exception", e);
+            throw e;
+        }
+    }
+
+    private Either<ReplaceVNFInfo, ResponseFormat> parseToReplaceVNFInfo(String serviceJson, User user) {
+        log.debug("enter parseToReplaceVNFInfo,get serviceJson:{}",serviceJson);
+        return getComponentsUtils().convertJsonToObjectUsingObjectMapper(serviceJson, user, ReplaceVNFInfo.class, AuditingActionEnum.CREATE_RESOURCE, ComponentTypeEnum.SERVICE);
+    }
+
 }
index 3a341f1..168a70a 100644 (file)
@@ -32,11 +32,15 @@ import io.swagger.v3.oas.annotations.servers.Server;
 import io.swagger.v3.oas.annotations.servers.Servers;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.tags.Tags;
+import java.io.File;
 import org.apache.http.HttpStatus;
+import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
+import org.glassfish.jersey.media.multipart.FormDataParam;
 import org.json.JSONException;
 import org.json.JSONObject;
 import org.openecomp.sdc.be.components.impl.ComponentInstanceBusinessLogic;
 import org.openecomp.sdc.be.components.impl.CsarValidationUtils;
+import org.openecomp.sdc.be.components.impl.ElementBusinessLogic;
 import org.openecomp.sdc.be.components.impl.ImportUtils;
 import org.openecomp.sdc.be.components.impl.ResourceBusinessLogic;
 import org.openecomp.sdc.be.components.impl.ResourceImportManager;
@@ -53,6 +57,8 @@ import org.openecomp.sdc.be.model.Resource;
 import org.openecomp.sdc.be.model.UploadResourceInfo;
 import org.openecomp.sdc.be.model.User;
 import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum;
+import org.openecomp.sdc.be.resources.data.auditing.model.DistributionData;
+import org.openecomp.sdc.be.resources.data.auditing.model.ResourceCommonInfo;
 import org.openecomp.sdc.be.servlets.ResourceUploadServlet.ResourceAuthorityTypeEnum;
 import org.openecomp.sdc.be.user.UserBusinessLogic;
 import org.openecomp.sdc.common.api.Constants;
@@ -594,4 +600,97 @@ public class ResourcesServlet extends AbstractValidationsServlet {
             throw e;
         }
     }
+
+    @POST
+    @Path("/resources/importReplaceResource")
+    @Produces(MediaType.APPLICATION_JSON)
+    @Operation(description = "Import Resource", method = "POST", summary = "Returns imported resource", responses = {
+            @ApiResponse(responseCode = "201", description = "Resource created"),
+            @ApiResponse(responseCode = "403", description = "Restricted operation"),
+            @ApiResponse(responseCode = "400", description = "Invalid content / Missing content"),
+            @ApiResponse(responseCode = "409", description = "Resource already exist")})
+    @PermissionAllowed(AafPermission.PermNames.INTERNAL_ALL_VALUE)
+    public Response importReplaceResource(
+            @Parameter(description = "The user id",
+                    required = true) @HeaderParam(value = Constants.USER_ID_HEADER) String userId,
+            @Parameter(description = "X-ECOMP-RequestID header",
+                    required = false) @HeaderParam(value = Constants.X_ECOMP_REQUEST_ID_HEADER) String requestId,
+            @Parameter(description = "X-ECOMP-InstanceID header", required = true) @HeaderParam(
+                    value = Constants.X_ECOMP_INSTANCE_ID_HEADER) final String instanceIdHeader,
+            @Parameter(description = "Determines the format of the body of the response",
+                    required = false) @HeaderParam(value = Constants.ACCEPT_HEADER) String accept,
+            @Parameter(description = "The username and password",
+                    required = true) @HeaderParam(value = Constants.AUTHORIZATION_HEADER) String authorization,
+            @Context final HttpServletRequest request,
+            @Parameter(description = "FileInputStream")
+            @FormDataParam("resourceZip") File file,
+            @Parameter(description = "ContentDisposition")
+            @FormDataParam("resourceZip") FormDataContentDisposition contentDispositionHeader,
+            @Parameter(description = "resourceMetadata")
+            @FormDataParam("resourceZipMetadata") String resourceInfoJsonString) {
+
+        init();
+
+        String requestURI = request.getRequestURI();
+        String url = request.getMethod() + " " + requestURI;
+        log.debug("importReplaceResource,Start handle request of {}", url);
+
+        // get modifier id
+        User modifier = new User();
+        modifier.setUserId(userId);
+        log.debug("importReplaceResource,modifier id is {}", userId);
+
+        log.debug("importReplaceResource,get file:{},fileName:{}", file, file.getName());
+
+        Response response;
+        ResponseFormat responseFormat = null;
+        AuditingActionEnum auditingActionEnum = AuditingActionEnum.Import_Replace_Resource;
+        String assetType = "resources";
+
+        ComponentTypeEnum componentType = ComponentTypeEnum.findByParamName(assetType);
+        ResourceCommonInfo resourceCommonInfo = new ResourceCommonInfo(componentType.getValue());
+        DistributionData distributionData = new DistributionData(instanceIdHeader, requestURI);
+        // Mandatory
+        if (instanceIdHeader == null || instanceIdHeader.isEmpty()) {
+            log.debug("importReplaceResource: Missing X-ECOMP-InstanceID header");
+            responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.MISSING_X_ECOMP_INSTANCE_ID);
+            getComponentsUtils().auditExternalGetAsset(responseFormat, auditingActionEnum, distributionData,
+                    resourceCommonInfo, requestId, null);
+            return buildErrorResponse(responseFormat);
+        }
+
+        try {
+            Wrapper<Response> responseWrapper = new Wrapper<>();
+            // file import
+            Wrapper<User> userWrapper = new Wrapper<>();
+            Wrapper<UploadResourceInfo> uploadResourceInfoWrapper = new Wrapper<>();
+            Wrapper<String> yamlStringWrapper = new Wrapper<>();
+
+            ResourceAuthorityTypeEnum serviceAuthorityEnum = ResourceAuthorityTypeEnum.CSAR_TYPE_BE;
+
+            // PayLoad Validations
+            commonGeneralValidations(responseWrapper, userWrapper, uploadResourceInfoWrapper, serviceAuthorityEnum, userId, resourceInfoJsonString);
+
+            fillPayload(responseWrapper, uploadResourceInfoWrapper, yamlStringWrapper, modifier, resourceInfoJsonString, serviceAuthorityEnum, file);
+
+            specificResourceAuthorityValidations(responseWrapper, uploadResourceInfoWrapper, yamlStringWrapper, userWrapper.getInnerElement(), request, resourceInfoJsonString, serviceAuthorityEnum);
+
+            log.debug("importReplaceResource:get payload:{}", uploadResourceInfoWrapper.getInnerElement().getPayloadData());
+
+            log.debug("importReplaceResource:get ResourceType:{}",
+                    uploadResourceInfoWrapper.getInnerElement().getResourceType());
+
+            if (responseWrapper.isEmpty()) {
+                log.debug("importReplaceService:start handleImport");
+                handleImport(responseWrapper, userWrapper.getInnerElement(), uploadResourceInfoWrapper.getInnerElement(), yamlStringWrapper.getInnerElement(), serviceAuthorityEnum, true, null);
+            }
+
+            return responseWrapper.getInnerElement();
+        } catch (ZipException e) {
+            BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Import Resource");
+            log.debug("import resource failed with exception", e);
+            response = buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
+            return response;
+        }
+    }
 }
index 5292f6e..57a2956 100644 (file)
@@ -35,8 +35,13 @@ import io.swagger.v3.oas.annotations.servers.Server;
 import io.swagger.v3.oas.annotations.servers.Servers;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.tags.Tags;
+import java.io.File;
+import java.io.FileNotFoundException;
 import org.apache.http.HttpStatus;
+import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
+import org.glassfish.jersey.media.multipart.FormDataParam;
 import org.openecomp.sdc.be.components.impl.ComponentInstanceBusinessLogic;
+import org.openecomp.sdc.be.components.impl.ElementBusinessLogic;
 import org.openecomp.sdc.be.components.impl.ResourceBusinessLogic;
 import org.openecomp.sdc.be.components.impl.ResourceImportManager;
 import org.openecomp.sdc.be.components.impl.ServiceBusinessLogic;
@@ -46,15 +51,21 @@ import org.openecomp.sdc.be.components.impl.exceptions.ByResponseFormatComponent
 import org.openecomp.sdc.be.config.BeEcompErrorManager;
 import org.openecomp.sdc.be.dao.api.ActionStatus;
 import org.openecomp.sdc.be.datamodel.ServiceRelations;
+import org.openecomp.sdc.be.datatypes.components.ServiceMetadataDataDefinition;
 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
 import org.openecomp.sdc.be.impl.ComponentsUtils;
 import org.openecomp.sdc.be.impl.ServletUtils;
+import org.openecomp.sdc.be.model.Component;
 import org.openecomp.sdc.be.model.DistributionStatusEnum;
 import org.openecomp.sdc.be.model.GroupInstanceProperty;
 import org.openecomp.sdc.be.model.Resource;
 import org.openecomp.sdc.be.model.Service;
+import org.openecomp.sdc.be.model.UploadServiceInfo;
 import org.openecomp.sdc.be.model.User;
 import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum;
+import org.openecomp.sdc.be.resources.data.auditing.model.DistributionData;
+import org.openecomp.sdc.be.resources.data.auditing.model.ResourceCommonInfo;
+import org.openecomp.sdc.be.servlets.ServiceUploadServlet.ServiceAuthorityTypeEnum;
 import org.openecomp.sdc.be.user.UserBusinessLogic;
 import org.openecomp.sdc.common.api.Constants;
 import org.openecomp.sdc.common.datastructure.Wrapper;
@@ -62,6 +73,7 @@ import org.openecomp.sdc.common.log.elements.LoggerSupportability;
 import org.openecomp.sdc.common.log.enums.LoggerSupportabilityActions;
 import org.openecomp.sdc.common.log.enums.StatusCode;
 import org.openecomp.sdc.common.log.wrappers.Logger;
+import org.openecomp.sdc.common.zip.exception.ZipException;
 import org.openecomp.sdc.exception.ResponseFormat;
 import org.springframework.stereotype.Controller;
 
@@ -93,6 +105,7 @@ import java.util.Map;
 @Controller
 public class ServiceServlet extends AbstractValidationsServlet {
 
+    private final ElementBusinessLogic elementBusinessLogic;
     private static final Logger log = Logger.getLogger(ServiceServlet.class);
     private static final LoggerSupportability loggerSupportability = LoggerSupportability.getLogger(ServiceServlet.class.getName());
 
@@ -107,9 +120,10 @@ public class ServiceServlet extends AbstractValidationsServlet {
         ComponentsUtils componentsUtils, ServletUtils servletUtils,
         ResourceImportManager resourceImportManager,
         ServiceBusinessLogic serviceBusinessLogic,
-        ResourceBusinessLogic resourceBusinessLogic) {
+        ResourceBusinessLogic resourceBusinessLogic, ElementBusinessLogic elementBusinessLogic) {
         super(userBusinessLogic, componentInstanceBL, componentsUtils, servletUtils, resourceImportManager);
         this.serviceBusinessLogic = serviceBusinessLogic;
+        this.elementBusinessLogic = elementBusinessLogic;
     }
 
     @POST
@@ -723,4 +737,181 @@ public class ServiceServlet extends AbstractValidationsServlet {
             throw e;
         }
     }
+
+    @POST
+    @Path("/services/importService")
+    @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_JSON)
+    @Operation(description = "Import Service", method = "POST", summary = "Returns imported service", responses = {
+    @ApiResponse(responseCode = "201", description = "Service created"), @ApiResponse(responseCode = "403", description = "Restricted operation"), @ApiResponse(responseCode = "400", description = "Invalid content / Missing content"), @ApiResponse(responseCode = "409", description = "Service already exist")})
+    public Response importNsService(@Parameter(description = "Service object to be imported", required = true) String data, @Context final HttpServletRequest request, @HeaderParam(value = Constants.USER_ID_HEADER) String userId) {
+
+        userId = (userId != null) ? userId : request.getHeader(Constants.USER_ID_HEADER);
+        initSpringFromContext();
+
+        String url = request.getMethod() + " " + request.getRequestURI();
+        log.debug("Start handle request of {}" , url);
+
+        // get modifier id
+        User modifier = new User();
+        modifier.setUserId(userId);
+        log.debug("modifier id is {}", userId);
+
+        Response response;
+        try {
+
+            Wrapper<Response> responseWrapper = new Wrapper<>();
+            performUIImport(responseWrapper, data, request, userId, null);
+            return responseWrapper.getInnerElement();
+        } catch (IOException | ZipException e) {
+            BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Import Service");
+            log.debug("import service failed with exception", e);
+            response = buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
+            return response;
+        }
+    }
+
+    private void performUIImport(Wrapper<Response> responseWrapper, String data, final HttpServletRequest request, String userId, String ServiceUniqueId)
+        throws FileNotFoundException, ZipException {
+
+        Wrapper<User> userWrapper = new Wrapper<>();
+        Wrapper<UploadServiceInfo> uploadServiceInfoWrapper = new Wrapper<>();
+        Wrapper<String> yamlStringWrapper = new Wrapper<>();
+
+        ServiceAuthorityTypeEnum ServiceAuthorityEnum = ServiceAuthorityTypeEnum.USER_TYPE_UI;
+
+        commonServiceGeneralValidations(responseWrapper, userWrapper, uploadServiceInfoWrapper, ServiceAuthorityEnum, userId, data);
+
+        specificServiceAuthorityValidations(responseWrapper, uploadServiceInfoWrapper, yamlStringWrapper, userWrapper.getInnerElement(), request, data, ServiceAuthorityEnum);
+
+        if (responseWrapper.isEmpty()) {
+            handleImportService(responseWrapper, userWrapper.getInnerElement(), uploadServiceInfoWrapper.getInnerElement(), yamlStringWrapper.getInnerElement(), ServiceAuthorityEnum, true, ServiceUniqueId);
+        }
+    }
+
+    /**import ReplaceService 
+     *
+     * @param userId
+     * @param requestId
+     * @param instanceIdHeader
+     * @param accept
+     * @param authorization
+     * @param request
+     * @param file
+     * @param contentDispositionHeader
+     * @param serviceInfoJsonString
+     * @param uuid
+     * @return
+     */
+    @POST
+    @Path("/services/serviceUUID/{uuid}/importReplaceService")
+    @Produces(MediaType.APPLICATION_JSON)
+    @Operation(description = "Import Service", method = "POST", summary = "Returns imported service", responses = {
+            @ApiResponse(responseCode = "201", description = "Service created"),
+            @ApiResponse(responseCode = "403", description = "Restricted operation"),
+            @ApiResponse(responseCode = "400", description = "Invalid content / Missing content"),
+            @ApiResponse(responseCode = "409", description = "Service already exist")})
+    @PermissionAllowed(AafPermission.PermNames.INTERNAL_ALL_VALUE)
+    public Response importReplaceService(
+            @Parameter(description = "The user id",
+                    required = true) @HeaderParam(value = Constants.USER_ID_HEADER) String userId,
+            @Parameter(description = "X-ECOMP-RequestID header",
+                    required = false) @HeaderParam(value = Constants.X_ECOMP_REQUEST_ID_HEADER) String requestId,
+            @Parameter(description = "X-ECOMP-InstanceID header", required = true) @HeaderParam(
+                    value = Constants.X_ECOMP_INSTANCE_ID_HEADER) final String instanceIdHeader,
+            @Parameter(description = "Determines the format of the body of the response",
+                    required = false) @HeaderParam(value = Constants.ACCEPT_HEADER) String accept,
+            @Parameter(description = "The username and password",
+                    required = true) @HeaderParam(value = Constants.AUTHORIZATION_HEADER) String authorization,
+            @Context final HttpServletRequest request,
+            @Parameter(description = "FileInputStream")
+            @FormDataParam("serviceZip") File file,
+            @Parameter(description = "ContentDisposition")
+            @FormDataParam("serviceZip") FormDataContentDisposition contentDispositionHeader,
+            @Parameter(description = "serviceMetadata")
+            @FormDataParam("serviceZipMetadata") String serviceInfoJsonString,
+            @Parameter(description = "The requested asset uuid",
+                    required = true) @PathParam("uuid") final String uuid) {
+
+        initSpringFromContext();
+
+        String requestURI = request.getRequestURI();
+        String url = request.getMethod() + " " + requestURI;
+        log.debug("importReplaceService,Start handle request of {}", url);
+
+        // get modifier id
+        User modifier = new User();
+        modifier.setUserId(userId);
+        log.debug("importReplaceService,modifier id is {}", userId);
+
+        log.debug("importReplaceService,get file:{},fileName:{}",file,file.getName());
+
+        Response response;
+        ResponseFormat responseFormat =null;
+        AuditingActionEnum auditingActionEnum = AuditingActionEnum.Import_Replace_Service;
+        String assetType = "services";
+
+        Either<List<? extends Component>, ResponseFormat> assetTypeData = elementBusinessLogic.getCatalogComponentsByUuidAndAssetType(assetType, uuid);
+
+        if (assetTypeData.isRight() || assetTypeData.left().value().size() != 1) {
+            log.debug("getServiceAbstractStatus: Service Fetching Failed");
+            throw new ByResponseFormatComponentException(assetTypeData.right().value());
+        }
+
+        log.debug("getServiceAbstractStatus: Service Fetching Success");
+
+        Service oldService = (Service) assetTypeData.left().value().get(0);
+
+        ComponentTypeEnum componentType = ComponentTypeEnum.findByParamName(assetType);
+        ResourceCommonInfo resourceCommonInfo = new ResourceCommonInfo(componentType.getValue());
+        DistributionData distributionData = new DistributionData(instanceIdHeader, requestURI);
+        // Mandatory
+        if (instanceIdHeader == null || instanceIdHeader.isEmpty()) {
+            log.debug("importReplaceService: Missing X-ECOMP-InstanceID header");
+            responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.MISSING_X_ECOMP_INSTANCE_ID);
+            getComponentsUtils().auditExternalGetAsset(responseFormat, auditingActionEnum, distributionData,
+                    resourceCommonInfo, requestId, null);
+            return buildErrorResponse(responseFormat);
+        }
+
+        try {
+            Wrapper<Response> responseWrapper = new Wrapper<>();
+            // file import
+            Wrapper<User> userWrapper = new Wrapper<>();
+            Wrapper<UploadServiceInfo> uploadServiceInfoWrapper = new Wrapper<>();
+            Wrapper<String> yamlStringWrapper = new Wrapper<>();
+
+            ServiceUploadServlet.ServiceAuthorityTypeEnum serviceAuthorityEnum = ServiceUploadServlet.ServiceAuthorityTypeEnum.CSAR_TYPE_BE;
+
+            // PayLoad Validations
+            commonServiceGeneralValidations(responseWrapper, userWrapper, uploadServiceInfoWrapper, serviceAuthorityEnum, userId, serviceInfoJsonString);
+
+            fillServicePayload(responseWrapper, uploadServiceInfoWrapper, yamlStringWrapper, modifier, serviceInfoJsonString, serviceAuthorityEnum, file);
+
+            specificServiceAuthorityValidations(responseWrapper, uploadServiceInfoWrapper, yamlStringWrapper, userWrapper.getInnerElement(), request, serviceInfoJsonString, serviceAuthorityEnum);
+
+            log.debug("importReplaceService:get payload:{}", uploadServiceInfoWrapper.getInnerElement().getPayloadData());
+
+            ServiceMetadataDataDefinition serviceMetadataDataDefinition = (ServiceMetadataDataDefinition)oldService.getComponentMetadataDefinition().getMetadataDataDefinition();
+
+            uploadServiceInfoWrapper.getInnerElement().setServiceVendorModelNumber(serviceMetadataDataDefinition.getServiceVendorModelNumber());
+            uploadServiceInfoWrapper.getInnerElement().setDescription(oldService.getDescription());
+            uploadServiceInfoWrapper.getInnerElement().setCategories(oldService.getCategories());
+            uploadServiceInfoWrapper.getInnerElement().setIcon(oldService.getIcon());
+            uploadServiceInfoWrapper.getInnerElement().setProjectCode(oldService.getProjectCode());
+
+
+            if (responseWrapper.isEmpty()) {
+                log.debug("importReplaceService:start handleImportService");
+                handleImportService(responseWrapper, userWrapper.getInnerElement(), uploadServiceInfoWrapper.getInnerElement(), yamlStringWrapper.getInnerElement(), serviceAuthorityEnum, true, null);
+            }
+
+            return responseWrapper.getInnerElement();
+        } catch (IOException | ZipException e) {
+            BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Import Service");
+            log.debug("import service failed with exception", e);
+            response = buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
+            return response;
+        }
+    }
 }
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/servlets/ServiceUploadServlet.java b/catalog-be/src/main/java/org/openecomp/sdc/be/servlets/ServiceUploadServlet.java
new file mode 100644 (file)
index 0000000..2855685
--- /dev/null
@@ -0,0 +1,129 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdc.be.servlets;
+
+import com.jcabi.aspects.Loggable;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.responses.ApiResponse;
+import io.swagger.v3.oas.annotations.servers.Server;
+import io.swagger.v3.oas.annotations.servers.Servers;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.tags.Tags;
+import java.io.File;
+import javax.inject.Singleton;
+import javax.servlet.ServletContext;
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DefaultValue;
+import javax.ws.rs.HeaderParam;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
+import org.glassfish.jersey.media.multipart.FormDataParam;
+import org.openecomp.sdc.be.components.impl.ComponentInstanceBusinessLogic;
+import org.openecomp.sdc.be.components.impl.ResourceImportManager;
+import org.openecomp.sdc.be.components.impl.ServiceImportManager;
+import org.openecomp.sdc.be.config.BeEcompErrorManager;
+import org.openecomp.sdc.be.dao.api.ActionStatus;
+import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
+import org.openecomp.sdc.be.impl.ComponentsUtils;
+import org.openecomp.sdc.be.impl.ServletUtils;
+import org.openecomp.sdc.be.impl.WebAppContextWrapper;
+import org.openecomp.sdc.be.model.UploadServiceInfo;
+import org.openecomp.sdc.be.model.User;
+import org.openecomp.sdc.be.user.UserBusinessLogic;
+import org.openecomp.sdc.common.api.Constants;
+import org.openecomp.sdc.common.datastructure.Wrapper;
+import org.openecomp.sdc.common.log.wrappers.Logger;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.context.WebApplicationContext;
+
+/**
+ * Root service (exposed at "/" path)
+ */
+
+//upload Service model by Shiyong1989@hotmail.com
+@Loggable(prepend = true, value = Loggable.DEBUG, trim = false)
+@Path("/v1/catalog/uploadservice")
+@Tags({@Tag(name = "SDC Internal APIs")})
+@Singleton
+
+public class ServiceUploadServlet extends AbstractValidationsServlet {
+
+    private static final Logger log = Logger.getLogger(ServiceUploadServlet.class);
+    public static final String NORMATIVE_TYPE_SERVICE = "multipart";
+    public static final String CSAR_TYPE_SERVICE = "csar";
+    public static final String USER_TYPE_SERVICE = "user-service";
+    public static final String USER_TYPE_SERVICE_UI_IMPORT = "user-servcie-ui-import";
+
+    public ServiceUploadServlet(UserBusinessLogic userBusinessLogic,
+        ComponentInstanceBusinessLogic componentInstanceBL,
+        ComponentsUtils componentsUtils, ServletUtils servletUtils,
+        ResourceImportManager resourceImportManager) {
+        super(userBusinessLogic, componentInstanceBL, componentsUtils, servletUtils, resourceImportManager);
+    }
+
+    public enum ServiceAuthorityTypeEnum {
+        NORMATIVE_TYPE_BE(NORMATIVE_TYPE_SERVICE, true, false), USER_TYPE_BE(USER_TYPE_SERVICE, true, true),
+        USER_TYPE_UI(USER_TYPE_SERVICE_UI_IMPORT, false, true), CSAR_TYPE_BE(CSAR_TYPE_SERVICE, true, true);
+
+        private String urlPath;
+        private boolean isBackEndImport, isUserTypeService;
+
+        public static ServiceAuthorityTypeEnum findByUrlPath(String urlPath) {
+            ServiceAuthorityTypeEnum found = null;
+            for (ServiceAuthorityTypeEnum curr : ServiceAuthorityTypeEnum.values()) {
+                if (curr.getUrlPath().equals(urlPath)) {
+                    found = curr;
+                    break;
+                }
+            }
+            return found;
+        }
+
+        private ServiceAuthorityTypeEnum(String urlPath, boolean isBackEndImport, boolean isUserTypeService) {
+            this.urlPath = urlPath;
+            this.isBackEndImport = isBackEndImport;
+            this.isUserTypeService = isUserTypeService;
+        }
+
+        public String getUrlPath() {
+            return urlPath;
+        }
+
+        public boolean isBackEndImport() {
+            return isBackEndImport;
+        }
+
+        public boolean isUserTypeService() {
+            return isUserTypeService;
+        }
+    }
+}
+
index 1f33a24..e19ea21 100644 (file)
@@ -25,6 +25,7 @@ import static org.openecomp.sdc.be.tosca.ComponentCache.MergeStrategy.overwriteI
 
 import fj.F;
 import fj.data.Either;
+import java.text.SimpleDateFormat;
 import io.vavr.Tuple2;
 import io.vavr.control.Try;
 import io.vavr.control.Option;
@@ -34,6 +35,7 @@ import java.io.File;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Date;
 import java.util.EnumMap;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -43,6 +45,7 @@ import java.util.Map.Entry;
 import java.util.Objects;
 import java.util.Optional;
 import java.util.Set;
+import java.util.TimeZone;
 import java.util.function.Function;
 import java.util.function.Predicate;
 import java.util.function.Supplier;
@@ -150,6 +153,8 @@ public class CsarUtils {
     private static final String TOSCA_META_PATH_FILE_NAME = "TOSCA-Metadata/TOSCA.meta";
     private static final String TOSCA_META_VERSION = "1.0";
     private static final String CSAR_VERSION = "1.1";
+    // add manifest
+       private static final String Service_Manifest = "NS.mf";
     public static final String ARTIFACTS = "Artifacts";
     private static final String DEFINITION = "Definitions";
     private static final String DEL_PATTERN = "([/\\\\]+)";
@@ -270,6 +275,9 @@ public class CsarUtils {
         String fileName = artifactDef.getArtifactName();
         zip.putNextEntry(new ZipEntry(DEFINITIONS_PATH + fileName));
         zip.write(mainYaml);
+               
+        LifecycleStateEnum lifecycleState = component.getLifecycleState();
+        addServiceMf(component, zip, lifecycleState, isInCertificationRequest, fileName, mainYaml);
 
         //US798487 - Abstraction of complex types
         if (!ModelConverter.isAtomicComponent(component)){
@@ -317,6 +325,41 @@ public class CsarUtils {
         return writeAllFilesToCsar(component, collectedComponentCsarDefinition.left().value(), zip, isInCertificationRequest);
     }
 
+    private void addServiceMf(Component component, ZipOutputStream zip, LifecycleStateEnum lifecycleState, boolean isInCertificationRequest, String fileName, byte[] mainYaml) throws IOException{
+        // add mf
+        if((component.getComponentType() == ComponentTypeEnum.SERVICE) && (lifecycleState != LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT)){
+            String serviceName = component.getName();
+            String createdBy = component.getCreatorUserId();
+            String serviceVersion;
+            if(isInCertificationRequest){
+                int tmp = Integer.valueOf(component.getVersion().split("\\.")[0]) + 1;
+                serviceVersion = String.valueOf(tmp) + ".0";
+            }
+            else{
+                serviceVersion = component.getVersion();
+            }
+
+            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss'Z'");
+            format.setTimeZone(TimeZone.getTimeZone("UTC"));
+            //String createDate = format.format(new Date(component.getCreationDate()));
+            Date date = new Date();
+            String releaseTime = format.format(date);
+
+            if (component.getCategories() == null || component.getCategories().get(0) == null){
+                return;
+            }
+
+            String serviceType = component.getCategories().get(0).getName();
+            String description = component.getDescription();
+            String serviceTemplate = DEFINITIONS_PATH + fileName;
+            String hash = GeneralUtility.calculateMD5Base64EncodedByByteArray(mainYaml);
+            String nsMfBlock0 = createNsMfBlock0(serviceName, createdBy, serviceVersion, releaseTime, serviceType, description, serviceTemplate, hash);
+            byte[] nsMfBlock0Byte = nsMfBlock0.getBytes();
+            zip.putNextEntry(new ZipEntry(Service_Manifest));
+            zip.write(nsMfBlock0Byte);
+        }
+    }
+
     private Either<ToscaRepresentation, ResponseFormat> fetchToscaRepresentation(
         Component component,
         boolean getFromCS,
@@ -748,6 +791,24 @@ public class CsarUtils {
         final String block0template = "TOSCA-Meta-File-Version: %s\nCSAR-Version: %s\nCreated-By: %s\nEntry-Definitions: Definitions/%s\n\nName: csar.meta\nContent-Type: text/plain\n";
         return String.format(block0template, metaFileVersion, csarVersion, createdBy, entryDef);
     }
+       
+    private String createNsMfBlock0(String serviceName, String createdBy, String serviceVersion, String releaseTime,
+        String serviceType, String description, String serviceTemplate, String hash) {
+        final String block0template = "metadata??\n" +
+            "ns_product_name: %s\n" +
+            "ns_provider_id: %s\n" +
+            "ns_package_version: %s\n" +
+            //"ns_create_date_time: %s\n" +
+            "ns_release_data_time: %s\n" +
+            "ns_type: %s\n" +
+            "ns_package_description: %s\n\n" +
+            "Source: %s\n" +
+            "Algorithm: MD5\n" +
+            "Hash: %s\n\n";
+        return String
+            .format(block0template, serviceName, createdBy, serviceVersion, releaseTime, serviceType, description,
+                serviceTemplate, hash);
+    }
 
     /**
      * Extracts artifacts of VFCs from CSAR
index 902d789..5b03b63 100644 (file)
@@ -38,7 +38,7 @@ public class ToscaUtils {
     public static boolean isNotComplexVfc(Component component) {
         if (ComponentTypeEnum.RESOURCE == component.getComponentType()) {
             ResourceTypeEnum resourceType = ((ResourceMetadataDataDefinition) component.getComponentMetadataDefinition().getMetadataDataDefinition()).getResourceType();
-            if (ResourceTypeEnum.CVFC == resourceType) {
+            if (ResourceTypeEnum.CVFC == resourceType ) {
                 return false;
             }
         }
diff --git a/catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/ServiceImportBusinessLogicTest.java b/catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/ServiceImportBusinessLogicTest.java
new file mode 100644 (file)
index 0000000..02e145e
--- /dev/null
@@ -0,0 +1,1890 @@
+/*
+
+ * Copyright (c) 2018 AT&T Intellectual Property.
+
+ *
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+
+ * you may not use this file except in compliance with the License.
+
+ * You may obtain a copy of the License at
+
+ *
+
+ *     http://www.apache.org/licenses/LICENSE-2.0
+
+ *
+
+ * Unless required by applicable law or agreed to in writing, software
+
+ * distributed under the License is distributed on an "AS IS" BASIS,
+
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+ * See the License for the specific language governing permissions and
+
+ * limitations under the License.
+
+ */
+
+package org.openecomp.sdc.be.components.impl;
+
+
+import fj.data.Either;
+import io.cucumber.java.hu.Ha;
+import org.apache.commons.codec.binary.Base64;
+import org.apache.commons.collections.map.HashedMap;
+import org.apache.commons.lang3.tuple.ImmutablePair;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.sdc.be.auditing.impl.AuditingManager;
+import org.openecomp.sdc.be.components.csar.CsarBusinessLogic;
+import org.openecomp.sdc.be.components.csar.CsarInfo;
+import org.openecomp.sdc.be.components.impl.artifact.ArtifactOperationInfo;
+import org.openecomp.sdc.be.components.impl.exceptions.ComponentException;
+import org.openecomp.sdc.be.components.impl.utils.CreateServiceFromYamlParameter;
+import org.openecomp.sdc.be.dao.api.ActionStatus;
+import org.openecomp.sdc.be.dao.janusgraph.JanusGraphOperationStatus;
+import org.openecomp.sdc.be.datatypes.components.ComponentMetadataDataDefinition;
+import org.openecomp.sdc.be.datatypes.components.ResourceMetadataDataDefinition;
+import org.openecomp.sdc.be.datatypes.elements.AttributeDataDefinition;
+import org.openecomp.sdc.be.datatypes.elements.GetInputValueDataDefinition;
+import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
+import org.openecomp.sdc.be.datatypes.enums.ResourceTypeEnum;
+import org.openecomp.sdc.be.externalapi.servlet.ArtifactExternalServlet;
+import org.openecomp.sdc.be.impl.ComponentsUtils;
+import org.openecomp.sdc.be.impl.ServletUtils;
+import org.openecomp.sdc.be.info.NodeTypeInfoToUpdateArtifacts;
+import org.openecomp.sdc.be.model.*;
+import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ToscaOperationFacade;
+import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
+import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum;
+import org.openecomp.sdc.be.servlets.AbstractValidationsServlet;
+import org.openecomp.sdc.be.tosca.CsarUtils;
+import org.openecomp.sdc.be.user.UserBusinessLogic;
+import org.openecomp.sdc.common.api.ArtifactGroupTypeEnum;
+import org.openecomp.sdc.common.api.ArtifactTypeEnum;
+import org.openecomp.sdc.common.api.Constants;
+import org.openecomp.sdc.exception.ResponseFormat;
+
+import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.nio.file.FileSystems;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.*;
+
+import static org.assertj.core.api.Java6Assertions.assertThat;
+import static org.junit.Assert.*;
+import static org.mockito.Mockito.*;
+
+public class ServiceImportBusinessLogicTest extends ServiceImportBussinessLogicBaseTestSetup {
+    private final static String DEFAULT_ICON = "defaulticon";
+
+    @InjectMocks
+    static ServiceImportBusinessLogic serviceImportBusinessLogic;
+    @Mock
+    private ServiceBusinessLogic serviceBusinessLogic;
+    @Mock
+    private CsarBusinessLogic csarBusinessLogic;
+    @Mock
+    private ToscaOperationFacade toscaOperationFacade;
+    @Mock
+    private ServiceImportParseLogic serviceImportParseLogic;
+    @Mock
+    ArtifactDefinition artifactDefinition =new ArtifactDefinition();
+
+    private static UserBusinessLogic userBusinessLogic = Mockito.mock(UserBusinessLogic.class);
+    private static ComponentInstanceBusinessLogic componentInstanceBusinessLogic = Mockito.mock(ComponentInstanceBusinessLogic.class);
+    private static ComponentsUtils componentsUtils = new ComponentsUtils(Mockito.mock(AuditingManager.class));
+    private static ServletUtils servletUtils = mock(ServletUtils.class);
+    private static ResourceImportManager resourceImportManager = mock(ResourceImportManager.class);
+    private static ArtifactsBusinessLogic artifactsBusinessLogic = mock(ArtifactsBusinessLogic.class);
+
+    private static AbstractValidationsServlet servlet = new ArtifactExternalServlet(userBusinessLogic,
+            componentInstanceBusinessLogic, componentsUtils, servletUtils, resourceImportManager, artifactsBusinessLogic);
+
+    @Before
+    public void initMocks() {
+        MockitoAnnotations.initMocks(this);
+        when(artifactDefinition.getMandatory()).thenReturn(true);
+        when(artifactDefinition.getArtifactName()).thenReturn("creatorFullName");
+        when(artifactDefinition.getArtifactType()).thenReturn("TOSCA_CSAR");
+
+        sIB1.setServiceBusinessLogic(serviceBusinessLogic);
+        sIB1.setCsarBusinessLogic(csarBusinessLogic);
+        sIB1.setServiceImportParseLogic(serviceImportParseLogic);
+        sIB1.setToscaOperationFacade(toscaOperationFacade);
+
+    }
+
+    @Test
+    public void testGetComponentsUtils() {
+        ComponentsUtils result;
+        result = serviceImportBusinessLogic.getComponentsUtils();
+    }
+
+    @Test
+    public void testSetComponentsUtils() {
+        ComponentsUtils componentsUtils = null;
+
+        serviceImportBusinessLogic.setComponentsUtils(componentsUtils);
+    }
+
+    @Test
+    public void testCreateService() {
+        Service oldService = createServiceObject(false);
+        String payloadName = "valid_vf";
+        Map<String, byte[]> payload = crateCsarFromPayload();
+        Service newService = createServiceObject(true);
+        try {
+            when(serviceBusinessLogic.validateServiceBeforeCreate(newService,user,AuditingActionEnum.CREATE_RESOURCE))
+                    .thenReturn(Either.left(newService));
+            when(toscaOperationFacade.validateCsarUuidUniqueness(payloadName)).thenReturn(StorageOperationStatus.OK);
+            sIB1.createService(oldService, AuditingActionEnum.CREATE_RESOURCE, user, payload, payloadName);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testCreateServiceFromCsar(){
+        Service oldService = createServiceObject(false);
+        String csarUUID = "valid_vf";
+        Map<String, byte[]> payload = crateCsarFromPayload();
+        try {
+            sIB1.createServiceFromCsar(oldService, user, payload, csarUUID);
+        }catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testCreateServiceFromYaml(){
+        Service oldService = createServiceObject(false);
+        String topologyTemplateYaml = getMainTemplateContent("service_import_template.yml");;
+        String yamlName = "group.yml";
+        Map<String, NodeTypeInfo> nodeTypesInfo = new HashedMap();
+        CsarInfo csarInfo =getCsarInfo();
+        Map<String, EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<ArtifactDefinition>>> nodeTypesArtifactsToCreate = new HashMap<>();
+        String nodeName = "org.openecomp.resource.derivedFrom.zxjTestImportServiceAb.test";
+        try {
+            sIB1.createServiceFromYaml(oldService,topologyTemplateYaml,yamlName,nodeTypesInfo,
+                    csarInfo,nodeTypesArtifactsToCreate,true,true,nodeName);
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testCreateServiceAndRIsFromYaml(){
+        Service oldService = createServiceObject(false);
+        Map<String, EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<ArtifactDefinition>>> nodeTypesArtifactsToCreate = new HashMap<>();
+        CreateServiceFromYamlParameter csfyp = getCsfyp();
+        try {
+            sIB1.createServiceAndRIsFromYaml(oldService,false,nodeTypesArtifactsToCreate,true,true,csfyp);
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testCreateOrUpdateArtifacts(){
+        ArtifactsBusinessLogic.ArtifactOperationEnum operation = ArtifactsBusinessLogic.ArtifactOperationEnum.UPDATE;
+        List<ArtifactDefinition> createdArtifacts = new ArrayList<>();
+        String yamlFileName = "group.yml";
+        CsarInfo csarInfo =getCsarInfo();
+        Resource preparedResource = createParseResourceObject(false);
+        preparedResource.setResourceType(ResourceTypeEnum.VF);
+        String nodeName = "org.openecomp.resource.derivedFrom.zxjTestImportServiceAb.test";
+        Map<String, EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<ArtifactDefinition>>> nodeTypesArtifactsToHandle= new HashMap<>();
+        EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<ArtifactDefinition>> enumListEnumMap =
+                new EnumMap<>(ArtifactsBusinessLogic.ArtifactOperationEnum.class);
+        List<ArtifactDefinition> artifactDefinitions = new ArrayList<>();
+        ArtifactDefinition artifactDefinition = new ArtifactDefinition();
+        artifactDefinition.setArtifactName("artifactName");
+        artifactDefinitions.add(artifactDefinition);
+        enumListEnumMap.put(ArtifactsBusinessLogic.ArtifactOperationEnum.CREATE,
+                artifactDefinitions);
+        nodeTypesArtifactsToHandle.put(nodeName,enumListEnumMap);
+        NodeTypeInfoToUpdateArtifacts nodeTypeInfoToUpdateArtifacts = new NodeTypeInfoToUpdateArtifacts(nodeName,nodeTypesArtifactsToHandle);
+        nodeTypeInfoToUpdateArtifacts.setNodeName(nodeName);
+        nodeTypeInfoToUpdateArtifacts.setNodeTypesArtifactsToHandle(nodeTypesArtifactsToHandle);
+
+        try {
+            sIB1.createOrUpdateArtifacts(operation,createdArtifacts,yamlFileName,csarInfo,
+                    preparedResource,nodeTypeInfoToUpdateArtifacts,true,true);
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testHandleVfCsarArtifacts(){
+        Resource resource = createParseResourceObject(false);
+        CsarInfo csarInfo = getCsarInfo();
+        List<ArtifactDefinition> createdArtifacts = new ArrayList<>();
+        ArtifactOperationInfo artifactOperation = new ArtifactOperationInfo(true,true, ArtifactsBusinessLogic.ArtifactOperationEnum.UPDATE);
+        try {
+            sIB1.handleVfCsarArtifacts(resource,csarInfo,createdArtifacts,artifactOperation,true,true);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testCreateOrUpdateSingleNonMetaArtifactToComstants(){
+        Resource resource = createParseResourceObject(false);
+        CsarInfo csarInfo = getCsarInfo();
+        ArtifactOperationInfo artifactOperation = new ArtifactOperationInfo(true,true, ArtifactsBusinessLogic.ArtifactOperationEnum.UPDATE);
+        Map<String, ArtifactDefinition> deploymentArtifacts = new HashMap<>();
+        ArtifactDefinition artifactDefinition = new ArtifactDefinition();
+        artifactDefinition.setArtifactName("artifactDefinition");
+        deploymentArtifacts.put("deploymentArtifacts",artifactDefinition);
+        resource.setDeploymentArtifacts(deploymentArtifacts);
+        try {
+            sIB1.createOrUpdateSingleNonMetaArtifactToComstants(resource,csarInfo,artifactOperation,true,true);
+        }catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+
+    @Test
+    public void testCreateOrUpdateNonMetaArtifacts(){
+        CsarInfo csarInfo = getCsarInfo();
+        Resource resource = createParseResourceObject(false);
+        List<ArtifactDefinition> createdArtifacts = new ArrayList<>();
+        ArtifactOperationInfo artifactOperation = new ArtifactOperationInfo(true,true, ArtifactsBusinessLogic.ArtifactOperationEnum.UPDATE);
+
+        Either<Resource, ResponseFormat> result = sIB1.createOrUpdateNonMetaArtifacts(csarInfo, resource,
+                createdArtifacts, true, true, artifactOperation);
+        assertEquals(result.left().value(),resource);
+    }
+
+    @Test
+    public void testFindVfCsarArtifactsToHandle(){
+        Resource resource = createParseResourceObject(false);
+        Map<String, ArtifactDefinition> deploymentArtifacts = new HashMap<>();
+        ArtifactDefinition artifactDefinition = new ArtifactDefinition();
+        artifactDefinition.setArtifactName("artifactDefinition");
+        deploymentArtifacts.put("deploymentArtifacts",artifactDefinition);
+        Map<String, ArtifactDefinition> artifacts = new HashMap<>();
+        artifacts.put("artifacts",artifactDefinition);
+        List<GroupDefinition> groups = new ArrayList<>();
+        GroupDefinition groupDefinition = new GroupDefinition();
+        groupDefinition.setUniqueId("groupDefinitionUniqueId");
+        groupDefinition.setName("groupDefinition");
+        groups.add(groupDefinition);
+        resource.setDeploymentArtifacts(deploymentArtifacts);
+        resource.setArtifacts(artifacts);
+        resource.setGroups(groups);
+        List<CsarUtils.NonMetaArtifactInfo> artifactPathAndNameList = new ArrayList<>();
+
+        Either<EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<CsarUtils.NonMetaArtifactInfo>>,
+                ResponseFormat> result = sIB1.findVfCsarArtifactsToHandle(resource,artifactPathAndNameList,user);
+        assertNotNull(result.left().value());
+    }
+
+
+    @Test
+    public void testIsNonMetaArtifact() {
+        ArtifactDefinition artifactDefinition =new ArtifactDefinition();
+        artifactDefinition.setMandatory(false);
+        artifactDefinition.setArtifactName("creatorFullName");
+        artifactDefinition.setArtifactType("TOSCA_CSAR");
+
+        boolean nonMetaArtifact = sIB1.isNonMetaArtifact(artifactDefinition);
+        assertTrue(nonMetaArtifact);
+
+    }
+
+    @Test
+    public void testOrganizeVfCsarArtifactsByArtifactOperation(){
+        List<CsarUtils.NonMetaArtifactInfo> artifactPathAndNameList = new ArrayList<>();
+        artifactPathAndNameList.add(getNonMetaArtifactInfo());
+        List<ArtifactDefinition> existingArtifactsToHandle = new ArrayList<>();
+        ArtifactDefinition artifactDefinition = new ArtifactDefinition();
+        artifactDefinition.setArtifactName("artifactName");
+        artifactDefinition.setArtifactType(ArtifactTypeEnum.AAI_SERVICE_MODEL.name());
+        artifactDefinition.setArtifactChecksum("artifactChecksum");
+        existingArtifactsToHandle.add(artifactDefinition);
+        Resource resource = createParseResourceObject(false);
+
+        Either<EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<CsarUtils.NonMetaArtifactInfo>>, ResponseFormat>
+                enumMapResponseFormatEither = sIB1.organizeVfCsarArtifactsByArtifactOperation(artifactPathAndNameList, existingArtifactsToHandle, resource, user);
+        assertNotNull(enumMapResponseFormatEither.left().value());
+    }
+
+    @Test
+    public void testProcessCsarArtifacts(){
+        CsarInfo csarInfo = getCsarInfo();
+        Resource resource = createParseResourceObject(false);
+        List<ArtifactDefinition> createdArtifacts = new ArrayList<>();
+        Either<Resource, ResponseFormat> resStatus = null;
+        List<CsarUtils.NonMetaArtifactInfo> artifactPathAndNameList = new ArrayList<>();
+        artifactPathAndNameList.add(getNonMetaArtifactInfo());
+        EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<CsarUtils.NonMetaArtifactInfo>> vfCsarArtifactsToHandle = new
+                EnumMap<>(ArtifactsBusinessLogic.ArtifactOperationEnum.class);
+        vfCsarArtifactsToHandle.put(ArtifactsBusinessLogic.ArtifactOperationEnum.CREATE,artifactPathAndNameList);
+        Either<Resource, ResponseFormat> rrfe = sIB1.processCsarArtifacts(csarInfo,
+                resource, createdArtifacts, true, true, resStatus, vfCsarArtifactsToHandle);
+        assertNull(rrfe);
+    }
+
+    @Test
+    public void testCreateOrUpdateSingleNonMetaArtifact(){
+        Resource resource = createParseResourceObject(false);
+        CsarInfo csarInfo = getCsarInfo();
+        Map<String, byte[]> csar = csarInfo.getCsar();
+        String rootPath = System.getProperty("user.dir");
+        Path path;
+        byte[] data = new byte[0];
+        path = Paths.get(rootPath + "/src/test/resources/valid_vf.csar");
+        try {
+            data = Files.readAllBytes(path);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        csar.put("valid_vf.csar",data);
+        String artifactPath = "valid_vf.csar", artifactFileName = "", artifactType = "";
+        ArtifactGroupTypeEnum artifactGroupType = ArtifactGroupTypeEnum.TOSCA;
+        String artifactLabel = "", artifactDisplayName = "", artifactDescription = "", artifactId = "artifactId";
+        ArtifactOperationInfo artifactOperation = new ArtifactOperationInfo(true,true, ArtifactsBusinessLogic.ArtifactOperationEnum.UPDATE);
+        List<ArtifactDefinition> createdArtifacts = new ArrayList<>();
+        try {
+            sIB1.createOrUpdateSingleNonMetaArtifact(resource, csarInfo, artifactPath, artifactFileName, artifactType, artifactGroupType,
+                    artifactLabel, artifactDisplayName, artifactDescription, artifactId, artifactOperation, createdArtifacts,
+                    true, true, true);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testHandleNodeTypeArtifacts(){
+        Resource nodeTypeResource = createParseResourceObject(false);
+        ResourceMetadataDataDefinition componentMetadataDataDefinition = new ResourceMetadataDataDefinition();
+        componentMetadataDataDefinition.setState(LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT.name());
+        ComponentMetadataDefinition componentMetadataDefinition = new ComponentMetadataDefinition(componentMetadataDataDefinition);
+        nodeTypeResource.setComponentMetadataDefinition(componentMetadataDefinition);
+        Map<ArtifactsBusinessLogic.ArtifactOperationEnum, List<ArtifactDefinition>> nodeTypeArtifactsToHandle = new HashMap<>();
+        List<ArtifactDefinition> artifactDefinitions = new ArrayList<>();
+        ArtifactDefinition artifactDefinition = new ArtifactDefinition();
+        artifactDefinition.setArtifactName("artifactName");
+        artifactDefinitions.add(artifactDefinition);
+        nodeTypeArtifactsToHandle.put(ArtifactsBusinessLogic.ArtifactOperationEnum.CREATE,
+                artifactDefinitions);
+
+        List<ArtifactDefinition> createdArtifacts = new ArrayList<>();
+        try {
+            sIB1.handleNodeTypeArtifacts(nodeTypeResource, nodeTypeArtifactsToHandle,
+                    createdArtifacts, user, true, true);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+
+    @Test
+    public void testCreateOrUpdateServiceArtifacts(){
+        ArtifactsBusinessLogic.ArtifactOperationEnum operation = ArtifactsBusinessLogic.ArtifactOperationEnum.UPDATE;
+        List<ArtifactDefinition> createdArtifacts = new ArrayList<>();
+        String yamlFileName = "group.yml";
+        CsarInfo csarInfo =getCsarInfo();
+        Service preparedService = createServiceObject(false);
+        Map<String, ArtifactDefinition> deploymentArtifacts = new HashMap<>();
+        ArtifactDefinition artifactDefinition = new ArtifactDefinition();
+        artifactDefinition.setArtifactName("artifactDefinition");
+        deploymentArtifacts.put("deploymentArtifacts",artifactDefinition);
+        preparedService.setDeploymentArtifacts(deploymentArtifacts);
+        String nodeName = "org.openecomp.resource.derivedFrom.zxjTestImportServiceAb.test";
+        Map<String, EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<ArtifactDefinition>>> nodeTypesArtifactsToHandle= new HashMap<>();
+        NodeTypeInfoToUpdateArtifacts nodeTypeInfoToUpdateArtifacts = new NodeTypeInfoToUpdateArtifacts(nodeName,nodeTypesArtifactsToHandle);
+
+        try {
+            sIB1.createOrUpdateArtifacts(operation,createdArtifacts,yamlFileName,csarInfo,
+                    preparedService,nodeTypeInfoToUpdateArtifacts,true,true);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testHandleVfCsarServiceArtifacts(){
+        Service service = createServiceObject(true);
+        Map<String, ArtifactDefinition> deploymentArtifacts = new HashMap<>();
+        ArtifactDefinition artifactDefinition = new ArtifactDefinition();
+        artifactDefinition.setArtifactName(Constants.VENDOR_LICENSE_MODEL);
+        artifactDefinition.setUniqueId("uniqueId");
+        deploymentArtifacts.put("deploymentArtifacts",artifactDefinition);
+        service.setDeploymentArtifacts(deploymentArtifacts);
+        CsarInfo csarInfo = getCsarInfo();
+        List<ArtifactDefinition> createdArtifacts = new ArrayList<>();
+        ArtifactOperationInfo artifactOperation = new ArtifactOperationInfo(true,true, ArtifactsBusinessLogic.ArtifactOperationEnum.CREATE);
+        try {
+            sIB1.handleVfCsarArtifacts(service,csarInfo,createdArtifacts,artifactOperation,true,true);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testCreateOrUpdateNonMetaServiceArtifacts(){
+        CsarInfo csarInfo = getCsarInfo();
+        Service service = createServiceObject(true);
+        List<ArtifactDefinition> createdArtifacts = new ArrayList<>();
+        ArtifactOperationInfo artifactOperation = new ArtifactOperationInfo(true,true, ArtifactsBusinessLogic.ArtifactOperationEnum.CREATE);
+
+        Either<Service, ResponseFormat> result = sIB1.createOrUpdateNonMetaArtifacts(csarInfo,
+                service, createdArtifacts, true, true, artifactOperation);
+        assertEquals(result.left().value(),service);
+    }
+
+    @Test
+    public void testFindServiceCsarArtifactsToHandle(){
+        Service service = createServiceObject(true);
+        Map<String, ArtifactDefinition> deploymentArtifacts = new HashMap<>();
+        ArtifactDefinition artifactDefinition = new ArtifactDefinition();
+        artifactDefinition.setArtifactName("artifactDefinition");
+        deploymentArtifacts.put("deploymentArtifacts",artifactDefinition);
+        Map<String, ArtifactDefinition> artifacts = new HashMap<>();
+        artifacts.put("artifacts",artifactDefinition);
+        List<GroupDefinition> groups = new ArrayList<>();
+        GroupDefinition groupDefinition = new GroupDefinition();
+        groupDefinition.setUniqueId("groupDefinitionUniqueId");
+        groupDefinition.setName("groupDefinition");
+        groups.add(groupDefinition);
+        service.setDeploymentArtifacts(deploymentArtifacts);
+        service.setArtifacts(artifacts);
+        service.setGroups(groups);
+        List<CsarUtils.NonMetaArtifactInfo> artifactPathAndNameList = new ArrayList<>();
+
+        Either<EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<CsarUtils.NonMetaArtifactInfo>>,
+                ResponseFormat> result = sIB1.findVfCsarArtifactsToHandle(service, artifactPathAndNameList, user);
+        assertNotNull(result.left().value());
+    }
+
+    @Test
+    public void testOrganizeVfCsarArtifactsByServiceArtifactOperation(){
+        List<CsarUtils.NonMetaArtifactInfo> artifactPathAndNameList = new ArrayList<>();
+        artifactPathAndNameList.add(getNonMetaArtifactInfo());
+        List<ArtifactDefinition> existingArtifactsToHandle = new ArrayList<>();
+        ArtifactDefinition artifactDefinition = new ArtifactDefinition();
+        artifactDefinition.setArtifactName("artifactName");
+        artifactDefinition.setArtifactType(ArtifactTypeEnum.AAI_SERVICE_MODEL.name());
+        artifactDefinition.setArtifactChecksum("artifactChecksum");
+        existingArtifactsToHandle.add(artifactDefinition);
+        Service service = createServiceObject(true);
+
+        Either<EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<CsarUtils.NonMetaArtifactInfo>>, ResponseFormat>
+                enumMapResponseFormatEither = sIB1.organizeVfCsarArtifactsByArtifactOperation(artifactPathAndNameList,
+                existingArtifactsToHandle, service, user);
+        assertNotNull(enumMapResponseFormatEither.left().value());
+    }
+
+    @Test
+    public void testProcessServiceCsarArtifacts(){
+        CsarInfo csarInfo = getCsarInfo();
+        Service service = createServiceObject(true);
+        List<ArtifactDefinition> createdArtifacts = new ArrayList<>();
+        Either<Service, ResponseFormat> resStatus = null;
+        EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<CsarUtils.NonMetaArtifactInfo>> vfCsarArtifactsToHandle = new
+                EnumMap<>(ArtifactsBusinessLogic.ArtifactOperationEnum.class);
+        Either<Service, ResponseFormat> srfe = sIB1.processCsarArtifacts(csarInfo,
+                service, createdArtifacts, true, true, resStatus, vfCsarArtifactsToHandle);
+        assertNull(srfe);
+    }
+
+    @Test
+    public void testGetValidArtifactNames(){
+        CsarInfo csarInfo = getCsarInfo();
+        Map<String, Set<List<String>>> collectedWarningMessages = new HashMap<>();
+        Either<List<CsarUtils.NonMetaArtifactInfo>, String> result = sIB1.getValidArtifactNames(csarInfo, collectedWarningMessages);
+        System.out.println(result.left().value());
+        assertNotNull(result.left().value());
+    }
+
+    @Test
+    public void testCreateOrUpdateSingleNonMetaServiceArtifact(){
+        Service service = createServiceObject(true);
+        CsarInfo csarInfo = getCsarInfo();
+        String rootPath = System.getProperty("user.dir");
+        Path path = Paths.get(rootPath + "/src/test/resources/valid_vf.csar");
+        String artifactPath = path.toString(), artifactFileName = "", artifactType = "";
+        ArtifactGroupTypeEnum artifactGroupType = ArtifactGroupTypeEnum.TOSCA;
+        String artifactLabel = "", artifactDisplayName = "", artifactDescription = "", artifactId = "artifactId";
+        ArtifactOperationInfo artifactOperation = new ArtifactOperationInfo(true,true, ArtifactsBusinessLogic.ArtifactOperationEnum.UPDATE);
+        List<ArtifactDefinition> createdArtifacts = new ArrayList<>();
+        try {
+            sIB1.createOrUpdateSingleNonMetaArtifact(service, csarInfo, artifactPath, artifactFileName, artifactType, artifactGroupType,
+                    artifactLabel, artifactDisplayName, artifactDescription, artifactId, artifactOperation, createdArtifacts,
+                    true, true, true);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testCreateGroupsOnResource(){
+        Service service = createServiceObject(true);
+        Map<String, GroupDefinition> groups = getGroups();
+
+        try {
+            Either<Service, ResponseFormat> result = sIB1.createGroupsOnResource(service, groups);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testUpdateGroupsMembersUsingResource(){
+        Service service = createServiceObject(true);
+        Map<String, GroupDefinition> groups = null;
+
+        List<GroupDefinition> groupDefinitions = sIB1.updateGroupsMembersUsingResource(groups, service);
+        for (GroupDefinition groupDefinition : groupDefinitions) {
+            assertNull(groupDefinition);
+        }
+    }
+
+    @Test
+    public void testCreateRIAndRelationsFromResourceYaml(){
+        String yamlName = "group.yml";
+        Resource resource = createParseResourceObject(true);
+        Map<String, UploadComponentInstanceInfo> uploadComponentInstanceInfoMap = new HashMap<>();
+        String topologyTemplateYaml = getMainTemplateContent();
+        List<ArtifactDefinition> nodeTypesNewCreatedArtifacts = new ArrayList<>();
+        Map<String, NodeTypeInfo> nodeTypesInfo = new HashMap<>();
+        CsarInfo csarInfo = getCsarInfo();
+        Map<String, EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<ArtifactDefinition>>> nodeTypesArtifactsToCreate = new HashMap<>();
+        String nodeName = "org.openecomp.resource.derivedFrom.zxjTestImportServiceAb.test";
+
+        try {
+            sIB1.createRIAndRelationsFromYaml(yamlName,resource,uploadComponentInstanceInfoMap,topologyTemplateYaml,nodeTypesNewCreatedArtifacts,
+                    nodeTypesInfo,csarInfo,nodeTypesArtifactsToCreate,nodeName);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+
+    @Test
+    public void testCreateResourceInstancesRelations(){
+        String yamlName = "group.yml";
+        Resource resource = createParseResourceObject(true);
+        resource.setComponentInstances(creatComponentInstances());
+        resource.setResourceType(ResourceTypeEnum.VF);
+        Map<String, UploadComponentInstanceInfo> uploadResInstancesMap = new HashMap<>();
+        uploadResInstancesMap.put("uploadResInstancesMap",getuploadComponentInstanceInfo());
+
+        try {
+            sIB1.createResourceInstancesRelations(user,yamlName,resource,uploadResInstancesMap);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testProcessComponentInstance1(){
+        String yamlName = "group.yml";
+        Resource resource = createParseResourceObject(true);
+        Resource originResource = createParseResourceObject(false);
+        List<ComponentInstance> componentInstancesList = creatComponentInstances();
+        Either<Map<String, DataTypeDefinition>, JanusGraphOperationStatus> allDataTypes = null;
+        Map<String, List<ComponentInstanceProperty>> instProperties = new HashMap<>();
+        Map<ComponentInstance, Map<String, List<CapabilityDefinition>>> instCapabilties = new HashMap<>();
+        Map<ComponentInstance, Map<String, List<RequirementDefinition>>> instRequirements = new HashMap<>();
+        Map<String, Map<String, ArtifactDefinition>> instDeploymentArtifacts = new HashMap<>();
+        Map<String, Map<String, ArtifactDefinition>> instArtifacts = new HashMap<>();
+        Map<String, List< AttributeDataDefinition >> instAttributes = new HashMap<>();
+        Map<String, Resource> originCompMap = new HashMap<>();
+        originCompMap.put("componentUid",originResource);
+        Map<String, List<ComponentInstanceInput>> instInputs = new HashMap<>();
+        UploadComponentInstanceInfo uploadComponentInstanceInfo = new UploadComponentInstanceInfo();
+        uploadComponentInstanceInfo.setName("zxjTestImportServiceAb");
+
+        try {
+            sIB1.processComponentInstance(yamlName, resource, componentInstancesList,allDataTypes,instProperties,instCapabilties,instRequirements,
+                    instDeploymentArtifacts,instArtifacts,instAttributes,originCompMap,instInputs,uploadComponentInstanceInfo);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testAddInputsValuesToRi(){
+        UploadComponentInstanceInfo uploadComponentInstanceInfo = new UploadComponentInstanceInfo();
+        Map<String, List<UploadPropInfo>> properties = new HashMap<>();
+        List<UploadPropInfo> uploadPropInfoList = new ArrayList<>();
+        UploadPropInfo uploadPropInfo = new UploadPropInfo();
+        uploadPropInfo.setName("uploadPropInfo");
+        uploadPropInfoList.add(uploadPropInfo);
+        uploadPropInfoList.add(uploadPropInfo);
+        properties.put("propertiesMap",uploadPropInfoList);
+        uploadComponentInstanceInfo.setProperties(properties);
+        Resource resource = createParseResourceObject(true);
+        Resource originResource =createParseResourceObject(false);
+        List<InputDefinition> inputs = new ArrayList<>();
+        InputDefinition inputDefinition = new InputDefinition();
+        inputDefinition.setUniqueId("uniqueId");
+        inputs.add(inputDefinition);
+        originResource.setInputs(inputs);
+        ComponentInstance currentCompInstance = new ComponentInstance();
+        Map<String, List<ComponentInstanceInput>> instInputs = new HashMap<>();
+        Map<String, DataTypeDefinition> allDataTypes = new HashMap<>();
+
+        try {
+            sIB1.addInputsValuesToRi(uploadComponentInstanceInfo,resource,originResource,
+                    currentCompInstance,instInputs,allDataTypes);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testProcessProperty(){
+        Resource resource = createParseResourceObject(true);
+        List<InputDefinition> inputs = new ArrayList<>();
+        InputDefinition inputDefinition = new InputDefinition();
+        inputDefinition.setUniqueId("uniqueId");
+        inputs.add(inputDefinition);
+        resource.setInputs(inputs);
+        ComponentInstance currentCompInstance = null;
+        Map<String, DataTypeDefinition> allDataTypes = new HashMap<>();
+        Map<String, InputDefinition> currPropertiesMap = new HashMap<>();
+        inputDefinition.setType("inputDefinitionType");
+        currPropertiesMap.put("propertyInfoName",inputDefinition);
+        List<ComponentInstanceInput> instPropList = new ArrayList<>();
+        List<UploadPropInfo> propertyList = getPropertyList();
+
+        try {
+            sIB1.processProperty(resource, currentCompInstance, allDataTypes,
+                    currPropertiesMap, instPropList, propertyList);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testHandleSubstitutionMappings(){
+        Resource resource = createParseResourceObject(true);
+        resource.setResourceType(ResourceTypeEnum.VF);
+        Map<String, UploadComponentInstanceInfo> uploadResInstancesMap = new HashMap<>();
+
+        try {
+            sIB1.handleSubstitutionMappings(resource, uploadResInstancesMap);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testCreateResourceInstances(){
+        String yamlName = "group.yml";
+        Resource resource = createParseResourceObject(true);
+        Resource originResource = createParseResourceObject(false);
+        Map<String, UploadComponentInstanceInfo> uploadResInstancesMap = new HashMap<>();
+        UploadComponentInstanceInfo nodesInfoValue = new UploadComponentInstanceInfo();
+        nodesInfoValue.setName("zxjTestImportServiceAb");
+        nodesInfoValue.setRequirements(gerRequirements());
+        uploadResInstancesMap.put("uploadComponentInstanceInfo", nodesInfoValue);
+        Map<String, Resource> nodeNamespaceMap = new HashMap<>();
+        nodeNamespaceMap.put("resources",originResource);
+
+        try {
+            sIB1.createResourceInstances(yamlName,resource,uploadResInstancesMap,nodeNamespaceMap);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testHandleNodeTypes(){
+        String yamlName = "group.yml";
+        Resource resource = createParseResourceObject(true);
+        String topologyTemplateYaml = getMainTemplateContent();
+        boolean needLock = true;
+        Map<String, EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<ArtifactDefinition>>> nodeTypesArtifactsToHandle = new HashMap<>();
+        List<ArtifactDefinition> nodeTypesNewCreatedArtifacts = new ArrayList<>();
+        Map<String, NodeTypeInfo> nodeTypesInfo = new HashMap<>();
+        NodeTypeInfo nodeTypeInfo = new NodeTypeInfo();
+        nodeTypeInfo.setNested(false);
+        String nodeName = "org.openecomp.resource.derivedFrom.zxjTestImportServiceAb.test";
+        nodeTypesInfo.put(nodeName,nodeTypeInfo);
+        CsarInfo csarInfo = getCsarInfo();
+
+        try {
+            sIB1.handleNodeTypes(yamlName,resource,topologyTemplateYaml,needLock,
+                    nodeTypesArtifactsToHandle,nodeTypesNewCreatedArtifacts,nodeTypesInfo,
+                    csarInfo,nodeName);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testHandleNestedVfc1(){
+        String nodeName = "org.openecomp.resource.derivedFrom.zxjTestImportServiceAb.test";
+        Resource resource = createParseResourceObject(false);
+        Map<String, EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<ArtifactDefinition>>> nodeTypesArtifactsToHandle = new HashMap<>();
+        List<ArtifactDefinition> createdArtifacts = new ArrayList<>();
+        Map<String, NodeTypeInfo> nodesInfo = new HashMap<>();
+        NodeTypeInfo nodeTypeInfo = new NodeTypeInfo();
+        nodeTypeInfo.setTemplateFileName("groups.yml");
+        nodeTypeInfo.setMappedToscaTemplate(new HashMap<>());
+        nodesInfo.put(nodeName,nodeTypeInfo);
+        CsarInfo csarInfo = getCsarInfo();
+
+        try {
+            sIB1.handleNestedVfc(resource,nodeTypesArtifactsToHandle,createdArtifacts,
+                    nodesInfo,csarInfo,nodeName);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testHandleComplexVfc1(){
+        Resource resource = createParseResourceObject(true);
+        Map<String, EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<ArtifactDefinition>>> nodeTypesArtifactsToHandle = new HashMap<>();
+        List<ArtifactDefinition> createdArtifacts = new ArrayList<>();
+        Map<String, NodeTypeInfo> nodesInfo = new HashMap<>();
+        CsarInfo csarInfo = getCsarInfo();
+        String nodeName = "org.openecomp.resource.derivedFrom.zxjTestImportServiceAb.test";
+        String yamlName = "group.yml";
+
+        try {
+            sIB1.handleComplexVfc(resource,nodeTypesArtifactsToHandle,createdArtifacts,
+                    nodesInfo,csarInfo,nodeName,yamlName);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testCreateResourcesFromYamlNodeTypesList1(){
+        String yamlName = "group.yml";
+        Resource resource = createParseResourceObject(false);
+        Map<String, Object> mappedToscaTemplate = new HashMap<>();
+        boolean needLock = true;
+        Map<String, EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<ArtifactDefinition>>> nodeTypesArtifactsToHandle = new HashMap<>();
+        List<ArtifactDefinition> nodeTypesNewCreatedArtifacts = new ArrayList<>();
+        Map<String, NodeTypeInfo> nodeTypesInfo = new HashMap<>();
+        CsarInfo csarInfo = getCsarInfo();
+
+        try {
+            sIB1.createResourcesFromYamlNodeTypesList(yamlName,resource,mappedToscaTemplate,
+                    needLock, nodeTypesArtifactsToHandle,nodeTypesNewCreatedArtifacts,
+                    nodeTypesInfo,csarInfo);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testCreateNodeTypes1(){
+        String yamlName = "group.yml";
+        Resource resource = createParseResourceObject(false);
+        boolean needLock = true;
+        Map<String, EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<ArtifactDefinition>>> nodeTypesArtifactsToHandle = new HashMap<>();
+        EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<ArtifactDefinition>> enumListEnumMap =
+                new EnumMap<>(ArtifactsBusinessLogic.ArtifactOperationEnum.class);
+        List<ArtifactDefinition> artifactDefinitions = new ArrayList<>();
+        ArtifactDefinition artifactDefinition = new ArtifactDefinition();
+        artifactDefinition.setArtifactName("artifactName");
+        artifactDefinitions.add(artifactDefinition);
+        enumListEnumMap.put(ArtifactsBusinessLogic.ArtifactOperationEnum.CREATE,
+                artifactDefinitions);
+        nodeTypesArtifactsToHandle.put("nodeTyp",enumListEnumMap);
+        List<ArtifactDefinition> nodeTypesNewCreatedArtifacts = new ArrayList<>();
+        Map<String, NodeTypeInfo> nodeTypesInfo = new HashMap<>();
+        NodeTypeInfo nodeTypeInfo = new NodeTypeInfo();
+        nodeTypesInfo.put("nodeTyp",nodeTypeInfo);
+        CsarInfo csarInfo = getCsarInfo();
+        Map<String, Object> mapToConvert =new HashMap<>();
+        Map<String, Object> nodeTypes =new HashMap<>();
+        nodeTypes.put("nodeTyp",nodeTypeInfo);
+
+        try {
+            sIB1.createNodeTypes(yamlName, resource, needLock, nodeTypesArtifactsToHandle,
+                    nodeTypesNewCreatedArtifacts, nodeTypesInfo, csarInfo, mapToConvert,
+                    nodeTypes);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testCreateNodeTypeResourceFromYaml(){
+        String yamlName = "group.yml";
+        String nodeName = "org.openecomp.resource.derivedFrom.zxjTestImportServiceAb.test";
+        Map<String,Object> nodeMap = new HashMap<>();
+        nodeMap.put(nodeName,getGroupsYaml());
+        Map.Entry<String, Object> nodeNameValue = nodeMap.entrySet().iterator().next();
+        Map<String, Object> mapToConvert = new HashedMap();
+        Resource resourceVf = createParseResourceObject(false);
+        boolean needLock = true;
+        Map<ArtifactsBusinessLogic.ArtifactOperationEnum, List<ArtifactDefinition>> nodeTypeArtifactsToHandle = new HashMap<>();
+        List<ArtifactDefinition> nodeTypesNewCreatedArtifacts = new ArrayList<>();
+        boolean forceCertificationAllowed = true;
+        CsarInfo csarInfo = getCsarInfo();
+        boolean isNested = true;
+
+        try {
+            sIB1.createNodeTypeResourceFromYaml(yamlName,nodeNameValue,user,mapToConvert,resourceVf,
+                    needLock,nodeTypeArtifactsToHandle,nodeTypesNewCreatedArtifacts,
+                    forceCertificationAllowed,csarInfo,isNested);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testCreateRIAndRelationsFromYaml(){
+        String yamlName = "group.yml";
+        Service service = createServiceObject(true);
+        Map<String, UploadComponentInstanceInfo> uploadComponentInstanceInfoMap = new HashMap<>();
+        String topologyTemplateYaml = getMainTemplateContent("service_import_template.yml");;
+        List<ArtifactDefinition> nodeTypesNewCreatedArtifacts = new ArrayList<>();
+        Map<String, NodeTypeInfo> nodeTypesInfo = new HashMap<>();
+        CsarInfo csarInfo = getCsarInfo();
+        Map<String, EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<ArtifactDefinition>>> nodeTypesArtifactsToCreate = new HashMap<>();
+        String nodeName = "org.openecomp.resource.derivedFrom.zxjTestImportServiceAb.test";
+        try {
+            sIB1.createRIAndRelationsFromYaml(yamlName,service,uploadComponentInstanceInfoMap,topologyTemplateYaml,nodeTypesNewCreatedArtifacts,
+                    nodeTypesInfo,csarInfo,nodeTypesArtifactsToCreate,nodeName);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testCreateServiceInstancesRelations(){
+        String yamlName = "group.yml";
+        Service service = createServiceObject(true);
+        service.setComponentInstances(creatComponentInstances());
+        Map<String, UploadComponentInstanceInfo> uploadResInstancesMap = new HashMap<>();
+        uploadResInstancesMap.put("uploadResInstancesMap",getuploadComponentInstanceInfo());
+
+        try {
+            sIB1.createServiceInstancesRelations(user, yamlName, service, uploadResInstancesMap);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testProcessComponentInstance(){
+        String yamlName = "group.yml";
+        Service service = createServiceObject(true);
+        Resource originResource = createParseResourceObject(false);
+        List<ComponentInstance> componentInstancesList = creatComponentInstances();
+        Either<Map<String, DataTypeDefinition>, JanusGraphOperationStatus> allDataTypes = null;
+        Map<String, List<ComponentInstanceProperty>> instProperties = new HashMap<>();
+        Map<ComponentInstance, Map<String, List<CapabilityDefinition>>> instCapabilties = new HashMap<>();
+        Map<ComponentInstance, Map<String, List<RequirementDefinition>>> instRequirements = new HashMap<>();
+        Map<String, Map<String, ArtifactDefinition>> instDeploymentArtifacts = new HashMap<>();
+        Map<String, Map<String, ArtifactDefinition>> instArtifacts = new HashMap<>();
+        Map<String, List< AttributeDataDefinition >> instAttributes = new HashMap<>();
+        Map<String, Resource> originCompMap = new HashMap<>();
+        originCompMap.put("componentUid",originResource);
+        Map<String, List<ComponentInstanceInput>> instInputs = new HashMap<>();
+        UploadComponentInstanceInfo uploadComponentInstanceInfo = new UploadComponentInstanceInfo();
+        uploadComponentInstanceInfo.setName("zxjTestImportServiceAb");
+
+        try {
+            sIB1.processComponentInstance(yamlName, service, componentInstancesList,allDataTypes,instProperties,instCapabilties,instRequirements,
+                    instDeploymentArtifacts,instArtifacts,instAttributes,originCompMap,instInputs,uploadComponentInstanceInfo);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testAddInputsValuesToRi2(){
+        UploadComponentInstanceInfo uploadComponentInstanceInfo = new UploadComponentInstanceInfo();
+        Map<String, List<UploadPropInfo>> properties = new HashMap<>();
+        List<UploadPropInfo> uploadPropInfoList = new ArrayList<>();
+        UploadPropInfo uploadPropInfo = new UploadPropInfo();
+        uploadPropInfo.setName("uploadPropInfo");
+        uploadPropInfoList.add(uploadPropInfo);
+        uploadPropInfoList.add(uploadPropInfo);
+        properties.put("propertiesMap",uploadPropInfoList);
+        uploadComponentInstanceInfo.setProperties(properties);
+        Service resource = createServiceObject(true);
+        Resource originResource =createParseResourceObject(false);
+        List<InputDefinition> inputs = new ArrayList<>();
+        InputDefinition inputDefinition = new InputDefinition();
+        inputDefinition.setUniqueId("uniqueId");
+        inputs.add(inputDefinition);
+        originResource.setInputs(inputs);
+        ComponentInstance currentCompInstance = new ComponentInstance();
+        Map<String, List<ComponentInstanceInput>> instInputs = new HashMap<>();
+        Map<String, DataTypeDefinition> allDataTypes = new HashMap<>();
+
+        try {
+            sIB1.addInputsValuesToRi(uploadComponentInstanceInfo,resource,originResource,
+                        currentCompInstance,instInputs,allDataTypes);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testProcessProperty2(){
+        Service resource = createServiceObject(true);
+        ComponentInstance currentCompInstance = null;
+        Map<String, DataTypeDefinition> allDataTypes = new HashMap<>();
+        Map<String, InputDefinition> currPropertiesMap = new HashMap<>();
+        InputDefinition inputDefinition = new InputDefinition();
+        inputDefinition.setType("inputDefinitionType");
+        currPropertiesMap.put("propertyInfoName",inputDefinition);
+        List<ComponentInstanceInput> instPropList = new ArrayList<>();
+        List<UploadPropInfo> propertyList = new ArrayList<>();
+        List<GetInputValueDataDefinition> get_input = new ArrayList<>();
+        GetInputValueDataDefinition getInputValueDataDefinition = new GetInputValueDataDefinition();
+        getInputValueDataDefinition.setPropName("getInputValueDataDefinitionName");
+        get_input.add(getInputValueDataDefinition);
+        UploadPropInfo propertyInfo = new UploadPropInfo();
+        propertyInfo.setValue("value");
+        propertyInfo.setGet_input(get_input);
+        propertyInfo.setName("propertyInfoName");
+        propertyList.add(propertyInfo);
+
+        try {
+            sIB1.processProperty(resource, currentCompInstance, allDataTypes,
+                    currPropertiesMap, instPropList, propertyList);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testProcessGetInput(){
+        List<GetInputValueDataDefinition> getInputValues = new ArrayList<>();
+        List<InputDefinition> inputs = new ArrayList<>();
+        GetInputValueDataDefinition getInputIndex = new GetInputValueDataDefinition();
+
+        try {
+            sIB1.processGetInput(getInputValues,inputs,getInputIndex);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testAddPropertyValuesToRi(){
+        UploadComponentInstanceInfo uploadComponentInstanceInfo = new UploadComponentInstanceInfo();
+        uploadComponentInstanceInfo.setProperties(getUploadPropInfoProperties());
+        Resource resource = createParseResourceObject(true);
+        Resource originResource = createParseResourceObject(false);
+        originResource.setProperties(getProperties());
+        ComponentInstance currentCompInstance = new ComponentInstance();
+        Map<String, List<ComponentInstanceProperty>> instProperties = new HashMap<>();
+        Map<String, DataTypeDefinition> allDataTypes = new HashMap<>();
+        try {
+            sIB1.addPropertyValuesToRi(uploadComponentInstanceInfo, resource, originResource, currentCompInstance,
+                    instProperties, allDataTypes);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testAddPropertyValuesToRi2(){
+        UploadComponentInstanceInfo uploadComponentInstanceInfo = new UploadComponentInstanceInfo();
+        uploadComponentInstanceInfo.setProperties(getUploadPropInfoProperties());
+        Service service = createServiceObject(false);
+        Resource originResource = createParseResourceObject(false);
+        originResource.setProperties(getProperties());
+        ComponentInstance currentCompInstance = new ComponentInstance();
+        Map<String, List<ComponentInstanceProperty>> instProperties = new HashMap<>();
+        Map<String, DataTypeDefinition> allDataTypes = new HashMap<>();
+
+        try {
+            sIB1.addPropertyValuesToRi(uploadComponentInstanceInfo, service, originResource, currentCompInstance,
+                    instProperties, allDataTypes);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testProcessComponentInstanceCapabilities(){
+        Either<Map<String, DataTypeDefinition>, JanusGraphOperationStatus> allDataTypes = null;
+        Map<ComponentInstance, Map<String, List<CapabilityDefinition>>> instCapabilties = new HashMap<>();
+        UploadComponentInstanceInfo uploadComponentInstanceInfo = new UploadComponentInstanceInfo();
+        uploadComponentInstanceInfo.setProperties(getUploadPropInfoProperties());        Map<String, List<UploadPropInfo>> properties = new HashMap<>();
+        uploadComponentInstanceInfo.setProperties(properties);
+        ComponentInstance currentCompInstance = new ComponentInstance();
+        Resource originResource = createParseResourceObject(false);
+
+        sIB1.processComponentInstanceCapabilities(allDataTypes, instCapabilties, uploadComponentInstanceInfo,
+                currentCompInstance, originResource);
+    }
+
+    @Test
+    public void testUpdateCapabilityPropertiesValues(){
+        Either<Map<String, DataTypeDefinition>, JanusGraphOperationStatus> allDataTypes = null;
+        Map<String, List<CapabilityDefinition>> originCapabilities = new HashMap<>();
+        Map<String, Map<String, UploadPropInfo>> newPropertiesMap = new HashMap<>();
+
+        sIB1.updateCapabilityPropertiesValues(allDataTypes, originCapabilities, newPropertiesMap);
+    }
+
+    @Test
+    public void testUpdatePropertyValues(){
+        List<ComponentInstanceProperty> properties = new ArrayList<>();
+        Map<String, UploadPropInfo> newProperties = new HashMap<>();
+        Map<String, DataTypeDefinition> allDataTypes = new HashMap<>();
+
+        sIB1.updatePropertyValues(properties,newProperties,allDataTypes);
+    }
+
+    @Test
+    public void testUpdatePropertyValue(){
+        ComponentInstanceProperty property = new ComponentInstanceProperty();
+        property.setType("services");
+        UploadPropInfo propertyInfo = new UploadPropInfo();
+        propertyInfo.setValue("value");
+        Map<String, DataTypeDefinition> allDataTypes = new HashMap<>();
+
+        try {
+            sIB1.updatePropertyValue(property,propertyInfo,allDataTypes);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testGetOriginResource(){
+        String yamlName = "group.yml";
+        Map<String, Resource> originCompMap = new HashMap<>();
+        ComponentInstance currentCompInstance = new ComponentInstance();
+        currentCompInstance.setComponentUid("currentCompInstance");
+
+        try {
+            sIB1.getOriginResource(yamlName,originCompMap,currentCompInstance);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testHandleSubstitutionMappings2(){
+        Service service = createServiceObject(false);
+        Map<String, UploadComponentInstanceInfo> uploadResInstancesMap = new HashMap<>();
+
+        sIB1.handleSubstitutionMappings(service, uploadResInstancesMap);
+    }
+
+    @Test
+    public void testUpdateCalculatedCapReqWithSubstitutionMappings(){
+        Resource resource = createParseResourceObject(false);
+        Map<String, UploadComponentInstanceInfo> uploadResInstancesMap = new HashMap<>();
+
+        when(toscaOperationFacade.deleteAllCalculatedCapabilitiesRequirements(any())).thenReturn(StorageOperationStatus.OK);
+
+        try {
+            sIB1.updateCalculatedCapReqWithSubstitutionMappings(resource,uploadResInstancesMap);
+        } catch (Exception e) {
+
+        }
+    }
+
+    @Test
+    public void testFillUpdatedInstCapabilitiesRequirements(){
+        List<ComponentInstance> componentInstances = creatComponentInstances();
+        Map<String, UploadComponentInstanceInfo> uploadResInstancesMap = getUploadResInstancesMap();
+        Map<ComponentInstance, Map<String, List<CapabilityDefinition>>> updatedInstCapabilities = new HashMap<>();
+        Map<ComponentInstance, Map<String, List<RequirementDefinition>>> updatedInstRequirement = new HashMap<>();
+
+        sIB1.fillUpdatedInstCapabilitiesRequirements(componentInstances,uploadResInstancesMap,
+                updatedInstCapabilities,updatedInstRequirement);
+    }
+
+    @Test
+    public void testFillUpdatedInstCapabilities(){
+        Map<ComponentInstance, Map<String, List<CapabilityDefinition>>> updatedInstCapabilties = new HashMap<>();
+        Map<String, List<CapabilityDefinition>> capabilities = new HashMap<>();
+        List<CapabilityDefinition> capabilityDefinitionList = new ArrayList<>();
+        CapabilityDefinition capabilityDefinition = new CapabilityDefinition();
+        capabilityDefinition.setName("mme_ipu_vdu.feature");
+        capabilityDefinitionList.add(capabilityDefinition);
+        capabilities.put("tosca.capabilities.Node",capabilityDefinitionList);
+        ComponentInstance instance = new ComponentInstance();
+        instance.setCapabilities(capabilities);
+        Map<String, String> capabilitiesNamesToUpdate = new HashMap<>();
+        capabilitiesNamesToUpdate.put("mme_ipu_vdu.feature","capabilitiesNamesToUpdate");
+
+        sIB1.fillUpdatedInstCapabilities(updatedInstCapabilties,instance,capabilitiesNamesToUpdate);
+    }
+
+    @Test
+    public void testFillUpdatedInstRequirements(){
+        Map<ComponentInstance, Map<String, List<RequirementDefinition>>> updatedInstRequirements = new
+                HashMap<>();
+        ComponentInstance instance = new ComponentInstance();
+        Map<String, List<RequirementDefinition>> requirements = new HashMap<>();
+        List<RequirementDefinition> requirementDefinitionList = new ArrayList<>();
+        RequirementDefinition requirementDefinition = new RequirementDefinition();
+        requirementDefinition.setName("zxjtestimportserviceab0.mme_ipu_vdu.dependency.test");
+        requirementDefinitionList.add(requirementDefinition);
+        requirements.put("tosca.capabilities.Node",requirementDefinitionList);
+        instance.setRequirements(requirements);
+        Map<String, String> requirementsNamesToUpdate = new HashMap<>();
+        requirementsNamesToUpdate.put("zxjtestimportserviceab0.mme_ipu_vdu.dependency.test",
+                "requirementsNamesToUpdate");
+
+
+        sIB1.fillUpdatedInstRequirements(updatedInstRequirements,instance,requirementsNamesToUpdate);
+    }
+
+    @Test
+    public void testAddRelationsToRI(){
+        String yamlName = "group.yml";
+        Service service = createServiceObject(false);
+        Map<String, UploadComponentInstanceInfo> uploadResInstancesMap = new HashMap<>();
+        UploadComponentInstanceInfo nodesInfoValue = getuploadComponentInstanceInfo();
+        uploadResInstancesMap.put("uploadComponentInstanceInfo", nodesInfoValue);
+        List<ComponentInstance> componentInstancesList = creatComponentInstances();
+        List<RequirementCapabilityRelDef> relations = new ArrayList<>();
+
+        try {
+            sIB1.addRelationsToRI(yamlName,service,uploadResInstancesMap,componentInstancesList,
+                    relations);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testAddRelationToRI(){
+        String yamlName = "group.yml";
+        Service service = createServiceObject(false);
+        service.setComponentInstances(creatComponentInstances());
+
+        UploadComponentInstanceInfo nodesInfoValue = getuploadComponentInstanceInfo();
+        List<RequirementCapabilityRelDef> relations = new ArrayList<>();
+
+        try {
+            sIB1.addRelationToRI(yamlName,service,nodesInfoValue,relations);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testGetResourceAfterCreateRelations(){
+        Service service = createServiceObject(false);
+        ComponentParametersView componentParametersView = createComponentParametersView();
+        when(serviceImportParseLogic.getComponentFilterAfterCreateRelations()).thenReturn(componentParametersView);
+        try {
+            sIB1.getResourceAfterCreateRelations(service);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testCreateServiceInstances(){
+        String yamlName = "group.yml";
+        Service service = createServiceObject(false);
+        Map<String, UploadComponentInstanceInfo> uploadResInstancesMap = new HashMap<>();
+        UploadComponentInstanceInfo nodesInfoValue = getuploadComponentInstanceInfo();
+        uploadResInstancesMap.put("uploadResInstancesMap",nodesInfoValue);
+        Map<String, Resource> nodeNamespaceMap = new HashMap<>();
+        Resource resource = createParseResourceObject(true);
+        resource.setToscaResourceName("toscaResourceName");
+        nodeNamespaceMap.put("nodeNamespaceMap",resource);
+
+        try {
+            sIB1.createServiceInstances(yamlName,service,uploadResInstancesMap,nodeNamespaceMap);
+        } catch (Exception e) {
+           e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testCreateAndAddResourceInstance(){
+        UploadComponentInstanceInfo uploadComponentInstanceInfo = getuploadComponentInstanceInfo();
+        String yamlName = "group.yml";
+        Resource resource = createParseResourceObject(false);
+        Resource originResource = createParseResourceObject(true);
+        originResource.setResourceType(ResourceTypeEnum.VF);
+        Map<String, Resource> nodeNamespaceMap = new HashMap<>();
+        nodeNamespaceMap.put("resources",originResource);
+        Map<String, Resource> existingnodeTypeMap = new HashMap<>();
+        Map<ComponentInstance, Resource> resourcesInstancesMap = new HashMap<>();
+
+        try {
+            sIB1.createAndAddResourceInstance(uploadComponentInstanceInfo,yamlName,resource,nodeNamespaceMap,
+                    existingnodeTypeMap,resourcesInstancesMap);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testCreateAndAddResourceInstances(){
+        UploadComponentInstanceInfo uploadComponentInstanceInfo = getuploadComponentInstanceInfo();
+        String yamlName = "group.yml";
+        Service service = createServiceObject(false);
+        service.setServiceType("services");
+        Resource originResource = createParseResourceObject(true);
+        originResource.setResourceType(ResourceTypeEnum.VF);
+        Map<String, Resource> nodeNamespaceMap = new HashMap<>();
+        nodeNamespaceMap.put("resources", originResource);
+        Map<String, Resource> existingnodeTypeMap = new HashMap<>();
+        Map<ComponentInstance, Resource> resourcesInstancesMap = new HashMap<>();
+
+        try {
+            sIB1.createAndAddResourceInstance(uploadComponentInstanceInfo, yamlName, service, nodeNamespaceMap,
+                    existingnodeTypeMap, resourcesInstancesMap);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testValidateResourceInstanceBeforeCreate(){
+        String yamlName = "group.yml";
+        UploadComponentInstanceInfo uploadComponentInstanceInfo = getuploadComponentInstanceInfo();
+        Resource originResource = createParseResourceObject(true);
+        originResource.setResourceType(ResourceTypeEnum.VF);
+        Map<String, Resource> nodeNamespaceMap = new HashMap<>();
+        nodeNamespaceMap.put("resources", originResource);
+
+        try {
+            sIB1.validateResourceInstanceBeforeCreate(yamlName,uploadComponentInstanceInfo,nodeNamespaceMap);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testHandleServiceNodeTypes(){
+        String yamlName = "group.yml";
+        Service service =createServiceObject(false);
+        String topologyTemplateYaml = getMainTemplateContent("service_import_template.yml");;
+        boolean needLock = true;
+        Map<String, EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<ArtifactDefinition>>> nodeTypesArtifactsToHandle = new HashMap<>();
+        List<ArtifactDefinition> nodeTypesNewCreatedArtifacts = new ArrayList<>();
+        Map<String, NodeTypeInfo> nodeTypesInfo = getNodeTypesInfo();
+        CsarInfo csarInfo = getCsarInfo();
+        String nodeName = "org.openecomp.resource.derivedFrom.zxjTestImportServiceAb.test";
+
+        try {
+            sIB1.handleServiceNodeTypes(yamlName,service,topologyTemplateYaml,needLock,
+                    nodeTypesArtifactsToHandle,nodeTypesNewCreatedArtifacts,nodeTypesInfo,
+                    csarInfo,nodeName);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testValidateResourceNotExisted(){
+        String type = "org.openecomp.resource.vf";
+        boolean b = false;
+        try {
+            b = sIB1.validateResourceNotExisted(type);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testHandleNestedVF(){
+        Service service =createServiceObject(false);
+        Map<String, EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<ArtifactDefinition>>> nodeTypesArtifactsToHandle = new HashMap<>();
+        List<ArtifactDefinition> createdArtifacts = new ArrayList<>();
+        Map<String, NodeTypeInfo> nodesInfo = getNodeTypesInfo();
+        CsarInfo csarInfo = getCsarInfo();
+        String nodeName = "org.openecomp.resource.derivedFrom.zxjTestImportServiceAb.test";
+
+        try {
+            sIB1.handleNestedVF(service,nodeTypesArtifactsToHandle,createdArtifacts,
+                    nodesInfo,csarInfo,nodeName);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testHandleNestedVfc(){
+        Service service =createServiceObject(false);
+        Map<String, EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<ArtifactDefinition>>> nodeTypesArtifactsToHandle = new HashMap<>();
+        List<ArtifactDefinition> createdArtifacts = new ArrayList<>();
+        Map<String, NodeTypeInfo> nodesInfo = new HashMap<>();
+        CsarInfo csarInfo = getCsarInfo();
+        String nodeName = "org.openecomp.resource.derivedFrom.zxjTestImportServiceAb.test";
+
+        try {
+            sIB1.handleNestedVfc(service,nodeTypesArtifactsToHandle,createdArtifacts,
+                    nodesInfo,csarInfo,nodeName);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testHandleComplexVfc(){
+        Map<String, EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<ArtifactDefinition>>> nodeTypesArtifactsToHandle = new HashMap<>();
+        List<ArtifactDefinition> createdArtifacts = new ArrayList<>();
+        Map<String, NodeTypeInfo> nodesInfo = new HashMap<>();
+        CsarInfo csarInfo = getCsarInfo();
+        String nodeName = "org.openecomp.resource.derivedFrom.zxjTestImportServiceAb.test";
+        String yamlName = "group.yml";
+
+        try {
+            sIB1.handleComplexVfc(nodeTypesArtifactsToHandle,createdArtifacts,
+                    nodesInfo,csarInfo,nodeName,yamlName);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+
+    @Test
+    public void testHandleComplexVfc2(){
+        Map<String, EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<ArtifactDefinition>>> nodeTypesArtifactsToHandle = new HashMap<>();
+        List<ArtifactDefinition> createdArtifacts = new ArrayList<>();
+        Map<String, NodeTypeInfo> nodesInfo = getNodeTypesInfo();
+        String nodeName = "org.openecomp.resource.derivedFrom.zxjTestImportServiceAb.test";
+        String yamlName = "group.yml";
+        CsarInfo csarInfo = getCsarInfo();
+        Map<String, byte[]> csar = new HashMap<>();
+        csar.put(yamlName,yamlName.getBytes());
+        csarInfo.setCsar(csar);
+        Resource oldComplexVfc = createParseResourceObject(false);
+        Resource newComplexVfc = createParseResourceObject(true);
+
+        try {
+            sIB1.handleComplexVfc(nodeTypesArtifactsToHandle,createdArtifacts,nodesInfo,
+                    csarInfo,nodeName,yamlName,oldComplexVfc,newComplexVfc);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testUpdateResourceFromYaml(){
+        Resource oldRresource = createParseResourceObject(false);
+        Resource newRresource = createParseResourceObject(true);
+        AuditingActionEnum actionEnum = AuditingActionEnum.CREATE_RESOURCE;
+        List<ArtifactDefinition> createdArtifacts = new ArrayList<>();
+        String yamlFileName = "group.yml";
+        String yamlFileContent = getYamlFileContent();
+        CsarInfo csarInfo = getCsarInfo();
+        Map<String, NodeTypeInfo> nodeTypesInfo = new HashMap<>();
+        Map<String, EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<ArtifactDefinition>>> nodeTypesArtifactsToHandle = new HashMap<>();
+        String nodeName = "org.openecomp.resource.derivedFrom.zxjTestImportServiceAb.test";
+        boolean isNested = true;
+
+        try {
+            sIB1.updateResourceFromYaml(oldRresource,newRresource,actionEnum,createdArtifacts,yamlFileName,yamlFileContent,
+                    csarInfo,nodeTypesInfo,nodeTypesArtifactsToHandle,nodeName,isNested);
+        } catch (Exception e) {
+
+        }
+    }
+
+    @Test
+    public void testCreateResourceFromYaml(){
+        Resource resource = createParseResourceObject(true);
+        String topologyTemplateYaml = getMainTemplateContent();
+        String yamlName = "group.yml";
+        Map<String, NodeTypeInfo> nodeTypesInfo = new HashMap<>();
+        CsarInfo csarInfo = getCsarInfo();
+        Map<String, EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<ArtifactDefinition>>> nodeTypesArtifactsToCreate = new HashMap<>();
+        boolean shouldLock = true;
+        boolean inTransaction =true;
+        String nodeName = "org.openecomp.resource.derivedFrom.zxjTestImportServiceAb.test";
+
+        try {
+            sIB1.createResourceFromYaml(resource,topologyTemplateYaml,yamlName,nodeTypesInfo,csarInfo,
+                    nodeTypesArtifactsToCreate,shouldLock,inTransaction,nodeName);
+        } catch (Exception e) {
+
+        }
+    }
+
+    @Test
+    public void testCreateResourceAndRIsFromYaml(){
+        String yamlName = "group.yml";
+        Resource resource = createParseResourceObject(false);
+        ParsedToscaYamlInfo parsedToscaYamlInfo = new ParsedToscaYamlInfo();
+        AuditingActionEnum actionEnum = AuditingActionEnum.CREATE_RESOURCE;
+        boolean isNormative = true;
+        List<ArtifactDefinition> createdArtifacts = new ArrayList<>();
+        String topologyTemplateYaml = getMainTemplateContent();
+        Map<String, NodeTypeInfo> nodeTypesInfo = new HashMap<>();
+        CsarInfo csarInfo = getCsarInfo();
+        Map<String, EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<ArtifactDefinition>>> nodeTypesArtifactsToCreate = new HashMap<>();
+        boolean shouldLock = true;
+        boolean inTransaction = true;
+        String nodeName = "org.openecomp.resource.derivedFrom.zxjTestImportServiceAb.test";
+
+        try {
+            sIB1.createResourceAndRIsFromYaml(yamlName,resource,parsedToscaYamlInfo,actionEnum,
+                    isNormative,createdArtifacts,topologyTemplateYaml,nodeTypesInfo,csarInfo,
+                    nodeTypesArtifactsToCreate,shouldLock,inTransaction,nodeName);
+        } catch (Exception e) {
+
+        }
+    }
+
+    @Test
+    public void testCreateGroupsOnResource2(){
+        Resource resource = createParseResourceObject(false);
+        Map<String, GroupDefinition> groups = new HashMap<>();
+
+        Either<Resource, ResponseFormat> result = sIB1.createGroupsOnResource(resource, groups);
+        assertEquals(result.left().value(),resource);
+    }
+
+    @Test
+    public void testUpdateGroupsMembersUsingResource2(){
+        Resource resource = createParseResourceObject(true);
+        Map<String, GroupDefinition> groups = null;
+
+        List<GroupDefinition> groupDefinitions = sIB1.updateGroupsMembersUsingResource(groups,resource);
+        for (GroupDefinition groupDefinition : groupDefinitions) {
+            assertNull(groupDefinition);
+        }
+    }
+
+    @Test
+    public void testUpdateGroupMembers(){
+        Map<String, GroupDefinition> groups = new HashMap<>();
+        GroupDefinition updatedGroupDefinition = new GroupDefinition();
+        Resource component = createParseResourceObject(true);
+        List<ComponentInstance> componentInstances = creatComponentInstances();
+        String groupName = "tosca_simple_yaml_1_1";
+        Map<String, String> members = new HashMap<>();
+        members.put("zxjTestImportServiceAb",getGroupsYaml());
+
+        try {
+            sIB1.updateGroupMembers(groups,updatedGroupDefinition,component,componentInstances,
+                    groupName,members);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void setCreateResourceTransaction(){
+        Resource resource = createParseResourceObject(false);
+        resource.setComponentType(ComponentTypeEnum.RESOURCE);
+        boolean isNormative = true;
+
+        try {
+            sIB1.createResourceTransaction(resource,user,isNormative);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testUpdateExistingResourceByImport(){
+        Resource newResource = createParseResourceObject(false);
+        Resource oldResource = createParseResourceObject(true);
+
+        try {
+            sIB1.updateExistingResourceByImport(newResource,oldResource,user,
+                    true,true,true);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testCreateResourcesFromYamlNodeTypesList(){
+        String yamlName = "group.yml";
+        Service service =createServiceObject(false);
+        Map<String, Object> mappedToscaTemplate = new HashMap<>();
+        boolean needLock = true;
+        Map<String, EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<ArtifactDefinition>>> nodeTypesArtifactsToHandle = new HashMap<>();
+        List<ArtifactDefinition> nodeTypesNewCreatedArtifacts = new ArrayList<>();
+        Map<String, NodeTypeInfo> nodeTypesInfo = new HashMap<>();
+        CsarInfo csarInfo = getCsarInfo();
+
+        try {
+            sIB1.createResourcesFromYamlNodeTypesList(yamlName,service,mappedToscaTemplate,needLock,
+                    nodeTypesArtifactsToHandle,nodeTypesNewCreatedArtifacts,nodeTypesInfo,csarInfo);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testCreateNodeTypes(){
+        String yamlName = "group.yml";
+        Service service =createServiceObject(false);
+        boolean needLock = true;
+        Map<String, EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<ArtifactDefinition>>> nodeTypesArtifactsToHandle = new HashMap<>();
+        EnumMap<ArtifactsBusinessLogic.ArtifactOperationEnum, List<ArtifactDefinition>> enumListEnumMap =
+                new EnumMap<>(ArtifactsBusinessLogic.ArtifactOperationEnum.class);
+        List<ArtifactDefinition> artifactDefinitions = new ArrayList<>();
+        ArtifactDefinition artifactDefinition = new ArtifactDefinition();
+        artifactDefinition.setArtifactName("artifactName");
+        artifactDefinitions.add(artifactDefinition);
+        enumListEnumMap.put(ArtifactsBusinessLogic.ArtifactOperationEnum.CREATE,
+                artifactDefinitions);
+        nodeTypesArtifactsToHandle.put("nodeTyp",enumListEnumMap);        List<ArtifactDefinition> nodeTypesNewCreatedArtifacts = new ArrayList<>();
+        Map<String, NodeTypeInfo> nodeTypesInfo = getNodeTypesInfo();
+        CsarInfo csarInfo = getCsarInfo();
+        Map<String, Object> mapToConvert =new HashMap<>();
+        Map<String, Object> nodeTypes =new HashMap<>();
+        NodeTypeInfo nodeTypeInfo = new NodeTypeInfo();
+        nodeTypesInfo.put("nodeTyp",nodeTypeInfo);
+        nodeTypes.put("org.openecomp.resource.derivedFrom.zxjTestImportServiceAb.test",
+                nodeTypeInfo);
+
+        try {
+            sIB1.createNodeTypes(yamlName, service, needLock, nodeTypesArtifactsToHandle,
+                    nodeTypesNewCreatedArtifacts, nodeTypesInfo, csarInfo, mapToConvert,
+                    nodeTypes);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    protected List<UploadPropInfo> getPropertyList() {
+        List<UploadPropInfo> propertyList = new ArrayList<>();
+        UploadPropInfo uploadPropInfo = new UploadPropInfo();
+        List<GetInputValueDataDefinition> get_input = new ArrayList<>();
+        GetInputValueDataDefinition getInputValueDataDefinition = new GetInputValueDataDefinition();
+        getInputValueDataDefinition.setPropName("getInputValueDataDefinitionName");
+        get_input.add(getInputValueDataDefinition);
+        uploadPropInfo.setName("propertiesName");
+        uploadPropInfo.setValue("value");
+        uploadPropInfo.setGet_input(get_input);
+        propertyList.add(uploadPropInfo);
+        return propertyList;
+    }
+
+    protected Map<String, GroupDefinition> getGroups() {
+        Map<String, GroupDefinition> groups = new HashMap<>();
+        GroupDefinition groupDefinition = new GroupDefinition();
+        groupDefinition.setName("groupDefinitionName");
+        groups.put("groupsMap",groupDefinition);
+        return groups;
+    }
+
+    protected Map<String, NodeTypeInfo> getNodeTypesInfo(){
+        Map<String, NodeTypeInfo> nodeTypesInfo = new HashMap<>();
+        NodeTypeInfo nodeTypeInfo = new NodeTypeInfo();
+        Map<String, Object> mappedToscaTemplate = new HashMap<>();
+        nodeTypeInfo.setTemplateFileName("templateFileName");
+        nodeTypeInfo.setMappedToscaTemplate(mappedToscaTemplate);
+        String nodeName = "org.openecomp.resource.derivedFrom.zxjTestImportServiceAb.test";
+        nodeTypesInfo.put(nodeName,nodeTypeInfo);
+        return nodeTypesInfo;
+    }
+
+    protected Map<String, UploadComponentInstanceInfo> getUploadResInstancesMap(){
+        Map<String, UploadComponentInstanceInfo> uploadResInstancesMap = new HashMap<>();
+        UploadComponentInstanceInfo uploadComponentInstanceInfo = getuploadComponentInstanceInfo();
+        Map<String, String> capabilitiesNamesToUpdate = new HashMap<>();
+        capabilitiesNamesToUpdate.put("mme_ipu_vdu.feature","capabilitiesNamesToUpdate");
+        Map<String, String> requirementsNamesToUpdate = new HashMap<>();
+        requirementsNamesToUpdate.put("mme_ipu_vdu.feature","capabilitiesNamesToUpdate");
+        uploadResInstancesMap.put("zxjTestImportServiceAb",uploadComponentInstanceInfo);
+        return uploadResInstancesMap;
+    }
+
+    protected Map<String, List<UploadPropInfo>> getUploadPropInfoProperties(){
+        Map<String, List<UploadPropInfo>> properties = new HashMap<>();
+        List<UploadPropInfo> uploadPropInfoList = new ArrayList<>();
+        UploadPropInfo uploadPropInfo = new UploadPropInfo();
+        List<GetInputValueDataDefinition> get_input = new ArrayList<>();
+        GetInputValueDataDefinition getInputValueDataDefinition = new GetInputValueDataDefinition();
+        getInputValueDataDefinition.setPropName("getInputValueDataDefinitionName");
+        get_input.add(getInputValueDataDefinition);
+        uploadPropInfo.setName("propertiesName");
+        uploadPropInfo.setValue("value");
+        uploadPropInfo.setGet_input(get_input);
+        uploadPropInfoList.add(uploadPropInfo);
+        properties.put("uploadComponentInstanceInfo",uploadPropInfoList);
+        return properties;
+    }
+
+    protected List<PropertyDefinition> getProperties(){
+        List<PropertyDefinition> properties = new ArrayList<>();
+        PropertyDefinition propertyDefinition = new PropertyDefinition();
+        propertyDefinition.setName("propertiesName");
+        properties.add(propertyDefinition);
+        return properties;
+    }
+
+    protected UploadComponentInstanceInfo getuploadComponentInstanceInfo(){
+        UploadComponentInstanceInfo uploadComponentInstanceInfo = new UploadComponentInstanceInfo();
+        uploadComponentInstanceInfo.setType("resources");
+        Collection<String> directives = new Collection<String>() {
+            @Override
+            public int size() {
+                return 0;
+            }
+
+            @Override
+            public boolean isEmpty() {
+                return false;
+            }
+
+            @Override
+            public boolean contains(Object o) {
+                return false;
+            }
+
+            @Override
+            public Iterator<String> iterator() {
+                return null;
+            }
+
+            @Override
+            public Object[] toArray() {
+                return new Object[0];
+            }
+
+            @Override
+            public <T> T[] toArray(T[] ts) {
+                return null;
+            }
+
+            @Override
+            public boolean add(String s) {
+                return false;
+            }
+
+            @Override
+            public boolean remove(Object o) {
+                return false;
+            }
+
+            @Override
+            public boolean containsAll(Collection<?> collection) {
+                return false;
+            }
+
+            @Override
+            public boolean addAll(Collection<? extends String> collection) {
+                return false;
+            }
+
+            @Override
+            public boolean removeAll(Collection<?> collection) {
+                return false;
+            }
+
+            @Override
+            public boolean retainAll(Collection<?> collection) {
+                return false;
+            }
+
+            @Override
+            public void clear() {
+
+            }
+        };
+        uploadComponentInstanceInfo.setDirectives(directives);
+        UploadNodeFilterInfo uploadNodeFilterInfo = new UploadNodeFilterInfo();
+        Map<String, List<UploadReqInfo>> requirements = new HashMap<>();
+        List<UploadReqInfo> uploadReqInfoList = new ArrayList<>();
+        UploadReqInfo uploadReqInfo = new UploadReqInfo();
+        uploadReqInfo.setName("uploadReqInfo");
+        uploadReqInfo.setCapabilityName("tosca.capabilities.Node");
+        uploadReqInfoList.add(uploadReqInfo);
+        requirements.put("requirements",uploadReqInfoList);
+        uploadNodeFilterInfo.setName("mme_ipu_vdu.virtualbinding");
+        uploadComponentInstanceInfo.setCapabilities(getCapabilities());
+        uploadComponentInstanceInfo.setRequirements(requirements);
+        return uploadComponentInstanceInfo;
+    }
+
+    protected Map<String, List<UploadCapInfo>> getCapabilities(){
+        List<UploadCapInfo> uploadCapInfoList = new ArrayList<>();
+        UploadCapInfo uploadCapInfo = new UploadCapInfo();
+        uploadCapInfo.setNode("tosca.nodes.Root");
+        uploadCapInfo.setName("mme_ipu_vdu.dependency");
+        uploadCapInfoList.add(uploadCapInfo);
+        Map<String, List<UploadCapInfo>> uploadCapInfoMap = new HashMap<>();
+        uploadCapInfoMap.put("tosca.capabilities.Node",uploadCapInfoList);
+        return uploadCapInfoMap;
+    }
+
+    protected Map<String, List<UploadReqInfo>> gerRequirements(){
+        Map<String, List<UploadReqInfo>> uploadReqInfoMap = new HashMap<>();
+        String requirementName = "tosca.capabilities.Node";
+        List<UploadReqInfo> uploadReqInfoList = new ArrayList<>();
+        UploadReqInfo uploadReqInfo = new UploadReqInfo();
+        uploadReqInfo.setCapabilityName("tosca.capabilities.Node");
+        uploadReqInfoMap.put(requirementName,uploadReqInfoList);
+        return uploadReqInfoMap;
+    }
+
+    protected ComponentParametersView createComponentParametersView() {
+        ComponentParametersView parametersView = new ComponentParametersView();
+        parametersView.disableAll();
+        parametersView.setIgnoreComponentInstances(false);
+        parametersView.setIgnoreComponentInstancesProperties(false);
+        parametersView.setIgnoreCapabilities(false);
+        parametersView.setIgnoreRequirements(false);
+        parametersView.setIgnoreGroups(false);
+        return parametersView;
+    }
+    protected Map<String, byte[]> crateCsarFromPayload() {
+        String payloadName = "valid_vf.csar";
+        String rootPath = System.getProperty("user.dir");
+        Path path;
+        byte[] data;
+        String payloadData;
+        Map<String, byte[]> returnValue = null;
+        try {
+            path = Paths.get(rootPath + "/src/test/resources/valid_vf.csar");
+            data = Files.readAllBytes(path);
+            payloadData = Base64.encodeBase64String(data);
+            UploadResourceInfo resourceInfo = new UploadResourceInfo();
+            resourceInfo.setPayloadName(payloadName);
+            resourceInfo.setPayloadData(payloadData);
+            Method privateMethod = null;
+            privateMethod = AbstractValidationsServlet.class.getDeclaredMethod("getCsarFromPayload", UploadResourceInfo.class);
+            privateMethod.setAccessible(true);
+            returnValue = (Map<String, byte[]>) privateMethod.invoke(servlet, resourceInfo);
+        } catch (IOException | NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
+            e.printStackTrace();
+        }
+        return returnValue;
+    }
+
+
+    protected List<ComponentInstance> creatComponentInstances(){
+        List<ComponentInstance> componentInstances = new ArrayList<>();
+        ComponentInstance componentInstance = new ComponentInstance();
+        Map<String, List<CapabilityDefinition>> capabilities = new HashMap<>();
+        List<CapabilityDefinition> capabilityDefinitionList = new ArrayList<>();
+        CapabilityDefinition capabilityDefinition = new CapabilityDefinition();
+        capabilityDefinition.setName("mme_ipu_vdu.feature");
+        capabilityDefinitionList.add(capabilityDefinition);
+        capabilities.put("tosca.capabilities.Node",capabilityDefinitionList);
+
+        Map<String, List<RequirementDefinition>> requirements = new HashMap<>();
+        List<RequirementDefinition> requirementDefinitionList = new ArrayList<>();
+        RequirementDefinition requirementDefinition = new RequirementDefinition();
+        requirementDefinition.setName("zxjtestimportserviceab0.mme_ipu_vdu.dependency.test");
+        requirementDefinitionList.add(requirementDefinition);
+        requirements.put("tosca.capabilities.Node",requirementDefinitionList);
+        componentInstance.setRequirements(requirements);
+        componentInstance.setCapabilities(capabilities);
+        componentInstance.setUniqueId("uniqueId");
+        componentInstance.setComponentUid("componentUid");
+        componentInstance.setName("zxjTestImportServiceAb");
+        componentInstances.add(componentInstance);
+        return componentInstances;
+    }
+
+    protected CreateServiceFromYamlParameter getCsfyp() {
+        CreateServiceFromYamlParameter csfyp = new CreateServiceFromYamlParameter();
+        List<ArtifactDefinition> createdArtifacts =new ArrayList<>();
+        Map<String, NodeTypeInfo> nodeTypesInfo = new HashedMap();
+
+        csfyp.setNodeName("org.openecomp.resource.derivedFrom.zxjTestImportServiceAb.test");
+        csfyp.setTopologyTemplateYaml(getMainTemplateContent("service_import_template.yml"));
+        csfyp.setCreatedArtifacts(createdArtifacts);
+        csfyp.setInTransaction(true);
+        csfyp.setShouldLock(true);
+        csfyp.setCsarInfo(getCsarInfo());
+        csfyp.setParsedToscaYamlInfo(getParsedToscaYamlInfo());
+        csfyp.setNodeTypesInfo(nodeTypesInfo);
+        csfyp.setYamlName("group.yml");
+        return csfyp;
+    }
+
+    protected ParsedToscaYamlInfo getParsedToscaYamlInfo(){
+        ParsedToscaYamlInfo parsedToscaYamlInfo = new ParsedToscaYamlInfo();
+        Map<String, InputDefinition> inputs = new HashMap<>();
+        Map<String, UploadComponentInstanceInfo> instances=new HashMap<>();
+        Map<String, GroupDefinition> groups=new HashMap<>();
+        Map<String, PolicyDefinition> policies=new HashMap<>();
+        parsedToscaYamlInfo.setGroups(groups);
+        parsedToscaYamlInfo.setInputs(inputs);
+        parsedToscaYamlInfo.setInstances(instances);
+        parsedToscaYamlInfo.setPolicies(policies);
+        return parsedToscaYamlInfo;
+    }
+
+    String getMainTemplateContent(String fileName){
+        String mainTemplateContent = null;
+        try {
+            mainTemplateContent = loadFileNameToJsonString(fileName);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return mainTemplateContent;
+    }
+
+    protected CsarInfo getCsarInfo ()
+    {
+        String csarUuid = "0010";
+        User user = new User();
+        Map<String, byte[]> csar = crateCsarFromPayload();
+        String vfReousrceName = "resouceName";
+        String mainTemplateName = "mainTemplateName";
+        String mainTemplateContent = getMainTemplateContent("service_import_template.yml");
+        CsarInfo csarInfo = new CsarInfo(user, csarUuid,  csar, vfReousrceName, mainTemplateName, mainTemplateContent, false);
+        return csarInfo;
+    }
+
+    public static String loadFileNameToJsonString(String fileName) throws IOException {
+        String sourceDir = "src/test/resources/normativeTypes";
+        return loadFileNameToJsonString(sourceDir, fileName);
+    }
+
+    private static String loadFileNameToJsonString(String sourceDir, String fileName) throws IOException {
+        java.nio.file.Path filePath = FileSystems.getDefault().getPath(sourceDir, fileName);
+        byte[] fileContent = Files.readAllBytes(filePath);
+        return new String(fileContent);
+    }
+
+
+       protected CsarUtils.NonMetaArtifactInfo getNonMetaArtifactInfo(){
+        String artifactName = "artifactName",path = "/src/test/resources/valid_vf.csar",artifactType = "AAI_SERVICE_MODEL";
+        ArtifactGroupTypeEnum artifactGroupType = ArtifactGroupTypeEnum.TOSCA;
+        String rootPath = System.getProperty("user.dir");
+        Path path2;
+        byte[] data = new byte[0];
+        path2 = Paths.get(rootPath + "/src/test/resources/valid_vf.csar");
+        try {
+            data = Files.readAllBytes(path2);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        String artifactUniqueId = "artifactUniqueId";
+        boolean isFromCsar = true;
+        CsarUtils.NonMetaArtifactInfo  nonMetaArtifactInfo = new CsarUtils.NonMetaArtifactInfo(artifactName,
+                path,artifactType,artifactGroupType,data,artifactUniqueId,isFromCsar);
+        return nonMetaArtifactInfo;
+
+    }
+       
+    protected void assertComponentException(ComponentException e, ActionStatus expectedStatus, String... variables) {
+        ResponseFormat actualResponse = e.getResponseFormat() != null ?
+                e.getResponseFormat() : componentsUtils.getResponseFormat(e.getActionStatus(), e.getParams());
+        assertParseResponse(actualResponse, expectedStatus, variables);
+    }
+
+    private void assertParseResponse(ResponseFormat actualResponse, ActionStatus expectedStatus, String... variables) {
+        ResponseFormat expectedResponse = responseManager.getResponseFormat(expectedStatus, variables);
+        assertThat(expectedResponse.getStatus()).isEqualTo(actualResponse.getStatus());
+        assertThat(expectedResponse.getFormattedMessage()).isEqualTo(actualResponse.getFormattedMessage());
+    }
+}
\ No newline at end of file
diff --git a/catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/ServiceImportBussinessLogicBaseTestSetup.java b/catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/ServiceImportBussinessLogicBaseTestSetup.java
new file mode 100644 (file)
index 0000000..15487d7
--- /dev/null
@@ -0,0 +1,1078 @@
+/*
+
+ * Copyright (c) 2018 AT&T Intellectual Property.
+
+ *
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+
+ * you may not use this file except in compliance with the License.
+
+ * You may obtain a copy of the License at
+
+ *
+
+ *     http://www.apache.org/licenses/LICENSE-2.0
+
+ *
+
+ * Unless required by applicable law or agreed to in writing, software
+
+ * distributed under the License is distributed on an "AS IS" BASIS,
+
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+ * See the License for the specific language governing permissions and
+
+ * limitations under the License.
+
+ */
+
+package org.openecomp.sdc.be.components.impl;
+
+import fj.data.Either;
+
+import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.commons.codec.binary.Base64;
+import org.junit.Before;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.openecomp.sdc.ElementOperationMock;
+import org.openecomp.sdc.be.auditing.impl.AuditingManager;
+import org.openecomp.sdc.be.components.csar.CsarArtifactsAndGroupsBusinessLogic;
+import org.openecomp.sdc.be.components.csar.CsarInfo;
+import org.openecomp.sdc.be.components.distribution.engine.DistributionEngine;
+import org.openecomp.sdc.be.components.impl.exceptions.ComponentException;
+import org.openecomp.sdc.be.components.impl.generic.GenericTypeBusinessLogic;
+import org.openecomp.sdc.be.components.impl.utils.CreateServiceFromYamlParameter;
+import org.openecomp.sdc.be.components.path.ForwardingPathValidator;
+import org.openecomp.sdc.be.components.validation.NodeFilterValidator;
+import org.openecomp.sdc.be.components.validation.ServiceDistributionValidation;
+import org.openecomp.sdc.be.components.validation.UserValidations;
+import org.openecomp.sdc.be.components.validation.component.*;
+import org.openecomp.sdc.be.components.validation.service.*;
+import org.openecomp.sdc.be.dao.api.ActionStatus;
+import org.openecomp.sdc.be.dao.cassandra.AuditCassandraDao;
+import org.openecomp.sdc.be.dao.janusgraph.JanusGraphOperationStatus;
+import org.openecomp.sdc.be.dao.jsongraph.JanusGraphDao;
+import org.openecomp.sdc.be.datamodel.utils.UiComponentDataConverter;
+import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
+import org.openecomp.sdc.be.datatypes.enums.JsonPresentationFields;
+import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
+import org.openecomp.sdc.be.externalapi.servlet.representation.*;
+import org.openecomp.sdc.be.facade.operations.CatalogOperation;
+import org.openecomp.sdc.be.impl.ComponentsUtils;
+import org.openecomp.sdc.be.impl.WebAppContextWrapper;
+import org.openecomp.sdc.be.model.*;
+import org.openecomp.sdc.be.model.category.CategoryDefinition;
+import org.openecomp.sdc.be.model.jsonjanusgraph.operations.NodeFilterOperation;
+import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ToscaOperationFacade;
+import org.openecomp.sdc.be.model.operations.api.IElementOperation;
+import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
+import org.openecomp.sdc.be.model.operations.impl.GraphLockOperation;
+import org.openecomp.sdc.be.resources.data.auditing.ResourceAdminEvent;
+import org.openecomp.sdc.be.servlets.AbstractValidationsServlet;
+import org.openecomp.sdc.be.user.Role;
+import org.openecomp.sdc.be.user.UserBusinessLogic;
+import org.openecomp.sdc.common.api.ArtifactGroupTypeEnum;
+import org.openecomp.sdc.common.api.Constants;
+import org.openecomp.sdc.common.api.UploadArtifactInfo;
+import org.openecomp.sdc.exception.ResponseFormat;
+import org.springframework.web.context.WebApplicationContext;
+
+import javax.servlet.ServletContext;
+import java.util.*;
+
+import static org.assertj.core.api.Java6Assertions.assertThat;
+import static org.junit.Assert.assertEquals;
+import static org.mockito.ArgumentMatchers.*;
+import static org.mockito.Mockito.when;
+
+public class ServiceImportBussinessLogicBaseTestSetup extends BaseBusinessLogicMock {
+    protected ServiceImportBusinessLogic sIB1;
+    protected static final String SERVICE_CATEGORY = "Mobility";
+    protected static final String INSTANTIATION_TYPE = "A-la-carte";
+    protected final ServletContext servletContext = Mockito.mock(ServletContext.class);
+    protected UserBusinessLogic mockUserAdmin = Mockito.mock(UserBusinessLogic.class);
+    protected WebAppContextWrapper webAppContextWrapper = Mockito.mock(WebAppContextWrapper.class);
+    protected WebApplicationContext webAppContext = Mockito.mock(WebApplicationContext.class);
+    protected ResponseFormatManager responseManager = null;
+    protected ComponentsUtils componentsUtils = new ComponentsUtils(Mockito.mock(AuditingManager.class));
+    protected AuditCassandraDao auditingDao = Mockito.mock(AuditCassandraDao.class);
+    protected ArtifactsBusinessLogic artifactBl = Mockito.mock(ArtifactsBusinessLogic.class);
+    protected GraphLockOperation graphLockOperation = Mockito.mock(GraphLockOperation.class);
+    protected JanusGraphDao mockJanusGraphDao = Mockito.mock(JanusGraphDao.class);
+    protected ToscaOperationFacade toscaOperationFacade = Mockito.mock(ToscaOperationFacade.class);
+    protected CsarArtifactsAndGroupsBusinessLogic csarArtifactsAndGroupsBusinessLogic = Mockito.mock(CsarArtifactsAndGroupsBusinessLogic.class);
+    protected GenericTypeBusinessLogic genericTypeBusinessLogic = Mockito.mock(GenericTypeBusinessLogic.class);
+    protected UserValidations userValidations = Mockito.mock(UserValidations.class);
+    protected ResourceAdminEvent auditArchive1 = Mockito.mock(ResourceAdminEvent.class);
+    protected CatalogOperation catalogOperation = Mockito.mock(CatalogOperation.class);
+    protected ResourceAdminEvent auditArchive2 = Mockito.mock(ResourceAdminEvent.class);
+    protected ResourceAdminEvent auditRestore = Mockito.mock(ResourceAdminEvent.class);
+    protected ServiceImportParseLogic serviceImportParseLogic = Mockito.mock(ServiceImportParseLogic.class);
+    IElementOperation mockElementDao = new ElementOperationMock();
+    DistributionEngine distributionEngine = Mockito.mock(DistributionEngine.class);
+    ServiceDistributionValidation serviceDistributionValidation = Mockito.mock(ServiceDistributionValidation.class);
+    ComponentInstanceBusinessLogic componentInstanceBusinessLogic = Mockito.mock(ComponentInstanceBusinessLogic.class);
+    ForwardingPathValidator forwardingPathValidator = Mockito.mock(ForwardingPathValidator.class);
+    UiComponentDataConverter uiComponentDataConverter = Mockito.mock(UiComponentDataConverter.class);
+    NodeFilterOperation serviceFilterOperation = Mockito.mock(NodeFilterOperation.class);
+    NodeFilterValidator serviceFilterValidator = Mockito.mock(NodeFilterValidator.class);
+    protected ServiceTypeValidator serviceTypeValidator = new ServiceTypeValidator(componentsUtils);
+    protected ServiceCategoryValidator serviceCategoryValidator = new ServiceCategoryValidator(componentsUtils, mockElementDao);
+    protected ServiceRoleValidator serviceRoleValidator = new ServiceRoleValidator(componentsUtils);
+    protected ServiceFunctionValidator serviceFunctionValidator = new ServiceFunctionValidator(componentsUtils);
+    protected ServiceInstantiationTypeValidator serviceInstantiationTypeValidator = new ServiceInstantiationTypeValidator(componentsUtils);
+    protected ComponentDescriptionValidator componentDescriptionValidator = new ComponentDescriptionValidator(componentsUtils);
+    protected ComponentProjectCodeValidator componentProjectCodeValidator = new ComponentProjectCodeValidator(componentsUtils);
+    protected ComponentIconValidator componentIconValidator = new ComponentIconValidator(componentsUtils);
+    protected ComponentContactIdValidator componentContactIdValidator = new ComponentContactIdValidator(componentsUtils);
+    protected ComponentTagsValidator componentTagsValidator = new ComponentTagsValidator(componentsUtils);
+    protected ComponentNameValidator componentNameValidator = new ComponentNameValidator(componentsUtils, toscaOperationFacade);
+    protected final ComponentValidator componentValidator = Mockito.mock(ComponentValidator.class);
+    protected ServiceValidator serviceValidator = createServiceValidator();
+
+    protected User user = null;
+    protected Resource genericService = null;
+
+    private static final String RESOURCE_NAME = "My-Resource_Name with   space";
+    private static final String RESOURCE_TOSCA_NAME = "My-Resource_Tosca_Name";
+    private static final String RESOURCE_CATEGORY1 = "Network Layer 2-3";
+    private static final String RESOURCE_SUBCATEGORY = "Router";
+    protected static final String CERTIFIED_VERSION = "1.0";
+    protected static final String UNCERTIFIED_VERSION = "0.2";
+    protected static final String COMPONNET_ID = "myUniqueId";
+    protected static final String GENERIC_SERVICE_NAME = "org.openecomp.resource.abstract.nodes.service";
+
+    protected static final String SERVICE_ROLE = JsonPresentationFields.SERVICE_ROLE.getPresentation();
+    protected static final String SERVICE_TYPE = JsonPresentationFields.SERVICE_TYPE.getPresentation();
+    protected static final String SERVICE_FUNCTION = JsonPresentationFields.SERVICE_FUNCTION.getPresentation();
+
+    public ServiceImportBussinessLogicBaseTestSetup() {
+
+    }
+
+    protected ServiceValidator createServiceValidator() {
+        List<ComponentFieldValidator> componentFieldValidators = Arrays.asList(componentContactIdValidator,
+                componentDescriptionValidator,
+                componentIconValidator, componentNameValidator,
+                new ComponentProjectCodeValidator(componentsUtils),
+                componentTagsValidator);
+
+        List<ServiceFieldValidator> serviceFieldValidators = Arrays.asList(serviceCategoryValidator, new ServiceEnvironmentContextValidator(),
+                serviceInstantiationTypeValidator, new ServiceNamingPolicyValidator(componentsUtils),
+                serviceRoleValidator, serviceTypeValidator);
+        return new ServiceValidator(componentsUtils, componentFieldValidators, serviceFieldValidators);
+    }
+
+    @Before
+    public void setup() {
+
+        // Elements
+        IElementOperation mockElementDao = new ElementOperationMock();
+
+        // User data and management
+        user = new User();
+        user.setUserId("jh0003");
+        user.setFirstName("Jimmi");
+        user.setLastName("Hendrix");
+        user.setRole(Role.ADMIN.name());
+
+        when(mockUserAdmin.getUser("jh0003", false)).thenReturn(user);
+        when(userValidations.validateUserExists(eq("jh0003"))).thenReturn(user);
+        when(userValidations.validateUserNotEmpty(eq(user), anyString())).thenReturn(user);
+//        when(userValidations.validateUserRole(user))
+        // Servlet Context attributes
+        when(servletContext.getAttribute(Constants.CONFIGURATION_MANAGER_ATTR)).thenReturn(configurationManager);
+//        when(servletContext.getAttribute(Constants.SERVICE_OPERATION_MANAGER)).thenReturn(new ServiceOperation());
+        when(servletContext.getAttribute(Constants.WEB_APPLICATION_CONTEXT_WRAPPER_ATTR)).thenReturn(webAppContextWrapper);
+        when(webAppContextWrapper.getWebAppContext(servletContext)).thenReturn(webAppContext);
+        when(webAppContext.getBean(IElementOperation.class)).thenReturn(mockElementDao);
+        when(graphLockOperation.lockComponent(Mockito.anyString(), Mockito.eq(NodeTypeEnum.Service))).thenReturn(StorageOperationStatus.OK);
+        when(graphLockOperation.lockComponentByName(Mockito.anyString(), Mockito.eq(NodeTypeEnum.Service))).thenReturn(StorageOperationStatus.OK);
+        when(catalogOperation.updateCatalog(Mockito.any(), Mockito.any())).thenReturn(ActionStatus.OK);
+        // artifact bussinesslogic
+        ArtifactDefinition artifactDef = new ArtifactDefinition();
+        when(artifactBl.createArtifactPlaceHolderInfo(Mockito.any(), Mockito.anyString(), Mockito.anyMap(), Mockito.any(User.class), Mockito.any(ArtifactGroupTypeEnum.class))).thenReturn(artifactDef);
+
+        // createService
+        Service serviceResponse = createServiceObject(true);
+        Either<Component, StorageOperationStatus> eitherCreate = Either.left(serviceResponse);
+        when(toscaOperationFacade.createToscaComponent(Mockito.any(Component.class))).thenReturn(eitherCreate);
+        when(toscaOperationFacade.getToscaElement(Mockito.anyString())).thenReturn(eitherCreate);
+        Either<Boolean, StorageOperationStatus> eitherCount = Either.left(false);
+        when(toscaOperationFacade.validateComponentNameExists("Service", null, ComponentTypeEnum.SERVICE)).thenReturn(eitherCount);
+        Either<Boolean, StorageOperationStatus> eitherCountExist = Either.left(true);
+        when(toscaOperationFacade.validateComponentNameExists("alreadyExist", null, ComponentTypeEnum.SERVICE)).thenReturn(eitherCountExist);
+        when(userValidations.validateUserExists(user)).thenReturn(user);
+
+        // createResource
+        Resource resourceRsponse = createParseResourceObject(true);
+        Either<Component, StorageOperationStatus> eitherResourceCreate = Either.left(resourceRsponse);
+        when(toscaOperationFacade.createToscaComponent(Mockito.any(Component.class))).thenReturn(eitherResourceCreate);
+        Either<Component, StorageOperationStatus> eitherResourceRes = Either.left(resourceRsponse);
+        when(toscaOperationFacade.getToscaFullElement(Mockito.anyString())).thenReturn(eitherResourceRes);
+
+        Either<Boolean, StorageOperationStatus> eitherResourceCount = Either.left(false);
+        when(toscaOperationFacade.validateComponentNameExists("Resource", null, ComponentTypeEnum.RESOURCE)).thenReturn(eitherResourceCount);
+        Either<Boolean, StorageOperationStatus> eitherResourceCountExist = Either.left(true);
+        when(toscaOperationFacade.validateComponentNameExists("alreadyExist", null, ComponentTypeEnum.RESOURCE)).thenReturn(eitherResourceCountExist);
+
+        genericService = setupGenericServiceMock();
+        Either<Resource, StorageOperationStatus> findLatestGeneric = Either.left(genericService);
+        when(toscaOperationFacade.getLatestCertifiedNodeTypeByToscaResourceName(GENERIC_SERVICE_NAME)).thenReturn(findLatestGeneric);
+
+        when(serviceImportParseLogic.isArtifactDeletionRequired(anyString(),any(),anyBoolean())).thenReturn(true);
+        Either<Boolean, ResponseFormat> validateCGD = Either.left(true);
+        when(serviceImportParseLogic.validateCyclicGroupsDependencies(any())).thenReturn(validateCGD);
+
+        sIB1 = new ServiceImportBusinessLogic(elementDao, groupOperation, groupInstanceOperation,
+                groupTypeOperation, groupBusinessLogic, interfaceOperation, interfaceLifecycleTypeOperation,
+                artifactBl, distributionEngine, componentInstanceBusinessLogic,
+                serviceDistributionValidation, forwardingPathValidator, uiComponentDataConverter, serviceFilterOperation,
+                serviceFilterValidator, artifactToscaOperation, componentContactIdValidator,
+                componentNameValidator, componentTagsValidator, componentValidator,
+                componentIconValidator, componentProjectCodeValidator, componentDescriptionValidator);
+
+
+        mockAbstract();
+
+        responseManager = ResponseFormatManager.getInstance();
+    }
+
+    protected Service createServiceObject(boolean afterCreate) {
+        Service service = new Service();
+        service.setUniqueId("sid");
+        service.setName("Service");
+        CategoryDefinition category = new CategoryDefinition();
+        category.setName(SERVICE_CATEGORY);
+        category.setIcons(Collections.singletonList("defaulticon"));
+        List<CategoryDefinition> categories = new ArrayList<>();
+        categories.add(category);
+        service.setCategories(categories);
+        service.setInstantiationType(INSTANTIATION_TYPE);
+
+        service.setDescription("description");
+        List<String> tgs = new ArrayList<>();
+        tgs.add(service.getName());
+        service.setTags(tgs);
+        // service.setVendorName("Motorola");
+        // service.setVendorRelease("1.0.0");
+        service.setIcon("defaulticon");
+        // service.setState(LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT);
+        service.setContactId("aa1234");
+        service.setProjectCode("12345");
+        service.setEcompGeneratedNaming(true);
+
+        if (afterCreate) {
+            service.setVersion("0.1");
+            service.setUniqueId(service.getName() + ":" + service.getVersion());
+            service.setCreatorUserId(user.getUserId());
+            service.setCreatorFullName(user.getFirstName() + " " + user.getLastName());
+        }
+        return service;
+    }
+
+    protected Resource createResourceObject(boolean afterCreate) {
+        Resource resource = new Resource();
+        resource.setUniqueId("sid");
+        resource.setName("Service");
+        CategoryDefinition category = new CategoryDefinition();
+        category.setName(SERVICE_CATEGORY);
+        category.setIcons(Collections.singletonList("defaulticon"));
+        List<CategoryDefinition> categories = new ArrayList<>();
+        categories.add(category);
+        resource.setCategories(categories);
+
+
+        resource.setDescription("description");
+        List<String> tgs = new ArrayList<>();
+        tgs.add(resource.getName());
+        resource.setTags(tgs);
+        resource.setIcon("defaulticon");
+        resource.setContactId("aa1234");
+        resource.setProjectCode("12345");
+
+
+        if (afterCreate) {
+            resource.setVersion("0.1");
+            resource.setUniqueId(resource.getName() + ":" + resource.getVersion());
+            resource.setCreatorUserId(user.getUserId());
+            resource.setCreatorFullName(user.getFirstName() + " " + user.getLastName());
+        }
+        return resource;
+    }
+       
+protected Resource createParseResourceObject(boolean afterCreate) {
+        Resource resource = new Resource();
+        resource.setName(RESOURCE_NAME);
+        resource.setToscaResourceName(RESOURCE_TOSCA_NAME);
+        resource.addCategory(RESOURCE_CATEGORY1, RESOURCE_SUBCATEGORY);
+        resource.setDescription("My short description");
+        List<String> tgs = new ArrayList<>();
+        tgs.add("test");
+        tgs.add(resource.getName());
+        resource.setTags(tgs);
+        List<String> template = new ArrayList<>();
+        template.add("tosca.nodes.Root");
+        resource.setDerivedFrom(template);
+        resource.setVendorName("Motorola");
+        resource.setVendorRelease("1.0.0");
+        resource.setContactId("ya5467");
+        resource.setIcon("defaulticon");
+        Map<String, List<RequirementDefinition>> requirements = new HashMap<>();
+        List<RequirementDefinition> requirementDefinitionList= new ArrayList<>();
+        requirements.put("test", requirementDefinitionList);
+        resource.setRequirements(requirements);
+
+        if (afterCreate) {
+            resource.setName(resource.getName());
+            resource.setVersion("0.1");
+            resource.setUniqueId(resource.getName()
+                    .toLowerCase() + ":" + resource.getVersion());
+            resource.setCreatorUserId(user.getUserId());
+            resource.setCreatorFullName(user.getFirstName() + " " + user.getLastName());
+            resource.setLifecycleState(LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT);
+        }
+        return resource;
+    }
+    protected Resource setupGenericServiceMock() {
+        Resource genericService = new Resource();
+        genericService.setVersion("1.0");
+        genericService.setToscaResourceName(GENERIC_SERVICE_NAME);
+        return genericService;
+    }
+
+    protected UploadComponentInstanceInfo createUploadComponentInstanceInfo(){
+        UploadComponentInstanceInfo uploadComponentInstanceInfo = new UploadComponentInstanceInfo();
+        uploadComponentInstanceInfo.setName("UploadComponentInstanceInfo");
+        return uploadComponentInstanceInfo;
+    }
+
+    private void mockAbstract() {
+        checkCreateAbstract();
+        checkCreateOther();
+        checkCreateFile();
+    }
+
+    private void checkCreateAbstract(){
+        AbstractResourceInfo abstractResourceInfo = new AbstractResourceInfo();
+        List<RequirementCapabilityRelDef> componentInstancesRelations = new ArrayList<>();
+        abstractResourceInfo.setComponentInstancesRelations(componentInstancesRelations);
+        abstractResourceInfo.setAbstractResourceUniqueId("abstractResourceUniqueId");
+        abstractResourceInfo.setAbstractResourceName("abstractResourceName");
+        abstractResourceInfo.setAbstractResourceUUid("abstractResourceUUid");
+
+        AbstractResourceInfo getAbstractResourceInfo = new AbstractResourceInfo();
+        getAbstractResourceInfo.getAbstractResourceName();
+        getAbstractResourceInfo.getAbstractResourceUniqueId();
+        getAbstractResourceInfo.getAbstractResourceUUid();
+        getAbstractResourceInfo.getComponentInstancesRelations();
+
+        AbstractTemplateInfo createAbstractTemplateInfo = new AbstractTemplateInfo();
+        List<AbstractResourceInfo> abstractResourceInfoList = new ArrayList<>();
+        abstractResourceInfoList.add(abstractResourceInfo);
+        createAbstractTemplateInfo.setAbstractResourceInfoList(abstractResourceInfoList);
+        createAbstractTemplateInfo.setServiceUniqueId("serviceUniqueId");
+        createAbstractTemplateInfo.setIsAbstractTemplate(true);
+        createAbstractTemplateInfo.setServiceUUid("serviceUUid");
+
+        AbstractTemplateInfo getAbstractTemplateInfo = new AbstractTemplateInfo();
+        getAbstractTemplateInfo.getAbstractResourceInfoList();
+        getAbstractTemplateInfo.getIsAbstractTemplate();
+        getAbstractTemplateInfo.getServiceUniqueId();
+        getAbstractTemplateInfo.getServiceUUid();
+
+        CopyServiceInfo copyServiceInfo = new CopyServiceInfo();
+        copyServiceInfo.setNewServiceName("newServiceName");
+        copyServiceInfo.setNewServiceUUid("serviceUUid");
+        copyServiceInfo.setOldServiceUUid("oldServiceUUid");
+
+        CopyServiceInfo getCopyServiceInfo = new CopyServiceInfo();
+        getCopyServiceInfo.getNewServiceName();
+        getCopyServiceInfo.getNewServiceUUid();
+        getCopyServiceInfo.getOldServiceUUid();
+
+        ReplaceVNFInfo replaceVNFInfo = new ReplaceVNFInfo();
+        ComponentInstance realVNFComponentInstance = new ComponentInstance();
+        replaceVNFInfo.setAbstractResourceUniqueId("abstractResourceUniqueId");
+        replaceVNFInfo.setRealVNFComponentInstance(realVNFComponentInstance);
+        replaceVNFInfo.setServiceUniqueId("serviceUniqueId");
+
+        ReplaceVNFInfo getReplaceVNFInfo = new ReplaceVNFInfo();
+        getReplaceVNFInfo.getServiceUniqueId();
+        getReplaceVNFInfo.getAbstractResourceUniqueId();
+        getReplaceVNFInfo.getRealVNFComponentInstance();
+    }
+
+    private void checkCreateOther(){
+        ResourceInstanceMetadata resourceInstanceMetadata = new ResourceInstanceMetadata();
+        List<ArtifactMetadata> artifacts = new ArrayList<>();
+        resourceInstanceMetadata.setArtifacts(artifacts);
+        resourceInstanceMetadata.setResoucreType("resoucreType");
+        resourceInstanceMetadata.setResourceInstanceName("resourceInstanceName");
+        resourceInstanceMetadata.setResourceInvariantUUID("resourceInvariantUUID");
+        resourceInstanceMetadata.setResourceName("resourceName");
+        resourceInstanceMetadata.setResourceUUID("resourceUUID");
+        resourceInstanceMetadata.setResourceVersion("resourceVersion");
+
+        ResourceInstanceMetadata getResourceInstanceMetadata = new ResourceInstanceMetadata();
+        getResourceInstanceMetadata.getArtifacts();
+        getResourceInstanceMetadata.getResoucreType();
+        getResourceInstanceMetadata.getResourceInstanceName();
+        getResourceInstanceMetadata.getResourceInvariantUUID();
+        getResourceInstanceMetadata.getResourceName();
+        getResourceInstanceMetadata.getResourceUUID();
+        getResourceInstanceMetadata.getResourceVersion();
+
+        UploadServiceInfo uploadServiceInfo = new UploadServiceInfo();
+        List<String> tags = new ArrayList<>();
+        List<CategoryDefinition> categories = new ArrayList<>();
+        List<UploadArtifactInfo> artifactList = new ArrayList<>();
+        uploadServiceInfo.setProjectCode("projectCode");
+        uploadServiceInfo.setCategories(categories);
+        uploadServiceInfo.setServiceType("");
+        uploadServiceInfo.setServiceVendorModelNumber("serviceVendorModelNumber");
+        uploadServiceInfo.setVendorRelease("vendorRelease");
+        uploadServiceInfo.setVendorName("vendorName");
+        uploadServiceInfo.setServiceIconPath("serviceIconPath");
+        uploadServiceInfo.setName("uploadServiceInfo");
+        uploadServiceInfo.setContactId("contactId");
+        uploadServiceInfo.setIcon("icon");
+        uploadServiceInfo.setNamingPolicy("namingPolicy");
+        uploadServiceInfo.setEcompGeneratedNaming("ecompGeneratedNaming");
+        uploadServiceInfo.setServiceEcompNaming("serviceEcompNaming");
+        uploadServiceInfo.setServiceRole("serviceRole");
+        uploadServiceInfo.setSubcategory("subcategory");
+        uploadServiceInfo.setCategory("category");
+        uploadServiceInfo.setType("type");
+        uploadServiceInfo.setUUID("UUID");
+        uploadServiceInfo.setInvariantUUID("invariantUUID");
+        uploadServiceInfo.setResourceVendorRelease("resourceVendorRelease");
+        uploadServiceInfo.setResourceVendor("resourceVendor");
+        uploadServiceInfo.setDescription("description");
+        uploadServiceInfo.setTags(tags);
+        uploadServiceInfo.setArtifactList(artifactList);
+        uploadServiceInfo.setPayloadName("payloadName");
+        uploadServiceInfo.setPayloadData("payloadData");
+    }
+
+    protected void checkGetUploadServiceInfo(){
+        UploadServiceInfo uploadServiceInfo = new UploadServiceInfo();
+        List<String> tags = new ArrayList<>();
+        List<CategoryDefinition> categories = new ArrayList<>();
+        List<UploadArtifactInfo> artifactList = new ArrayList<>();
+        uploadServiceInfo.getProjectCode();
+        uploadServiceInfo.getCategories();
+        uploadServiceInfo.getServiceType();
+        uploadServiceInfo.getServiceVendorModelNumber();
+        uploadServiceInfo.getVendorRelease();
+        uploadServiceInfo.getVendorName();
+        uploadServiceInfo.getServiceIconPath();
+        uploadServiceInfo.getName();
+        uploadServiceInfo.getContactId();
+        uploadServiceInfo.getIcon();
+        uploadServiceInfo.getNamingPolicy();
+        uploadServiceInfo.getEcompGeneratedNaming();
+        uploadServiceInfo.getServiceEcompNaming();
+        uploadServiceInfo.getServiceRole();
+        uploadServiceInfo.getSubcategory();
+        uploadServiceInfo.getCategory();
+        uploadServiceInfo.getType();
+        uploadServiceInfo.getUUID();
+        uploadServiceInfo.getInvariantUUID();
+        uploadServiceInfo.getResourceVendorRelease();
+        uploadServiceInfo.getResourceVendor();
+        uploadServiceInfo.getDescription();
+        uploadServiceInfo.getTags();
+        uploadServiceInfo.getArtifactList();
+        uploadServiceInfo.getPayloadName();
+        uploadServiceInfo.getPayloadData();
+    }
+
+    private void checkCreateFile(){
+        CreateServiceFromYamlParameter csfp = new CreateServiceFromYamlParameter();
+        Map<String, NodeTypeInfo> nodeTypesInfo = new HashMap<>();
+        ParsedToscaYamlInfo parsedToscaYamlInfo = new ParsedToscaYamlInfo();
+        List<ArtifactDefinition> createdArtifacts = new ArrayList<>();
+        CsarInfo csarInfo = getCsarInfo();
+        csfp.setYamlName("yamlName");
+        csfp.setNodeTypesInfo(nodeTypesInfo);
+        csfp.setParsedToscaYamlInfo(parsedToscaYamlInfo);
+        csfp.setCsarInfo(csarInfo);
+        csfp.setCreatedArtifacts(createdArtifacts);
+        csfp.setYamlName("yamlName");
+        csfp.setShouldLock(true);
+        csfp.setInTransaction(true);
+        csfp.setNodeName("nodeName");
+
+        CreateServiceFromYamlParameter getCsfy = new CreateServiceFromYamlParameter();
+        getCsfy.getYamlName();
+        getCsfy.getNodeTypesInfo();
+        getCsfy.getParsedToscaYamlInfo();
+        getCsfy.getCsarInfo();
+        getCsfy.getCreatedArtifacts();
+        getCsfy.getYamlName();
+        getCsfy.isShouldLock();
+        getCsfy.isInTransaction();
+        getCsfy.getNodeName();
+    }
+
+    protected CsarInfo getCsarInfo ()
+    {
+        String csarUuid = "0010";
+        User user = new User();
+        Map<String, byte[]> csar = crateCsarFromPayload();
+        String vfReousrceName = "resouceName";
+        String mainTemplateName = "mainTemplateName";
+        String mainTemplateContent = getMainTemplateContent();
+        final Service service = createServiceObject(false);
+        CsarInfo csarInfo = new CsarInfo(user, csarUuid,  csar, vfReousrceName, mainTemplateName, mainTemplateContent, false);
+        return csarInfo;
+    }
+
+    protected Map<String, byte[]> crateCsarFromPayload() {
+        String payloadName = "valid_vf.csar";
+        byte[] data = new byte[1024];
+        Map<String, byte[]> returnValue = new HashMap<>();
+        returnValue.put(payloadName,data);
+
+        return returnValue;
+    }
+
+    protected String getGroupsYaml(){
+        return "zxjTestImportServiceAb 0:\n" +
+                "      type: org.openecomp.resource.vf.Zxjtestimportserviceab\n" +
+                "      metadata:\n" +
+                "        invariantUUID: 41474f7f-3195-443d-a0a2-eb6020a56279\n" +
+                "        UUID: 92e32e49-55f8-46bf-984d-a98c924037ec\n" +
+                "        customizationUUID: 40286158-96d0-408e-9f27-21d43817d37c\n" +
+                "        version: '1.0'\n" +
+                "        name: zxjTestImportServiceAb\n" +
+                "        description: zxjTestImportServiceAbstract\n" +
+                "        type: VF\n" +
+                "        category: Generic\n" +
+                "        subcategory: Abstract\n" +
+                "        resourceVendor: zxjImportService\n" +
+                "        resourceVendorRelease: '1.0'\n" +
+                "        resourceVendorModelNumber: ''\n" +
+                "      properties:\n" +
+                "        skip_post_instantiation_configuration: true\n" +
+                "        nf_naming:\n" +
+                "          ecomp_generated_naming: true\n" +
+                "        multi_stage_design: 'false'\n" +
+                "        controller_actor: SO-REF-DATA\n" +
+                "        availability_zone_max_count: 1\n" +
+                "      requirements:\n" +
+                "      - imagefile.dependency:\n" +
+                "          capability: feature\n" +
+                "          node: ext ZTE VL 0\n" +
+                "      - mme_ipu_vdu.dependency:\n" +
+                "          capability: feature\n" +
+                "          node: ExtCP 0\n" +
+                "      capabilities:\n" +
+                "        mme_ipu_vdu.scalable:\n" +
+                "          properties:\n" +
+                "            max_instances: 1\n" +
+                "            min_instances: 1\n" +
+                "        mme_ipu_vdu.nfv_compute:\n" +
+                "          properties:\n" +
+                "            num_cpus: '2'\n" +
+                "            flavor_extra_specs: {\n" +
+                "              }\n" +
+                "            mem_size: '8192'";
+    }
+
+    protected String getYamlFileContent(){
+        return "tosca_definitions_version: tosca_simple_yaml_1_1\n" +
+                "imports:\n" +
+                "- data.yml\n" +
+                "group_types:\n" +
+                "  tosca.groups.Root:\n" +
+                "    description: The TOSCA Group Type all other TOSCA Group Types derive from\n" +
+                "    interfaces:\n" +
+                "      Standard:\n" +
+                "        type: tosca.interfaces.node.lifecycle.Standard\n" +
+                "  org.openecomp.groups.heat.HeatStack:\n" +
+                "    derived_from: tosca.groups.Root\n" +
+                "    description: Grouped all heat resources which are in the same heat stack\n" +
+                "    properties:\n" +
+                "      heat_file:\n" +
+                "        type: string\n" +
+                "        description: Heat file which associate to this group/heat stack\n" +
+                "        required: true\n" +
+                "        status: supported\n" +
+                "      description:\n" +
+                "        type: string\n" +
+                "        description: group description\n" +
+                "        required: true\n" +
+                "        status: supported\n" +
+                "  org.openecomp.groups.VfModule:\n" +
+                "    derived_from: tosca.groups.Root\n" +
+                "    description: Grouped all heat resources which are in the same VF Module\n" +
+                "    properties:\n" +
+                "      isBase:\n" +
+                "        type: boolean\n" +
+                "        description: Whether this module should be deployed before other modules\n" +
+                "        required: true\n" +
+                "        default: false\n" +
+                "        status: supported\n" +
+                "      vf_module_label:\n" +
+                "        type: string\n" +
+                "        required: true\n" +
+                "        description: |\n" +
+                "          Alternate textual key used to reference this VF-Module model. Must be unique within the VNF model\n" +
+                "      vf_module_description:\n" +
+                "        type: string\n" +
+                "        required: true\n" +
+                "        description: |\n" +
+                "          Description of the VF-modules contents and purpose (e.g. \"Front-End\" or \"Database Cluster\")\n" +
+                "      min_vf_module_instances:\n" +
+                "        type: integer\n" +
+                "        required: true\n" +
+                "        description: The minimum instances of this VF-Module\n" +
+                "      max_vf_module_instances:\n" +
+                "        type: integer\n" +
+                "        required: false\n" +
+                "        description: The maximum instances of this VF-Module\n" +
+                "      initial_count:\n" +
+                "        type: integer\n" +
+                "        required: false\n" +
+                "        description: |\n" +
+                "          The initial count of instances of the VF-Module. The value must be in the range between min_vfmodule_instances and max_vfmodule_instances. If no value provided the initial count is the min_vfmodule_instances.\n" +
+                "      vf_module_type:\n" +
+                "        type: string\n" +
+                "        required: true\n" +
+                "        constraint:\n" +
+                "        - valid_values:\n" +
+                "          - Base\n" +
+                "          - Expansion\n" +
+                "      volume_group:\n" +
+                "        type: boolean\n" +
+                "        required: true\n" +
+                "        default: false\n" +
+                "        description: |\n" +
+                "          \"true\" indicates that this VF Module model requires attachment to a Volume Group. VID operator must select the Volume Group instance to attach to a VF-Module at deployment time.\n" +
+                "      availability_zone_count:\n" +
+                "        type: integer\n" +
+                "        required: false\n" +
+                "        description: |\n" +
+                "          Quantity of Availability Zones needed for this VF-Module (source: Extracted from VF-Module HEAT template)\n" +
+                "      vfc_list:\n" +
+                "        type: map\n" +
+                "        entry_schema:\n" +
+                "          description: <vfc_id>:<count>\n" +
+                "          type: string\n" +
+                "        required: false\n" +
+                "        description: |\n" +
+                "          Identifies the set of VM types and their count included in the VF-Module\n" +
+                "  org.openecomp.groups.NetworkCollection:\n" +
+                "    derived_from: tosca.groups.Root\n" +
+                "    description: groups l3-networks in network collection\n" +
+                "    properties:\n" +
+                "      network_collection_function:\n" +
+                "        type: string\n" +
+                "        required: true\n" +
+                "        description: network collection function\n" +
+                "      network_collection_description:\n" +
+                "        type: string\n" +
+                "        required: true\n" +
+                "        description: network collection description, free format text\n" +
+                "  org.openecomp.groups.VfcInstanceGroup:\n" +
+                "    derived_from: tosca.groups.Root\n" +
+                "    description: groups VFCs with same parent port role\n" +
+                "    properties:\n" +
+                "      vfc_instance_group_function:\n" +
+                "        type: string\n" +
+                "        required: true\n" +
+                "        description: function of this VFC group\n" +
+                "      vfc_parent_port_role:\n" +
+                "        type: string\n" +
+                "        required: true\n" +
+                "        description: common role of parent ports of VFCs in this group\n" +
+                "      network_collection_function:\n" +
+                "        type: string\n" +
+                "        required: true\n" +
+                "        description: network collection function assigned to this group\n" +
+                "      subinterface_role:\n" +
+                "        type: string\n" +
+                "        required: true\n" +
+                "        description: common role of subinterfaces of VFCs in this group, criteria the group is created\n" +
+                "    capabilities:\n" +
+                "      vlan_assignment:\n" +
+                "        type: org.openecomp.capabilities.VLANAssignment\n" +
+                "        properties:\n" +
+                "          vfc_instance_group_reference:\n" +
+                "            type: string\n" +
+                "  tosca.groups.nfv.PlacementGroup:\n" +
+                "    derived_from: tosca.groups.Root\n" +
+                "    description: PlacementGroup is used for describing the affinity or anti-affinity relationship applicable between the virtualization containers to be created based on different VDUs, or between internal VLs to be created based on different VnfVirtualLinkDesc(s)\n" +
+                "    properties:\n" +
+                "      description:\n" +
+                "        type: string\n" +
+                "        description: Human readable description of the group\n" +
+                "        required: true\n" +
+                "    members:\n" +
+                "    - tosca.nodes.nfv.Vdu.Compute\n" +
+                "    - tosca.nodes.nfv.VnfVirtualLink";
+    }
+
+    public String getMainTemplateContent(){
+        return "tosca_definitions_version: tosca_simple_yaml_1_1\n"
+                + "metadata:\n"
+                + "  invariantUUID: 6d17f281-683b-4198-a676-0faeecdc9025\n"
+                + "  UUID: bfeab6b4-199b-4a2b-b724-de416c5e9811\n"
+                + "  name: ser09080002\n"
+                + "  description: ser09080002\n"
+                + "  type: Service\n"
+                + "  category: E2E Service\n"
+                + "  serviceType: ''\n"
+                + "  serviceRole: ''\n"
+                + "  instantiationType: A-la-carte\n"
+                + "  serviceEcompNaming: true\n"
+                + "  ecompGeneratedNaming: true\n"
+                + "  namingPolicy: ''\n"
+                + "  environmentContext: General_Revenue-Bearing\n"
+                + "  serviceFunction: ''\n"
+                + "imports:\n"
+                + "- nodes:\n"
+                + "    file: nodes.yml\n"
+                + "- datatypes:\n"
+                + "    file: data.yml\n"
+                + "- capabilities:\n"
+                + "    file: capabilities.yml\n"
+                + "- relationships:\n"
+                + "    file: relationships.yml\n"
+                + "- groups:\n"
+                + "    file: groups.yml\n"
+                + "- policies:\n"
+                + "    file: policies.yml\n"
+                + "- annotations:\n"
+                + "    file: annotations.yml\n"
+                + "- service-ser09080002-interface:\n"
+                + "    file: service-Ser09080002-template-interface.yml\n"
+                + "- resource-ExtCP:\n"
+                + "    file: resource-Extcp-template.yml\n"
+                + "- resource-zxjTestImportServiceAb:\n"
+                + "    file: resource-Zxjtestimportserviceab-template.yml\n"
+                + "- resource-zxjTestImportServiceAb-interface:\n"
+                + "    file: resource-Zxjtestimportserviceab-template-interface.yml\n"
+                + "- resource-zxjTestServiceNotAbatract:\n"
+                + "    file: resource-Zxjtestservicenotabatract-template.yml\n"
+                + "- resource-zxjTestServiceNotAbatract-interface:\n"
+                + "    file: resource-Zxjtestservicenotabatract-template-interface.yml\n"
+                + "- resource-ext ZTE VL:\n"
+                + "    file: resource-ExtZteVl-template.yml\n"
+                + "topology_template:\n"
+                + "  inputs:\n"
+                + "    skip_post_instantiation_configuration:\n"
+                + "      default: true\n"
+                + "      type: boolean\n"
+                + "      required: false\n"
+                + "    controller_actor:\n"
+                + "      default: SO-REF-DATA\n"
+                + "      type: string\n"
+                + "      required: false\n"
+                + "    cds_model_version:\n"
+                + "      type: string\n"
+                + "      required: false\n"
+                + "    cds_model_name:\n"
+                + "      type: string\n"
+                + "      required: false\n"
+                + "  node_templates:\n"
+                + "    ext ZTE VL 0:\n"
+                + "      type: tosca.nodes.nfv.ext.zte.VL\n"
+                + "      metadata:\n"
+                + "        invariantUUID: 27ab7610-1a97-4daa-938a-3b48e7afcfd0\n"
+                + "        UUID: 9ea63e2c-4b8a-414f-93e3-5703ca5cee0d\n"
+                + "        customizationUUID: e45e79b0-07ab-46b4-ac26-1e9f155ce53c\n"
+                + "        version: '1.0'\n"
+                + "        name: ext ZTE VL\n"
+                + "        description: Ext ZTE VL\n"
+                + "        type: VL\n"
+                + "        category: Generic\n"
+                + "        subcategory: Network Elements\n"
+                + "        resourceVendor: ONAP (Tosca)\n"
+                + "        resourceVendorRelease: 1.0.0.wd03\n"
+                + "        resourceVendorModelNumber: ''\n"
+                + "    zxjTestServiceNotAbatract 0:\n"
+                + "      type: org.openecomp.resource.vf.Zxjtestservicenotabatract\n"
+                + "      metadata:\n"
+                + "        invariantUUID: ce39ce8d-6f97-4e89-8555-ae6789cdcf1c\n"
+                + "        UUID: 4ac822be-f1ae-4ace-a4b8-bf6b5d977005\n"
+                + "        customizationUUID: ee34e1e8-68e2-480f-8ba6-f257bbe90d6a\n"
+                + "        version: '1.0'\n"
+                + "        name: zxjTestServiceNotAbatract\n"
+                + "        description: zxjTestServiceNotAbatract\n"
+                + "        type: VF\n"
+                + "        category: Network L4+\n"
+                + "        subcategory: Common Network Resources\n"
+                + "        resourceVendor: zxjImportService\n"
+                + "        resourceVendorRelease: '1.0'\n"
+                + "        resourceVendorModelNumber: ''\n"
+                + "      properties:\n"
+                + "        nf_naming:\n"
+                + "          ecomp_generated_naming: true\n"
+                + "        skip_post_instantiation_configuration: true\n"
+                + "        multi_stage_design: 'false'\n"
+                + "        controller_actor: SO-REF-DATA\n"
+                + "        availability_zone_max_count: 1\n"
+                + "      capabilities:\n"
+                + "        mme_ipu_vdu.scalable:\n"
+                + "          properties:\n"
+                + "            max_instances: 1\n"
+                + "            min_instances: 1\n"
+                + "        mme_ipu_vdu.nfv_compute:\n"
+                + "          properties:\n"
+                + "            num_cpus: '2'\n"
+                + "            flavor_extra_specs: {\n"
+                + "              }\n"
+                + "            mem_size: '8192'\n"
+                + "    ExtCP 0:\n"
+                + "      type: org.openecomp.resource.cp.extCP\n"
+                + "      metadata:\n"
+                + "        invariantUUID: 9b772728-93f5-424f-bb07-f4cae2783614\n"
+                + "        UUID: 424ac220-4864-453e-b757-917fe4568ff8\n"
+                + "        customizationUUID: 6e65d8a8-4379-4693-87aa-82f9e34b92fd\n"
+                + "        version: '1.0'\n"
+                + "        name: ExtCP\n"
+                + "        description: The AT&T Connection Point base type all other CP derive from\n"
+                + "        type: CP\n"
+                + "        category: Generic\n"
+                + "        subcategory: Network Elements\n"
+                + "        resourceVendor: ONAP (Tosca)\n"
+                + "        resourceVendorRelease: 1.0.0.wd03\n"
+                + "        resourceVendorModelNumber: ''\n"
+                + "      properties:\n"
+                + "        mac_requirements:\n"
+                + "          mac_count_required:\n"
+                + "            is_required: false\n"
+                + "        exCP_naming:\n"
+                + "          ecomp_generated_naming: true\n"
+                + "    zxjTestImportServiceAb 0:\n"
+                + "      type: org.openecomp.resource.vf.Zxjtestimportserviceab\n"
+                + "      metadata:\n"
+                + "        invariantUUID: 41474f7f-3195-443d-a0a2-eb6020a56279\n"
+                + "        UUID: 92e32e49-55f8-46bf-984d-a98c924037ec\n"
+                + "        customizationUUID: 98c7a6c7-a867-45fb-8597-dd464f98e4aa\n"
+                + "        version: '1.0'\n"
+                + "        name: zxjTestImportServiceAb\n"
+                + "        description: zxjTestImportServiceAbstract\n"
+                + "        type: VF\n"
+                + "        category: Generic\n"
+                + "        subcategory: Abstract\n"
+                + "        resourceVendor: zxjImportService\n"
+                + "        resourceVendorRelease: '1.0'\n"
+                + "        resourceVendorModelNumber: ''\n"
+                + "      properties:\n"
+                + "        nf_naming:\n"
+                + "          ecomp_generated_naming: true\n"
+                + "        skip_post_instantiation_configuration: true\n"
+                + "        multi_stage_design: 'false'\n"
+                + "        controller_actor: SO-REF-DATA\n"
+                + "        availability_zone_max_count: 1\n"
+                + "      requirements:\n"
+                + "      - mme_ipu_vdu.dependency:\n"
+                + "          capability: feature\n"
+                + "          node: ExtCP 0\n"
+                + "      - imagefile.dependency:\n"
+                + "          capability: feature\n"
+                + "          node: ext ZTE VL 0\n"
+                + "      capabilities:\n"
+                + "        mme_ipu_vdu.scalable:\n"
+                + "          properties:\n"
+                + "            max_instances: 1\n"
+                + "            min_instances: 1\n"
+                + "        mme_ipu_vdu.nfv_compute:\n"
+                + "          properties:\n"
+                + "            num_cpus: '2'\n"
+                + "            flavor_extra_specs: {\n"
+                + "              }\n"
+                + "            mem_size: '8192'\n"
+                + "  substitution_mappings:\n"
+                + "    node_type: org.openecomp.service.Ser09080002\n"
+                + "    capabilities:\n"
+                + "      extcp0.feature:\n"
+                + "      - ExtCP 0\n"
+                + "      - feature\n"
+                + "      zxjtestservicenotabatract0.mme_ipu_vdu.monitoring_parameter:\n"
+                + "      - zxjTestServiceNotAbatract 0\n"
+                + "      - mme_ipu_vdu.monitoring_parameter\n"
+                + "      zxjtestimportserviceab0.imagefile.guest_os:\n"
+                + "      - zxjTestImportServiceAb 0\n"
+                + "      - imagefile.guest_os\n"
+                + "      zxjtestimportserviceab0.imagefile.feature:\n"
+                + "      - zxjTestImportServiceAb 0\n"
+                + "      - imagefile.feature\n"
+                + "      zxjtestservicenotabatract0.imagefile.guest_os:\n"
+                + "      - zxjTestServiceNotAbatract 0\n"
+                + "      - imagefile.guest_os\n"
+                + "      zxjtestimportserviceab0.ipu_cpd.feature:\n"
+                + "      - zxjTestImportServiceAb 0\n"
+                + "      - ipu_cpd.feature\n"
+                + "      zxjtestservicenotabatract0.mme_ipu_vdu.virtualbinding:\n"
+                + "      - zxjTestServiceNotAbatract 0\n"
+                + "      - mme_ipu_vdu.virtualbinding\n"
+                + "      zxjtestimportserviceab0.mme_ipu_vdu.feature:\n"
+                + "      - zxjTestImportServiceAb 0\n"
+                + "      - mme_ipu_vdu.feature\n"
+                + "      extztevl0.feature:\n"
+                + "      - ext ZTE VL 0\n"
+                + "      - feature\n"
+                + "      zxjtestimportserviceab0.imagefile.image_fle:\n"
+                + "      - zxjTestImportServiceAb 0\n"
+                + "      - imagefile.image_fle\n"
+                + "      zxjtestimportserviceab0.mme_ipu_vdu.monitoring_parameter:\n"
+                + "      - zxjTestImportServiceAb 0\n"
+                + "      - mme_ipu_vdu.monitoring_parameter\n"
+                + "      zxjtestservicenotabatract0.ipu_cpd.feature:\n"
+                + "      - zxjTestServiceNotAbatract 0\n"
+                + "      - ipu_cpd.feature\n"
+                + "      zxjtestservicenotabatract0.mme_ipu_vdu.nfv_compute:\n"
+                + "      - zxjTestServiceNotAbatract 0\n"
+                + "      - mme_ipu_vdu.nfv_compute\n"
+                + "      zxjtestservicenotabatract0.mme_ipu_vdu.scalable:\n"
+                + "      - zxjTestServiceNotAbatract 0\n"
+                + "      - mme_ipu_vdu.scalable\n"
+                + "      extcp0.internal_connectionPoint:\n"
+                + "      - ExtCP 0\n"
+                + "      - internal_connectionPoint\n"
+                + "      zxjtestimportserviceab0.mme_ipu_vdu.virtualbinding:\n"
+                + "      - zxjTestImportServiceAb 0\n"
+                + "      - mme_ipu_vdu.virtualbinding\n"
+                + "      zxjtestservicenotabatract0.imagefile.image_fle:\n"
+                + "      - zxjTestServiceNotAbatract 0\n"
+                + "      - imagefile.image_fle\n"
+                + "      extztevl0.virtual_linkable:\n"
+                + "      - ext ZTE VL 0\n"
+                + "      - virtual_linkable\n"
+                + "      zxjtestservicenotabatract0.imagefile.feature:\n"
+                + "      - zxjTestServiceNotAbatract 0\n"
+                + "      - imagefile.feature\n"
+                + "      zxjtestimportserviceab0.localstorage.feature:\n"
+                + "      - zxjTestImportServiceAb 0\n"
+                + "      - localstorage.feature\n"
+                + "      zxjtestservicenotabatract0.localstorage.local_attachment:\n"
+                + "      - zxjTestServiceNotAbatract 0\n"
+                + "      - localstorage.local_attachment\n"
+                + "      zxjtestimportserviceab0.mme_ipu_vdu.scalable:\n"
+                + "      - zxjTestImportServiceAb 0\n"
+                + "      - mme_ipu_vdu.scalable\n"
+                + "      zxjtestservicenotabatract0.localstorage.feature:\n"
+                + "      - zxjTestServiceNotAbatract 0\n"
+                + "      - localstorage.feature\n"
+                + "      zxjtestimportserviceab0.mme_ipu_vdu.nfv_compute:\n"
+                + "      - zxjTestImportServiceAb 0\n"
+                + "      - mme_ipu_vdu.nfv_compute\n"
+                + "      zxjtestimportserviceab0.localstorage.local_attachment:\n"
+                + "      - zxjTestImportServiceAb 0\n"
+                + "      - localstorage.local_attachment\n"
+                + "      zxjtestservicenotabatract0.mme_ipu_vdu.feature:\n"
+                + "      - zxjTestServiceNotAbatract 0\n"
+                + "      - mme_ipu_vdu.feature\n"
+                + "      zxjtestimportserviceab0.ipu_cpd.forwarder:\n"
+                + "      - zxjTestImportServiceAb 0\n"
+                + "      - ipu_cpd.forwarder\n"
+                + "      zxjtestservicenotabatract0.ipu_cpd.forwarder:\n"
+                + "      - zxjTestServiceNotAbatract 0\n"
+                + "      - ipu_cpd.forwarder\n"
+                + "    requirements:\n"
+                + "      zxjtestservicenotabatract0.imagefile.dependency:\n"
+                + "      - zxjTestServiceNotAbatract 0\n"
+                + "      - imagefile.dependency\n"
+                + "      zxjtestservicenotabatract0.mme_ipu_vdu.local_storage:\n"
+                + "      - zxjTestServiceNotAbatract 0\n"
+                + "      - mme_ipu_vdu.local_storage\n"
+                + "      zxjtestservicenotabatract0.ipu_cpd.dependency:\n"
+                + "      - zxjTestServiceNotAbatract 0\n"
+                + "      - ipu_cpd.dependency\n"
+                + "      zxjtestservicenotabatract0.mme_ipu_vdu.volume_storage:\n"
+                + "      - zxjTestServiceNotAbatract 0\n"
+                + "      - mme_ipu_vdu.volume_storage\n"
+                + "      zxjtestservicenotabatract0.ipu_cpd.virtualbinding:\n"
+                + "      - zxjTestServiceNotAbatract 0\n"
+                + "      - ipu_cpd.virtualbinding\n"
+                + "      zxjtestservicenotabatract0.mme_ipu_vdu.dependency:\n"
+                + "      - zxjTestServiceNotAbatract 0\n"
+                + "      - mme_ipu_vdu.dependency\n"
+                + "      zxjtestservicenotabatract0.localstorage.dependency:\n"
+                + "      - zxjTestServiceNotAbatract 0\n"
+                + "      - localstorage.dependency\n"
+                + "      zxjtestimportserviceab0.imagefile.dependency:\n"
+                + "      - zxjTestImportServiceAb 0\n"
+                + "      - imagefile.dependency\n"
+                + "      zxjtestimportserviceab0.mme_ipu_vdu.volume_storage:\n"
+                + "      - zxjTestImportServiceAb 0\n"
+                + "      - mme_ipu_vdu.volume_storage\n"
+                + "      zxjtestimportserviceab0.ipu_cpd.virtualbinding:\n"
+                + "      - zxjTestImportServiceAb 0\n"
+                + "      - ipu_cpd.virtualbinding\n"
+                + "      extcp0.virtualLink:\n"
+                + "      - ExtCP 0\n"
+                + "      - virtualLink\n"
+                + "      extcp0.virtualBinding:\n"
+                + "      - ExtCP 0\n"
+                + "      - virtualBinding\n"
+                + "      zxjtestimportserviceab0.mme_ipu_vdu.guest_os:\n"
+                + "      - zxjTestImportServiceAb 0\n"
+                + "      - mme_ipu_vdu.guest_os\n"
+                + "      extcp0.dependency:\n"
+                + "      - ExtCP 0\n"
+                + "      - dependency\n"
+                + "      zxjtestimportserviceab0.localstorage.dependency:\n"
+                + "      - zxjTestImportServiceAb 0\n"
+                + "      - localstorage.dependency\n"
+                + "      zxjtestservicenotabatract0.ipu_cpd.virtualLink:\n"
+                + "      - zxjTestServiceNotAbatract 0\n"
+                + "      - ipu_cpd.virtualLink\n"
+                + "      extztevl0.dependency:\n"
+                + "      - ext ZTE VL 0\n"
+                + "      - dependency\n"
+                + "      zxjtestimportserviceab0.ipu_cpd.dependency:\n"
+                + "      - zxjTestImportServiceAb 0\n"
+                + "      - ipu_cpd.dependency\n"
+                + "      zxjtestimportserviceab0.mme_ipu_vdu.dependency:\n"
+                + "      - zxjTestImportServiceAb 0\n"
+                + "      - mme_ipu_vdu.dependency\n"
+                + "      zxjtestimportserviceab0.mme_ipu_vdu.local_storage:\n"
+                + "      - zxjTestImportServiceAb 0\n"
+                + "      - mme_ipu_vdu.local_storage\n"
+                + "      zxjtestimportserviceab0.ipu_cpd.virtualLink:\n"
+                + "      - zxjTestImportServiceAb 0\n"
+                + "      - ipu_cpd.virtualLink\n"
+                + "      extcp0.external_virtualLink:\n"
+                + "      - ExtCP 0\n"
+                + "      - external_virtualLink\n"
+                + "      zxjtestservicenotabatract0.mme_ipu_vdu.guest_os:\n"
+                + "      - zxjTestServiceNotAbatract 0\n"
+                + "      - mme_ipu_vdu.guest_os\n"
+                + "      zxjtestimportserviceab0.ipu_cpd.forwarder:\n"
+                + "      - zxjTestImportServiceAb 0\n"
+                + "      - ipu_cpd.forwarder\n"
+                + "      zxjtestservicenotabatract0.ipu_cpd.forwarder:\n"
+                + "      - zxjTestServiceNotAbatract 0\n"
+                + "      - ipu_cpd.forwarder\n";
+    }
+
+    protected void assertComponentException(ComponentException e, ActionStatus expectedStatus, String... variables) {
+        ResponseFormat actualResponse = e.getResponseFormat() != null ?
+                e.getResponseFormat() : componentsUtils.getResponseFormat(e.getActionStatus(), e.getParams());
+        assertResponse(actualResponse, expectedStatus, variables);
+    }
+
+    protected void assertResponse(ResponseFormat actualResponse, ActionStatus expectedStatus, String... variables) {
+        ResponseFormat expectedResponse = responseManager.getResponseFormat(expectedStatus, variables);
+        assertEquals(expectedResponse.getStatus(), actualResponse.getStatus());
+        assertEquals("assert error description", expectedResponse.getFormattedMessage(), actualResponse.getFormattedMessage());
+    }
+
+}
diff --git a/catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/ServiceImportManagerTest.java b/catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/ServiceImportManagerTest.java
new file mode 100644 (file)
index 0000000..16cc44f
--- /dev/null
@@ -0,0 +1,95 @@
+/*
+
+ * Copyright (c) 2018 AT&T Intellectual Property.
+
+ *
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+
+ * you may not use this file except in compliance with the License.
+
+ * You may obtain a copy of the License at
+
+ *
+
+ *     http://www.apache.org/licenses/LICENSE-2.0
+
+ *
+
+ * Unless required by applicable law or agreed to in writing, software
+
+ * distributed under the License is distributed on an "AS IS" BASIS,
+
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+ * See the License for the specific language governing permissions and
+
+ * limitations under the License.
+
+ */
+
+package org.openecomp.sdc.be.components.impl;
+
+
+import org.junit.Test;
+import org.mockito.InjectMocks;
+import org.openecomp.sdc.be.model.Service;
+import org.openecomp.sdc.be.model.UploadServiceInfo;
+
+
+
+public class ServiceImportManagerTest {
+    @InjectMocks
+    private ServiceImportManager serviceImportManager;
+
+    private ServiceImportManager createTestSubject() {
+        return new ServiceImportManager();
+    }
+
+    @Test
+    public void testGetServiceImportBusinessLogic() {
+        ServiceImportManager testSubject;
+        ServiceImportBusinessLogic result;
+
+        testSubject = createTestSubject();
+        result = testSubject.getServiceImportBusinessLogic();
+    }
+
+    @Test
+    public void testSetServiceImportBusinessLogic() {
+        ServiceImportManager testSubject;
+        ServiceImportBusinessLogic serviceImportBusinessLogic=null;
+
+        testSubject = createTestSubject();
+        testSubject.setServiceImportBusinessLogic(serviceImportBusinessLogic);
+    }
+
+
+    @Test
+    public void testGetServiceBusinessLogic() {
+        ServiceImportManager testSubject;
+        ServiceBusinessLogic result;
+
+        testSubject = createTestSubject();
+        result = testSubject.getServiceBusinessLogic();
+    }
+
+    @Test
+    public void testSetServiceBusinessLogic() {
+        ServiceImportManager testSubject;
+        ServiceBusinessLogic serviceBusinessLogic = null;
+
+        testSubject = createTestSubject();
+        testSubject.setServiceBusinessLogic(serviceBusinessLogic);
+    }
+
+    @Test
+    public void testPopulateServiceMetadata() {
+        UploadServiceInfo serviceMetaData = null;
+        Service service = null;
+        if (serviceMetaData != null || service != null) {
+            serviceImportManager.populateServiceMetadata(serviceMetaData, service);
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/ServiceImportParseLogicTest.java b/catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/ServiceImportParseLogicTest.java
new file mode 100644 (file)
index 0000000..18408dc
--- /dev/null
@@ -0,0 +1,2152 @@
+/*
+ * Copyright (C) 2020 CMCC, Inc. and others. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.openecomp.sdc.be.components.impl;
+
+import static org.assertj.core.api.Java6Assertions.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.anyObject;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.when;
+import static org.openecomp.sdc.be.auditing.impl.AuditTestUtils.RESOURCE_NAME;
+
+import fj.data.Either;
+import java.io.IOException;
+import java.nio.file.FileSystems;
+import java.nio.file.Files;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.EnumMap;
+import java.util.HashSet;
+import java.util.List;
+
+import java.util.Map.Entry;
+import java.util.Set;
+import org.apache.commons.collections.map.HashedMap;
+import org.apache.commons.lang3.tuple.ImmutablePair;
+import org.apache.commons.lang3.tuple.MutablePair;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.ArgumentMatchers;
+import org.mockito.InjectMocks;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.sdc.ElementOperationMock;
+import org.openecomp.sdc.be.auditing.impl.AuditingManager;
+import org.openecomp.sdc.be.components.csar.CsarInfo;
+import org.openecomp.sdc.be.components.impl.ArtifactsBusinessLogic.ArtifactOperationEnum;
+import org.openecomp.sdc.be.components.impl.artifact.ArtifactOperationInfo;
+import org.openecomp.sdc.be.components.impl.exceptions.ComponentException;
+import org.openecomp.sdc.be.components.lifecycle.LifecycleChangeInfoWithAction;
+import org.openecomp.sdc.be.dao.api.ActionStatus;
+import org.openecomp.sdc.be.dao.janusgraph.JanusGraphOperationStatus;
+import org.openecomp.sdc.be.datatypes.elements.AttributeDataDefinition;
+import org.openecomp.sdc.be.datatypes.elements.GetInputValueDataDefinition;
+import org.openecomp.sdc.be.datatypes.elements.ListCapabilityDataDefinition;
+import org.openecomp.sdc.be.datatypes.elements.ListRequirementDataDefinition;
+import org.openecomp.sdc.be.datatypes.elements.PropertyDataDefinition;
+import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
+import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
+import org.openecomp.sdc.be.datatypes.enums.ResourceTypeEnum;
+import org.openecomp.sdc.be.impl.ComponentsUtils;
+import org.openecomp.sdc.be.model.ArtifactDefinition;
+import org.openecomp.sdc.be.model.CapabilityDefinition;
+import org.openecomp.sdc.be.model.CapabilityTypeDefinition;
+import org.openecomp.sdc.be.model.Component;
+import org.openecomp.sdc.be.model.ComponentInstance;
+import org.openecomp.sdc.be.model.ComponentInstanceInput;
+import org.openecomp.sdc.be.model.ComponentInstanceProperty;
+import org.openecomp.sdc.be.model.ComponentParametersView;
+import org.openecomp.sdc.be.model.DataTypeDefinition;
+import org.openecomp.sdc.be.model.GroupDefinition;
+import org.openecomp.sdc.be.model.InputDefinition;
+import org.openecomp.sdc.be.model.InterfaceDefinition;
+import org.openecomp.sdc.be.model.LifecycleStateEnum;
+import org.openecomp.sdc.be.model.NodeTypeInfo;
+import org.openecomp.sdc.be.model.Operation;
+import org.openecomp.sdc.be.model.PropertyDefinition;
+import org.openecomp.sdc.be.model.RequirementCapabilityRelDef;
+import org.openecomp.sdc.be.model.RequirementDefinition;
+import org.openecomp.sdc.be.model.Resource;
+import org.openecomp.sdc.be.model.Service;
+import org.openecomp.sdc.be.model.UploadCapInfo;
+import org.openecomp.sdc.be.model.UploadComponentInstanceInfo;
+import org.openecomp.sdc.be.model.UploadPropInfo;
+import org.openecomp.sdc.be.model.UploadReqInfo;
+import org.openecomp.sdc.be.model.UploadResourceInfo;
+import org.openecomp.sdc.be.model.User;
+import org.openecomp.sdc.be.model.category.CategoryDefinition;
+import org.openecomp.sdc.be.model.category.SubCategoryDefinition;
+import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ToscaOperationFacade;
+import org.openecomp.sdc.be.model.operations.api.ICapabilityTypeOperation;
+import org.openecomp.sdc.be.model.User;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.openecomp.sdc.be.model.operations.api.IElementOperation;
+import org.openecomp.sdc.be.model.operations.api.IInterfaceLifecycleOperation;
+import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
+import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum;
+import org.openecomp.sdc.be.user.Role;
+import org.openecomp.sdc.common.api.Constants;
+import org.openecomp.sdc.common.util.ValidationUtils;
+import org.openecomp.sdc.exception.ResponseFormat;
+
+public class ServiceImportParseLogicTest extends ServiceImportBussinessLogicBaseTestSetup {
+
+    ComponentsUtils componentsUtils =  new ComponentsUtils(Mockito.mock(AuditingManager.class));
+    ToscaOperationFacade toscaOperationFacade = Mockito.mock(ToscaOperationFacade.class);
+    ServiceBusinessLogic serviceBusinessLogic = Mockito.mock(ServiceBusinessLogic.class);
+    ICapabilityTypeOperation capabilityTypeOperation = Mockito.mock(ICapabilityTypeOperation.class);
+    IElementOperation elementDao = Mockito.mock(IElementOperation.class);
+    IInterfaceLifecycleOperation interfaceTypeOperation = Mockito.mock(IInterfaceLifecycleOperation.class);
+    InputsBusinessLogic inputsBusinessLogic = Mockito.mock(InputsBusinessLogic.class);
+
+    private static final String RESOURCE_NAME = "My-Resource_Name with   space";
+    private static final String RESOURCE_TOSCA_NAME = "My-Resource_Tosca_Name";
+    private static final String GENERIC_ROOT_NAME = "tosca.nodes.Root";
+    private static final String GENERIC_VF_NAME = "org.openecomp.resource.abstract.nodes.VF";
+    private static final String GENERIC_CR_NAME = "org.openecomp.resource.abstract.nodes.CR";
+    private static final String GENERIC_PNF_NAME = "org.openecomp.resource.abstract.nodes.PNF";
+    private static final String RESOURCE_CATEGORY1 = "Network Layer 2-3";
+    private static final String RESOURCE_SUBCATEGORY = "Router";
+
+    @InjectMocks
+    private ServiceImportParseLogic serviceImportParseLogic;
+    ResponseFormatManager responseManager = null;
+    User user = null;
+
+    private ServiceImportParseLogic createTestSubject() {
+        return new ServiceImportParseLogic();
+    }
+
+    ServiceImportParseLogic bl;
+
+
+    @Before
+    public void setup() {
+        MockitoAnnotations.initMocks(this);
+
+        // Elements
+        mockElementDao = new ElementOperationMock();
+
+        // User data and management
+        user = new User();
+        user.setUserId("jh0003");
+        user.setFirstName("Jimmi");
+        user.setLastName("Hendrix");
+        user.setRole(Role.ADMIN.name());
+        responseManager = ResponseFormatManager.getInstance();
+
+        bl = new ServiceImportParseLogic();
+        bl.setComponentsUtils(componentsUtils);
+        bl.setToscaOperationFacade(toscaOperationFacade);
+        serviceBusinessLogic.setElementDao(elementDao);
+        bl.setServiceBusinessLogic(serviceBusinessLogic);
+        bl.setCapabilityTypeOperation(capabilityTypeOperation);
+        bl.setInterfaceTypeOperation(interfaceTypeOperation);
+        bl.setInputsBusinessLogic(inputsBusinessLogic);
+
+    }
+
+    @Test
+    public void testGetServiceBusinessLogic() {
+        ServiceImportParseLogic testSubject;
+        ServiceBusinessLogic result;
+
+        testSubject = createTestSubject();
+        result = testSubject.getServiceBusinessLogic();
+    }
+
+    @Test
+    public void testSetServiceBusinessLogic() {
+        ServiceImportParseLogic testSubject;
+        ServiceBusinessLogic serviceBusinessLogic = null;
+
+        testSubject = createTestSubject();
+        testSubject.setServiceBusinessLogic(serviceBusinessLogic);
+    }
+
+    @Test
+    public void testGetCapabilityTypeOperation() {
+        ServiceImportParseLogic testSubject;
+        ICapabilityTypeOperation result;
+
+        testSubject = createTestSubject();
+        result = testSubject.getCapabilityTypeOperation();
+    }
+
+    @Test
+    public void testSetCapabilityTypeOperation() {
+        ServiceImportParseLogic testSubject;
+        ICapabilityTypeOperation iCapabilityTypeOperation = null;
+
+        testSubject = createTestSubject();
+        testSubject.setCapabilityTypeOperation(iCapabilityTypeOperation);
+    }
+
+    private CsarInfo createCsarInfo() {
+        Map<String, byte[]> csar = new HashMap<>();
+        User user = new User();
+        CsarInfo csarInfo = new CsarInfo(user, "csar_UUID", csar, "vfResourceName", "mainTemplateName",
+            "mainTemplateContent", true);
+        csarInfo.setVfResourceName("vfResourceName");
+        csarInfo.setCsar(csar);
+        csarInfo.setCsarUUID("csarUUID");
+        csarInfo.setModifier(user);
+        csarInfo.setUpdate(true);
+        return csarInfo;
+    }
+
+    @Test
+    public void testFindNodeTypesArtifactsToHandle() {
+        ServiceImportParseLogic testSubject = createTestSubject();
+        Map<String, NodeTypeInfo> nodeTypesInfo = new HashedMap();
+        final Service service = createServiceObject(false);
+
+        bl.findNodeTypesArtifactsToHandle(
+            nodeTypesInfo, getCsarInfo(), service);
+    }
+
+    @Test
+    public void testBuildNodeTypeYaml() {
+        Map.Entry<String, Object> nodeNameValue = new Entry<String, Object>() {
+            @Override
+            public String getKey() {
+                return null;
+            }
+
+            @Override
+            public Object getValue() {
+                return null;
+            }
+
+            @Override
+            public Object setValue(Object value) {
+                return null;
+            }
+        };
+        Map<String, Object> mapToConvert = new HashMap<>();
+        String nodeResourceType = Constants.USER_DEFINED_RESOURCE_NAMESPACE_PREFIX;
+
+        try {
+            bl.buildNodeTypeYaml(
+                nodeNameValue, mapToConvert, nodeResourceType, getCsarInfo());
+        } catch (ComponentException e) {
+            assertComponentException(e, ActionStatus.INVALID_TOSCA_TEMPLATE,
+                ComponentTypeEnum.RESOURCE.getValue());
+        }
+    }
+
+    @Test
+    public void testFindAddNodeTypeArtifactsToHandle() {
+
+        Map<String, List<ArtifactDefinition>> extractedVfcsArtifacts = new HashMap<>();
+        Map<String, EnumMap<ArtifactOperationEnum, List<ArtifactDefinition>>> nodeTypesArtifactsToHandle = new HashMap<>();
+        String namespace = "namespace";
+
+        ImmutablePair p1 = ImmutablePair.<String, String>of("s", "sd");
+        Map<String, NodeTypeInfo> nodeTypesInfo = new HashedMap();
+        final Service service = createServiceObject(false);
+        Resource resource = new Resource();
+        Either<Component, StorageOperationStatus> getCompLatestResult = Either.left(resource);
+        when(toscaOperationFacade.getLatestByToscaResourceName(anyString()))
+            .thenReturn(getCompLatestResult);
+        try {
+            bl.findAddNodeTypeArtifactsToHandle(getCsarInfo(), nodeTypesArtifactsToHandle, service,
+                extractedVfcsArtifacts, namespace, p1);
+        } catch (ComponentException e) {
+            assertComponentException(e, ActionStatus.INVALID_TOSCA_TEMPLATE,
+                ComponentTypeEnum.RESOURCE.getValue());
+        }
+    }
+
+    @Test
+    public void testHandleAndAddExtractedVfcsArtifacts() {
+
+        List<ArtifactDefinition> vfcArtifacts = new ArrayList<>();
+        List<ArtifactDefinition> artifactsToAdd = new ArrayList<>();
+        bl.handleAndAddExtractedVfcsArtifacts(vfcArtifacts, artifactsToAdd);
+    }
+
+    @Test
+    public void testFindNodeTypeArtifactsToHandle() {
+
+        Resource curNodeType = createParseResourceObject(true);
+        List<ArtifactDefinition> extractedArtifacts = new ArrayList<>();
+        bl.findNodeTypeArtifactsToHandle(curNodeType, extractedArtifacts);
+    }
+
+    @Test
+    public void testCollectExistingArtifacts() {
+
+        Resource curNodeType = createParseResourceObject(true);
+        bl.collectExistingArtifacts(curNodeType);
+    }
+
+    @Test
+    public void testPutFoundArtifacts() {
+        ArtifactDefinition artifactDefinition = new ArtifactDefinition();
+        List<ArtifactDefinition> artifactsToUpload = new ArrayList<>();
+        artifactsToUpload.add(artifactDefinition);
+        List<ArtifactDefinition> artifactsToUpdate = new ArrayList<>();
+        artifactsToUpdate.add(artifactDefinition);
+        List<ArtifactDefinition> artifactsToDelete = new ArrayList<>();
+        artifactsToDelete.add(artifactDefinition);
+        bl.putFoundArtifacts(artifactsToUpload, artifactsToUpdate, artifactsToDelete);
+    }
+
+    @Test
+    public void testProcessExistingNodeTypeArtifacts() {
+        ArtifactDefinition artifactDefinition = new ArtifactDefinition();
+        List<ArtifactDefinition> extractedArtifacts = new ArrayList<>();
+        extractedArtifacts.add(artifactDefinition);
+        List<ArtifactDefinition> artifactsToUpload = new ArrayList<>();
+        artifactsToUpload.add(artifactDefinition);
+        List<ArtifactDefinition> artifactsToUpdate = new ArrayList<>();
+        artifactsToUpdate.add(artifactDefinition);
+        List<ArtifactDefinition> artifactsToDelete = new ArrayList<>();
+        artifactsToDelete.add(artifactDefinition);
+        Map<String, ArtifactDefinition> existingArtifacts = new HashMap<>();
+        existingArtifacts.put("test", artifactDefinition);
+        try {
+            bl.processExistingNodeTypeArtifacts(extractedArtifacts, artifactsToUpload, artifactsToUpdate,
+                artifactsToDelete, existingArtifacts);
+        } catch (ComponentException e) {
+            assertComponentException(e, ActionStatus.GENERAL_ERROR,
+                ComponentTypeEnum.RESOURCE.getValue());
+        }
+
+    }
+
+    @Test
+    public void testProcessNodeTypeArtifact() {
+        List<ArtifactDefinition> artifactsToUpload = new ArrayList<>();
+        List<ArtifactDefinition> artifactsToUpdate = new ArrayList<>();
+        Map<String, ArtifactDefinition> existingArtifacts = new HashMap<>();
+        ArtifactDefinition currNewArtifact = new ArtifactDefinition();
+        bl.processNodeTypeArtifact(artifactsToUpload, artifactsToUpdate, existingArtifacts, currNewArtifact);
+    }
+
+    @Test
+    public void testUpdateFoundArtifact() {
+        List<ArtifactDefinition> artifactsToUpdate = new ArrayList<>();
+        ArtifactDefinition currNewArtifact = new ArtifactDefinition();
+        currNewArtifact.setArtifactChecksum("090909");
+        currNewArtifact.setPayloadData("data");
+        ArtifactDefinition foundArtifact = new ArtifactDefinition();
+        foundArtifact.setArtifactChecksum("08767");
+        bl.updateFoundArtifact(artifactsToUpdate, currNewArtifact, foundArtifact);
+    }
+
+    @Test
+    public void testIsArtifactDeletionRequired() {
+        String artifactId = "artifactId";
+        byte[] artifactFileBytes = new byte[100];
+        boolean isFromCsar = true;
+        bl.isArtifactDeletionRequired(artifactId, artifactFileBytes, isFromCsar);
+    }
+
+    @Test
+    public void testFillGroupsFinalFields() {
+        List<GroupDefinition> groupsAsList = new ArrayList<>();
+        bl.fillGroupsFinalFields(groupsAsList);
+    }
+
+    @Test
+    public void testGetComponentTypeForResponse() {
+        Resource resource = createParseResourceObject(true);
+        bl.getComponentTypeForResponse(resource);
+    }
+
+    @Test
+    public void testGetComponentTypeForResponseByService() {
+        Service service = createServiceObject(true);
+        bl.getComponentTypeForResponse(service);
+    }
+
+    @Test
+    public void testIsfillGroupMemebersRecursivlyStopCondition() {
+        String groupName = "groupName";
+        Map<String, GroupDefinition> allGroups = new HashMap<>();
+        Set<String> allGroupMembers = new HashSet<>();
+        bl.isfillGroupMemebersRecursivlyStopCondition(groupName, allGroups, allGroupMembers);
+    }
+
+    @Test
+    public void testIsfillGroupMemebersRecursivlyStopCondition2() {
+        String groupName = "groupName";
+        Map<String, GroupDefinition> allGroups = new HashMap<>();
+        GroupDefinition groupDefinition = new GroupDefinition();
+        Map<String, String> members = new HashMap<>();
+        members.put("members", "members");
+        groupDefinition.setMembers(members);
+        allGroups.put(groupName, groupDefinition);
+        Set<String> allGroupMembers = new HashSet<>();
+        bl.isfillGroupMemebersRecursivlyStopCondition(groupName, allGroups, allGroupMembers);
+    }
+
+    @Test
+    public void testBuildValidComplexVfc() {
+        Resource resource = createParseResourceObject(true);
+        String nodeName = "org.openecomp.resource.derivedFrom.zxjTestImportServiceAb.test";
+        Map<String, NodeTypeInfo> nodesInfo = new HashMap<>();
+        NodeTypeInfo nodeTypeInfo = new NodeTypeInfo();
+        List<String> derivedFrom = new ArrayList<>();
+        derivedFrom.add("derivedFrom");
+        nodeTypeInfo.setDerivedFrom(derivedFrom);
+        nodesInfo.put(nodeName, nodeTypeInfo);
+
+        try {
+            bl.buildValidComplexVfc(resource, getCsarInfo(), nodeName, nodesInfo);
+        } catch (ComponentException e) {
+            assertComponentException(e, ActionStatus.GENERAL_ERROR,
+                ComponentTypeEnum.RESOURCE.getValue());
+        }
+    }
+
+    @Test
+    public void testValidateResourceBeforeCreate() {
+        Resource resource = createParseResourceObject(true);
+
+        try {
+            bl.getServiceBusinessLogic().setElementDao(elementDao);
+            bl.validateResourceBeforeCreate(resource, user, AuditingActionEnum.IMPORT_RESOURCE,false, getCsarInfo());
+        } catch (ComponentException e) {
+            assertComponentException(e, ActionStatus.GENERAL_ERROR,
+                ComponentTypeEnum.RESOURCE.getValue());
+        }
+
+    }
+
+    @Test
+    public void testValidateResourceType() {
+        Resource resource = createParseResourceObject(true);
+        bl.validateResourceType( user, resource, AuditingActionEnum.IMPORT_RESOURCE);
+    }
+
+    @Test
+    public void testValidateResourceTypeIsEmpty() {
+        Resource resource = new Resource();
+        resource.setResourceType(null);
+        bl.validateResourceType(user, resource, AuditingActionEnum.IMPORT_RESOURCE);
+    }
+
+    @Test
+    public void testValidateLifecycleTypesCreate() {
+        Resource resource = createParseResourceObject(true);
+        Map<String, InterfaceDefinition> mapInterfaces = new HashMap<>();
+        InterfaceDefinition interfaceDefinition = new InterfaceDefinition();
+        String uniqueId = "01932342212";
+        interfaceDefinition.setUniqueId(uniqueId);
+        mapInterfaces.put("uniqueId", interfaceDefinition);
+        resource.setInterfaces(mapInterfaces);
+        when(interfaceTypeOperation.getInterface(anyString())).thenReturn(Either.right(StorageOperationStatus.NOT_FOUND));
+        bl.validateLifecycleTypesCreate(user, resource, AuditingActionEnum.IMPORT_RESOURCE);
+    }
+
+    @Test
+    public void testValidateCapabilityTypesCreate() {
+        Resource resource = createParseResourceObject(true);
+        Map<String, List<CapabilityDefinition>> capabilities = new HashMap<>();
+        String uniqueId = "18982938994";
+        List<CapabilityDefinition> capabilityDefinitionList= new ArrayList<>();
+        CapabilityDefinition capabilityDefinition = new CapabilityDefinition();
+        capabilityDefinitionList.add(capabilityDefinition);
+        capabilities.put(uniqueId, capabilityDefinitionList);
+        resource.setCapabilities(capabilities);
+        when(capabilityTypeOperation.getCapabilityType(anyString(), anyBoolean())).
+            thenReturn(Either.right(StorageOperationStatus.NOT_FOUND));
+        try {
+            bl.validateCapabilityTypesCreate(user, bl.getCapabilityTypeOperation(), resource,
+                AuditingActionEnum.IMPORT_RESOURCE, true);
+        } catch (ComponentException e) {
+            assertComponentException(e, ActionStatus.INVALID_TOSCA_TEMPLATE,
+                ComponentTypeEnum.RESOURCE.getValue());
+        }
+    }
+
+    @Test
+    public void testValidateCapabilityTypesCreateWhenHaveCapability() {
+        Resource resource = createParseResourceObject(true);
+        Map<String, List<CapabilityDefinition>> capabilities = new HashMap<>();
+        String uniqueId = "18982938994";
+        List<CapabilityDefinition> capabilityDefinitionList= new ArrayList<>();
+        CapabilityDefinition capabilityDefinition = new CapabilityDefinition();
+        capabilityDefinitionList.add(capabilityDefinition);
+        capabilities.put(uniqueId, capabilityDefinitionList);
+        resource.setCapabilities(capabilities);
+        CapabilityTypeDefinition capabilityTypeDefinition = new CapabilityTypeDefinition();
+        when(capabilityTypeOperation.getCapabilityType(anyString(), anyBoolean())).
+            thenReturn(Either.left(capabilityTypeDefinition));
+        try {
+            bl.validateCapabilityTypesCreate(user, bl.getCapabilityTypeOperation(), resource,
+                AuditingActionEnum.IMPORT_RESOURCE, true);
+        } catch (ComponentException e) {
+            assertComponentException(e, ActionStatus.INVALID_TOSCA_TEMPLATE,
+                ComponentTypeEnum.RESOURCE.getValue());
+        }
+    }
+
+    @Test
+    public void testValidateCapabilityTypeExists() {
+        Resource resource = createParseResourceObject(true);
+        Either<Boolean, ResponseFormat> eitherResult = Either.left(true);
+        for (Map.Entry<String, List<CapabilityDefinition>> typeEntry : resource.getCapabilities().entrySet()) {
+
+            bl.validateCapabilityTypeExists(user, bl.getCapabilityTypeOperation(), resource,
+                AuditingActionEnum.IMPORT_RESOURCE,
+                eitherResult, typeEntry, false);
+        }
+    }
+
+    @Test
+    public void testValidateCapabilityTypeExistsWhenPropertiesIsNull() {
+        Resource resource = createParseResourceObject(true);
+        Either<Boolean, ResponseFormat> eitherResult = Either.left(true);
+        CapabilityTypeDefinition capabilityTypeDefinition = new CapabilityTypeDefinition();
+
+        String uniqueId = "0987348532";
+        PropertyDefinition propertyDefinition = new PropertyDefinition();
+        Map<String, PropertyDefinition> properties = new HashMap<>();
+        properties.put(uniqueId, propertyDefinition);
+        capabilityTypeDefinition.setProperties(properties);
+
+        Map<String, List<CapabilityDefinition>> capabilities = new HashMap<>();
+        List<CapabilityDefinition> capabilityDefinitionList = new ArrayList<>();
+        CapabilityDefinition capabilityDefinition = new CapabilityDefinition();
+        capabilityDefinitionList.add(capabilityDefinition);
+        capabilities.put(uniqueId, capabilityDefinitionList);
+        resource.setCapabilities(capabilities);
+
+        when(capabilityTypeOperation.getCapabilityType(anyString(), anyBoolean())).
+            thenReturn(Either.left(capabilityTypeDefinition));
+        for (Map.Entry<String, List<CapabilityDefinition>> typeEntry : resource.getCapabilities().entrySet()) {
+
+            bl.validateCapabilityTypeExists(user, bl.getCapabilityTypeOperation(), resource,
+                AuditingActionEnum.IMPORT_RESOURCE,
+                eitherResult, typeEntry, false);
+        }
+    }
+
+    @Test
+    public void testValidateCapabilityTypeExistsWhenPropertiesNotNull() {
+        Resource resource = createParseResourceObject(true);
+        Either<Boolean, ResponseFormat> eitherResult = Either.left(true);
+        CapabilityTypeDefinition capabilityTypeDefinition = new CapabilityTypeDefinition();
+
+        String uniqueId = "0987348532";
+        PropertyDefinition propertyDefinition = new PropertyDefinition();
+        propertyDefinition.setName(uniqueId);
+        Map<String, PropertyDefinition> properties = new HashMap<>();
+        properties.put(uniqueId, propertyDefinition);
+        capabilityTypeDefinition.setProperties(properties);
+
+        Map<String, List<CapabilityDefinition>> capabilities = new HashMap<>();
+
+
+        List<CapabilityDefinition> capabilityDefinitionList = new ArrayList<>();
+        List<ComponentInstanceProperty> componentInstancePropertyList = new ArrayList<>();
+        ComponentInstanceProperty componentInstanceProperty = new ComponentInstanceProperty();
+        componentInstanceProperty.setValueUniqueUid(uniqueId);
+        componentInstanceProperty.setName(uniqueId);
+        componentInstancePropertyList.add(componentInstanceProperty);
+        CapabilityDefinition capabilityDefinition = new CapabilityDefinition();
+        capabilityDefinition.setProperties(componentInstancePropertyList);
+        capabilityDefinitionList.add(capabilityDefinition);
+
+        capabilities.put(uniqueId, capabilityDefinitionList);
+        resource.setCapabilities(capabilities);
+
+
+        when(capabilityTypeOperation.getCapabilityType(anyString(), anyBoolean())).
+            thenReturn(Either.left(capabilityTypeDefinition));
+        for (Map.Entry<String, List<CapabilityDefinition>> typeEntry : resource.getCapabilities().entrySet()) {
+
+            bl.validateCapabilityTypeExists(user, bl.getCapabilityTypeOperation(), resource,
+                AuditingActionEnum.IMPORT_RESOURCE,
+                eitherResult, typeEntry, false);
+        }
+    }
+
+    @Test
+    public void testValidateCapabilityTypeExists2() {
+        Resource resource = createParseResourceObject(true);
+        Either<Boolean, ResponseFormat> eitherResult = Either.left(true);
+        when(capabilityTypeOperation.getCapabilityType(anyString(), anyBoolean())).
+            thenReturn(Either.right(StorageOperationStatus.NOT_FOUND));
+        try {
+            for (String type : resource.getRequirements().keySet()) {
+                bl.validateCapabilityTypeExists(user, bl.getCapabilityTypeOperation(), resource,
+                    resource.getRequirements().get(type), AuditingActionEnum.IMPORT_RESOURCE, eitherResult, type,
+                    false);
+            }
+        } catch (ComponentException e) {
+            assertComponentException(e, ActionStatus.INVALID_TOSCA_TEMPLATE,
+                ComponentTypeEnum.RESOURCE.getValue());
+        }
+
+
+    }
+
+    @Test
+    public void testValidateResourceFieldsBeforeCreate() {
+        Resource resource = createParseResourceObject(true);
+        try {
+            bl.validateResourceFieldsBeforeCreate( user, resource, AuditingActionEnum.IMPORT_RESOURCE, true);
+        } catch (ComponentException e) {
+            assertComponentException(e, ActionStatus.GENERAL_ERROR,
+                ComponentTypeEnum.RESOURCE.getValue());
+        }
+    }
+
+    @Test
+    public void testValidateDerivedFromExist() {
+        Resource resource = createParseResourceObject(true);
+        try {
+            when(toscaOperationFacade.validateToscaResourceNameExists(anyString()))
+                .thenReturn(Either.left(true));
+            bl.validateDerivedFromExist( user, resource, AuditingActionEnum.IMPORT_RESOURCE);
+        } catch (ComponentException e) {
+            assertComponentException(e, ActionStatus.GENERAL_ERROR,
+                ComponentTypeEnum.RESOURCE.getValue());
+        }
+    }
+
+    @Test
+    public void testValidateDerivedFromExistFailure1() {
+        Resource resource = createParseResourceObject(true);
+        try {
+            when(toscaOperationFacade.validateToscaResourceNameExists(anyString()))
+                .thenReturn(Either.left(false));
+            bl.validateDerivedFromExist( user, resource, AuditingActionEnum.IMPORT_RESOURCE);
+        } catch (ComponentException e) {
+            assertComponentException(e, ActionStatus.PARENT_RESOURCE_NOT_FOUND,
+                ComponentTypeEnum.RESOURCE.getValue());
+        }
+    }
+
+    @Test
+    public void testValidateDerivedFromExistFailure2() {
+        Resource resource = createParseResourceObject(true);
+        try {
+            when(toscaOperationFacade.validateToscaResourceNameExists(anyString()))
+                .thenReturn(Either.right(StorageOperationStatus.OK));
+            bl.validateDerivedFromExist( user, resource, AuditingActionEnum.IMPORT_RESOURCE);
+        } catch (ComponentException e) {
+            assertComponentException(e, ActionStatus.OK,
+                ComponentTypeEnum.RESOURCE.getValue());
+        }
+    }
+
+    @Test
+    public void testValidateLicenseType() {
+        Resource resource = createParseResourceObject(true);
+
+        try {
+            bl.validateLicenseType( user, resource, AuditingActionEnum.IMPORT_RESOURCE);
+        } catch (ComponentException e) {
+            assertComponentException(e, ActionStatus.INVALID_CONTENT,
+                ComponentTypeEnum.RESOURCE.getValue());
+        }
+
+
+    }
+
+    @Test
+    public void testValidateCost() {
+        Resource resource = createParseResourceObject(true);
+        try {
+            bl.validateCost( resource);
+        } catch (ComponentException e) {
+            assertComponentException(e, ActionStatus.INVALID_CONTENT,
+                ComponentTypeEnum.RESOURCE.getValue());
+        }
+    }
+
+    @Test
+    public void testValidateResourceVendorModelNumber() {
+        Resource resource = createParseResourceObject(true);
+        bl.validateResourceVendorModelNumber( user, resource, AuditingActionEnum.IMPORT_RESOURCE);
+    }
+
+    @Test
+    public void testValidateResourceVendorModelNumberWrongLen() {
+        Resource resource = createParseResourceObject(true);
+        resource.setResourceVendorModelNumber("000000000011122221111222333444443222556677788778889999998776554332340");
+        try {
+            bl.validateResourceVendorModelNumber( user, resource, AuditingActionEnum.IMPORT_RESOURCE);
+        } catch (ComponentException e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testValidateResourceVendorModelNumberWrongValue() {
+        Resource resource = createParseResourceObject(true);
+        resource.setResourceVendorModelNumber("");
+        try {
+            bl.validateResourceVendorModelNumber( user, resource, AuditingActionEnum.IMPORT_RESOURCE);
+        } catch (ComponentException e) {
+            assertComponentException(e, ActionStatus.INVALID_RESOURCE_VENDOR_MODEL_NUMBER,
+                ComponentTypeEnum.RESOURCE.getValue());
+        }
+    }
+
+    @Test
+    public void testValidateVendorReleaseName() {
+        Resource resource = createParseResourceObject(true);
+        resource.setVendorRelease("0.1");
+        bl.validateVendorReleaseName( user, resource, AuditingActionEnum.IMPORT_RESOURCE);
+    }
+
+    @Test
+    public void testValidateVendorReleaseNameFailure() {
+        Resource resource = createParseResourceObject(true);
+        resource.setVendorRelease("");
+        try {
+            bl.validateVendorReleaseName( user, resource, AuditingActionEnum.IMPORT_RESOURCE);
+        } catch (ComponentException e) {
+            assertComponentException(e, ActionStatus.MISSING_VENDOR_RELEASE,
+                ComponentTypeEnum.RESOURCE.getValue());
+        }
+
+    }
+
+    @Test
+    public void testValidateVendorReleaseNameWrongLen() {
+        Resource resource = createParseResourceObject(true);
+        resource.setVendorRelease("000000000011122221111222333444443222556677788778889999998776554332340");
+        try {
+            bl.validateVendorReleaseName(user, resource, AuditingActionEnum.IMPORT_RESOURCE);
+        } catch (ComponentException e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testValidateCategory() {
+        Resource resource = createParseResourceObject(true);
+        try {
+            bl.validateCategory( user, resource, AuditingActionEnum.IMPORT_RESOURCE, true);
+        } catch (ComponentException e) {
+            assertComponentException(e, ActionStatus.GENERAL_ERROR,
+                ComponentTypeEnum.RESOURCE.getValue());
+        }
+    }
+
+    @Test
+    public void testValidateEmptyCategory() {
+        Resource resource = createParseResourceObject(true);
+        resource.setCategories(null);
+        try {
+            bl.validateCategory(user, resource, AuditingActionEnum.IMPORT_RESOURCE, true);
+        } catch (ComponentException e) {
+            assertComponentException(e, ActionStatus.COMPONENT_MISSING_CATEGORY,
+                ComponentTypeEnum.RESOURCE.getValue());
+        }
+    }
+
+    @Test
+    public void testValidateCategorySizeBiggerThan1() {
+        Resource resource = createParseResourceObject(true);
+        List<CategoryDefinition> categories = new ArrayList<>();
+        CategoryDefinition categoryDefinition1 = new CategoryDefinition();
+        CategoryDefinition categoryDefinition2 = new CategoryDefinition();
+        categories.add(categoryDefinition1);
+        categories.add(categoryDefinition2);
+
+        resource.setCategories(categories);
+        try {
+            bl.validateCategory(user, resource, AuditingActionEnum.IMPORT_RESOURCE, true);
+        } catch (ComponentException e) {
+            assertComponentException(e, ActionStatus.COMPONENT_TOO_MUCH_CATEGORIES,
+                ComponentTypeEnum.RESOURCE.getValue());
+        }
+    }
+
+    @Test
+    public void testValidateEmptySubCategory() {
+        Resource resource = createParseResourceObject(true);
+        List<CategoryDefinition> categories = resource.getCategories();
+        CategoryDefinition categoryDefinition = categories.get(0);
+        categoryDefinition.setSubcategories(null);
+
+        try {
+            bl.validateCategory(user, resource, AuditingActionEnum.IMPORT_RESOURCE, true);
+        } catch (ComponentException e) {
+            assertComponentException(e, ActionStatus.COMPONENT_MISSING_SUBCATEGORY,
+                ComponentTypeEnum.RESOURCE.getValue());
+        }
+    }
+
+    @Test
+    public void testValidateEmptySubCategorySizeBiggerThan1() {
+        Resource resource = createParseResourceObject(true);
+        List<CategoryDefinition> categories = resource.getCategories();
+        CategoryDefinition categoryDefinition = categories.get(0);
+        List<SubCategoryDefinition> subcategories = categoryDefinition.getSubcategories();
+        SubCategoryDefinition subCategoryDefinition1 = new SubCategoryDefinition();
+        SubCategoryDefinition subCategoryDefinition2 = new SubCategoryDefinition();
+        subcategories.add(subCategoryDefinition1);
+        subcategories.add(subCategoryDefinition2);
+
+        try {
+            bl.validateCategory(user, resource, AuditingActionEnum.IMPORT_RESOURCE, true);
+        } catch (ComponentException e) {
+            assertComponentException(e, ActionStatus.RESOURCE_TOO_MUCH_SUBCATEGORIES,
+                ComponentTypeEnum.RESOURCE.getValue());
+        }
+    }
+
+    @Test
+    public void testValidateEmptyCategoryName() {
+        Resource resource = createParseResourceObject(true);
+        List<CategoryDefinition> categories = resource.getCategories();
+        CategoryDefinition categoryDefinition = categories.get(0);
+        categoryDefinition.setName(null);
+
+        try {
+            bl.validateCategory(user, resource, AuditingActionEnum.IMPORT_RESOURCE, true);
+        } catch (ComponentException e) {
+            assertComponentException(e, ActionStatus.COMPONENT_MISSING_CATEGORY,
+                ComponentTypeEnum.RESOURCE.getValue());
+        }
+    }
+
+    @Test
+    public void testValidateEmptySubCategoryName() {
+        Resource resource = createParseResourceObject(true);
+        List<CategoryDefinition> categories = resource.getCategories();
+        CategoryDefinition categoryDefinition = categories.get(0);
+        List<SubCategoryDefinition> subcategories = categoryDefinition.getSubcategories();
+        SubCategoryDefinition subCategoryDefinition1 = subcategories.get(0);
+        subCategoryDefinition1.setName(null);
+
+        try {
+            bl.validateCategory(user, resource, AuditingActionEnum.IMPORT_RESOURCE, true);
+        } catch (ComponentException e) {
+            assertComponentException(e, ActionStatus.COMPONENT_MISSING_SUBCATEGORY,
+                ComponentTypeEnum.RESOURCE.getValue());
+        }
+    }
+
+    @Test
+    public void testValidateCategoryListed() {
+        Resource resource = createParseResourceObject(true);
+        CategoryDefinition category = resource.getCategories().get(0);
+        SubCategoryDefinition subcategory = category.getSubcategories().get(0);
+        try {
+            bl.validateCategoryListed( category, subcategory, user, resource, AuditingActionEnum.IMPORT_RESOURCE, true);
+        } catch (ComponentException e) {
+            assertComponentException(e, ActionStatus.GENERAL_ERROR,
+                ComponentTypeEnum.RESOURCE.getValue());
+        }
+    }
+
+    @Test
+    public void testFailOnInvalidCategory() {
+        Resource resource = createParseResourceObject(true);
+        try {
+            bl.failOnInvalidCategory( user, resource, AuditingActionEnum.IMPORT_RESOURCE);
+        } catch (ComponentException e) {
+            assertComponentException(e, ActionStatus.COMPONENT_INVALID_CATEGORY,
+                ComponentTypeEnum.RESOURCE.getValue());
+        }
+
+    }
+
+    @Test
+    public void testValidateVendorName() {
+        Resource resource = createParseResourceObject(true);
+        try {
+            bl.validateVendorName( user, resource, AuditingActionEnum.IMPORT_RESOURCE);
+        } catch (ComponentException e) {
+            assertComponentException(e, ActionStatus.GENERAL_ERROR,
+                ComponentTypeEnum.RESOURCE.getValue());
+        }
+    }
+
+    @Test
+    public void testValidateVendorNameEmpty() {
+        Resource resource = createParseResourceObject(true);
+        resource.setVendorName(null);
+        try {
+            bl.validateVendorName(user, resource, AuditingActionEnum.IMPORT_RESOURCE);
+        } catch (ComponentException e) {
+            assertComponentException(e, ActionStatus.MISSING_VENDOR_NAME,
+                ComponentTypeEnum.RESOURCE.getValue());
+        }
+    }
+
+    @Test
+    public void testValidateVendorNameWrongLen() {
+        Resource resource = createParseResourceObject(true);
+        resource.setVendorName("000000000011122221111222333444443222556677788778889999998776554332340");
+        try {
+            bl.validateVendorName(user, resource, AuditingActionEnum.IMPORT_RESOURCE);
+        } catch (ComponentException e) {
+            e.printStackTrace();
+        }
+    }
+    @Test
+    public void testValidateVendorName2() {
+        Resource resource = createParseResourceObject(true);
+        CategoryDefinition category = resource.getCategories().get(0);
+        SubCategoryDefinition subcategory = category.getSubcategories().get(0);
+        String vendorName = "vendorName";
+        try {
+            bl.validateVendorName( vendorName, user, resource, AuditingActionEnum.IMPORT_RESOURCE);
+        } catch (ComponentException e) {
+            assertComponentException(e, ActionStatus.GENERAL_ERROR,
+                ComponentTypeEnum.RESOURCE.getValue());
+        }
+    }
+
+    @Test
+    public void testFillResourceMetadata2() {
+        String yamlName = "yamlName";
+        Resource resourceVf = createParseResourceObject(true);
+        String nodeName = Constants.USER_DEFINED_RESOURCE_NAMESPACE_PREFIX + "test";
+        resourceVf.setSystemName("systemName");
+        try {
+            bl.fillResourceMetadata( yamlName, resourceVf, nodeName, user);
+        } catch (ComponentException e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testFillResourceMetadataWrongStart() {
+        String yamlName = "yamlName";
+        Resource resourceVf = createParseResourceObject(true);
+        String nodeName = "WrongStart" + "test";
+        try {
+            bl.fillResourceMetadata(yamlName, resourceVf, nodeName, user);
+        } catch (ComponentException e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testFillResourceMetadataResourceTypeIsAbs() {
+        String yamlName = "yamlName";
+        Resource resourceVf = createParseResourceObject(true);
+        String nodeName = Constants.USER_DEFINED_RESOURCE_NAMESPACE_PREFIX + Constants.ABSTRACT;
+        try {
+            bl.fillResourceMetadata(yamlName, resourceVf, nodeName, user);
+        } catch (ComponentException e) {
+            assertComponentException(e, ActionStatus.INVALID_NODE_TEMPLATE,
+                ComponentTypeEnum.RESOURCE.getValue());
+        }
+    }
+
+    @Test
+    public void testGetNodeTypeActualName() {
+        String fullName = Constants.USER_DEFINED_RESOURCE_NAMESPACE_PREFIX+"test";
+        try {
+            bl.getNodeTypeActualName(fullName);
+        } catch (ComponentException e) {
+            assertComponentException(e, ActionStatus.GENERAL_ERROR,
+                ComponentTypeEnum.RESOURCE.getValue());
+        }
+    }
+
+    @Test
+    public void testAddInput() {
+        Map<String, InputDefinition> currPropertiesMap = new HashMap<>();
+        InputDefinition prop = new InputDefinition();
+        try {
+            bl.addInput(currPropertiesMap, prop);
+        } catch (ComponentException e) {
+            assertComponentException(e, ActionStatus.GENERAL_ERROR,
+                ComponentTypeEnum.RESOURCE.getValue());
+        }
+    }
+
+    @Test
+    public void testFindAviableRequirement() {
+        String uniqueId = "101929382910";
+        String regName = uniqueId;
+        String yamlName = uniqueId;
+        UploadComponentInstanceInfo uploadComponentInstanceInfo = new UploadComponentInstanceInfo();
+        ComponentInstance currentCompInstance = new ComponentInstance();
+
+        Map<String, List<RequirementDefinition>> requirements = new HashMap<>();
+        List<RequirementDefinition> requirementDefinitionList = new ArrayList<>();
+        RequirementDefinition requirementDefinition = new RequirementDefinition();
+        requirementDefinition.setName(uniqueId);
+        requirementDefinition.setMaxOccurrences("10");
+        requirementDefinition.setLeftOccurrences("3");
+        requirementDefinitionList.add(requirementDefinition);
+        requirements.put(uniqueId, requirementDefinitionList);
+        currentCompInstance.setRequirements(requirements);
+
+        String capName = "capName";
+        try {
+            bl.findAviableRequiremen(regName, yamlName, uploadComponentInstanceInfo, currentCompInstance, capName);
+        } catch (ComponentException e) {
+            assertComponentException(e, ActionStatus.INVALID_NODE_TEMPLATE,
+                ComponentTypeEnum.RESOURCE.getValue());
+        }
+    }
+
+    @Test
+    public void testFindAviableRequirementSameCapName() {
+        String uniqueId = "101929382910";
+        String regName = uniqueId;
+        String yamlName = uniqueId;
+        UploadComponentInstanceInfo uploadComponentInstanceInfo = new UploadComponentInstanceInfo();
+        ComponentInstance currentCompInstance = new ComponentInstance();
+
+        Map<String, List<RequirementDefinition>> requirements = new HashMap<>();
+        List<RequirementDefinition> requirementDefinitionList = new ArrayList<>();
+        RequirementDefinition requirementDefinition = new RequirementDefinition();
+        requirementDefinition.setName(uniqueId);
+        requirementDefinition.setMaxOccurrences("10");
+        requirementDefinition.setLeftOccurrences("3");
+        requirementDefinitionList.add(requirementDefinition);
+        requirements.put(uniqueId, requirementDefinitionList);
+        currentCompInstance.setRequirements(requirements);
+
+        String capName = uniqueId;
+        try {
+            bl.findAviableRequiremen(regName, yamlName, uploadComponentInstanceInfo, currentCompInstance, capName);
+        } catch (ComponentException e) {
+            assertComponentException(e, ActionStatus.INVALID_NODE_TEMPLATE,
+                ComponentTypeEnum.RESOURCE.getValue());
+        }
+    }
+
+    @Test
+    public void testFindAvailableCapabilityByTypeOrName() {
+        RequirementDefinition validReq = new RequirementDefinition();
+        ComponentInstance currentCapCompInstance = new ComponentInstance();
+        UploadReqInfo uploadReqInfo = new UploadReqInfo();
+
+        try {
+            bl.findAvailableCapabilityByTypeOrName(validReq, currentCapCompInstance, uploadReqInfo);
+        } catch (ComponentException e) {
+            assertComponentException(e, ActionStatus.GENERAL_ERROR,
+                ComponentTypeEnum.RESOURCE.getValue());
+        }
+    }
+
+
+    @Test
+    public void testFindAvailableCapability() {
+        String uniqueId = "23422345677";
+        RequirementDefinition validReq = new RequirementDefinition();
+        validReq.setCapability(uniqueId);
+        ComponentInstance instance = new ComponentInstance();
+        Map<String, List<CapabilityDefinition>> capabilityMap = new HashMap<>();
+        List<CapabilityDefinition> capabilityDefinitionList = new ArrayList<>();
+        CapabilityDefinition capabilityDefinition = new CapabilityDefinition();
+        capabilityDefinition.setMaxOccurrences("3");
+        capabilityDefinition.setLeftOccurrences("2");
+        capabilityDefinitionList.add(capabilityDefinition);
+        capabilityMap.put(uniqueId, capabilityDefinitionList);
+        instance.setCapabilities(capabilityMap);
+
+        try {
+            bl.findAvailableCapability(validReq, instance);
+        } catch (ComponentException e) {
+            assertComponentException(e, ActionStatus.GENERAL_ERROR,
+                ComponentTypeEnum.RESOURCE.getValue());
+        }
+    }
+
+    @Test
+    public void testfindAvailableCapability2() {
+        String uniqueId = "23422345677";
+        RequirementDefinition validReq = new RequirementDefinition();
+        validReq.setCapability(uniqueId);
+        ComponentInstance instance = new ComponentInstance();
+        Map<String, List<CapabilityDefinition>> capabilityMap = new HashMap<>();
+        List<CapabilityDefinition> capabilityDefinitionList = new ArrayList<>();
+        CapabilityDefinition capabilityDefinition = new CapabilityDefinition();
+        capabilityDefinition.setName(uniqueId);
+        capabilityDefinition.setMaxOccurrences("3");
+        capabilityDefinition.setLeftOccurrences("2");
+        capabilityDefinitionList.add(capabilityDefinition);
+        capabilityMap.put(uniqueId, capabilityDefinitionList);
+        instance.setCapabilities(capabilityMap);
+        UploadReqInfo uploadReqInfo = new UploadReqInfo();
+        uploadReqInfo.setCapabilityName(uniqueId);
+        try {
+            bl.findAvailableCapability(validReq, instance, uploadReqInfo);
+        } catch (ComponentException e) {
+            assertComponentException(e, ActionStatus.GENERAL_ERROR,
+                ComponentTypeEnum.RESOURCE.getValue());
+        }
+    }
+
+    @Test
+    public void testGetComponentWithInstancesFilter() {
+         try {
+            bl.getComponentWithInstancesFilter();
+        } catch (ComponentException e) {
+            assertComponentException(e, ActionStatus.GENERAL_ERROR,
+                ComponentTypeEnum.RESOURCE.getValue());
+        }
+    }
+
+    @Test
+    public void testCreateParseResourceObject() {
+        String key = "0923928394";
+        List<UploadCapInfo> capabilities = new ArrayList<>();
+        UploadCapInfo uploadCapInfo = new UploadCapInfo();
+        uploadCapInfo.setType(key);
+        capabilities.add(uploadCapInfo);
+
+        String resourceId = "resourceId";
+        Map<String, List<CapabilityDefinition>> defaultCapabilities = new HashMap<>();
+        CapabilityDefinition capabilityDefinition = new CapabilityDefinition();
+        capabilityDefinition.setName(key);
+        List<CapabilityDefinition> capabilityDefinitionList = new ArrayList<>();
+        capabilityDefinitionList.add(capabilityDefinition);
+        defaultCapabilities.put(key, capabilityDefinitionList);
+
+        Map<String, List<CapabilityDefinition>> validCapabilitiesMap = new HashMap<>();
+        InputDefinition prop = new InputDefinition();
+
+        Resource resource = createParseResourceObject(true);
+        Map<String, List<CapabilityDefinition>> capabilitiesMap =  resource.getCapabilities();
+        capabilitiesMap.put(key, capabilityDefinitionList);
+
+        when(toscaOperationFacade.getToscaFullElement(anyString()))
+            .thenReturn(Either.left(resource));
+
+        try {
+            bl.addValidComponentInstanceCapabilities(key, capabilities, resourceId, defaultCapabilities,
+                validCapabilitiesMap);
+        } catch (ComponentException e) {
+            assertComponentException(e, ActionStatus.GENERAL_ERROR,
+                ComponentTypeEnum.RESOURCE.getValue());
+        }
+    }
+
+    @Test
+    public void testGetCapabilityFailure() {
+        String resourceId = "resourceId";
+        String key = "0923928394";
+        Map<String, List<CapabilityDefinition>> defaultCapabilities = new HashMap<>();
+        CapabilityDefinition capabilityDefinition = new CapabilityDefinition();
+        capabilityDefinition.setName(key);
+        List<CapabilityDefinition> capabilityDefinitionList = new ArrayList<>();
+        capabilityDefinitionList.add(capabilityDefinition);
+        defaultCapabilities.put(key, capabilityDefinitionList);
+        String capabilityType = key;
+        when(toscaOperationFacade.getToscaFullElement(anyString()))
+            .thenReturn(Either.right(StorageOperationStatus.NOT_FOUND));
+        try {
+            bl.getCapability(resourceId, defaultCapabilities, capabilityType);
+        } catch (ComponentException e) {
+            assertComponentException(e, ActionStatus.COMPONENT_NOT_FOUND,
+                ComponentTypeEnum.RESOURCE.getValue());
+        }
+    }
+
+
+    @Test
+    public void testValidateCapabilityProperties() {
+        List<UploadCapInfo> capabilities = new ArrayList<>();
+        UploadCapInfo uploadCapInfo = new UploadCapInfo();
+        List<UploadPropInfo> properties = new ArrayList<>();
+        UploadPropInfo uploadPropInfo = new UploadPropInfo();
+        properties.add(uploadPropInfo);
+        uploadCapInfo.setProperties(properties);
+        capabilities.add(uploadCapInfo);
+        String resourceId = "resourceId";
+        CapabilityDefinition defaultCapability = new CapabilityDefinition();
+        defaultCapability.setProperties(null);
+        defaultCapability.setName("test");
+
+        try {
+            bl.validateCapabilityProperties(capabilities, resourceId, defaultCapability);
+        } catch (ComponentException e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testValidateUniquenessUpdateUploadedComponentInstanceCapability() {
+        String key = "02124568";
+        List<UploadCapInfo> capabilities = new ArrayList<>();
+        UploadCapInfo uploadCapInfo = new UploadCapInfo();
+        List<UploadPropInfo> properties = new ArrayList<>();
+        UploadPropInfo uploadPropInfo = new UploadPropInfo();
+        uploadPropInfo.setName(key);
+        properties.add(uploadPropInfo);
+        uploadCapInfo.setProperties(properties);
+        capabilities.add(uploadCapInfo);
+        String resourceId = "resourceId";
+        CapabilityDefinition defaultCapability = new CapabilityDefinition();
+        List<ComponentInstanceProperty> componentInstancePropertyList = new ArrayList<>();
+        ComponentInstanceProperty componentInstanceProperty = new ComponentInstanceProperty();
+        componentInstancePropertyList.add(componentInstanceProperty);
+        defaultCapability.setProperties(componentInstancePropertyList);
+        defaultCapability.setName(key);
+
+        try {
+            bl.validateUniquenessUpdateUploadedComponentInstanceCapability(defaultCapability, uploadCapInfo);
+        } catch (ComponentException e) {
+            assertComponentException(e, ActionStatus.GENERAL_ERROR,
+                ComponentTypeEnum.RESOURCE.getValue());
+        }
+    }
+
+    @Test
+    public void testSetDeploymentArtifactsPlaceHolderByResource() {
+        Resource resource = createParseResourceObject(true);
+
+        try {
+            bl.setDeploymentArtifactsPlaceHolder(resource, user);
+        } catch (ComponentException e) {
+            assertComponentException(e, ActionStatus.GENERAL_ERROR,
+                ComponentTypeEnum.RESOURCE.getValue());
+        }
+    }
+
+    @Test
+    public void testSetDeploymentArtifactsPlaceHolderByService() {
+        Service Service = createServiceObject(true);
+
+        try {
+            bl.setDeploymentArtifactsPlaceHolder(Service, user);
+        } catch (ComponentException e) {
+            assertComponentException(e, ActionStatus.GENERAL_ERROR,
+                ComponentTypeEnum.RESOURCE.getValue());
+        }
+    }
+
+    @Test
+    public void testProcessDeploymentResourceArtifacts() {
+        Resource resource = createParseResourceObject(true);
+        Map<String, ArtifactDefinition> artifactMap = new HashMap<>();
+        String k = "key";
+        Object v = new Object();
+        try {
+            bl.processDeploymentResourceArtifacts(user, resource, artifactMap, k, v);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testMergeOldResourceMetadataWithNew() {
+        Resource oldResource = createParseResourceObject(true);
+        Resource newResource = new Resource();
+
+        try {
+            bl.mergeOldResourceMetadataWithNew(oldResource, newResource);
+        } catch (ComponentException e) {
+            assertComponentException(e, ActionStatus.GENERAL_ERROR,
+                ComponentTypeEnum.RESOURCE.getValue());
+        }
+    }
+
+    @Test
+    public void testBuildComplexVfcMetadata() {
+        Resource resource = createParseResourceObject(true);
+        String nodeName = "org.openecomp.resource.derivedFrom.zxjTestImportServiceAb.test";
+        Map<String, NodeTypeInfo> nodesInfo = new HashMap<>();
+        NodeTypeInfo nodeTypeInfo = new NodeTypeInfo();
+        List<String> derivedFrom = new ArrayList<>();
+        derivedFrom.add("derivedFrom");
+        nodeTypeInfo.setDerivedFrom(derivedFrom);
+        nodesInfo.put(nodeName, nodeTypeInfo);
+
+        try {
+            bl.buildComplexVfcMetadata(getCsarInfo(), nodeName, nodesInfo);
+        } catch (ComponentException e) {
+            assertComponentException(e, ActionStatus.GENERAL_ERROR,
+                ComponentTypeEnum.RESOURCE.getValue());
+        }
+    }
+
+    @Test
+    public void testValidateResourceCreationFromNodeType() {
+        Resource resource = createParseResourceObject(true);
+        resource.setDerivedFrom(null);
+        try {
+            bl.validateResourceCreationFromNodeType(resource, user);
+        } catch (ComponentException e) {
+            assertComponentException(e, ActionStatus.MISSING_DERIVED_FROM_TEMPLATE,
+                ComponentTypeEnum.RESOURCE.getValue());
+        }
+    }
+
+    @Test
+    public void testCreateInputsOnResource() {
+        Resource resource = createParseResourceObject(true);
+        Map<String, InputDefinition> inputs = new HashMap<>();
+
+        try {
+            bl.createInputsOnResource(resource, inputs);
+        }  catch (ComponentException e) {
+            assertComponentException(e, ActionStatus.GENERAL_ERROR,
+                ComponentTypeEnum.RESOURCE.getValue());
+        }
+    }
+
+    @Test
+    public void testCreateInputsOnResourceWhenIsNotEmpty() {
+        String key = "12345667";
+        Resource resource = createParseResourceObject(true);
+        List<InputDefinition> inputDefinitionList = new ArrayList<>();
+        InputDefinition inputDefinition = new InputDefinition();
+        inputDefinitionList.add(inputDefinition);
+        resource.setInputs(inputDefinitionList);
+        Map<String, InputDefinition> inputs = new HashMap<>();
+        inputs.put(key, inputDefinition);
+
+        try {
+            bl.createInputsOnResource(resource, inputs);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testCreateInputsOnService() {
+        Service service = createServiceObject(true);
+        Map<String, InputDefinition> inputs = new HashMap<>();
+
+        try {
+            bl.createInputsOnService(service, inputs);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testCreateServiceTransaction() {
+        Service service = createServiceObject(true);
+
+        try {
+            bl.createServiceTransaction(service, user, true);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testCreateArtifactsPlaceHolderData() {
+        Service service = createServiceObject(true);
+
+        try {
+            bl.createArtifactsPlaceHolderData(service, user);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testSetInformationalArtifactsPlaceHolder() {
+        Service service = createServiceObject(true);
+
+        try {
+            bl.setInformationalArtifactsPlaceHolder(service, user);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testValidateNestedDerivedFromDuringUpdate() {
+        Resource currentResource = createParseResourceObject(true);
+        Resource updateInfoResource = createParseResourceObject(true);
+        String key = "2323456";
+
+        List<String> currentDerivedFromList = new ArrayList<>();
+        currentDerivedFromList.add(key);
+        currentResource.setDerivedFrom(currentDerivedFromList);
+        List<String> updatedDerivedFromList = new ArrayList<>();
+        updatedDerivedFromList.add("23344567778");
+        updateInfoResource.setDerivedFrom(updatedDerivedFromList);
+
+        when(toscaOperationFacade.validateToscaResourceNameExtends(anyString(), anyString()))
+            .thenReturn(Either.right(StorageOperationStatus.NOT_FOUND));
+
+        try {
+            bl.validateNestedDerivedFromDuringUpdate(currentResource, updateInfoResource, true);
+        } catch (ComponentException e) {
+            assertComponentException(e, ActionStatus.GENERAL_ERROR,
+                ComponentTypeEnum.RESOURCE.getValue());
+        }
+    }
+
+    @Test
+    public void testValidateDerivedFromExtending() {
+        Resource currentResource = createParseResourceObject(true);
+        Resource updateInfoResource = createParseResourceObject(true);
+
+        when(toscaOperationFacade.validateToscaResourceNameExtends(anyString(), anyString()))
+            .thenReturn(Either.left(false));
+        try {
+            bl.validateDerivedFromExtending(user, currentResource, updateInfoResource,
+                AuditingActionEnum.IMPORT_RESOURCE);
+        } catch (ComponentException e) {
+            assertComponentException(e, ActionStatus.PARENT_RESOURCE_DOES_NOT_EXTEND,
+                ComponentTypeEnum.RESOURCE.getValue());
+        }
+    }
+
+    @Test
+    public void testValidateResourceFieldsBeforeUpdate() {
+        Resource currentResource = createParseResourceObject(true);
+        Resource updateInfoResource = createParseResourceObject(true);
+
+        try {
+            bl.validateResourceFieldsBeforeUpdate(currentResource, updateInfoResource, true, true);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testValidateResourceName() {
+        Resource currentResource = createParseResourceObject(true);
+        Resource updateInfoResource = createParseResourceObject(true);
+        currentResource.setName("test1");
+        updateInfoResource.setName("test2");
+
+        try {
+            bl.validateResourceName(currentResource, updateInfoResource, true, false);
+        } catch (ComponentException e) {
+            assertComponentException(e, ActionStatus.RESOURCE_NAME_CANNOT_BE_CHANGED,
+                ComponentTypeEnum.RESOURCE.getValue());
+        }
+    }
+
+    @Test
+    public void testIsResourceNameEquals() {
+        Resource currentResource = createParseResourceObject(true);
+        Resource updateInfoResource = createParseResourceObject(true);
+
+        try {
+            bl.isResourceNameEquals(currentResource, updateInfoResource);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testPrepareResourceForUpdate() {
+        Resource oldResource = createParseResourceObject(true);
+        Resource newResource = createParseResourceObject(true);
+
+        try {
+            bl.prepareResourceForUpdate(oldResource, newResource, user, true, true);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+   @Test
+    public void testFailOnChangeState() {
+        ResponseFormat response = new ResponseFormat();
+        Resource oldResource = createParseResourceObject(true);
+        Resource newResource = createParseResourceObject(true);
+
+        try {
+            bl.failOnChangeState(response,  user, oldResource, newResource);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testHandleResourceGenericType() {
+        Resource resource = createParseResourceObject(true);
+
+        try {
+            bl.handleResourceGenericType(resource);
+        } catch (Exception e) {
+           e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testUpdateOrCreateGroups() {
+        Resource resource = createParseResourceObject(true);
+        Map<String, GroupDefinition> groups = new HashMap<>();
+
+        try {
+            bl.updateOrCreateGroups(resource, groups);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testAddGroupsToCreateOrUpdate() {
+        Resource resource = createParseResourceObject(true);
+        Map<String, GroupDefinition> groups = new HashMap<>();
+
+        List<GroupDefinition> groupsFromResource = new ArrayList<>();
+        List<GroupDefinition> groupsAsList = new ArrayList<>();
+        List<GroupDefinition> groupsToUpdate = new ArrayList<>();
+        List<GroupDefinition> groupsToCreate = new ArrayList<>();
+
+        try {
+            bl.addGroupsToCreateOrUpdate(groupsFromResource, groupsAsList, groupsToUpdate, groupsToCreate);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testAddGroupsToDelete() {
+        Map<String, GroupDefinition> groups = new HashMap<>();
+
+        List<GroupDefinition> groupsFromResource = new ArrayList<>();
+        List<GroupDefinition> groupsAsList = new ArrayList<>();
+        List<GroupDefinition> groupsToDelete = new ArrayList<>();
+
+        try {
+            bl.addGroupsToDelete(groupsFromResource, groupsAsList, groupsToDelete);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testUpdateGroupsMembersUsingResource() {
+        Service component = createServiceObject(true);
+        Map<String, GroupDefinition> groups = new HashMap<>();
+
+        try {
+            bl.updateGroupsMembersUsingResource(groups, component);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testupdateGroupMembers() {
+        Service component = createServiceObject(true);
+        Map<String, GroupDefinition> groups = new HashMap<>();
+        GroupDefinition updatedGroupDefinition = new GroupDefinition();
+        List<ComponentInstance> componentInstances = new ArrayList<>();
+        String groupName = "groupName";
+        Map<String, String> members = new HashMap<>();
+
+        try {
+            bl.updateGroupMembers(groups, updatedGroupDefinition, component, componentInstances, groupName, members);
+        } catch (ComponentException e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testValidateCyclicGroupsDependencies() {
+        Service component = createServiceObject(true);
+        Map<String, GroupDefinition> groups = new HashMap<>();
+        String key = "098738485";
+        GroupDefinition groupDefinition = new GroupDefinition();
+        groups.put(key, groupDefinition);
+
+        try {
+            bl.validateCyclicGroupsDependencies(groups);
+        } catch (ComponentException e) {
+            assertComponentException(e, ActionStatus.GENERAL_ERROR,
+                ComponentTypeEnum.RESOURCE.getValue());
+        }
+    }
+
+    @Test
+    public void testFillAllGroupMemebersRecursivly() {
+        Map<String, GroupDefinition> allGroups = new HashMap<>();
+        Set<String> allGroupMembers = new HashSet<>();
+        String groupName = "groupName";
+
+        try {
+            bl.fillAllGroupMemebersRecursivly(groupName, allGroups, allGroupMembers);
+        } catch (Exception e) {
+
+        }
+    }
+
+    @Test
+    public void testFillResourceMetadataForService() {
+        String yamlName = "yamlName";
+        Service resourceVf = createServiceObject(true);
+        String nodeName = "nodeName";
+
+        try {
+            bl.fillResourceMetadata(yamlName, resourceVf, nodeName, user);
+        } catch (Exception e) {
+
+        }
+    }
+
+    @Test
+    public void testpropagateStateToCertified() {
+        String yamlName = "yamlName";
+        Resource resource = createParseResourceObject(true);
+        LifecycleChangeInfoWithAction lifecycleChangeInfo = new LifecycleChangeInfoWithAction();
+
+        try {
+            bl.propagateStateToCertified(user, resource, lifecycleChangeInfo, true, true, true);
+        } catch (Exception e) {
+
+        }
+    }
+
+    @Test
+    public void testBuildValidComplexVfc2() {
+        String nodeName = "nodeName";
+        Resource resource = createParseResourceObject(true);
+        Map<String, NodeTypeInfo> nodesInfo = new HashMap<>();
+
+        try {
+            bl.buildValidComplexVfc(getCsarInfo(), nodeName, nodesInfo);
+        } catch (Exception e) {
+
+        }
+    }
+
+    @Test
+    public void testUpdateGroupsOnResource() {
+        Resource resource = createParseResourceObject(true);
+        Map<String, GroupDefinition> groups = new HashMap<>();
+
+        try {
+            bl.updateGroupsOnResource(resource, groups);
+        } catch (Exception e) {
+
+        }
+    }
+
+    @Test
+    public void testSetInformationalArtifactsPlaceHolder2() {
+        Resource resource = createParseResourceObject(true);
+
+        try {
+            bl.setInformationalArtifactsPlaceHolder(resource, user);
+        } catch (Exception e) {
+
+        }
+    }
+
+    @Test
+    public void testCreateArtifactsPlaceHolderData2() {
+        Resource resource = createParseResourceObject(true);
+
+        try {
+            bl.createArtifactsPlaceHolderData(resource, user);
+        } catch (Exception e) {
+
+        }
+    }
+
+    @Test
+    public void testHandleGroupsProperties() {
+        Service service = createServiceObject(true);
+        Map<String, GroupDefinition> groups = new HashMap<>();
+        try {
+            bl.handleGroupsProperties(service, groups);
+        } catch (Exception e) {
+
+        }
+    }
+
+     @Test
+    public void testHandleGroupsProperties2() {
+        Resource resource = createParseResourceObject(true);
+        Map<String, GroupDefinition> groups = new HashMap<>();
+        try {
+            bl.handleGroupsProperties(resource, groups);
+        } catch (Exception e) {
+
+        }
+    }
+
+    @Test
+    public void testHandleGetInputs() {
+        PropertyDataDefinition property = new PropertyDataDefinition();
+        List<InputDefinition> inputs = new ArrayList<>();
+        try {
+            bl.handleGetInputs(property, inputs);
+        } catch (Exception e) {
+
+        }
+    }
+
+    @Test
+    public void testFindInputByName() {
+        GetInputValueDataDefinition getInput = new GetInputValueDataDefinition();
+        List<InputDefinition> inputs = new ArrayList<>();
+        try {
+            bl.findInputByName(inputs, getInput);
+        } catch (Exception e) {
+
+        }
+    }
+
+    @Test
+    public void testAssociateComponentInstancePropertiesToComponent() {
+        String yamlName = "yamlName";
+        Resource resource = createParseResourceObject(true);
+        Map<String, List<ComponentInstanceProperty>> instProperties = new HashMap<>();
+        List<InputDefinition> inputs = new ArrayList<>();
+        try {
+            bl.associateComponentInstancePropertiesToComponent(yamlName, resource, instProperties);
+        } catch (Exception e) {
+
+        }
+    }
+
+    @Test
+    public void testAssociateComponentInstanceInputsToComponent() {
+        String yamlName = "yamlName";
+        Resource resource = createParseResourceObject(true);
+        Map<String, List<ComponentInstanceInput>> instInputs = new HashMap<>();
+
+        try {
+            bl.associateComponentInstanceInputsToComponent(yamlName, resource, instInputs);
+        } catch (Exception e) {
+
+        }
+    }
+
+    @Test
+    public void testAssociateDeploymentArtifactsToInstances() {
+        String yamlName = "yamlName";
+        Resource resource = createParseResourceObject(true);
+        Map<String, Map<String, ArtifactDefinition>> instDeploymentArtifacts = new HashMap<>();
+
+        try {
+            bl.associateDeploymentArtifactsToInstances(user, yamlName, resource, instDeploymentArtifacts);
+        } catch (Exception e) {
+
+        }
+    }
+
+    @Test
+    public void testAssociateArtifactsToInstances() {
+        String yamlName = "yamlName";
+        Resource resource = createParseResourceObject(true);
+        Map<String, Map<String, ArtifactDefinition>> instDeploymentArtifacts = new HashMap<>();
+
+        try {
+            bl.associateDeploymentArtifactsToInstances(user, yamlName, resource, instDeploymentArtifacts);
+        } catch (Exception e) {
+
+        }
+    }
+
+    @Test
+    public void testAssociateArtifactsToInstances2() {
+        String yamlName = "yamlName";
+        Resource resource = createParseResourceObject(true);
+        Map<String, Map<String, ArtifactDefinition>> instDeploymentArtifacts = new HashMap<>();
+
+        try {
+            bl.associateArtifactsToInstances(yamlName, resource, instDeploymentArtifacts);
+        } catch (Exception e) {
+
+        }
+    }
+
+    @Test
+    public void testAssociateOrAddCalculatedCapReq() {
+        String yamlName = "yamlName";
+        Resource resource = createParseResourceObject(true);
+        Map<ComponentInstance, Map<String, List<CapabilityDefinition>>> instCapabilities = new HashMap<>();
+        Map<ComponentInstance, Map<String, List<RequirementDefinition>>> instRequirements = new HashMap<>();
+        try {
+            bl.associateOrAddCalculatedCapReq(yamlName, resource, instCapabilities, instRequirements);
+        } catch (Exception e) {
+
+        }
+    }
+
+    @Test
+    public void testAssociateInstAttributeToComponentToInstances() {
+        String yamlName = "yamlName";
+        Resource resource = createParseResourceObject(true);
+        Map<String, List<AttributeDataDefinition>> instAttributes = new HashMap<>();
+        try {
+            bl.associateInstAttributeToComponentToInstances(yamlName, resource, instAttributes);
+        } catch (Exception e) {
+
+        }
+    }
+
+    @Test
+    public void testThrowComponentExceptionByResource() {
+        StorageOperationStatus status = StorageOperationStatus.OK;
+        Resource resource = createParseResourceObject(true);
+        try {
+            bl.throwComponentExceptionByResource(status, resource);
+        } catch (Exception e) {
+
+        }
+    }
+
+    @Test
+    public void testGetResourceAfterCreateRelations() {
+
+        Resource resource = createParseResourceObject(true);
+
+        try {
+            bl.getResourceAfterCreateRelations(resource);
+        } catch (Exception e) {
+
+        }
+    }
+
+    @Test
+    public void testSetCapabilityNamesTypes() {
+
+        Map<String, List<CapabilityDefinition>> originCapabilities = new HashMap<>();
+        Map<String, List<UploadCapInfo>> uploadedCapabilities = new HashMap<>();
+
+        try {
+            bl.setCapabilityNamesTypes(originCapabilities, uploadedCapabilities);
+        } catch (Exception e) {
+
+        }
+    }
+
+    @Test
+    public void testAssociateComponentInstanceInputsToComponent2() {
+        String yamlName = "yamlName";
+        Service service = createServiceObject(true);
+        Map<String, List<ComponentInstanceInput>> instInputs = new HashMap<>();
+
+        try {
+            bl.associateComponentInstanceInputsToComponent(yamlName, service, instInputs);
+        } catch (Exception e) {
+
+        }
+    }
+
+    @Test
+    public void testAssociateComponentInstancePropertiesToComponent2() {
+        String yamlName = "yamlName";
+        Service service = createServiceObject(true);
+        Map<String, List<ComponentInstanceProperty>> instInputs = new HashMap<>();
+
+        try {
+            bl.associateComponentInstancePropertiesToComponent(yamlName, service, instInputs);
+        } catch (Exception e) {
+
+        }
+    }
+
+    @Test
+    public void testAssociateDeploymentArtifactsToInstances2() {
+        String yamlName = "yamlName";
+        Service service = createServiceObject(true);
+        Map<String, Map<String, ArtifactDefinition>> instDeploymentArtifacts = new HashMap<>();
+
+        try {
+            bl.associateDeploymentArtifactsToInstances(user, yamlName, service, instDeploymentArtifacts);
+        } catch (Exception e) {
+
+        }
+    }
+
+    @Test
+    public void testAssociateArtifactsToInstances3() {
+        String yamlName = "yamlName";
+        Service service = createServiceObject(true);
+        Map<String, Map<String, ArtifactDefinition>> instArtifacts = new HashMap<>();
+
+        try {
+            bl.associateArtifactsToInstances(yamlName, service, instArtifacts);
+        } catch (Exception e) {
+
+        }
+    }
+    @Test
+    public void testAssociateOrAddCalculatedCapReq2() {
+        String yamlName = "yamlName";
+        Service resource = createServiceObject(true);
+        Map<ComponentInstance, Map<String, List<CapabilityDefinition>>> instCapabilities = new HashMap<>();
+        Map<ComponentInstance, Map<String, List<RequirementDefinition>>> instRequirements = new HashMap<>();
+        try {
+            bl.associateOrAddCalculatedCapReq(yamlName, resource, instCapabilities, instRequirements);
+        } catch (Exception e) {
+
+        }
+    }
+
+    @Test
+    public void testAssociateInstAttributeToComponentToInstances2() {
+        String yamlName = "yamlName";
+        Service resource = createServiceObject(true);
+        Map<String, List<AttributeDataDefinition>> instAttributes = new HashMap<>();
+        try {
+            bl.associateInstAttributeToComponentToInstances(yamlName, resource, instAttributes);
+        } catch (Exception e) {
+
+        }
+    }
+
+    @Test
+    public void testAssociateRequirementsToService() {
+        String yamlName = "yamlName";
+        Service resource = createServiceObject(true);
+        Map<String, ListRequirementDataDefinition> requirements = new HashMap<>();
+        try {
+            bl.associateRequirementsToService(yamlName, resource, requirements);
+        } catch (Exception e) {
+
+        }
+    }
+
+    @Test
+    public void testAssociateCapabilitiesToService() {
+        String yamlName = "yamlName";
+        Service resource = createServiceObject(true);
+        Map<String, ListCapabilityDataDefinition> capabilities = new HashMap<>();
+        try {
+            bl.associateCapabilitiesToService(yamlName, resource, capabilities);
+        } catch (Exception e) {
+
+        }
+    }
+
+    @Test
+    public void testAssociateResourceInstances() {
+        String yamlName = "yamlName";
+        Service resource = createServiceObject(true);
+        List<RequirementCapabilityRelDef> relations = new ArrayList<>();
+        try {
+            bl.associateResourceInstances(yamlName, resource, relations);
+        } catch (Exception e) {
+
+        }
+    }
+
+    @Test
+    public void testAddCapabilities() {
+        Map<String, List<CapabilityDefinition>> originCapabilities = new HashMap<>();
+        String type = "type";
+        List<CapabilityDefinition> capabilities = new ArrayList<>();
+           try {
+            bl.addCapabilities(originCapabilities, type, capabilities);
+        } catch (Exception e) {
+
+        }
+    }
+
+    @Test
+    public void testAddCapabilitiesProperties() {
+        Map<String, Map<String, UploadPropInfo>> newPropertiesMap = new HashMap<>();
+        List<UploadCapInfo> capabilities = new ArrayList<>();
+        try {
+            bl.addCapabilitiesProperties(newPropertiesMap, capabilities);
+        } catch (Exception e) {
+
+        }
+    }
+
+    @Test
+    public void testGetServiceWithGroups() {
+        String resourceId = "resourceId";
+        try {
+            bl.getServiceWithGroups(resourceId);
+        } catch (Exception e) {
+
+        }
+    }
+
+    @Test
+    public void testGetResourceWithGroups() {
+        String resourceId = "resourceId";
+        try {
+            bl.getResourceWithGroups(resourceId);
+        } catch (Exception e) {
+
+        }
+    }
+
+    @Test
+    public void testAssociateResourceInstances2() {
+        String yamlName = "yamlName";
+        Resource resource = createParseResourceObject(true);
+        List<RequirementCapabilityRelDef> relations = new ArrayList<>();
+        try {
+            bl.associateResourceInstances(yamlName, resource, relations);
+        } catch (Exception e) {
+
+        }
+    }
+
+    @Test
+    public void testAddRelationsToRI() {
+        String yamlName = "yamlName";
+        Resource resource = createParseResourceObject(true);
+        Map<String, UploadComponentInstanceInfo> uploadResInstancesMap = new HashMap<>();
+        List<ComponentInstance> componentInstancesList = new ArrayList<>();
+        List<RequirementCapabilityRelDef> relations = new ArrayList<>();
+        try {
+            bl.addRelationsToRI(yamlName, resource, uploadResInstancesMap, componentInstancesList, relations);
+        } catch (Exception e) {
+
+        }
+    }
+
+    @Test
+    public void testAddRelationsToRI2() {
+        String yamlName = "yamlName";
+        Resource resource = createParseResourceObject(true);
+        UploadComponentInstanceInfo nodesInfoValue = new UploadComponentInstanceInfo();
+        List<RequirementCapabilityRelDef> relations = new ArrayList<>();
+        try {
+            bl.addRelationToRI(yamlName, resource, nodesInfoValue, relations);
+        } catch (Exception e) {
+
+        }
+    }
+
+    @Test
+    public void testFindVfcResource() {
+        Service service = createServiceObject(true);
+        String currVfcToscaName = "currVfcToscaName";
+        String previousVfcToscaName = "previousVfcToscaName";
+        UploadComponentInstanceInfo nodesInfoValue = new UploadComponentInstanceInfo();
+        List<RequirementCapabilityRelDef> relations = new ArrayList<>();
+        try {
+            bl.findVfcResource(getCsarInfo(), service, currVfcToscaName, previousVfcToscaName,
+                StorageOperationStatus.OK);
+        } catch (ComponentException e) {
+            assertComponentException(e, ActionStatus.OK,
+                ComponentTypeEnum.RESOURCE.getValue());
+        }
+    }
+
+    protected Resource createParseResourceObject(boolean afterCreate) {
+        Resource resource = new Resource();
+        resource.setName(RESOURCE_NAME);
+        resource.setToscaResourceName(RESOURCE_TOSCA_NAME);
+        resource.addCategory(RESOURCE_CATEGORY1, RESOURCE_SUBCATEGORY);
+        resource.setDescription("My short description");
+        List<String> tgs = new ArrayList<>();
+        tgs.add("test");
+        tgs.add(resource.getName());
+        resource.setTags(tgs);
+        List<String> template = new ArrayList<>();
+        template.add("tosca.nodes.Root");
+        resource.setDerivedFrom(template);
+        resource.setVendorName("Motorola");
+        resource.setVendorRelease("1.0.0");
+        resource.setContactId("ya5467");
+        resource.setIcon("defaulticon");
+        Map<String, List<RequirementDefinition>> requirements = new HashMap<>();
+        List<RequirementDefinition> requirementDefinitionList = new ArrayList<>();
+        requirements.put("test", requirementDefinitionList);
+        resource.setRequirements(requirements);
+        resource.setCost("cost");
+        resource.setResourceVendorModelNumber("02312233");
+
+
+        Map<String, ArtifactDefinition> artifacts = new HashMap<>();
+        ArtifactDefinition artifactDefinition = new ArtifactDefinition();
+        artifacts.put("artifact", artifactDefinition);
+        resource.setArtifacts(artifacts);
+
+        resource.setLicenseType("licType");
+
+        if (afterCreate) {
+            resource.setName(resource.getName());
+            resource.setVersion("0.1");
+            resource.setUniqueId(resource.getName()
+                .toLowerCase() + ":" + resource.getVersion());
+            resource.setCreatorUserId(user.getUserId());
+            resource.setCreatorFullName(user.getFirstName() + " " + user.getLastName());
+            resource.setLifecycleState(LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT);
+        }
+        return resource;
+    }
+
+    protected CsarInfo getCsarInfo() {
+        String csarUuid = "0010";
+        User user = new User();
+        Map<String, byte[]> csar = new HashMap<>();
+        String vfReousrceName = "resouceName";
+        String mainTemplateName = "mainTemplateName";
+        String mainTemplateContent = null;
+        try {
+            mainTemplateContent = loadFileNameToJsonString("service_import_template.yml");
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        CsarInfo csarInfo = new CsarInfo(user, csarUuid, csar, vfReousrceName, mainTemplateName, mainTemplateContent,
+            false);
+        return csarInfo;
+    }
+
+    public static String loadFileNameToJsonString(String fileName) throws IOException {
+        String sourceDir = "src/test/resources/normativeTypes";
+        return loadFileNameToJsonString(sourceDir, fileName);
+    }
+
+    private static String loadFileNameToJsonString(String sourceDir, String fileName) throws IOException {
+        java.nio.file.Path filePath = FileSystems.getDefault().getPath(sourceDir, fileName);
+        byte[] fileContent = Files.readAllBytes(filePath);
+        return new String(fileContent);
+    }
+
+    protected Service createServiceObject (boolean afterCreate) {
+        Service service = new Service();
+        service.setUniqueId("sid");
+        service.setName("Service");
+        CategoryDefinition category = new CategoryDefinition();
+        category.setName(SERVICE_CATEGORY);
+        category.setIcons(Collections.singletonList("defaulticon"));
+        List<CategoryDefinition> categories = new ArrayList<>();
+        categories.add(category);
+        service.setCategories(categories);
+        service.setInstantiationType(INSTANTIATION_TYPE);
+
+        service.setDescription("description");
+        List<String> tgs = new ArrayList<>();
+        tgs.add(service.getName());
+        service.setTags(tgs);
+        service.setIcon("defaulticon");
+        service.setContactId("aa1234");
+        service.setProjectCode("12345");
+        service.setEcompGeneratedNaming(true);
+
+        if (afterCreate) {
+            service.setVersion("0.1");
+            service.setUniqueId(service.getName() + ":" + service.getVersion());
+            service.setCreatorUserId(user.getUserId());
+            service.setCreatorFullName(user.getFirstName() + " " + user.getLastName());
+        }
+        return service;
+    }
+
+    protected void assertComponentException(ComponentException e, ActionStatus expectedStatus, String... variables) {
+        ResponseFormat actualResponse = e.getResponseFormat() != null ?
+            e.getResponseFormat() : componentsUtils.getResponseFormat(e.getActionStatus(), e.getParams());
+        assertParseResponse(actualResponse, expectedStatus, variables);
+    }
+
+    private void assertParseResponse(ResponseFormat actualResponse, ActionStatus expectedStatus, String... variables) {
+        ResponseFormat expectedResponse = responseManager.getResponseFormat(expectedStatus, variables);
+        assertThat(expectedResponse.getStatus()).isEqualTo(actualResponse.getStatus());
+        assertThat(expectedResponse.getFormattedMessage()).isEqualTo(actualResponse.getFormattedMessage());
+    }
+}
\ No newline at end of file
diff --git a/catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/utils/CreateServiceFromYamlParameterTest.java b/catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/utils/CreateServiceFromYamlParameterTest.java
new file mode 100644 (file)
index 0000000..0ff0d13
--- /dev/null
@@ -0,0 +1,51 @@
+/*
+
+ * Copyright (c) 2018 AT&T Intellectual Property.
+
+ *
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+
+ * you may not use this file except in compliance with the License.
+
+ * You may obtain a copy of the License at
+
+ *
+
+ *     http://www.apache.org/licenses/LICENSE-2.0
+
+ *
+
+ * Unless required by applicable law or agreed to in writing, software
+
+ * distributed under the License is distributed on an "AS IS" BASIS,
+
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+ * See the License for the specific language governing permissions and
+
+ * limitations under the License.
+
+ */
+
+package org.openecomp.sdc.be.components.impl.utils;
+
+import org.junit.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class CreateServiceFromYamlParameterTest {
+    private CreateServiceFromYamlParameter createTestSubject(){
+        return new CreateServiceFromYamlParameter();
+    }
+
+    @Test
+    public void testYamlName() {
+        CreateServiceFromYamlParameter testSubject;
+
+        // default test
+        testSubject = createTestSubject();
+        assertThat(testSubject).isInstanceOf(CreateServiceFromYamlParameter.class);
+    }
+
+}
\ No newline at end of file
index 1d7a1c5..ac64e06 100644 (file)
@@ -46,6 +46,7 @@ import org.openecomp.sdc.be.model.GroupTypeDefinition;
 import org.openecomp.sdc.be.model.ParsedToscaYamlInfo;
 import org.openecomp.sdc.be.model.PolicyDefinition;
 import org.openecomp.sdc.be.model.PolicyTypeDefinition;
+import org.openecomp.sdc.be.model.Resource;
 import org.openecomp.sdc.be.model.UploadArtifactInfo;
 import org.openecomp.sdc.be.model.UploadComponentInstanceInfo;
 import org.openecomp.sdc.be.model.User;
@@ -145,8 +146,9 @@ public class YamlTemplateParsingHandlerTest {
         CsarInfo csarInfo = new CsarInfo(user, CSAR_UUID, csar, RESOURCE_NAME,
                 MAIN_TEMPLATE_NAME, main_template_content, true);
 
+        Resource resource = new Resource();
         ParsedToscaYamlInfo parsedYaml = handler.parseResourceInfoFromYAML(FILE_NAME, resourceYml, new HashMap<>(),
-                csarInfo.extractNodeTypesInfo(), NODE_NAME);
+                csarInfo.extractNodeTypesInfo(), NODE_NAME, resource);
 
         validateParsedYaml(parsedYaml, NESTED_GROUP_NAME,
                 Lists.newArrayList("heat_file", "description"));
@@ -155,8 +157,9 @@ public class YamlTemplateParsingHandlerTest {
     @Test
     public void parseResourceInfoFromYAMLTest() {
 
+        Resource resource = new Resource();
         ParsedToscaYamlInfo parsedYaml = handler.parseResourceInfoFromYAML(FILE_NAME, resourceYml, new HashMap<>(),
-                new HashMap<>(), "");
+                new HashMap<>(), "", resource);
         validateParsedYamlWithCapability(parsedYaml);
     }
 
@@ -228,8 +231,9 @@ public class YamlTemplateParsingHandlerTest {
 
     @Test
     public void parseResourceWithPoliciesDefined() {
+        Resource resource = new Resource();
         ParsedToscaYamlInfo parsedYaml = handler.parseResourceInfoFromYAML(FILE_NAME, resourceYml, new HashMap<>(),
-                new HashMap<>(), "");
+                new HashMap<>(), "", resource);
         validateParsedYamlWithPolicies(parsedYaml);
     }
 
diff --git a/catalog-be/src/test/java/org/openecomp/sdc/be/externalapi/servlet/AbstractTemplateServletTest.java b/catalog-be/src/test/java/org/openecomp/sdc/be/externalapi/servlet/AbstractTemplateServletTest.java
new file mode 100644 (file)
index 0000000..40341be
--- /dev/null
@@ -0,0 +1,219 @@
+/*
+
+ * Copyright (c) 2018 AT&T Intellectual Property.
+
+ *
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+
+ * you may not use this file except in compliance with the License.
+
+ * You may obtain a copy of the License at
+
+ *
+
+ *     http://www.apache.org/licenses/LICENSE-2.0
+
+ *
+
+ * Unless required by applicable law or agreed to in writing, software
+
+ * distributed under the License is distributed on an "AS IS" BASIS,
+
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+ * See the License for the specific language governing permissions and
+
+ * limitations under the License.
+
+ */
+
+package org.openecomp.sdc.be.externalapi.servlet;
+
+
+import fj.data.Either;
+import org.apache.http.HttpStatus;
+import org.glassfish.hk2.utilities.binding.AbstractBinder;
+import org.glassfish.jersey.server.ResourceConfig;
+import org.glassfish.jersey.test.JerseyTest;
+import org.glassfish.jersey.test.TestProperties;
+import org.json.simple.JSONObject;
+import org.json.simple.parser.JSONParser;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.mockito.Mockito;
+import org.mockito.stubbing.Answer;
+import org.openecomp.sdc.be.components.impl.*;
+import org.openecomp.sdc.be.components.lifecycle.LifecycleBusinessLogic;
+import org.openecomp.sdc.be.config.ConfigurationManager;
+import org.openecomp.sdc.be.config.SpringConfig;
+import org.openecomp.sdc.be.dao.api.ActionStatus;
+import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
+import org.openecomp.sdc.be.ecomp.converters.AssetMetadataConverter;
+import org.openecomp.sdc.be.externalapi.servlet.representation.ResourceAssetMetadata;
+import org.openecomp.sdc.be.impl.ComponentsUtils;
+import org.openecomp.sdc.be.impl.ServletUtils;
+import org.openecomp.sdc.be.impl.WebAppContextWrapper;
+import org.openecomp.sdc.be.model.Resource;
+import org.openecomp.sdc.be.model.category.CategoryDefinition;
+import org.openecomp.sdc.be.model.category.SubCategoryDefinition;
+import org.openecomp.sdc.be.user.UserBusinessLogic;
+import org.openecomp.sdc.common.api.ConfigurationSource;
+import org.openecomp.sdc.common.api.Constants;
+import org.openecomp.sdc.common.datastructure.FunctionalInterfaces;
+import org.openecomp.sdc.common.impl.ExternalConfiguration;
+import org.openecomp.sdc.common.impl.FSConfigurationSource;
+import org.openecomp.sdc.exception.ResponseFormat;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.annotation.AnnotationConfigApplicationContext;
+import org.springframework.web.context.WebApplicationContext;
+
+import javax.servlet.ServletContext;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.core.Application;
+import javax.ws.rs.core.GenericType;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.util.Arrays;
+import java.util.List;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.assertEquals;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.when;
+
+public class AbstractTemplateServletTest extends JerseyTest {
+
+    private static final HttpServletRequest request = Mockito.mock(HttpServletRequest.class);
+    private static final HttpSession session = Mockito.mock(HttpSession.class);
+    private static final ServletContext servletContext = Mockito.mock(ServletContext.class);
+    private static final WebAppContextWrapper webAppContextWrapper = Mockito.mock(WebAppContextWrapper.class);
+    private static final WebApplicationContext webApplicationContext = Mockito.mock(WebApplicationContext.class);
+    private static final ServletUtils servletUtils = Mockito.mock(ServletUtils.class);
+    private static final ComponentsUtils componentsUtils = Mockito.mock(ComponentsUtils.class);
+    private static final ResourceImportManager resourceImportManager = Mockito.mock(ResourceImportManager.class);
+    private static final ResourceBusinessLogic resourceBusinessLogic = Mockito.mock(ResourceBusinessLogic.class);
+    private static final ServiceBusinessLogic serviceBusinessLogic = Mockito.mock(ServiceBusinessLogic.class);
+    private static final ElementBusinessLogic elementBusinessLogic = Mockito.mock(ElementBusinessLogic.class);
+    private static final Resource resource = Mockito.mock(Resource.class);
+    private static final CategoryDefinition categoryDefinition = Mockito.mock(CategoryDefinition.class);
+    private static final SubCategoryDefinition subCategoryDefinition = Mockito.mock(SubCategoryDefinition.class);
+    private static final AssetMetadataConverter assetMetadataConverter = Mockito.mock(AssetMetadataConverter.class);
+    private static final ResourceAssetMetadata resourceAssetMetadata = new ResourceAssetMetadata();
+    private static final LifecycleBusinessLogic lifecycleBusinessLogic = Mockito.mock(LifecycleBusinessLogic.class);
+    private static final UserBusinessLogic userBusinessLogic = Mockito.mock(UserBusinessLogic.class);
+    private static final ComponentInstanceBusinessLogic componentInstanceBusinessLogic = Mockito.mock(ComponentInstanceBusinessLogic.class);
+    private static String serviceVertexUuid;
+
+
+    @BeforeClass
+    public static void setup() {
+        ExternalConfiguration.setAppName("catalog-be");
+        when(request.getSession()).thenReturn(session);
+        when(request.getHeader(Constants.X_ECOMP_INSTANCE_ID_HEADER)).thenReturn("mockXEcompInstanceId");
+        when(request.getHeader(Constants.USER_ID_HEADER)).thenReturn("mockAttID");
+        when(request.getRequestURL()).thenReturn(new StringBuffer("sdc/v1/catalog/abstract"));
+
+        when(session.getServletContext()).thenReturn(servletContext);
+        when(servletContext.getAttribute(Constants.WEB_APPLICATION_CONTEXT_WRAPPER_ATTR)).thenReturn(webAppContextWrapper);
+        when(webAppContextWrapper.getWebAppContext(servletContext)).thenReturn(webApplicationContext);
+
+        when(webApplicationContext.getBean(ServletUtils.class)).thenReturn(servletUtils);
+        when(webApplicationContext.getBean(ResourceBusinessLogic.class)).thenReturn(resourceBusinessLogic);
+
+        when(servletUtils.getComponentsUtils()).thenReturn(componentsUtils);
+        mockResponseFormat();
+
+        when(resource.getName()).thenReturn("MockVFCMT");
+        when(resource.getSystemName()).thenReturn("mockvfcmt");
+        Either<Resource, ResponseFormat> eitherRet = Either.left(resource);
+        when(componentsUtils.convertJsonToObjectUsingObjectMapper(Mockito.any(), Mockito.any(), Mockito.eq(Resource.class), Mockito.any(), Mockito.eq(ComponentTypeEnum.RESOURCE))).thenReturn(eitherRet);
+
+        when(webApplicationContext.getBean(ResourceImportManager.class)).thenReturn(resourceImportManager);
+        when(webApplicationContext.getBean(ElementBusinessLogic.class)).thenReturn(elementBusinessLogic);
+        when(categoryDefinition.getName()).thenReturn("Template");
+        when(subCategoryDefinition.getName()).thenReturn("Monitoring Template");
+        when(categoryDefinition.getSubcategories()).thenReturn(Arrays.asList(subCategoryDefinition));
+        when(elementBusinessLogic.getAllResourceCategories()).thenReturn(Either.left(Arrays.asList(categoryDefinition)));
+        when(resourceBusinessLogic.createResource(Mockito.eq(resource), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any())).thenReturn(resource);
+        when(webApplicationContext.getBean(AssetMetadataConverter.class)).thenReturn(assetMetadataConverter);
+        when(request.isUserInRole(anyString())).thenReturn(true);
+
+        Mockito.doReturn(Either.left(resourceAssetMetadata)).when(assetMetadataConverter).convertToSingleAssetMetadata(Mockito.eq(resource), Mockito.anyString(),
+                Mockito.eq(true));
+
+        String appConfigDir = "src/test/abstract/config";
+        ConfigurationSource configurationSource = new FSConfigurationSource(ExternalConfiguration.getChangeListener(), appConfigDir);
+        ConfigurationManager configurationManager = new ConfigurationManager(configurationSource);
+
+        org.openecomp.sdc.be.config.Configuration configuration = new org.openecomp.sdc.be.config.Configuration();
+        configuration.setJanusGraphInMemoryGraph(true);
+
+        configurationManager.setConfiguration(configuration);
+    }
+
+    private static void mockResponseFormat() {
+        when(componentsUtils.getResponseFormat(Mockito.any(ActionStatus.class), Mockito.any(String[].class))).thenAnswer((Answer<ResponseFormat>) invocation -> {
+            ResponseFormat ret;
+            final ActionStatus actionStatus = invocation.getArgument(0);
+            switch( actionStatus ){
+                case CREATED :{
+                    ret = new ResponseFormat(HttpStatus.SC_CREATED);
+                    break;
+                }
+                default :{
+                    ret = new ResponseFormat(HttpStatus.SC_INTERNAL_SERVER_ERROR);
+                    break;
+                }
+            }
+            return ret;
+        });
+    }
+    @Test
+    public void createVfcmtHappyScenario() {
+        final JSONObject createRequest = buildCreateJsonRequest();
+        Response response = target().path("/v1/catalog/abstract").request(MediaType.APPLICATION_JSON).header(Constants.X_ECOMP_INSTANCE_ID_HEADER, "mockXEcompInstanceId").header(Constants.USER_ID_HEADER, "mockAttID")
+                .post(Entity.json(createRequest.toJSONString()), Response.class);
+        assertEquals(response.getStatus(), HttpStatus.SC_INTERNAL_SERVER_ERROR);
+
+    }
+    private static final String BASIC_CREATE_REQUEST = "{\r\n" +
+            "  \"name\": \"VFCMT_1\",\r\n" +
+            "  \"description\": \"VFCMT Description\",\r\n" +
+            "  \"resourceType\" : \"VFCMT\",\r\n" +
+            "  \"category\": \"Template\",\r\n" +
+            "  \"subcategory\": \"Monitoring Template\",\r\n" +
+            "  \"vendorName\" : \"DCAE\",\r\n" +
+            "  \"vendorRelease\" : \"1.0\",\r\n" +
+            "  \"tags\": [\r\n" +
+            "    \"VFCMT_1\"\r\n" +
+            "  ],\r\n" +
+            "  \"icon\" : \"defaulticon\",\r\n" +
+            "  \"contactId\": \"cs0008\"\r\n" +
+            "}";
+    private JSONObject buildCreateJsonRequest() {
+
+        JSONParser parser = new JSONParser();
+        return (JSONObject) FunctionalInterfaces.swallowException( () -> parser.parse(BASIC_CREATE_REQUEST));
+
+    }
+
+    @Override
+    protected Application configure() {
+        ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
+        forceSet(TestProperties.CONTAINER_PORT, "0");
+        return new ResourceConfig()
+                .register(new CrudExternalServlet(userBusinessLogic, componentInstanceBusinessLogic,componentsUtils,servletUtils,resourceImportManager, elementBusinessLogic, assetMetadataConverter, lifecycleBusinessLogic, resourceBusinessLogic, serviceBusinessLogic))
+                .register(new AbstractBinder() {
+
+                    @Override
+                    protected void configure() {
+                        bind(request).to(HttpServletRequest.class);
+                    }
+                })
+                .property("contextConfig", context);
+    }
+
+}
\ No newline at end of file
diff --git a/catalog-be/src/test/java/org/openecomp/sdc/be/externalapi/servlet/representation/AbstractResourceInfoTest.java b/catalog-be/src/test/java/org/openecomp/sdc/be/externalapi/servlet/representation/AbstractResourceInfoTest.java
new file mode 100644 (file)
index 0000000..45fdf57
--- /dev/null
@@ -0,0 +1,41 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdc.be.externalapi.servlet.representation;
+
+import org.junit.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class AbstractResourceInfoTest {
+
+    private AbstractResourceInfo createTestSubject(){
+        return new AbstractResourceInfo();
+    }
+
+    @Test
+    public void testAbstractResourceNameInstance() {
+        AbstractResourceInfo testSubject;
+
+        // default test
+        testSubject = createTestSubject();
+        assertThat(testSubject).isInstanceOf(AbstractResourceInfo.class);
+    }
+}
\ No newline at end of file
diff --git a/catalog-be/src/test/java/org/openecomp/sdc/be/externalapi/servlet/representation/AbstractTemplateInfoTest.java b/catalog-be/src/test/java/org/openecomp/sdc/be/externalapi/servlet/representation/AbstractTemplateInfoTest.java
new file mode 100644 (file)
index 0000000..883c402
--- /dev/null
@@ -0,0 +1,40 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdc.be.externalapi.servlet.representation;
+
+import org.junit.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class AbstractTemplateInfoTest {
+    private AbstractTemplateInfo createTestSubject(){
+        return new AbstractTemplateInfo();
+    }
+
+    @Test
+    public void testAbstractTemplateNameInstance() {
+        AbstractTemplateInfo testSubject;
+
+        // default test
+        testSubject = createTestSubject();
+        assertThat(testSubject).isInstanceOf(AbstractTemplateInfo.class);
+    }
+}
\ No newline at end of file
diff --git a/catalog-be/src/test/java/org/openecomp/sdc/be/externalapi/servlet/representation/CopyServiceInfoTest.java b/catalog-be/src/test/java/org/openecomp/sdc/be/externalapi/servlet/representation/CopyServiceInfoTest.java
new file mode 100644 (file)
index 0000000..00f78a7
--- /dev/null
@@ -0,0 +1,42 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdc.be.externalapi.servlet.representation;
+
+import org.junit.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class CopyServiceInfoTest {
+
+    private CopyServiceInfo createTestSubject(){
+        return new CopyServiceInfo();
+    }
+
+    @Test
+    public void testCopyServiceNameInstance() {
+        CopyServiceInfo testSubject;
+
+        // default test
+        testSubject = createTestSubject();
+        assertThat(testSubject).isInstanceOf(CopyServiceInfo.class);
+    }
+
+}
\ No newline at end of file
diff --git a/catalog-be/src/test/java/org/openecomp/sdc/be/externalapi/servlet/representation/ReplaceVNFInfoTest.java b/catalog-be/src/test/java/org/openecomp/sdc/be/externalapi/servlet/representation/ReplaceVNFInfoTest.java
new file mode 100644 (file)
index 0000000..3dd80c7
--- /dev/null
@@ -0,0 +1,41 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdc.be.externalapi.servlet.representation;
+
+import org.junit.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class ReplaceVNFInfoTest {
+
+    private ReplaceVNFInfo createTestSubject(){
+        return new ReplaceVNFInfo();
+    }
+
+    @Test
+    public void testReplaceVNFInstance() {
+        ReplaceVNFInfo testSubject;
+
+        // default test
+        testSubject = createTestSubject();
+        assertThat(testSubject).isInstanceOf(ReplaceVNFInfo.class);
+    }
+}
\ No newline at end of file
index af28aca..6c1c447 100644 (file)
@@ -30,6 +30,7 @@ import org.apache.commons.lang3.tuple.ImmutablePair;
 import org.apache.commons.text.StrSubstitutor;
 import org.apache.http.HttpStatus;
 import org.glassfish.hk2.utilities.binding.AbstractBinder;
+import org.glassfish.jersey.media.multipart.MultiPartFeature;
 import org.glassfish.jersey.server.ResourceConfig;
 import org.glassfish.jersey.test.JerseyTest;
 import org.glassfish.jersey.test.TestProperties;
@@ -1033,6 +1034,7 @@ public class ResourceServletTest extends JerseyTest {
                     bind(resourceImportManager).to(ResourceImportManager.class);
                 }
             })
+            .register(MultiPartFeature.class)
             .property("contextConfig", context);
     }
 }
diff --git a/catalog-be/src/test/java/org/openecomp/sdc/be/servlets/ServiceUploadServletTest.java b/catalog-be/src/test/java/org/openecomp/sdc/be/servlets/ServiceUploadServletTest.java
new file mode 100644 (file)
index 0000000..0c11198
--- /dev/null
@@ -0,0 +1,25 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdc.be.servlets;
+
+public class ServiceUploadServletTest {
+
+}
\ No newline at end of file
diff --git a/catalog-be/src/test/resources/normativeTypes/service_import_template.yml b/catalog-be/src/test/resources/normativeTypes/service_import_template.yml
new file mode 100644 (file)
index 0000000..6d8e804
--- /dev/null
@@ -0,0 +1,334 @@
+tosca_definitions_version: tosca_simple_yaml_1_1
+metadata:
+  invariantUUID: 6d17f281-683b-4198-a676-0faeecdc9025
+  UUID: bfeab6b4-199b-4a2b-b724-de416c5e9811
+  name: ser09080002
+  description: ser09080002
+  type: Service
+  category: E2E Service
+  serviceType: ''
+  serviceRole: ''
+  instantiationType: A-la-carte
+  serviceEcompNaming: true
+  ecompGeneratedNaming: true
+  namingPolicy: ''
+  environmentContext: General_Revenue-Bearing
+  serviceFunction: ''
+imports:
+- nodes:
+    file: nodes.yml
+- datatypes:
+    file: data.yml
+- capabilities:
+    file: capabilities.yml
+- relationships:
+    file: relationships.yml
+- groups:
+    file: groups.yml
+- policies:
+    file: policies.yml
+- annotations:
+    file: annotations.yml
+- service-ser09080002-interface:
+    file: service-Ser09080002-template-interface.yml
+- resource-ExtCP:
+    file: resource-Extcp-template.yml
+- resource-zxjTestImportServiceAb:
+    file: resource-Zxjtestimportserviceab-template.yml
+- resource-zxjTestImportServiceAb-interface:
+    file: resource-Zxjtestimportserviceab-template-interface.yml
+- resource-zxjTestServiceNotAbatract:
+    file: resource-Zxjtestservicenotabatract-template.yml
+- resource-zxjTestServiceNotAbatract-interface:
+    file: resource-Zxjtestservicenotabatract-template-interface.yml
+- resource-ext ZTE VL:
+    file: resource-ExtZteVl-template.yml
+topology_template:
+  inputs:
+    skip_post_instantiation_configuration:
+      default: true
+      type: boolean
+      required: false
+    controller_actor:
+      default: SO-REF-DATA
+      type: string
+      required: false
+    cds_model_version:
+      type: string
+      required: false
+    cds_model_name:
+      type: string
+      required: false
+  node_templates:
+    ext ZTE VL 0:
+      type: tosca.nodes.nfv.ext.zte.VL
+      metadata:
+        invariantUUID: 27ab7610-1a97-4daa-938a-3b48e7afcfd0
+        UUID: 9ea63e2c-4b8a-414f-93e3-5703ca5cee0d
+        customizationUUID: e45e79b0-07ab-46b4-ac26-1e9f155ce53c
+        version: '1.0'
+        name: ext ZTE VL
+        description: Ext ZTE VL
+        type: VL
+        category: Generic
+        subcategory: Network Elements
+        resourceVendor: ONAP (Tosca)
+        resourceVendorRelease: 1.0.0.wd03
+        resourceVendorModelNumber: ''
+    zxjTestServiceNotAbatract 0:
+      type: org.openecomp.resource.vf.Zxjtestservicenotabatract
+      metadata:
+        invariantUUID: ce39ce8d-6f97-4e89-8555-ae6789cdcf1c
+        UUID: 4ac822be-f1ae-4ace-a4b8-bf6b5d977005
+        customizationUUID: ee34e1e8-68e2-480f-8ba6-f257bbe90d6a
+        version: '1.0'
+        name: zxjTestServiceNotAbatract
+        description: zxjTestServiceNotAbatract
+        type: VF
+        category: Network L4+
+        subcategory: Common Network Resources
+        resourceVendor: zxjImportService
+        resourceVendorRelease: '1.0'
+        resourceVendorModelNumber: ''
+      properties:
+        nf_naming:
+          ecomp_generated_naming: true
+        skip_post_instantiation_configuration: true
+        multi_stage_design: 'false'
+        controller_actor: SO-REF-DATA
+        availability_zone_max_count: 1
+      capabilities:
+        mme_ipu_vdu.scalable:
+          properties:
+            max_instances: 1
+            min_instances: 1
+        mme_ipu_vdu.nfv_compute:
+          properties:
+            num_cpus: '2'
+            flavor_extra_specs: {
+              }
+            mem_size: '8192'
+    ExtCP 0:
+      type: org.openecomp.resource.cp.extCP
+      metadata:
+        invariantUUID: 9b772728-93f5-424f-bb07-f4cae2783614
+        UUID: 424ac220-4864-453e-b757-917fe4568ff8
+        customizationUUID: 6e65d8a8-4379-4693-87aa-82f9e34b92fd
+        version: '1.0'
+        name: ExtCP
+        description: The AT&T Connection Point base type all other CP derive from
+        type: CP
+        category: Generic
+        subcategory: Network Elements
+        resourceVendor: ONAP (Tosca)
+        resourceVendorRelease: 1.0.0.wd03
+        resourceVendorModelNumber: ''
+      properties:
+        mac_requirements:
+          mac_count_required:
+            is_required: false
+        exCP_naming:
+          ecomp_generated_naming: true
+    zxjTestImportServiceAb 0:
+      type: org.openecomp.resource.vf.Zxjtestimportserviceab
+      metadata:
+        invariantUUID: 41474f7f-3195-443d-a0a2-eb6020a56279
+        UUID: 92e32e49-55f8-46bf-984d-a98c924037ec
+        customizationUUID: 98c7a6c7-a867-45fb-8597-dd464f98e4aa
+        version: '1.0'
+        name: zxjTestImportServiceAb
+        description: zxjTestImportServiceAbstract
+        type: VF
+        category: Generic
+        subcategory: Abstract
+        resourceVendor: zxjImportService
+        resourceVendorRelease: '1.0'
+        resourceVendorModelNumber: ''
+      properties:
+        nf_naming:
+          ecomp_generated_naming: true
+        skip_post_instantiation_configuration: true
+        multi_stage_design: 'false'
+        controller_actor: SO-REF-DATA
+        availability_zone_max_count: 1
+      requirements:
+      - mme_ipu_vdu.dependency:
+          capability: feature
+          node: ExtCP 0
+      - imagefile.dependency:
+          capability: feature
+          node: ext ZTE VL 0
+      capabilities:
+        mme_ipu_vdu.scalable:
+          properties:
+            max_instances: 1
+            min_instances: 1
+        mme_ipu_vdu.nfv_compute:
+          properties:
+            num_cpus: '2'
+            flavor_extra_specs: {
+              }
+            mem_size: '8192'
+  substitution_mappings:
+    node_type: org.openecomp.service.Ser09080002
+    capabilities:
+      extcp0.feature:
+      - ExtCP 0
+      - feature
+      zxjtestservicenotabatract0.mme_ipu_vdu.monitoring_parameter:
+      - zxjTestServiceNotAbatract 0
+      - mme_ipu_vdu.monitoring_parameter
+      zxjtestimportserviceab0.imagefile.guest_os:
+      - zxjTestImportServiceAb 0
+      - imagefile.guest_os
+      zxjtestimportserviceab0.imagefile.feature:
+      - zxjTestImportServiceAb 0
+      - imagefile.feature
+      zxjtestservicenotabatract0.imagefile.guest_os:
+      - zxjTestServiceNotAbatract 0
+      - imagefile.guest_os
+      zxjtestimportserviceab0.ipu_cpd.feature:
+      - zxjTestImportServiceAb 0
+      - ipu_cpd.feature
+      zxjtestservicenotabatract0.mme_ipu_vdu.virtualbinding:
+      - zxjTestServiceNotAbatract 0
+      - mme_ipu_vdu.virtualbinding
+      zxjtestimportserviceab0.mme_ipu_vdu.feature:
+      - zxjTestImportServiceAb 0
+      - mme_ipu_vdu.feature
+      extztevl0.feature:
+      - ext ZTE VL 0
+      - feature
+      zxjtestimportserviceab0.imagefile.image_fle:
+      - zxjTestImportServiceAb 0
+      - imagefile.image_fle
+      zxjtestimportserviceab0.mme_ipu_vdu.monitoring_parameter:
+      - zxjTestImportServiceAb 0
+      - mme_ipu_vdu.monitoring_parameter
+      zxjtestservicenotabatract0.ipu_cpd.feature:
+      - zxjTestServiceNotAbatract 0
+      - ipu_cpd.feature
+      zxjtestservicenotabatract0.mme_ipu_vdu.nfv_compute:
+      - zxjTestServiceNotAbatract 0
+      - mme_ipu_vdu.nfv_compute
+      zxjtestservicenotabatract0.mme_ipu_vdu.scalable:
+      - zxjTestServiceNotAbatract 0
+      - mme_ipu_vdu.scalable
+      extcp0.internal_connectionPoint:
+      - ExtCP 0
+      - internal_connectionPoint
+      zxjtestimportserviceab0.mme_ipu_vdu.virtualbinding:
+      - zxjTestImportServiceAb 0
+      - mme_ipu_vdu.virtualbinding
+      zxjtestservicenotabatract0.imagefile.image_fle:
+      - zxjTestServiceNotAbatract 0
+      - imagefile.image_fle
+      extztevl0.virtual_linkable:
+      - ext ZTE VL 0
+      - virtual_linkable
+      zxjtestservicenotabatract0.imagefile.feature:
+      - zxjTestServiceNotAbatract 0
+      - imagefile.feature
+      zxjtestimportserviceab0.localstorage.feature:
+      - zxjTestImportServiceAb 0
+      - localstorage.feature
+      zxjtestservicenotabatract0.localstorage.local_attachment:
+      - zxjTestServiceNotAbatract 0
+      - localstorage.local_attachment
+      zxjtestimportserviceab0.mme_ipu_vdu.scalable:
+      - zxjTestImportServiceAb 0
+      - mme_ipu_vdu.scalable
+      zxjtestservicenotabatract0.localstorage.feature:
+      - zxjTestServiceNotAbatract 0
+      - localstorage.feature
+      zxjtestimportserviceab0.mme_ipu_vdu.nfv_compute:
+      - zxjTestImportServiceAb 0
+      - mme_ipu_vdu.nfv_compute
+      zxjtestimportserviceab0.localstorage.local_attachment:
+      - zxjTestImportServiceAb 0
+      - localstorage.local_attachment
+      zxjtestservicenotabatract0.mme_ipu_vdu.feature:
+      - zxjTestServiceNotAbatract 0
+      - mme_ipu_vdu.feature
+      zxjtestimportserviceab0.ipu_cpd.forwarder:
+      - zxjTestImportServiceAb 0
+      - ipu_cpd.forwarder
+      zxjtestservicenotabatract0.ipu_cpd.forwarder:
+      - zxjTestServiceNotAbatract 0
+      - ipu_cpd.forwarder
+    requirements:
+      zxjtestservicenotabatract0.imagefile.dependency:
+      - zxjTestServiceNotAbatract 0
+      - imagefile.dependency
+      zxjtestservicenotabatract0.mme_ipu_vdu.local_storage:
+      - zxjTestServiceNotAbatract 0
+      - mme_ipu_vdu.local_storage
+      zxjtestservicenotabatract0.ipu_cpd.dependency:
+      - zxjTestServiceNotAbatract 0
+      - ipu_cpd.dependency
+      zxjtestservicenotabatract0.mme_ipu_vdu.volume_storage:
+      - zxjTestServiceNotAbatract 0
+      - mme_ipu_vdu.volume_storage
+      zxjtestservicenotabatract0.ipu_cpd.virtualbinding:
+      - zxjTestServiceNotAbatract 0
+      - ipu_cpd.virtualbinding
+      zxjtestservicenotabatract0.mme_ipu_vdu.dependency:
+      - zxjTestServiceNotAbatract 0
+      - mme_ipu_vdu.dependency
+      zxjtestservicenotabatract0.localstorage.dependency:
+      - zxjTestServiceNotAbatract 0
+      - localstorage.dependency
+      zxjtestimportserviceab0.imagefile.dependency:
+      - zxjTestImportServiceAb 0
+      - imagefile.dependency
+      zxjtestimportserviceab0.mme_ipu_vdu.volume_storage:
+      - zxjTestImportServiceAb 0
+      - mme_ipu_vdu.volume_storage
+      zxjtestimportserviceab0.ipu_cpd.virtualbinding:
+      - zxjTestImportServiceAb 0
+      - ipu_cpd.virtualbinding
+      extcp0.virtualLink:
+      - ExtCP 0
+      - virtualLink
+      extcp0.virtualBinding:
+      - ExtCP 0
+      - virtualBinding
+      zxjtestimportserviceab0.mme_ipu_vdu.guest_os:
+      - zxjTestImportServiceAb 0
+      - mme_ipu_vdu.guest_os
+      extcp0.dependency:
+      - ExtCP 0
+      - dependency
+      zxjtestimportserviceab0.localstorage.dependency:
+      - zxjTestImportServiceAb 0
+      - localstorage.dependency
+      zxjtestservicenotabatract0.ipu_cpd.virtualLink:
+      - zxjTestServiceNotAbatract 0
+      - ipu_cpd.virtualLink
+      extztevl0.dependency:
+      - ext ZTE VL 0
+      - dependency
+      zxjtestimportserviceab0.ipu_cpd.dependency:
+      - zxjTestImportServiceAb 0
+      - ipu_cpd.dependency
+      zxjtestimportserviceab0.mme_ipu_vdu.dependency:
+      - zxjTestImportServiceAb 0
+      - mme_ipu_vdu.dependency
+      zxjtestimportserviceab0.mme_ipu_vdu.local_storage:
+      - zxjTestImportServiceAb 0
+      - mme_ipu_vdu.local_storage
+      zxjtestimportserviceab0.ipu_cpd.virtualLink:
+      - zxjTestImportServiceAb 0
+      - ipu_cpd.virtualLink
+      extcp0.external_virtualLink:
+      - ExtCP 0
+      - external_virtualLink
+      zxjtestservicenotabatract0.mme_ipu_vdu.guest_os:
+      - zxjTestServiceNotAbatract 0
+      - mme_ipu_vdu.guest_os
+      zxjtestimportserviceab0.ipu_cpd.forwarder:
+      - zxjTestImportServiceAb 0
+      - ipu_cpd.forwarder
+      zxjtestservicenotabatract0.ipu_cpd.forwarder:
+      - zxjTestServiceNotAbatract 0
+      - ipu_cpd.forwarder
index 4296722..cdb10a7 100644 (file)
@@ -31,7 +31,8 @@ public enum ActionStatus {
     // Resource related
     RESOURCE_NOT_FOUND, MISSING_DERIVED_FROM_TEMPLATE, PARENT_RESOURCE_NOT_FOUND, PARENT_RESOURCE_DOES_NOT_EXTEND, INVALID_DEFAULT_VALUE, INVALID_COMPLEX_DEFAULT_VALUE, MULTIPLE_PARENT_RESOURCE_FOUND, INVALID_RESOURCE_PAYLOAD, INVALID_TOSCA_FILE_EXTENSION, INVALID_YAML_FILE, INVALID_TOSCA_TEMPLATE, NOT_RESOURCE_TOSCA_TEMPLATE, NOT_SINGLE_RESOURCE, INVALID_RESOURCE_NAMESPACE, RESOURCE_ALREADY_EXISTS, INVALID_RESOURCE_CHECKSUM, RESOURCE_CANNOT_CONTAIN_RESOURCE_INSTANCES, NO_ASSETS_FOUND, GENERIC_TYPE_NOT_FOUND, INVALID_RESOURCE_TYPE, TOSCA_PARSE_ERROR,
     // Service related
-    UNSUPPORTED_DISTRIBUTION_STATUS, INVALID_NAMING_POLICY, INVALID_ENVIRONMENT_CONTEXT, NAMING_POLICY_EXCEEDS_LIMIT, MISSING_ECOMP_GENERATED_NAMING, PROPERTY_EXCEEDS_LIMIT, INVALID_PROPERY, INVALID_INSTANTIATION_TYPE,
+    SERVICE_TYPE_EXCEEDS_LIMIT, INVALID_SERVICE_TYPE, SERVICE_ROLE_EXCEEDS_LIMIT, INVALID_SERVICE_ROLE, INVALID_INSTANTIATION_TYPE, NOT_SERVICE_TOSCA_TEMPLATE,NOT_SINGLE_SERVICE,INVALID_SERVICE_CHECKSUM,INVALID_SERVICE_PAYLOAD,INVALID_SERVICE_NAMESPACE,SERVICE_ALREADY_EXISTS,
+    UNSUPPORTED_DISTRIBUTION_STATUS, INVALID_NAMING_POLICY, INVALID_ENVIRONMENT_CONTEXT, NAMING_POLICY_EXCEEDS_LIMIT, MISSING_ECOMP_GENERATED_NAMING, PROPERTY_EXCEEDS_LIMIT, INVALID_PROPERY,
     // Component name related
     COMPONENT_NAME_ALREADY_EXIST, COMPONENT_NAME_EXCEEDS_LIMIT, MISSING_COMPONENT_NAME, INVALID_COMPONENT_NAME,
     // Component description related
@@ -82,7 +83,7 @@ public enum ActionStatus {
     ANNOTATION_TYPE_ALREADY_EXIST,
 
     // CSAR
-    MISSING_CSAR_UUID, CSAR_INVALID, CSAR_INVALID_FORMAT, CSAR_NOT_FOUND, YAML_NOT_FOUND_IN_CSAR, VSP_ALREADY_EXISTS, RESOURCE_LINKED_TO_DIFFERENT_VSP, RESOURCE_FROM_CSAR_NOT_FOUND, AAI_ARTIFACT_GENERATION_FAILED, ASSET_NOT_FOUND_DURING_CSAR_CREATION, ARTIFACT_PAYLOAD_NOT_FOUND_DURING_CSAR_CREATION, TOSCA_SCHEMA_FILES_NOT_FOUND, ARTIFACT_NAME_INVALID, ARTIFACT_PAYLOAD_EMPTY,ERROR_DURING_CSAR_CREATION,
+    MISSING_CSAR_UUID, CSAR_INVALID, CSAR_INVALID_FORMAT, CSAR_NOT_FOUND, YAML_NOT_FOUND_IN_CSAR, VSP_ALREADY_EXISTS, RESOURCE_LINKED_TO_DIFFERENT_VSP, RESOURCE_FROM_CSAR_NOT_FOUND, AAI_ARTIFACT_GENERATION_FAILED, ASSET_NOT_FOUND_DURING_CSAR_CREATION, ARTIFACT_PAYLOAD_NOT_FOUND_DURING_CSAR_CREATION, TOSCA_SCHEMA_FILES_NOT_FOUND, ARTIFACT_NAME_INVALID, ARTIFACT_PAYLOAD_EMPTY,ERROR_DURING_CSAR_CREATION,SERVICE_LINKED_TO_DIFFERENT_VSP,
 
     // Group
     GROUP_HAS_CYCLIC_DEPENDENCY, GROUP_ALREADY_EXIST, GROUP_TYPE_IS_INVALID, GROUP_MISSING_GROUP_TYPE, GROUP_INVALID_COMPONENT_INSTANCE, GROUP_INVALID_TOSCA_NAME_OF_COMPONENT_INSTANCE, GROUP_IS_MISSING, GROUP_ARTIFACT_ALREADY_ASSOCIATED, GROUP_ARTIFACT_ALREADY_DISSOCIATED, GROUP_PROPERTY_NOT_FOUND, INVALID_VF_MODULE_NAME, INVALID_VF_MODULE_NAME_MODIFICATION, INVALID_VF_MODULE_TYPE,
@@ -175,8 +176,12 @@ public enum ActionStatus {
 
     //Requirement related
     REQUIREMENT_NOT_FOUND,  REQUIREMENT_NAME_MANDATORY, REQUIREMENT_CAPABILITY_MANDATORY,REQUIREMENT_NAME_ALREADY_IN_USE,
-    REQUIREMENT_DELETION_NOT_ALLOWED_USED_IN_COMPOSITION, REQUIREMENT_UPDATE_NOT_ALLOWED_USED_IN_COMPOSITION, INVALID_REQUIREMENT_NAME
-    ;
+    REQUIREMENT_DELETION_NOT_ALLOWED_USED_IN_COMPOSITION, REQUIREMENT_UPDATE_NOT_ALLOWED_USED_IN_COMPOSITION, INVALID_REQUIREMENT_NAME,
+
+    //Abstract template related
+    ABSTRACT, NORMAL
+
+       ;
 
 
     }
index 4203c9f..9f176d0 100644 (file)
@@ -35,6 +35,7 @@ public enum AuditingActionEnum {
     // Resource/service administration
     CREATE_RESOURCE("Create", AuditingTypesConstants.RESOURCE_ADMIN_EVENT_TYPE),
     IMPORT_RESOURCE("ResourceImport", AuditingTypesConstants.RESOURCE_ADMIN_EVENT_TYPE),
+    IMPORT_SERVICE("ServiceImport", AuditingTypesConstants.RESOURCE_ADMIN_EVENT_TYPE),
     CHECKOUT_RESOURCE("Checkout", AuditingTypesConstants.RESOURCE_ADMIN_EVENT_TYPE),
     UNDO_CHECKOUT_RESOURCE("UndoCheckout", AuditingTypesConstants.RESOURCE_ADMIN_EVENT_TYPE),
     CHECKIN_RESOURCE("Checkin", AuditingTypesConstants.RESOURCE_ADMIN_EVENT_TYPE),
@@ -109,7 +110,14 @@ public enum AuditingActionEnum {
     GET_ASSET_LIST("GetAssetList", AuditingTypesConstants.EXTERNAL_API_EVENT_TYPE),
     GET_FILTERED_ASSET_LIST("GetFilteredAssetList", AuditingTypesConstants.EXTERNAL_API_EVENT_TYPE),
     GET_ASSET_METADATA("GetAssetMetadata", AuditingTypesConstants.EXTERNAL_API_EVENT_TYPE),
-    GET_TOSCA_MODEL("GetToscaModel", AuditingTypesConstants.EXTERNAL_API_EVENT_TYPE);
+    GET_TOSCA_MODEL("GetToscaModel", AuditingTypesConstants.EXTERNAL_API_EVENT_TYPE),
+
+    // Abstract Template
+    GET_TEMPLATE_ABSTRACT_STATUS("GetTemplateAbstractStatus", AuditingTypesConstants.EXTERNAL_API_EVENT_TYPE),
+    COPY_EXIST_SERVICE("CopyExistService", AuditingTypesConstants.EXTERNAL_API_EVENT_TYPE),
+    Import_Replace_Service("ImportReplaceService", AuditingTypesConstants.EXTERNAL_API_EVENT_TYPE),
+    Replace_VNF("ReplaceVNF", AuditingTypesConstants.EXTERNAL_API_EVENT_TYPE),
+    Import_Replace_Resource("ReplaceVNF", AuditingTypesConstants.EXTERNAL_API_EVENT_TYPE);
 
        private final String name;
        private final String auditingEsType;
index 3e33fd4..2e326ce 100644 (file)
@@ -46,6 +46,7 @@ public class Service extends Component {
 
     private Map<String, ArtifactDefinition> serviceApiArtifacts;
     private Map<String, ForwardingPathDataDefinition> forwardingPaths;
+    private String toscaServiceName;
 
     public Service() {
         super(new ServiceMetadataDefinition());
@@ -178,4 +179,24 @@ public class Service extends Component {
     public void setSpecificComponetTypeArtifacts(Map<String, ArtifactDefinition> specificComponentTypeArtifacts) {
         setServiceApiArtifacts(specificComponentTypeArtifacts);
     }
+
+
+    public void setServiceVendorModelNumber(String serviceVendorModelNumber) {
+        getServiceMetadataDefinition().setServiceVendorModelNumber(serviceVendorModelNumber);
+    }
+
+    public void setAbstract(Boolean isAbstract) {
+        ((ServiceMetadataDataDefinition) getComponentMetadataDefinition().getMetadataDataDefinition())
+            .setIsAbstract(isAbstract);
+    }
+
+    public void setVendorName(String vendorName) {
+        ((ServiceMetadataDataDefinition) getComponentMetadataDefinition().getMetadataDataDefinition())
+            .setVendorName(vendorName);
+    }
+
+    public void setVendorRelease(String vendorRelease) {
+        ((ServiceMetadataDataDefinition) getComponentMetadataDefinition().getMetadataDataDefinition())
+            .setVendorRelease(vendorRelease);
+    }
 }
diff --git a/catalog-model/src/main/java/org/openecomp/sdc/be/model/UploadServiceInfo.java b/catalog-model/src/main/java/org/openecomp/sdc/be/model/UploadServiceInfo.java
new file mode 100644 (file)
index 0000000..29d6fa4
--- /dev/null
@@ -0,0 +1,144 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * Copyright (C) 2020 CMCC Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdc.be.model;
+
+import java.util.ArrayList;
+import java.util.List;
+import lombok.Getter;
+import lombok.Setter;
+import org.openecomp.sdc.be.model.category.CategoryDefinition;
+import org.openecomp.sdc.be.model.category.SubCategoryDefinition;
+import org.openecomp.sdc.common.api.UploadArtifactInfo;
+
+@Getter
+@Setter
+public class UploadServiceInfo {
+
+  private String payloadData;
+  private String payloadName;
+  private String description;
+  private List<String> tags;
+  private List<CategoryDefinition> categories;
+
+  private String invariantUUID;
+  private String UUID;
+  private String type;
+  private String category;
+  private String subcategory;
+  private String resourceVendor;
+  private String resourceVendorRelease;
+  private String serviceRole;
+  private String serviceEcompNaming;
+  private String ecompGeneratedNaming;
+  private String namingPolicy;
+  private String projectCode;
+
+
+  private List<UploadArtifactInfo> artifactList;
+  private String contactId, name, serviceIconPath, icon, vendorName, vendorRelease, serviceVendorModelNumber;
+
+  private String serviceType = "";
+
+  public UploadServiceInfo(String payloadData, String payloadName, String description,
+      List<String> tags, String invariantUUID, String UUID, String type,
+      String category, String subcategory, String resourceVendor,
+      String resourceVendorRelease, String serviceRole, String serviceEcompNaming,
+      String ecompGeneratedNaming, String namingPolicy,
+      List<UploadArtifactInfo> artifactList, String contactId, String name,
+      String resourceIconPath, String icon, String vendorName, String vendorRelease,
+      String serviceVendorModelNumber, String serviceType, String projectCode) {
+    this.payloadData = payloadData;
+    this.payloadName = payloadName;
+    this.description = description;
+    this.tags = tags;
+    this.invariantUUID = invariantUUID;
+    this.UUID = UUID;
+    this.type = type;
+    this.category = category;
+    this.subcategory = subcategory;
+    this.resourceVendor = resourceVendor;
+    this.resourceVendorRelease = resourceVendorRelease;
+    this.serviceRole = serviceRole;
+    this.serviceEcompNaming = serviceEcompNaming;
+    this.ecompGeneratedNaming = ecompGeneratedNaming;
+    this.namingPolicy = namingPolicy;
+    this.artifactList = artifactList;
+    this.contactId = contactId;
+    this.name = name;
+    this.serviceIconPath = serviceIconPath;
+    this.icon = icon;
+    this.vendorName = vendorName;
+    this.vendorRelease = vendorRelease;
+    this.serviceVendorModelNumber = serviceVendorModelNumber;
+    this.serviceType = serviceType;
+    this.projectCode = projectCode;
+
+    if (category != null) {
+      String[] arr = category.split("/");
+      if (arr.length >= 2) {
+        categories = new ArrayList<>();
+        CategoryDefinition catDef = new CategoryDefinition();
+        catDef.setName(arr[0]);
+        SubCategoryDefinition subCat = new SubCategoryDefinition();
+        subCat.setName(arr[1]);
+        catDef.addSubCategory(subCat);
+        categories.add(catDef);
+      }
+    }
+  }
+
+  public UploadServiceInfo() {
+  }
+  public void addSubCategory(String category, String subCategory) {
+    if (category != null || subCategory != null) {
+      if (categories == null) {
+        categories = new ArrayList<>();
+      }
+      CategoryDefinition selectedCategory = null;
+      for (CategoryDefinition categoryDef : categories) {
+        if (categoryDef.getName().equals(category)) {
+          selectedCategory = categoryDef;
+        }
+      }
+      if (selectedCategory == null) {
+        selectedCategory = new CategoryDefinition();
+        selectedCategory.setName(category);
+        categories.add(selectedCategory);
+      }
+      List<SubCategoryDefinition> subcategories = selectedCategory.getSubcategories();
+      if (subcategories == null) {
+        subcategories = new ArrayList<>();
+        selectedCategory.setSubcategories(subcategories);
+      }
+      SubCategoryDefinition selectedSubcategory = null;
+      for (SubCategoryDefinition subcategory : subcategories) {
+        if (subcategory.getName().equals(subCategory)) {
+          selectedSubcategory = subcategory;
+        }
+      }
+      if (selectedSubcategory == null) {
+        selectedSubcategory = new SubCategoryDefinition();
+        selectedSubcategory.setName(subCategory);
+        subcategories.add(selectedSubcategory);
+      }
+    }
+  }
+}
\ No newline at end of file
index 7a399a1..5fb07a0 100644 (file)
@@ -776,8 +776,14 @@ public class NodeTemplateOperation extends BaseOperation {
             listCapabilities.forEach(cap -> {
                 cap.setSource(componentInstance.getComponentUid());
                 cap.addToPath(componentInstance.getUniqueId());
+                log.debug("enter populateCapability,get Capability OwnerId:{},get componentInstance UniqueId:{}",
+                        cap.getOwnerId(), componentInstance.getUniqueId());
                 cap.setOwnerId(componentInstance.getUniqueId());
-                cap.setOwnerName(componentInstance.getName());
+                log.debug("enter populateCapability,get Capability OwnerName:{},get componentInstance Name:{}",
+                        cap.getOwnerName(), componentInstance.getName());
+                if (cap.getOwnerName() == null || cap.getOwnerName().isEmpty()) {
+                    cap.setOwnerName(componentInstance.getName());
+                }
                 cap.setLeftOccurrences(cap.getMaxOccurrences());
                 allCalculatedCap.add(key, cap);
             });
@@ -803,8 +809,15 @@ public class NodeTemplateOperation extends BaseOperation {
             listRequirements.forEach(req -> {
                 req.setSource(componentInstance.getComponentUid());
                 req.addToPath(componentInstance.getUniqueId());
-                req.setOwnerId(componentInstance.getUniqueId());
-                req.setOwnerName(componentInstance.getName());
+                log.debug("enter populateRequirement,get init Requirements OwnerId:{},get componentInstance UniqueId:{}",
+                        req.getOwnerId(), componentInstance.getUniqueId());
+                if (req.getOwnerId() == null || req.getOwnerId().isEmpty()) {
+                    req.setOwnerId(componentInstance.getUniqueId());
+                }
+                log.debug("enter populateRequirement,get init Requirements OwnerName:{}", req.getOwnerName());
+                if (req.getOwnerName() == null || req.getOwnerName().isEmpty()) {
+                    req.setOwnerName(componentInstance.getName());
+                }
                 req.setLeftOccurrences(req.getMaxOccurrences());
                 allCalculatedReq.add(key, req);
             });
index dc9174e..50b2ae4 100644 (file)
@@ -405,6 +405,52 @@ public class ToscaOperationFacade {
                 }
             );
     }
+       
+       public Either<Resource, StorageOperationStatus> getLatestResourceByToscaResourceName(String toscaResourceName) {
+       if (toscaResourceName != null && toscaResourceName.contains("org.openecomp.resource.vf"))
+               return getLatestResourceByToscaResourceName(toscaResourceName, VertexTypeEnum.TOPOLOGY_TEMPLATE, JsonParseFlagEnum.ParseMetadata);
+       else
+               return getLatestResourceByToscaResourceName(toscaResourceName, VertexTypeEnum.NODE_TYPE, JsonParseFlagEnum.ParseMetadata);
+    }
+
+    public Either<Resource, StorageOperationStatus> getLatestResourceByToscaResourceName(String toscaResourceName, VertexTypeEnum vertexType, JsonParseFlagEnum parseFlag) {
+
+        Either<Resource, StorageOperationStatus> result = null;
+        Map<GraphPropertyEnum, Object> props = new EnumMap<>(GraphPropertyEnum.class);
+        props.put(GraphPropertyEnum.TOSCA_RESOURCE_NAME, toscaResourceName);
+        props.put(GraphPropertyEnum.IS_HIGHEST_VERSION, true);
+        if (!toscaResourceName.contains("org.openecomp.resource.vf")) {
+            props.put(GraphPropertyEnum.STATE, LifecycleStateEnum.CERTIFIED.name());
+        }
+
+        Either<List<GraphVertex>, JanusGraphOperationStatus> getLatestRes = janusGraphDao.getByCriteria(vertexType, props, parseFlag);
+
+        if (getLatestRes.isRight()) {
+            JanusGraphOperationStatus status = getLatestRes.right().value();
+            CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to fetch {} with name {}. status={} ", vertexType, toscaResourceName, status);
+            result = Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(status));
+        }
+        if (result == null) {
+            List<GraphVertex> resources = getLatestRes.left().value();
+            double version = 0.0;
+            GraphVertex highestResource = null;
+            for (GraphVertex resource : resources) {
+                double resourceVersion = Double.parseDouble((String) resource.getJsonMetadataField(JsonPresentationFields.VERSION));
+                if (resourceVersion > version) {
+                    version = resourceVersion;
+                    highestResource = resource;
+                }
+            }
+
+            if (highestResource != null) {
+                result = getToscaFullElement(highestResource.getUniqueId());
+            } else {
+                log.debug("The vertex with the highest version could not be found for {}", toscaResourceName);
+                result = Either.right(StorageOperationStatus.GENERAL_ERROR);
+            }
+        }
+        return result;
+    }
 
     public Either<Boolean, StorageOperationStatus> validateToscaResourceNameExists(String templateName) {
         Either<Boolean, StorageOperationStatus> validateUniquenessRes = validateToscaResourceNameUniqueness(templateName);
@@ -1429,6 +1475,53 @@ public class ToscaOperationFacade {
         return Optional.empty();
     }
 
+    public StorageOperationStatus associateCapabilitiesToService(Map<String,ListCapabilityDataDefinition> capabilities, String componentId) {
+
+        Either<GraphVertex, JanusGraphOperationStatus> getVertexEither = janusGraphDao.getVertexById(componentId, JsonParseFlagEnum.NoParse);
+        if (getVertexEither.isRight()) {
+            log.debug(COULDNT_FETCH_COMPONENT_WITH_AND_UNIQUE_ID_ERROR, componentId, getVertexEither.right().value());
+            return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(getVertexEither.right().value());
+
+        }
+
+        GraphVertex vertex = getVertexEither.left().value();
+        if(MapUtils.isNotEmpty(capabilities)) {
+            Either<GraphVertex, StorageOperationStatus> associateElementToData = topologyTemplateOperation.
+                    associateElementToData(vertex, VertexTypeEnum.CAPABILITIES,
+                            EdgeLabelEnum.CAPABILITIES, capabilities);
+            if (associateElementToData.isRight()) {
+                return associateElementToData.right().value();
+            }
+        }
+
+
+        return StorageOperationStatus.OK;
+
+    }
+
+    public StorageOperationStatus associateRequirementsToService(Map<String, ListRequirementDataDefinition> requirements, String componentId) {
+
+        Either<GraphVertex, JanusGraphOperationStatus> getVertexEither = janusGraphDao.getVertexById(componentId, JsonParseFlagEnum.NoParse);
+        if (getVertexEither.isRight()) {
+            log.debug(COULDNT_FETCH_COMPONENT_WITH_AND_UNIQUE_ID_ERROR, componentId, getVertexEither.right().value());
+            return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(getVertexEither.right().value());
+
+        }
+
+        GraphVertex vertex = getVertexEither.left().value();
+        if(MapUtils.isNotEmpty(requirements)) {
+            Either<GraphVertex, StorageOperationStatus> associateElementToData = topologyTemplateOperation.
+                    associateElementToData(vertex, VertexTypeEnum.REQUIREMENTS,
+                            EdgeLabelEnum.REQUIREMENTS, requirements);
+            if (associateElementToData.isRight()) {
+                return associateElementToData.right().value();
+            }
+        }
+
+        return StorageOperationStatus.OK;
+
+    }
+       
     public StorageOperationStatus associateDeploymentArtifactsToInstances(Map<String, Map<String, ArtifactDefinition>> instDeploymentArtifacts, Component component, User user) {
 
         Either<GraphVertex, JanusGraphOperationStatus> getVertexEither = janusGraphDao.getVertexById(component.getUniqueId(), JsonParseFlagEnum.NoParse);
@@ -2886,4 +2979,9 @@ public class ToscaOperationFacade {
         topologyTemplateOperation
                 .updateCapReqPropertiesOwnerId(componentId, getTopologyTemplate(componentId));
     }
+
+    public <T extends Component> Either<T, StorageOperationStatus> getLatestByServiceName(String serviceName) {
+        return getLatestByName(GraphPropertyEnum.NAME, serviceName);
+
+    }
 }
diff --git a/catalog-model/src/test/java/org/openecomp/sdc/be/model/UploadServiceInfoTest.java b/catalog-model/src/test/java/org/openecomp/sdc/be/model/UploadServiceInfoTest.java
new file mode 100644 (file)
index 0000000..ca17663
--- /dev/null
@@ -0,0 +1,93 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdc.be.model;
+
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.openecomp.sdc.be.model.category.CategoryDefinition;
+import org.openecomp.sdc.be.model.category.SubCategoryDefinition;
+
+import java.util.LinkedList;
+import java.util.List;
+
+
+public class UploadServiceInfoTest {
+
+    private UploadServiceInfo createTestSubject() {
+        return new UploadServiceInfo();
+    }
+
+    @Test
+    public void testCtor() {
+        new UploadServiceInfo("mock", "mock", "mock", new LinkedList<>(), "mock", "mock", "mock", "mock/mock/mock",
+                "mock", "mock", "mock", "mock", "mock", "mock", "mock", new LinkedList<>(), "mock", "mock", "mock",
+                "mock", "mock", "mock", "mock", "mock", "mock");
+    }
+
+    @Test
+    public void testAddSubCategory() {
+        UploadServiceInfo testSubject;
+        String category = "";
+        String subCategory = "";
+
+        // test 1
+        testSubject = createTestSubject();
+        category = null;
+        subCategory = null;
+        testSubject.addSubCategory(category, subCategory);
+        List<CategoryDefinition> categories = testSubject.getCategories();
+        Assert.assertNull(categories);
+
+        // test 2
+        testSubject = createTestSubject();
+        category = "";
+        subCategory = null;
+        testSubject.addSubCategory(category, subCategory);
+        List<CategoryDefinition> categories2 = testSubject.getCategories();
+        for (CategoryDefinition categoryDefinition : categories2) {
+            Assert.assertEquals("", categoryDefinition.getName());
+        }
+
+        // test 3
+        testSubject = createTestSubject();
+        subCategory = "";
+        category = null;
+        testSubject.addSubCategory(category, subCategory);
+        List<CategoryDefinition> categories3 = testSubject.getCategories();
+        for (CategoryDefinition categoryDefinition : categories3) {
+            List<SubCategoryDefinition> subcategories = categoryDefinition.getSubcategories();
+            for (SubCategoryDefinition subcategory : subcategories) {
+                Assert.assertEquals("", subcategory.getName());
+            }
+        }
+
+        // test 4
+        testSubject = createTestSubject();
+        subCategory = "mock";
+        category = "mock";
+        testSubject.addSubCategory(category, subCategory);
+        List<CategoryDefinition> categories4 = testSubject.getCategories();
+        for (CategoryDefinition categoryDefinition : categories4) {
+            Assert.assertEquals("mock", categoryDefinition.getName());
+        }
+    }
+}
\ No newline at end of file
index 0aaae48..971f4f7 100644 (file)
@@ -30,6 +30,7 @@
 package org.openecomp.sdc.be.model.jsonjanusgraph.operations;
 
 import fj.data.Either;
+import org.apache.commons.collections.map.HashedMap;
 import org.apache.commons.lang3.tuple.ImmutablePair;
 import org.junit.Before;
 import org.junit.Test;
@@ -47,6 +48,8 @@ import org.openecomp.sdc.be.dao.jsongraph.HealingJanusGraphDao;
 import org.openecomp.sdc.be.dao.jsongraph.types.EdgeLabelEnum;
 import org.openecomp.sdc.be.dao.jsongraph.types.JsonParseFlagEnum;
 import org.openecomp.sdc.be.dao.jsongraph.types.VertexTypeEnum;
+import org.openecomp.sdc.be.datatypes.elements.ListCapabilityDataDefinition;
+import org.openecomp.sdc.be.datatypes.elements.ListRequirementDataDefinition;
 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
 import org.openecomp.sdc.be.datatypes.enums.GraphPropertyEnum;
 import org.openecomp.sdc.be.datatypes.enums.JsonPresentationFields;
@@ -437,6 +440,37 @@ public class ToscaOperationFacadeTest {
         assertTrue(result.isLeft());
     }
 
+
+    @Test
+    public void testGetLatestResourceByToscaResourceName() {
+        Either<Resource, StorageOperationStatus> result;
+        String toscaResourceName = "org.openecomp.resource.vf";
+        ToscaElement toscaElement = getToscaElementForTest();
+
+        Map<GraphPropertyEnum, Object> propertiesToMatch = new EnumMap<>(GraphPropertyEnum.class);
+        propertiesToMatch.put(GraphPropertyEnum.TOSCA_RESOURCE_NAME, toscaResourceName);
+        propertiesToMatch.put(GraphPropertyEnum.IS_HIGHEST_VERSION, true);
+        if (!toscaResourceName.contains("org.openecomp.resource.vf")) {
+            propertiesToMatch.put(GraphPropertyEnum.STATE, LifecycleStateEnum.CERTIFIED.name());
+        }
+
+        List<GraphVertex> graphVertexList = new ArrayList<>();
+        GraphVertex graphVertex = getTopologyTemplateVertex();
+        graphVertex.setUniqueId(toscaResourceName);
+        Map<JsonPresentationFields, Object> props = new HashMap<>();
+        props.put(JsonPresentationFields.VERSION, "1.0");
+        graphVertex.setJsonMetadataField(JsonPresentationFields.VERSION,  props.get(JsonPresentationFields.VERSION));
+        graphVertexList.add(graphVertex);
+
+        when(janusGraphDaoMock.getByCriteria(VertexTypeEnum.TOPOLOGY_TEMPLATE, propertiesToMatch, JsonParseFlagEnum.ParseMetadata)).thenReturn(Either.left(graphVertexList));
+        when(topologyTemplateOperationMock.getToscaElement(any(GraphVertex.class), any(ComponentParametersView.class))).thenReturn(Either.left(toscaElement));
+
+        when(janusGraphDaoMock.getVertexById(toscaResourceName, JsonParseFlagEnum.ParseAll)).thenReturn(Either.left(graphVertex));
+
+        result = testInstance.getLatestResourceByToscaResourceName(toscaResourceName);
+        assertTrue(result.isLeft());
+    }
+
     @Test
     public void testGetFollowed() {
         Either<Set<Component>, StorageOperationStatus> result;
@@ -732,6 +766,72 @@ public class ToscaOperationFacadeTest {
 
     }
 
+    @Test
+    public void associateCapabilitiesToServiceFailureTest(){
+        StorageOperationStatus result = associateCapabilitiesToServiceWithStatus(StorageOperationStatus.BAD_REQUEST);
+        assertTrue(result == StorageOperationStatus.BAD_REQUEST);
+    }
+
+    @Test
+    public void associateCapabilitiesToServiceSuccessTest(){
+        StorageOperationStatus result = associateCapabilitiesToServiceWithStatus(StorageOperationStatus.OK);
+        assertTrue(result == StorageOperationStatus.OK);
+    }
+
+    private StorageOperationStatus associateCapabilitiesToServiceWithStatus(StorageOperationStatus status) {
+        Map<String, ListCapabilityDataDefinition> capabilitiesMap = new HashedMap();
+        String componentId = "componentid";
+
+        ListCapabilityDataDefinition listCapabilityDataDefinition1 = new ListCapabilityDataDefinition();
+        capabilitiesMap.put("capabilities1", listCapabilityDataDefinition1);
+
+        GraphVertex vertex;
+        if(status == StorageOperationStatus.OK){
+            vertex = getTopologyTemplateVertex();
+        } else {
+            vertex = getNodeTypeVertex();
+        }
+
+        Either<GraphVertex, JanusGraphOperationStatus> getVertexEither = Either.left(vertex);
+        when(janusGraphDaoMock.getVertexById(componentId, JsonParseFlagEnum.NoParse)).thenReturn(getVertexEither);
+        when(topologyTemplateOperationMock.associateElementToData(eq(vertex),
+            eq(VertexTypeEnum.CAPABILITIES), eq(EdgeLabelEnum.CAPABILITIES), anyMap())).thenReturn(Either.right(status));
+        return testInstance.associateCapabilitiesToService(capabilitiesMap, componentId);
+    }
+
+    @Test
+    public void associateRequirementsToServiceFailureTest(){
+        StorageOperationStatus result = associateRequirementsToServiceWithStatus(StorageOperationStatus.BAD_REQUEST);
+        assertTrue(result == StorageOperationStatus.BAD_REQUEST);
+    }
+
+    @Test
+    public void associateRequirementsToServiceSuccessTest(){
+        StorageOperationStatus result = associateRequirementsToServiceWithStatus(StorageOperationStatus.OK);
+        assertTrue(result == StorageOperationStatus.OK);
+    }
+
+    private StorageOperationStatus associateRequirementsToServiceWithStatus(StorageOperationStatus status) {
+        Map<String, ListRequirementDataDefinition> requirementsMap = new HashedMap();
+        String componentId = "componentid";
+
+        ListRequirementDataDefinition listRequirementDataDefinition1 = new ListRequirementDataDefinition();
+        requirementsMap.put("requirements1", listRequirementDataDefinition1);
+
+        GraphVertex vertex;
+        if(status == StorageOperationStatus.OK){
+            vertex = getTopologyTemplateVertex();
+        } else {
+            vertex = getNodeTypeVertex();
+        }
+
+        Either<GraphVertex, JanusGraphOperationStatus> getVertexEither = Either.left(vertex);
+        when(janusGraphDaoMock.getVertexById(componentId, JsonParseFlagEnum.NoParse)).thenReturn(getVertexEither);
+        when(topologyTemplateOperationMock.associateElementToData(eq(vertex),
+            eq(VertexTypeEnum.REQUIREMENTS), eq(EdgeLabelEnum.REQUIREMENTS), anyMap())).thenReturn(Either.right(status));
+        return testInstance.associateRequirementsToService(requirementsMap, componentId);
+    }
+
     private Either<PolicyDefinition, StorageOperationStatus> associatePolicyToComponentWithStatus(StorageOperationStatus status) {
         PolicyDefinition policy = new PolicyDefinition();
         String componentId = "componentId";
index b76d29c..a0706b4 100644 (file)
@@ -233,6 +233,11 @@ export abstract class Component implements IComponent {
         this.handleTags();
         return this.componentService.createComponent(this);
     };
+    
+    public importComponentOnServer = (): ng.IPromise<Component> => {
+        this.handleTags();
+        return this.componentService.importComponent(this);
+    };
 
     public updateComponent = ():ng.IPromise<Component> => {
         this.handleTags();
@@ -243,8 +248,12 @@ export abstract class Component implements IComponent {
         return this.componentService.validateName(newName, subtype);
     };
 
-    public downloadArtifact = (artifactId:string):ng.IPromise<IFileDownload> => {
-        return this.componentService.downloadArtifact(this.uniqueId, artifactId);
+    public downloadArtifact = (artifactId: string): ng.IPromise<IFileDownload> => {
+        if(this.vendorName === 'IsService'){
+            return this.componentService.downloadArtifact(this.uniqueId, artifactId, this.vendorName);
+        }else{
+            return this.componentService.downloadArtifact(this.uniqueId, artifactId);
+        }
     };
 
     public addOrUpdateArtifact = (artifact:ArtifactModel):ng.IPromise<ArtifactModel> => {
index 911a432..d11a06a 100644 (file)
@@ -27,6 +27,7 @@ import {IServiceService} from "../../services/components/service-service";
 import {Component, PropertyModel, DisplayModule, InputsAndProperties, InputModel, InstancesInputsOrPropertiesMapData, InstancesInputsPropertiesMap,
     Distribution, DistributionComponent, ArtifactGroupModel} from "../../models";
 import {ArtifactGroupType} from "../../utils/constants";
+import {FileUploadModel} from "../../directives/file-upload/file-upload";
 import {ComponentMetadata} from "../component-metadata";
 import {ForwardingPath} from "app/models/forwarding-path";
 
@@ -42,6 +43,15 @@ export class Service extends Component {
     public environmentContext:string;
     public instantiationType:string;
     public forwardingPaths:{ [key:string]:ForwardingPath } = {};
+    public payloadData: string;
+    public payloadName: string;
+    public importedFile: FileUploadModel;
+
+    // Onboarding parameters
+    public csarUUID: string;
+    public csarVersion: string;
+    public csarPackageType: string;
+    public packageId: string;
 
     constructor(componentService:IServiceService, $q:ng.IQService, component?:Service) {
         super(componentService, $q, component);
@@ -56,15 +66,40 @@ export class Service extends Component {
             this.serviceFunction = component.serviceFunction;
             this.instantiationType = component.instantiationType;
             this.environmentContext = component.environmentContext;
+            this.payloadData = component.payloadData ? component.payloadData : undefined;
+            this.payloadName = component.payloadName ? component.payloadName : undefined;
+            this.csarUUID = component.csarUUID;
+            this.csarVersion = component.csarVersion;
             if (component.categories && component.categories[0]) {
                 this.mainCategory = component.categories[0].name;
                 this.selectedCategory = this.mainCategory;
+                this.importedFile = component.importedFile;
             }
         }
         this.componentService = componentService;
         this.iconSprite = "sprite-services-icons";
     }
 
+    public importComponentOnServer = (): ng.IPromise<Component> => {
+        let deferred = this.$q.defer<Component>();
+        let onSuccess = (component: Service): void => {
+            this.payloadData = undefined;
+            this.payloadName = undefined;
+            deferred.resolve(component);
+        };
+        let onError = (error: any): void => {
+            deferred.reject(error);
+        };
+
+        this.handleTags();
+        if (this.importedFile) {
+            this.payloadData = this.importedFile.base64;
+            this.payloadName = this.importedFile.filename;
+        }
+        this.componentService.importComponent(this).then(onSuccess, onError);
+        return deferred.promise;
+    };
+
     public getDistributionsList = ():ng.IPromise<Array<Distribution>> => {
         return this.componentService.getDistributionsList(this.uuid);
     };
index 1c8c2b4..3bdf54e 100644 (file)
                                 (fileUpload)="onImportVf($event)"
                                 [convertToBase64]="true"
                             ></sdc-button-file-opener>
+                            <sdc-button-file-opener
+                                *ngIf="roles[user.role].dashboard.showCreateNew"
+                                size="medium"
+                                type="secondary"
+                                text="Import Service Csar"
+                                testId="importServicebutton"
+                                [extensions]="sdcConfig.csarFileExtension"
+                                (fileUpload)="onImportService($event)"
+                                [convertToBase64]="true"
+                            ></sdc-button-file-opener>
                         </div>
                     </div>
                 </div>
index 1b69eba..77fd3b5 100644 (file)
@@ -138,6 +138,24 @@ export class HomeComponent implements OnInit {
         }
     }
 
+    public onImportService(file: any): void {
+        if (file && file.filename) {
+            // Check that the file has valid extension.
+            const fileExtension: string = file.filename.split(".").pop();
+            if (this.sdcConfig.csarFileExtension.indexOf(fileExtension.toLowerCase()) !== -1) {
+                this.$state.go('workspace.general', {
+                    type: ComponentType.SERVICE.toLowerCase(),
+                    importedFile: file,
+                    serviceType: 'Service'
+                });
+            } else {
+                const title: string = this.translateService.translate('NEW_SERVICE_RESOURCE_ERROR_VALID_CSAR_EXTENSIONS_TITLE');
+                const message: string = this.translateService.translate('NEW_SERVICE_RESOURCE_ERROR_VALID_CSAR_EXTENSIONS', {extensions: this.sdcConfig.csarFileExtension});
+                this.modalService.openWarningModal(title, message, 'error-invalid-csar-ext');
+            }
+        }
+    };
+
     public openCreateModal(componentType: string, importedFile: any): void {
         if (importedFile) {
             this.initEntities(true); // Return from import
index c7ab975..bece12d 100644 (file)
@@ -32,6 +32,8 @@ export interface IComponentService {
     changeLifecycleState(component:Component, state:string, userRemarks:any):ng.IPromise<ComponentMetadata> ;
     validateName(newName:string, subtype?:string):ng.IPromise<IValidate>;
     createComponent(component:Component):ng.IPromise<Component>;
+    //importComponent
+    importComponent(component: Component): ng.IPromise<Component>;
     addOrUpdateArtifact(componentId:string, artifact:ArtifactModel):ng.IPromise<ArtifactModel>;
     deleteArtifact(componentId:string, artifact:string, artifactLabel):ng.IPromise<ArtifactModel>;
     addProperty(componentId:string, property:PropertyModel):ng.IPromise<PropertyModel>;
@@ -48,7 +50,7 @@ export interface IComponentService {
     createComponentInstance(componentId:string, componentInstance:ComponentInstance):ng.IPromise<ComponentInstance>;
     updateComponentInstance(componentId:string, componentInstance:ComponentInstance):ng.IPromise<ComponentInstance>;
     updateMultipleComponentInstances(componentId:string, instances:Array<ComponentInstance>):ng.IPromise< Array<ComponentInstance>>;
-    downloadArtifact(componentId:string, artifactId:string):ng.IPromise<IFileDownload>;
+    downloadArtifact(componentId: string, artifactId: string, vendorName?: string): ng.IPromise<IFileDownload>;
     uploadInstanceEnvFile(componentId:string, instanceId:string, artifact:ArtifactModel):ng.IPromise<ArtifactModel>;
     downloadInstanceArtifact(componentId:string, instanceId:string, artifactId:string):ng.IPromise<IFileDownload>;
     deleteComponentInstance(componentId:string, componentInstanceId:string):ng.IPromise<ComponentInstance>;
@@ -206,6 +208,20 @@ export class ComponentService implements IComponentService {
         });
         return deferred.promise;
     };
+    
+    public importComponent = (component: Component): ng.IPromise<Component> => {
+        component.vendorName = "xfr";
+        component.vendorRelease = "xfr";
+        let deferred = this.$q.defer<Component>();
+        let headerObj = this.getHeaderMd5(component);
+        this.restangular.customPOST(JSON.stringify(component), 'importService', {}, headerObj).then((response: Component) => {
+            let component: Component = this.createComponentObject(response);
+            deferred.resolve(component);
+        }, (err) => {
+            deferred.reject(err);
+        });
+        return deferred.promise;
+    };
 
     public validateName = (newName:string, subtype?:string):ng.IPromise<IValidate> => {
         let deferred = this.$q.defer<IValidate>();
@@ -244,13 +260,21 @@ export class ComponentService implements IComponentService {
         return deferred.promise;
     };
 
-    public downloadArtifact = (componentId:string, artifactId:string):ng.IPromise<IFileDownload> => {
+    public downloadArtifact = (componentId: string, artifactId: string, vendorName?: string): ng.IPromise<IFileDownload> => {
         let deferred = this.$q.defer<IFileDownload>();
-        this.restangular.one(componentId).one("artifacts").one(artifactId).get().then((response:any) => {
-            deferred.resolve(response.plain());
-        }, (err)=> {
-            deferred.reject(err);
-        });
+        if(vendorName === 'IsService'){
+            this.restangular.one('importService').one(componentId).one("artifacts").one(artifactId).get().then((response: any) => {
+                deferred.resolve(response.plain());
+            }, (err) => {
+                deferred.reject(err);
+            });
+        }else{
+            this.restangular.one(componentId).one("artifacts").one(artifactId).get().then((response: any) => {
+                deferred.resolve(response.plain());
+            }, (err) => {
+                deferred.reject(err);
+            });
+        }
         return deferred.promise;
     };
 
index 5fda9c8..fd82c27 100644 (file)
@@ -185,6 +185,12 @@ export class ComponentFactory {
 
     };
 
+    public importComponentOnServer = (componentObject: Component): ng.IPromise<Component> => {
+        let component: Component = this.createComponent(componentObject);
+        return component.importComponentOnServer();
+
+    };
+    
     public getComponentWithMetadataFromServer = (componentType:string, componentId:string):ng.IPromise<Component> => {
         let deferred = this.$q.defer<Component>();
         let component = this.createEmptyComponent(componentType);
index 87937dd..e10dc98 100644 (file)
@@ -219,7 +219,7 @@ export class GeneralViewModel {
 
         this.$scope.importCsarProgressKey = "importCsarProgressKey";
 
-        this.$scope.browseFileLabel = this.$scope.component.isResource() && (<Resource>this.$scope.component).resourceType === ResourceType.VF ? 'Upload File:' : 'Upload VFC:';
+        this.$scope.browseFileLabel = (this.$scope.component.isResource() && ((<Resource>this.$scope.component).resourceType === ResourceType.VF || (<Resource>this.$scope.component).resourceType === 'SRVC')) ||  this.$scope.component.isService() ? 'Upload File:' : 'Upload VFC:';
         this.$scope.progressService = this.progressService;
         this.$scope.componentCategories = new componentCategories();
         this.$scope.componentCategories.selectedCategory = this.$scope.component.selectedCategory;
@@ -245,6 +245,15 @@ export class GeneralViewModel {
                 this.$scope.isShowFileBrowse = true;
             }
         } else if(this.$scope.component.isService()){
+            let service: Service = <Service>this.$scope.component;
+            console.log(service.name + ": " + service.csarUUID);
+            if (service.importedFile) { // Component has imported file.
+                this.$scope.isShowFileBrowse = true;
+                (<Service>this.$scope.component).serviceType = 'Service';
+            }
+            if (this.$scope.isEditMode() && service.serviceType == 'Service' && !service.csarUUID) {
+                this.$scope.isShowFileBrowse = true;
+            }
             // Init Instantiation types
             this.$scope.initInstantiationTypes();
         }
@@ -497,7 +506,11 @@ export class GeneralViewModel {
 
                 return;
             }
-            const subtype:string = ComponentType.RESOURCE == this.$scope.componentType ? this.$scope.component.getComponentSubType() : undefined;
+           
+            let subtype:string = ComponentType.RESOURCE == this.$scope.componentType ? this.$scope.component.getComponentSubType() : undefined;
+            if (subtype == "SRVC") {
+                subtype = "VF"
+            }
 
             const onFailed = (response) => {
                 // console.info('onFaild', response);
index 1166728..e132d53 100644 (file)
@@ -27,6 +27,7 @@ import {
     IUserProperties,
     IAppMenu,
     Resource,
+    Service, 
     Component,
     Plugin,
     PluginsConfiguration,
@@ -431,8 +432,14 @@ export class WorkspaceViewModel {
                     components: this.components
                 }, {inherit: false});
             };
+           
+            console.log(this.$scope.component, "this.$scope.component")
+            if ((<Service>this.$scope.component).serviceType == "Service") {
+                this.ComponentFactory.importComponentOnServer(this.$scope.component).then(onSuccessCreate, onFailed);
+            } else {
+                this.ComponentFactory.createComponentOnServer(this.$scope.component).then(onSuccessCreate, onFailed);
+            }
 
-            this.ComponentFactory.createComponentOnServer(this.$scope.component).then(onSuccessCreate, onFailed);
 
 
         };
index 91f158a..766825c 100644 (file)
@@ -20,6 +20,7 @@
 
 package org.openecomp.sdc.common.api;
 
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashSet;
 import java.util.List;
@@ -182,4 +183,20 @@ public enum ArtifactTypeEnum {
         return new HashSet<>(artifactTypeEnums);
     }
 
+    public static String findType(final String type) {
+        for (final ArtifactTypeEnum ate : ArtifactTypeEnum.values()) {
+            if (ate.getType().equalsIgnoreCase(type)) {
+                return type;
+            }
+        }
+        return null;
+    }
+
+    public static List<String> getAllTypes() {
+        final List<String> types = new ArrayList<>();
+        for (final ArtifactTypeEnum ate : ArtifactTypeEnum.values()) {
+            types.add(ate.getType());
+        }
+        return types;
+    }
 }
index d11cc02..340b198 100644 (file)
@@ -88,6 +88,7 @@ public final class Constants {
        public static final String TOSCA_META_PATH = "TOSCA-Metadata/TOSCA.meta";
        public static final String TOSCA_META_ENTRY_DEFINITIONS = "Entry-Definitions";
        public static final String USER_DEFINED_RESOURCE_NAMESPACE_PREFIX = "org.openecomp.resource.";
+       public static final String USER_DEFINED_SERVICE_NAMESPACE_PREFIX = "org.openecomp.service.";
 
        public static final String IS_BASE = "isBase";
        public static final String HEAT_FILE_PROPS = "heat_file";
index cf35f5d..b8cc269 100644 (file)
@@ -23,6 +23,8 @@ package org.openecomp.sdc.be.datatypes.components;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import org.openecomp.sdc.be.datatypes.enums.JsonPresentationFieldsExtractor;
+import org.openecomp.sdc.be.datatypes.enums.ResourceTypeEnum;
+
 
 @Data
 @NoArgsConstructor
@@ -53,11 +55,19 @@ public class ServiceMetadataDataDefinition extends ComponentMetadataDataDefiniti
 
     private String environmentContext;
 
+    private String serviceVendorModelNumber;
+    public Boolean isAbstract;
+    private ResourceTypeEnum importServiceType = ResourceTypeEnum.SERVICE;
+    private String toscaServiceName;
+    private String vendorName;
+    private String vendorRelease;
 
     public ServiceMetadataDataDefinition(ServiceMetadataDataDefinition other) {
         super(other);
         serviceType = other.getServiceType();
         serviceRole = other.getServiceRole();
+        this.importServiceType = other.getImportServiceType();
+        this.toscaServiceName = other.getToscaServiceName();
         serviceFunction = other.getServiceFunction();
     }
 
index 4201b79..2af43dc 100644 (file)
@@ -35,7 +35,8 @@ public enum ResourceTypeEnum {
     Configuration("Configuration", true),
     ServiceProxy("ServiceProxy", true),
     //Generic VFC/VF/PNF/Service Type
-    ABSTRACT("Abstract", true);
+    ABSTRACT("Abstract", true),
+       SERVICE("Service"/*(Network Service)"*/,false);
 
     private final String value;
     private final boolean isAtomicType;