Merge "[VVP] Support pluggable data sources for preload data"
authorsteven stark <steven.stark@att.com>
Wed, 4 Dec 2019 21:35:38 +0000 (21:35 +0000)
committerGerrit Code Review <gerrit@onap.org>
Wed, 4 Dec 2019 21:35:38 +0000 (21:35 +0000)
18 files changed:
ice_validator/tests/fixtures/test_allowed_address_pairs_include_vm_type_network_role/fail/contrail/fail.yaml [deleted file]
ice_validator/tests/fixtures/test_allowed_address_pairs_include_vm_type_network_role/fail/contrail/vmi_fail.yaml [deleted file]
ice_validator/tests/fixtures/test_allowed_address_pairs_include_vm_type_network_role/fail/fail.yaml [moved from ice_validator/tests/fixtures/test_allowed_address_pairs_include_vm_type_network_role/fail/neutron/fail.yaml with 60% similarity]
ice_validator/tests/fixtures/test_allowed_address_pairs_include_vm_type_network_role/pass/contrail/pass.yaml [deleted file]
ice_validator/tests/fixtures/test_allowed_address_pairs_include_vm_type_network_role/pass/contrail/vmi_pass.yaml [deleted file]
ice_validator/tests/fixtures/test_allowed_address_pairs_include_vm_type_network_role/pass/contrail/vmi_pass_exemption.yaml [deleted file]
ice_validator/tests/fixtures/test_allowed_address_pairs_include_vm_type_network_role/pass/pass.yaml [moved from ice_validator/tests/fixtures/test_allowed_address_pairs_include_vm_type_network_role/pass/neutron/valid_template.yaml with 72% similarity]
ice_validator/tests/fixtures/test_contrail_instance_ip_parameters/fail/fail_base.yaml
ice_validator/tests/fixtures/test_contrail_instance_ip_parameters/fail/fail_module.yaml
ice_validator/tests/helpers.py
ice_validator/tests/structures.py
ice_validator/tests/test_internal_networks.py
ice_validator/tests/test_network_format.py
ice_validator/tests/test_neutron_port_fixed_ips_subnet.py
ice_validator/tests/test_non_server_name.py
ice_validator/tests/test_vm_class_has_unique_type.py
ice_validator/tests/test_vm_type_case.py
ice_validator/tests/utils/ports.py

diff --git a/ice_validator/tests/fixtures/test_allowed_address_pairs_include_vm_type_network_role/fail/contrail/fail.yaml b/ice_validator/tests/fixtures/test_allowed_address_pairs_include_vm_type_network_role/fail/contrail/fail.yaml
deleted file mode 100644 (file)
index 248f9ec..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-heat_template_version: 2015-04-30
-
-description: fdsafsfsa
-
-parameters:
-
-  TESTDB_priv_floating_ips:
-   type: comma_delimited_list
-   description: asnfjl
-
-  TESTDB_int_priav_floating_ip:
-   type: string
-   description: asnfjl
-
-resources:
-
-  TESTDB_0_priv_vmi_0:
-    type: OS::ContrailV2::VirtualMachineInterface
-    properties:
-      virtual_machine_interface_properties:
-        virtual_machine_interface_properties_service_interface_type: {
-          "priv_interface_type" 
-        }
-      virtual_network_refs:
-        - get_param: priv_net_fqdn
-      virtual_machine_interface_allowed_address_pairs:
-        {
-          virtual_machine_interface_allowed_address_pairs_allowed_address_pair:
-            [{
-              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip:
-                {
-                  virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix: { get_param: [TESTDB_priv_floating_ip, 0] },
-                  virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix_len: "dsafasdF",
-                },
-              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_mac: "sdnfjkas",
-              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_address_mode: "sadfnjasdfknj",
-            }],
-        }
-
-
-  TESTDB_0_int_private_vmi_0:
-    type: OS::ContrailV2::VirtualMachineInterface
-    properties:
-      virtual_machine_interface_properties:
-        virtual_machine_interface_properties_service_interface_type: {
-          "priv_interface_type" 
-        }
-      virtual_network_refs:
-        - get_param: priv_net_fqdn
-      virtual_machine_interface_allowed_address_pairs:
-        {
-          virtual_machine_interface_allowed_address_pairs_allowed_address_pair:
-            [{
-              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip:
-                {
-                  virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix: { get_param: TESTDB_int_priav_floating_ip },
-                  virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix_len: "dsafasdF",
-                },
-              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_mac: "sdnfjkas",
-              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_address_mode: "sadfnjasdfknj",
-            }],
-        }
-
-  #testnlksadf:
-  #  type: http://www.google.com
diff --git a/ice_validator/tests/fixtures/test_allowed_address_pairs_include_vm_type_network_role/fail/contrail/vmi_fail.yaml b/ice_validator/tests/fixtures/test_allowed_address_pairs_include_vm_type_network_role/fail/contrail/vmi_fail.yaml
deleted file mode 100644 (file)
index 5113bd4..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-# -*- coding: utf8 -*-
-# ============LICENSE_START=======================================================
-# org.onap.vvp/validation-scripts
-# ===================================================================
-# Copyright © 2019 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============================================
-#
-#
-
-heat_template_version: 2015-04-30
-
-description: fdsafsfsa
-
-parameters:
-
-  invalid_format:
-    type: string
-
-resources:
-
-  fw_0_oam_vmi_0:
-    type: OS::ContrailV2::VirtualMachineInterface
-    properties:
-      virtual_machine_interface_allowed_address_pairs:
-        virtual_machine_interface_allowed_address_pairs_allowed_address_pair:
-          [{
-             virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip:
-               {
-                 virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix: { get_param: invalid_format },
-               },
-           }]
@@ -95,6 +95,22 @@ parameters:
     type: string
     description: lb_extanet_floating_ip
 
