Commit test list join for availability_zone 49/12449/1
authoredan-att <eb578m@att.com>
Thu, 14 Sep 2017 13:52:18 +0000 (16:52 +0300)
committerEdan Binshtok <eb578m@intl.att.com>
Thu, 14 Sep 2017 14:06:32 +0000 (17:06 +0300)
These changes were imported from upstream @ commit
e38076e29ef8c86c510fca3141954d10602040bb
- Updated `nested_iterables` to parse list_join if available in
 the templates
- Updated `test_volume_resource_ids` to allow volume ids
to be provided as a parameter list
- Appropriate fixture additions and changes

Change-Id: Ia2187fe4eb7a389c8df01061be229246262d9a24
Issue-Id: VVP-29
Signed-off-by: Edan Binshtok <eb578m@intl.att.com>
ice_validator/tests/fixtures/test_referenced_and_defined_parameters_match/fail/missing_param_definition_3.yaml [new file with mode: 0644]
ice_validator/tests/fixtures/test_referenced_and_defined_parameters_match/fail/missing_param_reference_1.yaml [new file with mode: 0644]
ice_validator/tests/fixtures/test_referenced_and_defined_parameters_match/fail/missing_param_reference_2.yaml [new file with mode: 0644]
ice_validator/tests/fixtures/test_referenced_and_defined_parameters_match/pass/params_referenced_are_defined_and_vice_versa_2.yaml
ice_validator/tests/fixtures/test_volume_resource_ids/fail/mismatch_vm_type_volume_id_nova_server_id_2.yaml [new file with mode: 0644]
ice_validator/tests/fixtures/test_volume_resource_ids/fail/mismatch_vm_type_volume_id_param_2.yaml [new file with mode: 0644]
ice_validator/tests/fixtures/test_volume_resource_ids/fail/mismatch_vm_type_volume_id_volume_attachment_2.yaml [new file with mode: 0644]
ice_validator/tests/fixtures/test_volume_resource_ids/pass/valid_template_2.yaml [new file with mode: 0644]
ice_validator/tests/fixtures/test_volume_resource_ids/pass/valid_template_3.yaml [new file with mode: 0644]
ice_validator/tests/test_volume_resource_ids.py
ice_validator/tests/utils/nested_iterables.py

