NPE in parse tosca file 09/44309/2
authorromaingimbert <romain.gimbert@orange.com>
Tue, 24 Apr 2018 09:25:31 +0000 (11:25 +0200)
committerromaingimbert <romain.gimbert@orange.com>
Tue, 24 Apr 2018 09:30:25 +0000 (11:30 +0200)
- check if null
- add test case

Change-Id: I400582cd99941c824ed0ef016d77c3d38beaece0
Issue-ID: EXTAPI-58
Signed-off-by: romaingimbert <romain.gimbert@orange.com>
src/main/java/org/onap/nbi/apis/servicecatalog/ToscaInfosProcessor.java
src/test/java/org/onap/nbi/apis/servicecatalog/ToscaInfosProcessorTest.java [new file with mode: 0644]
src/test/resources/toscafile/service-TestNetwork-template.yml [new file with mode: 0755]

index d71595f..48f433c 100644 (file)
@@ -1,15 +1,14 @@
 /**
  * Copyright (c) 2018 Orange
  *
- * 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
+ * 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.
+ * 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.
  */
 package org.onap.nbi.apis.servicecatalog;
 
@@ -44,7 +43,7 @@ public class ToscaInfosProcessor {
     private static final Logger LOGGER = LoggerFactory.getLogger(ToscaInfosProcessor.class);
 
     public void buildResponseWithToscaInfos(LinkedHashMap toscaInfosTopologyTemplate,
-            LinkedHashMap serviceCatalogResponse) {
+        LinkedHashMap serviceCatalogResponse) {
         if (toscaInfosTopologyTemplate.get("inputs") != null) {
             ArrayList serviceSpecCharacteristic = new ArrayList();
             LinkedHashMap toscaInfos = (LinkedHashMap) toscaInfosTopologyTemplate.get("inputs");
@@ -60,7 +59,7 @@ public class ToscaInfosProcessor {
                 mapParameter.put("required", inputParameter.get("required"));
                 mapParameter.put("status", inputParameter.get("status"));
                 List<LinkedHashMap> serviceSpecCharacteristicValues =
-                        buildServiceSpecCharacteristicsValues(inputParameter, parameterType);
+                    buildServiceSpecCharacteristicsValues(inputParameter, parameterType);
                 mapParameter.put("serviceSpecCharacteristicValue", serviceSpecCharacteristicValues);
                 serviceSpecCharacteristic.add(mapParameter);
             }
@@ -70,7 +69,7 @@ public class ToscaInfosProcessor {
         LinkedHashMap nodeTemplate = (LinkedHashMap) toscaInfosTopologyTemplate.get("node_templates");
 
         List<LinkedHashMap> resourceSpecifications =
-                (List<LinkedHashMap>) serviceCatalogResponse.get("resourceSpecification");
+            (List<LinkedHashMap>) serviceCatalogResponse.get("resourceSpecification");
         for (LinkedHashMap resourceSpecification : resourceSpecifications) {
             String id = (String) resourceSpecification.get("id");
             LOGGER.debug("get tosca infos for service id: " + id);
@@ -92,7 +91,7 @@ public class ToscaInfosProcessor {
                 ArrayList entrySchema = (ArrayList) parameter.get("entry_schema");
                 if (CollectionUtils.isNotEmpty(entrySchema)) {
                     buildCharacteristicValuesFormShema(parameterType, serviceSpecCharacteristicValues, aDefault,
-                            entrySchema);
+                        entrySchema);
                 }
             }
         }
@@ -100,7 +99,7 @@ public class ToscaInfosProcessor {
     }
 
     private void buildCharacteristicValuesFormShema(String parameterType,
-            List<LinkedHashMap> serviceSpecCharacteristicValues, Object aDefault, ArrayList entry_schema) {
+        List<LinkedHashMap> serviceSpecCharacteristicValues, Object aDefault, ArrayList entry_schema) {
         LinkedHashMap constraints = (LinkedHashMap) entry_schema.get(0);
         if (constraints != null) {
             ArrayList constraintsList = (ArrayList) constraints.get("constraints");
@@ -112,7 +111,7 @@ public class ToscaInfosProcessor {
                         String stringValue = value.toString();
                         LinkedHashMap serviceSpecCharacteristicValue = new LinkedHashMap();
                         serviceSpecCharacteristicValue.put("isDefault",
-                                aDefault != null && aDefault.toString().equals(stringValue));
+                            aDefault != null && aDefault.toString().equals(stringValue));
                         serviceSpecCharacteristicValue.put("value", stringValue);
                         serviceSpecCharacteristicValue.put("valueType", parameterType);
                         serviceSpecCharacteristicValues.add(serviceSpecCharacteristicValue);
@@ -124,15 +123,18 @@ public class ToscaInfosProcessor {
 
 
     private LinkedHashMap getToscaInfosFromResourceUUID(LinkedHashMap node_templates, String name) {
-        for (Object nodeTemplateObject : node_templates.values()) {
-            LinkedHashMap nodeTemplate = (LinkedHashMap) nodeTemplateObject;
-            LinkedHashMap metadata = (LinkedHashMap) nodeTemplate.get("metadata");
-            String metadataUUID = (String) metadata.get("UUID");
-            String metadataType = (String) metadata.get("type");
-            if ("VF".equalsIgnoreCase(metadataType) && name.equalsIgnoreCase(metadataUUID)) {
-                return metadata;
+        if (node_templates != null) {
+            for (Object nodeTemplateObject : node_templates.values()) {
+                LinkedHashMap nodeTemplate = (LinkedHashMap) nodeTemplateObject;
+                LinkedHashMap metadata = (LinkedHashMap) nodeTemplate.get("metadata");
+                String metadataUUID = (String) metadata.get("UUID");
+                String metadataType = (String) metadata.get("type");
+                if ("VF".equalsIgnoreCase(metadataType) && name.equalsIgnoreCase(metadataUUID)) {
+                    return metadata;
+                }
             }
         }
+
         return null;
     }
 
@@ -165,11 +167,11 @@ public class ToscaInfosProcessor {
             }
             topologyTemplate = (LinkedHashMap) toscaFileHashMap.get("topology_template");
 
-        } catch (NullPointerException e) {
+        }  catch (NullPointerException e) {
             LOGGER.warn("unable to parse tosca file for id : " + serviceId, e);
             return null;
 
-        } finally {
+        }finally {
 
             try {
                 LOGGER.debug("deleting temp folder for tosca files : " + folderTemp.getName());
diff --git a/src/test/java/org/onap/nbi/apis/servicecatalog/ToscaInfosProcessorTest.java b/src/test/java/org/onap/nbi/apis/servicecatalog/ToscaInfosProcessorTest.java
new file mode 100644 (file)
index 0000000..252b392
--- /dev/null
@@ -0,0 +1,79 @@
+/**
+ *     Copyright (c) 2018 Orange
+ *
+ *     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.
+ */
+package org.onap.nbi.apis.servicecatalog;
+
+import static org.junit.Assert.assertNull;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import org.junit.Test;
+import org.onap.nbi.exceptions.TechnicalException;
+
+
+
+public class ToscaInfosProcessorTest {
+
+    final ObjectMapper mapper = new ObjectMapper(new YAMLFactory()); // jackson databind
+
+    ToscaInfosProcessor toscaInfosProcessor = new ToscaInfosProcessor();
+
+
+
+    private LinkedHashMap parseToscaFile(String fileName) {
+
+        File toscaFile = new File(fileName);
+        if (!toscaFile.exists()) {
+            throw new TechnicalException("unable to find  file : " + fileName);
+        }
+        try {
+            return (LinkedHashMap) mapper.readValue(toscaFile, Object.class);
+        } catch (IOException e) {
+            throw new TechnicalException("Unable to parse tosca file : " + fileName);
+
+        } catch (NullPointerException e) {
+            throw new TechnicalException("unable to find tosca file : " + fileName);
+        }
+    }
+
+
+    @Test
+    public void buildResponseWithToscaInfos() {
+
+        ClassLoader classLoader = getClass().getClassLoader();
+        File file = new File(classLoader.getResource("toscafile/service-TestNetwork-template.yml").getFile());
+        List<LinkedHashMap> resources= new ArrayList<>();
+        LinkedHashMap resource1= new LinkedHashMap();
+        resource1.put("id","e2b12ac6-cbb6-4517-9c58-b846d1f68caf");
+        resources.add(resource1);
+        LinkedHashMap toscaFile = parseToscaFile(file.getPath());
+        LinkedHashMap response = new LinkedHashMap();
+        response.put("resourceSpecification",resources);
+        toscaInfosProcessor.buildResponseWithToscaInfos((LinkedHashMap)toscaFile.get("topology_template"),response);
+
+        resources = (List<LinkedHashMap>)response.get("resourceSpecification");
+        assertNull(resources.get(0).get("modelCustomizationId"));
+        assertNull(resources.get(0).get("modelCustomizationName"));
+
+    }
+
+
+
+}
\ No newline at end of file
diff --git a/src/test/resources/toscafile/service-TestNetwork-template.yml b/src/test/resources/toscafile/service-TestNetwork-template.yml
new file mode 100755 (executable)
index 0000000..0a62221
--- /dev/null
@@ -0,0 +1,96 @@
+#
+#     Copyright (c) 2018 Orange
+#
+#     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.
+#
+
+tosca_definitions_version: tosca_simple_yaml_1_1
+metadata:
+  invariantUUID: c4b53838-852e-465b-9912-d386228e8784
+  UUID: 5349c430-8bf7-4033-be37-ef33d0f9823e
+  name: test network
+  description: '12345'
+  type: Service
+  category: Network L1-3
+  serviceType: ''
+  serviceRole: ''
+  serviceEcompNaming: true
+  ecompGeneratedNaming: true
+  namingPolicy: ''
+imports:
+- nodes:
+    file: nodes.yml
+- datatypes:
+    file: data.yml
+- capabilities:
+    file: capabilities.yml
+- relationships:
+    file: relationships.yml
+- groups:
+    file: groups.yml
+- policies:
+    file: policies.yml
+- service-test network-interface:
+    file: service-TestNetwork-template-interface.yml
+- resource-Generic NeutronNet:
+    file: resource-GenericNeutronnet-template.yml
+topology_template:
+  node_templates:
+    Generic NeutronNet 0:
+      type: org.openecomp.resource.vl.GenericNeutronNet
+      metadata:
+        invariantUUID: 185ad0e3-0031-4d34-9ac2-d6ad30f7f34d
+        UUID: e2b12ac6-cbb6-4517-9c58-b846d1f68caf
+        customizationUUID: 27f40057-902a-4cbf-870e-0db55f97283e
+        version: '1.0'
+        name: Generic NeutronNet
+        description: Generic NeutronNet
+        type: VL
+        category: Generic
+        subcategory: Network Elements
+        resourceVendor: ATT (Tosca)
+        resourceVendorRelease: 1.0.0.wd03
+        resourceVendorModelNumber: ''
+      properties:
+        network_role: TestNetwork.test
+        network_assignments:
+          is_external_network: false
+          ipv4_subnet_default_assignment:
+            min_subnets_count: 1
+          ecomp_generated_network_assignment: false
+          ipv6_subnet_default_assignment:
+            min_subnets_count: 1
+        exVL_naming:
+          ecomp_generated_naming: true
+        network_flows:
+          is_network_policy: false
+          is_bound_to_vpn: false
+        network_ecomp_naming:
+          ecomp_generated_naming: true
+        network_type: NEUTRON
+        network_technology: NEUTRON
+        network_homing:
+          ecomp_selected_instance_node_target: false
+  substitution_mappings:
+    node_type: org.openecomp.service.TestNetwork
+    capabilities:
+      genericneutronnet0.feature:
+      - genericneutronnet0
+      - feature
+      genericneutronnet0.virtual_linkable:
+      - genericneutronnet0
+      - virtual_linkable
+    requirements:
+      genericneutronnet0.dependency:
+      - genericneutronnet0
+      - dependency