From ff351b69d2f85da9d9e158638ae04a849aa1764e Mon Sep 17 00:00:00 2001 From: Federico Ressi Date: Mon, 25 Oct 2021 09:31:41 +0200 Subject: [PATCH] Use safe loader/dumper to load/dump YAMLs things This also prevent Octavia job from voting Change-Id: Ia2eb26d3b304c6a3858975365f5b738f43ec1c5c --- tobiko/__init__.py | 4 ++++ tobiko/common/_detail.py | 5 ++-- tobiko/common/_yaml.py | 24 +++++++++++++++++++ tobiko/openstack/heat/_template.py | 3 +-- tobiko/openstack/keystone/_clouds_file.py | 3 +-- tobiko/openstack/keystone/_credentials.py | 9 ++++--- tobiko/openstack/nova/_cloud_init.py | 5 ++-- tobiko/openstack/stacks/_ubuntu.py | 4 +--- .../functional/openstack/test_keystone.py | 3 +-- .../tests/functional/tripleo/test_ansible.py | 4 ++-- .../tests/unit/openstack/heat/test_stack.py | 3 +-- .../unit/openstack/heat/test_template.py | 3 +-- .../openstack/keystone/test_clouds_file.py | 4 +--- .../unit/openstack/nova/test_cloud_init.py | 4 ++-- tobiko/tripleo/_ansible.py | 4 +--- zuul.d/project.yaml | 4 +++- 16 files changed, 52 insertions(+), 34 deletions(-) create mode 100644 tobiko/common/_yaml.py diff --git a/tobiko/__init__.py b/tobiko/__init__.py index fc7dd6220..21d58388f 100644 --- a/tobiko/__init__.py +++ b/tobiko/__init__.py @@ -34,6 +34,7 @@ from tobiko.common import _skip from tobiko.common import _testcase from tobiko.common import _time from tobiko.common import _utils +from tobiko.common import _yaml TOBIKO_PACKAGE_DIR = os.path.dirname(os.path.realpath(__file__)) @@ -147,5 +148,8 @@ true_seconds = _time.true_seconds get_short_hostname = _utils.get_short_hostname +dump_yaml = _yaml.dump_yaml +load_yaml = _yaml.load_yaml + from tobiko import config # noqa config.init_config() diff --git a/tobiko/common/_detail.py b/tobiko/common/_detail.py index 7afe564d6..2962fc34d 100644 --- a/tobiko/common/_detail.py +++ b/tobiko/common/_detail.py @@ -21,7 +21,8 @@ from oslo_log import log import six import testtools from testtools import content -import yaml + +from tobiko.common import _yaml LOG = log.getLogger(__name__) @@ -120,7 +121,7 @@ def get_yaml_to_get_bytes(get_yaml): def get_text(): obj = get_yaml() - yield yaml.dump(obj).encode(errors='ignore') + yield _yaml.dump_yaml(obj).encode(errors='ignore') return get_text diff --git a/tobiko/common/_yaml.py b/tobiko/common/_yaml.py new file mode 100644 index 000000000..ba9782db2 --- /dev/null +++ b/tobiko/common/_yaml.py @@ -0,0 +1,24 @@ +# Copyright 2021 Red Hat +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file 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. +from __future__ import absolute_import + +import yaml + + +def load_yaml(stream): + return yaml.safe_load(stream) + + +def dump_yaml(data, stream=None, **kwargs): + return yaml.safe_dump(data, stream=stream, **kwargs) diff --git a/tobiko/openstack/heat/_template.py b/tobiko/openstack/heat/_template.py index 5b7a9f61d..868a7c675 100644 --- a/tobiko/openstack/heat/_template.py +++ b/tobiko/openstack/heat/_template.py @@ -19,7 +19,6 @@ import sys import typing from heatclient.common import template_utils -import yaml import tobiko @@ -52,7 +51,7 @@ class HeatTemplateFixture(tobiko.SharedFixture): tobiko.check_valid_type(self.outputs, collections.Mapping) tobiko.check_valid_type(self.parameters, collections.Mapping) tobiko.check_valid_type(self.resources, collections.Mapping) - self.template_yaml = yaml.safe_dump(self.template) + self.template_yaml = tobiko.dump_yaml(self.template) @property def outputs(self) -> typing.Dict[str, typing.Any]: diff --git a/tobiko/openstack/keystone/_clouds_file.py b/tobiko/openstack/keystone/_clouds_file.py index f1defbaf1..98ceb0913 100644 --- a/tobiko/openstack/keystone/_clouds_file.py +++ b/tobiko/openstack/keystone/_clouds_file.py @@ -17,7 +17,6 @@ import json import os from oslo_log import log -import yaml import tobiko from tobiko.openstack.keystone import _credentials @@ -181,7 +180,7 @@ class CloudsFileKeystoneCredentialsFixture( clouds_content = json.load(f) else: LOG.debug('Load YAML clouds file: %r', clouds_file) - clouds_content = yaml.safe_load(f) + clouds_content = tobiko.load_yaml(f) LOG.debug('Clouds file content loaded from %r:\n%s', clouds_file, json.dumps(clouds_content, indent=4, diff --git a/tobiko/openstack/keystone/_credentials.py b/tobiko/openstack/keystone/_credentials.py index c94fde0a5..ad9db5142 100644 --- a/tobiko/openstack/keystone/_credentials.py +++ b/tobiko/openstack/keystone/_credentials.py @@ -20,7 +20,6 @@ import typing # noqa from oslo_log import log import testtools -import yaml import tobiko @@ -345,7 +344,7 @@ def api_version_from_url(auth_url) -> typing.Optional[int]: def print_credentials(): credentials = default_keystone_credentials() - yaml.dump(dict(credentials.to_dict()), - sys.stdout, - indent=4, - sort_keys=True) + tobiko.dump_yaml(dict(credentials.to_dict()), + sys.stdout, + indent=4, + sort_keys=True) diff --git a/tobiko/openstack/nova/_cloud_init.py b/tobiko/openstack/nova/_cloud_init.py index 110c0ebbc..fdc54e3bd 100644 --- a/tobiko/openstack/nova/_cloud_init.py +++ b/tobiko/openstack/nova/_cloud_init.py @@ -18,7 +18,6 @@ import contextlib import typing from oslo_log import log -import yaml import tobiko from tobiko.shell import sh @@ -81,7 +80,7 @@ class CloudConfig(dict): @property def user_data(self): - return '#cloud-config\n' + yaml.dump(dict(self)) + return '#cloud-config\n' + tobiko.dump_yaml(dict(self)) def __add__(self, other): return combine_cloud_configs([self, other]) @@ -164,7 +163,7 @@ def get_cloud_init_status( else: raise - status = yaml.load(output) + status = tobiko.load_yaml(output) tobiko.check_valid_type(status, dict) tobiko.check_valid_type(status['status'], str) return status['status'] diff --git a/tobiko/openstack/stacks/_ubuntu.py b/tobiko/openstack/stacks/_ubuntu.py index 73330e367..8c101f856 100644 --- a/tobiko/openstack/stacks/_ubuntu.py +++ b/tobiko/openstack/stacks/_ubuntu.py @@ -15,8 +15,6 @@ from __future__ import absolute_import import typing -import yaml - import tobiko from tobiko import config from tobiko.openstack import glance @@ -148,7 +146,7 @@ class UbuntuImageFixture(UbuntuMinimalImageFixture, @property def write_files(self) -> typing.Dict[str, str]: write_files = super().write_files - write_files['/etc/netplan/75-tobiko-vlan.yaml'] = yaml.dump( + write_files['/etc/netplan/75-tobiko-vlan.yaml'] = tobiko.dump_yaml( self.vlan_config) return write_files diff --git a/tobiko/tests/functional/openstack/test_keystone.py b/tobiko/tests/functional/openstack/test_keystone.py index 0161e4fd5..cef82c6ff 100644 --- a/tobiko/tests/functional/openstack/test_keystone.py +++ b/tobiko/tests/functional/openstack/test_keystone.py @@ -19,7 +19,6 @@ from keystoneclient.v2_0 import client as v2_client from keystoneclient.v3 import client as v3_client from oslo_log import log import testtools -import yaml import tobiko from tobiko.openstack import keystone @@ -36,7 +35,7 @@ class TobikoKeystoneCredentialsCommandTest(testtools.TestCase): def test_execute(self): with sh.local_process('tobiko-keystone-credentials') as process: - actual = yaml.full_load(process.stdout) + actual = tobiko.load_yaml(process.stdout) process.check_exit_status() expected = keystone.default_keystone_credentials().to_dict() self.assertEqual(expected, actual) diff --git a/tobiko/tests/functional/tripleo/test_ansible.py b/tobiko/tests/functional/tripleo/test_ansible.py index e16437048..966e17d75 100644 --- a/tobiko/tests/functional/tripleo/test_ansible.py +++ b/tobiko/tests/functional/tripleo/test_ansible.py @@ -16,8 +16,8 @@ from __future__ import absolute_import import os import testtools -import yaml +import tobiko from tobiko import config from tobiko import tripleo @@ -50,7 +50,7 @@ class InventoryFileTest(testtools.TestCase): inventory_yaml = tripleo.read_tripleo_ansible_inventory() self.assertIsInstance(inventory_yaml, str) self.assertTrue(inventory_yaml) - inventory = yaml.safe_load(inventory_yaml) + inventory = tobiko.load_yaml(inventory_yaml) self.assertIn('Undercloud', inventory) self.assertIn('Controller', inventory) self.assertIn('Compute', inventory) diff --git a/tobiko/tests/unit/openstack/heat/test_stack.py b/tobiko/tests/unit/openstack/heat/test_stack.py index 1cfbfaf25..b11ed7111 100644 --- a/tobiko/tests/unit/openstack/heat/test_stack.py +++ b/tobiko/tests/unit/openstack/heat/test_stack.py @@ -19,7 +19,6 @@ import time from heatclient.v1 import client as heatclient from heatclient import exc import mock -import yaml import tobiko from tobiko.openstack import heat @@ -156,7 +155,7 @@ class HeatStackFixtureTest(openstack.OpenstackTest): if call_create: client.stacks.create.assert_called_once_with( parameters=parameters, stack_name=stack.stack_name, - template=yaml.safe_dump(stack.template.template)) + template=tobiko.dump_yaml(stack.template.template)) else: client.stacks.create.assert_not_called() diff --git a/tobiko/tests/unit/openstack/heat/test_template.py b/tobiko/tests/unit/openstack/heat/test_template.py index 7b22dacf4..a7b913733 100644 --- a/tobiko/tests/unit/openstack/heat/test_template.py +++ b/tobiko/tests/unit/openstack/heat/test_template.py @@ -16,7 +16,6 @@ from __future__ import absolute_import import os from heatclient.common import template_utils -import yaml import tobiko from tobiko.openstack import heat @@ -44,5 +43,5 @@ class HeatTemplateFileTest(openstack.OpenstackTest): template_file)) self.assertEqual(template_dict, template.template) self.assertEqual(template_files, template.template_files) - template_yaml = yaml.safe_dump(template_dict) + template_yaml = tobiko.dump_yaml(template_dict) self.assertEqual(template_yaml, template.template_yaml) diff --git a/tobiko/tests/unit/openstack/keystone/test_clouds_file.py b/tobiko/tests/unit/openstack/keystone/test_clouds_file.py index 596dadeda..db0299bcc 100644 --- a/tobiko/tests/unit/openstack/keystone/test_clouds_file.py +++ b/tobiko/tests/unit/openstack/keystone/test_clouds_file.py @@ -19,8 +19,6 @@ import os import tempfile import typing # noqa -import yaml - import tobiko from tobiko.openstack import keystone from tobiko.openstack.keystone import _clouds_file @@ -87,7 +85,7 @@ class CloudsFileFixture(tobiko.SharedFixture): if self.suffix in _clouds_file.JSON_SUFFIXES: json.dump(clouds_content, clouds_stream) elif self.suffix in _clouds_file.YAML_SUFFIXES: - yaml.safe_dump(clouds_content, clouds_stream) + tobiko.dump_yaml(clouds_content, clouds_stream) finally: clouds_stream.close() diff --git a/tobiko/tests/unit/openstack/nova/test_cloud_init.py b/tobiko/tests/unit/openstack/nova/test_cloud_init.py index 64c93b128..dcba5bf88 100644 --- a/tobiko/tests/unit/openstack/nova/test_cloud_init.py +++ b/tobiko/tests/unit/openstack/nova/test_cloud_init.py @@ -14,8 +14,8 @@ from __future__ import absolute_import import testtools -import yaml +import tobiko from tobiko.openstack import nova @@ -38,7 +38,7 @@ class TestUserData(testtools.TestCase): def assert_equal_cloud_config(self, expected, actual): self.assertTrue(actual.startswith('#cloud-config')) - self.assertEqual(expected, yaml.load(actual)) + self.assertEqual(expected, tobiko.load_yaml(actual)) class TestCloudConfig(testtools.TestCase): diff --git a/tobiko/tripleo/_ansible.py b/tobiko/tripleo/_ansible.py index ebf1d9357..218feec49 100644 --- a/tobiko/tripleo/_ansible.py +++ b/tobiko/tripleo/_ansible.py @@ -16,8 +16,6 @@ from __future__ import absolute_import import io import os -import yaml - import tobiko from tobiko.shell import sh from tobiko.tripleo import _undercloud @@ -27,7 +25,7 @@ from tobiko.tripleo import _config def get_tripleo_ansible_inventory(): inventory_file = get_tripleo_ansible_inventory_file() with io.open(inventory_file, 'rb') as fd: - return yaml.safe_load(fd) + return tobiko.load_yaml(fd) def has_tripleo_ansible_inventory(): diff --git a/zuul.d/project.yaml b/zuul.d/project.yaml index 2654f4691..b118f9758 100644 --- a/zuul.d/project.yaml +++ b/zuul.d/project.yaml @@ -8,7 +8,7 @@ - devstack-tobiko-ceph - devstack-tobiko-heat - devstack-tobiko-minimal - - devstack-tobiko-octavia + # - devstack-tobiko-octavia - devstack-tobiko-neutron - devstack-tobiko-nova - devstack-tobiko-ovs @@ -27,6 +27,8 @@ voting: false periodic: jobs: + - devstack-tobiko-octavia: + voting: false - tobiko-infrared - tobiko-infrared-centos-7 - tobiko-infrared-fedora