summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Day <eday@oddments.org>2010-08-18 19:43:18 +0000
committerTarmac <>2010-08-18 19:43:18 +0000
commit2af3bad97be40c135fb73f2e595e7fda86f17900 (patch)
treef435c2a589c723936fb96a2e57595f55e9ffee04
parent663667cdcf1bd16be33dc9b993123b7fc566caed (diff)
parent4e5e72da2e3242026d757c8d5143e16f9d00cb6a (diff)
downloadnova-2af3bad97be40c135fb73f2e595e7fda86f17900.tar.gz
nova-2af3bad97be40c135fb73f2e595e7fda86f17900.tar.xz
nova-2af3bad97be40c135fb73f2e595e7fda86f17900.zip
First in a series of patches to port the API from Tornado to WSGI. Also includes a few small style fixes in the new API code.
-rwxr-xr-xbin/nova-api-new (renamed from bin/nova-rsapi)8
-rw-r--r--nova/api/__init__.py38
-rw-r--r--nova/api/ec2/__init__.py42
-rw-r--r--nova/api/rackspace/__init__.py (renamed from nova/endpoint/rackspace/__init__.py)22
-rw-r--r--nova/api/rackspace/base.py30
-rw-r--r--nova/api/rackspace/controllers/__init__.py (renamed from nova/endpoint/rackspace/controllers/__init__.py)0
-rw-r--r--nova/api/rackspace/flavors.py18
-rw-r--r--nova/api/rackspace/images.py18
-rw-r--r--nova/api/rackspace/servers.py (renamed from nova/endpoint/rackspace/controllers/servers.py)26
-rw-r--r--nova/api/rackspace/sharedipgroups.py18
-rw-r--r--nova/endpoint/aws/__init__.py22
-rw-r--r--nova/endpoint/newapi.py51
-rw-r--r--nova/endpoint/rackspace/controllers/base.py9
-rw-r--r--nova/endpoint/rackspace/controllers/flavors.py1
-rw-r--r--nova/endpoint/rackspace/controllers/images.py1
-rw-r--r--nova/endpoint/rackspace/controllers/sharedipgroups.py1
16 files changed, 201 insertions, 104 deletions
diff --git a/bin/nova-rsapi b/bin/nova-api-new
index e2722422e..fda42339c 100755
--- a/bin/nova-rsapi
+++ b/bin/nova-api-new
@@ -18,17 +18,17 @@
# See the License for the specific language governing permissions and
# limitations under the License.
"""
- Daemon for the Rackspace API endpoint.
+Nova API daemon.
"""
+from nova import api
from nova import flags
from nova import utils
from nova import wsgi
-from nova.endpoint import newapi
FLAGS = flags.FLAGS
-flags.DEFINE_integer('cc_port', 8773, 'cloud controller port')
+flags.DEFINE_integer('api_port', 8773, 'API port')
if __name__ == '__main__':
utils.default_flagfile()
- wsgi.run_server(newapi.APIVersionRouter(), FLAGS.cc_port)
+ wsgi.run_server(api.API(), FLAGS.api_port)
diff --git a/nova/api/__init__.py b/nova/api/__init__.py
new file mode 100644
index 000000000..a6bb93348
--- /dev/null
+++ b/nova/api/__init__.py
@@ -0,0 +1,38 @@
+# 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.
+
+"""
+Root WSGI middleware for all API controllers.
+"""
+
+import routes
+
+from nova import wsgi
+from nova.api import ec2
+from nova.api import rackspace
+
+
+class API(wsgi.Router):
+ """Routes top-level requests to the appropriate controller."""
+
+ def __init__(self):
+ mapper = routes.Mapper()
+ mapper.connect(None, "/v1.0/{path_info:.*}",
+ controller=rackspace.API())
+ mapper.connect(None, "/ec2/{path_info:.*}", controller=ec2.API())
+ super(API, self).__init__(mapper)
diff --git a/nova/api/ec2/__init__.py b/nova/api/ec2/__init__.py
new file mode 100644
index 000000000..6eec0abf7
--- /dev/null
+++ b/nova/api/ec2/__init__.py
@@ -0,0 +1,42 @@
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+# Copyright 2010 OpenStack LLC.
+# 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.
+
+"""
+WSGI middleware for EC2 API controllers.
+"""
+
+import routes
+import webob.dec
+
+from nova import wsgi
+
+
+class API(wsgi.Router):
+ """Routes EC2 requests to the appropriate controller."""
+
+ def __init__(self):
+ mapper = routes.Mapper()
+ mapper.connect(None, "{all:.*}", controller=self.dummy)
+ super(API, self).__init__(mapper)
+
+ @staticmethod
+ @webob.dec.wsgify
+ def dummy(req):
+ """Temporary dummy controller."""
+ msg = "dummy response -- please hook up __init__() to cloud.py instead"
+ return repr({'dummy': msg,
+ 'kwargs': repr(req.environ['wsgiorg.routing_args'][1])})
diff --git a/nova/endpoint/rackspace/__init__.py b/nova/api/rackspace/__init__.py
index ac53ee10b..27e78f801 100644
--- a/nova/endpoint/rackspace/__init__.py
+++ b/nova/api/rackspace/__init__.py
@@ -17,20 +17,23 @@
# under the License.
"""
-Rackspace API Endpoint
+WSGI middleware for Rackspace API controllers.
"""
import json
import time
+import routes
import webob.dec
import webob.exc
-import routes
from nova import flags
from nova import wsgi
+from nova.api.rackspace import flavors
+from nova.api.rackspace import images
+from nova.api.rackspace import servers
+from nova.api.rackspace import sharedipgroups
from nova.auth import manager
-from nova.endpoint.rackspace import controllers
class API(wsgi.Middleware):
@@ -70,14 +73,9 @@ class APIRouter(wsgi.Router):
def __init__(self):
mapper = routes.Mapper()
-
- mapper.resource("server", "servers",
- controller=controllers.ServersController())
- mapper.resource("image", "images",
- controller=controllers.ImagesController())
- mapper.resource("flavor", "flavors",
- controller=controllers.FlavorsController())
+ mapper.resource("server", "servers", controller=servers.Controller())
+ mapper.resource("image", "images", controller=images.Controller())
+ mapper.resource("flavor", "flavors", controller=flavors.Controller())
mapper.resource("sharedipgroup", "sharedipgroups",
- controller=controllers.SharedIpGroupsController())
-
+ controller=sharedipgroups.Controller())
super(APIRouter, self).__init__(mapper)
diff --git a/nova/api/rackspace/base.py b/nova/api/rackspace/base.py
new file mode 100644
index 000000000..dd2c6543c
--- /dev/null
+++ b/nova/api/rackspace/base.py
@@ -0,0 +1,30 @@
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+# Copyright 2010 OpenStack LLC.
+# 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.
+
+from nova import wsgi
+
+
+class Controller(wsgi.Controller):
+ """TODO(eday): Base controller for all rackspace controllers. What is this
+ for? Is this just Rackspace specific? """
+
+ @classmethod
+ def render(cls, instance):
+ if isinstance(instance, list):
+ return {cls.entity_name: cls.render(instance)}
+ else:
+ return {"TODO": "TODO"}
diff --git a/nova/endpoint/rackspace/controllers/__init__.py b/nova/api/rackspace/controllers/__init__.py
index 052b6f365..052b6f365 100644
--- a/nova/endpoint/rackspace/controllers/__init__.py
+++ b/nova/api/rackspace/controllers/__init__.py
diff --git a/nova/api/rackspace/flavors.py b/nova/api/rackspace/flavors.py
new file mode 100644
index 000000000..986f11434
--- /dev/null
+++ b/nova/api/rackspace/flavors.py
@@ -0,0 +1,18 @@
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+# Copyright 2010 OpenStack LLC.
+# 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.
+
+class Controller(object): pass
diff --git a/nova/api/rackspace/images.py b/nova/api/rackspace/images.py
new file mode 100644
index 000000000..986f11434
--- /dev/null
+++ b/nova/api/rackspace/images.py
@@ -0,0 +1,18 @@
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+# Copyright 2010 OpenStack LLC.
+# 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.
+
+class Controller(object): pass
diff --git a/nova/endpoint/rackspace/controllers/servers.py b/nova/api/rackspace/servers.py
index 2f8e662d6..25d1fe9c8 100644
--- a/nova/endpoint/rackspace/controllers/servers.py
+++ b/nova/api/rackspace/servers.py
@@ -1,12 +1,32 @@
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+# Copyright 2010 OpenStack LLC.
+# 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.
+
from nova import rpc
from nova.compute import model as compute
-from nova.endpoint.rackspace.controllers.base import BaseController
+from nova.api.rackspace import base
+
-class ServersController(BaseController):
+class Controller(base.Controller):
entity_name = 'servers'
def index(self, **kwargs):
- return [instance_details(inst) for inst in compute.InstanceDirectory().all]
+ instances = []
+ for inst in compute.InstanceDirectory().all:
+ instances.append(instance_details(inst))
def show(self, **kwargs):
instance_id = kwargs['id']
diff --git a/nova/api/rackspace/sharedipgroups.py b/nova/api/rackspace/sharedipgroups.py
new file mode 100644
index 000000000..986f11434
--- /dev/null
+++ b/nova/api/rackspace/sharedipgroups.py
@@ -0,0 +1,18 @@
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+# Copyright 2010 OpenStack LLC.
+# 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.
+
+class Controller(object): pass
diff --git a/nova/endpoint/aws/__init__.py b/nova/endpoint/aws/__init__.py
deleted file mode 100644
index 55cbb8fd3..000000000
--- a/nova/endpoint/aws/__init__.py
+++ /dev/null
@@ -1,22 +0,0 @@
-import routes
-import webob.dec
-
-from nova import wsgi
-
-# TODO(gundlach): temp
-class API(wsgi.Router):
- """WSGI entry point for all AWS API requests."""
-
- def __init__(self):
- mapper = routes.Mapper()
-
- mapper.connect(None, "{all:.*}", controller=self.dummy)
-
- super(API, self).__init__(mapper)
-
- @webob.dec.wsgify
- def dummy(self, req):
- #TODO(gundlach)
- msg = "dummy response -- please hook up __init__() to cloud.py instead"
- return repr({ 'dummy': msg,
- 'kwargs': repr(req.environ['wsgiorg.routing_args'][1]) })
diff --git a/nova/endpoint/newapi.py b/nova/endpoint/newapi.py
deleted file mode 100644
index 9aae933af..000000000
--- a/nova/endpoint/newapi.py
+++ /dev/null
@@ -1,51 +0,0 @@
-# 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.
-
-"""
-:mod:`nova.endpoint` -- Main NOVA Api endpoints
-=====================================================
-
-.. automodule:: nova.endpoint
- :platform: Unix
- :synopsis: REST APIs for all nova functions
-.. moduleauthor:: Jesse Andrews <jesse@ansolabs.com>
-.. moduleauthor:: Devin Carlen <devin.carlen@gmail.com>
-.. moduleauthor:: Vishvananda Ishaya <vishvananda@yahoo.com>
-.. moduleauthor:: Joshua McKenty <joshua@cognition.ca>
-.. moduleauthor:: Manish Singh <yosh@gimp.org>
-.. moduleauthor:: Andy Smith <andy@anarkystic.com>
-"""
-
-from nova import wsgi
-import routes
-from nova.endpoint import rackspace
-from nova.endpoint import aws
-
-class APIVersionRouter(wsgi.Router):
- """Routes top-level requests to the appropriate API."""
-
- def __init__(self):
- mapper = routes.Mapper()
-
- rsapi = rackspace.API()
- mapper.connect(None, "/v1.0/{path_info:.*}", controller=rsapi)
-
- mapper.connect(None, "/ec2/{path_info:.*}", controller=aws.API())
-
- super(APIVersionRouter, self).__init__(mapper)
-
diff --git a/nova/endpoint/rackspace/controllers/base.py b/nova/endpoint/rackspace/controllers/base.py
deleted file mode 100644
index 8cd44f62e..000000000
--- a/nova/endpoint/rackspace/controllers/base.py
+++ /dev/null
@@ -1,9 +0,0 @@
-from nova import wsgi
-
-class BaseController(wsgi.Controller):
- @classmethod
- def render(cls, instance):
- if isinstance(instance, list):
- return { cls.entity_name : cls.render(instance) }
- else:
- return { "TODO": "TODO" }
diff --git a/nova/endpoint/rackspace/controllers/flavors.py b/nova/endpoint/rackspace/controllers/flavors.py
deleted file mode 100644
index f256cc852..000000000
--- a/nova/endpoint/rackspace/controllers/flavors.py
+++ /dev/null
@@ -1 +0,0 @@
-class FlavorsController(object): pass
diff --git a/nova/endpoint/rackspace/controllers/images.py b/nova/endpoint/rackspace/controllers/images.py
deleted file mode 100644
index ae2a08849..000000000
--- a/nova/endpoint/rackspace/controllers/images.py
+++ /dev/null
@@ -1 +0,0 @@
-class ImagesController(object): pass
diff --git a/nova/endpoint/rackspace/controllers/sharedipgroups.py b/nova/endpoint/rackspace/controllers/sharedipgroups.py
deleted file mode 100644
index 9d346d623..000000000
--- a/nova/endpoint/rackspace/controllers/sharedipgroups.py
+++ /dev/null
@@ -1 +0,0 @@
-class SharedIpGroupsController(object): pass