Change v3 flavor_manage API to v2.1

This patch changes v3 flavor_manage API to v2.1 and makes v2 unit tests
share between v2 and v2.1.
This patch removes test_create_flavor_name_with_leading_trailing_whitespace
because v2.1 API contains consistent name rule for whole of API request and
the name which contain spaces at the start/end of name is against the rule.

The differences between v2 and v3 are described on the wiki page
https://wiki.openstack.org/wiki/NovaAPIv2tov3 .

Partially implements blueprint v2-on-v3-api

Change-Id: I57ca2562cb02ce5a35c4596e4c5a753d1268493f
This commit is contained in:
Ghanshyam 2014-09-02 22:51:30 +09:00 committed by Ken'ichi Ohmichi
parent 58f4056578
commit 2a81337a8d
37 changed files with 313 additions and 645 deletions

View File

@ -1,9 +1,5 @@
{
"flavor_access": [
{
"flavor_id": "10",
"tenant_id": "openstack"
},
{
"flavor_id": "10",
"tenant_id": "fake_tenant"

View File

@ -1,8 +1,8 @@
{
"flavor": {
"disabled": false,
"OS-FLV-DISABLED:disabled": false,
"disk": 10,
"ephemeral": 0,
"OS-FLV-EXT-DATA:ephemeral": 0,
"os-flavor-access:is_public": false,
"id": "10",
"links": [
@ -17,7 +17,7 @@
],
"name": "test_flavor",
"ram": 1024,
"swap": 0,
"swap": "",
"vcpus": 2
}
}

View File

@ -1,9 +1,9 @@
{
"flavors": [
{
"disabled": false,
"OS-FLV-DISABLED:disabled": false,
"disk": 1,
"ephemeral": 0,
"OS-FLV-EXT-DATA:ephemeral": 0,
"os-flavor-access:is_public": true,
"id": "1",
"links": [
@ -18,13 +18,13 @@
],
"name": "m1.tiny",
"ram": 512,
"swap": 0,
"swap": "",
"vcpus": 1
},
{
"disabled": false,
"OS-FLV-DISABLED:disabled": false,
"disk": 20,
"ephemeral": 0,
"OS-FLV-EXT-DATA:ephemeral": 0,
"os-flavor-access:is_public": true,
"id": "2",
"links": [
@ -39,13 +39,13 @@
],
"name": "m1.small",
"ram": 2048,
"swap": 0,
"swap": "",
"vcpus": 1
},
{
"disabled": false,
"OS-FLV-DISABLED:disabled": false,
"disk": 40,
"ephemeral": 0,
"OS-FLV-EXT-DATA:ephemeral": 0,
"os-flavor-access:is_public": true,
"id": "3",
"links": [
@ -60,13 +60,13 @@
],
"name": "m1.medium",
"ram": 4096,
"swap": 0,
"swap": "",
"vcpus": 2
},
{
"disabled": false,
"OS-FLV-DISABLED:disabled": false,
"disk": 80,
"ephemeral": 0,
"OS-FLV-EXT-DATA:ephemeral": 0,
"os-flavor-access:is_public": true,
"id": "4",
"links": [
@ -81,13 +81,13 @@
],
"name": "m1.large",
"ram": 8192,
"swap": 0,
"swap": "",
"vcpus": 4
},
{
"disabled": false,
"OS-FLV-DISABLED:disabled": false,
"disk": 160,
"ephemeral": 0,
"OS-FLV-EXT-DATA:ephemeral": 0,
"os-flavor-access:is_public": true,
"id": "5",
"links": [
@ -102,7 +102,7 @@
],
"name": "m1.xlarge",
"ram": 16384,
"swap": 0,
"swap": "",
"vcpus": 8
}
]

View File

@ -1,9 +1,5 @@
{
"flavor_access": [
{
"flavor_id": "10",
"tenant_id": "openstack"
},
{
"flavor_id": "10",
"tenant_id": "fake_tenant"

View File

@ -1,8 +1,4 @@
{
"flavor_access": [
{
"flavor_id": "10",
"tenant_id": "openstack"
}
]
}

View File

@ -1,8 +1,8 @@
{
"flavor": {
"disabled": false,
"OS-FLV-DISABLED:disabled": false,
"disk": 1,
"ephemeral": 0,
"OS-FLV-EXT-DATA:ephemeral": 0,
"os-flavor-access:is_public": true,
"id": "1",
"links": [
@ -17,7 +17,7 @@
],
"name": "m1.tiny",
"ram": 512,
"swap": 0,
"swap": "",
"vcpus": 1
}
}

View File

@ -6,4 +6,4 @@
"disk": 10,
"id": "10"
}
}
}

View File

@ -1,8 +1,8 @@
{
"flavor": {
"disabled": false,
"OS-FLV-DISABLED:disabled": false,
"disk": 10,
"ephemeral": 0,
"OS-FLV-EXT-DATA:ephemeral": 0,
"os-flavor-access:is_public": true,
"id": "10",
"links": [
@ -17,7 +17,7 @@
],
"name": "test_flavor",
"ram": 1024,
"swap": 0,
"swap": "",
"vcpus": 2
}
}

View File

@ -1,8 +1,8 @@
{
"flavor": {
"disabled": false,
"OS-FLV-DISABLED:disabled": false,
"disk": 1,
"ephemeral": 0,
"OS-FLV-EXT-DATA:ephemeral": 0,
"os-flavor-access:is_public": true,
"id": "1",
"links": [
@ -17,7 +17,7 @@
],
"name": "m1.tiny",
"ram": 512,
"swap": 0,
"swap": "",
"vcpus": 1
}
}

View File

@ -1,9 +1,9 @@
{
"flavors": [
{
"disabled": false,
"OS-FLV-DISABLED:disabled": false,
"disk": 1,
"ephemeral": 0,
"OS-FLV-EXT-DATA:ephemeral": 0,
"os-flavor-access:is_public": true,
"id": "1",
"links": [
@ -18,13 +18,13 @@
],
"name": "m1.tiny",
"ram": 512,
"swap": 0,
"swap": "",
"vcpus": 1
},
{
"disabled": false,
"OS-FLV-DISABLED:disabled": false,
"disk": 20,
"ephemeral": 0,
"OS-FLV-EXT-DATA:ephemeral": 0,
"os-flavor-access:is_public": true,
"id": "2",
"links": [
@ -39,13 +39,13 @@
],
"name": "m1.small",
"ram": 2048,
"swap": 0,
"swap": "",
"vcpus": 1
},
{
"disabled": false,
"OS-FLV-DISABLED:disabled": false,
"disk": 40,
"ephemeral": 0,
"OS-FLV-EXT-DATA:ephemeral": 0,
"os-flavor-access:is_public": true,
"id": "3",
"links": [
@ -60,13 +60,13 @@
],
"name": "m1.medium",
"ram": 4096,
"swap": 0,
"swap": "",
"vcpus": 2
},
{
"disabled": false,
"OS-FLV-DISABLED:disabled": false,
"disk": 80,
"ephemeral": 0,
"OS-FLV-EXT-DATA:ephemeral": 0,
"os-flavor-access:is_public": true,
"id": "4",
"links": [
@ -81,13 +81,13 @@
],
"name": "m1.large",
"ram": 8192,
"swap": 0,
"swap": "",
"vcpus": 4
},
{
"disabled": false,
"OS-FLV-DISABLED:disabled": false,
"disk": 160,
"ephemeral": 0,
"OS-FLV-EXT-DATA:ephemeral": 0,
"os-flavor-access:is_public": true,
"id": "5",
"links": [
@ -102,7 +102,7 @@
],
"name": "m1.xlarge",
"ram": 16384,
"swap": 0,
"swap": "",
"vcpus": 8
}
]

View File

@ -1,8 +1,8 @@
{
"flavor": {
"disabled": false,
"OS-FLV-DISABLED:disabled": false,
"disk": 1,
"ephemeral": 0,
"OS-FLV-EXT-DATA:ephemeral": 0,
"os-flavor-access:is_public": true,
"id": "1",
"links": [
@ -18,7 +18,7 @@
"name": "m1.tiny",
"ram": 512,
"rxtx_factor": 1.0,
"swap": 0,
"swap": "",
"vcpus": 1
}
}

View File

@ -1,9 +1,9 @@
{
"flavors": [
{
"disabled": false,
"OS-FLV-DISABLED:disabled": false,
"disk": 1,
"ephemeral": 0,
"OS-FLV-EXT-DATA:ephemeral": 0,
"os-flavor-access:is_public": true,
"id": "1",
"links": [
@ -19,13 +19,13 @@
"name": "m1.tiny",
"ram": 512,
"rxtx_factor": 1.0,
"swap": 0,
"swap": "",
"vcpus": 1
},
{
"disabled": false,
"OS-FLV-DISABLED:disabled": false,
"disk": 20,
"ephemeral": 0,
"OS-FLV-EXT-DATA:ephemeral": 0,
"os-flavor-access:is_public": true,
"id": "2",
"links": [
@ -41,13 +41,13 @@
"name": "m1.small",
"ram": 2048,
"rxtx_factor": 1.0,
"swap": 0,
"swap": "",
"vcpus": 1
},
{
"disabled": false,
"OS-FLV-DISABLED:disabled": false,
"disk": 40,
"ephemeral": 0,
"OS-FLV-EXT-DATA:ephemeral": 0,
"os-flavor-access:is_public": true,
"id": "3",
"links": [
@ -63,13 +63,13 @@
"name": "m1.medium",
"ram": 4096,
"rxtx_factor": 1.0,
"swap": 0,
"swap": "",
"vcpus": 2
},
{
"disabled": false,
"OS-FLV-DISABLED:disabled": false,
"disk": 80,
"ephemeral": 0,
"OS-FLV-EXT-DATA:ephemeral": 0,
"os-flavor-access:is_public": true,
"id": "4",
"links": [
@ -85,13 +85,13 @@
"name": "m1.large",
"ram": 8192,
"rxtx_factor": 1.0,
"swap": 0,
"swap": "",
"vcpus": 4
},
{
"disabled": false,
"OS-FLV-DISABLED:disabled": false,
"disk": 160,
"ephemeral": 0,
"OS-FLV-EXT-DATA:ephemeral": 0,
"os-flavor-access:is_public": true,
"id": "5",
"links": [
@ -107,7 +107,7 @@
"name": "m1.xlarge",
"ram": 16384,
"rxtx_factor": 1.0,
"swap": 0,
"swap": "",
"vcpus": 8
}
]

View File

@ -1,8 +1,8 @@
{
"flavor": {
"disabled": false,
"OS-FLV-DISABLED:disabled": false,
"disk": 10,
"ephemeral": 0,
"OS-FLV-EXT-DATA:ephemeral": 0,
"os-flavor-access:is_public": true,
"id": "100",
"links": [
@ -18,7 +18,7 @@
"name": "flavortest",
"ram": 1024,
"rxtx_factor": 2.0,
"swap": 0,
"swap": "",
"vcpus": 2
}
}

View File

@ -46,9 +46,13 @@ class FlavorManageController(wsgi.Controller):
flavors.destroy(flavor['name'])
return webob.Response(status_int=204)
# NOTE(oomichi): Return 202 for backwards compatibility but should be
# 204 as this operation complete the deletion of aggregate resource and
# return no response body.
return webob.Response(status_int=202)
@wsgi.response(201)
# NOTE(oomichi): Return 200 for backwards compatibility but should be 201
# as this operation complete the creation of flavor resource.
@wsgi.action("create")
@extensions.expected_errors((400, 409, 500))
@validation.schema(flavor_manage.create)
@ -63,7 +67,7 @@ class FlavorManageController(wsgi.Controller):
memory = vals['ram']
vcpus = vals['vcpus']
root_gb = vals['disk']
ephemeral_gb = vals.get('ephemeral', 0)
ephemeral_gb = vals.get('OS-FLV-EXT-DATA:ephemeral', 0)
swap = vals.get('swap', 0)
rxtx_factor = vals.get('rxtx_factor', 1.0)
is_public = vals.get('os-flavor-access:is_public', True)
@ -74,9 +78,8 @@ class FlavorManageController(wsgi.Controller):
flavorid=flavorid, swap=swap,
rxtx_factor=rxtx_factor,
is_public=is_public)
if not flavor['is_public']:
flavors.add_flavor_access(flavor['flavorid'],
context.project_id, context)
# NOTE(gmann): For backward compatibility, non public flavor
# access is not being added for created tenant. Ref -bug/1209101
req.cache_db_flavor(flavor)
except (exception.FlavorExists,
exception.FlavorIdExists) as err:

View File

@ -44,7 +44,7 @@ create = {
'pattern': '^[0-9]*$', 'minimum': 0
},
# non-negative ( >= 0) integer
'ephemeral': {
'OS-FLV-EXT-DATA:ephemeral': {
'type': ['integer', 'string'],
'pattern': '^[0-9]*$', 'minimum': 0
},

View File

@ -74,9 +74,9 @@ class V3ViewBuilder(ViewBuilder):
def show(self, request, flavor):
flavor_dict = super(V3ViewBuilder, self).show(request, flavor)
flavor_dict['flavor'].update({
"swap": flavor["swap"],
"ephemeral": flavor["ephemeral_gb"],
"disabled": flavor["disabled"],
"swap": flavor["swap"] or "",
"OS-FLV-EXT-DATA:ephemeral": flavor["ephemeral_gb"],
"OS-FLV-DISABLED:disabled": flavor["disabled"],
"vcpus": flavor["vcpus"],
})
return flavor_dict

View File

@ -27,6 +27,9 @@ FAKE_FLAVORS = {
"name": 'flavor 1',
"memory_mb": '256',
"root_gb": '10',
"swap": 512,
"vcpus": 1,
"ephemeral_gb": 1,
"disabled": False,
},
'flavor 2': {
@ -34,6 +37,9 @@ FAKE_FLAVORS = {
"name": 'flavor 2',
"memory_mb": '512',
"root_gb": '20',
"swap": None,
"vcpus": 1,
"ephemeral_gb": 1,
"disabled": True,
},
}
@ -52,12 +58,13 @@ def fake_get_all_flavors_sorted_list(context=None, inactive=False,
]
class FlavorDisabledTest(test.NoDBTestCase):
class FlavorDisabledTestV21(test.NoDBTestCase):
base_url = '/v3/flavors'
content_type = 'application/json'
prefix = '%s:' % flavor_disabled.Flavor_disabled.alias
prefix = "OS-FLV-DISABLED:"
def setUp(self):
super(FlavorDisabledTest, self).setUp()
super(FlavorDisabledTestV21, self).setUp()
ext = ('nova.api.openstack.compute.contrib'
'.flavor_disabled.Flavor_disabled')
self.flags(osapi_compute_extension=[ext])
@ -71,7 +78,7 @@ class FlavorDisabledTest(test.NoDBTestCase):
def _make_request(self, url):
req = webob.Request.blank(url)
req.headers['Accept'] = self.content_type
res = req.get_response(fakes.wsgi_app())
res = req.get_response(fakes.wsgi_app_v3(init_only=('flavors')))
return res
def _get_flavor(self, body):
@ -84,14 +91,14 @@ class FlavorDisabledTest(test.NoDBTestCase):
self.assertEqual(str(flavor.get('%sdisabled' % self.prefix)), disabled)
def test_show(self):
url = '/v2/fake/flavors/1'
url = self.base_url + '/1'
res = self._make_request(url)
self.assertEqual(res.status_int, 200)
self.assertFlavorDisabled(self._get_flavor(res.body), 'False')
def test_detail(self):
url = '/v2/fake/flavors/detail'
url = self.base_url + '/detail'
res = self._make_request(url)
self.assertEqual(res.status_int, 200)
@ -100,7 +107,17 @@ class FlavorDisabledTest(test.NoDBTestCase):
self.assertFlavorDisabled(flavors[1], 'True')
class FlavorDisabledXmlTest(FlavorDisabledTest):
class FlavorDisabledTestV2(FlavorDisabledTestV21):
base_url = '/v2/fake/flavors'
def _make_request(self, url):
req = webob.Request.blank(url)
req.headers['Accept'] = self.content_type
res = req.get_response(fakes.wsgi_app())
return res
class FlavorDisabledXmlTest(FlavorDisabledTestV2):
content_type = 'application/xml'
prefix = '{%s}' % flavor_disabled.Flavor_disabled.namespace

View File

@ -19,7 +19,9 @@ import mock
import webob
from nova.api.openstack.compute.contrib import flavor_access
from nova.api.openstack.compute.contrib import flavormanage
from nova.api.openstack.compute.contrib import flavormanage as flavormanage_v2
from nova.api.openstack.compute.plugins.v3 import flavor_manage as \
flavormanage_v21
from nova.compute import flavors
from nova import context
from nova import db
@ -76,26 +78,26 @@ def fake_create(context, kwargs):
newflavor["swap"] = kwargs.get('swap')
newflavor["rxtx_factor"] = float(kwargs.get('rxtx_factor'))
newflavor["is_public"] = bool(kwargs.get('is_public'))
newflavor["disabled"] = bool(kwargs.get('disabled'))
return newflavor
class FlavorManageTest(test.NoDBTestCase):
class FlavorManageTestV21(test.NoDBTestCase):
controller = flavormanage_v21.FlavorManageController()
validation_error = exception.ValidationError
base_url = '/v3/flavors'
def setUp(self):
super(FlavorManageTest, self).setUp()
super(FlavorManageTestV21, self).setUp()
self.stubs.Set(flavors,
"get_flavor_by_flavor_id",
fake_get_flavor_by_flavor_id)
self.stubs.Set(flavors, "destroy", fake_destroy)
self.stubs.Set(db, "flavor_create", fake_create)
self.flags(
osapi_compute_extension=[
'nova.api.openstack.compute.contrib.select_extensions'],
osapi_compute_ext_list=['Flavormanage', 'Flavorextradata',
'Flavor_access', 'Flavor_rxtx', 'Flavor_swap'])
self.controller = flavormanage.FlavorManageController()
self.app = fakes.wsgi_app(init_only=('flavors',))
self.ctxt = context.RequestContext('fake', 'fake',
is_admin=True, auth_token=True)
self.app = self._setup_app()
self.request_body = {
"flavor": {
@ -112,8 +114,13 @@ class FlavorManageTest(test.NoDBTestCase):
}
self.expected_flavor = self.request_body
def _setup_app(self):
return fakes.wsgi_app_v3(init_only=('flavor-manage', 'os-flavor-rxtx',
'os-flavor-access', 'flavors',
'os-flavor-extra-data'))
def test_delete(self):
req = fakes.HTTPRequest.blank('/v2/123/flavors/1234')
req = fakes.HTTPRequest.blank(self.base_url + '/1234')
res = self.controller._delete(req, 1234)
self.assertEqual(res.status_int, 202)
@ -138,9 +145,9 @@ class FlavorManageTest(test.NoDBTestCase):
del body['flavor'][parameter]
req = fakes.HTTPRequest.blank('/v2/123/flavors')
self.assertRaises(webob.exc.HTTPBadRequest, self.controller._create,
req, body)
req = fakes.HTTPRequest.blank(self.base_url)
self.assertRaises(self.validation_error, self.controller._create,
req, body=body)
def test_create_missing_name(self):
self._test_create_missing_parameter('name')
@ -155,8 +162,7 @@ class FlavorManageTest(test.NoDBTestCase):
self._test_create_missing_parameter('disk')
def _create_flavor_success_case(self, body):
url = '/v2/fake/flavors'
req = webob.Request.blank(url)
req = webob.Request.blank(self.base_url)
req.headers['Content-Type'] = 'application/json'
req.method = 'POST'
req.body = jsonutils.dumps(body)
@ -177,11 +183,6 @@ class FlavorManageTest(test.NoDBTestCase):
self.assertEqual(body["flavor"][key],
self.expected_flavor["flavor"][key])
def test_create_flavor_name_with_leading_trailing_whitespace(self):
self.request_body['flavor']['name'] = " test "
body = self._create_flavor_success_case(self.request_body)
self.assertEqual("test", body["flavor"]["name"])
def test_create_without_flavorid(self):
del self.request_body['flavor']['id']
body = self._create_flavor_success_case(self.request_body)
@ -192,8 +193,7 @@ class FlavorManageTest(test.NoDBTestCase):
def _create_flavor_bad_request_case(self, body):
self.stubs.UnsetAll()
url = '/v2/fake/flavors'
req = webob.Request.blank(url)
req = webob.Request.blank(self.base_url)
req.headers['Content-Type'] = 'application/json'
req.method = 'POST'
req.body = jsonutils.dumps(body)
@ -305,8 +305,7 @@ class FlavorManageTest(test.NoDBTestCase):
raise exception.FlavorExists(name=name)
self.stubs.Set(flavors, "create", fake_create)
url = '/v2/fake/flavors'
req = webob.Request.blank(url)
req = webob.Request.blank(self.base_url)
req.headers['Content-Type'] = 'application/json'
req.method = 'POST'
req.body = jsonutils.dumps(expected)
@ -318,7 +317,7 @@ class FlavorManageTest(test.NoDBTestCase):
def test_flavor_create_db_failed(self, mock_create):
request_dict = {
"flavor": {
"name": " test ",
"name": "test",
'id': "12345",
"ram": 512,
"vcpus": 2,
@ -329,8 +328,7 @@ class FlavorManageTest(test.NoDBTestCase):
"os-flavor-access:is_public": True,
}
}
url = '/v2/fake/flavors'
req = webob.Request.blank(url)
req = webob.Request.blank(self.base_url)
req.headers['Content-Type'] = 'application/json'
req.method = 'POST'
req.body = jsonutils.dumps(request_dict)
@ -358,21 +356,16 @@ class FakeRequest(object):
environ = {"nova.context": context.get_admin_context()}
class PrivateFlavorManageTest(test.TestCase):
def setUp(self):
super(PrivateFlavorManageTest, self).setUp()
self.flags(
osapi_compute_extension=[
'nova.api.openstack.compute.contrib.select_extensions'],
osapi_compute_ext_list=['Flavormanage', 'Flavorextradata',
'Flavor_access', 'Flavor_rxtx', 'Flavor_swap'])
class PrivateFlavorManageTestV21(test.TestCase):
controller = flavormanage_v21.FlavorManageController()
base_url = '/v3/flavors'
self.controller = flavormanage.FlavorManageController()
def setUp(self):
super(PrivateFlavorManageTestV21, self).setUp()
self.flavor_access_controller = flavor_access.FlavorAccessController()
self.ctxt = context.RequestContext('fake', 'fake',
is_admin=True, auth_token=True)
self.app = fakes.wsgi_app(init_only=('flavors',),
fake_auth_context=self.ctxt)
self.app = self._setup_app()
self.expected = {
"flavor": {
"name": "test",
@ -385,9 +378,15 @@ class PrivateFlavorManageTest(test.TestCase):
}
}
def _setup_app(self):
return fakes.wsgi_app_v3(init_only=('flavor-manage',
'os-flavor-access',
'os-flavor-rxtx', 'flavors',
'os-flavor-extra-data'),
fake_auth_context=self.ctxt)
def _get_response(self):
url = '/v2/fake/flavors'
req = webob.Request.blank(url)
req = webob.Request.blank(self.base_url)
req.headers['Content-Type'] = 'application/json'
req.method = 'POST'
req.body = jsonutils.dumps(self.expected)
@ -415,3 +414,38 @@ class PrivateFlavorManageTest(test.TestCase):
body = self._get_response()
for key in self.expected["flavor"]:
self.assertEqual(body["flavor"][key], self.expected["flavor"][key])
class FlavorManageTestV2(FlavorManageTestV21):
controller = flavormanage_v2.FlavorManageController()
validation_error = webob.exc.HTTPBadRequest
base_url = '/v2/fake/flavors'
def setUp(self):
super(FlavorManageTestV2, self).setUp()
self.flags(
osapi_compute_extension=[
'nova.api.openstack.compute.contrib.select_extensions'],
osapi_compute_ext_list=['Flavormanage', 'Flavorextradata',
'Flavor_access', 'Flavor_rxtx', 'Flavor_swap'])
def _setup_app(self):
return fakes.wsgi_app(init_only=('flavors',),
fake_auth_context=self.ctxt)
class PrivateFlavorManageTestV2(PrivateFlavorManageTestV21):
controller = flavormanage_v2.FlavorManageController()
base_url = '/v2/fake/flavors'
def setUp(self):
super(PrivateFlavorManageTestV2, self).setUp()
self.flags(
osapi_compute_extension=[
'nova.api.openstack.compute.contrib.select_extensions'],
osapi_compute_ext_list=['Flavormanage', 'Flavorextradata',
'Flavor_access', 'Flavor_rxtx', 'Flavor_swap'])
def _setup_app(self):
return fakes.wsgi_app(init_only=('flavors',),
fake_auth_context=self.ctxt)

View File

@ -27,6 +27,9 @@ FAKE_FLAVORS = {
"memory_mb": '256',
"root_gb": '10',
"swap": 512,
"vcpus": 1,
"ephemeral_gb": 1,
"disabled": False,
},
'flavor 2': {
"flavorid": '2',
@ -34,6 +37,9 @@ FAKE_FLAVORS = {
"memory_mb": '512',
"root_gb": '10',
"swap": None,
"vcpus": 1,
"ephemeral_gb": 1,
"disabled": False,
},
}
@ -52,12 +58,13 @@ def fake_get_all_flavors_sorted_list(context=None, inactive=False,
]
class FlavorSwapTest(test.NoDBTestCase):
class FlavorSwapTestV21(test.NoDBTestCase):
base_url = '/v3/flavors'
content_type = 'application/json'
prefix = ''
def setUp(self):
super(FlavorSwapTest, self).setUp()
super(FlavorSwapTestV21, self).setUp()
ext = ('nova.api.openstack.compute.contrib'
'.flavor_swap.Flavor_swap')
self.flags(osapi_compute_extension=[ext])
@ -71,7 +78,7 @@ class FlavorSwapTest(test.NoDBTestCase):
def _make_request(self, url):
req = webob.Request.blank(url)
req.headers['Accept'] = self.content_type
res = req.get_response(fakes.wsgi_app())
res = req.get_response(fakes.wsgi_app_v3(init_only=('flavors')))
return res
def _get_flavor(self, body):
@ -84,14 +91,14 @@ class FlavorSwapTest(test.NoDBTestCase):
self.assertEqual(str(flavor.get('%sswap' % self.prefix)), swap)
def test_show(self):
url = '/v2/fake/flavors/1'
url = self.base_url + '/1'
res = self._make_request(url)
self.assertEqual(res.status_int, 200)
self.assertFlavorSwap(self._get_flavor(res.body), '512')
def test_detail(self):
url = '/v2/fake/flavors/detail'
url = self.base_url + '/detail'
res = self._make_request(url)
self.assertEqual(res.status_int, 200)
@ -100,7 +107,17 @@ class FlavorSwapTest(test.NoDBTestCase):
self.assertFlavorSwap(flavors[1], '')
class FlavorSwapXmlTest(FlavorSwapTest):
class FlavorSwapTestV2(FlavorSwapTestV21):
base_url = '/v2/fake/flavors'
def _make_request(self, url):
req = webob.Request.blank(url)
req.headers['Accept'] = self.content_type
res = req.get_response(fakes.wsgi_app())
return res
class FlavorSwapXmlTest(FlavorSwapTestV2):
content_type = 'application/xml'
def _get_flavor(self, body):

View File

@ -38,6 +38,8 @@ def fake_get_flavor_by_flavor_id(flavorid, ctxt=None):
'extra_specs': {},
'deleted_at': None,
'vcpu_weight': None,
'swap': 0,
'disabled': False,
}
@ -50,9 +52,11 @@ def fake_get_all_flavors_sorted_list(context=None, inactive=False,
]
class FlavorextradataTest(test.NoDBTestCase):
class FlavorExtraDataTestV21(test.NoDBTestCase):
base_url = '/v3/flavors'
def setUp(self):
super(FlavorextradataTest, self).setUp()
super(FlavorExtraDataTestV21, self).setUp()
ext = ('nova.api.openstack.compute.contrib'
'.flavorextradata.Flavorextradata')
self.flags(osapi_compute_extension=[ext])
@ -60,6 +64,10 @@ class FlavorextradataTest(test.NoDBTestCase):
fake_get_flavor_by_flavor_id)
self.stubs.Set(flavors, 'get_all_flavors_sorted_list',
fake_get_all_flavors_sorted_list)
self._setup_app()
def _setup_app(self):
self.app = fakes.wsgi_app_v3(init_only=('flavors'))
def _verify_flavor_response(self, flavor, expected):
for key in expected:
@ -77,10 +85,10 @@ class FlavorextradataTest(test.NoDBTestCase):
}
}
url = '/v2/fake/flavors/1'
url = self.base_url + '/1'
req = webob.Request.blank(url)
req.headers['Content-Type'] = 'application/json'
res = req.get_response(fakes.wsgi_app(init_only=('flavors',)))
res = req.get_response(self.app)
body = jsonutils.loads(res.body)
self._verify_flavor_response(body['flavor'], expected['flavor'])
@ -104,10 +112,17 @@ class FlavorextradataTest(test.NoDBTestCase):
},
]
url = '/v2/fake/flavors/detail'
url = self.base_url + '/detail'
req = webob.Request.blank(url)
req.headers['Content-Type'] = 'application/json'
res = req.get_response(fakes.wsgi_app(init_only=('flavors',)))
res = req.get_response(self.app)
body = jsonutils.loads(res.body)
for i, flavor in enumerate(body['flavors']):
self._verify_flavor_response(flavor, expected[i])
class FlavorExtraDataTestV2(FlavorExtraDataTestV21):
base_url = '/v2/fake/flavors'
def _setup_app(self):
self.app = fakes.wsgi_app(init_only=('flavors',))

View File

@ -1,391 +0,0 @@
# Copyright 2011 Andrew Bogott for the Wikimedia Foundation
# 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 copy
import datetime
import mock
import webob
from nova.api.openstack.compute.plugins.v3 import flavor_access
from nova.api.openstack.compute.plugins.v3 import flavor_manage
from nova.compute import flavors
from nova import context
from nova import db
from nova import exception
from nova.openstack.common import jsonutils
from nova import test
from nova.tests.api.openstack import fakes
def fake_get_flavor_by_flavor_id(flavorid, ctxt=None, read_deleted='yes'):
if flavorid == 'failtest':
raise exception.FlavorNotFound("Not found!")
elif not str(flavorid) == '1234':
raise Exception("This test expects flavorid 1234, not %s" % flavorid)
if read_deleted != 'no':
raise test.TestingException("Should not be reading deleted")
return {
'root_gb': 1,
'ephemeral_gb': 1,
'name': u'frob',
'deleted': False,
'created_at': datetime.datetime(2012, 1, 19, 18, 49, 30, 877329),
'updated_at': None,
'memory_mb': 256,
'vcpus': 1,
'flavorid': flavorid,
'swap': 0,
'rxtx_factor': 1.0,
'extra_specs': {},
'deleted_at': None,
'vcpu_weight': None,
'id': 7,
'is_public': True,
'disabled': False,
}
def fake_destroy(flavorname):
pass
def fake_create(context, kwargs):
flavorid = kwargs.get('flavorid')
if flavorid is None:
flavorid = 1234
newflavor = {'flavorid': flavorid}
newflavor["name"] = kwargs.get('name')
newflavor["memory_mb"] = int(kwargs.get('memory_mb'))
newflavor["vcpus"] = int(kwargs.get('vcpus'))
newflavor["root_gb"] = int(kwargs.get('root_gb'))
newflavor["ephemeral_gb"] = int(kwargs.get('ephemeral_gb'))
newflavor["swap"] = kwargs.get('swap')
newflavor["rxtx_factor"] = float(kwargs.get('rxtx_factor'))
newflavor["is_public"] = bool(kwargs.get('is_public'))
newflavor["disabled"] = bool(kwargs.get('disabled'))
return newflavor
class FlavorManageTest(test.NoDBTestCase):
def setUp(self):
super(FlavorManageTest, self).setUp()
self.stubs.Set(flavors,
"get_flavor_by_flavor_id",
fake_get_flavor_by_flavor_id)
self.stubs.Set(flavors, "destroy", fake_destroy)
self.stubs.Set(db, "flavor_create", fake_create)
self.controller = flavor_manage.FlavorManageController()
self.app = fakes.wsgi_app_v3(init_only=('servers', 'flavors',
'flavor-manage',
'os-flavor-rxtx',
'os-flavor-access'))
self.base_request_dict = {
"flavor": {
"name": "test",
"ram": 512,
"vcpus": 2,
"disk": 1,
"ephemeral": 1,
"id": unicode('1234'),
"swap": 512,
"rxtx_factor": 1,
"os-flavor-access:is_public": True,
}
}
self.expected_flavor = {
"flavor": {
"name": "test",
"ram": 512,
"vcpus": 2,
"disk": 1,
"ephemeral": 1,
"id": unicode('1234'),
"swap": 512,
"rxtx_factor": 1,
"os-flavor-access:is_public": True,
}
}
def test_delete(self):
req = fakes.HTTPRequestV3.blank('/flavors/1234')
res = self.controller._delete(req, 1234)
self.assertEqual(res.status_int, 204)
# subsequent delete should fail
self.assertRaises(webob.exc.HTTPNotFound,
self.controller._delete, req, "failtest")
def test_create(self):
expected = self.expected_flavor
url = '/v3/flavors'
req = webob.Request.blank(url)
req.headers['Content-Type'] = 'application/json'
req.method = 'POST'
req.body = jsonutils.dumps(expected)
res = req.get_response(self.app)
body = jsonutils.loads(res.body)
for key in expected["flavor"]:
self.assertEqual(body["flavor"][key], expected["flavor"][key])
def test_create_public_default(self):
expected = self.expected_flavor
res = self._create_flavor_helper(self.base_request_dict)
body = jsonutils.loads(res.body)
for key in expected["flavor"]:
self.assertEqual(body["flavor"][key], expected["flavor"][key])
def _create_flavor_helper(self, request_dict):
url = '/v3/flavors'
req = webob.Request.blank(url)
req.headers['Content-Type'] = 'application/json'
req.method = 'POST'
req.body = jsonutils.dumps(request_dict)
return req.get_response(self.app)
def _test_create_bad_request(self, request_dict):
res = self._create_flavor_helper(request_dict)
self.assertEqual(400, res.status_int)
def test_create_without_flavor(self):
body = {'foo': None}
self._test_create_bad_request(body)
def _test_create_with_autogenerated_flavorid(self, request_body):
res = self._create_flavor_helper(request_body)
body = jsonutils.loads(res.body)
for key in self.expected_flavor["flavor"]:
if key != 'id':
self.assertEqual(body["flavor"][key],
self.expected_flavor["flavor"][key])
def test_create_with_none_flavorid(self):
body = copy.deepcopy(self.expected_flavor)
body['flavor']['id'] = None
self._test_create_with_autogenerated_flavorid(body)
def test_create_without_flavorid(self):
body = copy.deepcopy(self.expected_flavor)
del body['flavor']['id']
self._test_create_with_autogenerated_flavorid(body)
def test_flavor_exists_exception_returns_409(self):
expected = self.expected_flavor
expected['flavor']['id'] = 1235
def fake_create(name, memory_mb, vcpus, root_gb, ephemeral_gb,
flavorid, swap, rxtx_factor, is_public):
raise exception.FlavorExists(name=name)
self.stubs.Set(flavors, "create", fake_create)
res = self._create_flavor_helper(expected)
self.assertEqual(res.status_int, 409)
def test_invalid_memory_mb(self):
"""Check negative and decimal number can't be accepted."""
self.stubs.UnsetAll()
self.assertRaises(exception.InvalidInput, flavors.create, "abc",
-512, 2, 1, 1, 1234, 512, 1, True)
self.assertRaises(exception.InvalidInput, flavors.create, "abcd",
512.2, 2, 1, 1, 1234, 512, 1, True)
self.assertRaises(exception.InvalidInput, flavors.create, "abcde",
None, 2, 1, 1, 1234, 512, 1, True)
self.assertRaises(exception.InvalidInput, flavors.create, "abcdef",
512, 2, None, 1, 1234, 512, 1, True)
self.assertRaises(exception.InvalidInput, flavors.create, "abcdef",
"test_memory_mb", 2, None, 1, 1234, 512, 1, True)
def test_create_flavorid_with_leading_trailing_whitespaces(self):
id = " 1234 "
self.base_request_dict['flavor']['id'] = id
self._test_create_bad_request(self.base_request_dict)
@mock.patch('nova.compute.flavors.create',
side_effect=exception.FlavorCreateFailed)
def test_flavor_create_db_failed(self, mock_create):
request_dict = {
"flavor": {
"name": "test",
"ram": 512,
"vcpus": 2,
"disk": 1,
"ephemeral": 1,
"id": unicode('1234'),
"swap": 512,
"rxtx_factor": 1,
"os-flavor-access:is_public": True,
}
}
url = '/v3/flavors'
req = webob.Request.blank(url)
req.headers['Content-Type'] = 'application/json'
req.method = 'POST'
req.body = jsonutils.dumps(request_dict)
res = req.get_response(self.app)
self.assertEqual(res.status_int, 500)
self.assertIn('Unable to create flavor', res.body)
def test_create_without_name(self):
del self.base_request_dict['flavor']['name']
self._test_create_bad_request(self.base_request_dict)
def test_create_all_whitespace_flavor_names_are_rejected(self):
name = " "
self.base_request_dict['flavor']['name'] = name
self._test_create_bad_request(self.base_request_dict)
def test_create_flavor_name_with_leading_trailing_whitespaces(self):
# Common "name" is defined in I05391a03f383cac1d475cd4266cf7f5ced664f9e
name = " test "
self.base_request_dict['flavor']['name'] = name
self._test_create_bad_request(self.base_request_dict)
def test_create_with_name_too_long(self):
name = 'a' * 256
self.base_request_dict['flavor']['name'] = name
self._test_create_bad_request(self.base_request_dict)
def test_create_without_ram(self):
del self.base_request_dict['flavor']['ram']
self._test_create_bad_request(self.base_request_dict)
def test_create_with_0_ram(self):
ram = 0
self.base_request_dict['flavor']['ram'] = ram
self._test_create_bad_request(self.base_request_dict)
def test_create_without_vcpus(self):
del self.base_request_dict['flavor']['vcpus']
self._test_create_bad_request(self.base_request_dict)
def test_create_with_0_vcpus(self):
vcpus = 0
self.base_request_dict['flavor']['vcpus'] = vcpus
self._test_create_bad_request(self.base_request_dict)
def test_create_without_disk(self):
del self.base_request_dict['flavor']['disk']
self._test_create_bad_request(self.base_request_dict)
def test_create_with_minus_disk(self):
disk = -1
self.base_request_dict['flavor']['disk'] = disk
self._test_create_bad_request(self.base_request_dict)
def test_create_with_minus_ephemeral(self):
ephemeral = -1
self.base_request_dict['flavor']['ephemeral'] = ephemeral
self._test_create_bad_request(self.base_request_dict)
def test_create_with_minus_swap(self):
swap = -1
self.base_request_dict['flavor']['swap'] = swap
self._test_create_bad_request(self.base_request_dict)
def test_create_with_minus_rxtx_factor(self):
rxtx_factor = -1
self.base_request_dict['flavor']['rxtx_factor'] = rxtx_factor
self._test_create_bad_request(self.base_request_dict)
def test_create_with_non_boolean_is_public(self):
is_public = 1234
self.base_request_dict['flavor']['os-flavor-access:is_public'] =\
is_public
self._test_create_bad_request(self.base_request_dict)
class FakeRequest(object):
environ = {"nova.context": context.get_admin_context()}
class PrivateFlavorManageTest(test.TestCase):
def setUp(self):
super(PrivateFlavorManageTest, self).setUp()
# self.stubs.Set(flavors,
# "get_flavor_by_flavor_id",
# fake_get_flavor_by_flavor_id)
# self.stubs.Set(flavors, "destroy", fake_destroy)
# self.stubs.Set(flavors, "create", fake_create)
self.controller = flavor_manage.FlavorManageController()
self.flavor_access_controller = flavor_access.FlavorAccessController()
self.app = fakes.wsgi_app(init_only=('flavors',))
self.base_request_dict = {
"flavor": {
"name": "test",
"ram": 512,
"vcpus": 2,
"disk": 1,
"ephemeral": 1,
"id": unicode('1234'),
"swap": 512,
"rxtx_factor": 1,
"os-flavor-access:is_public": False
}
}
def test_create_private_flavor_should_create_flavor_access(self):
expected = {
"flavor": {
"name": "test",
"ram": 512,
"vcpus": 2,
"disk": 1
}
}
ctxt = context.RequestContext('fake', 'fake',
is_admin=True, auth_token=True)
url = '/os-flavor-manage'
req = fakes.HTTPRequestV3.blank(url, use_admin_context=True)
body = self.controller._create(req, body=self.base_request_dict)
for key in expected["flavor"]:
self.assertEqual(body["flavor"][key], expected["flavor"][key])
flavor_access_body = self.flavor_access_controller.index(
FakeRequest(), body["flavor"]["id"])
expected_flavor_access_body = {
"tenant_id": "%s" % ctxt.project_id,
"flavor_id": "%s" % body["flavor"]["id"]
}
self.assertIn(expected_flavor_access_body,
flavor_access_body["flavor_access"])
def test_create_public_flavor_should_not_create_flavor_access(self):
self.base_request_dict['flavor']['os-flavor-access:is_public'] = True
expected = {
"flavor": {
"name": "test",
"ram": 512,
"vcpus": 2,
"disk": 1
}
}
self.mox.StubOutWithMock(flavors, "add_flavor_access")
self.mox.ReplayAll()
url = '/os-flavor-manage'
req = fakes.HTTPRequestV3.blank(url, use_admin_context=True)
body = self.controller._create(req, body=self.base_request_dict)
for key in expected["flavor"]:
self.assertEqual(body["flavor"][key], expected["flavor"][key])

View File

@ -104,7 +104,6 @@ def return_flavor_not_found(flavor_id, ctxt=None):
class FlavorsTestV21(test.TestCase):
api_version = "2.1"
_prefix = "/v3"
Controller = flavors_v3.FlavorsController
fake_request = fakes.HTTPRequestV3
@ -123,6 +122,14 @@ class FlavorsTestV21(test.TestCase):
fake_flavor_get_by_flavor_id)
self.controller = self.Controller()
def _set_expected_body(self, expected, ephemeral, swap, disabled):
# NOTE(oomichi): On v2.1 API, some extensions of v2.0 are merged
# as core features and we can get the following parameters as the
# default.
expected['OS-FLV-EXT-DATA:ephemeral'] = ephemeral
expected['OS-FLV-DISABLED:disabled'] = disabled
expected['swap'] = swap
def test_get_flavor_by_invalid_id(self):
self.stubs.Set(nova.compute.flavors,
"get_flavor_by_flavor_id",
@ -155,10 +162,8 @@ class FlavorsTestV21(test.TestCase):
],
},
}
if self.api_version == "2.1":
expected['flavor']['ephemeral'] = '20'
expected['flavor']['swap'] = '10'
expected['flavor']['disabled'] = False
self._set_expected_body(expected['flavor'], ephemeral='20',
swap='10', disabled=False)
self.assertEqual(flavor, expected)
def test_get_flavor_with_custom_link_prefix(self):
@ -187,11 +192,9 @@ class FlavorsTestV21(test.TestCase):
],
},
}
if self.api_version == "2.1":
expected['flavor']['ephemeral'] = '20'
expected['flavor']['swap'] = '10'
expected['flavor']['disabled'] = False
self.assertEqual(flavor, expected)
self._set_expected_body(expected['flavor'], ephemeral='20',
swap='10', disabled=False)
self.assertEqual(expected, flavor)
def test_get_flavor_list(self):
req = self.fake_request.blank(self._prefix + '/flavors')
@ -399,14 +402,11 @@ class FlavorsTestV21(test.TestCase):
},
],
}
if self.api_version == "2.1":
expected['flavors'][0]['ephemeral'] = '20'
expected['flavors'][0]['swap'] = '10'
expected['flavors'][0]['disabled'] = False
expected['flavors'][1]['ephemeral'] = '10'
expected['flavors'][1]['swap'] = '5'
expected['flavors'][1]['disabled'] = False
self.assertEqual(flavor, expected)
self._set_expected_body(expected['flavors'][0], ephemeral='20',
swap='10', disabled=False)
self._set_expected_body(expected['flavors'][1], ephemeral='10',
swap='5', disabled=False)
self.assertEqual(expected, flavor)
def test_get_empty_flavor_list(self):
self.stubs.Set(nova.compute.flavors, "get_all_flavors_sorted_list",
@ -511,21 +511,21 @@ class FlavorsTestV21(test.TestCase):
},
],
}
if self.api_version == "2.1":
expected['flavors'][0]['ephemeral'] = '10'
expected['flavors'][0]['swap'] = '5'
expected['flavors'][0]['disabled'] = False
self.assertEqual(flavor, expected)
self._set_expected_body(expected['flavors'][0], ephemeral='10',
swap='5', disabled=False)
self.assertEqual(expected, flavor)
class FlavorsTestV20(FlavorsTestV21):
api_version = "2.0"
_prefix = "/v2/fake"
Controller = flavors_v2.Controller
fake_request = fakes.HTTPRequest
_rspv = "v2/fake"
_fake = "/fake"
def _set_expected_body(self, expected, ephemeral, swap, disabled):
pass
class FlavorsXMLSerializationTest(test.TestCase):
@ -765,7 +765,6 @@ class FlavorsXMLSerializationTest(test.TestCase):
class DisabledFlavorsWithRealDBTestV21(test.TestCase):
"""Tests that disabled flavors should not be shown nor listed."""
Controller = flavors_v3.FlavorsController
api_version = "2.1"
_prefix = "/v3"
fake_request = fakes.HTTPRequestV3
@ -855,14 +854,12 @@ class DisabledFlavorsWithRealDBTestV21(test.TestCase):
class DisabledFlavorsWithRealDBTestV20(DisabledFlavorsWithRealDBTestV21):
"""Tests that disabled flavors should not be shown nor listed."""
Controller = flavors_v2.Controller
api_version = "2.0"
_prefix = "/v2/fake"
fake_request = fakes.HTTPRequest
class ParseIsPublicTestV21(test.TestCase):
Controller = flavors_v3.FlavorsController
api_version = "2.1"
def setUp(self):
super(ParseIsPublicTestV21, self).setUp()
@ -900,4 +897,3 @@ class ParseIsPublicTestV21(test.TestCase):
class ParseIsPublicTestV20(ParseIsPublicTestV21):
Controller = flavors_v2.Controller
api_version = "2.0"

