diff options
-rw-r--r-- | nova/compute/api.py | 85 |
1 files changed, 56 insertions, 29 deletions
diff --git a/nova/compute/api.py b/nova/compute/api.py index d0a039644..f109b8a44 100644 --- a/nova/compute/api.py +++ b/nova/compute/api.py @@ -404,20 +404,20 @@ class API(base.Base): options_from_image['auto_disk_config'] = auto_disk_config return options_from_image - def _create_instance(self, context, instance_type, - image_href, kernel_id, ramdisk_id, - min_count, max_count, - display_name, display_description, - key_name, key_data, security_group, - availability_zone, user_data, metadata, - injected_files, admin_password, - access_ip_v4, access_ip_v6, - requested_networks, config_drive, - block_device_mapping, auto_disk_config, - reservation_id=None, scheduler_hints=None): + def _validate_and_provision_instance(self, context, instance_type, + image_href, kernel_id, ramdisk_id, + min_count, max_count, + display_name, display_description, + key_name, key_data, security_group, + availability_zone, user_data, + metadata, injected_files, + access_ip_v4, access_ip_v6, + requested_networks, config_drive, + block_device_mapping, + auto_disk_config, reservation_id, + scheduler_hints): """Verify all the input parameters regardless of the provisioning - strategy being performed and schedule the instance(s) for - creation.""" + strategy being performed.""" if not metadata: metadata = {} @@ -437,6 +437,19 @@ class API(base.Base): raise exception.InstanceTypeNotFound( instance_type_id=instance_type['id']) + if user_data: + l = len(user_data) + if l > MAX_USERDATA_SIZE: + # NOTE(mikal): user_data is stored in a text column, and + # the database might silently truncate if its over length. + raise exception.InstanceUserDataTooLarge( + length=l, maxsize=MAX_USERDATA_SIZE) + + try: + base64.decodestring(user_data) + except base64.binascii.Error: + raise exception.InstanceUserDataMalformed() + # Reserve quotas num_instances, quota_reservations = self._check_num_instances_quota( context, instance_type, min_count, max_count) @@ -484,9 +497,6 @@ class API(base.Base): key_name) key_data = key_pair['public_key'] - if reservation_id is None: - reservation_id = utils.generate_uid('r') - root_device_name = block_device.properties_root_device_name( image.get('properties', {})) @@ -524,19 +534,6 @@ class API(base.Base): 'root_device_name': root_device_name, 'progress': 0} - if user_data: - l = len(user_data) - if l > MAX_USERDATA_SIZE: - # NOTE(mikal): user_data is stored in a text column, and - # the database might silently truncate if its over length. - raise exception.InstanceUserDataTooLarge( - length=l, maxsize=MAX_USERDATA_SIZE) - - try: - base64.decodestring(user_data) - except base64.binascii.Error: - raise exception.InstanceUserDataMalformed() - options_from_image = self._inherit_properties_from_image( image, auto_disk_config) @@ -579,6 +576,36 @@ class API(base.Base): 'security_group': security_group, } + return (instances, request_spec, filter_properties) + + def _create_instance(self, context, instance_type, + image_href, kernel_id, ramdisk_id, + min_count, max_count, + display_name, display_description, + key_name, key_data, security_group, + availability_zone, user_data, metadata, + injected_files, admin_password, + access_ip_v4, access_ip_v6, + requested_networks, config_drive, + block_device_mapping, auto_disk_config, + reservation_id=None, scheduler_hints=None): + """Verify all the input parameters regardless of the provisioning + strategy being performed and schedule the instance(s) for + creation.""" + + if reservation_id is None: + reservation_id = utils.generate_uid('r') + + (instances, request_spec, filter_properties) = \ + self._validate_and_provision_instance(context, instance_type, + image_href, kernel_id, ramdisk_id, min_count, + max_count, display_name, display_description, + key_name, key_data, security_group, availability_zone, + user_data, metadata, injected_files, access_ip_v4, + access_ip_v6, requested_networks, config_drive, + block_device_mapping, auto_disk_config, + reservation_id, scheduler_hints) + self.scheduler_rpcapi.run_instance(context, request_spec=request_spec, admin_password=admin_password, injected_files=injected_files, |