From 631e2d161afb3f1f87c1cd1c4dfae433a0fc59a7 Mon Sep 17 00:00:00 2001 From: Kyr Shatskyy Date: Wed, 27 Mar 2019 17:01:58 +0100 Subject: [PATCH] libcloud: add allow_sizes and allow_networks In order to simplify selection of flavors and networks there is added support for allow_sizes and allow_networks records for each provider configuration. Both supports either single regular expression or a list of regular expressions. Also exclude_sizes supports lists now as well. Signed-off-by: Kyr Shatskyy --- teuthology/provision/cloud/openstack.py | 33 +++++++++++++++---- .../provision/cloud/test/test_openstack.py | 5 +-- 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/teuthology/provision/cloud/openstack.py b/teuthology/provision/cloud/openstack.py index 7653c72b7d..9e3ca77765 100644 --- a/teuthology/provision/cloud/openstack.py +++ b/teuthology/provision/cloud/openstack.py @@ -83,22 +83,41 @@ class OpenStackProvider(Provider): @property def sizes(self): if not hasattr(self, '_sizes'): + allow_sizes = self.conf.get('allow_sizes', '.*') + if isinstance(allow_sizes, basestring): + allow_sizes = [allow_sizes] + allow_re = [re.compile(x) for x in allow_sizes] # By default, exclude instance types meant for Windows exclude_sizes = self.conf.get('exclude_sizes', 'win-.*') + if isinstance(exclude_sizes, basestring): + exclude_sizes = [exclude_sizes] + exclude_re = [re.compile(x) for x in exclude_sizes] sizes = retry(self.driver.list_sizes) - if exclude_sizes: - sizes = filter( - lambda s: not re.match(exclude_sizes, s.name), - sizes - ) - self._sizes = sizes + self._sizes = filter( + lambda s: + any(x.match(s.name) for x in allow_re) + and not + all(x.match(s.name) for x in exclude_re), + sizes + ) return self._sizes @property def networks(self): if not hasattr(self, '_networks'): + allow_networks = self.conf.get('allow_networks', '.*') + if isinstance(allow_networks, basestring): + allow_networks=[allow_networks] + networks_re = [re.compile(x) for x in allow_networks] try: - self._networks = retry(self.driver.ex_list_networks) + networks = retry(self.driver.ex_list_networks) + if networks: + self._networks = filter( + lambda s: any(x.match(s.name) for x in networks_re), + networks + ) + else: + self._networks = list() except AttributeError: log.warn("Unable to list networks for %s", self.driver) self._networks = list() diff --git a/teuthology/provision/cloud/test/test_openstack.py b/teuthology/provision/cloud/test/test_openstack.py index 7eead8adbc..81e0220d9a 100644 --- a/teuthology/provision/cloud/test/test_openstack.py +++ b/teuthology/provision/cloud/test/test_openstack.py @@ -185,9 +185,10 @@ class TestOpenStackProvider(TestOpenStackBase): def test_networks(self): obj = cloud.get_provider('my_provider') - self.mocks['m_ex_list_networks'].return_value = ['net0', 'net1'] + nets = [get_fake_obj(attributes=dict(name=i)) for i in ['net0', 'net1']] + self.mocks['m_ex_list_networks'].return_value = nets assert not hasattr(obj, '_networks') - assert obj.networks == ['net0', 'net1'] + assert [i.name for i in obj.networks] == [i.name for i in nets] assert hasattr(obj, '_networks') self.mocks['m_ex_list_networks'].side_effect = AttributeError obj = cloud.get_provider('my_provider') -- 2.39.5