summaryrefslogtreecommitdiffstats
path: root/nova/api
diff options
context:
space:
mode:
authorJesse Andrews <anotherjesse@gmail.com>2011-09-01 05:22:15 +0000
committerTarmac <>2011-09-01 05:22:15 +0000
commitab00393da6ab61db1952b6826ea806b66ca6cc29 (patch)
treecee2f971dd886529f65a6502115d501c18da7fc4 /nova/api
parente0e98075fc520428033e7ebd11eb68d37a4ca5c8 (diff)
parent6180df0663cbb1b0ff4464f9d66d6acd0a64f5bd (diff)
Accept keypair when you launch a new server. These properties would be stored along with the other server properties in the database (like they are currently for ec2 api).
Diffstat (limited to 'nova/api')
-rw-r--r--nova/api/openstack/create_instance_helper.py30
-rw-r--r--nova/api/openstack/servers.py20
-rw-r--r--nova/api/openstack/views/servers.py1
3 files changed, 33 insertions, 18 deletions
diff --git a/nova/api/openstack/create_instance_helper.py b/nova/api/openstack/create_instance_helper.py
index 019283fdf..fd9247f79 100644
--- a/nova/api/openstack/create_instance_helper.py
+++ b/nova/api/openstack/create_instance_helper.py
@@ -19,7 +19,6 @@ import base64
from webob import exc
from xml.dom import minidom
-from nova import db
from nova import exception
from nova import flags
from nova import log as logging
@@ -74,20 +73,17 @@ class CreateInstanceHelper(object):
if not 'server' in body:
raise exc.HTTPUnprocessableEntity()
- server_dict = body['server']
context = req.environ['nova.context']
+ server_dict = body['server']
password = self.controller._get_server_admin_password(server_dict)
- key_name = None
- key_data = None
- # TODO(vish): Key pair access should move into a common library
- # instead of being accessed directly from the db.
- key_pairs = db.key_pair_get_all_by_user(context.elevated(),
- context.user_id)
- if key_pairs:
- key_pair = key_pairs[0]
- key_name = key_pair['name']
- key_data = key_pair['public_key']
+ if not 'name' in server_dict:
+ msg = _("Server name is not defined")
+ raise exc.HTTPBadRequest(explanation=msg)
+
+ name = server_dict['name']
+ self._validate_server_name(name)
+ name = name.strip()
image_href = self.controller._image_ref_from_req_data(body)
# If the image href was generated by nova api, strip image_href
@@ -133,12 +129,10 @@ class CreateInstanceHelper(object):
msg = _("Invalid flavorRef provided.")
raise exc.HTTPBadRequest(explanation=msg)
- if not 'name' in server_dict:
- msg = _("Server name is not defined")
- raise exc.HTTPBadRequest(explanation=msg)
-
zone_blob = server_dict.get('blob')
+ # optional openstack extensions:
+ key_name = server_dict.get('key_name')
user_data = server_dict.get('user_data')
self._validate_user_data(user_data)
@@ -176,7 +170,6 @@ class CreateInstanceHelper(object):
display_name=name,
display_description=name,
key_name=key_name,
- key_data=key_data,
metadata=server_dict.get('metadata', {}),
access_ip_v4=server_dict.get('accessIPv4'),
access_ip_v6=server_dict.get('accessIPv6'),
@@ -199,6 +192,9 @@ class CreateInstanceHelper(object):
except exception.FlavorNotFound as error:
msg = _("Invalid flavorRef provided.")
raise exc.HTTPBadRequest(explanation=msg)
+ except exception.KeypairNotFound as error:
+ msg = _("Invalid key_name provided.")
+ raise exc.HTTPBadRequest(explanation=msg)
except exception.SecurityGroupNotFound as error:
raise exc.HTTPBadRequest(explanation=unicode(error))
except RemoteError as err:
diff --git a/nova/api/openstack/servers.py b/nova/api/openstack/servers.py
index e0dd9bdb1..1b3eddd05 100644
--- a/nova/api/openstack/servers.py
+++ b/nova/api/openstack/servers.py
@@ -22,6 +22,7 @@ from xml.dom import minidom
import webob
from nova import compute
+from nova import db
from nova import exception
from nova import flags
from nova import log as logging
@@ -141,10 +142,16 @@ class Controller(object):
except exception.NotFound:
raise exc.HTTPNotFound()
+ def _get_key_name(self, req, body):
+ """ Get default keypair if not set """
+ raise NotImplementedError()
+
def create(self, req, body):
""" Creates a new server for a given user """
+ if 'server' in body:
+ body['server']['key_name'] = self._get_key_name(req, body)
+
extra_values = None
- result = None
extra_values, instances = self.helper.create_instance(
req, body, self.compute_api.create)
@@ -562,6 +569,13 @@ class ControllerV10(Controller):
raise exc.HTTPNotFound()
return webob.Response(status_int=202)
+ def _get_key_name(self, req, body):
+ context = req.environ["nova.context"]
+ keypairs = db.key_pair_get_all_by_user(context,
+ context.user_id)
+ if keypairs:
+ return keypairs[0]['name']
+
def _image_ref_from_req_data(self, data):
return data['server']['imageId']
@@ -632,6 +646,10 @@ class ControllerV11(Controller):
except exception.NotFound:
raise exc.HTTPNotFound()
+ def _get_key_name(self, req, body):
+ if 'server' in body:
+ return body['server'].get('key_name')
+
def _image_ref_from_req_data(self, data):
try:
return data['server']['imageRef']
diff --git a/nova/api/openstack/views/servers.py b/nova/api/openstack/views/servers.py
index b0daeb7a8..3a13d15f1 100644
--- a/nova/api/openstack/views/servers.py
+++ b/nova/api/openstack/views/servers.py
@@ -183,6 +183,7 @@ class ViewBuilderV11(ViewBuilder):
def _build_extra(self, response, inst):
self._build_links(response, inst)
response['uuid'] = inst['uuid']
+ response['key_name'] = inst.get('key_name', '')
self._build_config_drive(response, inst)
def _build_links(self, response, inst):