+ /**
+ * Create a Service from the provided metadata
+ *
+ * @param serviceVersion
+ * @param properties
+ * @return
+ */
+ private Service createServiceModel(final String serviceVersion, Map<String, String> properties) {
+ log.debug("Processing (TOSCA) Service object");
+ Service serviceModel = new Service();
+ serviceModel.setModelVersion(serviceVersion);
+ serviceModel.populateModelIdentificationInformation(properties);
+ return serviceModel;
+ }
+
+ /**
+ * @param csarHelper
+ * @param serviceModel
+ * @return the generated Models
+ * @throws XmlArtifactGenerationException
+ * if the configured widget mappings do not support processed widget type(s)
+ */
+ private List<Resource> generateResourceModels(ISdcCsarHelper csarHelper, Service serviceModel)
+ throws XmlArtifactGenerationException {
+ List<NodeTemplate> serviceNodeTemplates =
+ ToscaParser.getServiceNodeTemplates(csarHelper).collect(Collectors.toList());
+ if (serviceNodeTemplates == null) {
+ throw new IllegalArgumentException(GENERATOR_AAI_ERROR_MISSING_SERVICE_TOSCA);
+ }
+
+ final ArtifactGeneratorToscaParser parser = new ArtifactGeneratorToscaParser(csarHelper);
+ List<Resource> resources = new ArrayList<>();
+ final List<Group> serviceGroups = ToscaParser.getServiceLevelGroups(csarHelper);
+ for (NodeTemplate nodeTemplate : serviceNodeTemplates) {
+ if (nodeTemplate.getMetaData() != null) {
+ generateModelFromNodeTemplate(csarHelper, serviceModel, resources, serviceGroups, parser, nodeTemplate);
+ } else {
+ log.warn(ApplicationMsgs.MISSING_SERVICE_METADATA, nodeTemplate.getName());
+ }
+ }
+
+ return resources;
+ }
+
+ /**
+ * @param csarHelper
+ * @param serviceModel
+ * @param resources
+ * @param serviceGroups
+ * @param parser
+ * @param nodeTemplate
+ * @throws XmlArtifactGenerationException
+ * if the configured widget mappings do not support processed widget type(s)
+ */
+ private void generateModelFromNodeTemplate(ISdcCsarHelper csarHelper, Service serviceModel,
+ List<Resource> resources, final List<Group> serviceGroups, ArtifactGeneratorToscaParser parser,
+ NodeTemplate nodeTemplate) throws XmlArtifactGenerationException {
+ Resource model = getModelFor(parser, nodeTemplate);
+
+ if (model != null) {
+ if (nodeTemplate.getMetaData() != null) {
+ model.populateModelIdentificationInformation(nodeTemplate.getMetaData().getAllProperties());
+ }
+
+ parser.addRelatedModel(serviceModel, model);
+ if (model.getModelType() == ModelType.RESOURCE) {
+ generateResourceModel(csarHelper, resources, parser, nodeTemplate);
+ }
+ } else {
+ for (Group group : serviceGroups) {
+ ArrayList<String> members = group.getMembers();
+ if (members != null && members.contains(nodeTemplate.getName())
+ && WidgetConfigurationUtil.isSupportedInstanceGroup(group.getType())) {
+ log.debug(String.format("Adding group %s (type %s) with members %s", group.getName(),
+ group.getType(), members));
+
+ Resource groupModel = parser.createInstanceGroupModel(
+ parser.mergeProperties(group.getMetadata().getAllProperties(), group.getProperties()));
+ serviceModel.addResource(groupModel);
+ resources.add(groupModel);
+ }
+ }
+ }
+ }
+
+ private Resource getModelFor(ArtifactGeneratorToscaParser parser, NodeTemplate nodeTemplate) {
+ String nodeTypeName = nodeTemplate.getType();
+
+ log.debug("Processing resource " + nodeTypeName + ": " + nodeTemplate.getMetaData().getValue("UUID"));
+
+ Resource model = Model.getModelFor(nodeTypeName, nodeTemplate.getMetaData().getValue("type"));
+
+ if (model != null) {
+ Metadata metadata = nodeTemplate.getMetaData();
+ if (metadata != null && parser.hasAllottedResource(metadata.getAllProperties())
+ && model.hasWidgetType("VF")) {
+ model = new Resource(WidgetType.valueOf("ALLOTTED_RESOURCE"), true);
+ }
+ }
+
+ return model;
+ }
+
+ /**
+ * @param csarHelper
+ * @param resources
+ * @param parser
+ * @param serviceVfNode
+ * a VF resource Node Template
+ * @throws XmlArtifactGenerationException
+ * if the configured widget mappings do not support processed widget type(s)
+ */
+ private void generateResourceModel(ISdcCsarHelper csarHelper, List<Resource> resources,
+ ArtifactGeneratorToscaParser parser, NodeTemplate serviceVfNode) throws XmlArtifactGenerationException {
+ Resource resourceModel = getModelFor(parser, serviceVfNode);
+ if (resourceModel == null) {
+ log.info(ApplicationMsgs.DISTRIBUTION_EVENT, "Could not generate resource model");
+ return;
+ }
+
+ Map<String, String> serviceMetadata = serviceVfNode.getMetaData().getAllProperties();
+ resourceModel.populateModelIdentificationInformation(serviceMetadata);
+
+ parser.processResourceModels(resourceModel, getNonVnfChildren(serviceVfNode));
+
+ List<NodeTemplate> serviceVfList = ToscaParser.getServiceNodeTemplates(csarHelper)
+ .filter(ToscaParser.filterOnType(SdcTypes.VF)).collect(Collectors.toList());
+
+ if (serviceVfList != null) {
+ parser.processVfModules(resources, resourceModel, serviceVfNode);
+ }
+
+ if (parser.hasSubCategoryTunnelXConnect(serviceMetadata) && parser.hasAllottedResource(serviceMetadata)) {
+ resourceModel.addWidget(Widget.createWidget("TUNNEL_XCONNECT"));
+ }
+
+ resources.addAll(parser.processInstanceGroups(resourceModel, serviceVfNode));
+ resources.add(resourceModel);
+ }
+
+ /**
+ * Return all child Node Templates (via Substitution Mappings) that do not have a type ending VnfConfiguration.
+ *
+ * @param nodeTemplate
+ * the parent Node Template
+ * @return the child Node Templates which are not a VNF Configuration type
+ */
+ private List<NodeTemplate> getNonVnfChildren(NodeTemplate nodeTemplate) {
+ return Optional.ofNullable(nodeTemplate.getSubMappingToscaTemplate()) //
+ .map(sm -> Optional.ofNullable(sm.getNodeTemplates())
+ .map(nts -> nts.stream().filter(nt -> !isVNFType(nt)) //
+ .collect(Collectors.toList()))
+ .orElse(Collections.emptyList()))
+ .orElse(Collections.emptyList());
+ }
+
+ private boolean isVNFType(NodeTemplate nt) {
+ return nt.getType().endsWith("VnfConfiguration");
+ }
+