[VVP] Adding env file checks for contrail 90/87690/2
authorLovett, Trevor <trevor.lovett@att.com>
Tue, 14 May 2019 15:37:17 +0000 (10:37 -0500)
committerLovett, Trevor <trevor.lovett@att.com>
Tue, 14 May 2019 16:53:41 +0000 (11:53 -0500)
* Introduced helper method get_param to handle extracting param
  names from both get_params with string and list arguments
* Moved test files for environment tests to independent directories
  to make it easier to isolate unit tests
* Added contrail tests related to env file usage related to VNFRQTS-630

Change-Id: I3b44f0ce2d5657e9ab5290cd77f1422b36052b6a
Issue-ID: VVP-213
Signed-off-by: Lovett, Trevor <trevor.lovett@att.com>
17 files changed:
ice_validator/tests/fixtures/test_environment_file_parameters/fail/contrail_instance_ip/contrail_instance_ip_fail.env [new file with mode: 0644]
ice_validator/tests/fixtures/test_environment_file_parameters/fail/contrail_instance_ip/contrail_instance_ip_fail.yaml [new file with mode: 0644]
ice_validator/tests/fixtures/test_environment_file_parameters/fail/general/STARKDB-nested.yaml [moved from ice_validator/tests/fixtures/test_environment_file_parameters/fail/STARKDB-nested.yaml with 90% similarity]
ice_validator/tests/fixtures/test_environment_file_parameters/fail/general/fail.env [moved from ice_validator/tests/fixtures/test_environment_file_parameters/fail/fail.env with 96% similarity]
ice_validator/tests/fixtures/test_environment_file_parameters/fail/general/fail.yaml [moved from ice_validator/tests/fixtures/test_environment_file_parameters/fail/fail.yaml with 94% similarity]
ice_validator/tests/fixtures/test_environment_file_parameters/fail/vmi_aap/vmi_aap_fail.env [new file with mode: 0644]
ice_validator/tests/fixtures/test_environment_file_parameters/fail/vmi_aap/vmi_aap_fail.yaml [new file with mode: 0644]
ice_validator/tests/fixtures/test_environment_file_parameters/pass/contrail_instance_ip/contrail_instance_ip_pass.env [new file with mode: 0644]
ice_validator/tests/fixtures/test_environment_file_parameters/pass/contrail_instance_ip/contrail_instance_ip_pass.yaml [new file with mode: 0644]
ice_validator/tests/fixtures/test_environment_file_parameters/pass/general/STARKDB-nested.yaml [moved from ice_validator/tests/fixtures/test_environment_file_parameters/pass/STARKDB-nested.yaml with 100% similarity]
ice_validator/tests/fixtures/test_environment_file_parameters/pass/general/pass.env [moved from ice_validator/tests/fixtures/test_environment_file_parameters/pass/pass.env with 100% similarity]
ice_validator/tests/fixtures/test_environment_file_parameters/pass/general/pass.yaml [moved from ice_validator/tests/fixtures/test_environment_file_parameters/pass/pass.yaml with 100% similarity]
ice_validator/tests/fixtures/test_environment_file_parameters/pass/vmi_aap/vmi_aap_pass.env [new file with mode: 0644]
ice_validator/tests/fixtures/test_environment_file_parameters/pass/vmi_aap/vmi_aap_pass.yaml [new file with mode: 0644]
ice_validator/tests/helpers.py
ice_validator/tests/test_environment_file_parameters.py
ice_validator/tests/test_neutron_port_network_attachment.py

