summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--nova/api/openstack/create_instance_controller.py31
-rw-r--r--nova/api/openstack/servers.py27
-rw-r--r--nova/api/openstack/zones.py12
-rw-r--r--nova/tests/api/openstack/test_servers.py4
4 files changed, 44 insertions, 30 deletions
diff --git a/nova/api/openstack/create_instance_controller.py b/nova/api/openstack/create_instance_controller.py
index 1c4098a08..ca076a218 100644
--- a/nova/api/openstack/create_instance_controller.py
+++ b/nova/api/openstack/create_instance_controller.py
@@ -46,7 +46,7 @@ class OpenstackCreateInstanceController(common.OpenstackController):
Once we stabilize the Zones portion of the API we may be able
to move this code back into servers.py
"""
-
+
def __init__(self):
"""We need the image service to create an instance."""
self._image_service = utils.import_object(FLAGS.image_service)
@@ -58,19 +58,22 @@ class OpenstackCreateInstanceController(common.OpenstackController):
def _flavor_id_from_req_data(self, data):
raise NotImplementedError()
+ def _get_server_admin_password(self, server):
+ raise NotImplementedError()
+
def create_instance(self, req, create_method):
"""Creates a new server for the given user. The approach
used depends on the create_method. For example, the standard
- POST /server call uses compute.api.create(), while
+ POST /server call uses compute.api.create(), while
POST /zones/server uses compute.api.create_all_at_once().
The problem is, both approaches return different values (i.e.
[instance dicts] vs. reservation_id). So the handling of the
- return type from this method is left to the caller.
+ return type from this method is left to the caller.
"""
env = self._deserialize_create(req)
if not env:
- return faults.Fault(exc.HTTPUnprocessableEntity())
+ return (None, faults.Fault(exc.HTTPUnprocessableEntity()))
context = req.environ['nova.context']
@@ -90,7 +93,7 @@ class OpenstackCreateInstanceController(common.OpenstackController):
context, requested_image_id)
except:
msg = _("Can not find requested image")
- return faults.Fault(exc.HTTPBadRequest(msg))
+ return (None, faults.Fault(exc.HTTPBadRequest(msg)))
kernel_id, ramdisk_id = self._get_kernel_ramdisk_from_image(
req, image_id)
@@ -104,14 +107,14 @@ class OpenstackCreateInstanceController(common.OpenstackController):
if not 'name' in env['server']:
msg = _("Server name is not defined")
- return exc.HTTPBadRequest(msg)
-
- zone_blob = env['server'].get('blob')
- reservation_id = env['server'].get('reservation_id')
+ return (None, exc.HTTPBadRequest(msg))
name = env['server']['name']
self._validate_server_name(name)
name = name.strip()
+ zone_blob = env['server'].get('blob')
+ reservation_id = env['server'].get('reservation_id')
+
inst_type = instance_types.get_instance_type_by_flavor_id(flavor_id)
extra_values = {
'instance_type': inst_type,
@@ -179,16 +182,6 @@ class OpenstackCreateInstanceController(common.OpenstackController):
msg = _("Server name is an empty string")
raise exc.HTTPBadRequest(msg)
- 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
-
def _get_kernel_ramdisk_from_image(self, req, image_id):
"""Fetch an image from the ImageService, then if present, return the
associated kernel and ramdisk image IDs.
diff --git a/nova/api/openstack/servers.py b/nova/api/openstack/servers.py
index 6e86c2956..223e1a191 100644
--- a/nova/api/openstack/servers.py
+++ b/nova/api/openstack/servers.py
@@ -116,13 +116,17 @@ class Controller(controller.OpenstackCreateInstanceController):
def create(self, req):
""" Creates a new server for a given user """
- extra_values, instances = \
+ extra_values, result = \
self.create_instance(req, self.compute_api.create)
+ if extra_values is None:
+ return result # a Fault.
+
+ instances = result
(inst, ) = instances
for key in ['instance_type', 'image_id']:
inst[key] = extra_values[key]
-
+
builder = self._get_view_builder(req)
server = builder.build(inst, is_detail=True)
server['server']['adminPass'] = extra_values['password']
@@ -156,10 +160,6 @@ class Controller(controller.OpenstackCreateInstanceController):
injected_files.append((path, contents))
return injected_files
- def _get_server_admin_password(self, server):
- """ Determine the admin password for a server on creation """
- return utils.generate_password(16)
-
@scheduler_api.redirect_handler
def update(self, req, id):
""" Updates the server name or password """
@@ -491,6 +491,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 utils.generate_password(16)
+
class ControllerV11(Controller):
def _image_id_from_req_data(self, data):
@@ -586,3 +590,14 @@ class ControllerV11(Controller):
def get_default_xmlns(self, req):
return common.XML_NS_V11
+
+ 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
diff --git a/nova/api/openstack/zones.py b/nova/api/openstack/zones.py
index 91531aa97..acd01a1ff 100644
--- a/nova/api/openstack/zones.py
+++ b/nova/api/openstack/zones.py
@@ -26,6 +26,7 @@ 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 common
FLAGS = flags.FLAGS
@@ -125,12 +126,15 @@ class Controller(controller.OpenstackCreateInstanceController):
def boot(self, req):
"""Creates a new server for a given user while being Zone aware.
-
+
Returns a reservation ID (a UUID).
"""
- extra_values, reservation_id = \
+ extra_values, result = \
self.create_instance(req, self.compute_api.create_all_at_once)
+ if extra_values is None:
+ return result # a Fault.
+ reservation_id = result
return {'reservation_id': reservation_id}
@check_encryption_key
@@ -156,8 +160,8 @@ class Controller(controller.OpenstackCreateInstanceController):
cooked.append(dict(weight=entry['weight'],
blob=cipher_text))
return cooked
-
- # Assume OS 1.0 functionality for these overrides.
+
+ # Assume OS 1.0 functionality for these overrides.
def _image_id_from_req_data(self, data):
return data['server']['imageId']
diff --git a/nova/tests/api/openstack/test_servers.py b/nova/tests/api/openstack/test_servers.py
index fbde5c9ce..7bad28ca8 100644
--- a/nova/tests/api/openstack/test_servers.py
+++ b/nova/tests/api/openstack/test_servers.py
@@ -31,6 +31,7 @@ from nova import flags
from nova import test
import nova.api.openstack
from nova.api.openstack import servers
+from nova.api.openstack import create_instance_controller
import nova.compute.api
from nova.compute import instance_types
from nova.compute import power_state
@@ -1380,7 +1381,8 @@ class ServersTest(test.TestCase):
class TestServerCreateRequestXMLDeserializer(unittest.TestCase):
def setUp(self):
- self.deserializer = servers.ServerCreateRequestXMLDeserializer()
+ self.deserializer = \
+ create_instance_controller.ServerCreateRequestXMLDeserializer()
def test_minimal_request(self):
serial_request = """