summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRick Harris <rconradharris@gmail.com>2013-05-20 18:14:24 +0000
committerRick Harris <rconradharris@gmail.com>2013-05-22 17:19:45 +0000
commit350ff35508630506c8bb9a6a93bb283c819c14ff (patch)
tree543ee335e802b58d9d43cdc023f9e14e7719db54
parent05be719ec76adf60a151b56d695c59fd832cb22b (diff)
downloadnova-350ff35508630506c8bb9a6a93bb283c819c14ff.tar.gz
nova-350ff35508630506c8bb9a6a93bb283c819c14ff.tar.xz
nova-350ff35508630506c8bb9a6a93bb283c819c14ff.zip
Share checks between create and rebuild
DRYs up the checks between create and rebuild in preparation for additional checks going in. Change-Id: I04a8448f7a3a4e1176b40f943ea9c90c06ba8ece
-rw-r--r--nova/compute/api.py73
1 files changed, 42 insertions, 31 deletions
diff --git a/nova/compute/api.py b/nova/compute/api.py
index 24d73ec0d..12c1cf579 100644
--- a/nova/compute/api.py
+++ b/nova/compute/api.py
@@ -496,6 +496,32 @@ class API(base.Base):
cd_image_service.show(context, config_drive_id)
return config_drive_id, None
+ def _check_requested_image(self, context, image_id, image, instance_type):
+ if not image:
+ # Image checks don't apply when building from volume
+ return
+ if image['status'] != 'active':
+ raise exception.ImageNotActive(image_id=image_id)
+ if instance_type['memory_mb'] < int(image.get('min_ram') or 0):
+ raise exception.InstanceTypeMemoryTooSmall()
+ if instance_type['root_gb'] < int(image.get('min_disk') or 0):
+ raise exception.InstanceTypeDiskTooSmall()
+
+ def _get_image(self, context, image_href):
+ if not image_href:
+ return None, {}
+
+ (image_service, image_id) = glance.get_remote_image_service(
+ context, image_href)
+ image = image_service.show(context, image_id)
+ return image_id, image
+
+ def _checks_for_create_and_rebuild(self, context, image_id, image,
+ instance_type, metadata,
+ files_to_inject):
+ self._check_injected_file_quota(context, files_to_inject)
+ self._check_requested_image(context, image_id, image, instance_type)
+
def _validate_and_provision_instance(self, context, instance_type,
image_href, kernel_id, ramdisk_id,
min_count, max_count,
@@ -555,24 +581,20 @@ class API(base.Base):
instances = []
instance_uuids = []
+ # FIXME(sirp): this check should go in
+ # `_checks_for_create_and_rebuild`, however Tempest has a bug in
+ # its quota checking test where its submitting a bad image ID. So
+ # if `_get_image` is called first, we get a `ImageNotFound`
+ # exception instead of a OverlimitException.
self._check_metadata_properties_quota(context, metadata)
- self._check_injected_file_quota(context, injected_files)
- self._check_requested_secgroups(context, security_groups)
- self._check_requested_networks(context, requested_networks)
- if image_href:
- (image_service, image_id) = glance.get_remote_image_service(
- context, image_href)
- image = image_service.show(context, image_id)
- if image['status'] != 'active':
- raise exception.ImageNotActive(image_id=image_id)
- else:
- image = {}
+ image_id, image = self._get_image(context, image_href)
+
+ self._checks_for_create_and_rebuild(context, image_id, image,
+ instance_type, metadata, injected_files)
- if instance_type['memory_mb'] < int(image.get('min_ram') or 0):
- raise exception.InstanceTypeMemoryTooSmall()
- if instance_type['root_gb'] < int(image.get('min_disk') or 0):
- raise exception.InstanceTypeDiskTooSmall()
+ self._check_requested_secgroups(context, security_groups)
+ self._check_requested_networks(context, requested_networks)
kernel_id, ramdisk_id = self._handle_kernel_and_ramdisk(
context, kernel_id, ramdisk_id, image)
@@ -1764,27 +1786,16 @@ class API(base.Base):
def rebuild(self, context, instance, image_href, admin_password, **kwargs):
"""Rebuild the given instance with the provided attributes."""
orig_image_ref = instance['image_ref'] or ''
-
files_to_inject = kwargs.pop('files_to_inject', [])
- self._check_injected_file_quota(context, files_to_inject)
-
metadata = kwargs.get('metadata', {})
+ instance_type = flavors.extract_instance_type(instance)
+
self._check_metadata_properties_quota(context, metadata)
- if image_href:
- (image_service, image_id) = glance.get_remote_image_service(
- context, image_href)
- image = image_service.show(context, image_id)
- if image['status'] != 'active':
- raise exception.ImageNotActive(image_id=image_id)
- else:
- image = {}
+ image_id, image = self._get_image(context, image_href)
- instance_type = flavors.extract_instance_type(instance)
- if instance_type['memory_mb'] < int(image.get('min_ram') or 0):
- raise exception.InstanceTypeMemoryTooSmall()
- if instance_type['root_gb'] < int(image.get('min_disk') or 0):
- raise exception.InstanceTypeDiskTooSmall()
+ self._checks_for_create_and_rebuild(context, image_id, image,
+ instance_type, metadata, files_to_inject)
kernel_id, ramdisk_id = self._handle_kernel_and_ramdisk(
context, None, None, image)