diff --git a/ice_validator/tests/fixtures/test_environment_file_parameters/fail/contrail_instance_ip/contrail_instance_ip_fail.env b/ice_validator/tests/fixtures/test_environment_file_parameters/fail/contrail_instance_ip/contrail_instance_ip_fail.env
new file mode 100644 (file)
index 0000000..0f07546
--- /dev/null
@@ -0,0 +1,49 @@
+# -*- 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============================================
+#
+#
+
+parameters:
+
+    fw_oam_protected_ips: 127.0.0.1
+    fw_dns_ip_0: 127.0.0.1
+    #fw_other_ip_0: 127.0.0.1
+    subnet_uuid: aldkjfs
+
+
+
+
diff --git a/ice_validator/tests/fixtures/test_environment_file_parameters/fail/contrail_instance_ip/contrail_instance_ip_fail.yaml b/ice_validator/tests/fixtures/test_environment_file_parameters/fail/contrail_instance_ip/contrail_instance_ip_fail.yaml
new file mode 100644 (file)
index 0000000..d5bc147
--- /dev/null
@@ -0,0 +1,76 @@
+# -*- 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_protected_ips:
+    type: comma_delimited_list
+
+  fw_dns_ip_0:
+    type: string
+
+  fw_other_ip_0:
+    type: string
+
+  subnet_uuid:
+    type: string
+
+resources:
+
+  fw_0_oam_protected_vmi_0_IP_0:
+    type: OS::ContrailV2::InstanceIp
+    properties:
+      instance_ip_address: { get_param: [fw_oam_protected_ips, get_param: index ] }
+      subnet_uuid: { get_param: subnet_uuid }
+
+  fw_0_oam_protected_vmi_0_IP_1:
+    type: OS::ContrailV2::InstanceIp
+    properties:
+      instance_ip_address: { get_param: fw_dns_ip_0 }
+      subnet_uuid: { get_param: subnet_uuid }
+
+  fw_0_int_other_vmi_0_IP_0:
+    type: OS::ContrailV2::InstanceIp
+    properties:
+      instance_ip_address: { get_param: fw_other_ip_0 }
+      subnet_uuid: { get_param: subnet_uuid }
@@ -43,9 +43,6 @@ description: fdsafsfsa
 
 parameters:
 
-  my_nested_parameter:
-    type: number
-    description: sdfnklafd
   STARKDB_image_name:
     type: number
     description: sdfnklafd
@@ -57,6 +54,8 @@ parameters:
     description: sdfnklafd
     #constraints:
     #  - range: { min: 100, max: 400 }
+  subnet_uuid:
+    type: string
 
 resources:
 
@@ -117,6 +116,17 @@ resources:
         properties:
           my_nested_parameter: 4
 
+  fw_0_oam_protected_vmi_0_IP_0:
+    type: OS::ContrailV2::InstanceIp
+    properties:
+      instance_ip_address: { get_param: [fw_oam_protected_ips, get_param: index ] }
+
+  fw_0_int_other_vmi_0_IP_0:
+    type: OS::ContrailV2::InstanceIp
+    properties:
+      instance_ip_address: { get_param: fw_other_ip_0 }
+      subnet_uuid: { get_param: subnet_uuid }
+
 outputs:
   test_value: 
     value: { get_param: my_nested_parameter }
@@ -166,6 +166,12 @@ parameters:
     type: string
     description: nafs
 
+  fw_other_ip_0:
+    type: string
+
+  fw_oam_protected_ips:
+    type: comma_delimited_list
+
 resources:
 
   STARKDB_cinder_attach:
@@ -282,6 +288,7 @@ resources:
     type: STARKDB-nested.yaml
     properties:
       my_nested_parame: { get_param: vnf_id }
+      subnet_uuid: { get_param: subnet_uuid }
 
   int_priv_subnet:
       type: OS::Neutron::Subnet
@@ -338,6 +345,9 @@ resources:
   STARKDB_cloud_config:
     type: OS::Heat::CloudConfig
 
+  subnet_uuid:
+    type: string
+
 
   myrouteprefix:
     type: OS::ContrailV2::InterfaceRouteTable
@@ -359,6 +369,18 @@ resources:
         type: STARKDB-nested.yaml
         properties:
           my_nested_parameter: 4
+          subnet_uuid: { get_param: subnet_uuid }
+
+  fw_0_oam_protected_vmi_0_IP_0:
+    type: OS::ContrailV2::InstanceIp
+    properties:
+      instance_ip_address: { get_param: [fw_oam_protected_ips, get_param: index ] }
+
+  fw_0_int_other_vmi_0_IP_0:
+    type: OS::ContrailV2::InstanceIp
+    properties:
+      instance_ip_address: { get_param: fw_other_ip_0 }
+      subnet_uuid: { get_param: subnet_uuid }
 
 outputs:
   test_output:
