aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormark.j.leonard <mark.j.leonard@gmail.com>2018-08-07 16:43:55 +0100
committermark.j.leonard <mark.j.leonard@gmail.com>2018-08-07 16:48:52 +0100
commita2c5714eabfb87d4a59f106e418c967b599c4212 (patch)
treefa6afe8f53a75125f27787a5b6d37c67d2157fdd
parent4c5a94e163eec4617c8907871a5ed5b81f6ca94b (diff)
Check getMetaData() return value for null
Added code to check for null metadata. Decomposed existing methods to avoid Sonar complexity warnings. Renamed some variables for readability. Change-Id: Id68be06bb5c105f45870a08f60a4ddc4dfbe5b09 Issue-ID: AAI-1448 Signed-off-by: mark.j.leonard <mark.j.leonard@gmail.com>
-rw-r--r--src/main/java/org/onap/aai/babel/logging/ApplicationMsgs.java3
-rw-r--r--src/main/java/org/onap/aai/babel/parser/ArtifactGeneratorToscaParser.java156
-rw-r--r--src/main/resources/babel-logging-resources.properties8
-rw-r--r--src/test/java/org/onap/aai/babel/parser/TestArtifactGeneratorToscaParser.java56
4 files changed, 146 insertions, 77 deletions
diff --git a/src/main/java/org/onap/aai/babel/logging/ApplicationMsgs.java b/src/main/java/org/onap/aai/babel/logging/ApplicationMsgs.java
index 84b426b..812c4c1 100644
--- a/src/main/java/org/onap/aai/babel/logging/ApplicationMsgs.java
+++ b/src/main/java/org/onap/aai/babel/logging/ApplicationMsgs.java
@@ -37,7 +37,8 @@ public enum ApplicationMsgs implements LogMessageEnum {
BABEL_RESPONSE_PAYLOAD,
LOAD_PROPERTIES,
PROCESSING_VNF_CATALOG_ERROR,
- TEMP_FILE_ERROR;
+ TEMP_FILE_ERROR,
+ MISSING_SERVICE_METADATA;
// @formatter:on
diff --git a/src/main/java/org/onap/aai/babel/parser/ArtifactGeneratorToscaParser.java b/src/main/java/org/onap/aai/babel/parser/ArtifactGeneratorToscaParser.java
index a95df94..2421d68 100644
--- a/src/main/java/org/onap/aai/babel/parser/ArtifactGeneratorToscaParser.java
+++ b/src/main/java/org/onap/aai/babel/parser/ArtifactGeneratorToscaParser.java
@@ -29,6 +29,7 @@ import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.stream.Collectors;
+import org.onap.aai.babel.logging.ApplicationMsgs;
import org.onap.aai.babel.logging.LogHelper;
import org.onap.aai.babel.xml.generator.data.WidgetConfigurationUtil;
import org.onap.aai.babel.xml.generator.model.AllotedResource;
@@ -46,6 +47,7 @@ import org.onap.sdc.tosca.parser.api.ISdcCsarHelper;
import org.onap.sdc.toscaparser.api.Group;
import org.onap.sdc.toscaparser.api.NodeTemplate;
import org.onap.sdc.toscaparser.api.Property;
+import org.onap.sdc.toscaparser.api.elements.Metadata;
public class ArtifactGeneratorToscaParser {
@@ -120,6 +122,39 @@ public class ArtifactGeneratorToscaParser {
}
/**
+ * Process the service TOSCA.
+ *
+ * @param service model of the service artifact
+ * @param idTypeStore ID->Type mapping
+ * @param nodeTemplates a list of service nodes
+ *
+ */
+ public void processServiceTosca(Service service, Map<String, String> idTypeStore,
+ List<NodeTemplate> nodeTemplates) {
+ log.debug("Inside Service Tosca ");
+
+ // Get the resource/widgets in the service according to the node-template types
+ for (NodeTemplate node : nodeTemplates) {
+ if (node.getMetaData() != null) {
+ Model model = Model.getModelFor(correctNodeType(node));
+ if (model != null) {
+ model.populateModelIdentificationInformation(node.getMetaData().getAllProperties());
+ if (model instanceof Resource) {
+ // Keeping track of resource types and
+ // their uuid for identification during resource tosca processing
+ idTypeStore.put(model.getModelNameVersionId(), correctNodeType(node));
+ service.addResource((Resource) model);
+ } else {
+ service.addWidget((Widget) model);
+ }
+ }
+ } else {
+ log.warn(ApplicationMsgs.MISSING_SERVICE_METADATA, node.getName());
+ }
+ }
+ }
+
+ /**
* Generates a Resource List using input Service Node Templates.
*
* @param serviceNodes input Service Node Templates
@@ -129,50 +164,55 @@ public class ArtifactGeneratorToscaParser {
public List<Resource> processResourceToscas(List<NodeTemplate> serviceNodes, Map<String, String> idTypeStore) {
List<Resource> resources = new LinkedList<>();
for (NodeTemplate serviceNode : serviceNodes) {
- List<NodeTemplate> resourceNodes = csarHelper.getNodeTemplateChildren(serviceNode);
+ if (serviceNode.getMetaData() != null) {
+ List<NodeTemplate> resourceNodes = csarHelper.getNodeTemplateChildren(serviceNode);
+ processResourceTosca(idTypeStore, resources, serviceNode, resourceNodes);
+ } else {
+ log.warn(ApplicationMsgs.MISSING_SERVICE_METADATA, serviceNode.getName());
+ }
+ }
+ return resources;
+ }
- String resourceUuId = serviceNode.getMetaData().getValue("UUID");
- String mapValue = idTypeStore.get(resourceUuId);
- if (mapValue != null) {
- Model model = Model.getModelFor(idTypeStore.get(serviceNode.getMetaData().getValue("UUID")));
+ private void processResourceTosca(Map<String, String> idTypeStore, List<Resource> resources,
+ NodeTemplate serviceNode, List<NodeTemplate> resourceNodes) {
+ String resourceUuId = serviceNode.getMetaData().getValue("UUID");
+ String resourceType = idTypeStore.get(resourceUuId);
+ if (resourceType != null) {
+ Model model = Model.getModelFor(resourceType);
- log.debug("Inside Resource artifact generation for resource");
- Map<String, String> serviceMetadata = serviceNode.getMetaData().getAllProperties();
- model.populateModelIdentificationInformation(serviceMetadata);
+ log.debug("Inside Resource artifact generation for resource");
+ Map<String, String> serviceMetadata = serviceNode.getMetaData().getAllProperties();
+ model.populateModelIdentificationInformation(serviceMetadata);
- // Found model from the type store so removing the same
- idTypeStore.remove(model.getModelNameVersionId());
- processVfTosca(idTypeStore, model, resourceNodes);
+ // Found model from the type store so removing the same
+ idTypeStore.remove(model.getModelNameVersionId());
+ processVfTosca(idTypeStore, model, resourceNodes);
- // Process group information from tosca for vfModules
- if (csarHelper.getServiceVfList() != null) {
- processVfModules(resources, model, serviceNode);
- }
+ // Process group information from tosca for vfModules
+ if (csarHelper.getServiceVfList() != null) {
+ processVfModules(resources, model, serviceNode);
+ }
- if (hasSubCategoryTunnelXConnect(serviceMetadata) && hasAllottedResource(serviceMetadata)) {
- model.addWidget(new TunnelXconnectWidget());
- }
- resources.add((Resource) model);
+ if (hasSubCategoryTunnelXConnect(serviceMetadata) && hasAllottedResource(serviceMetadata)) {
+ model.addWidget(new TunnelXconnectWidget());
}
+ resources.add((Resource) model);
}
- return resources;
}
- private void processVfModules(List<Resource> resources, Model model, NodeTemplate serviceNode) {
+ private void processVfModules(List<Resource> resources, Model resourceModel, NodeTemplate serviceNode) {
// Get the customisation UUID for each VF node and use it to get its Groups
String uuid = csarHelper.getNodeTemplateCustomizationUuid(serviceNode);
-
- // Populate a Map of Group against NodeTemplates that are members of the Group
List<Group> serviceGroups = csarHelper.getVfModulesByVf(uuid);
// Process each VF Group
for (Group serviceGroup : serviceGroups) {
Model groupModel = Model.getModelFor(serviceGroup.getType());
if (groupModel instanceof VfModule) {
- processVfModule(resources, model, serviceGroup, serviceNode, (VfModule) groupModel);
+ processVfModule(resources, resourceModel, serviceGroup, serviceNode, (VfModule) groupModel);
}
}
-
}
private void processVfModule(List<Resource> resources, Model model, Group groupDefinition, NodeTemplate serviceNode,
@@ -183,18 +223,14 @@ public class ArtifactGeneratorToscaParser {
Map<String, Property> groupProperties = groupDefinition.getProperties();
Map<String, String> properties = populateStringProperties(groupProperties);
groupModel.populateModelIdentificationInformation(properties);
- processVfModuleGroup(resources, model, groupDefinition, serviceNode, groupModel);
- }
- private void processVfModuleGroup(List<Resource> resources, Model model, Group groupDefinition,
- NodeTemplate serviceNode, VfModule groupModel) {
// Get names of the members of the service group
List<NodeTemplate> members = csarHelper.getMembersOfVfModule(serviceNode, groupDefinition);
if (members != null && !members.isEmpty()) {
List<String> memberNames = members.stream().map(NodeTemplate::getName).collect(Collectors.toList());
groupModel.setMembers(memberNames);
- for (NodeTemplate nodeTemplate : members) {
- processNodeTemplate(groupModel, nodeTemplate);
+ for (NodeTemplate member : members) {
+ processGroupMembers(groupModel, member);
}
}
@@ -205,53 +241,26 @@ public class ArtifactGeneratorToscaParser {
}
}
- private static void processNodeTemplate(Model group, NodeTemplate nodeTemplate) {
+ private void processGroupMembers(Model group, NodeTemplate member) {
Model resourceNode;
// L3-network inside vf-module to be generated as Widget a special handling.
- if (nodeTemplate.getType().contains("org.openecomp.resource.vl")) {
+ if (member.getType().contains("org.openecomp.resource.vl")) {
resourceNode = new L3NetworkWidget();
} else {
- resourceNode = Model.getModelFor(nodeTemplate.getType());
+ resourceNode = Model.getModelFor(member.getType());
}
if (resourceNode != null && !(resourceNode instanceof Resource)) {
Widget widget = (Widget) resourceNode;
- widget.addKey(nodeTemplate.getName());
+ widget.addKey(member.getName());
// Add the widget element encountered to the Group model
group.addWidget(widget);
}
}
- /**
- * Process the service tosca
- *
- * @param service model of the service artifact
- * @param idTypeStore ID->Type mapping
- * @param nodeTemplates a list of service nodes
- *
- */
- public void processServiceTosca(Service service, Map<String, String> idTypeStore,
- List<NodeTemplate> nodeTemplates) {
- log.debug("Inside Service Tosca ");
- // Get the resource/widgets in the service according to the node-template types
- for (NodeTemplate node : nodeTemplates) {
- Model model = Model.getModelFor(correctNodeType(node));
- if (model != null) {
- model.populateModelIdentificationInformation(node.getMetaData().getAllProperties());
- if (model instanceof Resource) {
- // Keeping track of resource types and
- // their uuid for identification during resource tosca processing
- idTypeStore.put(model.getModelNameVersionId(), correctNodeType(node));
- service.addResource((Resource) model);
- } else {
- service.addWidget((Widget) model);
- }
- }
- }
- }
-
private String correctNodeType(NodeTemplate nodeType) {
String correctedNodeType = nodeType.getType();
- if (hasAllottedResource(nodeType.getMetaData().getAllProperties())) {
+ Metadata metadata = nodeType.getMetaData();
+ if (metadata != null && hasAllottedResource(metadata.getAllProperties())) {
if (nodeType.getType().contains("org.openecomp.resource.vf.")) {
correctedNodeType = "org.openecomp.resource.vf.allottedResource";
}
@@ -281,32 +290,33 @@ public class ArtifactGeneratorToscaParser {
e -> e.getValue().getValue() == null ? "" : e.getValue().getValue().toString()));
}
- private void processVfTosca(Map<String, String> idTypeStore, Model model, List<NodeTemplate> resourceNodes) {
- boolean flag = false;
+ private void processVfTosca(Map<String, String> idTypeStore, Model resourceModel,
+ List<NodeTemplate> resourceNodes) {
+ boolean providingServiceFound = false;
for (NodeTemplate resourceNodeTemplate : resourceNodes) {
Model resourceNode = Model.getModelFor(correctNodeType(resourceNodeTemplate));
if (resourceNode instanceof ProvidingService) {
- flag = true;
+ providingServiceFound = true;
Map<String, Property> nodeProperties = resourceNodeTemplate.getProperties();
if (nodeProperties.get("providing_service_uuid") == null
|| nodeProperties.get("providing_service_invariant_uuid") == null) {
- throw new IllegalArgumentException(
- String.format(GENERATOR_AAI_PROVIDING_SERVICE_METADATA_MISSING, model.getModelId()));
+ throw new IllegalArgumentException(String.format(GENERATOR_AAI_PROVIDING_SERVICE_METADATA_MISSING,
+ resourceModel.getModelId()));
}
Map<String, String> properties = populateStringProperties(nodeProperties);
properties.put(VERSION, "1.0");
resourceNode.populateModelIdentificationInformation(properties);
- model.addResource((Resource) resourceNode);
+ resourceModel.addResource((Resource) resourceNode);
} else if (resourceNode instanceof Resource && !(resourceNode.getWidgetType().equals(Widget.Type.L3_NET))) {
idTypeStore.put(resourceNode.getModelNameVersionId(), correctNodeType(resourceNodeTemplate));
- model.addResource((Resource) resourceNode);
+ resourceModel.addResource((Resource) resourceNode);
}
}
- if (model instanceof AllotedResource && !flag) {
+ if (resourceModel instanceof AllotedResource && !providingServiceFound) {
throw new IllegalArgumentException(
- String.format(GENERATOR_AAI_PROVIDING_SERVICE_MISSING, model.getModelId()));
+ String.format(GENERATOR_AAI_PROVIDING_SERVICE_MISSING, resourceModel.getModelId()));
}
}
}
diff --git a/src/main/resources/babel-logging-resources.properties b/src/main/resources/babel-logging-resources.properties
index 99b2294..5213103 100644
--- a/src/main/resources/babel-logging-resources.properties
+++ b/src/main/resources/babel-logging-resources.properties
@@ -76,10 +76,12 @@ BABEL_REQUEST_PAYLOAD=\
BABEL_RESPONSE_PAYLOAD=\
BABEL0009I|\
- Babel response payload: {0}|\
+ Babel response payload: {0}|\
MISSING_REQUEST_ID=\
BABEL0010I|\
Missing request ID. Assigned {0}|\
- |\
- \ No newline at end of file
+
+MISSING_SERVICE_METADATA=\
+ BABEL0011W|\
+ The service node template: {0} does not provide a metadata section. Skipping...|\ \ No newline at end of file
diff --git a/src/test/java/org/onap/aai/babel/parser/TestArtifactGeneratorToscaParser.java b/src/test/java/org/onap/aai/babel/parser/TestArtifactGeneratorToscaParser.java
new file mode 100644
index 0000000..a74efaf
--- /dev/null
+++ b/src/test/java/org/onap/aai/babel/parser/TestArtifactGeneratorToscaParser.java
@@ -0,0 +1,56 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * Copyright © 2017-2018 European Software Marketing Ltd.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.aai.babel.parser;
+
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.List;
+import org.junit.Test;
+import org.onap.sdc.toscaparser.api.NodeTemplate;
+
+/**
+ * Direct tests of the TOSCA parser-based Artifact Generator, to cover exceptional cases.
+ */
+
+public class TestArtifactGeneratorToscaParser {
+
+ ArtifactGeneratorToscaParser parser = new ArtifactGeneratorToscaParser(null);
+
+ /**
+ * Process a dummy Node Template object for a Service. A WARNING should be logged for the missing metadata.
+ */
+ @Test
+ public void testMissingServiceData() {
+ List<NodeTemplate> nodeTemplateList = Collections.singletonList(buildNodeTemplate("name", "BlockStorage"));
+ parser.processServiceTosca(null, Collections.emptyMap(), nodeTemplateList);
+ parser.processResourceToscas(nodeTemplateList, null);
+ }
+
+ private NodeTemplate buildNodeTemplate(String name, String type) {
+ LinkedHashMap<String, Object> nodeTemplateMap = new LinkedHashMap<>();
+ LinkedHashMap<String, Object> template = new LinkedHashMap<>();
+ template.put("type", type);
+ nodeTemplateMap.put(name, template);
+ return new NodeTemplate(name, nodeTemplateMap, null, null, null);
+ }
+
+}