summaryrefslogtreecommitdiffstats
path: root/nova/api
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/api
parent98a0b2513489fc50e0687f75ef859293afff9a6f (diff)
downloadnova-4203aa1060e5a97bed86d2e201c4c2443ef7e042.tar.gz
nova-4203aa1060e5a97bed86d2e201c4c2443ef7e042.tar.xz
nova-4203aa1060e5a97bed86d2e201c4c2443ef7e042.zip
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/api')
-rw-r--r--nova/api/ec2/cloud.py25
-rw-r--r--nova/api/openstack/servers.py48
2 files changed, 28 insertions, 45 deletions
diff --git a/nova/api/ec2/cloud.py b/nova/api/ec2/cloud.py
index 7978e08a0..4eef5e1ef 100644
--- a/nova/api/ec2/cloud.py
+++ b/nova/api/ec2/cloud.py
@@ -41,7 +41,6 @@ from nova import rpc
from nova import utils
from nova.compute import api as compute_api
from nova.compute import instance_types
-from nova.image.s3 import S3ImageService
FLAGS = flags.FLAGS
@@ -94,8 +93,9 @@ class CloudController(object):
"""
def __init__(self):
self.network_manager = utils.import_object(FLAGS.network_manager)
- self.compute_api = compute_api.ComputeAPI(self.network_manager)
- self.image_service = S3ImageService()
+ self.image_service = utils.import_object(FLAGS.image_service)
+ self.compute_api = compute_api.ComputeAPI(self.network_manager,
+ self.image_service)
self.setup()
def __str__(self):
@@ -119,7 +119,7 @@ class CloudController(object):
def _get_mpi_data(self, context, project_id):
result = {}
- for instance in db.instance_get_all_by_project(context, project_id):
+ for instance in self.compute_api.get_instances(context, project_id):
if instance['fixed_ip']:
line = '%s slots=%d' % (instance['fixed_ip']['address'],
instance['vcpus'])
@@ -438,7 +438,7 @@ class CloudController(object):
# instance_id is passed in as a list of instances
ec2_id = instance_id[0]
internal_id = ec2_id_to_internal_id(ec2_id)
- instance_ref = db.instance_get_by_internal_id(context, internal_id)
+ instance_ref = self.compute_api.get_instance(context, internal_id)
output = rpc.call(context,
'%s.%s' % (FLAGS.compute_topic,
instance_ref['host']),
@@ -535,7 +535,7 @@ class CloudController(object):
if volume_ref['attach_status'] == "attached":
raise exception.ApiError("Volume is already attached")
internal_id = ec2_id_to_internal_id(instance_id)
- instance_ref = db.instance_get_by_internal_id(context, internal_id)
+ instance_ref = self.compute_api.get_instance(context, internal_id)
host = instance_ref['host']
rpc.cast(context,
db.queue_get_for(context, FLAGS.compute_topic, host),
@@ -613,11 +613,7 @@ class CloudController(object):
instances = db.instance_get_all_by_reservation(context,
reservation_id)
else:
- if context.user.is_admin():
- instances = db.instance_get_all(context)
- else:
- instances = db.instance_get_all_by_project(context,
- context.project_id)
+ instances = self.compute_api.get_instances(context)
for instance in instances:
if not context.user.is_admin():
if instance['image_id'] == FLAGS.vpn_image_id:
@@ -714,7 +710,7 @@ class CloudController(object):
def associate_address(self, context, instance_id, public_ip, **kwargs):
internal_id = ec2_id_to_internal_id(instance_id)
- instance_ref = db.instance_get_by_internal_id(context, internal_id)
+ instance_ref = self.compute_api.get_instance(context, internal_id)
fixed_address = db.instance_get_fixed_address(context,
instance_ref['id'])
floating_ip_ref = db.floating_ip_get_by_address(context, public_ip)
@@ -750,13 +746,12 @@ class CloudController(object):
max_count = int(kwargs.get('max_count', 1))
instances = self.compute_api.create_instances(context,
instance_types.get_by_type(kwargs.get('instance_type', None)),
- self.image_service,
kwargs['image_id'],
min_count=int(kwargs.get('min_count', max_count)),
max_count=max_count,
kernel_id=kwargs.get('kernel_id'),
ramdisk_id=kwargs.get('ramdisk_id'),
- name=kwargs.get('display_name'),
+ display_name=kwargs.get('display_name'),
description=kwargs.get('display_description'),
user_data=kwargs.get('user_data', ''),
key_name=kwargs.get('key_name'),
@@ -801,7 +796,7 @@ class CloudController(object):
changes[field] = kwargs[field]
if changes:
internal_id = ec2_id_to_internal_id(ec2_id)
- inst = db.instance_get_by_internal_id(context, internal_id)
+ inst = self.compute_api.get_instance(context, internal_id)
db.instance_update(context, inst['id'], kwargs)
return True
diff --git a/nova/api/openstack/servers.py b/nova/api/openstack/servers.py
index a9da14867..b644876b0 100644
--- a/nova/api/openstack/servers.py
+++ b/nova/api/openstack/servers.py
@@ -15,23 +15,17 @@
# License for the specific language governing permissions and limitations
# under the License.
-import webob
from webob import exc
from nova import context
from nova import exception
-from nova import flags
-from nova import rpc
-from nova import utils
from nova import wsgi
from nova.api.openstack import faults
+from nova.auth import manager as auth_manager
from nova.compute import api as compute_api
from nova.compute import instance_types
from nova.compute import power_state
import nova.api.openstack
-import nova.image.service
-
-FLAGS = flags.FLAGS
def _entity_list(entities):
@@ -79,10 +73,7 @@ class Controller(wsgi.Controller):
"server": ["id", "imageId", "name", "flavorId", "hostId",
"status", "progress"]}}}
- def __init__(self, db_driver=None):
- if not db_driver:
- db_driver = FLAGS.db_driver
- self.db_driver = utils.import_object(db_driver)
+ def __init__(self):
self.compute_api = compute_api.ComputeAPI()
super(Controller, self).__init__()
@@ -101,7 +92,7 @@ class Controller(wsgi.Controller):
"""
user_id = req.environ['nova.context']['user']['id']
ctxt = context.RequestContext(user_id, user_id)
- instance_list = self.db_driver.instance_get_all_by_user(ctxt, user_id)
+ instance_list = self.compute_api.get_instances(ctxt)
limited_list = nova.api.openstack.limited(instance_list, req)
res = [entity_maker(inst)['server'] for inst in limited_list]
return _entity_list(res)
@@ -110,7 +101,7 @@ class Controller(wsgi.Controller):
""" Returns server details by server id """
user_id = req.environ['nova.context']['user']['id']
ctxt = context.RequestContext(user_id, user_id)
- inst = self.db_driver.instance_get_by_internal_id(ctxt, int(id))
+ inst = self.compute_api.get_instance(ctxt, int(id))
if inst:
if inst.user_id == user_id:
return _entity_detail(inst)
@@ -134,12 +125,11 @@ class Controller(wsgi.Controller):
user_id = req.environ['nova.context']['user']['id']
ctxt = context.RequestContext(user_id, user_id)
- key_pair = self.db_driver.key_pair_get_all_by_user(None, user_id)[0]
+ key_pair = auth_manager.AuthManager.get_key_pairs(ctxt)[0]
instances = self.compute_api.create_instances(ctxt,
instance_types.get_by_flavor_id(env['server']['flavorId']),
- utils.import_object(FLAGS.image_service),
env['server']['imageId'],
- name=env['server']['name'],
+ display_name=env['server']['name'],
description=env['server']['name'],
key_name=key_pair['name'],
key_data=key_pair['public_key'])
@@ -149,27 +139,24 @@ class Controller(wsgi.Controller):
""" Updates the server name or password """
user_id = req.environ['nova.context']['user']['id']
ctxt = context.RequestContext(user_id, user_id)
-
inst_dict = self._deserialize(req.body, req)
-
if not inst_dict:
return faults.Fault(exc.HTTPUnprocessableEntity())
- instance = self.db_driver.instance_get_by_internal_id(ctxt, int(id))
- if not instance or instance.user_id != user_id:
- return faults.Fault(exc.HTTPNotFound())
-
update_dict = {}
if 'adminPass' in inst_dict['server']:
update_dict['admin_pass'] = inst_dict['server']['adminPass']
if 'name' in inst_dict['server']:
update_dict['display_name'] = inst_dict['server']['name']
- self.compute_api.update_instance(ctxt, instance['id'], update_dict)
+ try:
+ self.compute_api.update_instance(ctxt, instance['id'], update_dict)
+ except exception.NotFound:
+ return faults.Fault(exc.HTTPNotFound())
return exc.HTTPNoContent()
def action(self, req, id):
- """ multi-purpose method used to reboot, rebuild, and
+ """ Multi-purpose method used to reboot, rebuild, and
resize a server """
user_id = req.environ['nova.context']['user']['id']
ctxt = context.RequestContext(user_id, user_id)
@@ -177,10 +164,11 @@ class Controller(wsgi.Controller):
try:
reboot_type = input_dict['reboot']['type']
except Exception:
- raise faults.Fault(webob.exc.HTTPNotImplemented())
- inst_ref = self.db.instance_get_by_internal_id(ctxt, int(id))
- if not inst_ref or (inst_ref and not inst_ref.user_id == user_id):
+ raise faults.Fault(exc.HTTPNotImplemented())
+ try:
+ # TODO(gundlach): pass reboot_type, support soft reboot in
+ # virt driver
+ self.compute_api.reboot(ctxt, id)
+ except:
return faults.Fault(exc.HTTPUnprocessableEntity())
- # TODO(gundlach): pass reboot_type, support soft reboot in
- # virt driver
- self.compute_api.reboot(ctxt, id)
+ return exc.HTTPNoContent()