From f7776389f137cb881033d77d89cc3f1eb4974077 Mon Sep 17 00:00:00 2001 From: MichaelMorris Date: Mon, 16 Aug 2021 17:28:10 +0100 Subject: [PATCH] Import VSP with non-standard data types Signed-off-by: MichaelMorris Issue-ID: SDC-3673 Change-Id: I0fd16410788da3a82c74b1d38ffa4458e85e6ccc --- .../openecomp/sdc/be/components/csar/CsarInfo.java | 76 +++++++++++++++------ .../sdc/be/components/impl/ModelBusinessLogic.java | 10 ++- .../be/components/impl/ResourceBusinessLogic.java | 27 +++++++- .../impl/ServiceImportBusinessLogic.java | 2 +- .../sdc/be/components/csar/CsarInfoTest.java | 14 ++-- .../be/components/impl/ModelBusinessLogicTest.java | 13 ++++ .../components/impl/ResourceBusinessLogicTest.java | 12 ++-- .../impl/utils/YamlTemplateParsingHandlerTest.java | 2 +- .../sdc/be/components/lifecycle/CheckoutTest.java | 4 +- .../src/test/resources/csars/nonOnapCsar.csar | Bin 13948 -> 14013 bytes catalog-be/src/test/resources/mock_service.csar | Bin 1602 -> 1744 bytes .../sdc/be/dao/jsongraph/JanusGraphDao.java | 21 +++--- .../sdc/be/dao/neo4j/GraphEdgeLabels.java | 1 + .../sdc/be/dao/neo4j/GraphEdgeLabelsTest.java | 2 +- .../sdc/be/model/DerivedNodeTypeResolver.java | 2 +- .../be/model/cache/ApplicationDataTypeCache.java | 2 +- .../ByToscaNameDerivedNodeTypeResolver.java | 4 +- .../operations/NodeTypeOperation.java | 2 +- .../operations/ToscaElementOperation.java | 2 +- .../operations/ToscaOperationFacade.java | 4 +- 20 files changed, 144 insertions(+), 56 deletions(-) diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/csar/CsarInfo.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/csar/CsarInfo.java index f5a1409e68..14ede6305b 100644 --- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/csar/CsarInfo.java +++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/csar/CsarInfo.java @@ -85,6 +85,9 @@ public class CsarInfo { private boolean isUpdate; @Getter private Map createdNodes; + private Map datatypeDefinitions; + private List> globalSubstitutes; + @SuppressWarnings("unchecked") public CsarInfo(User modifier, String csarUUID, Map csar, String vfResourceName, String mainTemplateName, @@ -101,7 +104,18 @@ public class CsarInfo { this.isUpdate = isUpdate; this.createdNodes = new HashMap<>(); this.nonManoConfiguration = NonManoConfigurationManager.getInstance().getNonManoConfiguration(); + this.globalSubstitutes = getGlobalSubstitutes(csar); } + + private List> getGlobalSubstitutes(final Map csar){ + final List> globalSubstitutesInCsar = new ArrayList<>(); + for (Map.Entry entry : csar.entrySet()) { + if (isAServiceTemplate(entry.getKey()) && isGlobalSubstitute(entry.getKey())) { + globalSubstitutesInCsar.add(entry); + } + } + return globalSubstitutesInCsar; + } @VisibleForTesting CsarInfo(final NonManoConfiguration nonManoConfiguration) { @@ -153,37 +167,56 @@ public class CsarInfo { this.isUpdate = isUpdate; } - public Map extractNodeTypesInfo() { + public Map extractTypesInfo() { Map nodeTypesInfo = new HashMap<>(); - List> globalSubstitutes = new ArrayList<>(); final Set nodeTypesUsedInNodeTemplates = new HashSet<>(); for (Map.Entry entry : getCsar().entrySet()) { - extractNodeTypeInfo(nodeTypesInfo, globalSubstitutes, nodeTypesUsedInNodeTemplates, entry); + extractNodeTypeInfo(nodeTypesInfo, nodeTypesUsedInNodeTemplates, entry); } if (CollectionUtils.isNotEmpty(globalSubstitutes)) { - setDerivedFrom(nodeTypesInfo, globalSubstitutes); - addGlobalSubstitutionsToNodeTypes(globalSubstitutes, nodeTypesUsedInNodeTemplates, nodeTypesInfo); + setDerivedFrom(nodeTypesInfo); + addGlobalSubstitutionsToNodeTypes(nodeTypesUsedInNodeTemplates, nodeTypesInfo); } + markNestedVfc(getMappedToscaMainTemplate(), nodeTypesInfo); return nodeTypesInfo; } + + public Map getDataTypes() { + if (datatypeDefinitions == null) { + datatypeDefinitions = new HashMap<>(); + for (Map.Entry entry : globalSubstitutes) { + final String yamlFileContents = new String(entry.getValue()); + final Map mappedToscaTemplate = new Yaml().load(yamlFileContents); + datatypeDefinitions.putAll(getDataTypesFromTemplate(mappedToscaTemplate)); + } + datatypeDefinitions.putAll(getDataTypesFromTemplate(mappedToscaMainTemplate)); + } + return datatypeDefinitions; + } + + @SuppressWarnings("unchecked") + private Map getDataTypesFromTemplate(final Map mappedToscaTemplate) { + final Either dataTypesEither = findToscaElement(mappedToscaTemplate, TypeUtils.ToscaTagNamesEnum.DATA_TYPES, + ToscaElementTypeEnum.MAP); + if (dataTypesEither != null && dataTypesEither.isLeft()) { + return (Map) dataTypesEither.left().value(); + } + return Collections.emptyMap(); + } @SuppressWarnings("unchecked") - private void extractNodeTypeInfo(Map nodeTypesInfo, List> globalSubstitutes, + private void extractNodeTypeInfo(Map nodeTypesInfo, final Set nodeTypesUsedInNodeTemplates, Map.Entry entry) { - if (isAServiceTemplate(entry.getKey())) { - if (isGlobalSubstitute(entry.getKey())) { - globalSubstitutes.add(entry); - } else { - Map mappedToscaTemplate = (Map) new Yaml().load(new String(entry.getValue())); - findToscaElement(mappedToscaTemplate, TypeUtils.ToscaTagNamesEnum.SUBSTITUTION_MAPPINGS, ToscaElementTypeEnum.MAP).right() - .on(sub -> handleSubstitutionMappings(nodeTypesInfo, entry, mappedToscaTemplate, (Map) sub)); - final Either nodeTypesEither = findToscaElement(mappedToscaTemplate, - TypeUtils.ToscaTagNamesEnum.NODE_TEMPLATES, ToscaElementTypeEnum.MAP); - if (nodeTypesEither.isLeft()) { - final Map> nodeTemplates = (Map>) nodeTypesEither.left().value(); - nodeTypesUsedInNodeTemplates.addAll(findNodeTypesUsedInNodeTemplates(nodeTemplates)); - } + if (isAServiceTemplate(entry.getKey()) && !isGlobalSubstitute(entry.getKey())) { + Map mappedToscaTemplate = (Map) new Yaml().load(new String(entry.getValue())); + findToscaElement(mappedToscaTemplate, TypeUtils.ToscaTagNamesEnum.SUBSTITUTION_MAPPINGS, ToscaElementTypeEnum.MAP).right() + .on(sub -> handleSubstitutionMappings(nodeTypesInfo, entry, mappedToscaTemplate, (Map) sub)); + final Either nodeTypesEither = findToscaElement(mappedToscaTemplate, + TypeUtils.ToscaTagNamesEnum.NODE_TEMPLATES, ToscaElementTypeEnum.MAP); + if (nodeTypesEither.isLeft()) { + final Map> nodeTemplates = (Map>) nodeTypesEither.left().value(); + nodeTypesUsedInNodeTemplates.addAll(findNodeTypesUsedInNodeTemplates(nodeTemplates)); } } } @@ -232,7 +265,7 @@ public class CsarInfo { } @SuppressWarnings("unchecked") - private void setDerivedFrom(Map nodeTypesInfo, List> globalSubstitutes) { + private void setDerivedFrom(Map nodeTypesInfo) { for (Map.Entry entry : globalSubstitutes) { String yamlFileContents = new String(entry.getValue()); Map mappedToscaTemplate = (Map) new Yaml().load(yamlFileContents); @@ -259,8 +292,7 @@ public class CsarInfo { } @SuppressWarnings("unchecked") - private void addGlobalSubstitutionsToNodeTypes(final List> globalSubstitutes, - final Set nodeTypesUsedInNodeTemplates, final Map nodeTypesInfo) { + private void addGlobalSubstitutionsToNodeTypes(final Set nodeTypesUsedInNodeTemplates, final Map nodeTypesInfo) { for (Map.Entry entry : globalSubstitutes) { final String yamlFileContents = new String(entry.getValue()); final Map mappedToscaTemplate = (Map) new Yaml().load(yamlFileContents); diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ModelBusinessLogic.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ModelBusinessLogic.java index de79ec165d..99349395b9 100644 --- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ModelBusinessLogic.java +++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ModelBusinessLogic.java @@ -43,10 +43,18 @@ public class ModelBusinessLogic { private static final Logger LOGGER = LoggerFactory.getLogger(ModelBusinessLogic.class); private final ModelOperation modelOperation; + private final DataTypeImportManager dataTypeImportManager; @Autowired - public ModelBusinessLogic(final ModelOperation modelOperation) { + public ModelBusinessLogic(final ModelOperation modelOperation, final DataTypeImportManager dataTypeImportManager) { this.modelOperation = modelOperation; + this.dataTypeImportManager = dataTypeImportManager; + } + + public Model createModel(final Model model, final String datatypesYaml) { + createModel(model); + dataTypeImportManager.createDataTypes(datatypesYaml, model.getName()); + return model; } public Model createModel(final Model model) { diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ResourceBusinessLogic.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ResourceBusinessLogic.java index c291c571d7..6185dc9b0e 100644 --- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ResourceBusinessLogic.java +++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ResourceBusinessLogic.java @@ -118,6 +118,7 @@ import org.openecomp.sdc.be.model.InputDefinition; import org.openecomp.sdc.be.model.InterfaceDefinition; import org.openecomp.sdc.be.model.LifeCycleTransitionEnum; import org.openecomp.sdc.be.model.LifecycleStateEnum; +import org.openecomp.sdc.be.model.Model; import org.openecomp.sdc.be.model.NodeTypeInfo; import org.openecomp.sdc.be.model.Operation; import org.openecomp.sdc.be.model.ParsedToscaYamlInfo; @@ -212,6 +213,7 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic { private final CsarBusinessLogic csarBusinessLogic; private final PropertyBusinessLogic propertyBusinessLogic; private final PolicyBusinessLogic policyBusinessLogic; + private final ModelBusinessLogic modelBusinessLogic; private IInterfaceLifecycleOperation interfaceTypeOperation; private LifecycleBusinessLogic lifecycleBusinessLogic; @Autowired @@ -225,6 +227,7 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic { @Autowired private SoftwareInformationBusinessLogic softwareInformationBusinessLogic; + @Autowired public ResourceBusinessLogic(final IElementOperation elementDao, final IGroupOperation groupOperation, final IGroupInstanceOperation groupInstanceOperation, final IGroupTypeOperation groupTypeOperation, @@ -242,7 +245,8 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic { final ComponentNameValidator componentNameValidator, final ComponentTagsValidator componentTagsValidator, final ComponentValidator componentValidator, final ComponentIconValidator componentIconValidator, final ComponentProjectCodeValidator componentProjectCodeValidator, - final ComponentDescriptionValidator componentDescriptionValidator, final PolicyBusinessLogic policyBusinessLogic) { + final ComponentDescriptionValidator componentDescriptionValidator, final PolicyBusinessLogic policyBusinessLogic, + final ModelBusinessLogic modelBusinessLogic) { super(elementDao, groupOperation, groupInstanceOperation, groupTypeOperation, groupBusinessLogic, interfaceOperation, interfaceLifecycleTypeOperation, artifactsBusinessLogic, artifactToscaOperation, componentContactIdValidator, componentNameValidator, componentTagsValidator, componentValidator, componentIconValidator, componentProjectCodeValidator, componentDescriptionValidator); @@ -258,6 +262,7 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic { this.csarBusinessLogic = csarBusinessLogic; this.propertyBusinessLogic = propertyBusinessLogic; this.policyBusinessLogic = policyBusinessLogic; + this.modelBusinessLogic = modelBusinessLogic; } static Either rollbackWithEither(final JanusGraphDao janusGraphDao, final ActionStatus actionStatus, @@ -508,7 +513,7 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic { List createdArtifacts = new ArrayList<>(); CsarInfo csarInfo = csarBusinessLogic.getCsarInfo(newResource, oldResource, user, csarUIPayload, csarUUID); lockComponent(lockedResourceId, oldResource, "update Resource From Csar"); - Map nodeTypesInfo = csarInfo.extractNodeTypesInfo(); + Map nodeTypesInfo = csarInfo.extractTypesInfo(); Either>>, ResponseFormat> findNodeTypesArtifactsToHandleRes = findNodeTypesArtifactsToHandle( nodeTypesInfo, csarInfo, oldResource); if (findNodeTypesArtifactsToHandleRes.isRight()) { @@ -1017,7 +1022,23 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic { .log(LoggerSupportabilityActions.CREATE_RESOURCE_FROM_YAML, StatusCode.STARTED, "Starting to create Resource From Csar by user {}", user.getUserId()); CsarInfo csarInfo = csarBusinessLogic.getCsarInfo(resource, null, user, csarUIPayload, csarUUID); - Map nodeTypesInfo = csarInfo.extractNodeTypesInfo(); + Map nodeTypesInfo = csarInfo.extractTypesInfo(); + if (StringUtils.isNotEmpty(resource.getModel())) { + final Map dataTypesToCreate = new HashMap<>(); + for (final String dataType: csarInfo.getDataTypes().keySet()) { + final Either result = propertyOperation.getDataTypeByName(dataType, resource.getModel()); + if (result.isRight() && result.right().value().equals(StorageOperationStatus.NOT_FOUND)) { + dataTypesToCreate.put(dataType, csarInfo.getDataTypes().get(dataType)); + } + } + if (MapUtils.isNotEmpty(dataTypesToCreate)) { + final String nameForGeneratedModel = resource.getModel() + "_" + csarInfo.getVfResourceName() + resource.getCsarVersion(); + final Model model = new Model(nameForGeneratedModel, resource.getModel()); + modelBusinessLogic.createModel(model, new Yaml().dump(dataTypesToCreate)); + resource.setModel(nameForGeneratedModel); + } + } + Either>>, ResponseFormat> findNodeTypesArtifactsToHandleRes = findNodeTypesArtifactsToHandle( nodeTypesInfo, csarInfo, resource); if (findNodeTypesArtifactsToHandleRes.isRight()) { diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ServiceImportBusinessLogic.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ServiceImportBusinessLogic.java index 1a5a996a46..6bb7fdadb9 100644 --- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ServiceImportBusinessLogic.java +++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ServiceImportBusinessLogic.java @@ -226,7 +226,7 @@ public class ServiceImportBusinessLogic { log.trace("************* created successfully from YAML, resource TOSCA "); try { CsarInfo csarInfo = csarBusinessLogic.getCsarInfo(service, null, user, csarUIPayload, csarUUID); - Map nodeTypesInfo = csarInfo.extractNodeTypesInfo(); + Map nodeTypesInfo = csarInfo.extractTypesInfo(); Either>>, ResponseFormat> findNodeTypesArtifactsToHandleRes = serviceImportParseLogic .findNodeTypesArtifactsToHandle(nodeTypesInfo, csarInfo, service); if (findNodeTypesArtifactsToHandleRes.isRight()) { diff --git a/catalog-be/src/test/java/org/openecomp/sdc/be/components/csar/CsarInfoTest.java b/catalog-be/src/test/java/org/openecomp/sdc/be/components/csar/CsarInfoTest.java index fddb79afb6..07a8ded378 100644 --- a/catalog-be/src/test/java/org/openecomp/sdc/be/components/csar/CsarInfoTest.java +++ b/catalog-be/src/test/java/org/openecomp/sdc/be/components/csar/CsarInfoTest.java @@ -127,10 +127,10 @@ public class CsarInfoTest { } @Test - public void csarCheckNodeTypesInfoTest() { + public void csarCheckTypesInfoTest() { // when - Map nodeTypeInfoMap = csarInfo.extractNodeTypesInfo(); + Map nodeTypeInfoMap = csarInfo.extractTypesInfo(); NodeTypeInfo nodeTypeInfo = nodeTypeInfoMap.get(NODE_TYPE); // then @@ -140,6 +140,10 @@ public class CsarInfoTest { assertEquals(MAIN_TEMPLATE_NAME, csarInfo.getMainTemplateName()); assertEquals(csarInfo.getMainTemplateName(), nodeTypeInfo.getTemplateFileName()); + + Map dataTypes = csarInfo.getDataTypes(); + assertTrue(dataTypes.containsKey("tosca.datatypes.testDataType.FromMainTemplate")); + assertTrue(dataTypes.containsKey("tosca.datatypes.testDataType.FromGlobalSub")); } @Test @@ -176,15 +180,15 @@ public class CsarInfoTest { final String nodeTypeInSubstitutionMapping = (String) ((Map)((Map)csarInfo.getMappedToscaMainTemplate().get("topology_template")).get("substitution_mappings")).get("node_type"); assertTrue(((Map) csarInfo.getMappedToscaMainTemplate().get("node_types")).containsKey(nodeTypeInSubstitutionMapping)); - assertTrue(csarInfo.extractNodeTypesInfo().isEmpty()); + assertTrue(csarInfo.extractTypesInfo().isEmpty()); } @Test public void testCreateCsarInfoVnfWithNodeTypeInGlobalSub() throws URISyntaxException, ZipException { final CsarInfo csarInfo = createCsarInfo("nodeTypeInGlobalSub.csar", "Definitions/MainServiceTemplate.yaml"); - assertEquals(1, csarInfo.extractNodeTypesInfo().size()); - final NodeTypeInfo nodeTypeInfo = csarInfo.extractNodeTypesInfo().get("tosca.nodes.l3vpn"); + assertEquals(1, csarInfo.extractTypesInfo().size()); + final NodeTypeInfo nodeTypeInfo = csarInfo.extractTypesInfo().get("tosca.nodes.l3vpn"); assertNotNull(nodeTypeInfo); assertEquals("Definitions/GlobalSubstitutionTypesServiceTemplate.yaml", nodeTypeInfo.getTemplateFileName()); assertEquals("tosca.nodes.l3vpn", nodeTypeInfo.getType()); diff --git a/catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/ModelBusinessLogicTest.java b/catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/ModelBusinessLogicTest.java index ef334f5510..08d0787b27 100644 --- a/catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/ModelBusinessLogicTest.java +++ b/catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/ModelBusinessLogicTest.java @@ -58,6 +58,8 @@ class ModelBusinessLogicTest { private ModelBusinessLogic modelBusinessLogic; @Mock private ModelOperation modelOperation; + @Mock + private DataTypeImportManager dataTypeImportManager; private Model model; private final Path modelImportsResourcePath = Path.of("src/test/resources/modelImports"); @@ -78,6 +80,17 @@ class ModelBusinessLogicTest { assertThat(result).isNotNull(); assertThat(result.getName()).isEqualTo(model.getName()); } + + @Test + void createModelWithDataTypesTest() { + final String dataTypes = "dummyString"; + when(modelOperation.createModel(model, false)).thenReturn(model); + final Model result = modelBusinessLogic.createModel(model, dataTypes); + assertThat(result).isNotNull(); + assertThat(result.getName()).isEqualTo(model.getName()); + + verify(dataTypeImportManager).createDataTypes(dataTypes, model.getName()); + } @Test void createModelFailTest() { diff --git a/catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/ResourceBusinessLogicTest.java b/catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/ResourceBusinessLogicTest.java index 542b142c21..6b52ed8d87 100644 --- a/catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/ResourceBusinessLogicTest.java +++ b/catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/ResourceBusinessLogicTest.java @@ -190,7 +190,8 @@ public class ResourceBusinessLogicTest { private final IGroupOperation groupOperation = Mockito.mock(IGroupOperation.class); private final IGroupInstanceOperation groupInstanceOperation = Mockito.mock(IGroupInstanceOperation.class); private final IGroupTypeOperation groupTypeOperation = Mockito.mock(IGroupTypeOperation.class); - private final GroupBusinessLogic groupBusinessLogic = Mockito.mock(GroupBusinessLogic.class); + private final GroupBusinessLogic groupBusinessLogic = Mockito.mock(GroupBusinessLogic.class); + private final ModelBusinessLogic modelBusinessLogic = Mockito.mock(ModelBusinessLogic.class); private final InterfaceOperation interfaceOperation = Mockito.mock(InterfaceOperation.class); private final ArtifactsOperations artifactToscaOperation = Mockito.mock(ArtifactsOperations.class); private final PropertyBusinessLogic propertyBusinessLogic = Mockito.mock(PropertyBusinessLogic.class); @@ -313,7 +314,7 @@ public class ResourceBusinessLogicTest { csarArtifactsAndGroupsBusinessLogic, mergeInstanceUtils, uiComponentDataConverter, csarBusinessLogic, artifactToscaOperation, propertyBusinessLogic, componentContactIdValidator, componentNameValidator, componentTagsValidator, componentValidator, componentIconValidator, componentProjectCodeValidator, - componentDescriptionValidator, policyBusinessLogic); + componentDescriptionValidator, policyBusinessLogic, modelBusinessLogic); bl.setElementDao(mockElementDao); bl.setUserAdmin(mockUserAdmin); bl.setCapabilityTypeOperation(capabilityTypeOperation); @@ -1460,6 +1461,8 @@ public class ResourceBusinessLogicTest { YamlTemplateParsingHandler yamlTemplateParser = new YamlTemplateParsingHandler(mockJanusGraphDao, null, Mockito.mock(AnnotationBusinessLogic.class), null); final ParsedToscaYamlInfo parsedToscaYamlInfo = yamlTemplateParser.parseResourceInfoFromYAML("Definitions/my_vnf.yml", resourceYml, Collections.EMPTY_MAP, Collections.EMPTY_MAP, "myVnf", resourceResponse); + when(propertyOperation.getDataTypeByName("tosca.datatypes.testDataType.FromMainTemplate", "testModel")).thenReturn(Either.right(StorageOperationStatus.NOT_FOUND)); + when(toscaOperationFacade.getLatestByToscaResourceName(anyString(), any())).thenReturn(Either.right(StorageOperationStatus.NOT_FOUND)); Resource vduCp = new Resource(); vduCp.setToscaResourceName("tosca.nodes.nfv.VduCp"); @@ -1502,6 +1505,7 @@ public class ResourceBusinessLogicTest { resourceResponse.setModel("testModel"); resourceResponse.setResourceType(ResourceTypeEnum.VF); resourceResponse.setProperties(new ArrayList<>()); + resourceResponse.setCsarVersion("1.0"); Resource derivedFrom = new Resource(); List properties = new ArrayList<>(); @@ -1513,7 +1517,7 @@ public class ResourceBusinessLogicTest { when(genericTypeBusinessLogic.fetchDerivedFromGenericType(any(), eq("tosca.nodes.nfv.VNF"))).thenReturn(Either.left(derivedFrom)); when(toscaOperationFacade - .validateComponentNameAndModelExists("myVnf", "testModel", ResourceTypeEnum.VF, ComponentTypeEnum.RESOURCE)).thenReturn(Either.left(false)); + .validateComponentNameAndModelExists("myVnf", "testModel_myVnf1.0", ResourceTypeEnum.VF, ComponentTypeEnum.RESOURCE)).thenReturn(Either.left(false)); when(toscaOperationFacade.addPropertyToComponent(any(), any(), any())).thenReturn(Either.left(new PropertyDefinition())); when(toscaOperationFacade.associateComponentInstancePropertiesToComponent(any(), any())).thenReturn(Either.left(Collections.emptyMap())); @@ -1521,7 +1525,7 @@ public class ResourceBusinessLogicTest { when(toscaOperationFacade.associateDeploymentArtifactsToInstances(any(), any(), any())).thenReturn(StorageOperationStatus.OK); when(toscaOperationFacade.associateInstAttributeToComponentToInstances(any(), any())).thenReturn(StorageOperationStatus.OK); when(toscaOperationFacade.associateResourceInstances(any(Component.class), anyString(), anyList())).thenReturn(Either.left(Collections.EMPTY_LIST)); - when(applicationDataTypeCache.getAll(resourceResponse.getModel())).thenReturn(Either.left(emptyDataTypes)); + when(applicationDataTypeCache.getAll("testModel_myVnf1.0")).thenReturn(Either.left(emptyDataTypes)); doAnswer(invocation -> { Map>> instReqs = invocation.getArgument(1); diff --git a/catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/utils/YamlTemplateParsingHandlerTest.java b/catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/utils/YamlTemplateParsingHandlerTest.java index 059dde3254..3b7ffd70cf 100644 --- a/catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/utils/YamlTemplateParsingHandlerTest.java +++ b/catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/utils/YamlTemplateParsingHandlerTest.java @@ -149,7 +149,7 @@ public class YamlTemplateParsingHandlerTest { Resource resource = new Resource(); ParsedToscaYamlInfo parsedYaml = handler.parseResourceInfoFromYAML(FILE_NAME, resourceYml, new HashMap<>(), - csarInfo.extractNodeTypesInfo(), NODE_NAME, resource); + csarInfo.extractTypesInfo(), NODE_NAME, resource); validateParsedYaml(parsedYaml, NESTED_GROUP_NAME, Lists.newArrayList("heat_file", "description")); diff --git a/catalog-be/src/test/java/org/openecomp/sdc/be/components/lifecycle/CheckoutTest.java b/catalog-be/src/test/java/org/openecomp/sdc/be/components/lifecycle/CheckoutTest.java index 47ca94dbdc..46040ca2d6 100644 --- a/catalog-be/src/test/java/org/openecomp/sdc/be/components/lifecycle/CheckoutTest.java +++ b/catalog-be/src/test/java/org/openecomp/sdc/be/components/lifecycle/CheckoutTest.java @@ -30,6 +30,7 @@ import org.openecomp.sdc.be.components.csar.CsarBusinessLogic; import org.openecomp.sdc.be.components.impl.ComponentInstanceBusinessLogic; import org.openecomp.sdc.be.components.impl.CompositionBusinessLogic; import org.openecomp.sdc.be.components.impl.InputsBusinessLogic; +import org.openecomp.sdc.be.components.impl.ModelBusinessLogic; import org.openecomp.sdc.be.components.impl.OutputsBusinessLogic; import org.openecomp.sdc.be.components.impl.PolicyBusinessLogic; import org.openecomp.sdc.be.components.impl.PropertyBusinessLogic; @@ -68,6 +69,7 @@ public class CheckoutTest extends LifecycleTestBase { private final ComponentContactIdValidator componentContactIdValidator = new ComponentContactIdValidator(componentsUtils); private final ComponentNameValidator componentNameValidator = new ComponentNameValidator(componentsUtils, toscaOperationFacade); private final PolicyBusinessLogic policyBusinessLogic = Mockito.mock(PolicyBusinessLogic.class); + private final ModelBusinessLogic modelBusinessLogic = Mockito.mock(ModelBusinessLogic.class); @InjectMocks ResourceBusinessLogic bl = new ResourceBusinessLogic(elementDao, groupOperation, groupInstanceOperation, groupTypeOperation, groupBusinessLogic, interfaceOperation, interfaceLifecycleTypeOperation, artifactsBusinessLogic, @@ -75,7 +77,7 @@ public class CheckoutTest extends LifecycleTestBase { resourceDataMergeBusinessLogic, csarArtifactsAndGroupsBusinessLogic, mergeInstanceUtils, uiComponentDataConverter, csarBusinessLogic, artifactToscaOperation, propertyBusinessLogic, componentContactIdValidator, componentNameValidator, componentTagsValidator, componentValidator, - componentIconValidator, componentProjectCodeValidator, componentDescriptionValidator ,policyBusinessLogic); + componentIconValidator, componentProjectCodeValidator, componentDescriptionValidator ,policyBusinessLogic, modelBusinessLogic); @Before public void setup() { diff --git a/catalog-be/src/test/resources/csars/nonOnapCsar.csar b/catalog-be/src/test/resources/csars/nonOnapCsar.csar index fcf6b7f2ae7653ec50c5d47f03674adb39038524..9e097051ec188d865e8b09085f537c25a3387e5b 100644 GIT binary patch delta 802 zcmV+-1Ks@mY`tx;G%tTJbrMrcsN~?C0ssIm3jhEY0000)WoBt^X>@6CZgVefd0%#J zW-fVQZEV$6O>d(x5WVv&eCvrQNk7A_+p4F{s;Z(&d$J53x7PY=ZNrLxzlMNAN=RF! zmtG?LJa68^p3LC2D+s2*xZ<8`JVh!cL3%e1R*)C|=^rki^#p+^orn5~V4$Kp-I`>w7H;S2I~Z zE7l+gQLwxMika22Gc{{iZWgl7f`c~7SZ%<1zRlC}qA$#84yNjP;s$5zsT0Vo8wzY z7?ig)cEu}55`)LCkNKWdn06dN!JTg*3x7*)K|&NvQDF$Kxb-CwSa9`caHhnNoD1&j zz9&V5_pND5{26#87Z9nsC`xNV6|i?5^Wj0oXA6R~efgD}UTKJpq})bF^Z9o+UwlLJ z2qlzw(hYyKutFWNLAPVigY)-cwF#@)gVl0PxY~d;Au~)*yj_APt^M1P*Bb7e%la{F z?A~v0VBexfzo*t+P%M6$Ax4Bd+-Eu{@!DviUux_JuA7M*0hdKT%|FO!8{5Fn^n}B^ zM|8WhrA3ezKv**HGyVvm<(=u|@=weCI7P1bwA@YI0lBbvUvV3rd4lf-IV0ssI~3IG5X0000)WoBt^X>@6CZgVefd0%#J zW-fVQZEV$6%Wm5+5WM>$xavcs0+(g+|Om4bgP$!b=CW0o5qLLR<; z&hC3a+iZrh+Im;a@(jG=MAa>ES}Ybz(yF>5D{_rVd}qMT_ZhR9(iH>%Nm(Yldo3wf zbJ;zp8WCI-Sl&WKYO7^$YK|<-fZ6BhAVe9f4Oq_)c>*u`BD_MdUra0KEoyl84CYx& z1+NIcH+_b z^_aLGF5(R9cgw^aVpH<9psj8!8Q*f6Z)O$C@SF$3$n|x zx)KKwpES_&3hX)J@PaT*i8@{TKh(m1sGIL;-5@q4-l~6E60T~URLfX#xw^b6c0c#W zw~H_+Z#&}H6G$3^Q`b|zrxjAiV^DDC17zWM!!1aNf_cUaB`vqUp@ImmevQtQ8d`F} zeK+)^i148`9f)6$M@s>bsu^pn1;ya#Iu_%Dik~eA8v61RH-pj`OQhTn9nF^?**yDz z<_GS~YomXKe(Z<`X^<28P?&WC;EE84uTW)1+xS;WW*M%dvAg}2-97u%VqeBU>)EKT z(?MA^Thq&x@0R;?jvRZp-1Y@I{PMcuA!HYy9umFNV=kCTB6t-?PQd?las0%BTdpac z=f2tJB$66~Ehi}V_kV(x_8(j)`%fNgCIaKI$Sw>|vdcHH*-18=VE+ZP{4pm34i1a+ zQhAfaYFq*U08$E*F*P?9fUg#dx_s9GfUg#dx_s9GfUg#dx_pyEswag>F(Up zM@^1%=9YamUFlQen15X4**Cv$vQ1N-&e^e= z_ds4qAnRth^rD|N6s?`uW#*rXCehQd8`0oVCRC`Ff`nlds)f$@lB} z?TmY_ob};eFQO&x9@+8ObQ9||m(!AG>;t@+Swz5L;Q$Pao&5Y}uNgQQ7$yJ%Lym!A zV!C{NYQX6%W<#DmzqP-xdRKp4D6mbWN<;VUyTn-<)ziMg}5+CWWVzLsd<*~yGE>N*mu{!8(1=vI8% z&`=*Yd#YfcbkCdD*|Ur}Hu0Q2)?L0yG=)1M!C%^HRsDktspr?ujxyhKMdrTEQqI{+ z#ka6Uv92jO_TbsETh`6z=eVXWebyA}F?m6I=Fzu{1z#;G-F)5g_@0`(>lStG*AC?o zOWSV{_famhacR)6cYd)sYz4xjC*e1_xapmlshJKS}WrpBRDjGX@P^` zPV7EE!O{d-kI4bd^_xwYxEUv(XO7XZXNCk8X2MYcY6Agx^GchoDvw(B~0DRXm A1^@s6 delta 611 zcmcb>dx&R(zXSsV0|&#zq`}+B=}o_WFW!Ag-$#>O@#l}` z5Ds4L(htt3b$w_0B=i=qVD?%2&RV8cbJo0!?K}6L*(UbWKBJ7$cY5+lwRhYB-pni_ zV1MYP?(_Ta;8Q*g$U6tb<_t0u(=CAB;ACKq*!(^QgwebZ+PjhOkO7a&_nOxI3!1hv z3%xqh!g6=TtzEN6inq`UtR6?@^#AYcYS`l8k5%vyYoKSc%ki{UTgCI<+d}f)-Y~%VCH3xe@MobKoW0{R6hq7rf)iX`5XS1EWfK`LpmYHGlStjktyV!WR;+Ys2&N72c F0RY0K=C=R< diff --git a/catalog-dao/src/main/java/org/openecomp/sdc/be/dao/jsongraph/JanusGraphDao.java b/catalog-dao/src/main/java/org/openecomp/sdc/be/dao/jsongraph/JanusGraphDao.java index 76fddc070b..8614f4beb4 100644 --- a/catalog-dao/src/main/java/org/openecomp/sdc/be/dao/jsongraph/JanusGraphDao.java +++ b/catalog-dao/src/main/java/org/openecomp/sdc/be/dao/jsongraph/JanusGraphDao.java @@ -587,16 +587,21 @@ public class JanusGraphDao { } private boolean vertexValidForModel(final JanusGraphVertex vertex, final String model) { - final Either>, JanusGraphOperationStatus> modelVertices = getParentVerticies(vertex, GraphEdgeLabels.MODEL_ELEMENT); + final String vertexLabel = (String)vertex.property(GraphPropertyEnum.LABEL.getProperty()).value(); + final VertexTypeEnum vertexType = VertexTypeEnum.getByName(vertexLabel); + final GraphEdgeLabels edgeLabel = vertexType.equals(VertexTypeEnum.TOPOLOGY_TEMPLATE) ? GraphEdgeLabels.MODEL : GraphEdgeLabels.MODEL_ELEMENT; + final Either>, JanusGraphOperationStatus> modelVertices = getParentVerticies(vertex, edgeLabel); - if (modelVertices.isLeft()) { - for (ImmutablePair vertexPair : modelVertices.left().value()) { - if (model.equals((String)vertexPair.getLeft().property("name").value())) { - return true; - } - } + return modelVertices.isLeft() && modelVertices.left().value().stream().anyMatch(vertexPair -> modelVertexMatchesModel(vertexPair.getLeft(), model)); + } + + private boolean modelVertexMatchesModel(final JanusGraphVertex modelVertex, final String model) { + if (model.equals((String)modelVertex.property("name").value())) { + return true; } - return false; + final Either>, JanusGraphOperationStatus> derivedModels = + getParentVerticies(modelVertex, GraphEdgeLabels.DERIVED_FROM); + return derivedModels.isLeft() && derivedModels.left().value().stream().anyMatch(derivedModel ->modelVertexMatchesModel(derivedModel.left, model)); } private Either>, JanusGraphOperationStatus> getParentVerticies( diff --git a/catalog-dao/src/main/java/org/openecomp/sdc/be/dao/neo4j/GraphEdgeLabels.java b/catalog-dao/src/main/java/org/openecomp/sdc/be/dao/neo4j/GraphEdgeLabels.java index 7dbcc87eb4..4ed16a42ec 100644 --- a/catalog-dao/src/main/java/org/openecomp/sdc/be/dao/neo4j/GraphEdgeLabels.java +++ b/catalog-dao/src/main/java/org/openecomp/sdc/be/dao/neo4j/GraphEdgeLabels.java @@ -71,6 +71,7 @@ public enum GraphEdgeLabels { PARAMETER_VALUE("PARAMETER_VALUE"), PARAMETER_IMPL("PARAMETER_IMPL"), MODEL_ELEMENT("MODEL_ELEMENT"), + MODEL("MODEL"), // VF additions CALCULATED_REQUIREMENT("CALCULATED_REQUIREMENT"), CALCULATED_CAPABILITY("CALCULATED_CAPABILITY"), diff --git a/catalog-dao/src/test/java/org/openecomp/sdc/be/dao/neo4j/GraphEdgeLabelsTest.java b/catalog-dao/src/test/java/org/openecomp/sdc/be/dao/neo4j/GraphEdgeLabelsTest.java index bfa940929a..37f1707e41 100644 --- a/catalog-dao/src/test/java/org/openecomp/sdc/be/dao/neo4j/GraphEdgeLabelsTest.java +++ b/catalog-dao/src/test/java/org/openecomp/sdc/be/dao/neo4j/GraphEdgeLabelsTest.java @@ -28,7 +28,7 @@ import static org.junit.jupiter.api.Assertions.assertNull; public class GraphEdgeLabelsTest { @Test public void testGetAllProperties() throws Exception { - assertEquals(56, GraphEdgeLabels.getAllProperties().size()); + assertEquals(57, GraphEdgeLabels.getAllProperties().size()); } @Test diff --git a/catalog-model/src/main/java/org/openecomp/sdc/be/model/DerivedNodeTypeResolver.java b/catalog-model/src/main/java/org/openecomp/sdc/be/model/DerivedNodeTypeResolver.java index 934a43bc38..4cf78adfca 100644 --- a/catalog-model/src/main/java/org/openecomp/sdc/be/model/DerivedNodeTypeResolver.java +++ b/catalog-model/src/main/java/org/openecomp/sdc/be/model/DerivedNodeTypeResolver.java @@ -26,5 +26,5 @@ import org.openecomp.sdc.be.dao.jsongraph.GraphVertex; public interface DerivedNodeTypeResolver { - Either, JanusGraphOperationStatus> findDerivedResources(String parentResource); + Either, JanusGraphOperationStatus> findDerivedResources(String parentResource, String modelName); } diff --git a/catalog-model/src/main/java/org/openecomp/sdc/be/model/cache/ApplicationDataTypeCache.java b/catalog-model/src/main/java/org/openecomp/sdc/be/model/cache/ApplicationDataTypeCache.java index 070ebf72e3..954df91552 100644 --- a/catalog-model/src/main/java/org/openecomp/sdc/be/model/cache/ApplicationDataTypeCache.java +++ b/catalog-model/src/main/java/org/openecomp/sdc/be/model/cache/ApplicationDataTypeCache.java @@ -168,7 +168,7 @@ public class ApplicationDataTypeCache implements ApplicationCache, JanusGraphOperationStatus> getAll(final String model) { try { readWriteLock.readLock().lock(); - if (MapUtils.isEmpty(dataTypesByModelCacheMap)) { + if (MapUtils.isEmpty(dataTypesByModelCacheMap) || !dataTypesByModelCacheMap.containsKey(model)) { final var dataTypesFound = getAllDataTypesFromGraph(); if (dataTypesFound.isRight()) { return Either.right(dataTypesFound.right().value()); diff --git a/catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/operations/ByToscaNameDerivedNodeTypeResolver.java b/catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/operations/ByToscaNameDerivedNodeTypeResolver.java index 743fcdec44..4b6c084a89 100644 --- a/catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/operations/ByToscaNameDerivedNodeTypeResolver.java +++ b/catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/operations/ByToscaNameDerivedNodeTypeResolver.java @@ -41,10 +41,10 @@ public class ByToscaNameDerivedNodeTypeResolver implements DerivedNodeTypeResolv private JanusGraphDao janusGraphDao; @Override - public Either, JanusGraphOperationStatus> findDerivedResources(String parentResource) { + public Either, JanusGraphOperationStatus> findDerivedResources(String parentResource, final String modelName) { Map propertiesToMatch = new HashMap<>(); propertiesToMatch.put(GraphPropertyEnum.STATE, LifecycleStateEnum.CERTIFIED.name()); propertiesToMatch.put(GraphPropertyEnum.TOSCA_RESOURCE_NAME, parentResource); - return janusGraphDao.getByCriteria(VertexTypeEnum.NODE_TYPE, propertiesToMatch, JsonParseFlagEnum.ParseMetadata); + return janusGraphDao.getByCriteria(VertexTypeEnum.NODE_TYPE, propertiesToMatch, null, JsonParseFlagEnum.ParseMetadata, modelName); } } diff --git a/catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/operations/NodeTypeOperation.java b/catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/operations/NodeTypeOperation.java index 76d8e71c69..2025a103a6 100644 --- a/catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/operations/NodeTypeOperation.java +++ b/catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/operations/NodeTypeOperation.java @@ -576,7 +576,7 @@ public class NodeTypeOperation extends ToscaElementOperation { if (derivedFromResources != null && !derivedFromResources.isEmpty()) { for (String parentResource : derivedFromResources) { Either, JanusGraphOperationStatus> getParentResources = derivedResourceResolver - .findDerivedResources(parentResource); + .findDerivedResources(parentResource, nodeType.getModel()); List resources = null; if (getParentResources.isRight()) { log.error("Cannot find parent resource by tosca resource name {} in the graph.", parentResource); diff --git a/catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/operations/ToscaElementOperation.java b/catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/operations/ToscaElementOperation.java index d0f1c3a9dd..a288953a71 100644 --- a/catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/operations/ToscaElementOperation.java +++ b/catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/operations/ToscaElementOperation.java @@ -279,7 +279,7 @@ public abstract class ToscaElementOperation extends BaseOperation { .getParentVertex(previousToscaElement, EdgeLabelEnum.MODEL, JsonParseFlagEnum.NoParse); if (modelElementVertexResponse.isLeft()) { final JanusGraphOperationStatus status = janusGraphDao - .createEdge(nextToscaElement.getVertex(), createdToscaElementVertex.getVertex(), EdgeLabelEnum.MODEL, new HashMap<>()); + .createEdge(modelElementVertexResponse.left().value().getVertex(), createdToscaElementVertex.getVertex(), EdgeLabelEnum.MODEL, new HashMap<>()); if (JanusGraphOperationStatus.OK != status) { CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, FAILED_TO_CREATE_EDGE_WITH_LABEL_FROM_USER_VERTEX_TO_TOSCA_ELEMENT_VERTEX_ON_GRAPH_STATUS_IS, EdgeLabelEnum.MODEL, diff --git a/catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/operations/ToscaOperationFacade.java b/catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/operations/ToscaOperationFacade.java index 6466683db6..2f11fa9e8f 100644 --- a/catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/operations/ToscaOperationFacade.java +++ b/catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/operations/ToscaOperationFacade.java @@ -2191,9 +2191,7 @@ public class ToscaOperationFacade { hasNotProps.put(GraphPropertyEnum.IS_DELETED, true); hasNotProps.put(GraphPropertyEnum.IS_ARCHIVED, true); hasProps.put(GraphPropertyEnum.IS_HIGHEST_VERSION, true); - if (modelName != null) { - hasProps.put(GraphPropertyEnum.MODEL, modelName); - } + if (VertexTypeEnum.NODE_TYPE == internalVertexType) { hasProps.put(GraphPropertyEnum.IS_ABSTRACT, isAbstract); if (internalComponentType != null) { -- 2.16.6