summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTushar Patil <tushar.vitthal.patil@gmail.com>2011-08-18 21:49:30 +0000
committerTarmac <>2011-08-18 21:49:30 +0000
commit48e22daa0d09bbaf889a343fb557a229210ec73e (patch)
tree74c9dfd392bc8d309e2ebc3f5eaa13094d1ea137
parentb4c46652fda699d18ddb8f197e8fdda168d7ed0e (diff)
parent56129e4a0b0c5cb2f8766e023bcaff77fc990008 (diff)
downloadnova-48e22daa0d09bbaf889a343fb557a229210ec73e.tar.gz
nova-48e22daa0d09bbaf889a343fb557a229210ec73e.tar.xz
nova-48e22daa0d09bbaf889a343fb557a229210ec73e.zip
Accept binary user_data in radix-64 format when you launch a new server using OSAPI. This user_data would be stored along with the other server properties in the database. Once the VM instance boots you can query for the user-data to do any custom installation of applications/servers or do some specific job like setting up networking route table.
You can query for user-data using curl with the URL:- curl http://169.254.169.254/latest/user-data
-rw-r--r--nova/api/openstack/create_instance_helper.py2
-rw-r--r--nova/tests/test_metadata.py40
2 files changed, 42 insertions, 0 deletions
diff --git a/nova/api/openstack/create_instance_helper.py b/nova/api/openstack/create_instance_helper.py
index b4a08dac0..978741682 100644
--- a/nova/api/openstack/create_instance_helper.py
+++ b/nova/api/openstack/create_instance_helper.py
@@ -122,6 +122,7 @@ class CreateInstanceHelper(object):
raise exc.HTTPBadRequest(explanation=msg)
zone_blob = server_dict.get('blob')
+ user_data = server_dict.get('user_data')
availability_zone = server_dict.get('availability_zone')
name = server_dict['name']
self._validate_server_name(name)
@@ -163,6 +164,7 @@ class CreateInstanceHelper(object):
reservation_id=reservation_id,
min_count=min_count,
max_count=max_count,
+ user_data=user_data,
availability_zone=availability_zone))
except quota.QuotaError as error:
self._handle_quota_error(error)
diff --git a/nova/tests/test_metadata.py b/nova/tests/test_metadata.py
index bfc7a6d44..b06e5c136 100644
--- a/nova/tests/test_metadata.py
+++ b/nova/tests/test_metadata.py
@@ -23,12 +23,21 @@ import httplib
import webob
+from nova import exception
from nova import test
from nova import wsgi
from nova.api.ec2 import metadatarequesthandler
from nova.db.sqlalchemy import api
+USER_DATA_STRING = ("This is an encoded string")
+ENCODE_USER_DATA_STRING = base64.b64encode(USER_DATA_STRING)
+
+
+def return_non_existing_server_by_address(context, address):
+ raise exception.NotFound()
+
+
class MetadataTestCase(test.TestCase):
"""Test that metadata is returning proper values."""
@@ -79,3 +88,34 @@ class MetadataTestCase(test.TestCase):
self.stubs.Set(api, 'security_group_get_by_instance', sg_get)
self.assertEqual(self.request('/meta-data/security-groups'),
'default\nother')
+
+ def test_user_data_non_existing_fixed_address(self):
+ self.stubs.Set(api, 'instance_get_all_by_filters',
+ return_non_existing_server_by_address)
+ request = webob.Request.blank('/user-data')
+ request.remote_addr = "127.1.1.1"
+ response = request.get_response(self.app)
+ self.assertEqual(response.status_int, 404)
+
+ def test_user_data_none_fixed_address(self):
+ self.stubs.Set(api, 'instance_get_all_by_filters',
+ return_non_existing_server_by_address)
+ request = webob.Request.blank('/user-data')
+ request.remote_addr = None
+ response = request.get_response(self.app)
+ self.assertEqual(response.status_int, 500)
+
+ def test_user_data_invalid_url(self):
+ request = webob.Request.blank('/user-data-invalid')
+ request.remote_addr = "127.0.0.1"
+ response = request.get_response(self.app)
+ self.assertEqual(response.status_int, 404)
+
+ def test_user_data_with_use_forwarded_header(self):
+ self.instance['user_data'] = ENCODE_USER_DATA_STRING
+ self.flags(use_forwarded_for=True)
+ request = webob.Request.blank('/user-data')
+ request.remote_addr = "127.0.0.1"
+ response = request.get_response(self.app)
+ self.assertEqual(response.status_int, 200)
+ self.assertEqual(response.body, USER_DATA_STRING)