From: steven stark Date: Wed, 4 Dec 2019 21:35:38 +0000 (+0000) Subject: Merge "[VVP] Support pluggable data sources for preload data" X-Git-Tag: 6.0.0~13 X-Git-Url: https://gerrit.onap.org/r/gitweb?p=vvp%2Fvalidation-scripts.git;a=commitdiff_plain;h=ed4e48f967b1fccdd3fb142c0a166ee04ad6c2b0;hp=079622e0b69ec1e5c50af08c8312937609929233 Merge "[VVP] Support pluggable data sources for preload data" --- 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 index 248f9ec..0000000 --- a/ice_validator/tests/fixtures/test_allowed_address_pairs_include_vm_type_network_role/fail/contrail/fail.yaml +++ /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 index 5113bd4..0000000 --- a/ice_validator/tests/fixtures/test_allowed_address_pairs_include_vm_type_network_role/fail/contrail/vmi_fail.yaml +++ /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 }, - }, - }] diff --git a/ice_validator/tests/fixtures/test_allowed_address_pairs_include_vm_type_network_role/fail/neutron/fail.yaml b/ice_validator/tests/fixtures/test_allowed_address_pairs_include_vm_type_network_role/fail/fail.yaml similarity index 60% rename from ice_validator/tests/fixtures/test_allowed_address_pairs_include_vm_type_network_role/fail/neutron/fail.yaml rename to ice_validator/tests/fixtures/test_allowed_address_pairs_include_vm_type_network_role/fail/fail.yaml index 4a3093b..81f0c00 100644 --- a/ice_validator/tests/fixtures/test_allowed_address_pairs_include_vm_type_network_role/fail/neutron/fail.yaml +++ b/ice_validator/tests/fixtures/test_allowed_address_pairs_include_vm_type_network_role/fail/fail.yaml @@ -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 index df4ca00..0000000 --- a/ice_validator/tests/fixtures/test_allowed_address_pairs_include_vm_type_network_role/pass/contrail/pass.yaml +++ /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 index 959c846..0000000 --- a/ice_validator/tests/fixtures/test_allowed_address_pairs_include_vm_type_network_role/pass/contrail/vmi_pass.yaml +++ /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 index 2d9ca4a..0000000 --- a/ice_validator/tests/fixtures/test_allowed_address_pairs_include_vm_type_network_role/pass/contrail/vmi_pass_exemption.yaml +++ /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 diff --git a/ice_validator/tests/fixtures/test_allowed_address_pairs_include_vm_type_network_role/pass/neutron/valid_template.yaml b/ice_validator/tests/fixtures/test_allowed_address_pairs_include_vm_type_network_role/pass/pass.yaml similarity index 72% rename from ice_validator/tests/fixtures/test_allowed_address_pairs_include_vm_type_network_role/pass/neutron/valid_template.yaml rename to ice_validator/tests/fixtures/test_allowed_address_pairs_include_vm_type_network_role/pass/pass.yaml index 58444b3..d7cbd54 100644 --- a/ice_validator/tests/fixtures/test_allowed_address_pairs_include_vm_type_network_role/pass/neutron/valid_template.yaml +++ b/ice_validator/tests/fixtures/test_allowed_address_pairs_include_vm_type_network_role/pass/pass.yaml @@ -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 } diff --git a/ice_validator/tests/fixtures/test_contrail_instance_ip_parameters/fail/fail_base.yaml b/ice_validator/tests/fixtures/test_contrail_instance_ip_parameters/fail/fail_base.yaml index 7043cda..93924f2 100644 --- a/ice_validator/tests/fixtures/test_contrail_instance_ip_parameters/fail/fail_base.yaml +++ b/ice_validator/tests/fixtures/test_contrail_instance_ip_parameters/fail/fail_base.yaml @@ -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 diff --git a/ice_validator/tests/fixtures/test_contrail_instance_ip_parameters/fail/fail_module.yaml b/ice_validator/tests/fixtures/test_contrail_instance_ip_parameters/fail/fail_module.yaml index 66dd13d..def7b3d 100644 --- a/ice_validator/tests/fixtures/test_contrail_instance_ip_parameters/fail/fail_module.yaml +++ b/ice_validator/tests/fixtures/test_contrail_instance_ip_parameters/fail/fail_module.yaml @@ -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 } diff --git a/ice_validator/tests/helpers.py b/ice_validator/tests/helpers.py index 424dde1..f4a368c 100644 --- a/ice_validator/tests/helpers.py +++ b/ice_validator/tests/helpers.py @@ -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" + ) diff --git a/ice_validator/tests/structures.py b/ice_validator/tests/structures.py index 887917c..09dd222 100644 --- a/ice_validator/tests/structures.py +++ b/ice_validator/tests/structures.py @@ -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) diff --git a/ice_validator/tests/test_internal_networks.py b/ice_validator/tests/test_internal_networks.py index 92cad9c..b06467a 100644 --- a/ice_validator/tests/test_internal_networks.py +++ b/ice_validator/tests/test_internal_networks.py @@ -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"), ] diff --git a/ice_validator/tests/test_network_format.py b/ice_validator/tests/test_network_format.py index 98fcd37..23e46f9 100644 --- a/ice_validator/tests/test_network_format.py +++ b/ice_validator/tests/test_network_format.py @@ -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) diff --git a/ice_validator/tests/test_neutron_port_fixed_ips_subnet.py b/ice_validator/tests/test_neutron_port_fixed_ips_subnet.py index 8c15711..a6c9f91 100644 --- a/ice_validator/tests/test_neutron_port_fixed_ips_subnet.py +++ b/ice_validator/tests/test_neutron_port_fixed_ips_subnet.py @@ -38,12 +38,11 @@ # 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( ( diff --git a/ice_validator/tests/test_non_server_name.py b/ice_validator/tests/test_non_server_name.py index 9361389..7a5c11f 100644 --- a/ice_validator/tests/test_non_server_name.py +++ b/ice_validator/tests/test_non_server_name.py @@ -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(): diff --git a/ice_validator/tests/test_vm_class_has_unique_type.py b/ice_validator/tests/test_vm_class_has_unique_type.py index 7020a14..f264edc 100644 --- a/ice_validator/tests/test_vm_class_has_unique_type.py +++ b/ice_validator/tests/test_vm_class_has_unique_type.py @@ -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: diff --git a/ice_validator/tests/test_vm_type_case.py b/ice_validator/tests/test_vm_type_case.py index 3ecd8de..6919404 100644 --- a/ice_validator/tests/test_vm_type_case.py +++ b/ice_validator/tests/test_vm_type_case.py @@ -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 diff --git a/ice_validator/tests/utils/ports.py b/ice_validator/tests/utils/ports.py index d65202c..d6c3be9 100644 --- a/ice_validator/tests/utils/ports.py +++ b/ice_validator/tests/utils/ports.py @@ -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")