X-Git-Url: https://gerrit.onap.org/r/gitweb?a=blobdiff_plain;f=catalog-be%2Fsrc%2Fmain%2Fjava%2Forg%2Fopenecomp%2Fsdc%2Fbe%2Fcomponents%2Fimpl%2FResourceImportManager.java;h=99dea8f04d363564939aa33df116082159b6b0f4;hb=7c61c7bb0369bc27d05c8801c8cb0cca41e494bf;hp=aa420673c79cf2842e2813b46e1c4f33c54b080d;hpb=ff317808f308af03321de0f0b0849cd9f6f8ccad;p=sdc.git diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ResourceImportManager.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ResourceImportManager.java index aa420673c7..99dea8f04d 100644 --- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ResourceImportManager.java +++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ResourceImportManager.java @@ -27,6 +27,7 @@ import static org.openecomp.sdc.be.model.jsonjanusgraph.operations.ToscaElementO import fj.data.Either; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.Comparator; import java.util.EnumMap; import java.util.HashMap; @@ -65,7 +66,9 @@ import org.openecomp.sdc.be.dao.janusgraph.JanusGraphOperationStatus; import org.openecomp.sdc.be.dao.jsongraph.GraphVertex; 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.OperationDataDefinition; import org.openecomp.sdc.be.datatypes.elements.PropertyDataDefinition; +import org.openecomp.sdc.be.datatypes.elements.SchemaDefinition; import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum; import org.openecomp.sdc.be.datatypes.enums.GraphPropertyEnum; import org.openecomp.sdc.be.datatypes.enums.JsonPresentationFields; @@ -78,12 +81,15 @@ import org.openecomp.sdc.be.model.AttributeDefinition; import org.openecomp.sdc.be.model.CapabilityDefinition; import org.openecomp.sdc.be.model.ComponentInstanceProperty; import org.openecomp.sdc.be.model.DataTypeDefinition; +import org.openecomp.sdc.be.model.DefaultUploadResourceInfo; import org.openecomp.sdc.be.model.InterfaceDefinition; import org.openecomp.sdc.be.model.LifecycleStateEnum; import org.openecomp.sdc.be.model.NodeTypesMetadataList; import org.openecomp.sdc.be.model.PropertyDefinition; import org.openecomp.sdc.be.model.RequirementDefinition; import org.openecomp.sdc.be.model.Resource; +import org.openecomp.sdc.be.model.UploadComponentInstanceInfo; +import org.openecomp.sdc.be.model.UploadInterfaceInfo; import org.openecomp.sdc.be.model.UploadResourceInfo; import org.openecomp.sdc.be.model.User; import org.openecomp.sdc.be.model.category.CategoryDefinition; @@ -112,7 +118,7 @@ import org.yaml.snakeyaml.Yaml; @org.springframework.stereotype.Component("resourceImportManager") public class ResourceImportManager { - static final Pattern PROPERTY_NAME_PATTERN_IGNORE_LENGTH = Pattern.compile("['\\w\\s\\-\\:]+"); + static final Pattern PROPERTY_NAME_PATTERN_IGNORE_LENGTH = Pattern.compile("['\\w\\s\\-\\.\\:]+"); private static final Logger log = Logger.getLogger(ResourceImportManager.class); private final InterfaceDefinitionHandler interfaceDefinitionHandler; private final ComponentsUtils componentsUtils; @@ -150,13 +156,14 @@ public class ResourceImportManager { } public ImmutablePair importNormativeResource(final String resourceYml, final UploadResourceInfo resourceMetaData, + final Map instancesFromCsar, final User creator, final boolean createNewVersion, final boolean needLock, final boolean isInTransaction) { LifecycleChangeInfoWithAction lifecycleChangeInfo = new LifecycleChangeInfoWithAction(); lifecycleChangeInfo.setUserRemarks("certification on import"); Function validator = resource -> resourceBusinessLogic.validatePropertiesDefaultValues(resource); return importCertifiedResource(resourceYml, resourceMetaData, creator, validator, lifecycleChangeInfo, isInTransaction, createNewVersion, - needLock, null, null, false, null, null, false); + needLock, null, null, false, null, null, false, instancesFromCsar); } public void importAllNormativeResource(final String resourcesYaml, final NodeTypesMetadataList nodeTypesMetadataList, final User user, @@ -168,11 +175,15 @@ public class ResourceImportManager { log.error(EcompLoggerErrorCode.BUSINESS_PROCESS_ERROR, ResourceImportManager.class.getName(), "Could not parse node types YAML", e); throw new ByActionStatusComponentException(ActionStatus.INVALID_NODE_TYPES_YAML); } - if (!nodeTypesYamlMap.containsKey(ToscaTagNamesEnum.NODE_TYPES.getElementName())) { return; } final Map nodeTypesMap = (Map) nodeTypesYamlMap.get(ToscaTagNamesEnum.NODE_TYPES.getElementName()); + importAllNormativeResource(nodeTypesMap, nodeTypesMetadataList, null, user, "", createNewVersion,needLock); + } + + public void importAllNormativeResource(final Map nodeTypesMap, final NodeTypesMetadataList nodeTypesMetadataList, + Map instancesFromCsar, final User user, String model, final boolean createNewVersion, final boolean needLock) { try { nodeTypesMetadataList.getNodeMetadataList().forEach(nodeTypeMetadata -> { final String nodeTypeToscaName = nodeTypeMetadata.getToscaName(); @@ -186,7 +197,12 @@ public class ResourceImportManager { Map.of(nodeTypeToscaName, nodeTypeMap) ); final String nodeTypeYaml = new Yaml().dump(nodeTypeDefinitionMap); - importNormativeResource(nodeTypeYaml, NodeTypeMetadataMapper.mapTo(nodeTypeMetadata), user, createNewVersion, needLock, true); + UploadResourceInfo uploadResourceInfo = NodeTypeMetadataMapper.mapTo(nodeTypeMetadata); + if (uploadResourceInfo instanceof DefaultUploadResourceInfo) { + uploadResourceInfo.setModel(model); + uploadResourceInfo.setContactId(user.getUserId()); + } + importNormativeResource(nodeTypeYaml, uploadResourceInfo, instancesFromCsar, user, createNewVersion, needLock, true); } }); janusGraphDao.commit(); @@ -202,7 +218,7 @@ public class ResourceImportManager { lifecycleChangeInfo.setUserRemarks("certification on import"); Function validator = resource -> resourceBusinessLogic.validatePropertiesDefaultValues(resource); return importCertifiedResource(resourceYml, resourceMetaData, creator, validator, lifecycleChangeInfo, false, createNewVersion, needLock, - null, null, false, null, null, false); + null, null, false, null, null, false, null); } public ImmutablePair importCertifiedResource(String resourceYml, UploadResourceInfo resourceMetaData, User creator, @@ -212,7 +228,7 @@ public class ResourceImportManager { Map> nodeTypeArtifactsToHandle, List nodeTypesNewCreatedArtifacts, boolean forceCertificationAllowed, CsarInfo csarInfo, String nodeName, - boolean isNested) { + boolean isNested, Map instancesFromCsar) { Resource resource = new Resource(); ImmutablePair responsePair = new ImmutablePair<>(resource, ActionStatus.CREATED); Either, ResponseFormat> response = Either.left(responsePair); @@ -220,8 +236,8 @@ public class ResourceImportManager { try { boolean shouldBeCertified = nodeTypeArtifactsToHandle == null || nodeTypeArtifactsToHandle.isEmpty(); setConstantMetaData(resource, shouldBeCertified); - setMetaDataFromJson(resourceMetaData, resource); - populateResourceFromYaml(resourceYml, resource); + setResourceMetaData(resource, resourceYml, resourceMetaData); + populateResourceFromYaml(resourceYml, resource, instancesFromCsar); validationFunction.apply(resource); resource.getComponentMetadataDefinition().getMetadataDataDefinition().setNormative(resourceMetaData.isNormative()); checkResourceExists(createNewVersion, csarInfo, resource); @@ -318,6 +334,7 @@ public class ResourceImportManager { resource.setIcon(resourceMetaData.getResourceIconPath()); resource.setResourceVendorModelNumber(resourceMetaData.getResourceVendorModelNumber()); resource.setResourceType(ResourceTypeEnum.valueOf(resourceMetaData.getResourceType())); + resource.setTenant(resourceMetaData.getTenant()); if (resourceMetaData.getVendorName() != null) { resource.setVendorName(resourceMetaData.getVendorName()); } @@ -336,7 +353,7 @@ public class ResourceImportManager { ImmutablePair responsePair = new ImmutablePair<>(resource, ActionStatus.CREATED); try { setMetaDataFromJson(resourceMetaData, resource); - populateResourceFromYaml(resourceYml, resource); + populateResourceFromYaml(resourceYml, resource, null); // currently import VF isn't supported. In future will be supported import VF only with CSAR file!! if (ResourceTypeEnum.VF == resource.getResourceType()) { log.debug("Now import VF isn't supported. It will be supported in future with CSAR file only"); @@ -351,13 +368,12 @@ public class ResourceImportManager { return responsePair; } - private void populateResourceFromYaml(final String resourceYml, Resource resource) { + private void populateResourceFromYaml(final String resourceYml, Resource resource, Map instancesFromCsar) { @SuppressWarnings("unchecked") Object ymlObj = new Yaml().load(resourceYml); if (ymlObj instanceof Map) { final Either existingResource = getExistingResource(resource); final Map toscaJsonAll = (Map) ymlObj; Map toscaJson = toscaJsonAll; - // Checks if exist and builds the node_types map if (toscaJsonAll.containsKey(ToscaTagNamesEnum.NODE_TYPES.getElementName()) && resource.getResourceType() != ResourceTypeEnum.CVFC) { toscaJson = new HashMap<>(); toscaJson.put(ToscaTagNamesEnum.NODE_TYPES.getElementName(), toscaJsonAll.get(ToscaTagNamesEnum.NODE_TYPES.getElementName())); @@ -371,7 +387,6 @@ public class ResourceImportManager { resource.setDataTypes(extractDataTypeFromJson(resourceBusinessLogic, toscaAttributes, resource.getModel())); } } - // Derived From final Resource parentResource = setDerivedFrom(toscaJson, resource); if (StringUtils.isEmpty(resource.getToscaResourceName())) { setToscaResourceName(toscaJson, resource); @@ -380,7 +395,7 @@ public class ResourceImportManager { setProperties(toscaJson, resource, existingResource); setAttributes(toscaJson, resource); setRequirements(toscaJson, resource, parentResource); - setInterfaceLifecycle(toscaJson, resource, existingResource); + setInterfaceLifecycle(toscaJson, resource, existingResource, instancesFromCsar); } else { throw new ByActionStatusComponentException(ActionStatus.GENERAL_ERROR); } @@ -426,33 +441,52 @@ public class ResourceImportManager { } private void setToscaResourceName(Map toscaJson, Resource resource) { + resource.setToscaResourceName(getToscaResourceName(toscaJson)); + } + + private String getToscaResourceName(Map toscaJson) { Either, ResultStatusEnum> toscaElement = ImportUtils - .findFirstToscaMapElement(toscaJson, ToscaTagNamesEnum.NODE_TYPES); + .findFirstToscaMapElement(toscaJson, ToscaTagNamesEnum.NODE_TYPES); if (toscaElement.isLeft() && toscaElement.left().value().size() == 1) { - String toscaResourceName = toscaElement.left().value().keySet().iterator().next(); - resource.setToscaResourceName(toscaResourceName); + return toscaElement.left().value().keySet().iterator().next(); } + return null; } - private void setInterfaceLifecycle(Map toscaJson, Resource resource, Either existingResource) { + private void setInterfaceLifecycle(Map toscaJson, Resource resource, Either existingResource, + Map instancesFromCsar) { final Either, ResultStatusEnum> toscaInterfaces = ImportUtils .findFirstToscaMapElement(toscaJson, ToscaTagNamesEnum.INTERFACES); + final Map moduleInterfaces = new HashMap<>(); + final Map map; + List interfaceInfoList = null; + if (MapUtils.isNotEmpty(instancesFromCsar)) { + interfaceInfoList = instancesFromCsar.values().stream().filter(i -> MapUtils.isNotEmpty(i.getInterfaces())) + .flatMap(i -> i.getInterfaces().values().stream()).collect(Collectors.toList()); + } if (toscaInterfaces.isLeft()) { - final Map moduleInterfaces = new HashMap<>(); - final Map map = toscaInterfaces.left().value(); + map = toscaInterfaces.left().value(); for (final Entry interfaceNameValue : map.entrySet()) { - final Either eitherInterface = createModuleInterface(interfaceNameValue.getValue(), - resource.getModel()); + final Either eitherInterface = + createModuleInterface(interfaceNameValue.getValue(), resource.getModel()); if (eitherInterface.isRight()) { log.info("error when creating interface:{}, for resource:{}", interfaceNameValue.getKey(), resource.getName()); } else { final InterfaceDefinition interfaceDefinition = eitherInterface.left().value(); + if (CollectionUtils.isNotEmpty(interfaceInfoList)) { + updateInterfaceDefinition(interfaceDefinition, interfaceInfoList); + } moduleInterfaces.put(interfaceDefinition.getType(), interfaceDefinition); } } - if (existingResource.isLeft()) { + } else { + map = Collections.emptyMap(); + } + if (existingResource.isLeft()) { + final Map interfaces = existingResource.left().value().getInterfaces(); + if (MapUtils.isNotEmpty(interfaces)) { final Map userCreatedInterfaceDefinitions = - existingResource.left().value().getInterfaces().entrySet().stream() + interfaces.entrySet().stream() .filter(i -> i.getValue().isUserCreated()) .filter(i -> !map.containsKey(i.getValue().getType())) .collect(Collectors.toMap(Entry::getKey, Entry::getValue)); @@ -460,13 +494,24 @@ public class ResourceImportManager { moduleInterfaces.putAll(userCreatedInterfaceDefinitions); } } + } - if (MapUtils.isNotEmpty(moduleInterfaces)) { - resource.setInterfaces(moduleInterfaces); - } + if (MapUtils.isNotEmpty(moduleInterfaces)) { + resource.setInterfaces(moduleInterfaces); } } + private void updateInterfaceDefinition(InterfaceDefinition interfaceDefinition, List interfaceInfoList) { + Map operations = new HashMap<>(); + interfaceInfoList.stream().filter(i -> interfaceDefinition.getType().endsWith(i.getKey())).forEach(i -> { + i.getOperations().values().forEach(o -> { + o.setImplementation(null); + }); + operations.putAll(i.getOperations()); + }); + interfaceDefinition.setOperations(operations); + } + private Either createModuleInterface(final Object interfaceJson, final String model) { try { if (interfaceJson instanceof String) { @@ -572,7 +617,7 @@ public class ResourceImportManager { for (final Entry entry : propertyDefinitionMap.entrySet()) { addPropertyToList(resource.getName(), propertiesList, entry); } - if (existingResource.isLeft()) { + if (existingResource.isLeft() && CollectionUtils.isNotEmpty(existingResource.left().value().getProperties())) { final List userCreatedResourceProperties = existingResource.left().value().getProperties().stream() .filter(PropertyDataDefinition::isUserCreated) @@ -630,6 +675,11 @@ public class ResourceImportManager { } final AttributeDefinition attributeDefinition = entry.getValue(); attributeDefinition.setName(name); + if (attributeDefinition.getEntry_schema() != null && attributeDefinition.getEntry_schema().getType() != null) { + attributeDefinition.setSchema(new SchemaDefinition()); + attributeDefinition.getSchema().setProperty(new PropertyDataDefinition()); + attributeDefinition.getSchema().getProperty().setType(entry.getValue().getEntry_schema().getType()); + } attributeDefinitionList.add(attributeDefinition); } resource.setAttributes(attributeDefinitionList); @@ -868,6 +918,18 @@ public class ResourceImportManager { getAuditingManager().auditEvent(factory); } + private void setResourceMetaData(Resource resource, String resourceYml, UploadResourceInfo resourceMetaData) { + Map ymlObj = new Yaml().load(resourceYml); + String toscaName = getToscaResourceName(ymlObj); + final Either latestByToscaName = toscaOperationFacade + .getLatestByToscaResourceName(toscaName, resourceMetaData.getModel()); + if (latestByToscaName.isLeft() && resourceMetaData instanceof DefaultUploadResourceInfo) { + setMetaDataFromLatestResource(resource, latestByToscaName.left().value()); + } else { + setMetaDataFromJson(resourceMetaData, resource); + } + } + private void setMetaDataFromJson(final UploadResourceInfo resourceMetaData, final Resource resource) { this.populateResourceMetadata(resourceMetaData, resource); resource.setCreatorUserId(resourceMetaData.getContactId()); @@ -879,6 +941,34 @@ public class ResourceImportManager { calculateResourceIsAbstract(resource, categories); } + private void setMetaDataFromLatestResource(Resource resource, Resource latestResource) { + if (resource != null && latestResource != null) { + resource.setCreatorUserId(latestResource.getContactId()); + resource.setDescription(latestResource.getDescription()); + resource.setTags(latestResource.getTags()); + resource.setCategories(latestResource.getCategories()); + resource.setContactId(latestResource.getContactId()); + resource.setName(latestResource.getName()); + resource.setIcon(latestResource.getIcon()); + resource.setResourceVendorModelNumber(latestResource.getResourceVendorModelNumber()); + resource.setResourceType(latestResource.getResourceType()); + if (latestResource.getVendorName() != null) { + resource.setVendorName(latestResource.getVendorName()); + } + if (latestResource.getVendorRelease() != null) { + resource.setVendorRelease(latestResource.getVendorRelease()); + } + if (latestResource.getModel() != null) { + resource.setModel(latestResource.getModel()); + } + if (latestResource.getToscaVersion() != null) { + resource.setToscaVersion(latestResource.getToscaVersion()); + } + final List categories = latestResource.getCategories(); + calculateResourceIsAbstract(resource, categories); + } + } + private Map decodePayload(final String payloadData) { final String decodedPayload = new String(Base64.decodeBase64(payloadData)); return (Map) new Yaml().load(decodedPayload);