summaryrefslogtreecommitdiffstats
path: root/nova/compute
diff options
context:
space:
mode:
authorEric Day <eday@oddments.org>2010-12-03 12:21:18 -0800
committerEric Day <eday@oddments.org>2010-12-03 12:21:18 -0800
commit4203aa1060e5a97bed86d2e201c4c2443ef7e042 (patch)
tree492b8fc6f7d255c92843c016dd30e9d2592c8b32 /nova/compute
parent98a0b2513489fc50e0687f75ef859293afff9a6f (diff)
Finished cleaning up the openstack servers API, it no longer touches the database directly. Also cleaned up similar things in ec2 API and refactored a couple methods in nova.compute.api to accomodate this work.
Diffstat (limited to 'nova/compute')
-rw-r--r--nova/compute/api.py96
1 files changed, 45 insertions, 51 deletions
diff --git a/nova/compute/api.py b/nova/compute/api.py
index 457d6e27f..995bed91b 100644
--- a/nova/compute/api.py
+++ b/nova/compute/api.py
@@ -44,16 +44,19 @@ def generate_default_hostname(internal_id):
class ComputeAPI(base.Base):
"""API for interacting with the compute manager."""
- def __init__(self, network_manager=None, **kwargs):
+ def __init__(self, network_manager=None, image_service=None, **kwargs):
if not network_manager:
network_manager = utils.import_object(FLAGS.network_manager)
self.network_manager = network_manager
+ if not image_service:
+ image_service = utils.import_object(FLAGS.image_service)
+ self.image_service = image_service
super(ComputeAPI, self).__init__(**kwargs)
- def create_instances(self, context, instance_type, image_service, image_id,
- min_count=1, max_count=1, kernel_id=None,
- ramdisk_id=None, name='', description='',
- user_data='', key_name=None, key_data=None,
+ def create_instances(self, context, instance_type, image_id, min_count=1,
+ max_count=1, kernel_id=None, ramdisk_id=None,
+ display_name='', description='', user_data='',
+ key_name=None, key_data=None,
security_group='default',
generate_hostname=generate_default_hostname):
"""Create the number of instances requested if quote and
@@ -70,15 +73,15 @@ class ComputeAPI(base.Base):
is_vpn = image_id == FLAGS.vpn_image_id
if not is_vpn:
- image = image_service.show(context, image_id)
+ image = self.image_service.show(context, image_id)
if kernel_id is None:
kernel_id = image.get('kernelId', FLAGS.default_kernel)
if ramdisk_id is None:
ramdisk_id = image.get('ramdiskId', FLAGS.default_ramdisk)
# Make sure we have access to kernel and ramdisk
- image_service.show(context, kernel_id)
- image_service.show(context, ramdisk_id)
+ self.image_service.show(context, kernel_id)
+ self.image_service.show(context, ramdisk_id)
if security_group is None:
security_group = ['default']
@@ -111,7 +114,7 @@ class ComputeAPI(base.Base):
'memory_mb': type_data['memory_mb'],
'vcpus': type_data['vcpus'],
'local_gb': type_data['local_gb'],
- 'display_name': name,
+ 'display_name': display_name,
'display_description': description,
'key_name': key_name,
'key_data': key_data}
@@ -123,14 +126,25 @@ class ComputeAPI(base.Base):
instance = dict(mac_address=utils.generate_mac(),
launch_index=num,
**base_options)
- instance_ref = self.create_instance(context, security_groups,
- **instance)
- instance_id = instance_ref['id']
- internal_id = instance_ref['internal_id']
- hostname = generate_hostname(internal_id)
- self.update_instance(context, instance_id, hostname=hostname)
- instances.append(dict(id=instance_id, internal_id=internal_id,
- hostname=hostname, **instance))
+ instance = self.db.instance_create(context, instance)
+ instance_id = instance['id']
+ internal_id = instance['internal_id']
+
+ elevated = context.elevated()
+ if not security_groups:
+ security_groups = []
+ for security_group_id in security_groups:
+ self.db.instance_add_security_group(elevated,
+ instance_id,
+ security_group_id)
+
+ # Set sane defaults if not specified
+ updates = dict(hostname=generate_hostname(internal_id))
+ if 'display_name' not in instance:
+ updates['display_name'] = "Server %s" % internal_id
+
+ instance = self.update_instance(context, instance_id, **updates)
+ instances.append(instance)
# TODO(vish): This probably should be done in the scheduler
# or in compute as a call. The network should be
@@ -165,39 +179,6 @@ class ComputeAPI(base.Base):
'project_id': context.project_id}
group = db.security_group_create(context, values)
- def create_instance(self, context, security_groups=None, **kwargs):
- """Creates the instance in the datastore and returns the
- new instance as a mapping
-
- :param context: The security context
- :param security_groups: list of security group ids to
- attach to the instance
- :param kwargs: All additional keyword args are treated
- as data fields of the instance to be
- created
-
- :retval Returns a mapping of the instance information
- that has just been created
-
- """
- instance_ref = self.db.instance_create(context, kwargs)
- inst_id = instance_ref['id']
- # Set sane defaults if not specified
- if kwargs.get('display_name') is None:
- display_name = "Server %s" % instance_ref['internal_id']
- instance_ref['display_name'] = display_name
- self.db.instance_update(context, inst_id,
- {'display_name': display_name})
-
- elevated = context.elevated()
- if not security_groups:
- security_groups = []
- for security_group_id in security_groups:
- self.db.instance_add_security_group(elevated,
- inst_id,
- security_group_id)
- return instance_ref
-
def update_instance(self, context, instance_id, **kwargs):
"""Updates the instance in the datastore.
@@ -210,7 +191,7 @@ class ComputeAPI(base.Base):
:retval None
"""
- self.db.instance_update(context, instance_id, kwargs)
+ return self.db.instance_update(context, instance_id, kwargs)
def delete_instance(self, context, instance_id):
logging.debug("Going to try and terminate %d" % instance_id)
@@ -264,6 +245,19 @@ class ComputeAPI(base.Base):
else:
self.db.instance_destroy(context, instance['id'])
+ def get_instances(self, context, project_id=None):
+ if project_id or not context.is_admin:
+ if not context.project:
+ return self.db.instance_get_all_by_user(context,
+ context.user_id)
+ if project_id is None:
+ project_id = context.project_id
+ return self.db.instance_get_all_by_project(context, project_id)
+ return self.db.instance_get_all(context)
+
+ def get_instance(self, context, instance_id):
+ return self.db.instance_get_by_internal_id(context, instance_id)
+
def reboot(self, context, instance_id):
"""Reboot the given instance."""
instance = self.db.instance_get_by_internal_id(context, instance_id)