From 9ccbfe7e20b3914c37c0dec50762cec9da8a63c6 Mon Sep 17 00:00:00 2001 From: "Lovett, Trevor" Date: Tue, 14 May 2019 10:37:17 -0500 Subject: [PATCH] [VVP] Adding env file checks for contrail * 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 --- .../contrail_instance_ip_fail.env | 49 ++++++ .../contrail_instance_ip_fail.yaml | 76 ++++++++++ .../fail/{ => general}/STARKDB-nested.yaml | 16 +- .../fail/{ => general}/fail.env | 6 + .../fail/{ => general}/fail.yaml | 24 ++- .../fail/vmi_aap/vmi_aap_fail.env | 46 ++++++ .../fail/vmi_aap/vmi_aap_fail.yaml | 61 ++++++++ .../contrail_instance_ip_pass.env | 48 ++++++ .../contrail_instance_ip_pass.yaml | 76 ++++++++++ .../pass/{ => general}/STARKDB-nested.yaml | 0 .../pass/{ => general}/pass.env | 0 .../pass/{ => general}/pass.yaml | 0 .../pass/vmi_aap/vmi_aap_pass.env | 46 ++++++ .../pass/vmi_aap/vmi_aap_pass.yaml | 61 ++++++++ ice_validator/tests/helpers.py | 14 ++ .../tests/test_environment_file_parameters.py | 104 ++++++++++++- .../tests/test_neutron_port_network_attachment.py | 165 ++++++++++++--------- 17 files changed, 710 insertions(+), 82 deletions(-) create mode 100644 ice_validator/tests/fixtures/test_environment_file_parameters/fail/contrail_instance_ip/contrail_instance_ip_fail.env create mode 100644 ice_validator/tests/fixtures/test_environment_file_parameters/fail/contrail_instance_ip/contrail_instance_ip_fail.yaml rename ice_validator/tests/fixtures/test_environment_file_parameters/fail/{ => general}/STARKDB-nested.yaml (90%) rename ice_validator/tests/fixtures/test_environment_file_parameters/fail/{ => general}/fail.env (96%) rename ice_validator/tests/fixtures/test_environment_file_parameters/fail/{ => general}/fail.yaml (94%) create mode 100644 ice_validator/tests/fixtures/test_environment_file_parameters/fail/vmi_aap/vmi_aap_fail.env create mode 100644 ice_validator/tests/fixtures/test_environment_file_parameters/fail/vmi_aap/vmi_aap_fail.yaml create mode 100644 ice_validator/tests/fixtures/test_environment_file_parameters/pass/contrail_instance_ip/contrail_instance_ip_pass.env create mode 100644 ice_validator/tests/fixtures/test_environment_file_parameters/pass/contrail_instance_ip/contrail_instance_ip_pass.yaml rename ice_validator/tests/fixtures/test_environment_file_parameters/pass/{ => general}/STARKDB-nested.yaml (100%) rename ice_validator/tests/fixtures/test_environment_file_parameters/pass/{ => general}/pass.env (100%) rename ice_validator/tests/fixtures/test_environment_file_parameters/pass/{ => general}/pass.yaml (100%) create mode 100644 ice_validator/tests/fixtures/test_environment_file_parameters/pass/vmi_aap/vmi_aap_pass.env create mode 100644 ice_validator/tests/fixtures/test_environment_file_parameters/pass/vmi_aap/vmi_aap_pass.yaml 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 index 0000000..0f07546 --- /dev/null +++ b/ice_validator/tests/fixtures/test_environment_file_parameters/fail/contrail_instance_ip/contrail_instance_ip_fail.env @@ -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 index 0000000..d5bc147 --- /dev/null +++ b/ice_validator/tests/fixtures/test_environment_file_parameters/fail/contrail_instance_ip/contrail_instance_ip_fail.yaml @@ -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/fail/STARKDB-nested.yaml b/ice_validator/tests/fixtures/test_environment_file_parameters/fail/general/STARKDB-nested.yaml similarity index 90% rename from ice_validator/tests/fixtures/test_environment_file_parameters/fail/STARKDB-nested.yaml rename to ice_validator/tests/fixtures/test_environment_file_parameters/fail/general/STARKDB-nested.yaml index 45e0edb..bb82a04 100644 --- a/ice_validator/tests/fixtures/test_environment_file_parameters/fail/STARKDB-nested.yaml +++ b/ice_validator/tests/fixtures/test_environment_file_parameters/fail/general/STARKDB-nested.yaml @@ -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 } diff --git a/ice_validator/tests/fixtures/test_environment_file_parameters/fail/fail.env b/ice_validator/tests/fixtures/test_environment_file_parameters/fail/general/fail.env similarity index 96% rename from ice_validator/tests/fixtures/test_environment_file_parameters/fail/fail.env rename to ice_validator/tests/fixtures/test_environment_file_parameters/fail/general/fail.env index 1092685..dbdc492 100644 --- a/ice_validator/tests/fixtures/test_environment_file_parameters/fail/fail.env +++ b/ice_validator/tests/fixtures/test_environment_file_parameters/fail/general/fail.env @@ -100,3 +100,9 @@ parameters: TESTDB_name2: asnjkv vf_module_index: nalfs + + #fw_other_ip_0: 127.0.0.1 + + fw_oam_protected_ips: 127.0.0.1 + + subnet_uuid: aldfjj diff --git a/ice_validator/tests/fixtures/test_environment_file_parameters/fail/fail.yaml b/ice_validator/tests/fixtures/test_environment_file_parameters/fail/general/fail.yaml similarity index 94% rename from ice_validator/tests/fixtures/test_environment_file_parameters/fail/fail.yaml rename to ice_validator/tests/fixtures/test_environment_file_parameters/fail/general/fail.yaml index 8ee4182..d311730 100644 --- a/ice_validator/tests/fixtures/test_environment_file_parameters/fail/fail.yaml +++ b/ice_validator/tests/fixtures/test_environment_file_parameters/fail/general/fail.yaml @@ -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 index 0000000..a3d7fca --- /dev/null +++ b/ice_validator/tests/fixtures/test_environment_file_parameters/fail/vmi_aap/vmi_aap_fail.env @@ -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 index 0000000..02fe218 --- /dev/null +++ b/ice_validator/tests/fixtures/test_environment_file_parameters/fail/vmi_aap/vmi_aap_fail.yaml @@ -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 index 0000000..2cb67b2 --- /dev/null +++ b/ice_validator/tests/fixtures/test_environment_file_parameters/pass/contrail_instance_ip/contrail_instance_ip_pass.env @@ -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 index 0000000..d5bc147 --- /dev/null +++ b/ice_validator/tests/fixtures/test_environment_file_parameters/pass/contrail_instance_ip/contrail_instance_ip_pass.yaml @@ -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/STARKDB-nested.yaml b/ice_validator/tests/fixtures/test_environment_file_parameters/pass/general/STARKDB-nested.yaml similarity index 100% rename from ice_validator/tests/fixtures/test_environment_file_parameters/pass/STARKDB-nested.yaml rename to ice_validator/tests/fixtures/test_environment_file_parameters/pass/general/STARKDB-nested.yaml diff --git a/ice_validator/tests/fixtures/test_environment_file_parameters/pass/pass.env b/ice_validator/tests/fixtures/test_environment_file_parameters/pass/general/pass.env similarity index 100% rename from ice_validator/tests/fixtures/test_environment_file_parameters/pass/pass.env rename to ice_validator/tests/fixtures/test_environment_file_parameters/pass/general/pass.env diff --git a/ice_validator/tests/fixtures/test_environment_file_parameters/pass/pass.yaml b/ice_validator/tests/fixtures/test_environment_file_parameters/pass/general/pass.yaml similarity index 100% rename from ice_validator/tests/fixtures/test_environment_file_parameters/pass/pass.yaml rename to ice_validator/tests/fixtures/test_environment_file_parameters/pass/general/pass.yaml 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 index 0000000..6e65c37 --- /dev/null +++ b/ice_validator/tests/fixtures/test_environment_file_parameters/pass/vmi_aap/vmi_aap_pass.env @@ -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 index 0000000..02fe218 --- /dev/null +++ b/ice_validator/tests/fixtures/test_environment_file_parameters/pass/vmi_aap/vmi_aap_pass.yaml @@ -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/helpers.py b/ice_validator/tests/helpers.py index c73a118..fd78c75 100644 --- a/ice_validator/tests/helpers.py +++ b/ice_validator/tests/helpers.py @@ -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 diff --git a/ice_validator/tests/test_environment_file_parameters.py b/ice_validator/tests/test_environment_file_parameters.py index 694ea22..34808b9 100644 --- a/ice_validator/tests/test_environment_file_parameters.py +++ b/ice_validator/tests/test_environment_file_parameters.py @@ -39,7 +39,16 @@ """ 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 diff --git a/ice_validator/tests/test_neutron_port_network_attachment.py b/ice_validator/tests/test_neutron_port_network_attachment.py index dfbad35..0e0d8e6 100644 --- a/ice_validator/tests/test_neutron_port_network_attachment.py +++ b/ice_validator/tests/test_neutron_port_network_attachment.py @@ -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.+?)_net_id$") INTERNAL_NAME_PATTERN = re.compile(r"^int_(?P.+?)_net_name$") -INTERNAL_PORT = re.compile(r"^(?P.+)_(?P\d+)_int_" - r"(?P.+)_port_(?P\d+)$") +INTERNAL_PORT = re.compile( + r"^(?P.+)_(?P\d+)_int_" + r"(?P.+)_port_(?P\d+)$" +) -EXTERNAL_PORT = re.compile(r"^(?P.+)_(?P\d+)_(?!int_)" - r"(?P.+)_port_(?P\d+)$") +EXTERNAL_PORT = re.compile( + r"^(?P.+)_(?P\d+)_(?!int_)" + r"(?P.+)_port_(?P\d+)$" +) EXTERNAL_UUID_PATTERN = re.compile(r"^(?!int_)(?P.+?)_net_id$") EXTERNAL_NAME_PATTERN = re.compile(r"^(?!int_)(?P.+?)_net_name$") -INTERNAL_NETWORK_PATTERN = re.compile(r"^int_(?P.+?)" - r"_(network|RVN)$") +INTERNAL_NETWORK_PATTERN = re.compile(r"^int_(?P.+?)" 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) -- 2.16.6