+  cidr:
+    type: string
+    description: naslfnsakl
+
+  badparameter:
+    type: string
+    description: naslfnsakl
+
+  TESTDB_int_priav_floating_ip:
+   type: string
+   description: asnfjl
+
+  TESTDB_priav_floating_ip:
+   type: string
+   description: asnfjl
+
 resources:
 
   lb_server_0:
@@ -137,3 +153,63 @@ resources:
           network: { get_param: extnet_net_name }
           allowed_address_pairs:
             - ip_address: { get_param: lb_extanet_floating_ip }
+
+  lb_0_extnet_port_0:
+        type: OS::Neutron::Port
+        properties:
+          network: { get_param: extnet_net_name }
+          allowed_address_pairs:
+            - ip_address:
+                str_replace:
+                  template: $IPADDR$CIDR
+                  params:
+                    $IPADDR: { get_param: lb_extanet_floating_ip }
+                    $CIDR: { get_param: cidr}
+
+  TESTDB_0_int_private_vmi_0:
+    type: OS::ContrailV2::VirtualMachineInterface
+    properties:
+      virtual_machine_interface_properties:
+        virtual_machine_interface_properties_service_interface_type: {
+          "priv_interface_type" 
+        }
+      virtual_network_refs:
+        - get_param: priv_net_fqdn
+      virtual_machine_interface_allowed_address_pairs:
+        {
+          virtual_machine_interface_allowed_address_pairs_allowed_address_pair:
+            [{
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip:
+                {
+                  virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix: { get_param: TESTDB_int_priav_floating_ip },
+                  virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix_len: "dsafasdF",
+                },
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_mac: "sdnfjkas",
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_address_mode: "sadfnjasdfknj",
+            }],
+        }
+
+
+  TESTDB_0_private_vmi_0:
+    type: OS::ContrailV2::VirtualMachineInterface
+    properties:
+      virtual_machine_interface_properties:
+        virtual_machine_interface_properties_service_interface_type: {
+          "priv_interface_type" 
+        }
+      virtual_network_refs:
+        - get_param: priv_net_fqdn
+      virtual_machine_interface_allowed_address_pairs:
+        {
+          virtual_machine_interface_allowed_address_pairs_allowed_address_pair:
+            [{
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip:
+                {
+                  virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix: { get_param: TESTDB_priav_floating_ip },
+                  virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix_len: "dsafasdF",
+                },
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_mac: "sdnfjkas",
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_address_mode: "sadfnjasdfknj",
+            }],
+        }
+
diff --git a/ice_validator/tests/fixtures/test_allowed_address_pairs_include_vm_type_network_role/pass/contrail/pass.yaml b/ice_validator/tests/fixtures/test_allowed_address_pairs_include_vm_type_network_role/pass/contrail/pass.yaml
deleted file mode 100644 (file)
index df4ca00..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-heat_template_version: 2015-04-30
-
-description: fdsafsfsa
-
-parameters:
-
-  TESTDB_priv_floating_ip:
-   type: string
-   description: asnfjl
-
-  TESTDB_int_private_floating_ips:
-   type: comma_delimited_list
-   description: asnfjl
-
-resources:
-
-  TESTDB_0_priv_vmi_0:
-    type: OS::ContrailV2::VirtualMachineInterface
-    properties:
-      virtual_machine_interface_properties:
-        virtual_machine_interface_properties_service_interface_type: {
-          "priv_interface_type" 
-        }
-      virtual_network_refs:
-        - get_param: priv_net_fqdn
-      virtual_machine_interface_allowed_address_pairs:
-        {
-          virtual_machine_interface_allowed_address_pairs_allowed_address_pair:
-            [{
-              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip:
-                {
-                  virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix: { get_param: TESTDB_priv_floating_ip },
-                  virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix_len: "dsafasdF",
-                },
-              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_mac: "sdnfjkas",
-              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_address_mode: "sadfnjasdfknj",
-            }],
-        }
-
-
-  TESTDB_0_int_private_vmi_0:
-    type: OS::ContrailV2::VirtualMachineInterface
-    properties:
-      virtual_machine_interface_properties:
-        virtual_machine_interface_properties_service_interface_type: {
-          "priv_interface_type" 
-        }
-      virtual_network_refs:
-        - get_param: priv_net_fqdn
-      virtual_machine_interface_allowed_address_pairs:
-        {
-          virtual_machine_interface_allowed_address_pairs_allowed_address_pair:
-            [{
-              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip:
-                {
-                  virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix: { get_param: [TESTDB_int_private_floating_ips, 0] },
-                  virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix_len: "dsafasdF",
-                },
-              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_mac: "sdnfjkas",
-              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_address_mode: "sadfnjasdfknj",
-            }],
-        }
-
-  #testnlksadf:
-  #  type: http://www.google.com
diff --git a/ice_validator/tests/fixtures/test_allowed_address_pairs_include_vm_type_network_role/pass/contrail/vmi_pass.yaml b/ice_validator/tests/fixtures/test_allowed_address_pairs_include_vm_type_network_role/pass/contrail/vmi_pass.yaml
deleted file mode 100644 (file)
index 959c846..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-# -*- coding: utf8 -*-
-# ============LICENSE_START=======================================================
-# org.onap.vvp/validation-scripts
-# ===================================================================
-# Copyright © 2019 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============================================
-#
-#
-
-heat_template_version: 2015-04-30
-
-description: fdsafsfsa
-
-parameters:
-
-  fw_oam_floating_ip:
-    type: string
-
-resources:
-
-  fw_0_oam_vmi_0:
-    type: OS::ContrailV2::VirtualMachineInterface
-    properties:
-      virtual_machine_interface_allowed_address_pairs:
-        virtual_machine_interface_allowed_address_pairs_allowed_address_pair:
-          [{
-             virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip:
-               {
-                 virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix: { get_param: fw_oam_floating_ip },
-               },
-           }]
diff --git a/ice_validator/tests/fixtures/test_allowed_address_pairs_include_vm_type_network_role/pass/contrail/vmi_pass_exemption.yaml b/ice_validator/tests/fixtures/test_allowed_address_pairs_include_vm_type_network_role/pass/contrail/vmi_pass_exemption.yaml
deleted file mode 100644 (file)
index 2d9ca4a..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-# -*- coding: utf8 -*-
-# ============LICENSE_START=======================================================
-# org.onap.vvp/validation-scripts
-# ===================================================================
-# Copyright © 2019 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============================================
-#
-#
-
-heat_template_version: 2015-04-30
-
-description: fdsafsfsa
-
-parameters:
-
-  other_format:
-    type: string
-
-  other_ips:
-    type: comma_delimited_list
-
-resources:
-
-  fw_0_oam_vmi_0:
-    type: OS::ContrailV2::VirtualMachineInterface
-    metadata:
-      aap_exempt:
-        - other_format
-    properties:
-      virtual_machine_interface_allowed_address_pairs:
-        virtual_machine_interface_allowed_address_pairs_allowed_address_pair:
-          [{
-             virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip:
-               {
-                 virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix: { get_param: other_format },
-               },
-           }]
-
-  fw_0_oam_vmi_1:
-    type: OS::ContrailV2::VirtualMachineInterface
-    metadata:
-      aap_exempt:
-        - other_format
-        - other_ips
-    properties:
-      virtual_machine_interface_allowed_address_pairs:
-        virtual_machine_interface_allowed_address_pairs_allowed_address_pair:
-          [{
-             virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip:
-               {
-                 virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix: { get_param: [other_ips, 1] },
-               },
-           }]
\ No newline at end of file
@@ -87,37 +87,33 @@ parameters:
     type: string
     description: network id for the internal network intranet 
 
