Add sdc-be-init support for artifact types 14/126614/1
authorvasraz <vasyl.razinkov@est.tech>
Mon, 17 Jan 2022 14:29:03 +0000 (14:29 +0000)
committerVasyl Razinkov <vasyl.razinkov@est.tech>
Mon, 17 Jan 2022 14:33:08 +0000 (14:33 +0000)
Change-Id: Id9fdaf7b7bf0cd5d583434fbe97741dd9836df9d
Signed-off-by: Vasyl Razinkov <vasyl.razinkov@est.tech>
Issue-ID: SDC-3845

catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ArtifactTypeImportManager.java
catalog-be/src/main/resources/import/tosca/artifact-types/artifactTypes.yml
catalog-be/src/main/resources/scripts/sdcBePy/tosca/imports/run.py
catalog-be/src/main/resources/scripts/sdcBePy/tosca/models/normativeElementsList.py
catalog-model/src/main/java/org/openecomp/sdc/be/model/operations/impl/ArtifactTypeOperation.java
catalog-model/src/test/java/org/openecomp/sdc/be/model/operations/impl/ModelOperationTest.java
catalog-model/src/test/resources/modelOperation/expected-additional_types-3.yaml [new file with mode: 0644]
catalog-model/src/test/resources/modelOperation/expected-import-3.yaml [new file with mode: 0644]
catalog-model/src/test/resources/modelOperation/input-artifact_types.yaml [new file with mode: 0644]
catalog-model/src/test/resources/modelOperation/original-additional_types-2.yaml [new file with mode: 0644]
catalog-model/src/test/resources/modelOperation/original-import-3.yaml [new file with mode: 0644]

index e6ff100..441dfa7 100644 (file)
@@ -60,7 +60,7 @@ public class ArtifactTypeImportManager {
             return Either.right(componentsUtils.getResponseFormat(artifactTypes.right().value()));
         }
         final List<ArtifactTypeDefinition> elementTypes = createArtifactTypesByDao(artifactTypes.left().value());
