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);
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 ]
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()
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)
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")
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());
@ContextConfiguration("classpath:application-context-test.xml")
class ModelOperationTest extends ModelTestBase {
+ private static final String modelName = "ETSI-SDC-MODEL-TEST";
@InjectMocks
private ModelOperation modelOperation;
@Mock
@Mock
private DerivedFromOperation derivedFromOperation;
- private final String modelName = "ETSI-SDC-MODEL-TEST";
-
@BeforeAll
static void beforeAllInit() {
init();
@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);
@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));
}
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";
}
+ @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);
--- /dev/null
+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.
--- /dev/null
+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).
--- /dev/null
+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.
--- /dev/null
+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.
--- /dev/null
+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).