expanding osapi flavors tests; rewriting flavors resource with view builders; adding 1.1 specific links to flavors resources
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user