Bug fix
[sdc.git] / catalog-be / src / main / java / org / openecomp / sdc / be / components / impl / ResourceBusinessLogic.java
index 8fd28e1..1ab7ffb 100644 (file)
@@ -82,12 +82,12 @@ 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.CsarInfo;
 import org.openecomp.sdc.be.model.DataTypeDefinition;
 import org.openecomp.sdc.be.model.GroupDefinition;
 import org.openecomp.sdc.be.model.GroupProperty;
 import org.openecomp.sdc.be.model.GroupTypeDefinition;
 import org.openecomp.sdc.be.model.HeatParameterDefinition;
-import org.openecomp.sdc.be.model.CsarInfo;
 import org.openecomp.sdc.be.model.InputDefinition;
 import org.openecomp.sdc.be.model.InterfaceDefinition;
 import org.openecomp.sdc.be.model.LifeCycleTransitionEnum;
@@ -111,6 +111,7 @@ import org.openecomp.sdc.be.model.cache.ApplicationDataTypeCache;
 import org.openecomp.sdc.be.model.category.CategoryDefinition;
 import org.openecomp.sdc.be.model.category.SubCategoryDefinition;
 import org.openecomp.sdc.be.model.heat.HeatParameterType;
+import org.openecomp.sdc.be.model.jsontitan.utils.ModelConverter;
 import org.openecomp.sdc.be.model.operations.api.ICacheMangerOperation;
 import org.openecomp.sdc.be.model.operations.api.ICapabilityTypeOperation;
 import org.openecomp.sdc.be.model.operations.api.IElementOperation;
@@ -148,13 +149,13 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.context.WebApplicationContext;
 import org.yaml.snakeyaml.DumperOptions;
 import org.yaml.snakeyaml.Yaml;
+import org.yaml.snakeyaml.parser.ParserException;
 
 import com.google.gson.Gson;
 import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
 
 import fj.data.Either;
-import org.yaml.snakeyaml.parser.ParserException;
 
 @org.springframework.stereotype.Component("resourceBusinessLogic")
 public class ResourceBusinessLogic extends ComponentBusinessLogic {
@@ -595,6 +596,14 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
 
                                log.trace("YAML topology file found in CSAR, file name: {}, contents: {}", yamlFileName, yamlFileContent);
 
+                               Either<Resource, ResponseFormat> genericResourceEither = handleResourceGenericType(preparedResource);
+                               if (genericResourceEither.isRight()) {
+                                       log.debug("failed to get resource generic type. status is {}", genericResourceEither.right().value());
+                                       ResponseFormat responseFormat = genericResourceEither.right().value();
+                                       componentsUtils.auditResource(genericResourceEither.right().value(), csarInfo.getModifier(), preparedResource, "", "", updateResource, null);
+                                       return Either.right(responseFormat);
+                               }
+
                                parseNodeTypeInfoYamlEither = this.handleNodeTypes(yamlFileName, preparedResource, yamlFileContent, shouldLock, nodeTypesArtifactsToHandle, createdArtifacts, nodeTypesInfo, csarInfo, nodeName);
                                if (parseNodeTypeInfoYamlEither.isRight()) {
                                        ResponseFormat responseFormat = parseNodeTypeInfoYamlEither.right().value();
@@ -624,7 +633,7 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
                                }
                                preparedResource = createResourcesInstancesEither.left().value();
                                
-                               createResourcesInstancesEither = createResourceInstancesRelations(csarInfo.getModifier(), yamlFileName, preparedResource, instances, inTransaction, shouldLock);
+                               createResourcesInstancesEither = createResourceInstancesRelations(csarInfo.getModifier(), yamlFileName, preparedResource, instances);
                                if (createResourcesInstancesEither.isRight()) {
                                        log.debug("failed to create relation between resource instances status is {}", createResourcesInstancesEither.right().value());
                                        result = Either.right(createResourcesInstancesEither.right().value());
@@ -687,6 +696,17 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
                        return result;
 
        }
+       private Either<Resource, ResponseFormat> handleResourceGenericType(Resource resource) {
+               Either<Resource, ResponseFormat> genericResourceEither = fetchAndSetDerivedFromGenericType(resource);
+               if (genericResourceEither.isRight()) {
+                       return genericResourceEither;
+               }
+               if (resource.shouldGenerateInputs()) {
+                       generateInputsFromGenericTypeProperties(resource, genericResourceEither.left().value());
+               }
+               return genericResourceEither;
+       }
+
        private Either<Map<String, EnumMap<ArtifactOperationEnum, List<ArtifactDefinition>>>, ResponseFormat> findNodeTypesArtifactsToHandle(Map<String, NodeTypeInfo> nodeTypesInfo, CsarInfo csarInfo, Resource oldResource) {
 
                Map<String, List<ArtifactDefinition>> extractedVfcsArtifacts = CsarUtils.extractVfcsArtifactsFromCsar(csarInfo.getCsar());
@@ -779,7 +799,7 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
                                                                if (!foundArtifact.getArtifactChecksum().equals(currNewArtifact.getArtifactChecksum())) {
                                                                        foundArtifact.setPayload(currNewArtifact.getPayloadData());
                                                                        foundArtifact.setPayloadData(Base64.encodeBase64String(currNewArtifact.getPayloadData()));
-                                                                       foundArtifact.setArtifactChecksum(GeneralUtility.calculateMD5ByByteArray(currNewArtifact.getPayloadData()));
+                                                                       foundArtifact.setArtifactChecksum(GeneralUtility.calculateMD5Base64EncodedByByteArray(currNewArtifact.getPayloadData()));
                                                                        artifactsToUpdate.add(foundArtifact);
                                                                }
                                                                existingArtifacts.remove(foundArtifact.getArtifactLabel());
@@ -888,7 +908,7 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
                                                handleNodeTypeArtifactsRes = Either.right(handleNodeTypeArtifactsRequestRes.right().value());
                                                break;
                                        }
-                                       if (curOperation == ArtifactOperationEnum.Create) {
+                                       if (ArtifactOperationEnum.isCreateOrLink(curOperation)) {
                                                createdArtifacts.addAll(handleNodeTypeArtifactsRequestRes.left().value());
                                        }
                                        handledNodeTypeArtifacts.addAll(handleNodeTypeArtifactsRequestRes.left().value());
@@ -917,6 +937,9 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
                                vfcToscaNames.put(nodeType.getKey(), toscaResourceName);
                        }
                }
+               for(NodeTypeInfo cvfc : nodeTypesInfo.values()){
+                       vfcToscaNames.put(cvfc.getType(), buildNestedToscaResourceName(ResourceTypeEnum.CVFC.name(), vfResourceName, cvfc.getType()));
+               }
                return vfcToscaNames;
        }
 
@@ -1107,7 +1130,7 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
                        return Either.right(validateRes.right().value());
                }
                // VF / PNF "derivedFrom" should be null (or ignored)
