summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--nova/api/openstack/create_instance_helper.py13
-rw-r--r--nova/tests/api/openstack/contrib/test_createserverext.py42
2 files changed, 55 insertions, 0 deletions
diff --git a/nova/api/openstack/create_instance_helper.py b/nova/api/openstack/create_instance_helper.py
index 483ff4985..019283fdf 100644
--- a/nova/api/openstack/create_instance_helper.py
+++ b/nova/api/openstack/create_instance_helper.py
@@ -138,7 +138,10 @@ class CreateInstanceHelper(object):
raise exc.HTTPBadRequest(explanation=msg)
zone_blob = server_dict.get('blob')
+
user_data = server_dict.get('user_data')
+ self._validate_user_data(user_data)
+
availability_zone = server_dict.get('availability_zone')
name = server_dict['name']
self._validate_server_name(name)
@@ -370,6 +373,16 @@ class CreateInstanceHelper(object):
return networks
+ def _validate_user_data(self, user_data):
+ """Check if the user_data is encoded properly"""
+ if not user_data:
+ return
+ try:
+ user_data = base64.b64decode(user_data)
+ except TypeError:
+ expl = _('Userdata content cannot be decoded')
+ raise exc.HTTPBadRequest(explanation=expl)
+
class ServerXMLDeserializer(wsgi.XMLDeserializer):
"""
diff --git a/nova/tests/api/openstack/contrib/test_createserverext.py b/nova/tests/api/openstack/contrib/test_createserverext.py
index f6d9ba784..089c8e59d 100644
--- a/nova/tests/api/openstack/contrib/test_createserverext.py
+++ b/nova/tests/api/openstack/contrib/test_createserverext.py
@@ -77,6 +77,7 @@ class CreateserverextTest(test.TestCase):
def __init__(self):
self.injected_files = None
self.networks = None
+ self.user_data = None
self.db = db
def create(self, *args, **kwargs):
@@ -89,6 +90,10 @@ class CreateserverextTest(test.TestCase):
self.networks = kwargs['requested_networks']
else:
self.networks = None
+
+ if 'user_data' in kwargs:
+ self.user_data = kwargs['user_data']
+
return [{'id': '1234', 'display_name': 'fakeinstance',
'uuid': FAKE_UUID,
'created_at': "",
@@ -121,6 +126,14 @@ class CreateserverextTest(test.TestCase):
server['networks'] = network_list
return {'server': server}
+ def _create_user_data_request_dict(self, user_data):
+ server = {}
+ server['name'] = 'new-server-test'
+ server['imageRef'] = 1
+ server['flavorRef'] = 1
+ server['user_data'] = user_data
+ return {'server': server}
+
def _get_create_request_json(self, body_dict):
req = webob.Request.blank('/v1.1/123/os-create-server-ext')
req.headers['Content-Type'] = 'application/json'
@@ -180,6 +193,13 @@ class CreateserverextTest(test.TestCase):
self._run_create_instance_with_mock_compute_api(request)
return request, response, compute_api.networks
+ def _create_instance_with_user_data_json(self, networks):
+ body_dict = self._create_user_data_request_dict(networks)
+ request = self._get_create_request_json(body_dict)
+ compute_api, response = \
+ self._run_create_instance_with_mock_compute_api(request)
+ return request, response, compute_api.user_data
+
def _create_instance_with_networks_xml(self, networks):
body_dict = self._create_networks_request_dict(networks)
request = self._get_create_request_xml(body_dict)
@@ -306,3 +326,25 @@ class CreateserverextTest(test.TestCase):
self.assertEquals(response.status_int, 202)
self.assertEquals(compute_api.networks,
[('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', None)])
+
+ def test_create_instance_with_userdata(self):
+ user_data_contents = '#!/bin/bash\necho "Oh no!"\n'
+ user_data_contents = base64.b64encode(user_data_contents)
+ request, response, user_data = \
+ self._create_instance_with_user_data_json(user_data_contents)
+ self.assertEquals(response.status_int, 202)
+ self.assertEquals(user_data, user_data_contents)
+
+ def test_create_instance_with_userdata_none(self):
+ user_data_contents = None
+ request, response, user_data = \
+ self._create_instance_with_user_data_json(user_data_contents)
+ self.assertEquals(response.status_int, 202)
+ self.assertEquals(user_data, user_data_contents)
+
+ def test_create_instance_with_userdata_with_non_b64_content(self):
+ user_data_contents = '#!/bin/bash\necho "Oh no!"\n'
+ request, response, user_data = \
+ self._create_instance_with_user_data_json(user_data_contents)
+ self.assertEquals(response.status_int, 400)
+ self.assertEquals(user_data, None)