diff --git a/ice_validator/tests/fixtures/test_referenced_and_defined_parameters_match/fail/missing_param_definition_3.yaml b/ice_validator/tests/fixtures/test_referenced_and_defined_parameters_match/fail/missing_param_definition_3.yaml
new file mode 100644 (file)
index 0000000..37374db
--- /dev/null
@@ -0,0 +1,115 @@
+heat_template_version: 2013-05-23
+
+description: Simple template to deploy a single compute instance
+
+parameters:
+  vnf_id:
+    description: Unique ID for this VNF
+    type: string
+  vf_module_id:
+    description: Unique ID for this VF module
+    type: string
+  vnf_name:
+    type: string
+    description: Unique name for this VNF instance
+  ex_image_name:
+    type: string
+    label: Image name or ID
+    description: Image to be used for compute instance
+  ex_flavor_name:
+    type: string
+    label: Flavor
+    description: Type of instance (flavor) to be used
+  ex_key:
+    type: string
+    label: key pair
+    description: Name of the key apir the nova server will use
+  ex_vm_name:
+    type: string
+    description: Name of the VM
+  ex1_vm_names:
+    type: comma_delimited_list
+    description: Name of the VM
+  ex1_image_name:
+    type: string
+    label: Image name or ID
+    description: Image to be used for compute instance
+  ex1_flavor_name:
+    type: string
+    label: Flavor
+    description: Type of instance (flavor) to be used
+  ex1_key:
+    type: string
+    label: key pair
+    description: Name of the key apir the nova server will use
+  int_network_net_id:
+    type: string
+    label: Network name
+    description: Name of the network the nova server will connect to
+  ex1_server_index:
+    type: number
+    label: server index
+    description: Index of server
+    constraint:
+      - range: { min: 1, max: 100 }
+  availability_zone_0:
+    type: string
+    description: availabilityzone name
+  
+
+resources:
+  ex_software_config_0:
+    type: OS::Heat::SoftwareConfig
+    properties:
+      group: ungrouped
+      config:
+          params:
+            $stack_name: { get_param: 'OS::stack_name' }
+
+  ex_nova_serverGroup:
+    type: OS::Nova::ServerGroup
+    properties:
+      vnf_id: { get_param: vnf_id }
+      vf_module_id:  { get_param: vf_module_id }
+      vnf_name:  { get_param: vnf_name }
+      availability_zones: { list_join: [',', [ { get_param: availability_zone_0 }, { get_param: availability_zone_1 } ] ] }
+
+  ex_nova_server_0:
+    type: OS::Nova::Server
+    properties:
+      name: { get_param: ex_vm_name }
+      metadata:
+        vnf_id: { get_param: vnf_id }
+        vf_module_id: { get_param: vf_module_id }
+        vnf_name: { get_param: vnf_name }
+      image: { get_param: ex_image_name }
+      flavor: { get_param: ex_flavor_name }
+      key_name: { get_param: ex_key }
+      networks:
+          - network: { get_param: int_network_net_id }
+      user_data:
+        get_resource: ex_software_config_0
+
+  ex1_nova_server_0:
+    type: OS::Nova::Server
+    properties:
+      name: { get_param: [ ex1_vm_names, 0 ] }
+      metadata:
+        vnf_id: { get_param: vnf_id }
+        vf_module_id: { get_param: vf_module_id }
+        vnf_name: { get_param: vnf_name }
+      image: { get_param: ex1_image_name}
+      flavor: { get_param: ex1_flavor_name }
+      key_name: { get_param: ex1_key }
+
+  ex1_nova_server_1:
+    type: OS::Nova::Server
+    properties:
+      name: { get_param: [ ex1_vm_names, { get_param: ex1_server_index } ] }
+      metadata:
+        vnf_id: { get_param: vnf_id }
+        vf_module_id: { get_param: vf_module_id }
+        vnf_name: { get_param: vnf_name }
+      image: { get_param: ex1_image_name}
+      flavor: { get_param: ex1_flavor_name }
+      key_name: { get_param: ex1_key }
diff --git a/ice_validator/tests/fixtures/test_referenced_and_defined_parameters_match/fail/missing_param_reference_1.yaml b/ice_validator/tests/fixtures/test_referenced_and_defined_parameters_match/fail/missing_param_reference_1.yaml
new file mode 100644 (file)
index 0000000..101a01d
--- /dev/null
@@ -0,0 +1,134 @@
+# -*- coding: utf8 -*-
+# ============LICENSE_START=======================================================
+# org.onap.vvp/validation-scripts
+# ===================================================================
+# Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+# ===================================================================
+#
+# Unless otherwise specified, all software contained herein is licensed
+# under the Apache License, Version 2.0 (the “License”);
+# you may not use this software 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 otherwise specified, all documentation contained herein is licensed
+# under the Creative Commons License, Attribution 4.0 Intl. (the “License”);
+# you may not use this documentation except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#             https://creativecommons.org/licenses/by/4.0/
+#
+# Unless required by applicable law or agreed to in writing, documentation
+# 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============================================
+#
+# ECOMP is a trademark and service mark of AT&T Intellectual Property.
+#
+---
+heat_template_version: 2013-05-23
+
+description: Simple template to deploy a single compute instance
+
+parameters:
+  vnf_id:
+    description: Unique ID for this VNF
+    type: string
+  vf_module_id:
+    description: Unique ID for this VF module
+    type: string
+  vnf_name:
+    type: string
+    description: Unique name for this VNF instance
+  ex_image_name:
+    type: string
+    label: Image name or ID
+    description: Image to be used for compute instance
+  ex_key:
+    type: string
+    label: key pair
+    description: Name of the key apir the nova server will use
+  ex_vm_name:
+    type: string
+    description: Name of the VM
+  ex1_vm_names:
+    type: comma_delimited_list
+    description: Name of the VM
+  ex1_image_name:
+    type: string
+    label: Image name or ID
+    description: Image to be used for compute instance
+  ex1_flavor_name:
+    type: string
+    label: Flavor
+    description: Type of instance (flavor) to be used
+  ex1_key:
+    type: string
+    label: key pair
+    description: Name of the key apir the nova server will use
+  ex1_server_index:
+    type: number
+    label: server index
+    description: Index of server
+    constraint:
+      - range: { min: 1, max: 100 }
+
+resources:
+  ex_software_config_0:
+    type: OS::Heat::SoftwareConfig
+    properties:
+      group: ungrouped
+      config:
+          params:
+            $stack_name: { get_param: 'OS::stack_name' }
+
+  ex_nova_server_0:
+    type: OS::Nova::Server
+    properties:
+      name: { get_param: ex_vm_name }
+      metadata:
+        vnf_id: { get_param: vnf_id }
+        vf_module_id: { get_param: vf_module_id }
+        vnf_name: { get_param: vnf_name }
+      image: { get_param: ex_image_name }
+      flavor: { get_param: ex_flavor_name }
+      key_name: { get_param: ex_key }
+      user_data:
+        get_resource: ex_software_config_0
+
+  ex1_nova_server_0:
+    type: OS::Nova::Server
+    properties:
+      name: { get_param: [ ex1_vm_names, 0 ] }
+      metadata:
+        vnf_id: { get_param: vnf_id }
+        vf_module_id: { get_param: vf_module_id }
+        vnf_name: { get_param: vnf_name }
+        project_id: { get_param: "OS::project_id" }
+      image: { get_param: ex1_image_name }
+      flavor: { get_param: ex1_flavor_name }
+      key_name: { get_param: ex1_key }
+
+  ex1_nova_server_1:
+    type: OS::Nova::Server
+    properties:
+      name: { get_param: [ ex1_vm_names, { get_param: ex1_server_index } ] }
+      metadata:
+        vnf_id: { get_param: vnf_id }
+        vf_module_id: { get_param: vf_module_id }
+        vnf_name: { get_param: vnf_name }
+      image: { get_param: ex1_image_name}
+      flavor: { get_param: ex1_flavor_name }
+      key_name: { get_param: ex1_key }
diff --git a/ice_validator/tests/fixtures/test_referenced_and_defined_parameters_match/fail/missing_param_reference_2.yaml b/ice_validator/tests/fixtures/test_referenced_and_defined_parameters_match/fail/missing_param_reference_2.yaml
new file mode 100644 (file)
index 0000000..10dd0dd
--- /dev/null
@@ -0,0 +1,120 @@
+heat_template_version: 2013-05-23
+
+description: Simple template to deploy a single compute instance
+
+parameters:
+  vnf_id:
+    description: Unique ID for this VNF
+    type: string
+  vf_module_id:
+    description: Unique ID for this VF module
+    type: string
+  vnf_name:
+    type: string
+    description: Unique name for this VNF instance
+  ex_image_name:
+    type: string
+    label: Image name or ID
+    description: Image to be used for compute instance
+  ex_flavor_name:
+    type: string
+    label: Flavor
+    description: Type of instance (flavor) to be used
+  ex_key:
+    type: string
+    label: key pair
+    description: Name of the key apir the nova server will use
+  ex_vm_name:
+    type: string
+    description: Name of the VM
+  ex1_vm_names:
+    type: comma_delimited_list
+    description: Name of the VM
+  ex1_image_name:
+    type: string
+    label: Image name or ID
+    description: Image to be used for compute instance
+  ex1_flavor_name:
+    type: string
+    label: Flavor
+    description: Type of instance (flavor) to be used
+  ex1_key:
+    type: string
+    label: key pair
+    description: Name of the key apir the nova server will use
+  int_network_net_id:
+    type: string
+    label: Network name
+    description: Name of the network the nova server will connect to
+  ex1_server_index:
+    type: number
+    label: server index
+    description: Index of server
+    constraint:
+      - range: { min: 1, max: 100 }
+  availability_zone_0:
+    type: string
+    description: availabilityzone name
+  availability_zone_1:
+    type: string
+    description: availabilityzone name
+  availability_zone_2:
+    type: string
+    description: availabilityzone name
+
+resources:
+  ex_software_config_0:
+    type: OS::Heat::SoftwareConfig
+    properties:
+      group: ungrouped
+      config:
+          params:
+            $stack_name: { get_param: 'OS::stack_name' }
+
+  ex_nova_serverGroup:
+    type: OS::Nova::ServerGroup
+    properties:
+      vnf_id: { get_param: vnf_id }
+      vf_module_id:  { get_param: vf_module_id }
+      vnf_name:  { get_param: vnf_name }
+      availability_zones: { list_join: [',', [ { get_param: availability_zone_0 }, { get_param: availability_zone_2 } ] ] }
+
+  ex_nova_server_0:
+    type: OS::Nova::Server
+    properties:
+      name: { get_param: ex_vm_name }
+      metadata:
+        vnf_id: { get_param: vnf_id }
+        vf_module_id: { get_param: vf_module_id }
+        vnf_name: { get_param: vnf_name }
+      image: { get_param: ex_image_name }
+      flavor: { get_param: ex_flavor_name }
+      key_name: { get_param: ex_key }
+      networks:
+          - network: { get_param: int_network_net_id }
+      user_data:
+        get_resource: ex_software_config_0
+
+  ex1_nova_server_0:
+    type: OS::Nova::Server
+    properties:
+      name: { get_param: [ ex1_vm_names, 0 ] }
+      metadata:
+        vnf_id: { get_param: vnf_id }
+        vf_module_id: { get_param: vf_module_id }
+        vnf_name: { get_param: vnf_name }
+      image: { get_param: ex1_image_name}
+      flavor: { get_param: ex1_flavor_name }
+      key_name: { get_param: ex1_key }
+
+  ex1_nova_server_1:
+    type: OS::Nova::Server
+    properties:
+      name: { get_param: [ ex1_vm_names, { get_param: ex1_server_index } ] }
+      metadata:
+        vnf_id: { get_param: vnf_id }
+        vf_module_id: { get_param: vf_module_id }
+        vnf_name: { get_param: vnf_name }
+      image: { get_param: ex1_image_name}
+      flavor: { get_param: ex1_flavor_name }
+      key_name: { get_param: ex1_key }
index 46ea4cd..8f1e3bb 100644 (file)
@@ -77,7 +77,7 @@ parameters:
   ex1_flavor_name:
     type: string
     label: Flavor