-  db_int_intranet_ip_0:
+  db_int_intranet_floating_ip:
     type: string
-    description: db_int_intranet_ip_0
+    description: db_int_intranet_floating_ip
 
-  db_int_intranet_v6_ip_0:
+  db_int_intranet_floating_v6_ip:
     type: string
-    description: db_int_intranet_v6_ip_0
+    description: db_int_intranet_floating_v6_ip
 
-  db_int_intranet_ips:
+  db_int_intranet_floating_ips:
     type: comma_delimited_list
-    description: db_int_intranet_ips
+    description: db_int_intranet_floating_ips
 
-  db_int_intranet_v6_ips:
+  db_int_intranet_floating_v6_ips:
     type: comma_delimited_list
-    description: db_int_intranet_v6_ips
+    description: db_int_intranet_floating_v6_ips
 
   db_int_intranet_floating_ip:
     type: string
     description: db_int_intranet_floating_ip
 
-  db_int_intranet_floating_v6_ip:
-    type: string
-    description: db_int_intranet_floating_v6_ip
-
-  lb_extnet_ip_0:
+  lb_extnet_floating_ip:
     type: string
-    description: lb_extnet_ip_0
+    description: lb_extnet_floating_ip
 
-  lb_extnet_v6_ip_0:
+  lb_extnet_floating_v6_ip:
     type: string
-    description: lb_extnet_v6_ip_0
+    description: lb_extnet_floating_v6_ip
 
   lb_extnet_ips:
     type: comma_delimited_list
@@ -131,9 +127,9 @@ parameters:
     type: string
     description: lb_extnet_floating_ip
 
-  lb_extnet_floating_v6_ip:
+  cidr:
     type: string
-    description: lb_extnet_floating_v6_ip
+    description: nafskldnaklsdf
 
 resources:
 
@@ -150,6 +146,7 @@ resources:
         - port: { get_resource: lb_3_extnet_0_port }
         - port: { get_resource: lb_4_extnet_0_port }
         - port: { get_resource: lb_5_extnet_0_port }  
