Fix TOSCA Analyzer - null point exception 15/45415/2
authorshiria <shiri.amichai@amdocs.com>
Tue, 1 May 2018 11:09:41 +0000 (14:09 +0300)
committerAvi Gaffa <avi.gaffa@amdocs.com>
Tue, 1 May 2018 12:39:20 +0000 (12:39 +0000)
In case there is import to not exist TOSCA file,
exception with relevant error message should be thrown
In getRequirementAssignment, when there is no Requirement,
Optional.Empty is returned

Change-Id: I8aabde177815dec2f69307f6be3c5114c5c8efa3
Issue-ID: SDC-1281
Signed-off-by: shiria <shiri.amichai@amdocs.com>
common/onap-tosca-datatype/src/main/resources/globalTypes/tosca/nodes.yml
openecomp-be/lib/openecomp-tosca-lib/src/main/java/org/openecomp/sdc/tosca/errors/ToscaFileNotFoundErrorBuilder.java [new file with mode: 0644]
openecomp-be/lib/openecomp-tosca-lib/src/main/java/org/openecomp/sdc/tosca/services/DataModelUtil.java
openecomp-be/lib/openecomp-tosca-lib/src/main/java/org/openecomp/sdc/tosca/services/impl/ToscaAnalyzerServiceImpl.java
openecomp-be/lib/openecomp-tosca-lib/src/test/java/org/openecomp/sdc/tosca/services/impl/ToscaAnalyzerServiceImplTest.java
openecomp-be/lib/openecomp-tosca-lib/src/test/resources/mock/analyzerService/ServiceTemplateFileNotFoundTest.yaml [new file with mode: 0644]

index af68802..d512256 100644 (file)
@@ -48,7 +48,7 @@ node_types:
         - 0
         - UNBOUNDED
     interfaces:
-      standard:
+      Standard:
         type: tosca.interfaces.node.lifecycle.Standard
 
   tosca.nodes.ObjectStorage:
diff --git a/openecomp-be/lib/openecomp-tosca-lib/src/main/java/org/openecomp/sdc/tosca/errors/ToscaFileNotFoundErrorBuilder.java b/openecomp-be/lib/openecomp-tosca-lib/src/main/java/org/openecomp/sdc/tosca/errors/ToscaFileNotFoundErrorBuilder.java
new file mode 100644 (file)
index 0000000..b06cd1f
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ * Copyright © 2016-2018 European Support Limited
+ *
+ * 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.openecomp.sdc.tosca.errors;
+
+import org.openecomp.sdc.common.errors.ErrorCategory;
+import org.openecomp.sdc.common.errors.ErrorCode;
+
+/**
+ * The Tosca file not found error builder.
+ */
+public class ToscaFileNotFoundErrorBuilder {
+  private static final String ENTRY_NOT_FOUND_MSG =
+      "Tosca file '%s' was not found in tosca service model";
+  private final ErrorCode.ErrorCodeBuilder builder = new ErrorCode.ErrorCodeBuilder();
+
+  /**
+   * Instantiates a new Tosca file not found error builder.
+   *
+   * @param fileName the file name
+   */
+  public ToscaFileNotFoundErrorBuilder(String fileName) {
+    builder.withId(ToscaErrorCodes.TOSCA_ENTRY_NOT_FOUND);
+    builder.withCategory(ErrorCategory.APPLICATION);
+    builder.withMessage(String.format(ENTRY_NOT_FOUND_MSG, fileName));
+  }
+
+  /**
+   * Build error code.
+   *
+   * @return the error code
+   */
+  public ErrorCode build() {
+    return builder.build();
+  }
+}
index ff04196..d18a2f2 100644 (file)
@@ -820,6 +820,9 @@ public class DataModelUtil {
         matchRequirementAssignmentList.add(requirementAssignment);
       }
     }
+    if(CollectionUtils.isEmpty(matchRequirementAssignmentList)){
+      return Optional.empty();
+    }
     return Optional.of(matchRequirementAssignmentList);
   }
 
index 4428fc6..46d9b90 100644 (file)
@@ -39,6 +39,7 @@ import org.onap.sdc.tosca.datatypes.model.RequirementAssignment;
 import org.onap.sdc.tosca.datatypes.model.RequirementDefinition;
 import org.onap.sdc.tosca.datatypes.model.ServiceTemplate;
 import org.openecomp.sdc.tosca.errors.ToscaElementTypeNotFoundErrorBuilder;
