summaryrefslogtreecommitdiffstats
path: root/nova/api
diff options
context:
space:
mode:
authorSandy Walsh <sandy.walsh@rackspace.com>2011-06-14 11:40:15 -0700
committerSandy Walsh <sandy.walsh@rackspace.com>2011-06-14 11:40:15 -0700
commita3282ac30255a63f166947a052af0fcda4992621 (patch)
treed4cfe26e18ccd0078be3f29e450bf6cd5cd27eea /nova/api
parente7e501a1a77f01247d84fa88275e858a338c6c95 (diff)
refactored out controller base class to use aggregation over inheritance
Diffstat (limited to 'nova/api')
-rw-r--r--nova/api/openstack/create_instance_helper.py (renamed from nova/api/openstack/create_instance_controller.py)46
-rw-r--r--nova/api/openstack/servers.py33
-rw-r--r--nova/api/openstack/zones.py48
3 files changed, 75 insertions, 52 deletions
diff --git a/nova/api/openstack/create_instance_controller.py b/nova/api/openstack/create_instance_helper.py
index 90f2542d9..fbc6318ef 100644
--- a/nova/api/openstack/create_instance_controller.py
+++ b/nova/api/openstack/create_instance_helper.py
@@ -1,6 +1,4 @@
-# vim: tabstop=4 shiftwidth=4 softtabstop=4
-
-# Copyright 2010 OpenStack LLC.
+# Copyright 2011 OpenStack LLC.
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
@@ -35,7 +33,7 @@ from nova.api.openstack import wsgi
from nova.auth import manager as auth_manager
-LOG = logging.getLogger('nova.api.openstack.create_instance_controller')
+LOG = logging.getLogger('nova.api.openstack.create_instance_helper')
FLAGS = flags.FLAGS
@@ -47,7 +45,7 @@ class CreateFault(exception.NovaException):
super(CreateFault, self).__init__()
-class OpenstackCreateInstanceController(object):
+class CreateInstanceHelper(object):
"""This is the base class for OS API Controllers that
are capable of creating instances (currently Servers and Zones).
@@ -55,22 +53,11 @@ class OpenstackCreateInstanceController(object):
to move this code back into servers.py
"""
- def __init__(self):
+ def __init__(self, controller):
"""We need the image service to create an instance."""
+ self.controller = controller
self._image_service = utils.import_object(FLAGS.image_service)
- super(OpenstackCreateInstanceController, self).__init__()
-
- # Default to the 1.0 naming scheme.
-
- def _image_ref_from_req_data(self, data):
- return data['server']['imageId']
-
- def _flavor_id_from_req_data(self, data):
- return data['server']['flavorId']
-
- def _get_server_admin_password(self, server):
- """ Determine the admin password for a server on creation """
- return utils.generate_password(16)
+ super(CreateInstanceHelper, self).__init__()
def create_instance(self, req, body, create_method):
"""Creates a new server for the given user. The approach
@@ -87,7 +74,7 @@ class OpenstackCreateInstanceController(object):
context = req.environ['nova.context']
- password = self._get_server_admin_password(body['server'])
+ password = self.controller._get_server_admin_password(body['server'])
key_name = None
key_data = None
@@ -97,7 +84,7 @@ class OpenstackCreateInstanceController(object):
key_name = key_pair['name']
key_data = key_pair['public_key']
- image_href = self._image_ref_from_req_data(body)
+ image_href = self.controller._image_ref_from_req_data(body)
try:
image_service, image_id = nova.image.get_image_service(image_href)
kernel_id, ramdisk_id = self._get_kernel_ramdisk_from_image(
@@ -115,7 +102,7 @@ class OpenstackCreateInstanceController(object):
if personality:
injected_files = self._get_injected_files(personality)
- flavor_id = self._flavor_id_from_req_data(body)
+ flavor_id = self.controller._flavor_id_from_req_data(body)
if not 'name' in body['server']:
msg = _("Server name is not defined")
@@ -266,6 +253,21 @@ class OpenstackCreateInstanceController(object):
injected_files.append((path, contents))
return injected_files
+ def _get_server_admin_password_old_style(self, server):
+ """ Determine the admin password for a server on creation """
+ return utils.generate_password(16)
+
+ def _get_server_admin_password_new_style(self, server):
+ """ Determine the admin password for a server on creation """
+ password = server.get('adminPass')
+
+ if password is None:
+ return utils.generate_password(16)
+ if not isinstance(password, basestring) or password == '':
+ msg = _("Invalid adminPass")
+ raise exc.HTTPBadRequest(msg)
+ return password
+
class ServerXMLDeserializer(wsgi.XMLDeserializer):
"""
diff --git a/nova/api/openstack/servers.py b/nova/api/openstack/servers.py
index 1b18c4ecb..5c967c40f 100644
--- a/nova/api/openstack/servers.py
+++ b/nova/api/openstack/servers.py
@@ -24,7 +24,7 @@ from nova import flags
from nova import log as logging
from nova import utils
from nova.api.openstack import common
-from nova.api.openstack import create_instance_controller as base_controller
+from nova.api.openstack import create_instance_helper as helper
from nova.api.openstack import faults
import nova.api.openstack.views.addresses
import nova.api.openstack.views.flavors
@@ -39,11 +39,12 @@ LOG = logging.getLogger('nova.api.openstack.servers')
FLAGS = flags.FLAGS
-class Controller(base_controller.OpenstackCreateInstanceController):
+class Controller(object):
""" The Server API controller for the OpenStack API """
def __init__(self):
self.compute_api = compute.API()
+ self.helper = helper.CreateInstanceHelper(self)
super(Controller, self).__init__()
def index(self, req):
@@ -111,8 +112,8 @@ class Controller(base_controller.OpenstackCreateInstanceController):
extra_values = None
result = None
try:
- extra_values, result = \
- self.create_instance(req, body, self.compute_api.create)
+ extra_values, result = self.helper.create_instance(
+ req, body, self.compute_api.create)
except faults.Fault, f:
return f
@@ -141,7 +142,7 @@ class Controller(base_controller.OpenstackCreateInstanceController):
if 'name' in body['server']:
name = body['server']['name']
- self._validate_server_name(name)
+ self.helper._validate_server_name(name)
update_dict['display_name'] = name.strip()
self._parse_update(ctxt, id, body, update_dict)
@@ -403,6 +404,13 @@ class Controller(base_controller.OpenstackCreateInstanceController):
class ControllerV10(Controller):
+
+ def _image_ref_from_req_data(self, data):
+ return data['server']['imageId']
+
+ def _flavor_id_from_req_data(self, data):
+ return data['server']['flavorId']
+
def _get_view_builder(self, req):
addresses_builder = nova.api.openstack.views.addresses.ViewBuilderV10()
return nova.api.openstack.views.servers.ViewBuilderV10(
@@ -453,6 +461,10 @@ class ControllerV10(Controller):
response.empty_body = True
return response
+ def _get_server_admin_password(self, server):
+ """ Determine the admin password for a server on creation """
+ return self.helper._get_server_admin_password_old_style(server)
+
class ControllerV11(Controller):
def _image_ref_from_req_data(self, data):
@@ -567,14 +579,7 @@ class ControllerV11(Controller):
def _get_server_admin_password(self, server):
""" Determine the admin password for a server on creation """
- password = server.get('adminPass')
-
- if password is None:
- return utils.generate_password(16)
- if not isinstance(password, basestring) or password == '':
- msg = _("Invalid adminPass")
- raise exc.HTTPBadRequest(msg)
- return password
+ return self.helper._get_server_admin_password_new_style(server)
def create_resource(version='1.0'):
@@ -610,7 +615,7 @@ def create_resource(version='1.0'):
}
deserializers = {
- 'application/xml': base_controller.ServerXMLDeserializer(),
+ 'application/xml': helper.ServerXMLDeserializer(),
}
return wsgi.Resource(controller, serializers=serializers,
diff --git a/nova/api/openstack/zones.py b/nova/api/openstack/zones.py
index 7ccb8555b..c34360e01 100644
--- a/nova/api/openstack/zones.py
+++ b/nova/api/openstack/zones.py
@@ -25,8 +25,9 @@ from nova import log as logging
from nova.compute import api as compute
from nova.scheduler import api
-from nova.api.openstack import create_instance_controller as controller
+from nova.api.openstack import create_instance_helper as helper
from nova.api.openstack import common
+from nova.api.openstack import faults
from nova.api.openstack import wsgi
@@ -62,16 +63,12 @@ def check_encryption_key(func):
return wrapped
-class Controller(controller.OpenstackCreateInstanceController):
- """Controller for Zone resources. Since we can also create instances
- via /zone/boot, this controller is derived from
- OpenstackCreateInstanceController, which contains all the logic for
- doing that (shared with Servers).
- """
+class Controller(object):
+ """Controller for Zone resources."""
- def __init__(self, version):
+ def __init__(self):
self.compute_api = compute.API()
- self.version = version
+ self.helper = helper.CreateInstanceHelper(self)
super(Controller, self).__init__()
def index(self, req):
@@ -132,7 +129,7 @@ class Controller(controller.OpenstackCreateInstanceController):
"""
result = None
try:
- extra_values, result = self.create_instance(req, body,
+ extra_values, result = self.helper.create_instance(req, body,
self.compute_api.create_all_at_once)
except faults.Fault, f:
return f
@@ -164,17 +161,36 @@ class Controller(controller.OpenstackCreateInstanceController):
return cooked
def _image_ref_from_req_data(self, data):
- if self.version == '1.0':
- return data['server']['imageId']
+ return data['server']['imageId']
+
+ def _flavor_id_from_req_data(self, data):
+ return data['server']['flavorId']
+
+ def _get_server_admin_password(self, server):
+ """ Determine the admin password for a server on creation """
+ return self.helper._get_server_admin_password_old_style(server)
+
+
+class ControllerV11(object):
+ """Controller for 1.1 Zone resources."""
+
+ def _get_server_admin_password(self, server):
+ """ Determine the admin password for a server on creation """
+ return self.helper._get_server_admin_password_new_style(server)
+
+ def _image_ref_from_req_data(self, data):
return data['server']['imageRef']
def _flavor_id_from_req_data(self, data):
- if self.version == '1.0':
- return data['server']['flavorId']
return data['server']['flavorRef']
def create_resource(version):
+ controller = {
+ '1.0': Controller,
+ '1.1': ControllerV11,
+ }[version]()
+
metadata = {
"attributes": {
"zone": ["id", "api_url", "name", "capabilities"],
@@ -187,8 +203,8 @@ def create_resource(version):
}
deserializers = {
- 'application/xml': controller.ServerXMLDeserializer(),
+ 'application/xml': helper.ServerXMLDeserializer(),
}
- return wsgi.Resource(Controller(version), serializers=serializers,
+ return wsgi.Resource(controller, serializers=serializers,
deserializers=deserializers)