diff options
author | 2023-08-05 18:28:19 +0100 | |
---|---|---|
committer | 2023-08-17 13:15:28 +0000 | |
commit | 7c61c7bb0369bc27d05c8801c8cb0cca41e494bf (patch) | |
tree | 1ed171980ca863d486a8830c1fe591d581bbc1fa /catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ResourceImportManager.java | |
parent | a54910e9b98e78cf543c5245417eeaf9256b242e (diff) |
Fix 'Import use case fails when interfaces in template do not exist in system'-bug (p.2)
No interfaces defined on the VFC:
- SDC create the basic interface operations on the VFC - Create / Delete etc - with no implementation details
- Add the implementations to the interface on the Service side
If interfaces are defined on the VFC with no implementation details defined:
- SDC import successfully and add the implementation details to the interface on the Service side
Signed-off-by: Vasyl Razinkov <vasyl.razinkov@est.tech>
Change-Id: If966a64b865791eed0cf29c8da8f04e44eb32e50
Issue-ID: SDC-4591
Diffstat (limited to 'catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ResourceImportManager.java')
-rw-r--r-- | catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ResourceImportManager.java | 58 |
1 files changed, 45 insertions, 13 deletions
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 8976753638..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 @@ -66,6 +66,7 @@ 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; @@ -84,10 +85,11 @@ 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.NullNodeTypeMetadata; 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; @@ -154,13 +156,14 @@ public class ResourceImportManager { } public ImmutablePair<Resource, ActionStatus> importNormativeResource(final String resourceYml, final UploadResourceInfo resourceMetaData, + final Map<String, UploadComponentInstanceInfo> instancesFromCsar, final User creator, final boolean createNewVersion, final boolean needLock, final boolean isInTransaction) { LifecycleChangeInfoWithAction lifecycleChangeInfo = new LifecycleChangeInfoWithAction(); lifecycleChangeInfo.setUserRemarks("certification on import"); Function<Resource, Boolean> 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, @@ -176,11 +179,11 @@ public class ResourceImportManager { return; } final Map<String, Object> nodeTypesMap = (Map<String, Object>) nodeTypesYamlMap.get(ToscaTagNamesEnum.NODE_TYPES.getElementName()); - importAllNormativeResource(nodeTypesMap, nodeTypesMetadataList, user, "", createNewVersion,needLock); + importAllNormativeResource(nodeTypesMap, nodeTypesMetadataList, null, user, "", createNewVersion,needLock); } public void importAllNormativeResource(final Map<String, Object> nodeTypesMap, final NodeTypesMetadataList nodeTypesMetadataList, - final User user, String model, final boolean createNewVersion, final boolean needLock) { + Map<String, UploadComponentInstanceInfo> instancesFromCsar, final User user, String model, final boolean createNewVersion, final boolean needLock) { try { nodeTypesMetadataList.getNodeMetadataList().forEach(nodeTypeMetadata -> { final String nodeTypeToscaName = nodeTypeMetadata.getToscaName(); @@ -199,7 +202,7 @@ public class ResourceImportManager { uploadResourceInfo.setModel(model); uploadResourceInfo.setContactId(user.getUserId()); } - importNormativeResource(nodeTypeYaml, uploadResourceInfo, user, createNewVersion, needLock, true); + importNormativeResource(nodeTypeYaml, uploadResourceInfo, instancesFromCsar, user, createNewVersion, needLock, true); } }); janusGraphDao.commit(); @@ -209,6 +212,15 @@ public class ResourceImportManager { } } + public ImmutablePair<Resource, ActionStatus> importNormativeResourceFromCsar(String resourceYml, UploadResourceInfo resourceMetaData, + User creator, boolean createNewVersion, boolean needLock) { + LifecycleChangeInfoWithAction lifecycleChangeInfo = new LifecycleChangeInfoWithAction(); + lifecycleChangeInfo.setUserRemarks("certification on import"); + Function<Resource, Boolean> validator = resource -> resourceBusinessLogic.validatePropertiesDefaultValues(resource); + return importCertifiedResource(resourceYml, resourceMetaData, creator, validator, lifecycleChangeInfo, false, createNewVersion, needLock, + null, null, false, null, null, false, null); + } + public ImmutablePair<Resource, ActionStatus> importCertifiedResource(String resourceYml, UploadResourceInfo resourceMetaData, User creator, Function<Resource, Boolean> validationFunction, LifecycleChangeInfoWithAction lifecycleChangeInfo, boolean isInTransaction, @@ -216,7 +228,7 @@ public class ResourceImportManager { Map<ArtifactOperationEnum, List<ArtifactDefinition>> nodeTypeArtifactsToHandle, List<ArtifactDefinition> nodeTypesNewCreatedArtifacts, boolean forceCertificationAllowed, CsarInfo csarInfo, String nodeName, - boolean isNested) { + boolean isNested, Map<String, UploadComponentInstanceInfo> instancesFromCsar) { Resource resource = new Resource(); ImmutablePair<Resource, ActionStatus> responsePair = new ImmutablePair<>(resource, ActionStatus.CREATED); Either<ImmutablePair<Resource, ActionStatus>, ResponseFormat> response = Either.left(responsePair); @@ -225,7 +237,7 @@ public class ResourceImportManager { boolean shouldBeCertified = nodeTypeArtifactsToHandle == null || nodeTypeArtifactsToHandle.isEmpty(); setConstantMetaData(resource, shouldBeCertified); setResourceMetaData(resource, resourceYml, resourceMetaData); - populateResourceFromYaml(resourceYml, resource); + populateResourceFromYaml(resourceYml, resource, instancesFromCsar); validationFunction.apply(resource); resource.getComponentMetadataDefinition().getMetadataDataDefinition().setNormative(resourceMetaData.isNormative()); checkResourceExists(createNewVersion, csarInfo, resource); @@ -341,7 +353,7 @@ public class ResourceImportManager { ImmutablePair<Resource, ActionStatus> 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"); @@ -356,7 +368,7 @@ public class ResourceImportManager { return responsePair; } - private void populateResourceFromYaml(final String resourceYml, Resource resource) { + private void populateResourceFromYaml(final String resourceYml, Resource resource, Map<String, UploadComponentInstanceInfo> instancesFromCsar) { @SuppressWarnings("unchecked") Object ymlObj = new Yaml().load(resourceYml); if (ymlObj instanceof Map) { final Either<Resource, StorageOperationStatus> existingResource = getExistingResource(resource); @@ -383,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); } @@ -441,20 +453,29 @@ public class ResourceImportManager { return null; } - private void setInterfaceLifecycle(Map<String, Object> toscaJson, Resource resource, Either<Resource, StorageOperationStatus> existingResource) { + private void setInterfaceLifecycle(Map<String, Object> toscaJson, Resource resource, Either<Resource, StorageOperationStatus> existingResource, + Map<String, UploadComponentInstanceInfo> instancesFromCsar) { final Either<Map<String, Object>, ResultStatusEnum> toscaInterfaces = ImportUtils .findFirstToscaMapElement(toscaJson, ToscaTagNamesEnum.INTERFACES); final Map<String, InterfaceDefinition> moduleInterfaces = new HashMap<>(); final Map<String, Object> map; + List<UploadInterfaceInfo> 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()) { map = toscaInterfaces.left().value(); for (final Entry<String, Object> interfaceNameValue : map.entrySet()) { - final Either<InterfaceDefinition, ResultStatusEnum> eitherInterface = createModuleInterface(interfaceNameValue.getValue(), - resource.getModel()); + final Either<InterfaceDefinition, ResultStatusEnum> 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); } } @@ -480,6 +501,17 @@ public class ResourceImportManager { } } + private void updateInterfaceDefinition(InterfaceDefinition interfaceDefinition, List<UploadInterfaceInfo> interfaceInfoList) { + Map<String, OperationDataDefinition> 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<InterfaceDefinition, ResultStatusEnum> createModuleInterface(final Object interfaceJson, final String model) { try { if (interfaceJson instanceof String) { |