summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthew Dietz <matthewdietz@Matthew-Dietzs-MacBook-Pro.local>2010-08-11 15:27:27 -0500
committerMatthew Dietz <matthewdietz@Matthew-Dietzs-MacBook-Pro.local>2010-08-11 15:27:27 -0500
commit2e753b033dae6270674c0397be8e01bd2ff47980 (patch)
tree3ce8fac0913f546b25e7c3935eb12f3882fc8947
parenta0fb0fdf1e899488f0717bea6ee2cad58120070b (diff)
downloadnova-2e753b033dae6270674c0397be8e01bd2ff47980.tar.gz
nova-2e753b033dae6270674c0397be8e01bd2ff47980.tar.xz
nova-2e753b033dae6270674c0397be8e01bd2ff47980.zip
Prototype implementation of Servers controller
-rw-r--r--nova/endpoint/aws/cloud.py (renamed from nova/endpoint/cloud.py)0
-rw-r--r--nova/endpoint/aws/images.py (renamed from nova/endpoint/images.py)0
-rw-r--r--nova/endpoint/rackspace/controllers/base.py9
-rw-r--r--nova/endpoint/rackspace/controllers/flavors.py0
-rw-r--r--nova/endpoint/rackspace/controllers/images.py0
-rw-r--r--nova/endpoint/rackspace/controllers/servers.py72
-rw-r--r--nova/endpoint/rackspace/controllers/shared_ip_groups.py0
-rw-r--r--nova/endpoint/rackspace/rackspace.py (renamed from nova/endpoint/rackspace.py)27
8 files changed, 93 insertions, 15 deletions
diff --git a/nova/endpoint/cloud.py b/nova/endpoint/aws/cloud.py
index 878d54a15..878d54a15 100644
--- a/nova/endpoint/cloud.py
+++ b/nova/endpoint/aws/cloud.py
diff --git a/nova/endpoint/images.py b/nova/endpoint/aws/images.py
index fe7cb5d11..fe7cb5d11 100644
--- a/nova/endpoint/images.py
+++ b/nova/endpoint/aws/images.py
diff --git a/nova/endpoint/rackspace/controllers/base.py b/nova/endpoint/rackspace/controllers/base.py
new file mode 100644
index 000000000..a83925cc3
--- /dev/null
+++ b/nova/endpoint/rackspace/controllers/base.py
@@ -0,0 +1,9 @@
+class BaseController(object):
+ @classmethod
+ def render(cls, instance):
+ if isinstance(instance, list):
+ return [ cls.entity_name : { cls.render(instance) }
+ else
+ return
+
+
diff --git a/nova/endpoint/rackspace/controllers/flavors.py b/nova/endpoint/rackspace/controllers/flavors.py
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/nova/endpoint/rackspace/controllers/flavors.py
diff --git a/nova/endpoint/rackspace/controllers/images.py b/nova/endpoint/rackspace/controllers/images.py
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/nova/endpoint/rackspace/controllers/images.py
diff --git a/nova/endpoint/rackspace/controllers/servers.py b/nova/endpoint/rackspace/controllers/servers.py
new file mode 100644
index 000000000..af6c958bb
--- /dev/null
+++ b/nova/endpoint/rackspace/controllers/servers.py
@@ -0,0 +1,72 @@
+from nova import rpc
+from nova.compute import model as compute
+from nova.endpoint.rackspace import BaseController
+
+class ServersController(BaseController):
+ entity_name = 'servers'
+
+ def __init__(self):
+ raise NotImplemented("You may not create an instance of this class")
+
+ @classmethod
+ def index(cls):
+ return [instance_details(inst) for inst in compute.InstanceDirectory().all]
+
+ @classmethod
+ def show(cls, **kwargs):
+ instance_id = kwargs['id']
+ return compute.InstanceDirectory().get(instance_id)
+
+ @classmethod
+ def delete(cls, **kwargs):
+ instance_id = kwargs['id']
+ instance = compute.InstanceDirectory().get(instance_id)
+ if not instance
+ raise ServerNotFound("The requested server was not found")
+ instance.destroy()
+ return True
+
+ @classmethod
+ def create(cls, **kwargs):
+ inst = self.build_server_instance(kwargs['server'])
+ rpc.cast(
+ FLAGS.compute_topic, {
+ "method": "run_instance",
+ "args": {"instance_id": inst.instance_id}})
+
+ @classmethod
+ def update(cls, **kwargs):
+ instance_id = kwargs['id']
+ instance = compute.InstanceDirectory().get(instance_id)
+ if not instance:
+ raise ServerNotFound("The requested server was not found")
+ instance.update(kwargs['server'])
+ instance.save()
+
+ @classmethod
+ def build_server_instance(self, env):
+ """Build instance data structure and save it to the data store."""
+ reservation = utils.generate_uid('r')
+ ltime = time.strftime('%Y-%m-%dT%H:%M:%SZ', time.gmtime())
+ inst = self.instdir.new()
+ inst['name'] = env['server']['name']
+ inst['image_id'] = env['server']['imageId']
+ inst['instance_type'] = env['server']['flavorId']
+ inst['user_id'] = env['user']['id']
+ inst['project_id'] = env['project']['id']
+ inst['reservation_id'] = reservation
+ inst['launch_time'] = ltime
+ inst['mac_address'] = utils.generate_mac()
+ address = self.network.allocate_ip(
+ inst['user_id'],
+ inst['project_id'],
+ mac=inst['mac_address'])
+ inst['private_dns_name'] = str(address)
+ inst['bridge_name'] = network.BridgedNetwork.get_network_for_project(
+ inst['user_id'],
+ inst['project_id'],
+ 'default')['bridge_name']
+ # key_data, key_name, ami_launch_index
+ # TODO(todd): key data or root password
+ inst.save()
+ return inst
diff --git a/nova/endpoint/rackspace/controllers/shared_ip_groups.py b/nova/endpoint/rackspace/controllers/shared_ip_groups.py
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/nova/endpoint/rackspace/controllers/shared_ip_groups.py
diff --git a/nova/endpoint/rackspace.py b/nova/endpoint/rackspace/rackspace.py
index b4e6cd823..75b828e91 100644
--- a/nova/endpoint/rackspace.py
+++ b/nova/endpoint/rackspace/rackspace.py
@@ -45,20 +45,18 @@ class API(wsgi.Middleware):
def __init__(self):
super(API, self).__init__(Router(webob.exc.HTTPNotFound()))
- @webob.dec.wsgify
- def __call__(self, req):
- return self.application
+ def __call__(self, environ, start_response):
context = {}
- if "HTTP_X_AUTH_TOKEN" in req.environ:
+ if "HTTP_X_AUTH_TOKEN" in environ:
context['user'] = manager.AuthManager().get_user_from_access_key(
- req.environ['HTTP_X_AUTH_TOKEN'])
+ environ['HTTP_X_AUTH_TOKEN'])
if context['user']:
context['project'] = manager.AuthManager().get_project(
context['user'].name)
if "user" not in context:
- return webob.exc.HTTPForbidden()
+ return webob.exc.HTTPForbidden()(environ, start_response)
environ['nova.context'] = context
- return self.application
+ return self.application(environ, start_response)
class Router(wsgi.Router):
@@ -66,14 +64,13 @@ class Router(wsgi.Router):
def _build_map(self):
"""Build routing map for authentication and cloud."""
- self.map.resource("server", "servers", controller=CloudServerAPI())
- #self._connect("/v1.0", controller=AuthenticationAPI())
- #cloud = CloudServerAPI()
- #self._connect("/servers", controller=cloud.launch_server,
- # conditions={"method": ["POST"]})
- #self._connect("/servers/{server_id}", controller=cloud.delete_server,
- # conditions={'method': ["DELETE"]})
- #self._connect("/servers", controller=cloud)
+ self._connect("/v1.0", controller=AuthenticationAPI())
+ cloud = CloudServerAPI()
+ self._connect("/servers", controller=cloud.launch_server,
+ conditions={"method": ["POST"]})
+ self._connect("/servers/{server_id}", controller=cloud.delete_server,
+ conditions={'method': ["DELETE"]})
+ self._connect("/servers", controller=cloud)
class AuthenticationAPI(wsgi.Application):