diff --git a/devstack/plugin.sh b/devstack/plugin.sh index a1de6a4a8..80c6cffa5 100644 --- a/devstack/plugin.sh +++ b/devstack/plugin.sh @@ -172,30 +172,15 @@ cron: labels: - name: centos-7 - image: centos-7 min-ready: 1 - providers: - - name: devstack - name: fedora-25 - image: fedora-25 min-ready: 1 - providers: - - name: devstack - name: ubuntu-precise - image: ubuntu-precise min-ready: 1 - providers: - - name: devstack - name: ubuntu-trusty - image: ubuntu-trusty min-ready: 1 - providers: - - name: devstack - name: ubuntu-xenial - image: ubuntu-xenial min-ready: 1 - providers: - - name: devstack providers: - name: devstack @@ -205,29 +190,42 @@ providers: # Long boot timeout to deal with potentially nested virt. boot-timeout: 600 launch-timeout: 900 - max-servers: 5 rate: 0.25 - images: + diskimages: - name: centos-7 - min-ram: 1024 - name-filter: 'nodepool' config-drive: true - name: fedora-25 - min-ram: 1024 - name-filter: 'nodepool' config-drive: true - name: ubuntu-precise - min-ram: 512 - name-filter: 'nodepool' config-drive: true - name: ubuntu-trusty - min-ram: 512 - name-filter: 'nodepool' config-drive: true - name: ubuntu-xenial - min-ram: 512 - name-filter: 'nodepool' config-drive: true + pools: + - name: main + max-servers: 5 + labels: + - name: centos-7 + diskimage: centos-7 + min-ram: 1024 + name-filter: 'nodepool' + - name: fedora-25 + diskimage: fedora-25 + min-ram: 1024 + name-filter: 'nodepool' + - name: ubuntu-precise + diskimage: ubuntu-precise + min-ram: 512 + name-filter: 'nodepool' + - name: ubuntu-trusty + diskimage: ubuntu-trusty + min-ram: 512 + name-filter: 'nodepool' + - name: ubuntu-xenial + diskimage: ubuntu-xenial + min-ram: 512 + name-filter: 'nodepool' diskimages: - name: centos-7 diff --git a/nodepool/builder.py b/nodepool/builder.py index a1802b4a2..4fa99a300 100644 --- a/nodepool/builder.py +++ b/nodepool/builder.py @@ -271,7 +271,7 @@ class CleanupWorker(BaseWorker): self._deleteUpload(upload) def _cleanupObsoleteProviderUploads(self, provider, image, build_id): - image_names_for_provider = provider.images.keys() + image_names_for_provider = provider.diskimages.keys() if image in image_names_for_provider: # This image is in use for this provider return @@ -849,7 +849,7 @@ class UploadWorker(BaseWorker): (build_id, filename, provider.name)) manager = self._config.provider_managers[provider.name] - provider_image = provider.images.get(image_name) + provider_image = provider.diskimages.get(image_name) if provider_image is None: raise exceptions.BuilderInvalidCommandError( "Could not find matching provider image for %s" % image_name @@ -899,7 +899,7 @@ class UploadWorker(BaseWorker): to providers, do the upload if they are available on the local disk. ''' for provider in self._config.providers.values(): - for image in provider.images.values(): + for image in provider.diskimages.values(): uploaded = False # Check if we've been told to shutdown @@ -931,7 +931,7 @@ class UploadWorker(BaseWorker): :returns: True if an upload was attempted, False otherwise. ''' # Check if image uploads are paused. - if provider.images.get(image.name).pause: + if provider.diskimages.get(image.name).pause: return False # Search for the most recent 'ready' image build diff --git a/nodepool/cmd/config_validator.py b/nodepool/cmd/config_validator.py index f9cb9c565..c9ecfc004 100644 --- a/nodepool/cmd/config_validator.py +++ b/nodepool/cmd/config_validator.py @@ -29,16 +29,6 @@ class ConfigValidator: 'cleanup': str, } - images = { - 'name': str, - 'pause': bool, - 'min-ram': int, - 'name-filter': str, - 'diskimage': str, - 'meta': dict, - 'config-drive': bool, - } - old_network = { 'net-id': str, 'net-label': str, @@ -49,38 +39,53 @@ class ConfigValidator: 'public': bool, # Ignored, but kept for backwards compat } - providers = { + pool_label = { + v.Required('name'): str, + v.Required('diskimage'): str, + 'min-ram': int, + 'name-filter': str, + } + + pool = { + 'name': str, + 'networks': [v.Any(old_network, network)], + 'max-servers': int, + 'labels': [pool_label], + 'availability-zones': [str], + } + + provider_diskimage = { + 'name': str, + 'pause': bool, + 'meta': dict, + 'config-drive': bool, + } + + provider = { 'name': str, 'region-name': str, - 'availability-zones': [str], 'cloud': str, - 'max-servers': int, 'max-concurrency': int, - 'pool': str, # Ignored, but kept for backwards compat 'image-type': str, - 'networks': [v.Any(old_network, network)], 'ipv6-preferred': bool, 'boot-timeout': int, 'api-timeout': int, 'launch-timeout': int, 'launch-retries': int, 'rate': float, - 'images': [images], 'hostname-format': str, 'image-name-format': str, 'clean-floating-ips': bool, + 'pools': [pool], + 'diskimages': [provider_diskimage], } - labels = { + label = { 'name': str, - 'image': str, 'min-ready': int, - 'providers': [{ - 'name': str, - }], } - diskimages = { + diskimage = { 'name': str, 'pause': bool, 'elements': [str], @@ -99,9 +104,9 @@ class ConfigValidator: 'chroot': str, }], 'cron': cron, - 'providers': [providers], - 'labels': [labels], - 'diskimages': [diskimages], + 'providers': [provider], + 'labels': [label], + 'diskimages': [diskimage], } log.info("validating %s" % self.config_file) @@ -110,12 +115,3 @@ class ConfigValidator: # validate the overall schema schema = v.Schema(top_level) schema(config) - - # labels must list valid providers - all_providers = [p['name'] for p in config['providers']] - for label in config['labels']: - for provider in label['providers']: - if not provider['name'] in all_providers: - raise AssertionError('label %s requests ' - 'non-existent provider %s' - % (label['name'], provider['name'])) diff --git a/nodepool/cmd/nodepoolcmd.py b/nodepool/cmd/nodepoolcmd.py index 608a9358a..d11c8aa22 100644 --- a/nodepool/cmd/nodepoolcmd.py +++ b/nodepool/cmd/nodepoolcmd.py @@ -221,7 +221,7 @@ class NodePoolCmd(NodepoolApp): alien_ids = [] uploads = [] - for image in provider.images: + for image in provider.diskimages: # Build list of provider images as recorded in ZK for bnum in self.zk.getBuildNumbers(image): uploads.extend( diff --git a/nodepool/config.py b/nodepool/config.py index 6abf49765..1c53bc0a9 100644 --- a/nodepool/config.py +++ b/nodepool/config.py @@ -40,31 +40,18 @@ class Config(ConfigValue): class Provider(ConfigValue): def __eq__(self, other): if (other.cloud_config != self.cloud_config or - other.max_servers != self.max_servers or - other.pool != self.pool or + other.pools != self.pools or other.image_type != self.image_type or other.rate != self.rate or other.api_timeout != self.api_timeout or other.boot_timeout != self.boot_timeout or other.launch_timeout != self.launch_timeout or - other.networks != self.networks or other.ipv6_preferred != self.ipv6_preferred or other.clean_floating_ips != self.clean_floating_ips or other.max_concurrency != self.max_concurrency or - other.azs != self.azs): + other.diskimages != self.diskimages): return False - new_images = other.images - old_images = self.images - # Check if images have been added or removed - if set(new_images.keys()) != set(old_images.keys()): - return False - # check if existing images have been updated - for k in new_images: - if (new_images[k].min_ram != old_images[k].min_ram or - new_images[k].name_filter != old_images[k].name_filter or - new_images[k].meta != old_images[k].meta or - new_images[k].config_drive != old_images[k].config_drive): - return False + return True def __ne__(self, other): @@ -74,9 +61,25 @@ class Provider(ConfigValue): return "" % self.name -class ProviderImage(ConfigValue): +class ProviderPool(ConfigValue): + def __eq__(self, other): + if (other.labels != self.labels or + other.max_servers != self.max_servers or + other.azs != self.azs or + other.networks != self.networks): + return False + return True + + def __ne__(self, other): + return not self.__eq__(other) + def __repr__(self): - return "" % self.name + return "" % self.name + + +class ProviderDiskImage(ConfigValue): + def __repr__(self): + return "" % self.name class Label(ConfigValue): @@ -84,9 +87,19 @@ class Label(ConfigValue): return "