+ /**
+ * 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 serviceNodeTemplates
+ * @param serviceModel
+ * @return the generated Models
+ * @throws XmlArtifactGenerationException
+ */
+ private List<Resource> generateResourceModels(ISdcCsarHelper csarHelper, List<NodeTemplate> serviceNodeTemplates,
+ Service serviceModel) throws XmlArtifactGenerationException {
+ final List<Group> serviceGroups = csarHelper.getGroupsOfTopologyTemplate();
+ final ArtifactGeneratorToscaParser parser = new ArtifactGeneratorToscaParser(csarHelper);
+
+ List<Resource> resources = new ArrayList<>();
+
+ 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;
+ }
+
+ 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;
+ }
+
+ private void generateResourceModel(ISdcCsarHelper csarHelper, List<Resource> resources,
+ ArtifactGeneratorToscaParser parser, NodeTemplate nodeTemplate) throws XmlArtifactGenerationException {
+ Resource resourceModel = getModelFor(parser, nodeTemplate);
+ if (resourceModel == null) {
+ log.info(ApplicationMsgs.DISTRIBUTION_EVENT, "Could not generate resource model");
+ return;
+ }
+
+ Map<String, String> serviceMetadata = nodeTemplate.getMetaData().getAllProperties();
+ resourceModel.populateModelIdentificationInformation(serviceMetadata);
+
+ parser.processResourceModels(resourceModel, csarHelper.getNodeTemplateChildren(nodeTemplate));
+
+ if (csarHelper.getServiceVfList() != null) {
+ parser.processVfModules(resources, resourceModel, nodeTemplate);
+ }
+
+ if (parser.hasSubCategoryTunnelXConnect(serviceMetadata) && parser.hasAllottedResource(serviceMetadata)) {
+ resourceModel.addWidget(Widget.getWidget(WidgetType.valueOf("TUNNEL_XCONNECT")));
+ }
+
+ resources.addAll(parser.processInstanceGroups(resourceModel, nodeTemplate));
+ resources.add(resourceModel);
+ }
+