-               if (ToscaUtils.isAtomicType(resource)) {
+               if (ModelConverter.isAtomicComponent(resource)) {
                        Either<Boolean, ResponseFormat> validateDerivedFromNotEmpty = validateDerivedFromNotEmpty(user, resource, AuditingActionEnum.CREATE_RESOURCE);
                        if (validateDerivedFromNotEmpty.isRight()) {
                                return Either.right(validateDerivedFromNotEmpty.right().value());
@@ -1233,7 +1256,7 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
                }
                if(result == null){
                        newComplexVfc = buildCvfcRes.left().value();
-                       Either<Resource, StorageOperationStatus> oldComplexVfcRes = toscaOperationFacade.getLatestByToscaResourceName(newComplexVfc.getToscaResourceName());
+                       Either<Resource, StorageOperationStatus> oldComplexVfcRes = toscaOperationFacade.getFullLatestComponentByToscaResourceName(newComplexVfc.getToscaResourceName());
                        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());
                                result = Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
@@ -1461,7 +1484,8 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
                String nameWithouNamespacePrefix = nodeName.substring(Constants.USER_DEFINED_RESOURCE_NAMESPACE_PREFIX.length());
                String[] findTypes = nameWithouNamespacePrefix.split("\\.");
                String resourceType = findTypes[0];
-               return resourceVfName + "-" + nameWithouNamespacePrefix.substring(resourceType.length() + 1);
+               String resourceName = resourceVfName + "-" + nameWithouNamespacePrefix.substring(resourceType.length() + 1);
+               return  addCvfcSuffixToResourceName(resourceName);
        }
 
        private Either<Resource, ResponseFormat> createResourceAndRIsFromYaml(String yamlName, Resource resource, ParsedToscaYamlInfo parsedToscaYamlInfo, AuditingActionEnum actionEnum, boolean isNormative,
@@ -1633,7 +1657,7 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
                        List<GroupDefinition> groupsToCreate = new ArrayList<GroupDefinition>();
                        if (groupsFromResource != null && !groupsFromResource.isEmpty()) {
                                for (GroupDefinition group : groupsAsList) {
-                                       Optional<GroupDefinition> op = groupsFromResource.stream().filter(p -> p.getName().equals(group.getName())).findAny();
+                                       Optional<GroupDefinition> op = groupsFromResource.stream().filter(p -> p.getName().equalsIgnoreCase(group.getName())).findAny();
                                        if (op.isPresent()) {
                                                GroupDefinition groupToUpdate = op.get();
                                                groupToUpdate.setMembers(group.getMembers());
@@ -1643,7 +1667,7 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
                                        }
                                }
                                for (GroupDefinition group : groupsFromResource) {
-                                       Optional<GroupDefinition> op = groupsAsList.stream().filter(p -> p.getName().equals(group.getName())).findAny();
+                                       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);
@@ -1651,7 +1675,7 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
 
                                }
                        } else
-                               groupsToCreate.addAll(groupsAsList);
+                       groupsToCreate.addAll(groupsAsList);
                        Either<List<GroupDefinition>, ResponseFormat> prepareGroups = null;
                        if (!groupsToCreate.isEmpty()) {
 
@@ -1886,7 +1910,7 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
                }
                resource = createResourcesInstancesEither.left().value();
                log.debug("************* Going to create all relations {}", yamlName);
-               createResourcesInstancesEither = createResourceInstancesRelations(csarInfo.getModifier(), yamlName, resource, uploadComponentInstanceInfoMap, true, false);
+               createResourcesInstancesEither = createResourceInstancesRelations(csarInfo.getModifier(), yamlName, resource, uploadComponentInstanceInfoMap);
 
                log.debug("************* Finished to create all relations {}", yamlName);
 
@@ -1988,6 +2012,14 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
                        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()) {
@@ -1995,7 +2027,7 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
                                String artifactsFileName = artifacsMetaCsarStatus.left().value().getKey();
                                String artifactsContents = artifacsMetaCsarStatus.left().value().getValue();
                                Either<Resource, ResponseFormat> createArtifactsFromCsar = Either.left(resource);
-                               if (artifactOperation.getArtifactOperationEnum() == ArtifactOperationEnum.Create)
+                               if (ArtifactOperationEnum.isCreateOrLink(artifactOperation.getArtifactOperationEnum()))
                                        createArtifactsFromCsar = createResourceArtifactsFromCsar(csarInfo, resource, artifactsContents, artifactsFileName, createdArtifacts, shouldLock, inTransaction);
                                else
                                        createArtifactsFromCsar = updateResourceArtifactsFromCsar(csarInfo, resource, artifactsContents, artifactsFileName, createdArtifacts, shouldLock, inTransaction);
@@ -2075,7 +2107,7 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
        }
 
        private void addNonMetaCreatedArtifactsToSupportRollback(ArtifactOperationInfo operation, List<ArtifactDefinition> createdArtifacts, Either<Either<ArtifactDefinition, Operation>, ResponseFormat> eitherNonMetaArtifacts) {
-               if (operation.getArtifactOperationEnum() == ArtifactOperationEnum.Create && createdArtifacts != null && eitherNonMetaArtifacts.isLeft()) {
+               if (ArtifactOperationEnum.isCreateOrLink(operation.getArtifactOperationEnum()) && createdArtifacts != null && eitherNonMetaArtifacts.isLeft()) {
                        Either<ArtifactDefinition, Operation> eitherResult = eitherNonMetaArtifacts.left().value();
                        if (eitherResult.isLeft()) {
                                createdArtifacts.add(eitherResult.left().value());
@@ -2087,7 +2119,7 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
 
                String jsonStr = gson.toJson(json);
 
-               String origMd5 = GeneralUtility.calculateMD5ByString(jsonStr);
+               String origMd5 = GeneralUtility.calculateMD5Base64EncodedByString(jsonStr);
                ArtifactDefinition artifactDefinitionFromJson = RepresentationUtils.convertJsonToArtifactDefinition(jsonStr, ArtifactDefinition.class);
                String artifactUniqueId = artifactDefinitionFromJson == null ? null : artifactDefinitionFromJson.getUniqueId();
                Either<Either<ArtifactDefinition, Operation>, ResponseFormat> uploadArtifactToService = artifactsBusinessLogic.validateAndHandleArtifact(resource.getUniqueId(), ComponentTypeEnum.RESOURCE, operation, artifactUniqueId,
@@ -2141,16 +2173,27 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
                Map<ArtifactTemplateInfo, Set<ArtifactTemplateInfo>> parsedGroup = new HashMap<ArtifactTemplateInfo, Set<ArtifactTemplateInfo>>();
 
                for (List<ArtifactTemplateInfo> parsedGroupTemplateList : parsedArifactsCollection) {
+                       
                        for (ArtifactTemplateInfo parsedGroupTemplate : parsedGroupTemplateList) {
-                               parsedGroupTemplate.setGroupName("");
-                               Set<ArtifactTemplateInfo> parsedArtifactsNames = new HashSet<ArtifactTemplateInfo>();
-                               parsedArtifactsNames.add(parsedGroupTemplate);
-                               List<ArtifactTemplateInfo> relatedGroupTemplateList = parsedGroupTemplate.getRelatedArtifactsInfo();
-                               if (relatedGroupTemplateList != null && !relatedGroupTemplateList.isEmpty()) {
-                                       createArtifactsGroupSet(parsedGroupTemplateList, parsedArtifactsNames);
+                               if(parsedGroupTemplate.getGroupName() != null){
+                                       parsedGroupTemplate.setGroupName("");
+                                       Set<ArtifactTemplateInfo> parsedArtifactsNames = new HashSet<ArtifactTemplateInfo>();
+                                       parsedArtifactsNames.add(parsedGroupTemplate);
+                                       List<ArtifactTemplateInfo> relatedGroupTemplateList = parsedGroupTemplate.getRelatedArtifactsInfo();
+                                       if (relatedGroupTemplateList != null && !relatedGroupTemplateList.isEmpty()) {
+                                               createArtifactsGroupSet(parsedGroupTemplateList, parsedArtifactsNames);
+                                       }
+                                       parsedGroup.put(parsedGroupTemplate, parsedArtifactsNames);
+                               }else{
+                                       List<ArtifactTemplateInfo> arrtifacts = new ArrayList<ArtifactTemplateInfo>();
+                                       arrtifacts.add(parsedGroupTemplate);
+                                       Either<Resource, ResponseFormat> resStatus = createGroupDeploymentArtifactsFromCsar(csarInfo, resource, arrtifacts, createdNewArtifacts, createdDeplymentArtifactsAfterDelete, labelCounter, shouldLock, inTransaction);
+                                       if (resStatus.isRight())
+                                               return resStatus;
+                               
                                }
-                               parsedGroup.put(parsedGroupTemplate, parsedArtifactsNames);
                        }
+                       
                }
 
                ///////////////////////////////// find artifacts to
@@ -2416,7 +2459,7 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
                                for (ArtifactDefinition createdArtifact : createdDeplymentArtifactsAfterDelete) {
                                        if (artifactTemplate.getFileName().equalsIgnoreCase(createdArtifact.getArtifactName())) {
                                                arifactsUids.add(createdArtifact.getUniqueId());
-                                               arifactsUuids.add(createdArtifact.getUniqueId());
+                                               arifactsUuids.add(createdArtifact.getArtifactUUID());
                                                isCreate = false;
                                                String heatEnvId = checkAndGetHeatEnvId(createdArtifact);
                                                if (!heatEnvId.isEmpty()) {
@@ -2436,7 +2479,7 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
                                        for (ArtifactDefinition createdNewArtifact : createdNewArtifacts) {
                                                if (artifactTemplate.getFileName().equalsIgnoreCase(createdNewArtifact.getArtifactName())) {
                                                        arifactsUids.add(createdNewArtifact.getUniqueId());
-                                                       arifactsUuids.add(createdNewArtifact.getUniqueId());
+                                                       arifactsUuids.add(createdNewArtifact.getArtifactUUID());
                                                        isCreate = false;
                                                        String heatEnvId = checkAndGetHeatEnvId(createdNewArtifact);
                                                        if (!heatEnvId.isEmpty()) {
@@ -2455,7 +2498,7 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
                                        }
                                        ArtifactDefinition createdArtifact = createArtifactEither.left().value();
                                        arifactsUids.add(createdArtifact.getUniqueId());
-                                       arifactsUuids.add(createdArtifact.getUniqueId());
+                                       arifactsUuids.add(createdArtifact.getArtifactUUID());
                                        ArtifactTypeEnum artifactType = ArtifactTypeEnum.findType(createdArtifact.getArtifactType());
                                        if (artifactType == ArtifactTypeEnum.HEAT || artifactType == ArtifactTypeEnum.HEAT_NET || artifactType == ArtifactTypeEnum.HEAT_VOL) {
                                                Either<ArtifactDefinition, ResponseFormat> createHeatEnvPlaceHolder = artifactsBusinessLogic.createHeatEnvPlaceHolder(createdArtifact, ArtifactsBusinessLogic.HEAT_VF_ENV_NAME, resource.getUniqueId(), NodeTypeEnum.Resource,
@@ -2671,42 +2714,40 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
                        resStatus = createDeploymentArtifactsFromCsar(csarInfo, resource, artifactsGroup, artifactsUUIDGroup, groupTemplateInfo, createdNewArtifacts, artifactsFromResource, labelCounter, shouldLock, inTransaction);
                        if (resStatus.isRight())
                                return resStatus;
-
-                       Map<String, String> members = new HashMap<String, String>();
-                       associateMembersToArtifacts(createdNewArtifacts, artifactsFromResource, heatGroups, artifactsGroup, members);
-
-                       List<String> artifactsList = new ArrayList<String>(artifactsGroup);
-                       List<String> artifactsUUIDList = new ArrayList<String>(artifactsUUIDGroup);
-
-                       GroupDefinition groupDefinition = new GroupDefinition();
-                       groupDefinition.setName(groupName);
-                       groupDefinition.setType(Constants.DEFAULT_GROUP_VF_MODULE);
-                       groupDefinition.setArtifacts(artifactsList);
-                       groupDefinition.setArtifactsUuid(artifactsUUIDList);
-
-                       if (!members.isEmpty())
-                               groupDefinition.setMembers(members);
-
-                       List<GroupProperty> properties = new ArrayList<GroupProperty>();
-                       GroupProperty prop = new GroupProperty();
-                       prop.setName(Constants.IS_BASE);
-                       prop.setValue(Boolean.toString(groupTemplateInfo.isBase()));
-                       properties.add(prop);
-
-                       List<ArtifactDefinition> createdArtifacts = new ArrayList<>();
-                       createdArtifacts.addAll(createdNewArtifacts);
-                       createdArtifacts.addAll(artifactsFromResource);
-                       Either<GroupTypeDefinition, StorageOperationStatus> getLatestGroupTypeRes = groupTypeOperation.getLatestGroupTypeByType(Constants.DEFAULT_GROUP_VF_MODULE, true);
-                       if (getLatestGroupTypeRes.isRight()) {
-                               return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(getLatestGroupTypeRes.right().value())));
+                       if(groupName != null && !groupName.isEmpty()){
+                               Map<String, String> members = new HashMap<String, String>();
+                               associateMembersToArtifacts(createdNewArtifacts, artifactsFromResource, heatGroups, artifactsGroup, members);
+       
+                               List<String> artifactsList = new ArrayList<String>(artifactsGroup);
+                               List<String> artifactsUUIDList = new ArrayList<String>(artifactsUUIDGroup);
+       
+                               GroupDefinition groupDefinition = new GroupDefinition();
+                               groupDefinition.setName(groupName);
+                               groupDefinition.setType(Constants.DEFAULT_GROUP_VF_MODULE);
+                               groupDefinition.setArtifacts(artifactsList);
+                               groupDefinition.setArtifactsUuid(artifactsUUIDList);
+       
+                               if (!members.isEmpty())
+                                       groupDefinition.setMembers(members);
+       
+                               List<GroupProperty> properties = new ArrayList<GroupProperty>();
+                               GroupProperty prop = new GroupProperty();
+                               prop.setName(Constants.IS_BASE);
+                               prop.setValue(Boolean.toString(groupTemplateInfo.isBase()));
+                               properties.add(prop);
+       
+                               List<ArtifactDefinition> createdArtifacts = new ArrayList<>();
+                               createdArtifacts.addAll(createdNewArtifacts);
+                               createdArtifacts.addAll(artifactsFromResource);
+                               Either<GroupTypeDefinition, StorageOperationStatus> getLatestGroupTypeRes = groupTypeOperation.getLatestGroupTypeByType(Constants.DEFAULT_GROUP_VF_MODULE, true);
+                               if (getLatestGroupTypeRes.isRight()) {
+                                       return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(getLatestGroupTypeRes.right().value())));
+                               }
+                               properties = createVfModuleAdditionalProperties(groupTemplateInfo.isBase(), groupName, properties, createdArtifacts, artifactsList, getLatestGroupTypeRes.left().value());
+                               groupDefinition.convertFromGroupProperties(properties); 
+                               
+                               needToAdd.add(groupDefinition);
                        }
-                       properties = createVfModuleAdditionalProperties(groupTemplateInfo.isBase(), groupName, properties, createdArtifacts, artifactsList, getLatestGroupTypeRes.left().value());
-                       groupDefinition.convertFromGroupProperties(properties);
-
-                       // Either<GroupDefinition, ResponseFormat> createGroup = groupBusinessLogic.createGroup(resource.getUniqueId(), user.getUserId(), ComponentTypeEnum.RESOURCE, groupDefinition, inTransaction);
-                       // if (createGroup.isRight())
-                       // return Either.right(createGroup.right().value());
-                       needToAdd.add(groupDefinition);
                }
                ComponentParametersView componentParametersView = new ComponentParametersView();
                componentParametersView.disableAll();
@@ -2859,7 +2900,7 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
 
                        EnumMap<ArtifactOperationEnum, List<NonMetaArtifactInfo>> vfCsarArtifactsToHandle = null;
 
-                       if (artifactOperation.getArtifactOperationEnum() == ArtifactOperationEnum.Create) {
+                       if (ArtifactOperationEnum.isCreateOrLink(artifactOperation.getArtifactOperationEnum())) {
                                vfCsarArtifactsToHandle = new EnumMap<>(ArtifactOperationEnum.class);
                                vfCsarArtifactsToHandle.put(artifactOperation.getArtifactOperationEnum(), artifactPathAndNameList);
                        } else {
@@ -2990,42 +3031,36 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
                        log.debug("createDeploymentArtifactsFromCsar end");
                        if (resStatus.isRight())
                                return resStatus;
-
-                       Map<String, String> members = new HashMap<String, String>();
-                       associateMembersToArtifacts(createdArtifacts, null, heatGroups, artifactsGroup, members);
-
-                       List<String> artifactsList = new ArrayList<String>(artifactsGroup);
-                       List<String> artifactsUUIDList = new ArrayList<String>(artifactsUUIDGroup);
-
-                       GroupDefinition groupDefinition = new GroupDefinition();
-                       groupDefinition.setName(groupName);
-                       groupDefinition.setType(Constants.DEFAULT_GROUP_VF_MODULE);
-                       groupDefinition.setArtifacts(artifactsList);
-                       groupDefinition.setArtifactsUuid(artifactsUUIDList);
-
-                       if (!members.isEmpty())
-                               groupDefinition.setMembers(members);
-                       List<GroupProperty> properties = new ArrayList<GroupProperty>();
-                       GroupProperty prop = new GroupProperty();
-                       prop.setName(Constants.IS_BASE);
-                       prop.setValue(Boolean.toString(groupTemplateInfo.isBase()));
-                       properties.add(prop);
-                       Either<GroupTypeDefinition, StorageOperationStatus> getLatestGroupTypeRes = groupTypeOperation.getLatestGroupTypeByType(Constants.DEFAULT_GROUP_VF_MODULE, true);
-                       if (getLatestGroupTypeRes.isRight()) {
-                               return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(getLatestGroupTypeRes.right().value())));
+                       if(groupName != null && !groupName.isEmpty()){
+                               Map<String, String> members = new HashMap<String, String>();
+                               associateMembersToArtifacts(createdArtifacts, null, heatGroups, artifactsGroup, members);
+       
+                               List<String> artifactsList = new ArrayList<String>(artifactsGroup);
+                               List<String> artifactsUUIDList = new ArrayList<String>(artifactsUUIDGroup);
+       
+                               GroupDefinition groupDefinition = new GroupDefinition();
+                               groupDefinition.setName(groupName);
+                               groupDefinition.setType(Constants.DEFAULT_GROUP_VF_MODULE);
+                               groupDefinition.setArtifacts(artifactsList);
+                               groupDefinition.setArtifactsUuid(artifactsUUIDList);
+       
+                               if (!members.isEmpty())
+                                       groupDefinition.setMembers(members);
+                               List<GroupProperty> properties = new ArrayList<GroupProperty>();
+                               GroupProperty prop = new GroupProperty();
+                               prop.setName(Constants.IS_BASE);
+                               prop.setValue(Boolean.toString(groupTemplateInfo.isBase()));
+                               properties.add(prop);
+                               Either<GroupTypeDefinition, StorageOperationStatus> getLatestGroupTypeRes = groupTypeOperation.getLatestGroupTypeByType(Constants.DEFAULT_GROUP_VF_MODULE, true);
+                               if (getLatestGroupTypeRes.isRight()) {
+                                       return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(getLatestGroupTypeRes.right().value())));
+                               }
+                               properties = createVfModuleAdditionalProperties(groupTemplateInfo.isBase(), groupName, properties, createdArtifacts, artifactsList, getLatestGroupTypeRes.left().value());
+                               groupDefinition.convertFromGroupProperties(properties);
+                               log.debug("createGroup start");
+       
+                               needToCreate.add(groupDefinition);
                        }
-                       properties = createVfModuleAdditionalProperties(groupTemplateInfo.isBase(), groupName, properties, createdArtifacts, artifactsList, getLatestGroupTypeRes.left().value());
-                       groupDefinition.convertFromGroupProperties(properties);
-                       log.debug("createGroup start");
-
-                       // Since in these groups we handle only artifacts, then no need to
-                       // fetch component instances
-
-                       // Either<GroupDefinition, ResponseFormat> createGroup = groupBusinessLogic.createGroup(comp, user, ComponentTypeEnum.RESOURCE, groupDefinition, inTransaction);
-                       // log.debug("createGroup end");
-                       // if (createGroup.isRight())
-                       // return Either.right(createGroup.right().value());
-                       needToCreate.add(groupDefinition);
                }
 
                ComponentParametersView componentParametersView = new ComponentParametersView();
@@ -3497,7 +3532,8 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
                                        return Either.right(componentsUtils.getResponseFormat(ActionStatus.CSAR_INVALID_FORMAT, artifactFileName));
 
                                }
-                               allGroups.addAll(artifactTemplateInfoList);
+                               if(!artifactsTypeKey.equalsIgnoreCase(ArtifactTemplateInfo.CSAR_ARTIFACT))
+                                       allGroups.addAll(artifactTemplateInfoList);
                                artifactsMap.put(artifactsTypeKey, artifactTemplateInfoList);
                        }
                        int counter = groupBusinessLogic.getNextVfModuleNameCounter(resource.getGroups());
@@ -3532,7 +3568,7 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
                return Either.left(artifactTemplateInfoList);
        }
 
-       private Either<Resource, ResponseFormat> createResourceInstancesRelations(User user, String yamlName, Resource resource, Map<String, UploadComponentInstanceInfo> uploadResInstancesMap, boolean inTransaction, boolean needLock) {
+       private Either<Resource, ResponseFormat> createResourceInstancesRelations(User user, String yamlName, Resource resource, Map<String, UploadComponentInstanceInfo> uploadResInstancesMap) {
                log.debug("createResourceInstancesRelations try to create relations ");
                List<ComponentInstance> componentInstancesList = resource.getComponentInstances();
                if (uploadResInstancesMap == null) {
@@ -3590,7 +3626,7 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
                                return Either.right(responseFormat);
                        }
                        String resourceInstanceId = currentCompInstance.getUniqueId();
-                       Resource originResource = null;
+                       Resource originResource;
                        if (!originCompMap.containsKey(currentCompInstance.getComponentUid())) {
                                Either<Resource, StorageOperationStatus> getOriginResourceRes = toscaOperationFacade.getToscaFullElement(currentCompInstance.getComponentUid());
                                if (getOriginResourceRes.isRight()) {
@@ -3603,38 +3639,40 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
                        } else {
                                originResource = originCompMap.get(currentCompInstance.getComponentUid());
                        }
-                       if (originResource.getCapabilities() != null && !originResource.getCapabilities().isEmpty()) {
+                       if (originResource.getRequirements() != null && !originResource.getRequirements().isEmpty())
+                               instRequirements.put(currentCompInstance, originResource.getRequirements());
+                       if (MapUtils.isNotEmpty(originResource.getCapabilities())) {
                                Map<String, List<CapabilityDefinition>> originCapabilities ;
-                               if (MapUtils.isNotEmpty(uploadComponentInstanceInfo.getCapabilitiesNamesToUpdate()) && resource.getResourceType() == ResourceTypeEnum.CVFC) {
+                               if (MapUtils.isNotEmpty(uploadComponentInstanceInfo.getCapabilities())) {
                                        originCapabilities = new HashMap<>(); 
                                        originResource.getCapabilities().entrySet().stream().forEach(e ->{
                                                List<CapabilityDefinition> list =  e.getValue().stream().map(l -> new CapabilityDefinition(l)).collect(Collectors.toList()); 
                                                originCapabilities.put(e.getKey(), list);
                                        });
+                                       Map<String, Map<String, UploadPropInfo>> newPropertiesMap = new HashMap<>();
+                                       for(List<UploadCapInfo> capabilities : uploadComponentInstanceInfo.getCapabilities().values()){
+                                               for(UploadCapInfo capability :capabilities){
+                                                       if(CollectionUtils.isNotEmpty(capability.getProperties())){
+                                                               newPropertiesMap.put(capability.getName(), capability.getProperties().stream().collect(Collectors.toMap(p->p.getName(), p->p)));
+                                                       }
+                                               }
+                                       }
                                        for (List<CapabilityDefinition> capabilities : originCapabilities.values()) {
-                                               capabilities.stream().filter(c -> uploadComponentInstanceInfo.getCapabilitiesNamesToUpdate().containsKey(c.getName())).forEach(c -> c.setName(uploadComponentInstanceInfo.getCapabilitiesNamesToUpdate().get(c.getName())));
+                                               List<CapabilityDefinition> filteredCapabilities = capabilities.stream().filter(c -> newPropertiesMap.containsKey(c.getName())).collect(Collectors.toList());
+                                               for(CapabilityDefinition cap : filteredCapabilities){
+                                                       Either<Boolean, ResponseFormat> updateRes = updatePropertyValues(cap.getProperties(),newPropertiesMap.get(cap.getName()), allDataTypes.left().value());
+                                                       if(updateRes.isRight()){
+                                                               log.debug("Failed to update capability properties of capability {} . Status is {}. ", cap.getName(), updateRes.right().value());
+                                                               return Either.right(updateRes.right().value());
+                                                       }
+                                               }
                                        }
-                               }else{
+                               }
+                               else{
                                        originCapabilities = originResource.getCapabilities();
                                }
                                instCapabilties.put(currentCompInstance, originCapabilities);
                        }
-                       if (originResource.getRequirements() != null && !originResource.getRequirements().isEmpty()) {
-                               Map<String, List<RequirementDefinition>> originRequirements; 
-                               if (MapUtils.isNotEmpty(uploadComponentInstanceInfo.getRequirementsNamesToUpdate()) && resource.getResourceType() == ResourceTypeEnum.CVFC) {
-                                       originRequirements = new HashMap<>();
-                                       originResource.getRequirements().entrySet().stream().forEach(e ->{
-                                               List<RequirementDefinition> list =  e.getValue().stream().map(l -> new RequirementDefinition(l)).collect(Collectors.toList()); 
-                                               originRequirements.put(e.getKey(), list);
-                                       });
-                                       for (List<RequirementDefinition> requirements : originRequirements.values()) {
-                                               requirements.stream().filter(r -> uploadComponentInstanceInfo.getRequirementsNamesToUpdate().containsKey(r.getName())).forEach(r -> r.setName(uploadComponentInstanceInfo.getRequirementsNamesToUpdate().get(r.getName())));
-                                       }
-                               }else{
-                                       originRequirements = originResource.getRequirements();
-                               }
-                               instRequirements.put(currentCompInstance, originRequirements);
-                       }
                        if (originResource.getDeploymentArtifacts() != null && !originResource.getDeploymentArtifacts().isEmpty())
                                instDeploymentArtifacts.put(resourceInstanceId, originResource.getDeploymentArtifacts());
                        if (originResource.getArtifacts() != null && !originResource.getArtifacts().isEmpty())
@@ -3647,14 +3685,6 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
                                        return Either.right(addPropertiesValueToRiRes);
                                }
                        } else {
-                               Either<Resource, ResponseFormat> genericResourceEither = fetchAndSetDerivedFromGenericType(originResource);
-                               if (genericResourceEither.isRight()) {
-                                       return genericResourceEither;
-                               }
-                               log.trace("************* Going to add inputs from from original resource {} to resource instance. ", originResource.getName());
-                               if (originResource.shouldGenerateInputs())
-                                       generateInputsFromGenericTypeProperties(originResource, genericResourceEither.left().value());
-                               
                                ResponseFormat addInputValueToRiRes = addInputsValuesToRi(uploadComponentInstanceInfo, resource, originResource, currentCompInstance, yamlName, instInputs, allDataTypes.left().value());
                                if (addInputValueToRiRes.getStatus() != 200) {
                                        return Either.right(addInputValueToRiRes);
@@ -3711,16 +3741,16 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
                parametersView.setIgnoreCapabilities(false);
                parametersView.setIgnoreRequirements(false);
 
-               Either<Resource, StorageOperationStatus> eitherGerResource = toscaOperationFacade.getToscaElement(resource.getUniqueId(), parametersView);
+               Either<Resource, StorageOperationStatus> eitherGetResource = toscaOperationFacade.getToscaElement(resource.getUniqueId(), parametersView);
 
-               if (eitherGerResource.isRight()) {
-                       ResponseFormat responseFormat = componentsUtils.getResponseFormatByResource(componentsUtils.convertFromStorageResponse(eitherGerResource.right().value()), resource);
+               if (eitherGetResource.isRight()) {
+                       ResponseFormat responseFormat = componentsUtils.getResponseFormatByResource(componentsUtils.convertFromStorageResponse(eitherGetResource.right().value()), resource);
 
                        return Either.right(responseFormat);
 
                }
 
-               resource = eitherGerResource.left().value();
+               resource = eitherGetResource.left().value();
 
                for (Entry<String, UploadComponentInstanceInfo> entry : uploadResInstancesMap.entrySet()) {
                        UploadComponentInstanceInfo uploadComponentInstanceInfo = entry.getValue();
@@ -3753,17 +3783,119 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
                        return Either.right(responseFormat);
                }
 
+               if(resource.getResourceType() == ResourceTypeEnum.CVFC){
+                       eitherGetResource = toscaOperationFacade.getToscaFullElement(resource.getUniqueId());
+                       if (eitherGetResource.isRight()) {
+                               ResponseFormat responseFormat = componentsUtils.getResponseFormatByResource(componentsUtils.convertFromStorageResponse(eitherGetResource.right().value()), resource);
+                               return Either.right(responseFormat);
+                       }
+                       eitherGetResource = updateCalculatedCapReqWithSubstitutionMappings(eitherGetResource.left().value(), uploadResInstancesMap);
+                       if (eitherGetResource.isRight()) {
+                               ResponseFormat responseFormat = componentsUtils.getResponseFormatByResource(componentsUtils.convertFromStorageResponse(eitherGetResource.right().value()), resource);
+                               return Either.right(responseFormat);
+                       }
+               }
+               
                log.debug("************* in create relations, getResource start");
-
-               eitherGerResource = toscaOperationFacade.getToscaElement(resource.getUniqueId());
+               eitherGetResource = toscaOperationFacade.getToscaElement(resource.getUniqueId());
                log.debug("************* in create relations, getResource end");
-               if (eitherGerResource.isRight()) {
-                       ResponseFormat responseFormat = componentsUtils.getResponseFormatByResource(componentsUtils.convertFromStorageResponse(eitherGerResource.right().value()), resource);
-
+               if (eitherGetResource.isRight()) {
+                       ResponseFormat responseFormat = componentsUtils.getResponseFormatByResource(componentsUtils.convertFromStorageResponse(eitherGetResource.right().value()), resource);
                        return Either.right(responseFormat);
+               }
+               return Either.left(eitherGetResource.left().value());
+       }
 
+       private Either<Boolean, ResponseFormat> updatePropertyValues(List<ComponentInstanceProperty> properties, Map<String, UploadPropInfo> newProperties, Map<String, DataTypeDefinition> allDataTypes) {
+               for(ComponentInstanceProperty property : properties){
+                       Either<String, StorageOperationStatus> updateRes = updatePropertyValue(property ,newProperties.get(property.getName()), allDataTypes);
+                       if(updateRes.isRight()){
+                               log.debug("Failed to update capability property {} . Status is {}. ", property.getName(), updateRes.right().value());
+                               return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(updateRes.right().value())));
+                       }
+               }
+               return Either.left(true);
+       }
+
+       private Either<String, StorageOperationStatus> updatePropertyValue(ComponentInstanceProperty property, UploadPropInfo propertyInfo, Map<String, DataTypeDefinition> allDataTypes) {
+               String value = null;
+               List<GetInputValueDataDefinition> getInputs = null;
+               boolean isValidate = true;
+               if (null != propertyInfo && null != propertyInfo.getValue()) {
+                       getInputs = propertyInfo.getGet_input();
+                       isValidate = getInputs == null || getInputs.isEmpty();
+                       if (isValidate) {
+                               value = ImportUtils.getPropertyJsonStringValue(propertyInfo.getValue(), property.getType());
+                       } else
+                               value = ImportUtils.getPropertyJsonStringValue(propertyInfo.getValue(), ToscaTagNamesEnum.GET_INPUT.getElementName());
+               }
+               property.setValue(value);
+               return validatePropValueBeforeCreate(property, value, isValidate, null, allDataTypes);
+       }
+
+       private 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.associateCalculatedCapReq(updatedInstCapabilities, updatedInstRequirements,  resource.getUniqueId());
+                       if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) {
+                               log.debug("Failed to associate capabilities and requirementss of resource {}, updated according to a substitution mapping. Status is {}",  resource.getUniqueId(), status);
+                               updateRes = Either.right(status);
+                       }
+               }
+               if(updateRes == null){
+                       updateRes = Either.left(resource);
+               }
+               return updateRes;
+       }
+
+
+       private 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());
+               });
+       }
+
+       private 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(Collectors.toList()));
+                       }
+               }
+               if(MapUtils.isNotEmpty(updatedRequirements)){
+                       updatedInstRequirements.put(instance, updatedRequirements);
+               }
+       }
+
+       private 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(Collectors.toList()));
+                       }
+               }
+               if(MapUtils.isNotEmpty(updatedCapabilities)){
+                       updatedInstCapabilties.put(instance, updatedCapabilities);
                }