@@ -377,4 +399,4 @@ outputs:
     value: { get_param: crazy_subnet_id }
 
   crazy_net_id:
-    value: { get_param: crazy_net_id }
+    value: { get_param: crazy_net_id }
\ No newline at end of file
diff --git a/ice_validator/tests/fixtures/test_environment_file_parameters/fail/vmi_aap/vmi_aap_fail.env b/ice_validator/tests/fixtures/test_environment_file_parameters/fail/vmi_aap/vmi_aap_fail.env
new file mode 100644 (file)
index 0000000..a3d7fca
--- /dev/null
@@ -0,0 +1,46 @@
+# -*- 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============================================
+#
+#
+
+parameters:
+
+    fw_oam_protected_ips: 127.0.0.1
+    fw_dns_ip_0: 127.0.0.1
+    #fw_other_ip_0: 127.0.0.1
+    subnet_uuid: aldkjfs
+    virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix: aljfld
diff --git a/ice_validator/tests/fixtures/test_environment_file_parameters/fail/vmi_aap/vmi_aap_fail.yaml b/ice_validator/tests/fixtures/test_environment_file_parameters/fail/vmi_aap/vmi_aap_fail.yaml
new file mode 100644 (file)
index 0000000..02fe218
--- /dev/null
@@ -0,0 +1,61 @@
+# -*- 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:
+
+  virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix:
+    type: string
+
+resources:
+
+  fw_0_oam_protected_vmi_0_IP_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: virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix },
+               },
+           }]
diff --git a/ice_validator/tests/fixtures/test_environment_file_parameters/pass/contrail_instance_ip/contrail_instance_ip_pass.env b/ice_validator/tests/fixtures/test_environment_file_parameters/pass/contrail_instance_ip/contrail_instance_ip_pass.env
new file mode 100644 (file)
index 0000000..2cb67b2
--- /dev/null
@@ -0,0 +1,48 @@
+# -*- 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============================================
+#
+#
+
+parameters:
+
+    #fw_oam_protected_ips: 127.0.0.1
+    #fw_dns_ip_0: 127.0.0.1
+    fw_other_ip_0: 127.0.0.1
+    #subnet_uuid: a0aiofd
+
+
+
diff --git a/ice_validator/tests/fixtures/test_environment_file_parameters/pass/contrail_instance_ip/contrail_instance_ip_pass.yaml b/ice_validator/tests/fixtures/test_environment_file_parameters/pass/contrail_instance_ip/contrail_instance_ip_pass.yaml
new file mode 100644 (file)
index 0000000..d5bc147
--- /dev/null
@@ -0,0 +1,76 @@
+# -*- 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_protected_ips:
+    type: comma_delimited_list
+
+  fw_dns_ip_0:
+    type: string
+
+  fw_other_ip_0:
+    type: string
+
+  subnet_uuid:
+    type: string
+
+resources:
+
+  fw_0_oam_protected_vmi_0_IP_0:
+    type: OS::ContrailV2::InstanceIp
+    properties:
+      instance_ip_address: { get_param: [fw_oam_protected_ips, get_param: index ] }
+      subnet_uuid: { get_param: subnet_uuid }
+
+  fw_0_oam_protected_vmi_0_IP_1:
+    type: OS::ContrailV2::InstanceIp
+    properties:
+      instance_ip_address: { get_param: fw_dns_ip_0 }
+      subnet_uuid: { get_param: subnet_uuid }
+
+  fw_0_int_other_vmi_0_IP_0:
+    type: OS::ContrailV2::InstanceIp
+    properties:
+      instance_ip_address: { get_param: fw_other_ip_0 }
+      subnet_uuid: { get_param: subnet_uuid }
diff --git a/ice_validator/tests/fixtures/test_environment_file_parameters/pass/vmi_aap/vmi_aap_pass.env b/ice_validator/tests/fixtures/test_environment_file_parameters/pass/vmi_aap/vmi_aap_pass.env
new file mode 100644 (file)
index 0000000..6e65c37
--- /dev/null
@@ -0,0 +1,46 @@
+# -*- 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============================================
+#
+#
+
+parameters:
+
+    fw_oam_protected_ips: 127.0.0.1
+    fw_dns_ip_0: 127.0.0.1
+    #fw_other_ip_0: 127.0.0.1
+    subnet_uuid: aldkjfs
+    #virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix: aljfld
diff --git a/ice_validator/tests/fixtures/test_environment_file_parameters/pass/vmi_aap/vmi_aap_pass.yaml b/ice_validator/tests/fixtures/test_environment_file_parameters/pass/vmi_aap/vmi_aap_pass.yaml
new file mode 100644 (file)
index 0000000..02fe218
--- /dev/null
@@ -0,0 +1,61 @@
+# -*- 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:
+
+  virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix:
+    type: string
+
+resources:
+
+  fw_0_oam_protected_vmi_0_IP_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: virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix },
+               },
+           }]
index c73a118..fd78c75 100644 (file)
@@ -324,3 +324,17 @@ def prop_iterator(resource, *props):
                 yield from prop_iterator(x, *props)
         elif isinstance(prop, dict):
             yield from prop_iterator(prop, *props)