+        - port: { get_resource: lb_6_extnet_0_port }  
       metadata:
         vnf_name: { get_param: vnf_name }
         vnf_id: { get_param: vnf_id }
@@ -173,86 +170,104 @@ resources:
         vnf_id: { get_param: vnf_id }
         vf_module_id: { get_param: vf_module_id }
 
-  db_0_int_intranet_0_port:
+  db_0_int_intranet_port_0:
         type: OS::Neutron::Port
         properties:
           network: { get_param: int_intranet_net_id }
           allowed_address_pairs:
-            - ip_address: { get_param: db_int_intranet_ip_0 }
+            - ip_address: { get_param: db_int_intranet_floating_ip }
 
-  db_1_int_intranet_0_port:
+  db_0_int_intranet_port_1:
         type: OS::Neutron::Port
         properties:
           network: { get_param: int_intranet_net_id }
           allowed_address_pairs:
-            - ip_address: { get_param: db_int_intranet_v6_ip_0 }
+            - ip_address: { get_param: db_int_intranet_floating_v6_ip }
 
-  db_2_int_intranet_0_port:
+  db_0_int_intranet_port_2:
         type: OS::Neutron::Port
         properties:
           network: { get_param: int_intranet_net_id }
           allowed_address_pairs:
-            - ip_address: { get_param: [db_int_intranet_ips, 0] }
+            - ip_address: { get_param: [db_int_intranet_floating_ips, 0] }
 
-  db_3_int_intranet_0_port:
+  db_0_int_intranet_port_3:
         type: OS::Neutron::Port
         properties:
           network: { get_param: int_intranet_net_id }
           allowed_address_pairs:
-            - ip_address: { get_param: [db_int_intranet_v6_ips, 0] }
+            - ip_address: { get_param: [db_int_intranet_floating_v6_ips, 0] }
 
-  db_4_int_intranet_0_port:
+  db_0_int_intranet_port_4:
         type: OS::Neutron::Port
         properties:
           network: { get_param: int_intranet_net_id }
           allowed_address_pairs:
             - ip_address: { get_param: db_int_intranet_floating_ip }
 
-  db_5_int_intranet_0_port:
+  db_0_int_intranet_port_5:
         type: OS::Neutron::Port
         properties:
           network: { get_param: int_intranet_net_id }
           allowed_address_pairs:
             - ip_address: { get_param: db_int_intranet_floating_v6_ip }
 
-  lb_0_extnet_0_port:
+  lb_0_extnet_port_0:
         type: OS::Neutron::Port
         properties:
           network: { get_param: extnet_net_name }
           allowed_address_pairs:
-            - ip_address: { get_param: lb_extnet_ip_0 }
-
-  lb_1_extnet_0_port:
-        type: OS::Neutron::Port
-        properties:
-          network: { get_param: extnet_net_id }
-          allowed_address_pairs:
-            - ip_address: { get_param: lb_extnet_v6_ip_0 }
+            - ip_address: { get_param: lb_extnet_floating_ip }
 
-  lb_2_extnet_0_port:
-        type: OS::Neutron::Port
-        properties:
-          network: { get_param: extnet_net_name }
-          allowed_address_pairs:
-            - ip_address: { get_param: [lb_extnet_ips, 0] }
+  lb_0_extnet_port_1:
+    type: OS::Neutron::Port
+    properties:
+      network: { get_param: extnet_net_id }
+      allowed_address_pairs:
+        - ip_address: { get_param: lb_extnet_floating_v6_ip }
 
-  lb_3_extnet_0_port:
-        type: OS::Neutron::Port
-        properties:
-          network: { get_param: extnet_net_id }
-          allowed_address_pairs:
-            - ip_address: { get_param: [lb_extnet_v6_ips, 0] }
+  lb_0_extnet_port_2:
+    type: OS::Neutron::Port
+    properties:
+      network: { get_param: extnet_net_name }
+      allowed_address_pairs:
+        - ip_address: { get_param: [lb_extnet_ips, 0] }
+    metadata:
+      aap_exempt:
+        - lb_extnet_ips
+
+  lb_0_extnet_port_3:
+    type: OS::Neutron::Port
+    properties:
+      network: { get_param: extnet_net_id }
+      allowed_address_pairs:
+        - ip_address: { get_param: [lb_extnet_v6_ips, 0] }
+    metadata:
+      aap_exempt:
+        - lb_extnet_v6_ips
+
+  lb_0_extnet_port_4:
+    type: OS::Neutron::Port
+    properties:
+      network: { get_param: extnet_net_name }
+      allowed_address_pairs:
+        - ip_address: { get_param: lb_extnet_floating_ip }
 
-  lb_4_extnet_0_port:
-        type: OS::Neutron::Port
-        properties:
-          network: { get_param: extnet_net_name }
-          allowed_address_pairs:
-            - ip_address: { get_param: lb_extnet_floating_ip }
+  lb_0_extnet_port_5:
+    type: OS::Neutron::Port
+    properties:
+      network: { get_param: extnet_net_id }
+      allowed_address_pairs:
+        - ip_address: { get_param: lb_extnet_floating_v6_ip }
 