-               return Either.left(eitherGerResource.left().value());
        }
 
        private ResponseFormat addRelationToRI(String yamlName, Resource resource, UploadComponentInstanceInfo nodesInfoValue, List<RequirementCapabilityRelDef> relations) {
@@ -3966,25 +4098,28 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
        }
 
        private ResponseFormat addPropertyValuesToRi(UploadComponentInstanceInfo uploadComponentInstanceInfo, Resource resource, Resource originResource, ComponentInstance currentCompInstance, String yamlName,
-                       Map<String, List<ComponentInstanceProperty>> instProperties, Map<String, DataTypeDefinition> allDataTypes) {
+                                                                                                Map<String, List<ComponentInstanceProperty>> instProperties, Map<String, DataTypeDefinition> allDataTypes) {
 
                Map<String, List<UploadPropInfo>> propMap = uploadComponentInstanceInfo.getProperties();
-               if (propMap != null && propMap.size() > 0) {
-                       Map<String, PropertyDefinition> currPropertiesMap = new HashMap<String, PropertyDefinition>();
+               Map<String, PropertyDefinition> currPropertiesMap = new HashMap<String, PropertyDefinition>();
 
-                       List<PropertyDefinition> listFromMap = originResource.getProperties();
-                       if (listFromMap == null || listFromMap.isEmpty()) {
-                               log.debug("failed to find properties ");
-                               ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.PROPERTY_NOT_FOUND);
-                               return responseFormat;
-                       }
-                       for (PropertyDefinition prop : listFromMap) {
-                               String propName = prop.getName();
-                               if (!currPropertiesMap.containsKey(propName)) {
-                                       currPropertiesMap.put(propName, prop);
-                               }
+               List<PropertyDefinition> listFromMap = originResource.getProperties();
+               if ((propMap != null && !propMap.isEmpty()) && (listFromMap == null || listFromMap.isEmpty())) {
+                       log.debug("failed to find properties ");
+                       ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.PROPERTY_NOT_FOUND);
+                       return responseFormat;
+               }
+               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<>();
+               }
+               List<ComponentInstanceProperty> instPropList = new ArrayList<>();
+               if (propMap != null && propMap.size() > 0) {
                        for (List<UploadPropInfo> propertyList : propMap.values()) {
 
                                UploadPropInfo propertyInfo = propertyList.get(0);
@@ -4060,14 +4195,14 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
                                // delete overriden property
                                currPropertiesMap.remove(property.getName());
                        }
-                       // add rest of properties
-                       if (!currPropertiesMap.isEmpty()) {
-                               for (PropertyDefinition value : currPropertiesMap.values()) {
-                                       instPropList.add(new ComponentInstanceProperty(value));
-                               }
+               }
+               // add rest of properties
+               if (!currPropertiesMap.isEmpty()) {
+                       for (PropertyDefinition value : currPropertiesMap.values()) {
+                               instPropList.add(new ComponentInstanceProperty(value));
                        }
-                       instProperties.put(currentCompInstance.getUniqueId(), instPropList);
                }
+               instProperties.put(currentCompInstance.getUniqueId(), instPropList);
                return componentsUtils.getResponseFormat(ActionStatus.OK);
        }
 