View File

@ -1,9 +1,5 @@
{
"flavor_access": [
{
"flavor_id": "%(flavor_id)s",
"tenant_id": "openstack"
},
{
"flavor_id": "%(flavor_id)s",
"tenant_id": "%(tenant_id)s"

View File

@ -16,8 +16,8 @@
"os-flavor-access:is_public": false,
"ram": 1024,
"vcpus": 2,
"disabled": false,
"ephemeral": 0,
"swap": 0
"OS-FLV-DISABLED:disabled": false,
"OS-FLV-EXT-DATA:ephemeral": 0,
"swap": ""
}
}

View File

@ -1,9 +1,9 @@
{
"flavors": [
{
"disabled": false,
"OS-FLV-DISABLED:disabled": false,
"disk": 1,
"ephemeral": 0,
"OS-FLV-EXT-DATA:ephemeral": 0,
"id": "1",
"links": [
{
@ -18,13 +18,13 @@
"name": "m1.tiny",
"os-flavor-access:is_public": true,
"ram": 512,
"swap": 0,
"swap": "",
"vcpus": 1
},
{
"disabled": false,
"OS-FLV-DISABLED:disabled": false,
"disk": 20,
"ephemeral": 0,
"OS-FLV-EXT-DATA:ephemeral": 0,
"id": "2",
"links": [
{
@ -39,13 +39,13 @@
"name": "m1.small",
"os-flavor-access:is_public": true,
"ram": 2048,
"swap": 0,
"swap": "",
"vcpus": 1
},
{
"disabled": false,
"OS-FLV-DISABLED:disabled": false,
"disk": 40,
"ephemeral": 0,
"OS-FLV-EXT-DATA:ephemeral": 0,
"id": "3",
"links": [
{
@ -60,13 +60,13 @@
"name": "m1.medium",
"os-flavor-access:is_public": true,
"ram": 4096,
"swap": 0,
"swap": "",
"vcpus": 2
},
{
"disabled": false,
"OS-FLV-DISABLED:disabled": false,
"disk": 80,
"ephemeral": 0,
"OS-FLV-EXT-DATA:ephemeral": 0,
"id": "4",
"links": [
{
@ -81,13 +81,13 @@
"name": "m1.large",
"os-flavor-access:is_public": true,
"ram": 8192,
"swap": 0,
"swap": "",
"vcpus": 4
},
{
"disabled": false,
"OS-FLV-DISABLED:disabled": false,
"disk": 160,
"ephemeral": 0,
"OS-FLV-EXT-DATA:ephemeral": 0,
"id": "5",
"links": [
{
@ -102,7 +102,7 @@
"name": "m1.xlarge",
"os-flavor-access:is_public": true,
"ram": 16384,
"swap": 0,
"swap": "",
"vcpus": 8
}
]

View File

@ -3,10 +3,6 @@
{
"flavor_id": "%(flavor_id)s",
"tenant_id": "fake_tenant"
},
{
"flavor_id": "%(flavor_id)s",
"tenant_id": "openstack"
}
]
}

View File

@ -1,6 +1,3 @@
{
"flavor_access": [{
"tenant_id": "openstack",
"flavor_id": "%(flavor_id)s"
}]
"flavor_access": []
}

View File

@ -16,8 +16,8 @@
"os-flavor-access:is_public": true,
"ram": 512,
"vcpus": 1,
"disabled": false,
"ephemeral": 0,
"swap": 0
"OS-FLV-DISABLED:disabled": false,
"OS-FLV-EXT-DATA:ephemeral": 0,
"swap": ""
}
}

View File

@ -16,8 +16,8 @@
"os-flavor-access:is_public": true,
"ram": 1024,
"vcpus": 2,
"disabled": false,
"ephemeral": 0,
"swap": 0
"OS-FLV-DISABLED:disabled": false,
"OS-FLV-EXT-DATA:ephemeral": 0,
"swap": ""
}
}

View File

@ -16,8 +16,8 @@
"os-flavor-access:is_public": true,
"ram": 512,
"vcpus": 1,
"disabled": false,
"ephemeral": 0,
"swap": 0
"OS-FLV-DISABLED:disabled": false,
"OS-FLV-EXT-DATA:ephemeral": 0,
"swap": ""
}
}

View File

@ -1,9 +1,9 @@
{
"flavors": [
{
"disabled": false,
"OS-FLV-DISABLED:disabled": false,
"disk": 1,
"ephemeral": 0,
"OS-FLV-EXT-DATA:ephemeral": 0,
"id": "1",
"links": [
{
@ -18,13 +18,13 @@
"name": "m1.tiny",
"os-flavor-access:is_public": true,
"ram": 512,
"swap": 0,
"swap": "",
"vcpus": 1
},
{
"disabled": false,
"OS-FLV-DISABLED:disabled": false,
"disk": 20,
"ephemeral": 0,
"OS-FLV-EXT-DATA:ephemeral": 0,
"id": "2",
"links": [
{
@ -39,13 +39,13 @@
"name": "m1.small",
"os-flavor-access:is_public": true,
"ram": 2048,
"swap": 0,
"swap": "",
"vcpus": 1
},
{
"disabled": false,
"OS-FLV-DISABLED:disabled": false,
"disk": 40,
"ephemeral": 0,
"OS-FLV-EXT-DATA:ephemeral": 0,
"id": "3",
"links": [
{
@ -60,13 +60,13 @@
"name": "m1.medium",
"os-flavor-access:is_public": true,
"ram": 4096,
"swap": 0,
"swap": "",
"vcpus": 2
},
{
"disabled": false,
"OS-FLV-DISABLED:disabled": false,
"disk": 80,
"ephemeral": 0,
"OS-FLV-EXT-DATA:ephemeral": 0,
"id": "4",
"links": [
{
@ -81,13 +81,13 @@
"name": "m1.large",
"os-flavor-access:is_public": true,
"ram": 8192,
"swap": 0,
"swap": "",
"vcpus": 4
},
{
"disabled": false,
"OS-FLV-DISABLED:disabled": false,
"disk": 160,
"ephemeral": 0,
"OS-FLV-EXT-DATA:ephemeral": 0,
"id": "5",
"links": [
{
@ -102,7 +102,7 @@
"name": "m1.xlarge",
"os-flavor-access:is_public": true,
"ram": 16384,
"swap": 0,
"swap": "",
"vcpus": 8
}
]

View File

@ -1,8 +1,8 @@
{
"flavor": {
"disabled": false,
"OS-FLV-DISABLED:disabled": false,
"disk": 1,
"ephemeral": 0,
"OS-FLV-EXT-DATA:ephemeral": 0,
"id": "1",
"links": [
{
@ -18,7 +18,7 @@
"os-flavor-access:is_public": true,
"ram": 512,
"rxtx_factor": 1.0,
"swap": 0,
"swap": "",
"vcpus": 1
}
}

View File

@ -1,9 +1,9 @@
{
"flavors": [
{
"disabled": false,
"OS-FLV-DISABLED:disabled": false,
"disk": 1,
"ephemeral": 0,
"OS-FLV-EXT-DATA:ephemeral": 0,
"id": "1",
"links": [
{
@ -19,13 +19,13 @@
"os-flavor-access:is_public": true,
"ram": 512,
"rxtx_factor": 1.0,
"swap": 0,
"swap": "",
"vcpus": 1
},
{
"disabled": false,
"OS-FLV-DISABLED:disabled": false,
"disk": 20,
"ephemeral": 0,
"OS-FLV-EXT-DATA:ephemeral": 0,
"id": "2",
"links": [
{
@ -41,13 +41,13 @@
"os-flavor-access:is_public": true,
"ram": 2048,
"rxtx_factor": 1.0,
"swap": 0,
"swap": "",
"vcpus": 1
},
{
"disabled": false,
"OS-FLV-DISABLED:disabled": false,
"disk": 40,
"ephemeral": 0,
"OS-FLV-EXT-DATA:ephemeral": 0,
"id": "3",
"links": [
{
@ -63,13 +63,13 @@
"os-flavor-access:is_public": true,
"ram": 4096,
"rxtx_factor": 1.0,
"swap": 0,
"swap": "",
"vcpus": 2
},
{
"disabled": false,
"OS-FLV-DISABLED:disabled": false,
"disk": 80,
"ephemeral": 0,
"OS-FLV-EXT-DATA:ephemeral": 0,
"id": "4",
"links": [
{
@ -85,13 +85,13 @@
"os-flavor-access:is_public": true,
"ram": 8192,
"rxtx_factor": 1.0,
"swap": 0,
"swap": "",
"vcpus": 4
},
{
"disabled": false,
"OS-FLV-DISABLED:disabled": false,
"disk": 160,
"ephemeral": 0,
"OS-FLV-EXT-DATA:ephemeral": 0,
"id": "5",
"links": [
{
@ -107,7 +107,7 @@
"os-flavor-access:is_public": true,
"ram": 16384,
"rxtx_factor": 1.0,
"swap": 0,
"swap": "",
"vcpus": 8
}
]

View File

@ -17,8 +17,8 @@
"ram": 1024,
"rxtx_factor": 2.0,
"vcpus": 2,
"disabled": false,
"ephemeral": 0,
"swap": 0
"OS-FLV-DISABLED:disabled": false,
"OS-FLV-EXT-DATA:ephemeral": 0,
"swap": ""
}
}

View File

@ -38,7 +38,7 @@ class FlavorAccessSampleJsonTests(api_sample_base.ApiSampleTestBaseV3):
"flavor-access-create-req",
subs)
subs.update(self._get_regexes())
self._verify_response("flavor-access-create-resp", subs, response, 201)
self._verify_response("flavor-access-create-resp", subs, response, 200)
def test_flavor_access_create(self):
self._create_flavor()

View File

@ -29,7 +29,7 @@ class FlavorManageSampleJsonTests(api_sample_base.ApiSampleTestBaseV3):
"flavor-create-post-req",
subs)
subs.update(self._get_regexes())
self._verify_response("flavor-create-post-resp", subs, response, 201)
self._verify_response("flavor-create-post-resp", subs, response, 200)
def test_create_flavor(self):
# Get api sample to create a flavor.
@ -39,5 +39,5 @@ class FlavorManageSampleJsonTests(api_sample_base.ApiSampleTestBaseV3):
# Get api sample to delete a flavor.
self._create_flavor()
response = self._do_delete("flavors/10")
self.assertEqual(response.status, 204)
self.assertEqual(response.status, 202)
self.assertEqual(response.read(), '')

View File

@ -43,4 +43,4 @@ class FlavorRxtxJsonTest(api_sample_base.ApiSampleTestBaseV3):
'flavor-rxtx-post-req',
subs)
subs.update(self._get_regexes())
self._verify_response('flavor-rxtx-post-resp', subs, response, 201)
self._verify_response('flavor-rxtx-post-resp', subs, response, 200)