-  lb_5_extnet_0_port:
-        type: OS::Neutron::Port
-        properties:
-          network: { get_param: extnet_net_id }
-          allowed_address_pairs:
-            - ip_address: { get_param: lb_extnet_floating_v6_ip }
+  lb_0_extnet_port_6:
+    type: OS::Neutron::Port
+    properties:
+      network: { get_param: extnet_net_id }
+      allowed_address_pairs:
+        ip_address:
+          str_replace:
+            template: $IPADDR$CIDR
+            params: 
+              $CIDR: { get_param: cidr }
+              $IPADDR: { get_param: lb_extnet_floating_v6_ip }
index 7043cda..93924f2 100644 (file)
@@ -41,6 +41,10 @@ description: fdsafsfsa
 
 parameters:
 
+  TESTDB_praivate_ips:
+   type: comma_delimited_list
+   description: asnfjl
+
   TESTDB_int_priav_ips:
    type: comma_delimited_list
    description: asnfjl
@@ -75,5 +79,13 @@ resources:
       instance_ip_address: { get_param: [TESTDB_private_ips, 1] }
       subnet_uuid: { get_param: privte_v6_subnet_id }
 
+  TESTDB_0_private_vmi_2_IP_0:
+    type: OS::ContrailV2::InstanceIp
+    properties:
+      virtual_machine_interface_refs: { get_resource: TESTDB_1_priv_vmi_0 }
+      virtual_network_refs: [{ get_param: priv_net_fqdn }]
+      instance_ip_address: { get_param: [TESTDB_praivate_ips, 1] }
+      subnet_uuid: { get_param: privte_v6_subnet_id }
+
   #testnlksadf:
   #  type: http://www.google.com
index 66dd13d..def7b3d 100644 (file)
@@ -49,6 +49,10 @@ parameters:
    type: string
    description: asnfjl
 
+  TESTDB_praivate_ips:
+   type: string
+   description: asnfjl
+
   priv_subnet_id:
    type: string
    description: asnfjl
@@ -75,8 +79,16 @@ resources:
       instance_ip_address: { get_param: [TESTDB_private_ips, 1] }
       subnet_uuid: { get_param: privte_v6_subnet_id }
 
+  TESTDB_0_private_vmi_1_IP_1:
+    type: OS::ContrailV2::InstanceIp
+    properties:
+      virtual_machine_interface_refs: { get_resource: TESTDB_1_priv_vmi_0 }
+      virtual_network_refs: [{ get_param: priv_net_fqdn }]
+      instance_ip_address: { get_param: [TESTDB_praivate_ips, 1] }
+      subnet_uuid: { get_param: privte_v6_subnet_id }
+
   other_0_int_priv_vmi_0_IP_0:
     type: OS::ContrailV2::InstanceIp
     properties:
       instance_ip_address: { get_param: [other_int_priv_ips, 0] }
-      subnet_uuid: { get_param: int_priv_subnet_id }
\ No newline at end of file
+      subnet_uuid: { get_param: int_priv_subnet_id }
index 424dde1..f4a368c 100644 (file)
@@ -53,6 +53,23 @@ __path__ = [os.path.dirname(os.path.abspath(__file__))]
 DEFAULT_OUTPUT_DIR = "{}/../output".format(__path__[0])
 RE_BASE = re.compile(r"(^base$)|(^base_)|(_base_)|(_base$)")
 
+INTRINSIC_FUNCTIONS = [
+    "get_resource",
+    "get_attr",
+    "str_replace",
+    "get_param",
+    "list_join",
+    "get_file",
+    "resource_facade",
+    "Fn::Select",
+    "repeat",
+    "digest",
+    "str_split",
+    "yaql",
+    "map_replace",
+    "map_merge",
+]
+
 
 def is_base_module(template_path):
     basename = os.path.basename(template_path).lower()
@@ -321,12 +338,13 @@ def parameter_type_to_heat_type(parameter):
 
 
 def prop_iterator(resource, *props):
-    terminators = ["get_resource", "get_attr", "str_replace", "get_param"]
     if "properties" in resource:
         resource = resource.get("properties")
     props = list(props)
 
-    if isinstance(resource, dict) and any(x for x in terminators if x in resource):
+    if isinstance(resource, dict) and any(
+        x for x in INTRINSIC_FUNCTIONS if x in resource
+    ):
         yield resource
     else:
         prop = resource.get(props.pop(0))
@@ -426,5 +444,9 @@ def is_nova_server(resource):
     """
     checks resource is a nova server
     """
-    return isinstance(resource, dict) and "type" in resource and "properties" in resource and resource.get("type") == "OS::Nova::Server"
-
+    return (
+        isinstance(resource, dict)
+        and "type" in resource
+        and "properties" in resource
+        and resource.get("type") == "OS::Nova::Server"
+    )
index 887917c..09dd222 100644 (file)
@@ -563,7 +563,7 @@ class NovaServerProcessor(HeatProcessor):
             d = dict(
                 flavor=cls.get_flavor(resource),
                 image=cls.get_image(resource),
-                networks=cls.get_network(resource),
+                network_role=cls.get_network(resource),
             )
             if all(d.values()):
                 vm_class.update(d)