@@ -4312,9 +4447,10 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
 
                        ComponentTypeEnum containerComponentType = resource.getComponentType();
                        NodeTypeEnum containerNodeType = containerComponentType.getNodeType();
-
-                       if (containerNodeType.equals(NodeTypeEnum.Resource) && uploadComponentInstanceInfo.getCapabilities() != null) {
-                               Either<Map<String, List<CapabilityDefinition>>, ResponseFormat> getValidComponentInstanceCapabilitiesRes = getValidComponentInstanceCapabilities(refResource.getCapabilities(), uploadComponentInstanceInfo.getCapabilities());
+                       
+                       if (containerNodeType.equals(NodeTypeEnum.Resource) && MapUtils.isNotEmpty(uploadComponentInstanceInfo.getCapabilities()) && MapUtils.isNotEmpty(refResource.getCapabilities())) {
+                               setCapabilityNamesTypes(refResource.getCapabilities(), uploadComponentInstanceInfo.getCapabilities());
+                               Either<Map<String, List<CapabilityDefinition>>, ResponseFormat> getValidComponentInstanceCapabilitiesRes = getValidComponentInstanceCapabilities(refResource.getUniqueId(), refResource.getCapabilities(), uploadComponentInstanceInfo.getCapabilities());
                                if (getValidComponentInstanceCapabilitiesRes.isRight()) {
                                        return Either.right(getValidComponentInstanceCapabilitiesRes.right().value());
                                } else {
@@ -4373,6 +4509,18 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
                return Either.left(eitherGerResource.left().value());
        }
 
+       private void setCapabilityNamesTypes(Map<String, List<CapabilityDefinition>> originCapabilities, Map<String, List<UploadCapInfo>> uploadedCapabilities) {
+               for(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());});};});
+               }
+               
+       }
+
        private Either<Resource, ResponseFormat> validateResourceInstanceBeforeCreate(String yamlName, UploadComponentInstanceInfo uploadComponentInstanceInfo, Map<String, Resource> nodeNamespaceMap) {
                log.debug("validateResourceInstanceBeforeCreate - going to validate resource instance with name {} and type before create", uploadComponentInstanceInfo.getName(), uploadComponentInstanceInfo.getType());
                Resource refResource = null;
@@ -4395,7 +4543,7 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
                        return Either.right(responseFormat);
                }
 
