summaryrefslogtreecommitdiffstats
path: root/nova/api
diff options
context:
space:
mode:
authorTushar Patil <tushar.vitthal.patil@gmail.com>2011-08-11 18:11:59 -0700
committerTushar Patil <tushar.vitthal.patil@gmail.com>2011-08-11 18:11:59 -0700
commitca7bf95e610bdc47f01b8fb7b459269bb8e5df66 (patch)
treec361abfb41fa6e0707d3fb43d578d3d7ca4291d8 /nova/api
parentfe0bde67193ce76376e72a7263b89240a63722a8 (diff)
downloadnova-ca7bf95e610bdc47f01b8fb7b459269bb8e5df66.tar.gz
nova-ca7bf95e610bdc47f01b8fb7b459269bb8e5df66.tar.xz
nova-ca7bf95e610bdc47f01b8fb7b459269bb8e5df66.zip
Initial version
Diffstat (limited to 'nova/api')
-rw-r--r--nova/api/__init__.py6
-rw-r--r--nova/api/ec2/__init__.py3
-rw-r--r--nova/api/openstack/create_instance_helper.py4
-rw-r--r--nova/api/openstack/userdatarequesthandler.py110
4 files changed, 119 insertions, 4 deletions
diff --git a/nova/api/__init__.py b/nova/api/__init__.py
index 747015af5..6e6b092b3 100644
--- a/nova/api/__init__.py
+++ b/nova/api/__init__.py
@@ -15,3 +15,9 @@
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
+from nova import flags
+
+
+flags.DEFINE_boolean('use_forwarded_for', False,
+ 'Treat X-Forwarded-For as the canonical remote address. '
+ 'Only enable this if you have a sanitizing proxy.')
diff --git a/nova/api/ec2/__init__.py b/nova/api/ec2/__init__.py
index 8b6e47cfb..e497b499a 100644
--- a/nova/api/ec2/__init__.py
+++ b/nova/api/ec2/__init__.py
@@ -37,9 +37,6 @@ from nova.auth import manager
FLAGS = flags.FLAGS
LOG = logging.getLogger("nova.api")
-flags.DEFINE_boolean('use_forwarded_for', False,
- 'Treat X-Forwarded-For as the canonical remote address. '
- 'Only enable this if you have a sanitizing proxy.')
flags.DEFINE_integer('lockout_attempts', 5,
'Number of failed auths before lockout.')
flags.DEFINE_integer('lockout_minutes', 15,
diff --git a/nova/api/openstack/create_instance_helper.py b/nova/api/openstack/create_instance_helper.py
index 1425521a9..144697790 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')
name = server_dict['name']
self._validate_server_name(name)
name = name.strip()
@@ -161,7 +162,8 @@ class CreateInstanceHelper(object):
zone_blob=zone_blob,
reservation_id=reservation_id,
min_count=min_count,
- max_count=max_count))
+ max_count=max_count,
+ user_data=user_data))
except quota.QuotaError as error:
self._handle_quota_error(error)
except exception.ImageNotFound as error:
diff --git a/nova/api/openstack/userdatarequesthandler.py b/nova/api/openstack/userdatarequesthandler.py
new file mode 100644
index 000000000..5daa37e95
--- /dev/null
+++ b/nova/api/openstack/userdatarequesthandler.py
@@ -0,0 +1,110 @@
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+# Copyright 2010 United States Government as represented by the
+# Administrator of the National Aeronautics and Space Administration.
+# All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+"""User data request handler."""
+
+import base64
+import webob.dec
+import webob.exc
+
+from nova import log as logging
+from nova import context
+from nova import exception
+from nova import db
+from nova import flags
+from nova import wsgi
+
+
+LOG = logging.getLogger('nova.api.openstack.userdata')
+FLAGS = flags.FLAGS
+
+
+class Controller(object):
+ """ The server user-data API controller for the Openstack API """
+
+ def __init__(self):
+ super(Controller, self).__init__()
+
+ @staticmethod
+ def _format_user_data(instance_ref):
+ return base64.b64decode(instance_ref['user_data'])
+
+ def get_user_data(self, address):
+ ctxt = context.get_admin_context()
+ try:
+ instance_ref = db.instance_get_by_fixed_ip(ctxt, address)
+ except exception.NotFound:
+ instance_ref = None
+ if not instance_ref:
+ return None
+
+ data = {'user-data': self._format_user_data(instance_ref)}
+ return data
+
+
+class UserdataRequestHandler(wsgi.Application):
+ """Serve user-data from the OS API."""
+
+ def __init__(self):
+ self.cc = Controller()
+
+ def print_data(self, data):
+ if isinstance(data, dict):
+ output = ''
+ for key in data:
+ if key == '_name':
+ continue
+ output += key
+ if isinstance(data[key], dict):
+ if '_name' in data[key]:
+ output += '=' + str(data[key]['_name'])
+ else:
+ output += '/'
+ output += '\n'
+ # Cut off last \n
+ return output[:-1]
+ elif isinstance(data, list):
+ return '\n'.join(data)
+ else:
+ return str(data)
+
+ def lookup(self, path, data):
+ items = path.split('/')
+ for item in items:
+ if item:
+ if not isinstance(data, dict):
+ return data
+ if not item in data:
+ return None
+ data = data[item]
+ return data
+
+ @webob.dec.wsgify(RequestClass=wsgi.Request)
+ def __call__(self, req):
+ remote_address = "10.0.1.6"#req.remote_addr
+ if FLAGS.use_forwarded_for:
+ remote_address = req.headers.get('X-Forwarded-For', remote_address)
+
+ data = self.cc.get_user_data(remote_address)
+ if data is None:
+ LOG.error(_('Failed to get user data for ip: %s'), remote_address)
+ raise webob.exc.HTTPNotFound()
+ data = self.lookup(req.path_info, data)
+ if data is None:
+ raise webob.exc.HTTPNotFound()
+ return self.print_data(data)