index 92cad9c..b06467a 100644 (file)
@@ -44,11 +44,11 @@ from tests.test_network_format import NETWORK_RESOURCE_TYPES, RE_INTERNAL_NETWOR
 INTERNAL_NETWORK_PARAMETERS = [
     re.compile(r"int_(.+?)_net_id"),
     re.compile(r"int_(.+?)_net_name"),
+    re.compile(r".*_int_(.+?)_floating(?:_v6)?_ip"),
+    re.compile(r".*_int_(.+?)_floating(?:_v6)?_ips"),
     re.compile(r".*?_int_(.+?)(?:_v6)?_ips"),
     re.compile(r".*?_int_(.+?)(?:_v6)?_ip_\d+"),
     re.compile(r"int_(.+?)(?:_v6)?_subnet_id"),
-    re.compile(r".*_int_(.+?)_floating(?:_v6)?_ip"),
-    re.compile(r".*_int_(.+?)_floating(?:_v6)?_ips"),
     re.compile(r"(?:.*_)?int_(.+?)_security_group"),
 ]
 
index 98fcd37..23e46f9 100644 (file)
@@ -38,7 +38,6 @@
 #
 from itertools import chain
 
-import pytest
 import re
 
 from tests import cached_yaml as yaml
@@ -78,13 +77,9 @@ def test_network_has_subnet(yaml_file):
     with open(yaml_file) as fh:
         yml = yaml.load(fh)
 
-    # skip if resources are not defined
-    if "resources" not in yml:
-        pytest.skip("No resources specified in the heat template")
-
     networks = []
 
-    for k, v in yml["resources"].items():
+    for k, v in yml.get("resources", {}).items():
         if not has_properties(v) or v.get("type") not in ["OS::Neutron::Net"]:
             continue
         # need to check if contrail networks also require subnet
@@ -92,7 +87,7 @@ def test_network_has_subnet(yaml_file):
         # if v.get("type") not in NETWORK_RESOURCE_TYPES:
         networks.append(k)
 