-               if (!ToscaUtils.isAtomicType(refResource) && refResource.getResourceType() != ResourceTypeEnum.CVFC) {
+               if (!ModelConverter.isAtomicComponent(refResource) && refResource.getResourceType() != ResourceTypeEnum.CVFC) {
                        log.debug("validateResourceInstanceBeforeCreate -  ref resource type is  ", refResource.getResourceType());
                        ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.INVALID_NODE_TEMPLATE, yamlName, uploadComponentInstanceInfo.getName(), uploadComponentInstanceInfo.getType());
                        return Either.right(responseFormat);
@@ -4728,32 +4876,30 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
                return result;
 
        }
-
        @SuppressWarnings("unchecked")
-       private Either<Map<String, List<UploadCapInfo>>, ResponseFormat> createCapModuleFromYaml(UploadComponentInstanceInfo nodeTemplateInfo, Map<String, Object> nodeTemplateJsonMap) {
-               Map<String, List<UploadCapInfo>> moduleCap = new HashMap<String, List<UploadCapInfo>>();
-               Either<Map<String, List<UploadCapInfo>>, ResponseFormat> response = Either.left(moduleCap);
-               Either<List<Object>, ResultStatusEnum> toscaRequirements = ImportUtils.findFirstToscaListElement(nodeTemplateJsonMap, ToscaTagNamesEnum.CAPABILITIES);
-               if (toscaRequirements.isLeft()) {
-                       List<Object> jsonCapabilities = toscaRequirements.left().value();
-
-                       for (Object jsonCapObj : jsonCapabilities) {
-                               // Requirement
-                               Map<String, Object> capJsonWrapper = (Map<String, Object>) jsonCapObj;
-                               String capName = capJsonWrapper.keySet().iterator().next();
-                               Either<UploadCapInfo, ResponseFormat> eitherCap = createModuleNodeTemplateCap(capJsonWrapper.get(capName));
+       private Either<Map<String, List<UploadReqInfo>>, ResponseFormat> createReqModuleFromYaml(UploadComponentInstanceInfo nodeTemplateInfo, Map<String, Object> nodeTemplateJsonMap) {
+               Map<String, List<UploadReqInfo>> moduleRequirements = new HashMap<String, List<UploadReqInfo>>();
+               Either<Map<String, List<UploadReqInfo>>, ResponseFormat> response = Either.left(moduleRequirements);
+               Either<List<Object>, ResultStatusEnum> requirementsListRes = ImportUtils.findFirstToscaListElement(nodeTemplateJsonMap, ToscaTagNamesEnum.REQUIREMENTS);
+               
+               if (requirementsListRes.isLeft()) {
+                       for (Object jsonReqObj : requirementsListRes.left().value()) {
+                               String reqName = ((Map<String, Object>) jsonReqObj).keySet().iterator().next();
+                               Object reqJson = ((Map<String, Object>) jsonReqObj).get(reqName);
+                               Either<UploadReqInfo, ResponseFormat> eitherCap = addModuleNodeTemplateReq(nodeTemplateInfo, moduleRequirements, reqJson, reqName);
                                if (eitherCap.isRight()) {
-                                       log.info("error when creating Requirement:{}, for node:{}", capName, nodeTemplateInfo);
                                        return Either.right(eitherCap.right().value());
-                               } else {
-                                       UploadCapInfo requirementDef = eitherCap.left().value();
-                                       requirementDef.setName(capName);
-                                       if (moduleCap.containsKey(capName)) {
-                                               moduleCap.get(capName).add(requirementDef);
-                                       } else {
-                                               List<UploadCapInfo> list = new ArrayList<UploadCapInfo>();
-                                               list.add(requirementDef);
-                                               moduleCap.put(capName, list);
+                               }
+                       }
+               } else {
+                       Either<Map<String,Object>, ResultStatusEnum> requirementsMapRes = ImportUtils.findFirstToscaMapElement(nodeTemplateJsonMap, ToscaTagNamesEnum.REQUIREMENTS);
+                       if (requirementsMapRes.isLeft()) {
+                               for (Map.Entry<String, Object>  entry: requirementsMapRes.left().value().entrySet()) {
+                                       String reqName = entry.getKey();
+                                       Object reqJson = entry.getValue();
+                                       Either<UploadReqInfo, ResponseFormat> eitherCap = addModuleNodeTemplateReq(nodeTemplateInfo, moduleRequirements, reqJson, reqName);
+                                       if (eitherCap.isRight()) {
+                                               return Either.right(eitherCap.right().value());
                                        }
                                }
                        }
@@ -4761,31 +4907,49 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
                return response;
        }
 
-       @SuppressWarnings("unchecked")
-       private Either<Map<String, List<UploadReqInfo>>, ResponseFormat> createReqModuleFromYaml(UploadComponentInstanceInfo nodeTemplateInfo, Map<String, Object> nodeTemplateJsonMap) {
-               Map<String, List<UploadReqInfo>> moduleRequirements = new HashMap<String, List<UploadReqInfo>>();
-               Either<Map<String, List<UploadReqInfo>>, ResponseFormat> response = Either.left(moduleRequirements);
-               Either<List<Object>, ResultStatusEnum> toscaRequirements = ImportUtils.findFirstToscaListElement(nodeTemplateJsonMap, ToscaTagNamesEnum.REQUIREMENTS);
-               if (toscaRequirements.isLeft()) {
-                       List<Object> jsonRequirements = toscaRequirements.left().value();
-
-                       for (Object jsonRequirementObj : jsonRequirements) {
-                               // Requirement
-                               Map<String, Object> requirementJsonWrapper = (Map<String, Object>) jsonRequirementObj;
-                               String requirementName = requirementJsonWrapper.keySet().iterator().next();
-                               Either<UploadReqInfo, ResponseFormat> eitherRequirement = createModuleNodeTemplateReg(requirementJsonWrapper.get(requirementName));
-                               if (eitherRequirement.isRight()) {
-                                       log.info("error when creating Requirement:{}, for node:{}", requirementName, nodeTemplateInfo);
-                                       return Either.right(eitherRequirement.right().value());
-                               } else {
-                                       UploadReqInfo requirementDef = eitherRequirement.left().value();
-                                       requirementDef.setName(requirementName);
-                                       if (moduleRequirements.containsKey(requirementName)) {
-                                               moduleRequirements.get(requirementName).add(requirementDef);
-                                       } else {
-                                               List<UploadReqInfo> list = new ArrayList<UploadReqInfo>();
-                                               list.add(requirementDef);
-                                               moduleRequirements.put(requirementName, list);
+       private Either<UploadReqInfo, ResponseFormat> addModuleNodeTemplateReq(UploadComponentInstanceInfo nodeTemplateInfo,Map<String, List<UploadReqInfo>> moduleRequirements, Object requirementJson, String requirementName) {
+               
+               Either<UploadReqInfo, ResponseFormat> eitherRequirement = createModuleNodeTemplateReg(requirementJson);
+               if (eitherRequirement.isRight()) {
+                       log.info("error when creating Requirement:{}, for node:{}", requirementName, nodeTemplateInfo);
+                       return Either.right(eitherRequirement.right().value());
+               } else {
+                       UploadReqInfo requirementDef = eitherRequirement.left().value();
+                       requirementDef.setName(requirementName);
+                       if (moduleRequirements.containsKey(requirementName)) {
+                               moduleRequirements.get(requirementName).add(requirementDef);
+                       } else {
+                               List<UploadReqInfo> list = new ArrayList<UploadReqInfo>();
+                               list.add(requirementDef);
+                               moduleRequirements.put(requirementName, list);
+                       }
+               }
+               return Either.left(eitherRequirement.left().value());
+       }
+       
+               @SuppressWarnings("unchecked")
+       private Either<Map<String, List<UploadCapInfo>>, ResponseFormat> createCapModuleFromYaml(UploadComponentInstanceInfo nodeTemplateInfo, Map<String, Object> nodeTemplateJsonMap) {
+               Map<String, List<UploadCapInfo>> moduleCap = new HashMap<>();
+               Either<Map<String, List<UploadCapInfo>>, ResponseFormat> response = Either.left(moduleCap);
+               Either<List<Object>, ResultStatusEnum> capabilitiesListRes = ImportUtils.findFirstToscaListElement(nodeTemplateJsonMap, ToscaTagNamesEnum.CAPABILITIES);
+               if (capabilitiesListRes.isLeft()) {
+                       for (Object jsonCapObj : capabilitiesListRes.left().value()) {
+                               String key = ((Map<String, Object>) jsonCapObj).keySet().iterator().next();
+                               Object capJson = ((Map<String, Object>) jsonCapObj).get(key);
+                               Either<UploadCapInfo, ResponseFormat> eitherCap = addModuleNodeTemplateCap(nodeTemplateInfo, moduleCap, capJson, key);
+                               if (eitherCap.isRight()) {
+                                       return Either.right(eitherCap.right().value());
+                               }
+                       }
+               } else {
+                       Either<Map<String,Object>, ResultStatusEnum> capabilitiesMapRes = ImportUtils.findFirstToscaMapElement(nodeTemplateJsonMap, ToscaTagNamesEnum.CAPABILITIES);
+                       if (capabilitiesMapRes.isLeft()) {
+                               for (Map.Entry<String, Object>  entry: capabilitiesMapRes.left().value().entrySet()) {
+                                       String capName = entry.getKey();
+                                       Object capJson = entry.getValue();
+                                       Either<UploadCapInfo, ResponseFormat> eitherCap = addModuleNodeTemplateCap(nodeTemplateInfo, moduleCap, capJson, capName);
+                                       if (eitherCap.isRight()) {
+                                               return Either.right(eitherCap.right().value());
                                        }
                                }
                        }
@@ -4793,6 +4957,26 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
                return response;
        }
 
+       private Either<UploadCapInfo, ResponseFormat> addModuleNodeTemplateCap(UploadComponentInstanceInfo nodeTemplateInfo, Map<String, List<UploadCapInfo>> moduleCap, Object capJson, String key) {
+               
+               Either<UploadCapInfo, ResponseFormat> eitherCap = createModuleNodeTemplateCap(capJson);
+               if (eitherCap.isRight()) {
+                       log.info("error when creating Capability:{}, for node:{}", key, nodeTemplateInfo);
+                       return Either.right(eitherCap.right().value());
+               } else {
+                       UploadCapInfo capabilityDef = eitherCap.left().value();
+                       capabilityDef.setKey(key);
+                       if (moduleCap.containsKey(key)) {
+                               moduleCap.get(key).add(capabilityDef);
+                       } else {
+                               List<UploadCapInfo> list = new ArrayList<UploadCapInfo>();
+                               list.add(capabilityDef);
+                               moduleCap.put(key, list);
+                       }
+               }
+               return Either.left( eitherCap.left().value());
+       }
+
        @SuppressWarnings("unchecked")
        private Either<UploadCapInfo, ResponseFormat> createModuleNodeTemplateCap(Object capObject) {
                UploadCapInfo capTemplateInfo = new UploadCapInfo();
@@ -5005,6 +5189,11 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
                                result = Either.right(validateFieldsResponse.right().value());
                                return result;
                        }
+                       
+                       validateFieldsResponse = validateCapabilityTypesCreate(user, getCapabilityTypeOperation(), newResource, AuditingActionEnum.IMPORT_RESOURCE, inTransaction);
+                       if (validateFieldsResponse.isRight()) {
+                               return Either.right(validateFieldsResponse.right().value());
+                       }
 
                        // contact info normalization
                        newResource.setContactId(newResource.getContactId().toLowerCase());
@@ -5141,7 +5330,7 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
                resource.setCreatorUserId(user.getUserId());
                resource.setCreatorFullName(user.getFirstName() + " " + user.getLastName());
                resource.setContactId(resource.getContactId().toLowerCase());
-               if (StringUtils.isEmpty(resource.getToscaResourceName()) && !ToscaUtils.isAtomicType(resource)) {
+               if (StringUtils.isEmpty(resource.getToscaResourceName()) && !ModelConverter.isAtomicComponent(resource)) {
                        String resourceSystemName;
                        if(csarInfo != null && StringUtils.isNotEmpty(csarInfo.getVfResourceName())){
                                resourceSystemName = ValidationUtils.convertToSystemName(csarInfo.getVfResourceName());
@@ -5310,11 +5499,9 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
                }
                try {
                        if (resource.deriveFromGeneric()) {
-                               Either<Resource, ResponseFormat> genericResourceEither = fetchAndSetDerivedFromGenericType(resource);
+                               Either<Resource, ResponseFormat> genericResourceEither = handleResourceGenericType(resource);
                                if (genericResourceEither.isRight())
                                        return genericResourceEither;
-                               if (resource.shouldGenerateInputs())
-                                       generateInputsFromGenericTypeProperties(resource, genericResourceEither.left().value());
                        }
 
                        Either<Resource, ResponseFormat> respStatus = createResourceTransaction(resource, user, isNormative, inTransaction);
@@ -5679,7 +5866,7 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
                        // list
                        // This code is not called from import resources, because of root
                        // VF "derivedFrom" should be null (or ignored)
-                       if (ToscaUtils.isAtomicType(currentResource)) {
+                       if (ModelConverter.isAtomicComponent(currentResource)) {
                                Either<Boolean, ResponseFormat> derivedFromNotEmptyEither = validateDerivedFromNotEmpty(null, newResource, null);
                                if (derivedFromNotEmptyEither.isRight()) {
                                        log.debug("for updated resource {}, derived from field is empty", newResource.getName());
@@ -5893,7 +6080,7 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
 
                // validate template (derived from)
                log.debug("validate derived from");
-               if (!ToscaUtils.isAtomicType(resource) && resource.getResourceType() != ResourceTypeEnum.CVFC) {
+               if (!ModelConverter.isAtomicComponent(resource) && resource.getResourceType() != ResourceTypeEnum.CVFC) {
                        resource.setDerivedFrom(null);
                }
                eitherValidation = validateDerivedFromExist(user, resource, actionEnum);
@@ -6113,10 +6300,23 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
         * return Either.left(true); }
         */
 
-       private Either<Boolean, ResponseFormat> validateResourceName(Resource currentResource, Resource updateInfoResource, boolean hasBeenCertified) {
+       private boolean isResourceNameEquals(Resource currentResource, Resource updateInfoResource) {
                String resourceNameUpdated = updateInfoResource.getName();
                String resourceNameCurrent = currentResource.getName();
-               if (!resourceNameCurrent.equals(resourceNameUpdated)) {
+               if (resourceNameCurrent.equals(resourceNameUpdated))
+                       return true;
+               // In case of CVFC type we should support the case of old VF with CVFC instances that were created without the "Cvfc" suffix
+               return (currentResource.getResourceType().equals(ResourceTypeEnum.CVFC)
+                               && resourceNameUpdated.equals(addCvfcSuffixToResourceName(resourceNameCurrent)));
+       }
+
+       private String addCvfcSuffixToResourceName(String resourceName) {
+               return resourceName+"Cvfc";
+       }
+
+       private Either<Boolean, ResponseFormat> validateResourceName(Resource currentResource, Resource updateInfoResource, boolean hasBeenCertified) {
+               String resourceNameUpdated = updateInfoResource.getName();
+               if (!isResourceNameEquals(currentResource, updateInfoResource)) {
                        if (!hasBeenCertified) {
                                Either<Boolean, ResponseFormat> validateResourceNameResponse = validateComponentName(null, updateInfoResource, null);
                                if (validateResourceNameResponse.isRight()) {
@@ -6976,7 +7176,7 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
                return null;
        }
 
-       private Either<Map<String, List<CapabilityDefinition>>, ResponseFormat> getValidComponentInstanceCapabilities(Map<String, List<CapabilityDefinition>> defaultCapabilities, Map<String, List<UploadCapInfo>> uploadedCapabilities) {
+       private Either<Map<String, List<CapabilityDefinition>>, ResponseFormat> getValidComponentInstanceCapabilities(String resourceId, Map<String, List<CapabilityDefinition>> defaultCapabilities, Map<String, List<UploadCapInfo>> uploadedCapabilities) {
                ResponseFormat responseFormat;
                Map<String, List<CapabilityDefinition>> validCapabilitiesMap = new HashMap<>();
 
@@ -6986,14 +7186,33 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
                                responseFormat = componentsUtils.getResponseFormat(ActionStatus.MISSING_CAPABILITY_TYPE, capabilityType);
                                return Either.right(responseFormat);
                        } else {
-                               CapabilityDefinition delaultCapability = defaultCapabilities.get(capabilityType).get(0);
-                               Either<Boolean, String> validationRes = validateUniquenessUpdateUploadedComponentInstanceCapability(delaultCapability, uploadedCapabilitiesEntry.getValue().get(0));
-                               if (validationRes.isRight()) {
-                                       responseFormat = componentsUtils.getResponseFormat(ActionStatus.PROPERTY_NAME_ALREADY_EXISTS, validationRes.right().value());
+                               CapabilityDefinition defaultCapability;
+                               if(CollectionUtils.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());
+                                               responseFormat = componentsUtils.getResponseFormat(ActionStatus.COMPONENT_NOT_FOUND, resourceId);
+                                               return Either.right(responseFormat);
+                                       }
+                                       defaultCapability = getFullComponentRes.left().value().getCapabilities().get(capabilityType).get(0);
+                               }
+                               if(CollectionUtils.isEmpty(defaultCapability.getProperties()) && CollectionUtils.isNotEmpty(uploadedCapabilitiesEntry.getValue().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());
+                                       responseFormat = componentsUtils.getResponseFormat(ActionStatus.PROPERTY_NOT_FOUND, resourceId);
                                        return Either.right(responseFormat);
                                }
+                               if(CollectionUtils.isNotEmpty(defaultCapability.getProperties()) && CollectionUtils.isNotEmpty(uploadedCapabilitiesEntry.getValue().get(0).getProperties())){
+                                       Either<Boolean, String> validationRes = validateUniquenessUpdateUploadedComponentInstanceCapability(defaultCapability, uploadedCapabilitiesEntry.getValue().get(0));
+                                       if (validationRes.isRight()) {
+                                               responseFormat = componentsUtils.getResponseFormat(ActionStatus.PROPERTY_NAME_ALREADY_EXISTS, validationRes.right().value());
+                                               return Either.right(responseFormat);
+                                       }
+                               }
                                List<CapabilityDefinition> validCapabilityList = new ArrayList<>();
-                               validCapabilityList.add(delaultCapability);
+                               validCapabilityList.add(defaultCapability);
                                validCapabilitiesMap.put(uploadedCapabilitiesEntry.getKey(), validCapabilityList);
                        }
                }
@@ -7143,5 +7362,20 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
                UiComponentDataTransfer dataTransfer = UiComponentDataConverter.getUiDataTransferFromResourceByParams(resource, dataParamsToReturn);
                return Either.left(dataTransfer);
        }
+       @Override
+       public Either<Component, ActionStatus> shouldUpgradeToLatestDerived(Component clonedComponent) {
+               Resource resource = (Resource) clonedComponent;
+               if (ModelConverter.isAtomicComponent(resource.getResourceType())) {
+                       Either<Component, StorageOperationStatus> shouldUpgradeToLatestDerived = toscaOperationFacade.shouldUpgradeToLatestDerived(resource);
+                       if (shouldUpgradeToLatestDerived.isRight()) {
+                               return Either.right(componentsUtils.convertFromStorageResponse(shouldUpgradeToLatestDerived.right().value()));
+                       }
+                       return Either.left(shouldUpgradeToLatestDerived.left().value());
+               } else {
+                       return super.shouldUpgradeToLatestDerived(clonedComponent);
+               }
+       }
+
+
 
 }