From 1af0d577ab6d8c431ae1322657c50efd5e0a1a93 Mon Sep 17 00:00:00 2001 From: "stark, steven" Date: Thu, 9 Aug 2018 15:33:25 -0700 Subject: [PATCH] [VVP] create new validation scripts - create validation scripts for R-04747, R-30804, R-11690, R-46839, R-98407 - other small script enhancements Change-Id: I12c42a43c83e5cb4217895c19fd0beef928dc955 Issue-ID: VVP-103 Signed-off-by: stark, steven --- .../test_cloud_config_resource_id/fail/fail0.yaml | 78 +++++++++++++ .../test_cloud_config_resource_id/fail/fail1.yaml | 78 +++++++++++++ .../test_cloud_config_resource_id/pass/pass0.yaml | 78 +++++++++++++ .../fail/fail0.yaml | 78 +++++++++++++ .../fail/fail1.yaml | 78 +++++++++++++ .../pass/pass0.yaml | 78 +++++++++++++ .../test_nova_servers_index/fail/fail0.yaml | 72 ++++++++++++ .../test_nova_servers_index/fail/fail1.yaml | 72 ++++++++++++ .../test_nova_servers_index/fail/fail2.yaml | 79 +++++++++++++ .../test_nova_servers_index/pass/pass0.yaml | 72 ++++++++++++ .../test_vm_type_resource_id/fail/fail0.yaml | 71 ++++++++++++ .../test_vm_type_resource_id/pass/pass0.yaml | 68 +++++++++++ .../fixtures/test_vm_type_syntax/fail/fail0.yaml | 68 +++++++++++ .../fixtures/test_vm_type_syntax/pass/pass0.yaml | 68 +++++++++++ ice_validator/tests/helpers.py | 20 ++-- ice_validator/tests/parametrizers.py | 18 +-- ice_validator/tests/structures.py | 126 +++++++++++++++++++++ .../tests/test_all_referenced_resources_exists.py | 22 +++- .../tests/test_allowed_address_pair_format.py | 92 +++++++-------- ...d_address_pairs_include_vm_type_network_role.py | 21 +++- ice_validator/tests/test_availability_zone.py | 29 +++-- ice_validator/tests/test_base_template_names.py | 17 ++- .../tests/test_base_template_outputs_consumed.py | 35 ++++-- .../tests/test_cloud_config_resource_id.py | 87 ++++++++++++++ ice_validator/tests/test_env_and_yaml_same_name.py | 18 ++- ice_validator/tests/test_env_files_provided.py | 14 ++- .../tests/test_environment_file_structure.py | 68 ++++++----- .../tests/test_multipart_mime_resource_id.py | 87 ++++++++++++++ ice_validator/tests/test_nova_servers_index.py | 119 +++++++++++++++++++ ice_validator/tests/test_vm_type_resource_id.py | 74 ++++++++++++ ice_validator/tests/test_vm_type_syntax.py | 74 ++++++++++++ ice_validator/tests/utils/nested_dict.py | 64 +++++++++++ ice_validator/tests/utils/nested_files.py | 6 +- ice_validator/tests/utils/nested_iterables.py | 4 +- ice_validator/tests/utils/network_roles.py | 4 +- ice_validator/tests/utils/ports.py | 4 +- ice_validator/tests/utils/vm_types.py | 4 +- ice_validator/tests/utils/volumes.py | 9 +- ice_validator/tests/utils/yaml_custom_utils.py | 4 +- 39 files changed, 1910 insertions(+), 148 deletions(-) create mode 100644 ice_validator/tests/fixtures/test_cloud_config_resource_id/fail/fail0.yaml create mode 100644 ice_validator/tests/fixtures/test_cloud_config_resource_id/fail/fail1.yaml create mode 100644 ice_validator/tests/fixtures/test_cloud_config_resource_id/pass/pass0.yaml create mode 100644 ice_validator/tests/fixtures/test_multipart_mime_resource_id/fail/fail0.yaml create mode 100644 ice_validator/tests/fixtures/test_multipart_mime_resource_id/fail/fail1.yaml create mode 100644 ice_validator/tests/fixtures/test_multipart_mime_resource_id/pass/pass0.yaml create mode 100644 ice_validator/tests/fixtures/test_nova_servers_index/fail/fail0.yaml create mode 100644 ice_validator/tests/fixtures/test_nova_servers_index/fail/fail1.yaml create mode 100644 ice_validator/tests/fixtures/test_nova_servers_index/fail/fail2.yaml create mode 100644 ice_validator/tests/fixtures/test_nova_servers_index/pass/pass0.yaml create mode 100644 ice_validator/tests/fixtures/test_vm_type_resource_id/fail/fail0.yaml create mode 100644 ice_validator/tests/fixtures/test_vm_type_resource_id/pass/pass0.yaml create mode 100644 ice_validator/tests/fixtures/test_vm_type_syntax/fail/fail0.yaml create mode 100644 ice_validator/tests/fixtures/test_vm_type_syntax/pass/pass0.yaml mode change 100755 => 100644 ice_validator/tests/helpers.py mode change 100755 => 100644 ice_validator/tests/parametrizers.py create mode 100644 ice_validator/tests/structures.py create mode 100644 ice_validator/tests/test_cloud_config_resource_id.py create mode 100644 ice_validator/tests/test_multipart_mime_resource_id.py create mode 100644 ice_validator/tests/test_nova_servers_index.py create mode 100644 ice_validator/tests/test_vm_type_resource_id.py create mode 100644 ice_validator/tests/test_vm_type_syntax.py create mode 100644 ice_validator/tests/utils/nested_dict.py mode change 100755 => 100644 ice_validator/tests/utils/volumes.py diff --git a/ice_validator/tests/fixtures/test_cloud_config_resource_id/fail/fail0.yaml b/ice_validator/tests/fixtures/test_cloud_config_resource_id/fail/fail0.yaml new file mode 100644 index 0000000..a95a7e9 --- /dev/null +++ b/ice_validator/tests/fixtures/test_cloud_config_resource_id/fail/fail0.yaml @@ -0,0 +1,78 @@ +# -*- coding: utf8 -*- +# ============LICENSE_START==================================================== +# org.onap.vvp/validation-scripts +# =================================================================== +# Copyright © 2017 AT&T Intellectual Property. All rights reserved. +# =================================================================== +# +# Unless otherwise specified, all software contained herein is licensed +# under the Apache License, Version 2.0 (the "License"); +# you may not use this software except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# Unless otherwise specified, all documentation contained herein is licensed +# under the Creative Commons License, Attribution 4.0 Intl. (the "License"); +# you may not use this documentation except in compliance with the License. +# You may obtain a copy of the License at +# +# https://creativecommons.org/licenses/by/4.0/ +# +# Unless required by applicable law or agreed to in writing, documentation +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ============LICENSE_END============================================ +# +# ECOMP is a trademark and service mark of AT&T Intellectual Property. +# + +# VERSION = '1.0.0' + +--- +resources: + vm_type_a_server_0: + type: OS::Nova::Server + properties: + name: { get_param: [vm_type_a_names, 0] } + flavor: { get_param: vm_type_a_flavor_name} + image: { get_param: vm_type_a_image_name} + + vm_type_a_server_2: + type: OS::Nova::Server + properties: + name: { get_param: [vm_type_a_names, 1] } + flavor: { get_param: vm_type_a_flavor_name} + image: { get_param: vm_type_a_image_name} + + vm_type_b_server_0: + type: OS::Nova::Server + properties: + name: { get_param: vm_type_b_name_0 } + flavor: { get_param: vm_type_b_flavor_name} + image: { get_param: vm_type_b_image_name} + + vm_type_b_server_1: + type: OS::Nova::Server + properties: + name: { get_param: vm_type_b_name_1 } + flavor: { get_param: vm_type_b_flavor_name} + image: { get_param: vm_type_b_image_name} + + ok_vm_type_a_rcc: + type: OS::Heat::CloudConfig + + vm_type_c_rcc: + type: OS::Heat::CloudConfig + diff --git a/ice_validator/tests/fixtures/test_cloud_config_resource_id/fail/fail1.yaml b/ice_validator/tests/fixtures/test_cloud_config_resource_id/fail/fail1.yaml new file mode 100644 index 0000000..ba9c0bd --- /dev/null +++ b/ice_validator/tests/fixtures/test_cloud_config_resource_id/fail/fail1.yaml @@ -0,0 +1,78 @@ +# -*- coding: utf8 -*- +# ============LICENSE_START==================================================== +# org.onap.vvp/validation-scripts +# =================================================================== +# Copyright © 2017 AT&T Intellectual Property. All rights reserved. +# =================================================================== +# +# Unless otherwise specified, all software contained herein is licensed +# under the Apache License, Version 2.0 (the "License"); +# you may not use this software except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# Unless otherwise specified, all documentation contained herein is licensed +# under the Creative Commons License, Attribution 4.0 Intl. (the "License"); +# you may not use this documentation except in compliance with the License. +# You may obtain a copy of the License at +# +# https://creativecommons.org/licenses/by/4.0/ +# +# Unless required by applicable law or agreed to in writing, documentation +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ============LICENSE_END============================================ +# +# ECOMP is a trademark and service mark of AT&T Intellectual Property. +# + +# VERSION = '1.0.0' + +--- +resources: + vm_type_a_server_2: + type: OS::Nova::Server + properties: + name: { get_param: [vm_type_a_names, 0] } + flavor: { get_param: vm_type_a_flavor_name} + image: { get_param: vm_type_a_image_name} + + vm_type_a_server_1: + type: OS::Nova::Server + properties: + name: { get_param: [vm_type_a_names, 1] } + flavor: { get_param: vm_type_a_flavor_name} + image: { get_param: vm_type_a_image_name} + + vm_type_b_server_0: + type: OS::Nova::Server + properties: + name: { get_param: vm_type_b_name_0 } + flavor: { get_param: vm_type_b_flavor_name} + image: { get_param: vm_type_b_image_name} + + vm_type_b_server_1: + type: OS::Nova::Server + properties: + name: { get_param: vm_type_b_name_1 } + flavor: { get_param: vm_type_b_flavor_name} + image: { get_param: vm_type_b_image_name} + + vm_type_x_rcc: + type: OS::Heat::CloudConfig + + vm_type_y_rcc: + type: OS::Heat::CloudConfig + diff --git a/ice_validator/tests/fixtures/test_cloud_config_resource_id/pass/pass0.yaml b/ice_validator/tests/fixtures/test_cloud_config_resource_id/pass/pass0.yaml new file mode 100644 index 0000000..6644531 --- /dev/null +++ b/ice_validator/tests/fixtures/test_cloud_config_resource_id/pass/pass0.yaml @@ -0,0 +1,78 @@ +# -*- coding: utf8 -*- +# ============LICENSE_START==================================================== +# org.onap.vvp/validation-scripts +# =================================================================== +# Copyright © 2017 AT&T Intellectual Property. All rights reserved. +# =================================================================== +# +# Unless otherwise specified, all software contained herein is licensed +# under the Apache License, Version 2.0 (the "License"); +# you may not use this software except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# Unless otherwise specified, all documentation contained herein is licensed +# under the Creative Commons License, Attribution 4.0 Intl. (the "License"); +# you may not use this documentation except in compliance with the License. +# You may obtain a copy of the License at +# +# https://creativecommons.org/licenses/by/4.0/ +# +# Unless required by applicable law or agreed to in writing, documentation +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ============LICENSE_END============================================ +# +# ECOMP is a trademark and service mark of AT&T Intellectual Property. +# + +# VERSION = '1.0.0' + +--- +resources: + vm_type_a_server_0: + type: OS::Nova::Server + properties: + name: { get_param: [vm_type_a_names, 0] } + flavor: { get_param: vm_type_a_flavor_name} + image: { get_param: vm_type_a_image_name} + + vm_type_a_server_1: + type: OS::Nova::Server + properties: + name: { get_param: [vm_type_a_names, 1] } + flavor: { get_param: vm_type_a_flavor_name} + image: { get_param: vm_type_a_image_name} + + vm_type_b_server_0: + type: OS::Nova::Server + properties: + name: { get_param: vm_type_b_name_0 } + flavor: { get_param: vm_type_b_flavor_name} + image: { get_param: vm_type_b_image_name} + + vm_type_b_server_1: + type: OS::Nova::Server + properties: + name: { get_param: vm_type_b_name_1 } + flavor: { get_param: vm_type_b_flavor_name} + image: { get_param: vm_type_b_image_name} + + vm_type_a_rcc: + type: OS::Heat::CloudConfig + + vm_type_b_rcc: + type: OS::Heat::CloudConfig + diff --git a/ice_validator/tests/fixtures/test_multipart_mime_resource_id/fail/fail0.yaml b/ice_validator/tests/fixtures/test_multipart_mime_resource_id/fail/fail0.yaml new file mode 100644 index 0000000..d21e27c --- /dev/null +++ b/ice_validator/tests/fixtures/test_multipart_mime_resource_id/fail/fail0.yaml @@ -0,0 +1,78 @@ +# -*- coding: utf8 -*- +# ============LICENSE_START==================================================== +# org.onap.vvp/validation-scripts +# =================================================================== +# Copyright © 2017 AT&T Intellectual Property. All rights reserved. +# =================================================================== +# +# Unless otherwise specified, all software contained herein is licensed +# under the Apache License, Version 2.0 (the "License"); +# you may not use this software except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# Unless otherwise specified, all documentation contained herein is licensed +# under the Creative Commons License, Attribution 4.0 Intl. (the "License"); +# you may not use this documentation except in compliance with the License. +# You may obtain a copy of the License at +# +# https://creativecommons.org/licenses/by/4.0/ +# +# Unless required by applicable law or agreed to in writing, documentation +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ============LICENSE_END============================================ +# +# ECOMP is a trademark and service mark of AT&T Intellectual Property. +# + +# VERSION = '1.0.0' + +--- +resources: + vm_type_a_server_0: + type: OS::Nova::Server + properties: + name: { get_param: [vm_type_a_names, 0] } + flavor: { get_param: vm_type_a_flavor_name} + image: { get_param: vm_type_a_image_name} + + vm_type_a_server_2: + type: OS::Nova::Server + properties: + name: { get_param: [vm_type_a_names, 1] } + flavor: { get_param: vm_type_a_flavor_name} + image: { get_param: vm_type_a_image_name} + + vm_type_b_server_0: + type: OS::Nova::Server + properties: + name: { get_param: vm_type_b_name_0 } + flavor: { get_param: vm_type_b_flavor_name} + image: { get_param: vm_type_b_image_name} + + vm_type_b_server_1: + type: OS::Nova::Server + properties: + name: { get_param: vm_type_b_name_1 } + flavor: { get_param: vm_type_b_flavor_name} + image: { get_param: vm_type_b_image_name} + + ok_vm_type_a_rcc: + type: OS::Heat::MultipartMime + + vm_type_c_rcc: + type: OS::Heat::MultipartMime + diff --git a/ice_validator/tests/fixtures/test_multipart_mime_resource_id/fail/fail1.yaml b/ice_validator/tests/fixtures/test_multipart_mime_resource_id/fail/fail1.yaml new file mode 100644 index 0000000..1486586 --- /dev/null +++ b/ice_validator/tests/fixtures/test_multipart_mime_resource_id/fail/fail1.yaml @@ -0,0 +1,78 @@ +# -*- coding: utf8 -*- +# ============LICENSE_START==================================================== +# org.onap.vvp/validation-scripts +# =================================================================== +# Copyright © 2017 AT&T Intellectual Property. All rights reserved. +# =================================================================== +# +# Unless otherwise specified, all software contained herein is licensed +# under the Apache License, Version 2.0 (the "License"); +# you may not use this software except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# Unless otherwise specified, all documentation contained herein is licensed +# under the Creative Commons License, Attribution 4.0 Intl. (the "License"); +# you may not use this documentation except in compliance with the License. +# You may obtain a copy of the License at +# +# https://creativecommons.org/licenses/by/4.0/ +# +# Unless required by applicable law or agreed to in writing, documentation +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ============LICENSE_END============================================ +# +# ECOMP is a trademark and service mark of AT&T Intellectual Property. +# + +# VERSION = '1.0.0' + +--- +resources: + vm_type_a_server_2: + type: OS::Nova::Server + properties: + name: { get_param: [vm_type_a_names, 0] } + flavor: { get_param: vm_type_a_flavor_name} + image: { get_param: vm_type_a_image_name} + + vm_type_a_server_1: + type: OS::Nova::Server + properties: + name: { get_param: [vm_type_a_names, 1] } + flavor: { get_param: vm_type_a_flavor_name} + image: { get_param: vm_type_a_image_name} + + vm_type_b_server_0: + type: OS::Nova::Server + properties: + name: { get_param: vm_type_b_name_0 } + flavor: { get_param: vm_type_b_flavor_name} + image: { get_param: vm_type_b_image_name} + + vm_type_b_server_1: + type: OS::Nova::Server + properties: + name: { get_param: vm_type_b_name_1 } + flavor: { get_param: vm_type_b_flavor_name} + image: { get_param: vm_type_b_image_name} + + vm_type_x_rcc: + type: OS::Heat::MultipartMime + + vm_type_y_rcc: + type: OS::Heat::MultipartMime + diff --git a/ice_validator/tests/fixtures/test_multipart_mime_resource_id/pass/pass0.yaml b/ice_validator/tests/fixtures/test_multipart_mime_resource_id/pass/pass0.yaml new file mode 100644 index 0000000..0d4bb8b --- /dev/null +++ b/ice_validator/tests/fixtures/test_multipart_mime_resource_id/pass/pass0.yaml @@ -0,0 +1,78 @@ +# -*- coding: utf8 -*- +# ============LICENSE_START==================================================== +# org.onap.vvp/validation-scripts +# =================================================================== +# Copyright © 2017 AT&T Intellectual Property. All rights reserved. +# =================================================================== +# +# Unless otherwise specified, all software contained herein is licensed +# under the Apache License, Version 2.0 (the "License"); +# you may not use this software except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# Unless otherwise specified, all documentation contained herein is licensed +# under the Creative Commons License, Attribution 4.0 Intl. (the "License"); +# you may not use this documentation except in compliance with the License. +# You may obtain a copy of the License at +# +# https://creativecommons.org/licenses/by/4.0/ +# +# Unless required by applicable law or agreed to in writing, documentation +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ============LICENSE_END============================================ +# +# ECOMP is a trademark and service mark of AT&T Intellectual Property. +# + +# VERSION = '1.0.0' + +--- +resources: + vm_type_a_server_0: + type: OS::Nova::Server + properties: + name: { get_param: [vm_type_a_names, 0] } + flavor: { get_param: vm_type_a_flavor_name} + image: { get_param: vm_type_a_image_name} + + vm_type_a_server_1: + type: OS::Nova::Server + properties: + name: { get_param: [vm_type_a_names, 1] } + flavor: { get_param: vm_type_a_flavor_name} + image: { get_param: vm_type_a_image_name} + + vm_type_b_server_0: + type: OS::Nova::Server + properties: + name: { get_param: vm_type_b_name_0 } + flavor: { get_param: vm_type_b_flavor_name} + image: { get_param: vm_type_b_image_name} + + vm_type_b_server_1: + type: OS::Nova::Server + properties: + name: { get_param: vm_type_b_name_1 } + flavor: { get_param: vm_type_b_flavor_name} + image: { get_param: vm_type_b_image_name} + + vm_type_a_rcc: + type: OS::Heat::MultipartMime + + vm_type_b_rcc: + type: OS::Heat::MultipartMime + diff --git a/ice_validator/tests/fixtures/test_nova_servers_index/fail/fail0.yaml b/ice_validator/tests/fixtures/test_nova_servers_index/fail/fail0.yaml new file mode 100644 index 0000000..b75f58c --- /dev/null +++ b/ice_validator/tests/fixtures/test_nova_servers_index/fail/fail0.yaml @@ -0,0 +1,72 @@ +# -*- coding: utf8 -*- +# ============LICENSE_START==================================================== +# org.onap.vvp/validation-scripts +# =================================================================== +# Copyright © 2017 AT&T Intellectual Property. All rights reserved. +# =================================================================== +# +# Unless otherwise specified, all software contained herein is licensed +# under the Apache License, Version 2.0 (the "License"); +# you may not use this software except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# Unless otherwise specified, all documentation contained herein is licensed +# under the Creative Commons License, Attribution 4.0 Intl. (the "License"); +# you may not use this documentation except in compliance with the License. +# You may obtain a copy of the License at +# +# https://creativecommons.org/licenses/by/4.0/ +# +# Unless required by applicable law or agreed to in writing, documentation +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ============LICENSE_END============================================ +# +# ECOMP is a trademark and service mark of AT&T Intellectual Property. +# + +# VERSION = '1.0.0' + +--- +resources: + vm_type_a_server_0: + type: OS::Nova::Server + properties: + name: { get_param: [vm_type_a_names, 0] } + flavor: { get_param: vm_type_a_flavor_name} + image: { get_param: vm_type_a_image_name} + + vm_type_a_server_2: + type: OS::Nova::Server + properties: + name: { get_param: [vm_type_a_names, 1] } + flavor: { get_param: vm_type_a_flavor_name} + image: { get_param: vm_type_a_image_name} + + vm_type_b_server_0: + type: OS::Nova::Server + properties: + name: { get_param: vm_type_b_name_0 } + flavor: { get_param: vm_type_b_flavor_name} + image: { get_param: vm_type_b_image_name} + + vm_type_b_server_1: + type: OS::Nova::Server + properties: + name: { get_param: vm_type_b_name_1 } + flavor: { get_param: vm_type_b_flavor_name} + image: { get_param: vm_type_b_image_name} + diff --git a/ice_validator/tests/fixtures/test_nova_servers_index/fail/fail1.yaml b/ice_validator/tests/fixtures/test_nova_servers_index/fail/fail1.yaml new file mode 100644 index 0000000..4ee1d8b --- /dev/null +++ b/ice_validator/tests/fixtures/test_nova_servers_index/fail/fail1.yaml @@ -0,0 +1,72 @@ +# -*- coding: utf8 -*- +# ============LICENSE_START==================================================== +# org.onap.vvp/validation-scripts +# =================================================================== +# Copyright © 2017 AT&T Intellectual Property. All rights reserved. +# =================================================================== +# +# Unless otherwise specified, all software contained herein is licensed +# under the Apache License, Version 2.0 (the "License"); +# you may not use this software except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# Unless otherwise specified, all documentation contained herein is licensed +# under the Creative Commons License, Attribution 4.0 Intl. (the "License"); +# you may not use this documentation except in compliance with the License. +# You may obtain a copy of the License at +# +# https://creativecommons.org/licenses/by/4.0/ +# +# Unless required by applicable law or agreed to in writing, documentation +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ============LICENSE_END============================================ +# +# ECOMP is a trademark and service mark of AT&T Intellectual Property. +# + +# VERSION = '1.0.0' + +--- +resources: + vm_type_a_server_2: + type: OS::Nova::Server + properties: + name: { get_param: [vm_type_a_names, 0] } + flavor: { get_param: vm_type_a_flavor_name} + image: { get_param: vm_type_a_image_name} + + vm_type_a_server_1: + type: OS::Nova::Server + properties: + name: { get_param: [vm_type_a_names, 1] } + flavor: { get_param: vm_type_a_flavor_name} + image: { get_param: vm_type_a_image_name} + + vm_type_b_server_0: + type: OS::Nova::Server + properties: + name: { get_param: vm_type_b_name_0 } + flavor: { get_param: vm_type_b_flavor_name} + image: { get_param: vm_type_b_image_name} + + vm_type_b_server_1: + type: OS::Nova::Server + properties: + name: { get_param: vm_type_b_name_1 } + flavor: { get_param: vm_type_b_flavor_name} + image: { get_param: vm_type_b_image_name} + diff --git a/ice_validator/tests/fixtures/test_nova_servers_index/fail/fail2.yaml b/ice_validator/tests/fixtures/test_nova_servers_index/fail/fail2.yaml new file mode 100644 index 0000000..3d02a12 --- /dev/null +++ b/ice_validator/tests/fixtures/test_nova_servers_index/fail/fail2.yaml @@ -0,0 +1,79 @@ +# -*- coding: utf8 -*- +# ============LICENSE_START==================================================== +# org.onap.vvp/validation-scripts +# =================================================================== +# Copyright © 2017 AT&T Intellectual Property. All rights reserved. +# =================================================================== +# +# Unless otherwise specified, all software contained herein is licensed +# under the Apache License, Version 2.0 (the "License"); +# you may not use this software except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# Unless otherwise specified, all documentation contained herein is licensed +# under the Creative Commons License, Attribution 4.0 Intl. (the "License"); +# you may not use this documentation except in compliance with the License. +# You may obtain a copy of the License at +# +# https://creativecommons.org/licenses/by/4.0/ +# +# Unless required by applicable law or agreed to in writing, documentation +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ============LICENSE_END============================================ +# +# ECOMP is a trademark and service mark of AT&T Intellectual Property. +# + +# VERSION = '1.0.0' + +--- +resources: + vm_type_a_server_0: + type: OS::Nova::Server + properties: + name: { get_param: [vm_type_a_names, 0] } + flavor: { get_param: vm_type_a_flavor_name} + image: { get_param: vm_type_a_image_name} + + vm_type_a_sErver_0: + type: OS::Nova::Server + properties: + name: { get_param: [vm_type_a_names, 0] } + flavor: { get_param: vm_type_a_flavor_name} + image: { get_param: vm_type_a_image_name} + + vm_type_a_server_1: + type: OS::Nova::Server + properties: + name: { get_param: [vm_type_a_names, 1] } + flavor: { get_param: vm_type_a_flavor_name} + image: { get_param: vm_type_a_image_name} + + vm_type_b_server_0: + type: OS::Nova::Server + properties: + name: { get_param: vm_type_b_name_0 } + flavor: { get_param: vm_type_b_flavor_name} + image: { get_param: vm_type_b_image_name} + + vm_type_b_server_1: + type: OS::Nova::Server + properties: + name: { get_param: vm_type_b_name_1 } + flavor: { get_param: vm_type_b_flavor_name} + image: { get_param: vm_type_b_image_name} + diff --git a/ice_validator/tests/fixtures/test_nova_servers_index/pass/pass0.yaml b/ice_validator/tests/fixtures/test_nova_servers_index/pass/pass0.yaml new file mode 100644 index 0000000..5f4a931 --- /dev/null +++ b/ice_validator/tests/fixtures/test_nova_servers_index/pass/pass0.yaml @@ -0,0 +1,72 @@ +# -*- coding: utf8 -*- +# ============LICENSE_START==================================================== +# org.onap.vvp/validation-scripts +# =================================================================== +# Copyright © 2017 AT&T Intellectual Property. All rights reserved. +# =================================================================== +# +# Unless otherwise specified, all software contained herein is licensed +# under the Apache License, Version 2.0 (the "License"); +# you may not use this software except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# Unless otherwise specified, all documentation contained herein is licensed +# under the Creative Commons License, Attribution 4.0 Intl. (the "License"); +# you may not use this documentation except in compliance with the License. +# You may obtain a copy of the License at +# +# https://creativecommons.org/licenses/by/4.0/ +# +# Unless required by applicable law or agreed to in writing, documentation +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ============LICENSE_END============================================ +# +# ECOMP is a trademark and service mark of AT&T Intellectual Property. +# + +# VERSION = '1.0.0' + +--- +resources: + vm_type_a_server_0: + type: OS::Nova::Server + properties: + name: { get_param: [vm_type_a_names, 0] } + flavor: { get_param: vm_type_a_flavor_name} + image: { get_param: vm_type_a_image_name} + + vm_type_a_server_1: + type: OS::Nova::Server + properties: + name: { get_param: [vm_type_a_names, 1] } + flavor: { get_param: vm_type_a_flavor_name} + image: { get_param: vm_type_a_image_name} + + vm_type_b_server_0: + type: OS::Nova::Server + properties: + name: { get_param: vm_type_b_name_0 } + flavor: { get_param: vm_type_b_flavor_name} + image: { get_param: vm_type_b_image_name} + + vm_type_b_server_1: + type: OS::Nova::Server + properties: + name: { get_param: vm_type_b_name_1 } + flavor: { get_param: vm_type_b_flavor_name} + image: { get_param: vm_type_b_image_name} + diff --git a/ice_validator/tests/fixtures/test_vm_type_resource_id/fail/fail0.yaml b/ice_validator/tests/fixtures/test_vm_type_resource_id/fail/fail0.yaml new file mode 100644 index 0000000..25f6753 --- /dev/null +++ b/ice_validator/tests/fixtures/test_vm_type_resource_id/fail/fail0.yaml @@ -0,0 +1,71 @@ +# -*- coding: utf8 -*- +# ============LICENSE_START======================================================= +# org.onap.vvp/validation-scripts +# =================================================================== +# Copyright © 2017 AT&T Intellectual Property. All rights reserved. +# =================================================================== +# +# Unless otherwise specified, all software contained herein is licensed +# under the Apache License, Version 2.0 (the "License"); +# you may not use this software except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# Unless otherwise specified, all documentation contained herein is licensed +# under the Creative Commons License, Attribution 4.0 Intl. (the "License"); +# you may not use this documentation except in compliance with the License. +# You may obtain a copy of the License at +# +# https://creativecommons.org/licenses/by/4.0/ +# +# Unless required by applicable law or agreed to in writing, documentation +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ============LICENSE_END============================================ +# +# ECOMP is a trademark and service mark of AT&T Intellectual Property. +# + +# VERSION = '1.1.0' + +--- +resources: + vm_type_a_server_0: # ok + type: OS::Nova::Server + properties: + name: { get_param: [vm_type_a_names, 0] } + flavor: { get_param: vm_type_a_flavor_name} + image: { get_param: vm_type_a_image_name} + + vm_type_a_server_1: # ok + type: OS::Nova::Server + properties: + name: { get_param: [vm_type_a_names, 1] } + flavor: { get_param: vm_type_a_flavor_name} + image: { get_param: vm_type_a_image_name} + + VM_TYPE_BOK_SERVER_0: # ok for this test. + type: OS::Nova::Server + properties: + name: { get_param: vm_type_b_name_0 } + flavor: { get_param: vm_type_b_flavor_name} + image: { get_param: vm_type_b_image_name} + + Vm_type_b_ad_server_1: # fails + type: OS::Nova::Server + properties: + name: { get_param: vm_type_b_name_1 } + flavor: { get_param: vm_type_b_flavor_name} + image: { get_param: vm_type_b_image_name} diff --git a/ice_validator/tests/fixtures/test_vm_type_resource_id/pass/pass0.yaml b/ice_validator/tests/fixtures/test_vm_type_resource_id/pass/pass0.yaml new file mode 100644 index 0000000..eb07cae --- /dev/null +++ b/ice_validator/tests/fixtures/test_vm_type_resource_id/pass/pass0.yaml @@ -0,0 +1,68 @@ +# -*- coding: utf8 -*- +# ============LICENSE_START======================================================= +# org.onap.vvp/validation-scripts +# =================================================================== +# Copyright © 2017 AT&T Intellectual Property. All rights reserved. +# =================================================================== +# +# Unless otherwise specified, all software contained herein is licensed +# under the Apache License, Version 2.0 (the "License"); +# you may not use this software except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# Unless otherwise specified, all documentation contained herein is licensed +# under the Creative Commons License, Attribution 4.0 Intl. (the "License"); +# you may not use this documentation except in compliance with the License. +# You may obtain a copy of the License at +# +# https://creativecommons.org/licenses/by/4.0/ +# +# Unless required by applicable law or agreed to in writing, documentation +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ============LICENSE_END============================================ +# +# ECOMP is a trademark and service mark of AT&T Intellectual Property. +# +--- +resources: + vm_type_a_server_0: + type: OS::Nova::Server + properties: + name: { get_param: [vm_type_a_names, 0] } + flavor: { get_param: vm_type_a_flavor_name} + image: { get_param: vm_type_a_image_name} + + vm_type_a_server_1: + type: OS::Nova::Server + properties: + name: { get_param: [vm_type_a_names, 1] } + flavor: { get_param: vm_type_a_flavor_name} + image: { get_param: vm_type_a_image_name} + + vm_type_b_server_0: + type: OS::Nova::Server + properties: + name: { get_param: vm_type_b_name_0 } + flavor: { get_param: vm_type_b_flavor_name} + image: { get_param: vm_type_b_image_name} + + vm_type_b_server_1: + type: OS::Nova::Server + properties: + name: { get_param: vm_type_b_name_1 } + flavor: { get_param: vm_type_b_flavor_name} + image: { get_param: vm_type_b_image_name} diff --git a/ice_validator/tests/fixtures/test_vm_type_syntax/fail/fail0.yaml b/ice_validator/tests/fixtures/test_vm_type_syntax/fail/fail0.yaml new file mode 100644 index 0000000..aa80056 --- /dev/null +++ b/ice_validator/tests/fixtures/test_vm_type_syntax/fail/fail0.yaml @@ -0,0 +1,68 @@ +# -*- coding: utf8 -*- +# ============LICENSE_START======================================================= +# org.onap.vvp/validation-scripts +# =================================================================== +# Copyright © 2017 AT&T Intellectual Property. All rights reserved. +# =================================================================== +# +# Unless otherwise specified, all software contained herein is licensed +# under the Apache License, Version 2.0 (the "License"); +# you may not use this software except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# Unless otherwise specified, all documentation contained herein is licensed +# under the Creative Commons License, Attribution 4.0 Intl. (the "License"); +# you may not use this documentation except in compliance with the License. +# You may obtain a copy of the License at +# +# https://creativecommons.org/licenses/by/4.0/ +# +# Unless required by applicable law or agreed to in writing, documentation +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ============LICENSE_END============================================ +# +# ECOMP is a trademark and service mark of AT&T Intellectual Property. +# +--- +resources: + vm_type_a_server_0: + type: OS::Nova::Server + properties: + name: { get_param: [vm_type_a_names, 0] } + flavor: { get_param: vm_type_a_flavor_name} + image: { get_param: vm_type_a_image_name} + + vm_type_a_server_1: + type: OS::Nova::Server + properties: + name: { get_param: [vm_type_a_names, 1] } + flavor: { get_param: vm_type_a_flavor_name} + image: { get_param: vm_type_a_image_name} + + vm_type_b_server_0: + type: OS::Nova::Server + properties: + name: { get_param: vm_type_b_name_0 } + flavor: { get_param: vm_type_b_flavor_name} + image: { get_param: vm_type_b_image_name} + + vm_type_b_server_1: + type: OS::Nova::Server + properties: + name: { get_param: vm_type_b_name_1 } + flavor: { get_param: vm_type.b_flavor_name} + image: { get_param: vm_type_b_image_name} diff --git a/ice_validator/tests/fixtures/test_vm_type_syntax/pass/pass0.yaml b/ice_validator/tests/fixtures/test_vm_type_syntax/pass/pass0.yaml new file mode 100644 index 0000000..eb07cae --- /dev/null +++ b/ice_validator/tests/fixtures/test_vm_type_syntax/pass/pass0.yaml @@ -0,0 +1,68 @@ +# -*- coding: utf8 -*- +# ============LICENSE_START======================================================= +# org.onap.vvp/validation-scripts +# =================================================================== +# Copyright © 2017 AT&T Intellectual Property. All rights reserved. +# =================================================================== +# +# Unless otherwise specified, all software contained herein is licensed +# under the Apache License, Version 2.0 (the "License"); +# you may not use this software except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# Unless otherwise specified, all documentation contained herein is licensed +# under the Creative Commons License, Attribution 4.0 Intl. (the "License"); +# you may not use this documentation except in compliance with the License. +# You may obtain a copy of the License at +# +# https://creativecommons.org/licenses/by/4.0/ +# +# Unless required by applicable law or agreed to in writing, documentation +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ============LICENSE_END============================================ +# +# ECOMP is a trademark and service mark of AT&T Intellectual Property. +# +--- +resources: + vm_type_a_server_0: + type: OS::Nova::Server + properties: + name: { get_param: [vm_type_a_names, 0] } + flavor: { get_param: vm_type_a_flavor_name} + image: { get_param: vm_type_a_image_name} + + vm_type_a_server_1: + type: OS::Nova::Server + properties: + name: { get_param: [vm_type_a_names, 1] } + flavor: { get_param: vm_type_a_flavor_name} + image: { get_param: vm_type_a_image_name} + + vm_type_b_server_0: + type: OS::Nova::Server + properties: + name: { get_param: vm_type_b_name_0 } + flavor: { get_param: vm_type_b_flavor_name} + image: { get_param: vm_type_b_image_name} + + vm_type_b_server_1: + type: OS::Nova::Server + properties: + name: { get_param: vm_type_b_name_1 } + flavor: { get_param: vm_type_b_flavor_name} + image: { get_param: vm_type_b_image_name} diff --git a/ice_validator/tests/helpers.py b/ice_validator/tests/helpers.py old mode 100755 new mode 100644 index 37fd01f..5e4f3d3 --- a/ice_validator/tests/helpers.py +++ b/ice_validator/tests/helpers.py @@ -1,12 +1,12 @@ # -*- coding: utf8 -*- -# ============LICENSE_START======================================================= +# ============LICENSE_START==================================================== # org.onap.vvp/validation-scripts # =================================================================== # Copyright © 2017 AT&T Intellectual Property. All rights reserved. # =================================================================== # # Unless otherwise specified, all software contained herein is licensed -# under the Apache License, Version 2.0 (the “License”); +# 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 # @@ -21,7 +21,7 @@ # # # Unless otherwise specified, all documentation contained herein is licensed -# under the Creative Commons License, Attribution 4.0 Intl. (the “License”); +# 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 # @@ -38,8 +38,13 @@ # ECOMP is a trademark and service mark of AT&T Intellectual Property. # -import yaml +"""Helpers +""" + from boltons import funcutils +import yaml + +VERSION = '1.1.0' def check_basename_ending(template_type, basename): @@ -62,12 +67,11 @@ def get_parsed_yml_for_yaml_files(yaml_files, sections=None): sections = [] if sections is None else sections parsed_yml_list = [] for yaml_file in yaml_files: - yml = '' - try: with open(yaml_file) as fh: yml = yaml.load(fh) - except Exception as e: + except yaml.YAMLError as e: + # pylint: disable=superfluous-parens print('Error in %s: %s' % (yaml_file, e)) continue if yml: @@ -76,7 +80,6 @@ def get_parsed_yml_for_yaml_files(yaml_files, sections=None): if k not in sections: del yml[k] parsed_yml_list.append(yml) - return parsed_yml_list @@ -89,6 +92,7 @@ def validates(*requirement_ids): ... pass >>> assert test_something.requirement_ids == ['R-12345', 'R-12346'] """ + # pylint: disable=missing-docstring def decorator(func): # NOTE: We use a utility here to ensure that function signatures are # maintained because pytest inspects function signatures to inject diff --git a/ice_validator/tests/parametrizers.py b/ice_validator/tests/parametrizers.py old mode 100755 new mode 100644 index 33b214b..dcfe402 --- a/ice_validator/tests/parametrizers.py +++ b/ice_validator/tests/parametrizers.py @@ -1,12 +1,12 @@ # -*- coding: utf8 -*- -# ============LICENSE_START======================================================= +# ============LICENSE_START==================================================== # org.onap.vvp/validation-scripts # =================================================================== # Copyright © 2017 AT&T Intellectual Property. All rights reserved. # =================================================================== # # Unless otherwise specified, all software contained herein is licensed -# under the Apache License, Version 2.0 (the “License”); +# 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 # @@ -21,7 +21,7 @@ # # # Unless otherwise specified, all documentation contained herein is licensed -# under the Creative Commons License, Attribution 4.0 Intl. (the “License”); +# 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 # @@ -37,6 +37,10 @@ # # ECOMP is a trademark and service mark of AT&T Intellectual Property. # + +"""parametrizers +""" + from os import path, listdir import re import yaml @@ -104,16 +108,16 @@ def list_filenames_in_template_dir( if path.isfile(path.join(template_dir, s, f)) and path.splitext(f)[-1] in extensions and check_basename_ending( - template_type, - path.splitext(f)[0])] + template_type, + path.splitext(f)[0])] else: filenames = [path.join(template_dir, f) for f in listdir(template_dir) if path.isfile(path.join(template_dir, f)) and path.splitext(f)[-1] in extensions and check_basename_ending( - template_type, - path.splitext(f)[0])] + template_type, + path.splitext(f)[0])] return filenames diff --git a/ice_validator/tests/structures.py b/ice_validator/tests/structures.py new file mode 100644 index 0000000..705e35f --- /dev/null +++ b/ice_validator/tests/structures.py @@ -0,0 +1,126 @@ +# -*- coding: utf8 -*- +# ============LICENSE_START==================================================== +# org.onap.vvp/validation-scripts +# =================================================================== +# Copyright © 2017 AT&T Intellectual Property. All rights reserved. +# =================================================================== +# +# Unless otherwise specified, all software contained herein is licensed +# under the Apache License, Version 2.0 (the "License"); +# you may not use this software except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# Unless otherwise specified, all documentation contained herein is licensed +# under the Creative Commons License, Attribution 4.0 Intl. (the "License"); +# you may not use this documentation except in compliance with the License. +# You may obtain a copy of the License at +# +# https://creativecommons.org/licenses/by/4.0/ +# +# Unless required by applicable law or agreed to in writing, documentation +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ============LICENSE_END============================================ +# +# ECOMP is a trademark and service mark of AT&T Intellectual Property. +# + +'''structures +''' + +import os + +import yaml + +from .utils import nested_dict + +VERSION = '1.4.0' + + +class Heat(object): + """A Heat template. + filepath - absolute path to template file. + envpath - absolute path to environmnt file. + """ + def __init__(self, filepath=None, envpath=None): + self.filepath = None + self.basename = None + self.dirname = None + self.yml = None + self.heat_template_version = None + self.description = None + self.parameter_groups = None + self.parameters = None + self.resources = None + self.outputs = None + self.conditions = None + if filepath: + self.load(filepath) + self.env = None + if envpath: + self.load_env(envpath) + + def load(self, filepath): + """Load the Heat template given a filepath. + """ + self.filepath = filepath + self.basename = os.path.basename(self.filepath) + self.dirname = os.path.dirname(self.filepath) + with open(self.filepath) as fi: + self.yml = yaml.load(fi) + self.heat_template_version = self.yml.get('heat_template_version', + None) + self.description = self.yml.get('description', '') + self.parameter_groups = self.yml.get('parameter_groups', {}) + self.parameters = self.yml.get('parameters', {}) + self.resources = self.yml.get('resources', {}) + self.outputs = self.yml.get('outputs', {}) + self.conditions = self.yml.get('conditions', {}) + + def load_env(self, envpath): + """Load the Environment template given a envpath. + """ + self.env = Env(filepath=envpath) + + @staticmethod + def nested_get(dic, *keys): + """make utils.nested_dict.get available as a class method. + """ + return nested_dict.get(dic, *keys) + + +class Env(Heat): + """An Environment file + """ + pass + + +class Resource(object): + """A Resource + """ + def __init__(self, resource_id=None, resource=None): + self.resource_id = resource_id or '' + self.resource = resource or {} + + @staticmethod + def get_index_var(resource): + """Return the index_var for this resource. + """ + index_var = nested_dict.get( + resource, + 'properties', + 'index_var') or 'index' + return index_var diff --git a/ice_validator/tests/test_all_referenced_resources_exists.py b/ice_validator/tests/test_all_referenced_resources_exists.py index fd5b967..39247bf 100644 --- a/ice_validator/tests/test_all_referenced_resources_exists.py +++ b/ice_validator/tests/test_all_referenced_resources_exists.py @@ -1,12 +1,12 @@ # -*- coding: utf8 -*- -# ============LICENSE_START======================================================= +# ============LICENSE_START==================================================== # org.onap.vvp/validation-scripts # =================================================================== # Copyright © 2017 AT&T Intellectual Property. All rights reserved. # =================================================================== # # Unless otherwise specified, all software contained herein is licensed -# under the Apache License, Version 2.0 (the “License”); +# 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 # @@ -21,7 +21,7 @@ # # # Unless otherwise specified, all documentation contained herein is licensed -# under the Creative Commons License, Attribution 4.0 Intl. (the “License”); +# 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 # @@ -38,10 +38,18 @@ # ECOMP is a trademark and service mark of AT&T Intellectual Property. # +'''test_all_referenced_resources_exists +''' + import pytest import yaml + from .utils.nested_iterables import find_all_get_resource_in_yml +VERSION = '1.0.0' + +# pylint: disable=invalid-name + def test_all_referenced_resources_exists(yaml_file): ''' @@ -58,9 +66,11 @@ def test_all_referenced_resources_exists(yaml_file): resource_ids = yml['resources'].keys() referenced_resource_ids = find_all_get_resource_in_yml(yml) - missing_referenced_resources = [] + missing_referenced_resources = set() for referenced_resource_id in referenced_resource_ids: if referenced_resource_id not in resource_ids: - missing_referenced_resources.append(referenced_resource_id) + missing_referenced_resources.add(referenced_resource_id) - assert not set(missing_referenced_resources) + assert not missing_referenced_resources, ( + 'missing referenced resources %s' % list( + missing_referenced_resources)) diff --git a/ice_validator/tests/test_allowed_address_pair_format.py b/ice_validator/tests/test_allowed_address_pair_format.py index 683d560..721d5c9 100644 --- a/ice_validator/tests/test_allowed_address_pair_format.py +++ b/ice_validator/tests/test_allowed_address_pair_format.py @@ -1,12 +1,12 @@ # -*- coding: utf8 -*- -# ============LICENSE_START======================================================= +# ============LICENSE_START==================================================== # org.onap.vvp/validation-scripts # =================================================================== # Copyright © 2017 AT&T Intellectual Property. All rights reserved. # =================================================================== # # Unless otherwise specified, all software contained herein is licensed -# under the Apache License, Version 2.0 (the “License”); +# 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 # @@ -21,7 +21,7 @@ # # # Unless otherwise specified, all documentation contained herein is licensed -# under the Creative Commons License, Attribution 4.0 Intl. (the “License”); +# 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 # @@ -38,11 +38,21 @@ # ECOMP is a trademark and service mark of AT&T Intellectual Property. # +''' +test_allowed_address_pairs_format +''' + +import re + import pytest import yaml -from .utils.network_roles import get_network_role_from_port,\ - property_uses_get_resource -import re + +from .utils.network_roles import get_network_role_from_port, \ + property_uses_get_resource + +VERSION = '1.0.0' + +# pylint: disable=invalid-name def test_allowed_address_pairs_format(heat_template): @@ -88,46 +98,38 @@ def test_allowed_address_pairs_format(heat_template): invalid_allowed_address_pairs = [] for v1 in yml["resources"].values(): - if not isinstance(v1, dict): - continue - if "properties" not in v1: - continue - if v1.get("type") != "OS::Neutron::Port": - continue - if property_uses_get_resource(v1, "network"): + if (not isinstance(v1, dict) + or "properties" not in v1 + or v1.get("type") != "OS::Neutron::Port" + or property_uses_get_resource(v1, "network")): continue network_role = get_network_role_from_port(v1) - for k2, v2 in v1["properties"].items(): - if k2 != "allowed_address_pairs": + v2 = v1["properties"].get("allowed_address_pairs", {}) + for v3 in v2: + if ("ip_address" not in v3 + or "get_param" not in v3["ip_address"]): continue - for v3 in v2: - if "ip_address" not in v3: - continue - if "get_param" not in v3["ip_address"]: - continue - - valid_allowed_address_pair = False - for v4 in allowed_formats: - param = v3["ip_address"]["get_param"] - if isinstance(param, list): - param = param[0] - - # check if pattern matches - m = v4[3].match(param) - if m: - if v4[2] == "internal" and\ - len(m.groups()) > 1 and\ - m.group(2) == network_role: - valid_allowed_address_pair = True - break - elif v4[2] == "external" and\ - len(m.groups()) > 0 and\ - m.group(1).endswith("_" + network_role): - valid_allowed_address_pair = True - break - - if not valid_allowed_address_pair: - invalid_allowed_address_pairs.append(param) - - assert not set(invalid_allowed_address_pairs) + + param = v3["ip_address"]["get_param"] + if isinstance(param, list): + param = param[0] + + for v4 in allowed_formats: + # check if pattern matches + m = v4[3].match(param) + if m: + if (v4[2] == "internal" + and len(m.groups()) > 1 + and m.group(2) == network_role): + break + elif (v4[2] == "external" + and len(m.groups()) > 0 + and m.group(1).endswith("_" + network_role)): + break + else: + invalid_allowed_address_pairs.append(param) + + assert not set(invalid_allowed_address_pairs), ( + 'invalid_allowed_address_pairs %s' % list( + set(invalid_allowed_address_pairs))) diff --git a/ice_validator/tests/test_allowed_address_pairs_include_vm_type_network_role.py b/ice_validator/tests/test_allowed_address_pairs_include_vm_type_network_role.py index d4fdb36..cd2e50f 100644 --- a/ice_validator/tests/test_allowed_address_pairs_include_vm_type_network_role.py +++ b/ice_validator/tests/test_allowed_address_pairs_include_vm_type_network_role.py @@ -1,12 +1,12 @@ # -*- coding: utf8 -*- -# ============LICENSE_START======================================================= +# ============LICENSE_START==================================================== # org.onap.vvp/validation-scripts # =================================================================== # Copyright © 2017 AT&T Intellectual Property. All rights reserved. # =================================================================== # # Unless otherwise specified, all software contained herein is licensed -# under the Apache License, Version 2.0 (the “License”); +# 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 # @@ -21,7 +21,7 @@ # # # Unless otherwise specified, all documentation contained herein is licensed -# under the Creative Commons License, Attribution 4.0 Intl. (the “License”); +# 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 # @@ -37,12 +37,21 @@ # # ECOMP is a trademark and service mark of AT&T Intellectual Property. # -from .helpers import validates + +''' +test_allowed_address_pairs_include_vm_type_network_role +''' import pytest import yaml + +from .helpers import validates from .utils.ports import get_invalid_ip_addresses +VERSION = '1.0.0' + +# pylint: disable=invalid-name + @validates('R-41492', 'R-35735') @@ -62,4 +71,6 @@ def test_allowed_address_pairs_include_vm_type_network_role(heat_template): invalid_ip_addresses = get_invalid_ip_addresses(yml['resources'], "allowed_address_pairs") - assert not set(invalid_ip_addresses) + assert not set(invalid_ip_addresses), ( + 'invalid ip addresses allowed address pairs %s' % list( + set(invalid_ip_addresses))) diff --git a/ice_validator/tests/test_availability_zone.py b/ice_validator/tests/test_availability_zone.py index 77f1c56..6e0de32 100644 --- a/ice_validator/tests/test_availability_zone.py +++ b/ice_validator/tests/test_availability_zone.py @@ -1,12 +1,12 @@ # -*- coding: utf8 -*- -# ============LICENSE_START======================================================= +# ============LICENSE_START==================================================== # org.onap.vvp/validation-scripts # =================================================================== # Copyright © 2017 AT&T Intellectual Property. All rights reserved. # =================================================================== # # Unless otherwise specified, all software contained herein is licensed -# under the Apache License, Version 2.0 (the “License”); +# 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 # @@ -21,7 +21,7 @@ # # # Unless otherwise specified, all documentation contained herein is licensed -# under the Creative Commons License, Attribution 4.0 Intl. (the “License”); +# 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 # @@ -37,11 +37,17 @@ # # ECOMP is a trademark and service mark of AT&T Intellectual Property. # -from .helpers import validates +"""test +""" + +import re import pytest import yaml -import re + +from .helpers import validates + +VERSION = '1.1.0' @validates('R-98450') @@ -57,9 +63,9 @@ def test_availability_zone_naming(heat_template): if "resources" not in yml: pytest.skip("No resources specified in the heat template") - invalid_availability_zones = [] + invalid_availability_zones = set() - for k1, v1 in yml["resources"].items(): + for v1 in yml["resources"].values(): if not isinstance(v1, dict): continue if "properties" not in v1: @@ -71,8 +77,11 @@ def test_availability_zone_naming(heat_template): for k2, v2 in v1["properties"].items(): if k2 != 'availability_zone': continue - + if 'str_replace' in v2: + continue if not re.match(r'availability_zone_\d+', v2["get_param"]): - invalid_availability_zones.append(v2["get_param"]) + invalid_availability_zones.add(v2["get_param"]) - assert not set(invalid_availability_zones) + assert not invalid_availability_zones, ( + 'invalid availability zones %s' % list( + invalid_availability_zones)) diff --git a/ice_validator/tests/test_base_template_names.py b/ice_validator/tests/test_base_template_names.py index cc7ab0b..40452ae 100644 --- a/ice_validator/tests/test_base_template_names.py +++ b/ice_validator/tests/test_base_template_names.py @@ -1,12 +1,12 @@ # -*- coding: utf8 -*- -# ============LICENSE_START======================================================= +# ============LICENSE_START==================================================== # org.onap.vvp/validation-scripts # =================================================================== # Copyright © 2017 AT&T Intellectual Property. All rights reserved. # =================================================================== # # Unless otherwise specified, all software contained herein is licensed -# under the Apache License, Version 2.0 (the “License”); +# 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 # @@ -21,7 +21,7 @@ # # # Unless otherwise specified, all documentation contained herein is licensed -# under the Creative Commons License, Attribution 4.0 Intl. (the “License”); +# 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 # @@ -38,12 +38,18 @@ # ECOMP is a trademark and service mark of AT&T Intellectual Property. # +"""base template names +""" + from os import listdir from os import path import re + from .helpers import check_basename_ending from .helpers import validates +VERSION = '1.2.0' + # is 'base', starts with 'base_', contains '_base_', ends with '_base' RE_BASE = re.compile(r'(^base$)|(^base_)|(_base_)|(_base$)') @@ -66,4 +72,7 @@ def test_base_template_names(template_dir): if RE_BASE.search(filename): base_template_count += 1 - assert base_template_count == 1 + assert base_template_count == 1, ( + 'must be 1 "*_base_*" in %s not %d' % ( + filenames, + base_template_count)) diff --git a/ice_validator/tests/test_base_template_outputs_consumed.py b/ice_validator/tests/test_base_template_outputs_consumed.py index bec40f2..fc1edc1 100644 --- a/ice_validator/tests/test_base_template_outputs_consumed.py +++ b/ice_validator/tests/test_base_template_outputs_consumed.py @@ -1,12 +1,12 @@ # -*- coding: utf8 -*- -# ============LICENSE_START======================================================= +# ============LICENSE_START==================================================== # org.onap.vvp/validation-scripts # =================================================================== # Copyright © 2017 AT&T Intellectual Property. All rights reserved. # =================================================================== # # Unless otherwise specified, all software contained herein is licensed -# under the Apache License, Version 2.0 (the “License”); +# 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 # @@ -21,7 +21,7 @@ # # # Unless otherwise specified, all documentation contained herein is licensed -# under the Creative Commons License, Attribution 4.0 Intl. (the “License”); +# 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 # @@ -37,10 +37,21 @@ # # ECOMP is a trademark and service mark of AT&T Intellectual Property. # -from .helpers import validates + +''' +test_base_template_outputs_consumed +''' + from os import path, sep -import yaml + import pytest +import yaml + +from .helpers import validates + +VERSION = '1.0.0' + +# pylint: disable=invalid-name @validates('R-52753') @@ -56,11 +67,11 @@ def test_base_template_outputs_consumed(heat_templates): with open(heat_template) as fh: yml = yaml.load(fh) basename = path.splitext(heat_template)[0].rsplit(sep, 1)[1] - if (basename.endswith("_base") or - basename.startswith("base_") or - basename.find("_base_") > 0): - base_template = heat_template - base_template_yml = yml + if (basename.endswith("_base") + or basename.startswith("base_") + or basename.find("_base_") > 0): + base_template = heat_template + base_template_yml = yml # get the base template outputs if "outputs" not in base_template_yml: @@ -83,4 +94,6 @@ def test_base_template_outputs_consumed(heat_templates): parameters = yml["parameters"].keys() non_base_parameters.extend(parameters) - assert base_outputs <= set(non_base_parameters) + assert base_outputs <= set(non_base_parameters), ( + 'unconsumed outputs %s' % list( + base_outputs - set(non_base_parameters))) diff --git a/ice_validator/tests/test_cloud_config_resource_id.py b/ice_validator/tests/test_cloud_config_resource_id.py new file mode 100644 index 0000000..bd04e37 --- /dev/null +++ b/ice_validator/tests/test_cloud_config_resource_id.py @@ -0,0 +1,87 @@ +# -*- coding: utf8 -*- +# ============LICENSE_START==================================================== +# org.onap.vvp/validation-scripts +# =================================================================== +# Copyright © 2017 AT&T Intellectual Property. All rights reserved. +# =================================================================== +# +# Unless otherwise specified, all software contained herein is licensed +# under the Apache License, Version 2.0 (the "License"); +# you may not use this software except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# Unless otherwise specified, all documentation contained herein is licensed +# under the Creative Commons License, Attribution 4.0 Intl. (the "License"); +# you may not use this documentation except in compliance with the License. +# You may obtain a copy of the License at +# +# https://creativecommons.org/licenses/by/4.0/ +# +# Unless required by applicable law or agreed to in writing, documentation +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ============LICENSE_END============================================ +# +# ECOMP is a trademark and service mark of AT&T Intellectual Property. +# + +''' +A VNF's Heat Orchestration Template's Resource ``OS::Heat::CloudConfig`` +Resource ID **MUST** contain the ``{vm-type}``. +''' + +import pytest + +from .structures import Heat +from .helpers import validates +from .utils import vm_types + +VERSION = '1.0.0' + + +@validates('R-04747') +def test_cloud_config(heat_template): + '''validate resource ids + ''' + h = Heat(filepath=heat_template) + if not h.resources: + pytest.skip('No resources in this template') + + cloud_configs = get_cloud_configs(h) + if not cloud_configs: + pytest.skip('No CloudConfig resources in this template') + + resource_vm_types = vm_types.get_vm_types(h.resources) + if not resource_vm_types: + pytest.skip('No resources with {vm-type} in this template') + + bad = set() + for rid in cloud_configs: + for vm_type in resource_vm_types: + if vm_type in rid: + break + else: + bad.add(rid) + assert not bad, 'CloudConfigs %s have {vm-type} not in %s' % ( + list(bad), + list(resource_vm_types)) + + +def get_cloud_configs(heat): + """Return list of resource_id whose type is OS::Heat::CloudConfig. + """ + return [rid for rid, resource in heat.resources.items() + if heat.nested_get(resource, 'type') == 'OS::Heat::CloudConfig'] diff --git a/ice_validator/tests/test_env_and_yaml_same_name.py b/ice_validator/tests/test_env_and_yaml_same_name.py index 86270fd..865845a 100644 --- a/ice_validator/tests/test_env_and_yaml_same_name.py +++ b/ice_validator/tests/test_env_and_yaml_same_name.py @@ -1,12 +1,12 @@ # -*- coding: utf8 -*- -# ============LICENSE_START======================================================= +# ============LICENSE_START==================================================== # org.onap.vvp/validation-scripts # =================================================================== # Copyright © 2017 AT&T Intellectual Property. All rights reserved. # =================================================================== # # Unless otherwise specified, all software contained herein is licensed -# under the Apache License, Version 2.0 (the “License”); +# 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 # @@ -21,7 +21,7 @@ # # # Unless otherwise specified, all documentation contained herein is licensed -# under the Creative Commons License, Attribution 4.0 Intl. (the “License”); +# 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 # @@ -39,9 +39,13 @@ # from .helpers import validates +'''test_env_and_yaml_same_name +''' from os import listdir from os import path +VERSION = '1.0.0' + @validates('R-67205', 'R-35727', 'R-22656') def test_env_and_yaml_same_name(template_dir): @@ -55,7 +59,11 @@ def test_env_and_yaml_same_name(template_dir): if path.splitext(f)[-1] == ".env"] yaml_files = [f for f in files if path.splitext(f)[-1] in ['.yml', '.yaml']] + unmatched = [] for filename in env_files: basename = path.splitext(filename)[0] - assert basename + '.yaml' in yaml_files or \ - basename + '.yml' in yaml_files + if (basename + '.yaml' not in yaml_files + and basename + '.yml' not in yaml_files): + unmatched.append(filename) + assert not unmatched, ( + 'files with no corresponding .y[a]ml %s' % unmatched) diff --git a/ice_validator/tests/test_env_files_provided.py b/ice_validator/tests/test_env_files_provided.py index 285f200..d784d20 100644 --- a/ice_validator/tests/test_env_files_provided.py +++ b/ice_validator/tests/test_env_files_provided.py @@ -1,12 +1,12 @@ # -*- coding: utf8 -*- -# ============LICENSE_START======================================================= +# ============LICENSE_START==================================================== # org.onap.vvp/validation-scripts # =================================================================== # Copyright © 2017 AT&T Intellectual Property. All rights reserved. # =================================================================== # # Unless otherwise specified, all software contained herein is licensed -# under the Apache License, Version 2.0 (the “License”); +# 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 # @@ -21,7 +21,7 @@ # # # Unless otherwise specified, all documentation contained herein is licensed -# under the Creative Commons License, Attribution 4.0 Intl. (the “License”); +# 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 # @@ -38,9 +38,15 @@ # ECOMP is a trademark and service mark of AT&T Intellectual Property. # +''' +test_env_files_provided +''' + +VERSION = '1.0.0' + def test_env_files_provided(env_files): ''' Make sure environment files have been provided ''' - assert len(env_files) > 0 + assert len(env_files) > 0, '"*.env" not found' diff --git a/ice_validator/tests/test_environment_file_structure.py b/ice_validator/tests/test_environment_file_structure.py index 7213e3b..b50629e 100644 --- a/ice_validator/tests/test_environment_file_structure.py +++ b/ice_validator/tests/test_environment_file_structure.py @@ -1,12 +1,12 @@ # -*- coding: utf8 -*- -# ============LICENSE_START======================================================= +# ============LICENSE_START==================================================== # org.onap.vvp/validation-scripts # =================================================================== # Copyright © 2017 AT&T Intellectual Property. All rights reserved. # =================================================================== # # Unless otherwise specified, all software contained herein is licensed -# under the Apache License, Version 2.0 (the “License”); +# 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 # @@ -21,7 +21,7 @@ # # # Unless otherwise specified, all documentation contained herein is licensed -# under the Creative Commons License, Attribution 4.0 Intl. (the “License”); +# 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 # @@ -37,10 +37,19 @@ # # ECOMP is a trademark and service mark of AT&T Intellectual Property. # -from .helpers import validates + +""" environment file structure +""" + import yaml import pytest +from .helpers import validates + +VERSION = '1.0.0' + +# pylint: disable=invalid-name + def test_environment_structure(env_file): ''' @@ -51,7 +60,10 @@ def test_environment_structure(env_file): with open(env_file) as fh: yml = yaml.load(fh) - assert any(map(lambda v: v in yml, key_values)) + assert [k for k in key_values if k in yml], ( + '%s missing any of %s' % ( + env_file, + key_values)) @validates('R-03324') @@ -59,11 +71,12 @@ def test_environment_file_contains_required_sections(env_file): ''' Check that all environments files only have the allowed sections ''' - required_key_values = ["parameters"] + required_keys = ["parameters"] with open(env_file) as fh: yml = yaml.load(fh) - assert any(map(lambda v: v in yml, required_key_values)) + missing_keys = [v for v in required_keys if v not in yml] + assert not missing_keys, '%s missing %s' % (env_file, missing_keys) def test_environment_file_sections_have_the_right_format(env_file): @@ -71,29 +84,30 @@ def test_environment_file_sections_have_the_right_format(env_file): Check that all environment files have sections of the right format. Do note that it only tests for dicts or not dicts currently. ''' - key_values = ["parameters", "event_sinks", "encrypted_parameters", - "parameter_merge_strategies"] - key_values_not_dicts = ["event_sinks"] + dict_keys = [ + "parameters", + "encrypted_parameters", + "parameter_merge_strategies"] + not_dict_keys = [ + "event_sinks"] with open(env_file) as fh: yml = yaml.load(fh) - if not any(map(lambda v: v in yml, key_values)): + if not [k for k in dict_keys + not_dict_keys if k in yml]: pytest.skip('The fixture is not applicable for this test') - is_dict = 0 - should_be_dict = 0 - is_not_dict = 0 - should_not_be_dict = 0 - for key_value in key_values: - if key_value in yml: - if isinstance(yml[key_value], dict): - is_dict += 1 - if key_value not in key_values_not_dicts: - should_be_dict += 1 - elif not isinstance(yml[key_value], list): - is_not_dict += 1 - if key_value in key_values_not_dicts: - should_not_be_dict += 1 - assert (is_dict == should_be_dict and - is_not_dict == should_not_be_dict) + bad_dict_keys = [k for k in dict_keys + if k in yml + and not isinstance(yml[k], dict)] + bad_not_dict_keys = [k for k in not_dict_keys + if k in yml + and isinstance(yml[k], dict)] + errors = [] + if bad_dict_keys: + errors.append('must be dict %s' % bad_dict_keys) + if bad_not_dict_keys: + errors.append('must not be dict %s' % bad_not_dict_keys) + assert not errors, '%s errors:\n %s' % ( + env_file, + '\n '.join(errors)) diff --git a/ice_validator/tests/test_multipart_mime_resource_id.py b/ice_validator/tests/test_multipart_mime_resource_id.py new file mode 100644 index 0000000..58023a5 --- /dev/null +++ b/ice_validator/tests/test_multipart_mime_resource_id.py @@ -0,0 +1,87 @@ +# -*- coding: utf8 -*- +# ============LICENSE_START==================================================== +# org.onap.vvp/validation-scripts +# =================================================================== +# Copyright © 2017 AT&T Intellectual Property. All rights reserved. +# =================================================================== +# +# Unless otherwise specified, all software contained herein is licensed +# under the Apache License, Version 2.0 (the "License"); +# you may not use this software except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# Unless otherwise specified, all documentation contained herein is licensed +# under the Creative Commons License, Attribution 4.0 Intl. (the "License"); +# you may not use this documentation except in compliance with the License. +# You may obtain a copy of the License at +# +# https://creativecommons.org/licenses/by/4.0/ +# +# Unless required by applicable law or agreed to in writing, documentation +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ============LICENSE_END============================================ +# +# ECOMP is a trademark and service mark of AT&T Intellectual Property. +# + +''' +A VNF's Heat Orchestration Template's Resource ``OS::Heat::MultipartMime`` +Resource ID **MUST** contain the ``{vm-type}``. +''' + +import pytest + +from .structures import Heat +from .helpers import validates +from .utils import vm_types + +VERSION = '1.0.1' + + +@validates('R-30804') +def test_multipart_mime(heat_template): + '''validate resource ids + ''' + h = Heat(filepath=heat_template) + if not h.resources: + pytest.skip('No resources in this template') + + multipart_mimes = get_multipart_mimes(h) + if not multipart_mimes: + pytest.skip('No MultipartMime resources in this template') + + resource_vm_types = vm_types.get_vm_types(h.resources) + if not resource_vm_types: + pytest.skip('No resources with {vm-type} in this template') + + bad = set() + for rid in multipart_mimes: + for vm_type in resource_vm_types: + if vm_type in rid: + break + else: + bad.add(rid) + assert not bad, 'MultipartMime %s have {vm-type} not in %s' % ( + list(bad), + list(resource_vm_types)) + + +def get_multipart_mimes(heat): + """Return list of resource_id whose type is OS::Heat::MultipartMime. + """ + return [rid for rid, resource in heat.resources.items() + if heat.nested_get(resource, 'type') == 'OS::Heat::MultipartMime'] diff --git a/ice_validator/tests/test_nova_servers_index.py b/ice_validator/tests/test_nova_servers_index.py new file mode 100644 index 0000000..3ca99a0 --- /dev/null +++ b/ice_validator/tests/test_nova_servers_index.py @@ -0,0 +1,119 @@ +# -*- coding: utf8 -*- +# ============LICENSE_START==================================================== +# org.onap.vvp/validation-scripts +# =================================================================== +# Copyright © 2017 AT&T Intellectual Property. All rights reserved. +# =================================================================== +# +# Unless otherwise specified, all software contained herein is licensed +# under the Apache License, Version 2.0 (the "License"); +# you may not use this software except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# Unless otherwise specified, all documentation contained herein is licensed +# under the Creative Commons License, Attribution 4.0 Intl. (the "License"); +# you may not use this documentation except in compliance with the License. +# You may obtain a copy of the License at +# +# https://creativecommons.org/licenses/by/4.0/ +# +# Unless required by applicable law or agreed to in writing, documentation +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ============LICENSE_END============================================ +# +# ECOMP is a trademark and service mark of AT&T Intellectual Property. +# + +''' +Ensure that if a resource_id has an {index}, then all resources of +the same vm-type have an index, the indices are consecutive and start +with 0. +''' + +import collections +import re + +import pytest + +from .structures import Heat +from .helpers import validates +from .utils import vm_types + +VERSION = '1.1.0' + +RE_INDEXED_RESOURCE_ID = re.compile(r'\w+_(?P\d+)$') + + +@validates('R-11690') +def test_indices(heat_templates): + '''validate indices + ''' + indexed_resource_ids = {} + resources = {} + for heat_template in heat_templates: + h = Heat(filepath=heat_template) + if h.resources: + indexed_resource_ids.update(get_indexed_resource_ids(h.resources)) + resources.update(h.resources) + if not resources: + pytest.skip('No resources found') + + if not indexed_resource_ids: + pytest.skip('No resources with {index} found') + + types = get_types(resources, indexed_resource_ids) + if not types: + pytest.skip('No resources with {vm-type} found') + + indices = collections.defaultdict(list) + for resource_id, vm_type in types.items(): + indices[vm_type].append(indexed_resource_ids[resource_id]) + bad = {} + for vm_type, index_list in indices.items(): + for i in range(len(index_list)): + if i not in index_list: + bad[vm_type] = index_list + break + assert not bad, ( + 'vm-type indices must be consecutive, unique,' + ' and start at 0.\n %s' % ( + '\n '.join(['Resource ID %s: VM Type: %s' % (x, y) + for x, y in types.items() if y in bad]))) + + +def get_indexed_resource_ids(resources): + """Return dict. keys are resource_ids which end in an index. + values are the integer index parsed from the resource_id. + """ + indexed_resource_ids = {} + for resource in resources: + match = RE_INDEXED_RESOURCE_ID.match(resource) + if match: + indexed_resource_ids[resource] = int(match.groupdict()['index']) + return indexed_resource_ids + + +def get_types(resources, indexed_resource_ids): + """Return dict. keys are resource_ids from indexed_resource_ids. + values are the vm-type extracted from the resource. + """ + all_vm_types = {} + for rid in indexed_resource_ids: + x = vm_types.get_vm_types_for_resource(resources[rid]) + if x and len(x) == 1: + all_vm_types[rid] = list(x)[0] # x is a set. + return all_vm_types diff --git a/ice_validator/tests/test_vm_type_resource_id.py b/ice_validator/tests/test_vm_type_resource_id.py new file mode 100644 index 0000000..9a47656 --- /dev/null +++ b/ice_validator/tests/test_vm_type_resource_id.py @@ -0,0 +1,74 @@ +# -*- coding: utf8 -*- +# ============LICENSE_START==================================================== +# org.onap.vvp/validation-scripts +# =================================================================== +# Copyright © 2017 AT&T Intellectual Property. All rights reserved. +# =================================================================== +# +# Unless otherwise specified, all software contained herein is licensed +# under the Apache License, Version 2.0 (the "License"); +# you may not use this software except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# Unless otherwise specified, all documentation contained herein is licensed +# under the Creative Commons License, Attribution 4.0 Intl. (the "License"); +# you may not use this documentation except in compliance with the License. +# You may obtain a copy of the License at +# +# https://creativecommons.org/licenses/by/4.0/ +# +# Unless required by applicable law or agreed to in writing, documentation +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ============LICENSE_END============================================ +# +# ECOMP is a trademark and service mark of AT&T Intellectual Property. +# + +'''vm-type resource_id +''' + +import pytest + +from .structures import Heat +from .helpers import validates +from .utils import vm_types as utils_vm_types + +VERSION = '1.1.0' + + +@validates('R-46839') +def test_vm_type_resource_id(heat_template): + ''' + A VNF's Heat Orchestration Template's use of ``{vm-type}`` + in all Resource IDs **MUST** be the same case. + ''' + bad = {} + h = Heat(filepath=heat_template) + if not h.resources: + pytest.skip("No resources specified in the heat template") + vm_types = {v + '_': v.lower() + '_' + for v in utils_vm_types.get_vm_types(h.resources)} + if not vm_types: + pytest.skip("No {vm-type} specified in the heat template") + + for rid in h.resources: + lower_rid = rid.lower() + for vm_type, lower_vm_type in vm_types.items(): + if (lower_rid.startswith(lower_vm_type) + and not rid.startswith(vm_type)): + bad[rid] = vm_type + assert not bad, 'resource_id which do not match their vm-type %s' % bad diff --git a/ice_validator/tests/test_vm_type_syntax.py b/ice_validator/tests/test_vm_type_syntax.py new file mode 100644 index 0000000..b44118b --- /dev/null +++ b/ice_validator/tests/test_vm_type_syntax.py @@ -0,0 +1,74 @@ +# -*- coding: utf8 -*- +# ============LICENSE_START==================================================== +# org.onap.vvp/validation-scripts +# =================================================================== +# Copyright © 2017 AT&T Intellectual Property. All rights reserved. +# =================================================================== +# +# Unless otherwise specified, all software contained herein is licensed +# under the Apache License, Version 2.0 (the "License"); +# you may not use this software except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# Unless otherwise specified, all documentation contained herein is licensed +# under the Creative Commons License, Attribution 4.0 Intl. (the "License"); +# you may not use this documentation except in compliance with the License. +# You may obtain a copy of the License at +# +# https://creativecommons.org/licenses/by/4.0/ +# +# Unless required by applicable law or agreed to in writing, documentation +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ============LICENSE_END============================================ +# +# ECOMP is a trademark and service mark of AT&T Intellectual Property. +# + +'''vm-type syntax +''' + +import re + +import pytest + +from .structures import Heat +from .helpers import validates +from .utils import vm_types + +VERSION = '1.0.0' + +RE_VM_TYPE = re.compile(r'[\w\d_]+$') +RE_VM_TYPE_NG = re.compile(r'.*_int|_?int_.*$') + + +@validates('R-98407') +def test_vm_type_syntax(heat_template): + ''' + A VNF's Heat Orchestration Template's ``{vm-type}`` + **MUST** contain only + alphanumeric characters and/or underscores '_' and **MUST NOT** + contain any of the following strings: + ``_int`` or ``int_`` or ``_int_``. + ''' + v = Heat(filepath=heat_template) + if not v.resources: + pytest.skip("No resources") + t = set() + t.update(*[vm_types.get_vm_types_for_resource(r) + for r in v.resources.values()]) + bad = [x for x in t if not RE_VM_TYPE.match(x) or RE_VM_TYPE_NG.match(x)] + assert not bad, 'bad vm-types %s' % bad diff --git a/ice_validator/tests/utils/nested_dict.py b/ice_validator/tests/utils/nested_dict.py new file mode 100644 index 0000000..9bc3e99 --- /dev/null +++ b/ice_validator/tests/utils/nested_dict.py @@ -0,0 +1,64 @@ +# -*- coding: utf8 -*- +# ============LICENSE_START==================================================== +# org.onap.vvp/validation-scripts +# =================================================================== +# Copyright © 2017 AT&T Intellectual Property. All rights reserved. +# =================================================================== +# +# Unless otherwise specified, all software contained herein is licensed +# under the Apache License, Version 2.0 (the "License"); +# you may not use this software except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# Unless otherwise specified, all documentation contained herein is licensed +# under the Creative Commons License, Attribution 4.0 Intl. (the "License"); +# you may not use this documentation except in compliance with the License. +# You may obtain a copy of the License at +# +# https://creativecommons.org/licenses/by/4.0/ +# +# Unless required by applicable law or agreed to in writing, documentation +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ============LICENSE_END============================================ +# +# ECOMP is a trademark and service mark of AT&T Intellectual Property. +# + +'''nested_dict.get +''' + +VERSION = '1.0.0' + + +def get(dic, *keys): + '''Return the value of the last key given a (nested) dict + and list of keys. If any key is missing, or if the value + of any key except the last is not a dict, then None is returned. + ''' + d = dic + for key in keys: + if hasattr(d, 'get'): + d = d.get(key) + else: + return None + return d + + +def is_dict_has_key(obj, key): + '''return True/False `obj` is a dict and has `key` + ''' + return isinstance(obj, dict) and key in obj diff --git a/ice_validator/tests/utils/nested_files.py b/ice_validator/tests/utils/nested_files.py index e2c9ed3..39306eb 100644 --- a/ice_validator/tests/utils/nested_files.py +++ b/ice_validator/tests/utils/nested_files.py @@ -2,11 +2,11 @@ # ============LICENSE_START==================================================== # org.onap.vvp/validation-scripts # =================================================================== -# Copyright © 2017 AT&T Intellectual Property. All rights reserved. +# Copyright © 2017 AT&T Intellectual Property. All rights reserved. # =================================================================== # # Unless otherwise specified, all software contained herein is licensed -# under the Apache License, Version 2.0 (the “License”); +# 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 # @@ -21,7 +21,7 @@ # # # Unless otherwise specified, all documentation contained herein is licensed -# under the Creative Commons License, Attribution 4.0 Intl. (the License); +# 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 # diff --git a/ice_validator/tests/utils/nested_iterables.py b/ice_validator/tests/utils/nested_iterables.py index eea6e19..b6deaba 100644 --- a/ice_validator/tests/utils/nested_iterables.py +++ b/ice_validator/tests/utils/nested_iterables.py @@ -6,7 +6,7 @@ # =================================================================== # # Unless otherwise specified, all software contained herein is licensed -# under the Apache License, Version 2.0 (the “License”); +# 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 # @@ -21,7 +21,7 @@ # # # Unless otherwise specified, all documentation contained herein is licensed -# under the Creative Commons License, Attribution 4.0 Intl. (the “License”); +# 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 # diff --git a/ice_validator/tests/utils/network_roles.py b/ice_validator/tests/utils/network_roles.py index fbe6dce..3f8d6b8 100644 --- a/ice_validator/tests/utils/network_roles.py +++ b/ice_validator/tests/utils/network_roles.py @@ -6,7 +6,7 @@ # =================================================================== # # Unless otherwise specified, all software contained herein is licensed -# under the Apache License, Version 2.0 (the “License”); +# 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 # @@ -21,7 +21,7 @@ # # # Unless otherwise specified, all documentation contained herein is licensed -# under the Creative Commons License, Attribution 4.0 Intl. (the “License”); +# 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 # diff --git a/ice_validator/tests/utils/ports.py b/ice_validator/tests/utils/ports.py index 4d0b4ca..c9d4be9 100644 --- a/ice_validator/tests/utils/ports.py +++ b/ice_validator/tests/utils/ports.py @@ -6,7 +6,7 @@ # =================================================================== # # Unless otherwise specified, all software contained herein is licensed -# under the Apache License, Version 2.0 (the “License”); +# 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 # @@ -21,7 +21,7 @@ # # # Unless otherwise specified, all documentation contained herein is licensed -# under the Creative Commons License, Attribution 4.0 Intl. (the “License”); +# 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 # diff --git a/ice_validator/tests/utils/vm_types.py b/ice_validator/tests/utils/vm_types.py index 5bd447b..41da7d9 100644 --- a/ice_validator/tests/utils/vm_types.py +++ b/ice_validator/tests/utils/vm_types.py @@ -6,7 +6,7 @@ # =================================================================== # # Unless otherwise specified, all software contained herein is licensed -# under the Apache License, Version 2.0 (the “License”); +# 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 # @@ -21,7 +21,7 @@ # # # Unless otherwise specified, all documentation contained herein is licensed -# under the Creative Commons License, Attribution 4.0 Intl. (the “License”); +# 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 # diff --git a/ice_validator/tests/utils/volumes.py b/ice_validator/tests/utils/volumes.py old mode 100755 new mode 100644 index 7cdd147..c64c0ee --- a/ice_validator/tests/utils/volumes.py +++ b/ice_validator/tests/utils/volumes.py @@ -1,12 +1,12 @@ # -*- coding: utf8 -*- -# ============LICENSE_START======================================================= +# ============LICENSE_START==================================================== # org.onap.vvp/validation-scripts # =================================================================== # Copyright © 2017 AT&T Intellectual Property. All rights reserved. # =================================================================== # # Unless otherwise specified, all software contained herein is licensed -# under the Apache License, Version 2.0 (the “License”); +# 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 # @@ -21,7 +21,7 @@ # # # Unless otherwise specified, all documentation contained herein is licensed -# under the Creative Commons License, Attribution 4.0 Intl. (the “License”); +# 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 # @@ -38,6 +38,9 @@ # ECOMP is a trademark and service mark of AT&T Intellectual Property. # +"""volume resources +""" + from os import path import yaml diff --git a/ice_validator/tests/utils/yaml_custom_utils.py b/ice_validator/tests/utils/yaml_custom_utils.py index 0d292fe..8a5006c 100644 --- a/ice_validator/tests/utils/yaml_custom_utils.py +++ b/ice_validator/tests/utils/yaml_custom_utils.py @@ -6,7 +6,7 @@ # =================================================================== # # Unless otherwise specified, all software contained herein is licensed -# under the Apache License, Version 2.0 (the “License”); +# 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 # @@ -21,7 +21,7 @@ # # # Unless otherwise specified, all documentation contained herein is licensed -# under the Creative Commons License, Attribution 4.0 Intl. (the “License”); +# 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 # -- 2.16.6