+
+
+def get_param(property_value):
+    """
+    Returns the first parameter name from a get_param or None if get_param is
+    not used
+    """
+    if property_value and isinstance(property_value, dict):
+        param = property_value.get("get_param")
+        if param and isinstance(param, list) and len(param) > 0:
+            return param[0]
+        else:
+            return param
+    return None
index 694ea22..34808b9 100644 (file)
 """ environment file structure
 """
 import os
-from .helpers import validates, categories, get_environment_pair, find_environment_file
+
+from tests.structures import Heat
+from tests.utils import nested_dict
+from .helpers import (
+    validates,
+    categories,
+    get_environment_pair,
+    find_environment_file,
+    get_param,
+)
 import re
 import pytest
 from tests import cached_yaml as yaml
@@ -190,7 +199,6 @@ def check_resource_parameter(
 def run_check_resource_parameter(
     yaml_file, prop, DESIRED, resource_type, check_resource=True, **kwargs
 ):
-
     filepath, filename = os.path.split(yaml_file)
     environment_pair = get_environment_pair(yaml_file)
 
@@ -228,7 +236,7 @@ def run_check_resource_parameter(
             filename,
             " not" if DESIRED else "",
             environment_pair.get("name"),
-            invalid_parameters,
+            ", ".join(invalid_parameters),
         )
     )
 
@@ -364,7 +372,9 @@ def test_neutron_port_fixedips_subnet_parameter_doesnt_exist_in_environment_file
 
 @categories("environment_file")
 @validates("R-83412", "R-83418")
-def test_neutron_port_external_aap_ip_parameter_doesnt_exist_in_environment_file(yaml_file):
+def test_neutron_port_external_aap_ip_parameter_doesnt_exist_in_environment_file(
+    yaml_file
+):
     run_check_resource_parameter(
         yaml_file,
         "allowed_address_pairs",
@@ -412,3 +422,89 @@ def test_heat_rg_count_parameter_exists_in_environment_file(yaml_file):
         "OS::Heat::ResourceGroup",
         exclude_resource=re.compile(r"^(.+?)_subint_(.+?)_port_(.+?)_subinterfaces$"),
     )