+import org.openecomp.sdc.tosca.errors.ToscaFileNotFoundErrorBuilder;
 import org.openecomp.sdc.tosca.errors.ToscaInvalidEntryNotFoundErrorBuilder;
 import org.openecomp.sdc.tosca.errors.ToscaInvalidSubstituteNodeTemplatePropertiesErrorBuilder;
 import org.openecomp.sdc.tosca.errors.ToscaInvalidSubstitutionServiceTemplateErrorBuilder;
@@ -604,6 +605,10 @@ public class ToscaAnalyzerServiceImpl implements ToscaAnalyzerService {
         filesScanned.add(fileName);
       }
       ServiceTemplate template = toscaModel.getServiceTemplates().get(fileName);
+      if (Objects.isNull(template)) {
+        throw new CoreException(
+            new ToscaFileNotFoundErrorBuilder(fileName).build());
+      }
       found = scanAnFlatEntity(elementType, typeId, entity, template, toscaModel,
           filesScanned, filesScanned.size());
     }
index 83ed525..e034fb8 100644 (file)
@@ -126,6 +126,26 @@ public class ToscaAnalyzerServiceImplTest {
     }
   }
 
+  @Test
+  public void testGetFlatEntityFileNotFound() throws Exception {
+    thrown.expect(CoreException.class);
+    thrown.expectMessage(
+        "Tosca file 'missingFile.yaml' was not found in tosca service model");
+    ToscaExtensionYamlUtil toscaExtensionYamlUtil = new ToscaExtensionYamlUtil();
+    try (InputStream yamlFile = toscaExtensionYamlUtil
+        .loadYamlFileIs("/mock/analyzerService/ServiceTemplateFileNotFoundTest.yaml")) {
+
+      ServiceTemplate
+          serviceTemplateFromYaml =
+          toscaExtensionYamlUtil.yamlToObject(yamlFile, ServiceTemplate.class);
+
+      toscaAnalyzerService
+          .getFlatEntity(ToscaElementTypes.NODE_TYPE,
+              "org.openecomp.resource.vfc.nodes.heat.cmaui_image",
+              serviceTemplateFromYaml, toscaServiceModel);
+    }
+  }
+
   @Test
   public void testGetFlatEntityNodeType() throws Exception {
     ToscaExtensionYamlUtil toscaExtensionYamlUtil = new ToscaExtensionYamlUtil();
diff --git a/openecomp-be/lib/openecomp-tosca-lib/src/test/resources/mock/analyzerService/ServiceTemplateFileNotFoundTest.yaml b/openecomp-be/lib/openecomp-tosca-lib/src/test/resources/mock/analyzerService/ServiceTemplateFileNotFoundTest.yaml
new file mode 100644 (file)
index 0000000..37b242b
--- /dev/null
@@ -0,0 +1,196 @@
+tosca_definitions_version: tosca_simple_yaml_1_0_0
+metadata:
+  template_name: nested
+imports:
+- NeutronPortGlobalTypes:
+    file: missingFile.yaml
+node_types:
+  org.openecomp.resource.vfc.nodes.heat.cmaui_image:
+    derived_from: org.openecomp.resource.vfc.nodes.heat.nova.Server
+    properties:
+      admin_pass:
+        description: The administrator password for the server
+        type: string
+        status: SUPPORTED
+        default: overridden default value
+        required: false
+      new_property:
+        description: new property
+        type: string
+        status: SUPPORTED
+        required: false
+data_types:
+  org.openecomp.datatypes.heat.network.MyAddressPair:
+    derived_from: org.openecomp.datatypes.heat.network.AddressPair
+    description: My MAC/IP address pairs
+    properties:
+      mac_address:
+        description: MAC address
+        type: string
+        status: SUPPORTED
+        required: false
+        default: overridden default value
+      new_property:
+        description: new property
+        type: string
+        status: SUPPORTED
+        required: false
+  org.openecomp.datatypes.heat.network.MyNewAddressPair:
+    derived_from: org.openecomp.datatypes.heat.network.MyAddressPair
+    description: My new MAC/IP address pairs
+    properties:
+      mac_address:
+        description: MAC address
+        type: string
+        status: SUPPORTED
+        required: true
+        default: overridden default value
+topology_template:
+  inputs:
+    cmaui_names:
+      hidden: false
+      immutable: false
+      type: list
+      description: CMAUI1, CMAUI2 server names
+      entry_schema:
+        type: String
+    p1:
+      hidden: false
+      immutable: false
+      type: string
+      description: UID of OAM network
+    cmaui_image:
+      hidden: false
+      immutable: false
+      type: string
+      description: Image for CMAUI server
+    cmaui_flavor:
+      hidden: false
+      immutable: false
+      type: string
+      description: Flavor for CMAUI server
+    security_group_name:
+      hidden: false
+      immutable: false
+      description: not impotrtant
+    availability_zone_0:
+      label: availabilityzone name
+      hidden: false
+      immutable: false
+      type: string
+      description: availabilityzone name
+  node_templates:
+    server_cmaui:
+      type: org.openecomp.resource.vfc.nodes.heat.cmaui_image
+      properties:
+        flavor:
+          get_input: cmaui_flavor
+        availability_zone:
+          get_input: availability_zone_0
+        image:
+          get_input: cmaui_image
+        name:
+          get_input:
+          - cmaui_names
+          - 0
+    cmaui_port_0:
+      type: org.openecomp.resource.cp.nodes.heat.network.neutron.Port
+      properties:
+        replacement_policy: AUTO
+        security_groups:
+        - get_input: security_group_name
+        fixed_ips:
+        - ip_address:
+            get_input:
+            - cmaui_oam_ips
+            - 0
+        network:
+          get_input: p1
+      requirements:
+      - binding:
+          capability: tosca.capabilities.network.Bindable
+          node: server_cmaui
+          relationship: tosca.relationships.network.BindsTo
+    cmaui1_port_1:
+          type: org.openecomp.resource.cp.nodes.heat.network.neutron.Port
+          properties:
+            replacement_policy: AUTO
+            security_groups:
+            - get_input: security_group_name
+            fixed_ips:
+            - subnet: subnetNameVal
+              ip_address:
+                get_input:
+                - cmaui_oam_ips
+                - 1
+            - subnet: subnetNameVal2
+              ip_address:
+                get_input:
+                - cmaui_oam_ips
+                - 1
+            network: jsa_net
+          requirements:
+          - link:
+              capability: tosca.capabilities.network.Linkable
+              node: jsa_net1
+              relationship: tosca.relationships.network.LinksTo
+          - link:
+              capability: tosca.capabilities.network.Linkable
+              node: jsa_net2
+              relationship: tosca.relationships.network.LinksTo
+          - binding:
+              capability: tosca.capabilities.network.Bindable
+              node: server_cmaui
+              relationship: tosca.relationships.network.BindsTo
+    jsa_net1:
+          type: org.openecomp.resource.vl.nodes.heat.network.neutron.Net
+          properties:
+            shared: true
+            network_name:
+              get_input: jsa_net_name
+    jsa_net2:
+              type: org.openecomp.resource.vl.nodes.heat.network.neutron.Net
+              properties:
+                shared: true
+                network_name:
+                  get_input: jsa_net_name
+  groups:
+    nested:
+      type: org.openecomp.groups.heat.HeatStack
+      properties:
+        heat_file: ../Artifacts/nested.yml
+        description: cmaui server template for vMMSC
+      members:
+      - server_cmaui
+      - cmaui_port_0
+  substitution_mappings:
+    node_type: org.openecomp.resource.abstract.nodes.heat.nested
+    capabilities:
+      host_server_cmaui:
+      - server_cmaui
+      - host
+      os_server_cmaui:
+      - server_cmaui
+      - os
+      endpoint_server_cmaui:
+      - server_cmaui
+      - endpoint
+      binding_server_cmaui:
+      - server_cmaui
+      - binding
+      scalable_server_cmaui:
+      - server_cmaui
+      - scalable
+      attachment_cmaui_port_0:
+      - cmaui_port_0
+      - attachment
+    requirements:
+      local_storage_server_cmaui:
+      - server_cmaui
+      - local_storage
+      link_cmaui_port_0:
+      - cmaui_port_0
+      - link
+      link_cmaui_port_invalid:
+      - cmaui_port_9
+      - link