expanding osapi flavors tests; rewriting flavors resource with view builders; adding 1.1 specific links to flavors resources

This commit is contained in:
Brian Waldon
2011-03-16 16:15:56 -04:00
parent f05e4d0cec
commit 77a48cdd8a
4 changed files with 167 additions and 35 deletions

View File

@@ -15,16 +15,12 @@
# License for the specific language governing permissions and limitations
# under the License.
from webob import exc
import webob
from nova import db
from nova import context
from nova.api.openstack import faults
from nova.api.openstack import common
from nova.compute import instance_types
from nova.api.openstack.views import flavors as flavors_views
from nova import exception
from nova import wsgi
import nova.api.openstack
from nova.api.openstack.views import flavors as flavors_views
class Controller(wsgi.Controller):
@@ -37,29 +33,31 @@ class Controller(wsgi.Controller):
def index(self, req):
"""Return all flavors in brief."""
return dict(flavors=[dict(id=flavor['id'], name=flavor['name'])
for flavor in self.detail(req)['flavors']])
items = self._get_flavors(req, False)
return dict(flavors=items)
def detail(self, req):
"""Return all flavors in detail."""
items = [self.show(req, id)['flavor'] for id in self._all_ids(req)]
items = self._get_flavors(req, True)
return dict(flavors=items)
def _get_flavors(self, req, is_detail):
"""Helper function that returns a list of flavor dicts."""
ctxt = req.environ['nova.context']
flavors = db.api.instance_type_get_all(ctxt)
builder = flavors_views.get_view_builder(req)
items = [builder.build(flavor, is_detail=is_detail) \
for flavor in flavors.values()]
return items
def show(self, req, id):
"""Return data about the given flavor id."""
ctxt = req.environ['nova.context']
flavor = db.api.instance_type_get_by_flavor_id(ctxt, id)
values = {
"id": flavor["flavorid"],
"name": flavor["name"],
"ram": flavor["memory_mb"],
"disk": flavor["local_gb"],
}
return dict(flavor=values)
try:
ctxt = req.environ['nova.context']
flavor = db.api.instance_type_get_by_flavor_id(ctxt, id)
except exception.NotFound:
return webob.exc.HTTPNotFound()
def _all_ids(self, req):
"""Return the list of all flavorids."""
ctxt = req.environ['nova.context']
inst_types = db.api.instance_type_get_all(ctxt)
flavor_ids = [inst_types[i]['flavorid'] for i in inst_types.keys()]
return sorted(flavor_ids)
builder = flavors_views.get_view_builder(req)
values = builder.build(flavor, is_detail=True)
return dict(flavor=values)

View File

@@ -35,14 +35,55 @@ class ViewBuilder(object):
def __init__(self):
pass
def build(self, flavor_obj):
raise NotImplementedError()
def build(self, flavor_obj, is_detail=False):
if is_detail:
flavor = self._build_detail(flavor_obj)
else:
flavor = self._build_simple(flavor_obj)
full_flavor = self._build_extra(flavor)
return full_flavor
def _build_simple(self, flavor_obj):
return {
"id": flavor_obj["flavorid"],
"name": flavor_obj["name"],
}
def _build_detail(self, flavor_obj):
simple = self._build_simple(flavor_obj)
detail = {
"ram": flavor_obj["memory_mb"],
"disk": flavor_obj["local_gb"],
}
detail.update(simple)
return detail
def _build_extra(self, flavor_obj):
return flavor_obj
class ViewBuilder_1_1(ViewBuilder):
def __init__(self, base_url):
self.base_url = base_url
def _build_extra(self, flavor_obj):
flavor_obj["links"] = self._build_links(flavor_obj)
return flavor_obj
def _build_links(self, flavor_obj):
links = [
{
"rel": "self",
"href": self.generate_href(flavor_obj["id"]),
},
]
return links
def generate_href(self, flavor_id):
return "%s/flavors/%s" % (self.base_url, flavor_id)

View File

@@ -2356,7 +2356,7 @@ def instance_type_get_by_flavor_id(context, id):
filter_by(flavorid=int(id)).\
first()
if not inst_type:
raise exception.NotFound(_("No flavor with name %s") % id)
raise exception.NotFound(_("No flavor with flavorid %s") % id)
else:
return dict(inst_type)

