diff --git a/nodepool/builder.py b/nodepool/builder.py index 2ffcb1d49..69138c58e 100755 --- a/nodepool/builder.py +++ b/nodepool/builder.py @@ -440,7 +440,7 @@ class CleanupWorker(BaseWorker): # (since this should be done regardless of the build # state). for provider in known_providers: - if not provider.driver.manage_images: + if not provider.manage_images: # This provider doesn't manage images continue try: @@ -469,7 +469,7 @@ class CleanupWorker(BaseWorker): continue for provider in known_providers: - if not provider.driver.manage_images: + if not provider.manage_images: # This provider doesn't manage images continue try: @@ -975,7 +975,7 @@ class UploadWorker(BaseWorker): to providers, do the upload if they are available on the local disk. ''' for provider in self._config.providers.values(): - if not provider.driver.manage_images: + if not provider.manage_images: continue for image in provider.diskimages.values(): uploaded = False diff --git a/nodepool/driver/__init__.py b/nodepool/driver/__init__.py index bb3b7f922..79c581058 100644 --- a/nodepool/driver/__init__.py +++ b/nodepool/driver/__init__.py @@ -207,7 +207,7 @@ class NodeRequestHandler(object, metaclass=abc.ABCMeta): :returns: True if it is available, False otherwise. ''' - if self.provider.driver.manage_images: + if self.provider.manage_images: for label in self.request.node_types: if self.pool.labels[label].cloud_image: if not self.manager.labelReady(self.pool.labels[label]): @@ -715,7 +715,6 @@ class ProviderConfig(ConfigValue, metaclass=abc.ABCMeta): self.driver = Driver() self.driver.name = provider.get('driver', 'openstack') self.max_concurrency = provider.get('max-concurrency', -1) - self.driver.manage_images = False def __repr__(self): return "" % self.name @@ -728,6 +727,14 @@ class ProviderConfig(ConfigValue, metaclass=abc.ABCMeta): ''' pass + @property + @abc.abstractmethod + def manage_images(self): + ''' + Return True if provider manages external images, False otherwise. + ''' + pass + @abc.abstractmethod def __eq__(self, other): pass diff --git a/nodepool/driver/openstack/config.py b/nodepool/driver/openstack/config.py index e8c927f00..20e55d74d 100644 --- a/nodepool/driver/openstack/config.py +++ b/nodepool/driver/openstack/config.py @@ -107,6 +107,10 @@ class OpenStackProviderConfig(ProviderConfig): def pools(self): return self.__pools + @property + def manage_images(self): + return True + @staticmethod def reset(): OpenStackProviderConfig.os_client_config = None @@ -119,7 +123,6 @@ class OpenStackProviderConfig(ProviderConfig): self.cloud_config = self.os_client_config.get_one_cloud(**cloud_kwargs) self.image_type = self.cloud_config.config['image_format'] - self.driver.manage_images = True self.region_name = self.provider.get('region-name') self.rate = float(self.provider.get('rate', 1.0)) self.boot_timeout = self.provider.get('boot-timeout', 60) diff --git a/nodepool/driver/static/config.py b/nodepool/driver/static/config.py index f4e527a37..ca6463f4a 100644 --- a/nodepool/driver/static/config.py +++ b/nodepool/driver/static/config.py @@ -50,6 +50,10 @@ class StaticProviderConfig(ProviderConfig): def pools(self): return self.__pools + @property + def manage_images(self): + return False + def load(self, config): for pool in self.provider.get('pools', []): pp = StaticPool() diff --git a/nodepool/launcher.py b/nodepool/launcher.py index 4d4bc6455..048ffba41 100755 --- a/nodepool/launcher.py +++ b/nodepool/launcher.py @@ -882,7 +882,7 @@ class NodePool(threading.Thread): ready in at least one provider. False otherwise. ''' for pool in label.pools: - if not pool.provider.driver.manage_images: + if not pool.provider.manage_images: # Provider doesn't manage images, assuming label is ready return True for pool_label in pool.labels.values(): diff --git a/nodepool/tests/fixtures/drivers/test/config.py b/nodepool/tests/fixtures/drivers/test/config.py index a67ca1b94..f9651a494 100644 --- a/nodepool/tests/fixtures/drivers/test/config.py +++ b/nodepool/tests/fixtures/drivers/test/config.py @@ -39,6 +39,10 @@ class TestConfig(ProviderConfig): def pools(self): return self.__pools + @property + def manage_images(self): + return False + def load(self, newconfig): self.labels = set() for pool in self.provider.get('pools', []):