summaryrefslogtreecommitdiffstats
path: root/nova
diff options
context:
space:
mode:
authorCerberus <matt.dietz@rackspace.com>2010-09-28 00:23:49 -0500
committerCerberus <matt.dietz@rackspace.com>2010-09-28 00:23:49 -0500
commit2f72b2a9fc9fee508b16c0b96285124279ef89ca (patch)
treeadd8a43cc32b17bcb1e46d842f04565f75d71eda /nova
parentf32e7054052f9daca7dcb92b0fb0ff0525c073be (diff)
downloadnova-2f72b2a9fc9fee508b16c0b96285124279ef89ca.tar.gz
nova-2f72b2a9fc9fee508b16c0b96285124279ef89ca.tar.xz
nova-2f72b2a9fc9fee508b16c0b96285124279ef89ca.zip
More cleanup, backup_schedules controller, server details and the beginnings of the servers action route
Diffstat (limited to 'nova')
-rw-r--r--nova/api/rackspace/__init__.py17
-rw-r--r--nova/api/rackspace/backup_schedules.py37
-rw-r--r--nova/api/rackspace/flavors.py1
-rw-r--r--nova/api/rackspace/images.py1
-rw-r--r--nova/api/rackspace/servers.py22
-rw-r--r--nova/db/sqlalchemy/models.py4
-rw-r--r--nova/tests/api/rackspace/servers.py85
-rw-r--r--nova/tests/api/rackspace/test_helper.py1
8 files changed, 141 insertions, 27 deletions
diff --git a/nova/api/rackspace/__init__.py b/nova/api/rackspace/__init__.py
index 63b0edc6a..a10a9c6df 100644
--- a/nova/api/rackspace/__init__.py
+++ b/nova/api/rackspace/__init__.py
@@ -35,6 +35,7 @@ from nova.api.rackspace import flavors
from nova.api.rackspace import images
from nova.api.rackspace import ratelimiting
from nova.api.rackspace import servers
+from nova.api.rackspace import backup_schedules
from nova.api.rackspace import sharedipgroups
from nova.auth import manager
@@ -67,8 +68,10 @@ class AuthMiddleware(wsgi.Middleware):
if not user:
return webob.exc.HTTPUnauthorized()
- context = {'user': user}
- req.environ['nova.context'] = context
+
+ if not req.environ.has_key('nova.context'):
+ req.environ['nova.context'] = {}
+ req.environ['nova.context']['user'] = user
return self.application
class RateLimitingMiddleware(wsgi.Middleware):
@@ -146,11 +149,19 @@ class APIRouter(wsgi.Router):
def __init__(self):
mapper = routes.Mapper()
mapper.resource("server", "servers", controller=servers.Controller(),
- collection={'detail': 'GET'})
+ collection={ 'detail': 'GET'},
+ member={'action':'POST'})
+
+ mapper.resource("backup_schedule", "backup_schedules",
+ controller=backup_schedules.Controller(),
+ parent_resource=dict(member_name='server',
+ collection_name = 'servers'))
+
mapper.resource("image", "images", controller=images.Controller(),
collection={'detail': 'GET'})
mapper.resource("flavor", "flavors", controller=flavors.Controller(),
collection={'detail': 'GET'})
mapper.resource("sharedipgroup", "sharedipgroups",
controller=sharedipgroups.Controller())
+
super(APIRouter, self).__init__(mapper)
diff --git a/nova/api/rackspace/backup_schedules.py b/nova/api/rackspace/backup_schedules.py
new file mode 100644
index 000000000..a18dfb87c
--- /dev/null
+++ b/nova/api/rackspace/backup_schedules.py
@@ -0,0 +1,37 @@
+# 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.
+
+import time
+import nova.image.service
+from nova import wsgi
+from nova.api.rackspace import _id_translator
+from webob import exc
+
+class Controller(wsgi.Controller):
+ def __init__(self):
+ pass
+
+ def index(self, req, server_id):
+ return exc.HTTPNotFound()
+
+ def create(self, req, server_id):
+ """ No actual update method required, since the existing API allows
+ both create and update through a POST """
+ return exc.HTTPNotFound()
+
+ def delete(self, req, server_id):
+ return exc.HTTPNotFound()
diff --git a/nova/api/rackspace/flavors.py b/nova/api/rackspace/flavors.py
index 024011a71..3bcf170e5 100644
--- a/nova/api/rackspace/flavors.py
+++ b/nova/api/rackspace/flavors.py
@@ -15,7 +15,6 @@
# License for the specific language governing permissions and limitations
# under the License.
-from nova.api.rackspace import base
from nova.compute import instance_types
from nova import wsgi
from webob import exc
diff --git a/nova/api/rackspace/images.py b/nova/api/rackspace/images.py
index 9aaec52e2..10e15de3f 100644
--- a/nova/api/rackspace/images.py
+++ b/nova/api/rackspace/images.py
@@ -17,7 +17,6 @@
import nova.image.service
from nova import wsgi
-from nova.api.rackspace import base
from nova.api.rackspace import _id_translator
from webob import exc
diff --git a/nova/api/rackspace/servers.py b/nova/api/rackspace/servers.py
index 53824ee1b..d825e734e 100644
--- a/nova/api/rackspace/servers.py
+++ b/nova/api/rackspace/servers.py
@@ -25,7 +25,6 @@ from nova import utils
from nova import compute
from nova import flags
from nova.compute import power_state
-from nova.api.rackspace import base
from nova.api.rackspace import _id_translator
from webob import exc
@@ -63,11 +62,12 @@ class Controller(wsgi.Controller):
return self._entity_list(res)
def detail(self, req):
- res = [self._entity_detail(inst)['server'] for inst in \
+ res = [self._entity_detail(inst)['server'] for inst in
self.db.instance_get_all(None)]
return self._entity_list(res)
def show(self, req, id):
+ user = req.environ['nova.context']['user']
inst = self.db.instance_get(None, id)
if inst:
return self._entity_detail(inst)
@@ -75,10 +75,9 @@ class Controller(wsgi.Controller):
def delete(self, req, id):
instance = self.db.instance_get(None, id)
-
if not instance:
return exc.HTTPNotFound()
- instance.destroy()
+ self.db.instance_destroy(None, id)
return exc.HTTPAccepted()
def create(self, req):
@@ -93,10 +92,17 @@ class Controller(wsgi.Controller):
instance = self.db.instance_get(None, id)
if not instance:
return exc.HTTPNotFound()
- instance.update(kwargs['server'])
- instance.save()
+
+ attrs = req.environ['nova.context'].get('model_attributes', None)
+ if attrs:
+ self.db.instance_update(None, id, attrs)
return exc.HTTPNoContent()
+ def action(self, req, id):
+ """ multi-purpose method used to reboot, rebuild, and
+ resize a server """
+ return {}
+
def _id_translator(self):
service = nova.image.service.ImageService.load()
return _id_translator.RackspaceAPIIdTranslator(
@@ -132,7 +138,7 @@ class Controller(wsgi.Controller):
inst['project_id'],
'default')['bridge_name']
- inst.save()
+ self.db.instance_create(None, inst)
return inst
def _filter_params(self, inst_dict):
@@ -146,7 +152,7 @@ class Controller(wsgi.Controller):
inst_dict = {}
mapped_keys = dict(status='state', imageId='image_id',
- flavorId='instance_type', name='name')
+ flavorId='instance_type', name='name', id='id')
for k,v in mapped_keys.iteritems():
inst_dict[k] = inst[v]
diff --git a/nova/db/sqlalchemy/models.py b/nova/db/sqlalchemy/models.py
index f6ba7953f..47c505f25 100644
--- a/nova/db/sqlalchemy/models.py
+++ b/nova/db/sqlalchemy/models.py
@@ -209,12 +209,14 @@ class Instance(BASE, NovaBase):
@property
def name(self):
- return self.str_id
+ return self.server_name or self.str_id
image_id = Column(String(255))
kernel_id = Column(String(255))
ramdisk_id = Column(String(255))
+ server_name = Column(String(255))
+
# image_id = Column(Integer, ForeignKey('images.id'), nullable=True)
# kernel_id = Column(Integer, ForeignKey('images.id'), nullable=True)
# ramdisk_id = Column(Integer, ForeignKey('images.id'), nullable=True)
diff --git a/nova/tests/api/rackspace/servers.py b/nova/tests/api/rackspace/servers.py
index dd54a6ac8..0ef0f4256 100644
--- a/nova/tests/api/rackspace/servers.py
+++ b/nova/tests/api/rackspace/servers.py
@@ -15,6 +15,7 @@
# License for the specific language governing permissions and limitations
# under the License.
+import json
import unittest
import stubout
import nova.api.rackspace
@@ -35,7 +36,9 @@ def return_servers(context):
return [stub_instance(i) for i in xrange(5)]
def stub_instance(id):
- return Instance(id=id, state=0, )
+ return Instance(
+ id=id, state=0, image_id=10, server_name='server%s'%id
+ )
class ServersTest(unittest.TestCase):
def setUp(self):
@@ -53,9 +56,10 @@ class ServersTest(unittest.TestCase):
def test_get_server_by_id(self):
req = webob.Request.blank('/v1.0/servers/1')
- req.headers['content-type'] = 'application/json'
res = req.get_response(nova.api.API())
- print res
+ res_dict = json.loads(res.body)
+ self.assertEqual(res_dict['server']['id'], '1')
+ self.assertEqual(res_dict['server']['name'], 'server1')
def test_get_backup_schedule(self):
pass
@@ -63,30 +67,85 @@ class ServersTest(unittest.TestCase):
def test_get_server_list(self):
req = webob.Request.blank('/v1.0/servers')
res = req.get_response(nova.api.API())
- print res
+ res_dict = json.loads(res.body)
+
+ i = 0
+ for s in res_dict['servers']:
+ self.assertEqual(s['id'], i)
+ self.assertEqual(s['name'], 'server%d'%i)
+ self.assertEqual(s.get('imageId', None), None)
+ i += 1
def test_create_instance(self):
pass
- def test_get_server_details(self):
- req = webob.Request.blank('/v1.0/servers/detail')
- res = req.get_response(nova.api.API())
- print res
+ def test_update_server_password(self):
+ pass
- def test_get_server_ips(self):
+ def test_update_server_name(self):
pass
+ def test_create_backup_schedules(self):
+ req = webob.Request.blank('/v1.0/servers/1/backup_schedules')
+ req.method = 'POST'
+ res = req.get_response(nova.api.API())
+ self.assertEqual(res.status, '404 Not Found')
+
+ def test_delete_backup_schedules(self):
+ req = webob.Request.blank('/v1.0/servers/1/backup_schedules')
+ req.method = 'DELETE'
+ res = req.get_response(nova.api.API())
+ self.assertEqual(res.status, '404 Not Found')
+
+ def test_get_server_backup_schedules(self):
+ req = webob.Request.blank('/v1.0/servers/1/backup_schedules')
+ res = req.get_response(nova.api.API())
+ self.assertEqual(res.status, '404 Not Found')
+
+ def test_get_all_server_details(self):
+ req = webob.Request.blank('/v1.0/servers/detail')
+ res = req.get_response(nova.api.API())
+ res_dict = json.loads(res.body)
+
+ i = 0
+ for s in res_dict['servers']:
+ self.assertEqual(s['id'], i)
+ self.assertEqual(s['name'], 'server%d'%i)
+ self.assertEqual(s['imageId'], 10)
+ i += 1
+
def test_server_reboot(self):
- pass
+ req = webob.Request.blank('/v1.0/servers/1/action')
+ req.method = 'POST'
+ res = req.get_response(nova.api.API())
+ res_dict = json.loads(res.body)
def test_server_rebuild(self):
- pass
+ req = webob.Request.blank('/v1.0/servers/1/action')
+ req.method = 'POST'
+ res = req.get_response(nova.api.API())
+ res_dict = json.loads(res.body)
def test_server_resize(self):
- pass
+ req = webob.Request.blank('/v1.0/servers/1/action')
+ req.method = 'POST'
+ res = req.get_response(nova.api.API())
+ res_dict = json.loads(res.body)
def test_delete_server_instance(self):
- pass
+ req = webob.Request.blank('/v1.0/servers/1')
+ req.method = 'DELETE'
+
+ self.server_delete_called = False
+ def instance_destroy_mock(context, id):
+ self.server_delete_called = True
+
+ self.stubs.Set(nova.db.api, 'instance_destroy',
+ instance_destroy_mock)
+
+ res = req.get_response(nova.api.API())
+ self.assertEqual(res.status, '202 Accepted')
+ self.assertEqual(self.server_delete_called, True)
if __name__ == "__main__":
unittest.main()
diff --git a/nova/tests/api/rackspace/test_helper.py b/nova/tests/api/rackspace/test_helper.py
index 971eaf20a..d44b8c30e 100644
--- a/nova/tests/api/rackspace/test_helper.py
+++ b/nova/tests/api/rackspace/test_helper.py
@@ -31,6 +31,7 @@ def fake_auth_init(self):
@webob.dec.wsgify
def fake_wsgi(self, req):
+ req.environ['nova.context'] = dict(user=dict(id=1))
return self.application
def stub_out_auth(stubs):