View File

@@ -19,11 +19,10 @@ import json
import stubout
import webob
from nova import test
import nova.api
import nova.db.api
from nova import context
from nova.api.openstack import flavors
from nova import db
from nova import exception
from nova import test
from nova.tests.api.openstack import fakes
@@ -47,6 +46,9 @@ def return_instance_types(context, num=2):
instance_types[name] = stub_flavor(i, name)
return instance_types
def return_instance_type_not_found(context, flavorid):
raise exception.NotFound()
class FlavorsTest(test.TestCase):
def setUp(self):
@@ -67,7 +69,7 @@ class FlavorsTest(test.TestCase):
self.stubs.UnsetAll()
super(FlavorsTest, self).tearDown()
def test_get_flavor_list(self):
def test_get_flavor_list_v1_0(self):
req = webob.Request.blank('/v1.0/flavors')
res = req.get_response(fakes.wsgi_app())
self.assertEqual(res.status_int, 200)
@@ -84,7 +86,7 @@ class FlavorsTest(test.TestCase):
]
self.assertEqual(flavors, expected)
def test_get_flavor_list_detail(self):
def test_get_flavor_list_detail_v1_0(self):
req = webob.Request.blank('/v1.0/flavors/detail')
res = req.get_response(fakes.wsgi_app())
self.assertEqual(res.status_int, 200)
@@ -105,7 +107,7 @@ class FlavorsTest(test.TestCase):
]
self.assertEqual(flavors, expected)
def test_get_flavor_by_id(self):
def test_get_flavor_by_id_v1_0(self):
req = webob.Request.blank('/v1.0/flavors/12')
res = req.get_response(fakes.wsgi_app())
self.assertEqual(res.status_int, 200)
@@ -117,3 +119,94 @@ class FlavorsTest(test.TestCase):
"disk": "10",
}
self.assertEqual(flavor, expected)
def test_get_flavor_by_invalid_id(self):
self.stubs.Set(nova.db.api, "instance_type_get_by_flavor_id",
return_instance_type_not_found)
req = webob.Request.blank('/v1.0/flavors/asdf')
res = req.get_response(fakes.wsgi_app())
self.assertEqual(res.status_int, 404)
def test_get_flavor_by_id_v1_1(self):
req = webob.Request.blank('/v1.1/flavors/12')
req.environ['api.version'] = '1.1'
res = req.get_response(fakes.wsgi_app())
self.assertEqual(res.status_int, 200)
flavor = json.loads(res.body)["flavor"]
expected = {
"id": "12",
"name": "flavor 12",
"ram": "256",
"disk": "10",
"links": [
{
"rel": "self",
"href": "http://localhost/v1.1/flavors/12",
},
],
}
self.assertEqual(flavor, expected)
def test_get_flavor_list_v1_1(self):
req = webob.Request.blank('/v1.1/flavors')
req.environ['api.version'] = '1.1'
res = req.get_response(fakes.wsgi_app())
self.assertEqual(res.status_int, 200)
flavor = json.loads(res.body)["flavors"]
expected = [
{
"id": "1",
"name": "flavor 1",
"links": [
{
"rel": "self",
"href": "http://localhost/v1.1/flavors/1",
},
],
},
{
"id": "2",
"name": "flavor 2",
"links": [
{
"rel": "self",
"href": "http://localhost/v1.1/flavors/2",
},
],
},
]
self.assertEqual(flavor, expected)
def test_get_flavor_list_detail_v1_1(self):
req = webob.Request.blank('/v1.1/flavors/detail')
req.environ['api.version'] = '1.1'
res = req.get_response(fakes.wsgi_app())
self.assertEqual(res.status_int, 200)
flavor = json.loads(res.body)["flavors"]
expected = [
{
"id": "1",
"name": "flavor 1",
"ram": "256",
"disk": "10",
"links": [
{
"rel": "self",
"href": "http://localhost/v1.1/flavors/1",
},
],
},
{
"id": "2",
"name": "flavor 2",
"ram": "256",
"disk": "10",
"links": [
{
"rel": "self",
"href": "http://localhost/v1.1/flavors/2",
},
],
},
]
self.assertEqual(flavor, expected)