-    for k, v in yml["resources"].items():
+    for k, v in yml.get("resources", {}).items():
         network_prop = v.get("properties", {}).get("network", {}).get("get_resource")
         if (
             not has_properties(v)
index 8c15711..a6c9f91 100644 (file)
 #
 import re
 
-import pytest
 
 from tests.utils.network_roles import get_network_type_from_port
 
 from tests.structures import Heat
-from tests.helpers import validates, load_yaml, get_base_template_from_yaml_files
+from tests.helpers import validates, load_yaml, get_base_template_from_yaml_files, get_param
 from tests.utils.nested_files import get_nested_files
 from .utils.ports import check_parameter_format
 from tests.structures import NeutronPortProcessor
@@ -100,8 +99,6 @@ def test_external_subnet_format(yaml_file):
 @validates("R-84123", "R-76160")
 def test_neutron_port_internal_fixed_ips_subnet_in_base(yaml_files):
     base_path = get_base_template_from_yaml_files(yaml_files)
-    if not base_path:
-        pytest.skip("No base module detected")
     base_heat = load_yaml(base_path)
     base_outputs = base_heat.get("outputs") or {}
     nested_template_paths = get_nested_files(yaml_files)
@@ -128,7 +125,7 @@ def test_neutron_port_internal_fixed_ips_subnet_in_base(yaml_files):
 
                 if "get_param" not in subnet:
                     continue
-                param = subnet.get("get_param")
+                param = get_param(subnet)
                 if param not in base_outputs:
                     errors.append(
                         (
index 9361389..7a5c11f 100644 (file)
@@ -42,7 +42,6 @@ resource property name
 """
 import os
 import collections
-import pytest
 
 from .structures import Heat
 from .structures import HeatProcessor
@@ -74,12 +73,7 @@ def test_non_server_name(yaml_file):
 
     """
     h = Heat(filepath=yaml_file)
-    if not h.resources:
-        pytest.skip("No resources in this template")
-
     non_servers = get_non_servers(h)
-    if not non_servers:
-        pytest.skip("No non-server resources in this template")
 
     bad = []
     for rid, resource in non_servers.items():
index 7020a14..f264edc 100644 (file)
@@ -73,8 +73,8 @@ class VmClassValidator(object):
         self.vm_rids = collections.defaultdict(set)
         self.vm_types = collections.defaultdict(set)
         va_config, self.va_count = CinderVolumeAttachmentProcessor.get_config(resources)
-        if not va_config:
-            pytest.skip("No Cinder Volume Attachment configurations found")
+        if not va_config:
+            pytest.skip("No Cinder Volume Attachment configurations found")
         for rid, resource in resources.items():
             vm_class = NovaServerProcessor.get_vm_class(resource)
             if vm_class:
@@ -98,13 +98,15 @@ class VmClassValidator(object):
         for k, v in self.vm_types.items():
             if len(v) > 1:
                 errors.append(
-                    "vm-type %s has class conflict %s"
+                    "OS::Nova::Server resources with the same vm_type must have identical configurations. "
+                    "The following OS::Nova::Server resources for vm-type %s do not have identical configurations: %s"
                     % (k, ", ".join(str(list(self.vm_classes[c])) for c in v))
                 )
                 classes = list(v)
                 errors.append(
-                    "Differences %s"
-                    % ", ".join([str(key_diff(classes[0], c)) for c in classes[1:]])
+                    "The following attributes are detected differences between "
+                    "OS::Nova::Server's with vm_type %s: %s"
+                    % (k, ", ".join([str(key_diff(classes[0], c)) for c in classes[1:]]))
                 )
         for k, v in self.vm_counts.items():
             if len(v) > 1:
index 3ecd8de..6919404 100644 (file)
@@ -65,8 +65,6 @@ resources:
 import collections
 import re
 
-import pytest
-
 from .structures import Heat
 from .helpers import validates
 
@@ -101,8 +99,6 @@ def test_vm_type_case(yaml_file):
     """
     heat = Heat(filepath=yaml_file)
     resources = heat.resources
-    if not resources:
-        pytest.skip("No resources found")
     bad = collections.defaultdict(list)
     for rid, resource in resources.items():
         vm_type = heat.get_vm_type(rid, resource=resource)
@@ -115,14 +111,10 @@ def test_vm_type_case(yaml_file):
                         param = param[0]
                     if isinstance(param, str) and case_mismatch(vm_type, param):
                         bad[(rid, vm_type)].append((prop, param))
-    if bad:
-        raise AssertionError(
-            "vm-type/parameter case mis-match %s"
-            % (
-                "; ".join(
-                    "resource: %s vm-type: %s %s"
-                    % (k[0], k[1], ", ".join("%s: %s" % i for i in v))
-                    for k, v in bad.items()
-                )
-            )
-        )
+
+    msg = 'vm-type/parameter case mis-match %s' \
+        % '; '.join('resource: %s vm-type: %s %s' % (k[0], k[1],
+                    ', '.join('%s: %s' % i for i in v)) for (k, v) in
+                    bad.items())
+
+    assert not bad, msg
index d65202c..d6c3be9 100644 (file)
@@ -78,7 +78,6 @@ def check_parameter_format(
     heat = Heat(filepath=yaml_file)
     resource_type = resource_processor.resource_type
     resources = heat.get_resource_by_type(resource_type)
-    heat_parameters = heat.parameters
     for rid, resource in resources.items():
         resource_intext, port_match = resource_processor.get_rid_match_tuple(rid)
         if not port_match:
@@ -88,7 +87,6 @@ def check_parameter_format(
             resource_intext != intext
         ):  # skipping if type (internal/external) doesn't match
             continue
-
         for param in prop_iterator(resource, *properties):
             if (
                 param
@@ -96,108 +94,157 @@ def check_parameter_format(
                 and "get_resource" not in param
                 and "get_attr" not in param
             ):
-                # checking parameter uses get_param
-                parameter = param.get("get_param")
-                if not parameter:
-                    msg = (
-                        "Unexpected parameter format for {} {} property {}: {}. "
-                        "Please consult the heat guidelines documentation for details."
-                    ).format(resource_type, rid, properties, param)
-                    invalid_parameters.append(msg)  # should this be a failure?
-                    continue
-
-                # getting parameter if the get_param uses list, and getting official
-                # HEAT parameter type
-                parameter_type = parameter_type_to_heat_type(parameter)
-                if parameter_type == "comma_delimited_list":
-                    parameter = parameter[0]
-                elif parameter_type != "string":
-                    continue
-
-                # checking parameter format = parameter type defined in parameters
-                # section
-                heat_parameter_type = nested_dict.get(
-                    heat_parameters, parameter, "type"
-                )
-                if not heat_parameter_type or heat_parameter_type != parameter_type:
-                    msg = (
-                        "{} {} parameter {} defined as type {} "
-                        + "is being used as type {} in the heat template"
-                    ).format(
-                        resource_type,
-                        properties,
-                        parameter,
-                        heat_parameter_type,
-                        parameter_type,
+                template_parameters = []
+                if "str_replace" in param:
+                    # print(param)
+                    template_parameters.extend(
+                        v
+                        for k, v in nested_dict.get(
+                            param, "str_replace", "params", default={}
+                        ).items()
                     )
-                    invalid_parameters.append(msg)  # should this actually be an error?
-                    continue
-
-                if exemptions_allowed and parameter in get_aap_exemptions(resource):
-                    continue
-
-                # if parameter type is not in regx dict, then it is not supported
-                # by automation
-                regx_dict = regx[resource_intext].get(parameter_type)
-                if not regx_dict:
-                    msg = (
-                        "{} {} {} parameter {} defined as type {} "
-                        "which is required by platform data model for proper "
-                        "assignment and inventory."
-                    ).format(resource_type, rid, properties, parameter, parameter_type)
-                    if exemptions_allowed:
-                        msg = "WARNING: {} {}".format(msg, AAP_EXEMPT_CAVEAT)
-                    invalid_parameters.append(msg)
-                    continue
-
-                # checking if param adheres to guidelines format
-                regexp = regx[resource_intext][parameter_type]["machine"]
-                readable_format = regx[resource_intext][parameter_type]["readable"]
-                match = regexp.match(parameter)
-                if not match:
-                    msg = (
-                        "{} {} property {} parameter {} does not follow {} "
-                        "format {} which is required by platform data model for proper "
-                        "assignment and inventory."
-                    ).format(
+                else:
+                    template_parameters.append(param)
+
+                invalid_template_parameters = []
+                for template_parameter in template_parameters:
+                    # Looping through each parameter to check
+                    # the only case where there can be more than 1 is
+                    # if using str_replace
+                    msg = validate_port_parameter(
                         resource_type,
                         rid,
                         properties,
-                        parameter,
+                        template_parameter,
                         resource_intext,
-                        readable_format,
+                        resource,
+                        regx,
+                        port_match,
+                        exemptions_allowed,
                     )
-                    if exemptions_allowed:
-                        msg = "WARNING: {} {}".format(msg, AAP_EXEMPT_CAVEAT)
-                    invalid_parameters.append(msg)
-                    continue
-
-                # checking that parameter includes correct vm_type/network_role
-                parameter_checks = regx.get("parameter_to_resource_comparisons", [])
-                for check in parameter_checks:
-                    resource_match = port_match.group(check)
-                    if (
-                        resource_match
-                        and not parameter.startswith(resource_match)
-                        and parameter.find("_{}_".format(resource_match)) == -1
-                    ):
-                        msg = (
-                            "{0} {1} property {2} parameter "
-                            "{3} {4} does match resource {4} {5}"
-                        ).format(
-                            resource_type,
-                            rid,
-                            properties,
-                            parameter,
-                            check,
-                            resource_match,
-                        )
-                        invalid_parameters.append(msg)
-                        continue
+
+                    if not msg:
+                        # if we found a valid parameter then
+                        # reset invalide_template_parameters
+                        # and break out of loop
+                        invalid_template_parameters = []
+                        break
+                    else:
+                        # haven't found a valid parameter yet
+                        invalid_template_parameters.append(msg)
+
+                invalid_parameters.extend(x for x in invalid_template_parameters)
 
     assert not invalid_parameters, "%s" % "\n".join(invalid_parameters)
 
 
+def validate_port_parameter(
+    resource_type,
+    rid,
+    properties,
+    param,
+    resource_intext,
+    resource,
+    regx,
+    port_match,
+    exemptions_allowed,
+):
+    """
+    Performs 4 validations
+
+    1) param actually uses get_param
+    2) parameter_type + network_type (internal/external) is a valid combination
+    3) parameter format matches expected format from input dictionary
+    4) the vm_type or network role from resource matches parameter
+
+    If the parameter is present in the resource metadata
+    and exemptions are allowed, then the validation will be skipped.
+    """
+    if isinstance(param, dict) and "get_param" in param:
+        parameter = param.get("get_param")
+    else:
+        return (
+            "Unexpected parameter format for {} {} property {}: {}. "
+            "Please consult the heat guidelines documentation for details."
+        ).format(resource_type, rid, properties, param)
+
+    # getting parameter if the get_param uses list, and getting official
+    # HEAT parameter type
+    parameter_type = parameter_type_to_heat_type(parameter)
+    if parameter_type == "comma_delimited_list":
+        parameter = parameter[0]
+    elif parameter_type != "string":
+        return None
+
+    if exemptions_allowed and parameter in get_aap_exemptions(resource):
+        return None
+
+    # if parameter type is not in regx dict, then it is not supported
+    # by automation
+    regx_dict = regx[resource_intext].get(parameter_type)
+    if not regx_dict:
+        msg = (
+            "{} {} {} parameter {} defined as type {} "
+            "which is required by platform data model for proper "
+            "assignment and inventory."
+        ).format(resource_type, rid, properties, parameter, parameter_type)
+        if exemptions_allowed:
+            msg = "WARNING: {} {}".format(msg, AAP_EXEMPT_CAVEAT)
+        return msg
+
+    msg = validate_parameter_format(
+        regx, parameter_type, resource_intext, parameter, rid, exemptions_allowed
+    )
+    if msg:
+        return msg
+
+    # checking that parameter includes correct vm_type/network_role
+    parameter_checks = regx.get("parameter_to_resource_comparisons", [])
+    for check in parameter_checks:
+        msg = mismatch_resource_and_parameter_attribute(
+            check, port_match, parameter, rid
+        )
+        if msg:
+            return msg
+
+    return None
+
+
+def validate_parameter_format(
+    regx, parameter_type, resource_intext, parameter, rid, exemptions_allowed
+):
+    """Checks if a parameter format matches the expected format
+    from input format dictionary"""
+    msg = None
+    regexp = regx[resource_intext][parameter_type]["machine"]
+    readable_format = regx[resource_intext][parameter_type]["readable"]
+    match = regexp.match(parameter)
+    if not match:
+        msg = (
+            "{} property parameter {} does not follow {} "
+            "format {} which is required by platform data model for proper "
+            "assignment and inventory."
+        ).format(rid, parameter, resource_intext, readable_format)
+        if exemptions_allowed:
+            msg = "WARNING: {} {}".format(msg, AAP_EXEMPT_CAVEAT)
+
+    return msg
+
+
+def mismatch_resource_and_parameter_attribute(check, resource_re_match, parameter, rid):
+    """Compares vm_type or network_role from resource
+    is the same as found in parameter"""
+    resource_match = resource_re_match.group(check)
+    if (
+        resource_match
+        and not parameter.startswith(resource_match)
+        and parameter.find("_{}_".format(resource_match)) == -1
+    ):
+        return ("{0} {1} does not match parameter {2} {1}").format(
+            rid, check, parameter
+        )
+
+
 def get_list_of_ports_attached_to_nova_server(nova_server):
     networks_list = nova_server.get("properties", {}).get("networks")