+
+
+@categories("environment_file")
+@validates("R-100020", "R-100040", "R-100060", "R-100080", "R-100170")
+def test_contrail_external_instance_ip_does_not_exist_in_environment_file(yaml_file):
+    run_check_resource_parameter(
+        yaml_file,
+        "instance_ip_address",
+        False,
+        "OS::ContrailV2::InstanceIp",
+        exclude_resource=re.compile(r"^.*_int_.*$"),  # exclude internal IPs
+    )
+
+
+@validates("R-100100", "R-100120", "R-100140", "R-100160", "R-100180")
+def test_contrail_internal_instance_ip_does_exist_in_environment_file(yaml_file):
+    run_check_resource_parameter(
+        yaml_file,
+        "instance_ip_address",
+        True,
+        "OS::ContrailV2::InstanceIp",
+        exclude_resource=re.compile(r"(?!.*_int_.*)"),  # exclude external IPs
+    )
+
+
+@categories("environment_file")
+@validates("R-100210", "R-100230", "R-100250", "R-100270")
+def test_contrail_subnet_uuid_does_not_exist_in_environment_file(yaml_file):
+    run_check_resource_parameter(
+        yaml_file, "subnet_uuid", False, "OS::ContrailV2::InstanceIp"
+    )
+
+
+@categories("environment_file")
+@validates("R-100320", "R-100340")
+def test_contrail_vmi_aap_does_not_exist_in_environment_file(yaml_file):
+    # This test needs to check a more complex structure.  Rather than try to force
+    # that into the existing run_check_resource_parameter logic we'll just check it
+    # directly
+    pairs = get_environment_pair(yaml_file)
+    if not pairs:
+        pytest.skip("No matching env file found")
+    heat = Heat(filepath=yaml_file)
+    env_parameters = pairs["eyml"].get("parameters") or {}
+    vmis = heat.get_resource_by_type("OS::ContrailV2::VirtualMachineInterface")
+    external_vmis = {rid: data for rid, data in vmis.items() if "_int_" not in rid}
+    invalid_params = []
+    for r_id, vmi in external_vmis.items():
+        aap_value = nested_dict.get(
+            vmi,
+            "properties",
+            "virtual_machine_interface_allowed_address_pairs",
+            "virtual_machine_interface_allowed_address_pairs_allowed_address_pair",
+        )
+        if not aap_value or not isinstance(aap_value, list):
+            # Skip if aap not used or is not a list.
+            continue
+        for pair_ip in aap_value:
+            if not isinstance(pair_ip, dict):
+                continue  # Invalid Heat will be detected by another test
+            settings = (
+                pair_ip.get(
+                    "virtual_machine_interface_allowed_address"
+                    "_pairs_allowed_address_pair_ip"
+                )
+                or {}
+            )
+            if isinstance(settings, dict):
+                ip_prefix = (
+                    settings.get(
+                        "virtual_machine_interface_allowed_address"
+                        "_pairs_allowed_address_pair_ip_ip_prefix"
+                    )
+                    or {}
+                )
+                ip_prefix_param = get_param(ip_prefix)
+                if ip_prefix_param and ip_prefix_param in env_parameters:
+                    invalid_params.append(ip_prefix_param)
+
+    msg = (
+        "OS::ContrailV2::VirtualMachineInterface "
+        "virtual_machine_interface_allowed_address_pairs"
+        "_allowed_address_pair_ip_ip_prefix "
+        "parameters found in environment file {}: {}"
+    ).format(pairs.get("name"), ", ".join(invalid_params))
+    assert not invalid_params, msg
index dfbad35..0e0d8e6 100644 (file)
@@ -3,36 +3,33 @@ import re
 
 import pytest
 
-from tests.helpers import validates, get_base_template_from_yaml_files
+from tests.helpers import validates, get_base_template_from_yaml_files, get_param
 from tests.parametrizers import get_nested_files
 from tests.structures import Heat
 
+
 INTERNAL_UUID_PATTERN = re.compile(r"^int_(?P<network_role>.+?)_net_id$")
 INTERNAL_NAME_PATTERN = re.compile(r"^int_(?P<network_role>.+?)_net_name$")
-INTERNAL_PORT = re.compile(r"^(?P<vm_type>.+)_(?P<vm_type_index>\d+)_int_"
-                           r"(?P<network_role>.+)_port_(?P<port_index>\d+)$")
+INTERNAL_PORT = re.compile(
+    r"^(?P<vm_type>.+)_(?P<vm_type_index>\d+)_int_"
+    r"(?P<network_role>.+)_port_(?P<port_index>\d+)$"
+)
 
-EXTERNAL_PORT = re.compile(r"^(?P<vm_type>.+)_(?P<vm_type_index>\d+)_(?!int_)"
-                           r"(?P<network_role>.+)_port_(?P<port_index>\d+)$")
+EXTERNAL_PORT = re.compile(
+    r"^(?P<vm_type>.+)_(?P<vm_type_index>\d+)_(?!int_)"
+    r"(?P<network_role>.+)_port_(?P<port_index>\d+)$"
+)
 
 EXTERNAL_UUID_PATTERN = re.compile(r"^(?!int_)(?P<network_role>.+?)_net_id$")
 EXTERNAL_NAME_PATTERN = re.compile(r"^(?!int_)(?P<network_role>.+?)_net_name$")
 