-    description: Type of instance (flavor) to be used  
+    description: Type of instance (flavor) to be used
   ex1_key:
     type: string
     label: key pair
@@ -92,6 +92,12 @@ parameters:
     description: Index of server
     constraint:
       - range: { min: 1, max: 100 }
+  availability_zone_0:
+    type: string
+    description: availabilityzone name
+  availability_zone_1:
+    type: string
+    description: availabilityzone name
 
 resources:
   ex_software_config_0:
@@ -102,6 +108,14 @@ resources:
           params:
             $stack_name: { get_param: 'OS::stack_name' }
 
+  ex_nova_serverGroup:
+    type: OS::Nova::ServerGroup
+    properties:
+      vnf_id: { get_param: vnf_id }
+      vf_module_id:  { get_param: vf_module_id }
+      vnf_name:  { get_param: vnf_name }
+      availability_zones: { list_join: [',', [ { get_param: availability_zone_0 }, { get_param: availability_zone_1 } ] ] }
+
   ex_nova_server_0:
     type: OS::Nova::Server
     properties:
@@ -140,4 +154,4 @@ resources:
         vnf_name: { get_param: vnf_name }
       image: { get_param: ex1_image_name}
       flavor: { get_param: ex1_flavor_name }
-      key_name: { get_param: ex1_key }
\ No newline at end of file
+      key_name: { get_param: ex1_key }
diff --git a/ice_validator/tests/fixtures/test_volume_resource_ids/fail/mismatch_vm_type_volume_id_nova_server_id_2.yaml b/ice_validator/tests/fixtures/test_volume_resource_ids/fail/mismatch_vm_type_volume_id_nova_server_id_2.yaml
new file mode 100644 (file)
index 0000000..935c867
--- /dev/null
@@ -0,0 +1,60 @@
+heat_template_version: 2015-04-30
+
+description: Heat template description
+
+parameters:
+
+  vnf_id:
+    type: string
+    description: Unique ID for this VNF instance
+
+  vf_module_id:
+    type: string
+    description: Unique ID for this VF module
+
+  vnf_name:
+    type: string
+    description: Unique name for this VNF instance
+
+  admin_names:
+    type: comma_delimited_list
+    description: Names attribute for the VMs
+
+  availability_zone_0:
+    type: string
+    description: availability zone to be used
+
+  admin_flavor_name:
+    type: string
+    description: flavor to be used to create this vm must be one of the following flavors
+
+  admin_volume_ids:
+    type: json
+    description: Unique IDs for volumes
+
+
+resources:
+
+  admin_server_0:
+    type: OS::Nova::Server
+    properties:
+      availability_zone: { get_param: availability_zone_0 }
+      name: { get_param: [admin2_names, 0]  }
+      block_device_mapping: [{ device_name: "vda", volume_id: { get_param : [admin_volume_ids, 0] }, delete_on_termination : "false" }]
+      flavor: { get_param: admin2_flavor_name}
+      metadata:
+        vnf_name: { get_param: vnf_name }
+        vnf_id: { get_param: vnf_id }
+        vf_module_id: { get_param: vf_module_id }
+
+  admin_server_1:
+    type: OS::Nova::Server
+    properties:
+      availability_zone: { get_param: availability_zone_0 }
+      name: { get_param: [admin_names, 1]  }
+      block_device_mapping: [{ device_name: "vda", volume_id : { get_param : [admin_volume_ids, 1] }, delete_on_termination : "false" }]
+      flavor: { get_param: admin_flavor_name}
+      metadata:
+        vnf_name: { get_param: vnf_name }
+        vnf_id: { get_param: vnf_id }
+        vf_module_id: { get_param: vf_module_id }
diff --git a/ice_validator/tests/fixtures/test_volume_resource_ids/fail/mismatch_vm_type_volume_id_param_2.yaml b/ice_validator/tests/fixtures/test_volume_resource_ids/fail/mismatch_vm_type_volume_id_param_2.yaml
new file mode 100644 (file)
index 0000000..05b760c
--- /dev/null
@@ -0,0 +1,61 @@
+heat_template_version: 2015-04-30
+
+description: Heat template description
+
+parameters:
+
+  vnf_id:
+    type: string
+    description: Unique ID for this VNF instance
+
+  vf_module_id:
+    type: string
+    description: Unique ID for this VF module
+
+  vnf_name:
+    type: string
+    description: Unique name for this VNF instance
+
+  admin_names:
+    type: comma_delimited_list
+    description: Names attribute for the VMs
+
+  availability_zone_0:
+    type: string
+    description: availability zone to be used
+
+  admin_flavor_name:
+    type: string
+    description: flavor to be used to create this vm must be one of the following flavors
+
+  admin_volume_ids:
+    type: json
+    description: Unique IDs for volumes
+
+
+
+resources:
+
+  admin_server_0:
+    type: OS::Nova::Server
+    properties:
+      availability_zone: { get_param: availability_zone_0 }
+      name: { get_param: [admin_names, 0]  }
+      block_device_mapping: [{ device_name: "vda", volume_id: { get_param : [admin2_volume_ids, 0] }, delete_on_termination : "false" }]
+      flavor: { get_param: admin_flavor_name}
+      metadata:
+        vnf_name: { get_param: vnf_name }
+        vnf_id: { get_param: vnf_id }
+        vf_module_id: { get_param: vf_module_id }
+
+  admin_server_1:
+    type: OS::Nova::Server
+    properties:
+      availability_zone: { get_param: availability_zone_0 }
+      name: { get_param: [admin_names, 1]  }
+      block_device_mapping: [{ device_name: "vda", volume_id : { get_param : [admin_volume_ids, 1] }, delete_on_termination : "false" }]
+      flavor: { get_param: admin_flavor_name}
+      metadata:
+        vnf_name: { get_param: vnf_name }
+        vnf_id: { get_param: vnf_id }
+        vf_module_id: { get_param: vf_module_id }
diff --git a/ice_validator/tests/fixtures/test_volume_resource_ids/fail/mismatch_vm_type_volume_id_volume_attachment_2.yaml b/ice_validator/tests/fixtures/test_volume_resource_ids/fail/mismatch_vm_type_volume_id_volume_attachment_2.yaml
new file mode 100644 (file)
index 0000000..673a8db
--- /dev/null
@@ -0,0 +1,70 @@
+heat_template_version: 2015-04-30
+
+description: Heat template using json string for volumes
+
+parameters:
+
+  vnf_id:
+    type: string
+    description: Unique ID for this VNF instance
+
+  vf_module_id:
+    type: string
+    description: Unique ID for this VF module
+
+  vnf_name:
+    type: string
+    description: Unique name for this VNF instance
+
+  admin_names:
+    type: comma_delimited_list
+    description: Names attribute for the VMs
+
+  availability_zone_0:
+    type: string
+    description: availability zone to be used
+
+  admin_flavor_name:
+    type: string
+    description: flavor to be used to create this vm must be one of the following flavors
+
+  admin_volume_ids:
+    type: json
+    description: Unique IDs for volumes
+
+
+resources:
+
+  admin_server_0:
+    type: OS::Nova::Server
+    properties:
+      availability_zone: { get_param: availability_zone_0 }
+      name: { get_param: [admin_names, 0]  }
+      flavor: { get_param: admin_flavor_name}
+      metadata:
+        vnf_name: { get_param: vnf_name }
+        vnf_id: { get_param: vnf_id }
+        vf_module_id: { get_param: vf_module_id }
+
+  admin_server_1:
+    type: OS::Nova::Server
+    properties:
+      availability_zone: { get_param: availability_zone_0 }
+      name: { get_param: [admin_names, 1]  }
+      flavor: { get_param: admin_flavor_name}
+      metadata:
+        vnf_name: { get_param: vnf_name }
+        vnf_id: { get_param: vnf_id }
+        vf_module_id: { get_param: vf_module_id }
+
+  admin_volume_attachment_0:
+    type: OS::Cinder::VolumeAttachment
+    properties:
+      volume_id: {get_param: [admin_volume_ids, 0]}
+      instance_uuid: {get_resource: admin_server_0}
+
+  admin_volume_attachment_1:
+    type: OS::Cinder::VolumeAttachment
+    properties:
+      volume_id: {get_param: [admin2_volume_ids, 1]}
+      instance_uuid: {get_resource: admin_server_1}
diff --git a/ice_validator/tests/fixtures/test_volume_resource_ids/pass/valid_template_2.yaml b/ice_validator/tests/fixtures/test_volume_resource_ids/pass/valid_template_2.yaml
new file mode 100644 (file)
index 0000000..d1ca7d5
--- /dev/null
@@ -0,0 +1,70 @@
+heat_template_version: 2015-04-30
+
+description: Heat template using json string for volumes
+
+parameters:
+
+  vnf_id:
+    type: string
+    description: Unique ID for this VNF instance
+
+  vf_module_id:
+    type: string
+    description: Unique ID for this VF module
+
+  vnf_name:
+    type: string
+    description: Unique name for this VNF instance
+
+  admin_names:
+    type: comma_delimited_list
+    description: Names attribute for the VMs
+
+  availability_zone_0:
+    type: string
+    description: availability zone to be used
+
+  admin_flavor_name:
+    type: string
+    description: flavor to be used to create this vm must be one of the following flavors
+
+  admin_volume_ids:
+    type: json
+    description: Unique IDs for volumes
+
+
+resources:
+
+  admin_server_0:
+    type: OS::Nova::Server
+    properties:
+      availability_zone: { get_param: availability_zone_0 }
+      name: { get_param: [admin_names, 0]  }
+      flavor: { get_param: admin_flavor_name}
+      metadata:
+        vnf_name: { get_param: vnf_name }
+        vnf_id: { get_param: vnf_id }
+        vf_module_id: { get_param: vf_module_id }
+
+  admin_server_1:
+    type: OS::Nova::Server
+    properties:
+      availability_zone: { get_param: availability_zone_0 }
+      name: { get_param: [admin_names, 1]  }
+      flavor: { get_param: admin_flavor_name}
+      metadata:
+        vnf_name: { get_param: vnf_name }
+        vnf_id: { get_param: vnf_id }
+        vf_module_id: { get_param: vf_module_id }
+
+  admin_volume_attachment_0:
+    type: OS::Cinder::VolumeAttachment
+    properties:
+      volume_id: {get_param: [admin_volume_ids, 0]}
+      instance_uuid: {get_resource: admin_server_0}
+
+  admin_volume_attachment_1:
+    type: OS::Cinder::VolumeAttachment
+    properties:
+      volume_id: {get_param: [admin_volume_ids, 1]}
+      instance_uuid: {get_resource: admin_server_1}
diff --git a/ice_validator/tests/fixtures/test_volume_resource_ids/pass/valid_template_3.yaml b/ice_validator/tests/fixtures/test_volume_resource_ids/pass/valid_template_3.yaml
new file mode 100644 (file)
index 0000000..c6d9d87
--- /dev/null
@@ -0,0 +1,59 @@
+heat_template_version: 2015-04-30
+
+description: Heat template description
+
+parameters:
+
+  vnf_id:
+    type: string
+    description: Unique ID for this VNF instance
+
+  vf_module_id:
+    type: string
+    description: Unique ID for this VF module
+
+  vnf_name:
+    type: string
+    description: Unique name for this VNF instance
+
+  admin_names:
+    type: comma_delimited_list
+    description: Names attribute for the VMs
+
+  availability_zone_0:
+    type: string
+    description: availability zone to be used
+
+  admin_flavor_name:
+    type: string
+    description: flavor to be used to create this vm must be one of the following flavors
+
+  admin_volume_ids:
+    type: json
+    description: Unique IDs for volumes
+
+resources:
+
+  admin_server_0:
+    type: OS::Nova::Server
+    properties:
+      availability_zone: { get_param: availability_zone_0 }
+      name: { get_param: [admin_names, 0]  }
+      block_device_mapping: [{ device_name: "vda", volume_id: { get_param : [admin_volume_ids, 0] }, delete_on_termination : "false" }]
+      flavor: { get_param: admin_flavor_name}
+      metadata:
+        vnf_name: { get_param: vnf_name }
+        vnf_id: { get_param: vnf_id }
+        vf_module_id: { get_param: vf_module_id }
+
+  admin_server_1:
+    type: OS::Nova::Server
+    properties:
+      availability_zone: { get_param: availability_zone_0 }
+      name: { get_param: [admin_names, 1]  }
+      block_device_mapping: [{ device_name: "vda", volume_id : { get_param : [admin_volume_ids, 1] }, delete_on_termination : "false" }]
+      flavor: { get_param: admin_flavor_name}
+      metadata:
+        vnf_name: { get_param: vnf_name }
+        vnf_id: { get_param: vnf_id }
+        vf_module_id: { get_param: vf_module_id }
index 3f0acda..a6a7334 100644 (file)
@@ -97,7 +97,10 @@ def test_volume_resource_ids(heat_template):
                         v3.get('get_resource'))
                     if not volume_id:
                         continue
-                    volume_id = volume_id.lower()
+                    if isinstance(volume_id, list):
+                        volume_id = volume_id[0].lower()
+                    else:
+                        volume_id = volume_id.lower()
 
                     if vm_type+"_" not in volume_id:
                         invalid_volumes.append(volume_id)
@@ -137,7 +140,10 @@ def test_volume_resource_ids(heat_template):
                 properties['volume_id'].get('get_resource'))
             if not volume_id:
                 continue
-            volume_id = volume_id.lower()
+            if isinstance(volume_id, list):
+                volume_id = volume_id[0].lower()
+            else:
+                volume_id = volume_id.lower()
 
             # do not test the case when the instance_uuid and
             # volume_id are not defined
index 47b0609..19290c0 100644 (file)
@@ -79,6 +79,12 @@ def find_all_get_param_in_yml(yml):
                 elif isinstance(item, str):
                     params.append(item)
             continue
+        elif k == 'list_join':
+            for item in (v if isinstance(v, list) else [v]):
+                if isinstance(item, list):
+                    for d in item:
+                        params.extend(find_all_get_param_in_yml(d))
+            continue
         if isinstance(v, dict):
             params.extend(find_all_get_param_in_yml(v))
         elif isinstance(v, list):