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:
parent
58f4056578
commit
2a81337a8d
@ -1,9 +1,5 @@
|
||||
{
|
||||
"flavor_access": [
|
||||
{
|
||||
"flavor_id": "10",
|
||||
"tenant_id": "openstack"
|
||||
},
|
||||
{
|
||||
"flavor_id": "10",
|
||||
"tenant_id": "fake_tenant"
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
]
|
||||
|
@ -1,9 +1,5 @@
|
||||
{
|
||||
"flavor_access": [
|
||||
{
|
||||
"flavor_id": "10",
|
||||
"tenant_id": "openstack"
|
||||
},
|
||||
{
|
||||
"flavor_id": "10",
|
||||
"tenant_id": "fake_tenant"
|
||||
|
@ -1,8 +1,4 @@
|
||||
{
|
||||
"flavor_access": [
|
||||
{
|
||||
"flavor_id": "10",
|
||||
"tenant_id": "openstack"
|
||||
}
|
||||
]
|
||||
}
|
@ -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
|
||||
}
|
||||
}
|
||||
|
@ -6,4 +6,4 @@
|
||||
"disk": 10,
|
||||
"id": "10"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
]
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
]
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
|
@ -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:
|
||||
|
@ -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
|
||||
},
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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):
|
||||
|
@ -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',))
|
||||
|
@ -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])
|
@ -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"
|
||||
|
@ -1,9 +1,5 @@
|
||||
{
|
||||
"flavor_access": [
|
||||
{
|
||||
"flavor_id": "%(flavor_id)s",
|
||||
"tenant_id": "openstack"
|
||||
},
|
||||
{
|
||||
"flavor_id": "%(flavor_id)s",
|
||||
"tenant_id": "%(tenant_id)s"
|
||||
|
@ -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": ""
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
]
|
||||
|
@ -3,10 +3,6 @@
|
||||
{
|
||||
"flavor_id": "%(flavor_id)s",
|
||||
"tenant_id": "fake_tenant"
|
||||
},
|
||||
{
|
||||
"flavor_id": "%(flavor_id)s",
|
||||
"tenant_id": "openstack"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
@ -1,6 +1,3 @@
|
||||
{
|
||||
"flavor_access": [{
|
||||
"tenant_id": "openstack",
|
||||
"flavor_id": "%(flavor_id)s"
|
||||
}]
|
||||
"flavor_access": []
|
||||
}
|
@ -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": ""
|
||||
}
|
||||
}
|
||||
|
@ -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": ""
|
||||
}
|
||||
}
|
||||
|
@ -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": ""
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
]
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
]
|
||||
|
@ -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": ""
|
||||
}
|
||||
}
|
||||
|
@ -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()
|
||||
|
@ -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(), '')
|
||||
|
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user