diff options
| author | Matthew Dietz <matthewdietz@Matthew-Dietzs-MacBook-Pro.local> | 2010-08-11 15:27:27 -0500 |
|---|---|---|
| committer | Matthew Dietz <matthewdietz@Matthew-Dietzs-MacBook-Pro.local> | 2010-08-11 15:27:27 -0500 |
| commit | 2e753b033dae6270674c0397be8e01bd2ff47980 (patch) | |
| tree | 3ce8fac0913f546b25e7c3935eb12f3882fc8947 | |
| parent | a0fb0fdf1e899488f0717bea6ee2cad58120070b (diff) | |
| download | nova-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.py | 9 | ||||
| -rw-r--r-- | nova/endpoint/rackspace/controllers/flavors.py | 0 | ||||
| -rw-r--r-- | nova/endpoint/rackspace/controllers/images.py | 0 | ||||
| -rw-r--r-- | nova/endpoint/rackspace/controllers/servers.py | 72 | ||||
| -rw-r--r-- | nova/endpoint/rackspace/controllers/shared_ip_groups.py | 0 | ||||
| -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): |