-        if (includeToModelDefaultImports) {
+        if (includeToModelDefaultImports && StringUtils.isNotEmpty(modelName)) {
             commonImportManager.addTypesToDefaultImports(ElementTypeEnum.ARTIFACT_TYPE, artifactTypesYml, modelName);
         }
         return Either.left(elementTypes);
index bfd0789..97d00e5 100644 (file)
@@ -1,39 +1,40 @@
 tosca.artifacts.Root:
-  description: This is the default (root) TOSCA Artifact Type definition that all other TOSCA base Artifact Types derive from.
+    description: This is the default (root) TOSCA Artifact Type definition that all other TOSCA base Artifact Types derive from.
 
 tosca.artifacts.Deployment.Image:
-  derived_from: tosca.artifacts.Deployment
-  description: This artifact type represents a parent type for any "image" which is an opaque packaging of a TOSCA Node's deployment (whether real or virtual) whose contents are typically already installed and pre-configured (i.e., "stateful") and prepared to be run on a known target container.
+    derived_from: tosca.artifacts.Deployment
+    description: This artifact type represents a parent type for any "image" which is an opaque packaging of a TOSCA Node's deployment (whether real or virtual) whose contents are typically already installed and pre-configured (i.e., "stateful") and prepared to be run on a known target container.
 
 tosca.artifacts.Implementation.Bash:
-  derived_from: tosca.artifacts.Implementation
-  description: This artifact type represents a Bash script type that contains Bash commands that can be executed on the Unix Bash shell.
+    derived_from: tosca.artifacts.Implementation
+    description: This artifact type represents a Bash script type that contains Bash commands that can be executed on the Unix Bash shell.
 
 tosca.artifacts.Deployment.Image.VM:
-  derived_from: tosca.artifacts.Deployment
-  description: This artifact represents the parent type for all Virtual Machine (VM) image and container formatted deployment artifacts. These images contain a stateful capture of a machine (e.g., server) including operating system and installed software along with any configurations and can be run on another machine using a hypervisor which virtualizes typical server (i.e., hardware) resources.
+    derived_from: tosca.artifacts.Deployment
+    description: This artifact represents the parent type for all Virtual Machine (VM) image and container formatted deployment artifacts. These images contain a stateful capture of a machine (e.g., server) including operating system and installed software along with any configurations and can be run on another machine using a hypervisor which virtualizes typical server (i.e., hardware) resources.
 
 tosca.artifacts.Implementation.Python:
-  derived_from: tosca.artifacts.Implementation
-  description: This artifact type represents a Python file that contains Python language constructs that can be executed within a Python interpreter.
+    derived_from: tosca.artifacts.Implementation
+    description: This artifact type represents a Python file that contains Python language constructs that can be executed within a Python interpreter.
 
 tosca.artifacts.Deployment:
-  derived_from: tosca.artifacts.Root
-  description: This artifact type represents the parent type for all deployment artifacts in TOSCA. This class of artifacts typically represents a binary packaging of an application or service that is used to install/create or deploy it as part of a node's lifecycle.
+    derived_from: tosca.artifacts.Root
+    description: This artifact type represents the parent type for all deployment artifacts in TOSCA. This class of artifacts typically represents a binary packaging of an application or service that is used to install/create or deploy it as part of a node's lifecycle.
 
 tosca.artifacts.File:
-  derived_from: tosca.artifacts.Root
-  description: This artifact type is used when an artifact definition needs to have its associated file simply treated as a file and no special handling/handlers are invoked (i.e., it is not treated as either an implementation or deployment artifact type).
+    derived_from: tosca.artifacts.Root
+    description: This artifact type is used when an artifact definition needs to have its associated file simply treated as a file and no special handling/handlers are invoked (i.e., it is not treated as either an implementation or deployment artifact type).
 
 tosca.artifacts.Implementation:
-  derived_from: tosca.artifacts.Root
-  description: This artifact type represents the parent type for all implementation artifacts in TOSCA. These artifacts are used to implement operations of TOSCA interfaces either directly (e.g., scripts) or indirectly (e.g., config. files).
+    derived_from: tosca.artifacts.Root
+    description: This artifact type represents the parent type for all implementation artifacts in TOSCA. These artifacts are used to implement operations of TOSCA interfaces either directly (e.g., scripts) or indirectly (e.g., config. files).
 
 tosca.artifacts.nfv.SwImage:
-  derived_from: tosca.artifacts.Deployment.Image
-  description: describes the software image which is directly loaded on the virtualisation container realizing of the VDU or is to be loaded on a virtual
+    derived_from: tosca.artifacts.Deployment.Image
+    description: describes the software image which is directly loaded on the virtualisation container realizing of the VDU or is to be loaded on a virtual
+
 tosca.artifacts.Implementation.nfv.Mistral:
-  derived_from: tosca.artifacts.Implementation
-  description: artifacts for Mistral workflows
-  mime_type: application/x-yaml
-  file_ext: [ yaml ]
+    derived_from: tosca.artifacts.Implementation
+    description: artifacts for Mistral workflows
+    mime_type: application/x-yaml
+    file_ext: [ yaml ]
index db6e914..9ba770d 100644 (file)
@@ -24,7 +24,7 @@ def main(sdc_be_proxy, update_version):
         process_element_list(normativeElementsList.get_normative_element_candidate_list(base_file_location), sdc_be_proxy)
         process_type_list(normativeTypesList.get_normative_type_candidate_list(base_file_location), sdc_be_proxy, update_version)
         process_element_list(normativeElementsList.get_normative_element_with_metadata_list(base_file_location), sdc_be_proxy)
-        #Add model based normatives
+        # Add model based normatives
         model_import_manager = ModelImportManager(Path(base_file_location) / 'models', ModelClient(sdc_be_proxy),
                                                   NodeTypeClient(sdc_be_proxy))
         model_import_manager.deploy_models()
@@ -37,6 +37,7 @@ def main(sdc_be_proxy, update_version):
     logger.log("Script end ->", "All normatives imported successfully!")
     logger.print_and_exit(0, None)
 
+
 def run():
     sdc_be_proxy, update_version = parse_and_create_proxy()
     main(sdc_be_proxy, update_version)
index ffd412f..6d00bb0 100644 (file)
@@ -1,78 +1,91 @@
 from os import path
+
 from sdcBePy.tosca.models.normativeElementCandidate import NormativeElementCandidate
 
+
 def get_normative_element_candidate_list(base_file_location):
     return [
         get_data(base_file_location),
         get_capability(base_file_location),
         get_relationship(base_file_location),
         get_interface_lifecycle(base_file_location),
-        get_categories(base_file_location)
+        get_categories(base_file_location),
+        get_artifacts(base_file_location)
     ]
 
+
 def get_normative_element_with_metadata_list(base_file_location):
     return [
         get_group(base_file_location),
         get_policy(base_file_location)
     ]
 
+
 def get_normative_candidate(base_file_location, url, filename, zip_name, with_metadata=False):
     if path.isdir(base_file_location):
         return NormativeElementCandidate(base_file_location, url, filename, zip_name, with_metadata=with_metadata)
 
+
 def get_data(base_file_location="/"):
     return get_normative_candidate(base_file_location + "data-types/",
-                                     "/sdc2/rest/v1/catalog/uploadType/datatypes",
-                                     "dataTypes",
-                                     "dataTypesZip")
+                                   "/sdc2/rest/v1/catalog/uploadType/datatypes",
+                                   "dataTypes",
+                                   "dataTypesZip")
 
 
 def get_capability(base_file_location="/"):
     return get_normative_candidate(base_file_location + "capability-types/",
-                                     "/sdc2/rest/v1/catalog/uploadType/capability",
-                                     "capabilityTypes",
-                                     "capabilityTypeZip")
+                                   "/sdc2/rest/v1/catalog/uploadType/capability",
+                                   "capabilityTypes",
+                                   "capabilityTypeZip")
 
 
 def get_relationship(base_file_location="/"):
     return get_normative_candidate(base_file_location + "relationship-types/",
-                                     "/sdc2/rest/v1/catalog/uploadType/relationship",
-                                     "relationshipTypes",
-                                     "relationshipTypeZip")
+                                   "/sdc2/rest/v1/catalog/uploadType/relationship",
+                                   "relationshipTypes",
+                                   "relationshipTypeZip")
 
 
 def get_interface_lifecycle(base_file_location="../../../import/tosca/"):
     return get_normative_candidate(base_file_location + "interface-lifecycle-types/",
-                                     "/sdc2/rest/v1/catalog/uploadType/interfaceLifecycle",
-                                     "interfaceLifecycleTypes",
-                                     "interfaceLifecycleTypeZip")
+                                   "/sdc2/rest/v1/catalog/uploadType/interfaceLifecycle",
+                                   "interfaceLifecycleTypes",
+                                   "interfaceLifecycleTypeZip")
 
 
 def get_categories(base_file_location="/"):
     return get_normative_candidate(base_file_location + "categories/",
-                                     "/sdc2/rest/v1/catalog/uploadType/categories",
-                                     "categoryTypes",
-                                     "categoriesZip")
+                                   "/sdc2/rest/v1/catalog/uploadType/categories",
+                                   "categoryTypes",
+                                   "categoriesZip")
+
+
+def get_artifacts(base_file_location="/"):
+    return get_normative_candidate(base_file_location + "artifact-types/",
+                                   "/sdc2/rest/v1/catalog/uploadType/artifactTypes",
+                                   "artifactTypes",
+                                   "artifactsZip")
 
 
 def get_group(base_file_location="/"):
     return get_normative_candidate(base_file_location + "group-types/",
-                                     "/sdc2/rest/v1/catalog/uploadType/grouptypes",
-                                     "groupTypes",
-                                     "groupTypesZip",
-                                     with_metadata=True)
+                                   "/sdc2/rest/v1/catalog/uploadType/grouptypes",
+                                   "groupTypes",
+                                   "groupTypesZip",
+                                   with_metadata=True)
 
 
 def get_policy(base_file_location="/"):
     return get_normative_candidate(base_file_location + "policy-types/",
-                                     "/sdc2/rest/v1/catalog/uploadType/policytypes",
-                                     "policyTypes",
-                                     "policyTypesZip",
-                                     with_metadata=True)
+                                   "/sdc2/rest/v1/catalog/uploadType/policytypes",
+                                   "policyTypes",
+                                   "policyTypesZip",
+                                   with_metadata=True)
 
 
 def get_annotation(base_file_location="/"):
     return get_normative_candidate(base_file_location + "annotation-types/",
-                                     "/sdc2/rest/v1/catalog/uploadType/annotationtypes",
-                                     "annotationTypes",
-                                     "annotationTypesZip")
+                                   "/sdc2/rest/v1/catalog/uploadType/annotationtypes",
+                                   "annotationTypes",
+                                   "annotationTypesZip")
index 4b1dcfb..d8a78cd 100644 (file)
@@ -204,7 +204,7 @@ public class ArtifactTypeOperation implements IArtifactTypeOperation {
     private void addDerivedFromRelation(final ArtifactTypeDefinition artifactType) {
         final String derivedFrom = artifactType.getDerivedFrom();
         final String artifactId = artifactType.getUniqueId();
-        if (derivedFrom.isEmpty()) {
+        if (derivedFrom == null || derivedFrom.isEmpty()) {
             return;
         }
         final var getArtifactTypeOptional = getLatestArtifactTypeByType(derivedFrom, artifactType.getModel());
index a27177a..42f5298 100644 (file)
@@ -81,6 +81,7 @@ import org.springframework.test.context.ContextConfiguration;
 @ContextConfiguration("classpath:application-context-test.xml")
 class ModelOperationTest extends ModelTestBase {
 
+    private static final String modelName = "ETSI-SDC-MODEL-TEST";
     @InjectMocks
     private ModelOperation modelOperation;
     @Mock
@@ -92,8 +93,6 @@ class ModelOperationTest extends ModelTestBase {
     @Mock
     private DerivedFromOperation derivedFromOperation;
 
-    private final String modelName = "ETSI-SDC-MODEL-TEST";
-
     @BeforeAll
     static void beforeAllInit() {
         init();
@@ -106,26 +105,28 @@ class ModelOperationTest extends ModelTestBase {
 
     @Test
     void createModelSuccessTest() {
-        final ModelData modelData = new ModelData(modelName,  UniqueIdBuilder.buildModelUid(modelName), ModelTypeEnum.NORMATIVE);
-        when(janusGraphGenericDao.createNode(any(),any())).thenReturn(Either.left(modelData));
+        final ModelData modelData = new ModelData(modelName, UniqueIdBuilder.buildModelUid(modelName), ModelTypeEnum.NORMATIVE);
+        when(janusGraphGenericDao.createNode(any(), any())).thenReturn(Either.left(modelData));
         final Model createdModel = modelOperation.createModel(new Model(modelName, ModelTypeEnum.NORMATIVE), false);
         assertThat(createdModel).isNotNull();
         assertThat(createdModel.getName()).isEqualTo(modelName);
     }
-    
+
     @Test
     void createDerivedModelSuccessTest() {
         final String derivedModelName = "derivedModel";
-        final ModelData modelData = new ModelData(derivedModelName,  UniqueIdBuilder.buildModelUid(derivedModelName), ModelTypeEnum.NORMATIVE);
-        when(janusGraphGenericDao.createNode(any(),any())).thenReturn(Either.left(modelData));
-        
+        final ModelData modelData = new ModelData(derivedModelName, UniqueIdBuilder.buildModelUid(derivedModelName), ModelTypeEnum.NORMATIVE);
+        when(janusGraphGenericDao.createNode(any(), any())).thenReturn(Either.left(modelData));
+
         final GraphVertex modelVertex = new GraphVertex();
         modelVertex.addMetadataProperty(GraphPropertyEnum.NAME, "baseModel");
         modelVertex.addMetadataProperty(GraphPropertyEnum.MODEL_TYPE, ModelTypeEnum.NORMATIVE.getValue());
         when(janusGraphDao.getByCriteria(eq(VertexTypeEnum.MODEL), anyMap())).thenReturn(Either.left(Collections.singletonList(modelVertex)));
-        when(janusGraphGenericDao.getChild(eq("uid"), anyString(), eq(GraphEdgeLabels.DERIVED_FROM), eq(NodeTypeEnum.Model), eq(ModelData.class))).thenReturn(Either.right(JanusGraphOperationStatus.NOT_FOUND));
-        when(derivedFromOperation.addDerivedFromRelation("model.derivedModel", "model.baseModel", NodeTypeEnum.Model)).thenReturn(Either.left(new GraphRelation()));
-        
+        when(janusGraphGenericDao.getChild(eq("uid"), anyString(), eq(GraphEdgeLabels.DERIVED_FROM), eq(NodeTypeEnum.Model),
+            eq(ModelData.class))).thenReturn(Either.right(JanusGraphOperationStatus.NOT_FOUND));
+        when(derivedFromOperation.addDerivedFromRelation("model.derivedModel", "model.baseModel", NodeTypeEnum.Model)).thenReturn(
+            Either.left(new GraphRelation()));
+
         final Model createdModel = modelOperation.createModel(new Model(derivedModelName, modelName, ModelTypeEnum.NORMATIVE), false);
         assertThat(createdModel).isNotNull();
         assertThat(createdModel.getName()).isEqualTo(derivedModelName);
@@ -133,14 +134,14 @@ class ModelOperationTest extends ModelTestBase {
 
     @Test
     void createModelFailWithModelAlreadyExistTest() {
-        when(janusGraphGenericDao.createNode(any(),any())).thenReturn(Either.right(JanusGraphOperationStatus.JANUSGRAPH_SCHEMA_VIOLATION));
+        when(janusGraphGenericDao.createNode(any(), any())).thenReturn(Either.right(JanusGraphOperationStatus.JANUSGRAPH_SCHEMA_VIOLATION));
         final var model = new Model(modelName, ModelTypeEnum.NORMATIVE);
         assertThrows(OperationException.class, () -> modelOperation.createModel(model, false));
     }
 
     @Test
     void createModelFailTest() {
-        when(janusGraphGenericDao.createNode(any(),any())).thenReturn(Either.right(JanusGraphOperationStatus.GRAPH_IS_NOT_AVAILABLE));
+        when(janusGraphGenericDao.createNode(any(), any())).thenReturn(Either.right(JanusGraphOperationStatus.GRAPH_IS_NOT_AVAILABLE));
         final var model = new Model(modelName, ModelTypeEnum.NORMATIVE);
         assertThrows(OperationException.class, () -> modelOperation.createModel(model, false));
     }
@@ -404,6 +405,53 @@ class ModelOperationTest extends ModelTestBase {
         assertEquals(expectedImport2.getContent(), actualImport2.getContent());
     }
 
+    @Test
+    void addArtifactsToDefaultImportsTest_nonExistingAdditionalTypesImport() throws IOException {
+        var modelName = "model";
+        final Path testResourcePath = Path.of("src/test/resources/modelOperation");
+
+        final var dataTypesPath = testResourcePath.resolve(Path.of("input-artifact_types.yaml"));
+        final var dataTypes = Files.readString(dataTypesPath);
+
+        final Path import1RelativePath = Path.of("original-import-3.yaml");
+        final Path import1Path = testResourcePath.resolve(import1RelativePath);
+
+        var toscaImportByModel1 = new ToscaImportByModel();
+        toscaImportByModel1.setModelId(modelName);
+        toscaImportByModel1.setFullPath(import1RelativePath.toString());
+        toscaImportByModel1.setContent(Files.readString(import1Path));
+
+        final List<ToscaImportByModel> modelImports = new ArrayList<>();
+        modelImports.add(toscaImportByModel1);
+        when(toscaModelImportCassandraDao.findAllByModel(modelName)).thenReturn(modelImports);
+
+        modelOperation.addTypesToDefaultImports(ElementTypeEnum.ARTIFACT_TYPE, dataTypes, modelName);
+        ArgumentCaptor<List<ToscaImportByModel>> importListArgumentCaptor = ArgumentCaptor.forClass(List.class);
+        verify(toscaModelImportCassandraDao).saveAll(eq(modelName), importListArgumentCaptor.capture());
+
+        final List<ToscaImportByModel> actualImportList = importListArgumentCaptor.getValue();
+        assertEquals(2, actualImportList.size());
+        assertTrue(actualImportList.contains(toscaImportByModel1));
+
+        var expectedAdditionalTypesImport = new ToscaImportByModel();
+        expectedAdditionalTypesImport.setModelId(modelName);
+        expectedAdditionalTypesImport.setFullPath(ADDITIONAL_TYPE_DEFINITIONS_PATH.toString());
+        expectedAdditionalTypesImport.setContent(Files.readString(testResourcePath.resolve(Path.of("expected-additional_types-3.yaml"))));
+        final ToscaImportByModel actualAdditionalTypesImport =
+            actualImportList.stream().filter(expectedAdditionalTypesImport::equals).findFirst().orElse(null);
+        assertNotNull(actualAdditionalTypesImport);
+        assertEquals(expectedAdditionalTypesImport.getContent(), actualAdditionalTypesImport.getContent());
+
+        var expectedImport1 = new ToscaImportByModel();
+        expectedImport1.setModelId(modelName);
+        expectedImport1.setFullPath(import1RelativePath.toString());
+        expectedImport1.setContent(Files.readString(testResourcePath.resolve(Path.of("expected-import-3.yaml"))));
+        final ToscaImportByModel actualImport1 = actualImportList.stream().filter(expectedImport1::equals).findFirst().orElse(null);
+        assertNotNull(actualImport1);
+        assertEquals(expectedImport1.getContent(), actualImport1.getContent());
+
+    }
+
     @Test
     void addTypesToDefaultImportsTest_existingAdditionalTypesImport() throws IOException {
         var modelName = "model";
@@ -458,6 +506,60 @@ class ModelOperationTest extends ModelTestBase {
 
     }
 
+    @Test
+    void addArtifactsToDefaultImportsTest_existingAdditionalTypesImport() throws IOException {
+        var modelName = "model";
+        final Path testResourcePath = Path.of("src/test/resources/modelOperation");
+
+        final var dataTypesPath = testResourcePath.resolve(Path.of("input-artifact_types.yaml"));
+        final var dataTypes = Files.readString(dataTypesPath);
+
+        final Path import1RelativePath = Path.of("original-import-3.yaml");
+        final Path import1Path = testResourcePath.resolve(import1RelativePath);
+
+        var toscaImportByModel1 = new ToscaImportByModel();
+        toscaImportByModel1.setModelId(modelName);
+        toscaImportByModel1.setFullPath(import1RelativePath.toString());
+        toscaImportByModel1.setContent(Files.readString(import1Path));
+
+        var originalAdditionalTypesImport = new ToscaImportByModel();
+        originalAdditionalTypesImport.setModelId(modelName);
+        originalAdditionalTypesImport.setFullPath(ADDITIONAL_TYPE_DEFINITIONS_PATH.toString());
+        final Path originalAdditionalTypesImportPath = testResourcePath.resolve(Path.of("original-additional_types-2.yaml"));
+        originalAdditionalTypesImport.setContent(Files.readString(originalAdditionalTypesImportPath));
+
+        final List<ToscaImportByModel> modelImports = new ArrayList<>();
+        modelImports.add(toscaImportByModel1);
+        modelImports.add(originalAdditionalTypesImport);
+        when(toscaModelImportCassandraDao.findAllByModel(modelName)).thenReturn(modelImports);
+
+        modelOperation.addTypesToDefaultImports(ElementTypeEnum.ARTIFACT_TYPE, dataTypes, modelName);
+        ArgumentCaptor<List<ToscaImportByModel>> importListArgumentCaptor = ArgumentCaptor.forClass(List.class);
+        verify(toscaModelImportCassandraDao).saveAll(eq(modelName), importListArgumentCaptor.capture());
+
+        final List<ToscaImportByModel> actualImportList = importListArgumentCaptor.getValue();
+        assertEquals(2, actualImportList.size());
+        assertTrue(actualImportList.contains(toscaImportByModel1));
+
+        var expectedAdditionalTypesImport = new ToscaImportByModel();
+        expectedAdditionalTypesImport.setModelId(modelName);
+        expectedAdditionalTypesImport.setFullPath(ADDITIONAL_TYPE_DEFINITIONS_PATH.toString());
+        expectedAdditionalTypesImport.setContent(Files.readString(testResourcePath.resolve(Path.of("expected-additional_types-3.yaml"))));
+        final ToscaImportByModel actualAdditionalTypesImport =
+            actualImportList.stream().filter(expectedAdditionalTypesImport::equals).findFirst().orElse(null);
+        assertNotNull(actualAdditionalTypesImport);
+        assertEquals(expectedAdditionalTypesImport.getContent(), actualAdditionalTypesImport.getContent());
+
+        var expectedImport1 = new ToscaImportByModel();
+        expectedImport1.setModelId(modelName);
+        expectedImport1.setFullPath(import1RelativePath.toString());
+        expectedImport1.setContent(Files.readString(testResourcePath.resolve(Path.of("expected-import-3.yaml"))));
+        final ToscaImportByModel actualImport1 = actualImportList.stream().filter(expectedImport1::equals).findFirst().orElse(null);
+        assertNotNull(actualImport1);
+        assertEquals(expectedImport1.getContent(), actualImport1.getContent());
+
+    }
+
     private ToscaImportByModel createModelImport(final String parentModelName, final String importPath) {
         var toscaImportByModel = new ToscaImportByModel();
         toscaImportByModel.setModelId(parentModelName);
diff --git a/catalog-model/src/test/resources/modelOperation/expected-additional_types-3.yaml b/catalog-model/src/test/resources/modelOperation/expected-additional_types-3.yaml
new file mode 100644 (file)
index 0000000..3284b49
--- /dev/null
@@ -0,0 +1,11 @@
+tosca_definitions_version: tosca_simple_yaml_1_3
+description: Auto-generated file that contains package custom types or types added
+  after system installation.
+artifact_types:
+  tosca.artifacts.Implementation.Python:
+    derived_from: tosca.artifacts.Implementation
+    description: Python replacement.
+  tosca.artifacts.Implementation.Python.V3:
+    derived_from: tosca.artifacts.Implementation.Python
+    description: This artifact type represents a Python3 file that contains Python
+      language constructs that can be executed within a Python interpreter.
diff --git a/catalog-model/src/test/resources/modelOperation/expected-import-3.yaml b/catalog-model/src/test/resources/modelOperation/expected-import-3.yaml
new file mode 100644 (file)
index 0000000..a59439b
--- /dev/null
@@ -0,0 +1,9 @@
+tosca_definitions_version: tosca_simple_yaml_1_2
+description: ETSI NFV SOL 001 nsd types definitions version 2.5.1
+artifact_types:
+  tosca.artifacts.File:
+    derived_from: tosca.artifacts.Root
+    description: This artifact type is used when an artifact definition needs to have
+      its associated file simply treated as a file and no special handling/handlers
+      are invoked (i.e., it is not treated as either an implementation or deployment
+      artifact type).
diff --git a/catalog-model/src/test/resources/modelOperation/input-artifact_types.yaml b/catalog-model/src/test/resources/modelOperation/input-artifact_types.yaml
new file mode 100644 (file)
index 0000000..90240ba
--- /dev/null
@@ -0,0 +1,6 @@
+tosca.artifacts.Implementation.Python:
+  derived_from: tosca.artifacts.Implementation
+  description: Python replacement.
+tosca.artifacts.Implementation.Python.V3:
+  derived_from: tosca.artifacts.Implementation.Python
+  description: This artifact type represents a Python3 file that contains Python language constructs that can be executed within a Python interpreter.
diff --git a/catalog-model/src/test/resources/modelOperation/original-additional_types-2.yaml b/catalog-model/src/test/resources/modelOperation/original-additional_types-2.yaml
new file mode 100644 (file)
index 0000000..8395bba
--- /dev/null
@@ -0,0 +1,7 @@
+tosca_definitions_version: tosca_simple_yaml_1_3
+description: Auto-generated file that contains package custom types or types added
+  after system installation.
+artifact_types:
+  tosca.artifacts.Implementation.Python:
+    derived_from: tosca.artifacts.Implementation
+    description: Python replacement.
diff --git a/catalog-model/src/test/resources/modelOperation/original-import-3.yaml b/catalog-model/src/test/resources/modelOperation/original-import-3.yaml
new file mode 100644 (file)
index 0000000..7853411
--- /dev/null
@@ -0,0 +1,10 @@
+tosca_definitions_version: tosca_simple_yaml_1_2
+description: ETSI NFV SOL 001 nsd types definitions version 2.5.1
+
+artifact_types:
+  tosca.artifacts.Implementation.Python:
+    derived_from: tosca.artifacts.Implementation
+    description: Python replacement.
+  tosca.artifacts.File:
+    derived_from: tosca.artifacts.Root
+    description: This artifact type is used when an artifact definition needs to have its associated file simply treated as a file and no special handling/handlers are invoked (i.e., it is not treated as either an implementation or deployment artifact type).