]> git-server-git.apps.pok.os.sepia.ceph.com Git - teuthology.git/commitdiff
libcloud: add allow_sizes and allow_networks 1270/head
authorKyr Shatskyy <kyrylo.shatskyy@gmail.com>
Wed, 27 Mar 2019 16:01:58 +0000 (17:01 +0100)
committerKyr Shatskyy <kyrylo.shatskyy@gmail.com>
Thu, 28 Mar 2019 16:04:08 +0000 (17:04 +0100)
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 <kyrylo.shatskyy@gmail.com>
teuthology/provision/cloud/openstack.py
teuthology/provision/cloud/test/test_openstack.py

index 7653c72b7d568c51f0fc56c8ab5e3f205cfc367c..9e3ca77765f4da4671efc7b8564fdbceefa02459 100644 (file)
@@ -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()
index 7eead8adbca6018b7d0b7e449413b5b744fc0a84..81e0220d9aa73a91a0ab93f59f6490edefcb82f5 100644 (file)
@@ -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')