-INTERNAL_NETWORK_PATTERN = re.compile(r"^int_(?P<network_role>.+?)"
-                                      r"_(network|RVN)$")
+INTERNAL_NETWORK_PATTERN = re.compile(r"^int_(?P<network_role>.+?)" r"_(network|RVN)$")
 
 
 def is_incremental_module(yaml_file, base_path, nested_paths):
     return yaml_file != base_path and yaml_file not in nested_paths
 
 
-def get_param(prop_val):
-    if not isinstance(prop_val, dict):
-        return None
-    param = prop_val.get("get_param")
-    return param if isinstance(param, str) else None
-
-
 @validates("R-86182", "R-22688")
 def test_internal_network_parameters(yaml_files):
     base_path = get_base_template_from_yaml_files(yaml_files)
@@ -40,8 +37,9 @@ def test_internal_network_parameters(yaml_files):
         pytest.skip("No base module found")
     base_heat = Heat(filepath=base_path)
     nested_paths = get_nested_files(yaml_files)
-    incremental_modules = [f for f in yaml_files
-                           if is_incremental_module(f, base_path, nested_paths)]
+    incremental_modules = [
+        f for f in yaml_files if is_incremental_module(f, base_path, nested_paths)
+    ]
     errors = []
     for module in incremental_modules:
         heat = Heat(filepath=module)
@@ -52,63 +50,75 @@ def test_internal_network_parameters(yaml_files):
 
             network = (port.get("properties") or {}).get("network") or {}
             if isinstance(network, dict) and (
-                    "get_resource" in network or "get_attr" in network):
+                "get_resource" in network or "get_attr" in network
+            ):
                 continue
 
             param = get_param(network)
             if not param:
-                errors.append((
-                    "The internal port ({}) must either connect to a network "
-                    "in the base module using get_param or to a network "
-                    "created in this module ({})"
-                ).format(rid, os.path.split(module)[1]))
+                errors.append(
+                    (
+                        "The internal port ({}) must either connect to a network "
+                        "in the base module using get_param or to a network "
+                        "created in this module ({})"
+                    ).format(rid, os.path.split(module)[1])
+                )
                 continue
 
-            param_match = (
-                INTERNAL_UUID_PATTERN.match(param)
-                or INTERNAL_NAME_PATTERN.match(param)
-            )
+            param_match = INTERNAL_UUID_PATTERN.match(
+                param
+            ) or INTERNAL_NAME_PATTERN.match(param)
             if not param_match:
-                errors.append((
-                    "The internal port ({}) network parameter ({}) does not "
-                    "match one of the required naming conventions of "
-                    "int_{{network-role}}_net_id or "
-                    "int_{{network-role}}_net_name "
-                    "for connecting to an internal network. "
-                    "If this is not an internal port, then change the resource "
-                    "ID to adhere to the external port naming convention."
-                ).format(rid, param))
+                errors.append(
+                    (
+                        "The internal port ({}) network parameter ({}) does not "
+                        "match one of the required naming conventions of "
+                        "int_{{network-role}}_net_id or "
+                        "int_{{network-role}}_net_name "
+                        "for connecting to an internal network. "
+                        "If this is not an internal port, then change the resource "
+                        "ID to adhere to the external port naming convention."
+                    ).format(rid, param)
+                )
                 continue
 
             if param not in base_heat.yml.get("outputs", {}):
                 base_module = os.path.split(base_path)[1]
-                errors.append((
-                    "The internal network parameter ({}) attached to port ({}) "
-                    "must be defined in the output section of the base module ({})."
-                ).format(param, rid, base_module))
+                errors.append(
+                    (
+                        "The internal network parameter ({}) attached to port ({}) "
+                        "must be defined in the output section of the base module ({})."
+                    ).format(param, rid, base_module)
+                )
                 continue
 
             param_network_role = param_match.groupdict().get("network_role")
             rid_network_role = rid_match.groupdict().get("network_role")
             if param_network_role.lower() != rid_network_role.lower():
-                errors.append((
-                    "The network role ({}) extracted from the resource ID ({}) "
-                    "does not match network role ({}) extracted from the "
-                    "network parameter ({})"
-                ).format(rid_network_role, rid, param_network_role, param))
+                errors.append(
+                    (
+                        "The network role ({}) extracted from the resource ID ({}) "
+                        "does not match network role ({}) extracted from the "
+                        "network parameter ({})"
+                    ).format(rid_network_role, rid, param_network_role, param)
+                )
 
             resources = base_heat.get_all_resources(os.path.split(base_path)[0])
-            networks = {rid: resource for rid, resource in resources.items()
-                        if resource.get("type")
-                        in {"OS::Neutron::Net",
-                            "OS::ContrailV2::VirtualNetwork"}}
+            networks = {
+                rid: resource
+                for rid, resource in resources.items()
+                if resource.get("type")
+                in {"OS::Neutron::Net", "OS::ContrailV2::VirtualNetwork"}
+            }
             matches = (INTERNAL_NETWORK_PATTERN.match(n) for n in networks)
             roles = {m.groupdict()["network_role"].lower() for m in matches if m}
             if param_network_role.lower() not in roles:
-                errors.append((
-                    "No internal network with a network role of {} was "
-                    "found in the base modules networks: {}"
-                ).format(param_network_role, ", ".join(networks)))
+                errors.append(
+                    (
+                        "No internal network with a network role of {} was "
+                        "found in the base modules networks: {}"
+                    ).format(param_network_role, ", ".join(networks))
+                )
 
     assert not errors, ". ".join(errors)
 
@@ -120,40 +130,47 @@ def test_external_network_parameter(heat_template):
     for rid, port in heat.neutron_port_resources.items():
         rid_match = EXTERNAL_PORT.match(rid)
         if not rid_match:
-            continue   # only test external ports
+            continue  # only test external ports
         network = (port.get("properties") or {}).get("network") or {}
         if not isinstance(network, dict) or "get_param" not in network:
-            errors.append((
-                "The external port ({}) must assign the network property "
-                "using get_param.  If this port is for an internal network, "
-                "then change the resource ID format to the external format."
-            ).format(rid))
+            errors.append(
+                (
+                    "The external port ({}) must assign the network property "
+                    "using get_param.  If this port is for an internal network, "
+                    "then change the resource ID format to the external format."
+                ).format(rid)
+            )
             continue
         param = get_param(network)
         if not param:
-            errors.append((
-                "The get_param function on the network property of port ({}) "
-                "must only take a single, string parameter."
-            ).format(rid))
+            errors.append(
+                (
+                    "The get_param function on the network property of port ({}) "
+                    "must only take a single, string parameter."
+                ).format(rid)
+            )
             continue
 
-        param_match = (
-            EXTERNAL_NAME_PATTERN.match(param)
-            or EXTERNAL_UUID_PATTERN.match(param)
+        param_match = EXTERNAL_NAME_PATTERN.match(param) or EXTERNAL_UUID_PATTERN.match(
+            param
         )
         if not param_match:
-            errors.append((
-                "The network parameter ({}) on port ({}) does not match one of "
-                "{{network-role}}_net_id or {{network-role}}_net_name."
-            ).format(param, rid))
+            errors.append(
+                (
+                    "The network parameter ({}) on port ({}) does not match one of "
+                    "{{network-role}}_net_id or {{network-role}}_net_name."
+                ).format(param, rid)
+            )
             continue
         rid_network_role = rid_match.groupdict()["network_role"]
         param_network_role = param_match.groupdict()["network_role"]
         if rid_network_role.lower() != param_network_role.lower():
-            errors.append((
-                "The network role ({}) extracted from the resource ID ({}) "
-                "does not match network role ({}) extracted from the "
-                "network parameter ({})"
-            ).format(rid_network_role, rid, param_network_role, param))
+            errors.append(
+                (
+                    "The network role ({}) extracted from the resource ID ({}) "
+                    "does not match network role ({}) extracted from the "
+                    "network parameter ({})"
+                ).format(rid_network_role, rid, param_network_role, param)
+            )
 
     assert not errors, ". ".join(errors)