Merge "tests: Clean up flavors tests"
This commit is contained in:
@@ -16,12 +16,10 @@
|
||||
import copy
|
||||
from unittest import mock
|
||||
|
||||
from oslo_serialization import jsonutils
|
||||
import webob
|
||||
|
||||
from nova.api.openstack.compute import flavor_access as flavor_access_v21
|
||||
from nova.api.openstack.compute import flavors as flavors_v21
|
||||
from nova.compute import flavors
|
||||
from nova.api.openstack.compute import flavor_access
|
||||
from nova.api.openstack.compute import flavors
|
||||
from nova.db import constants as db_const
|
||||
from nova import exception
|
||||
from nova import objects
|
||||
@@ -57,13 +55,10 @@ def fake_create_without_swap(newflavor):
|
||||
|
||||
|
||||
class FlavorManageTestV21(test.NoDBTestCase):
|
||||
controller = flavors_v21.FlavorsController()
|
||||
validation_error = exception.ValidationError
|
||||
base_url = '/v2.1/flavors'
|
||||
microversion = '2.1'
|
||||
|
||||
def setUp(self):
|
||||
super(FlavorManageTestV21, self).setUp()
|
||||
super().setUp()
|
||||
self.stub_out("nova.objects.Flavor.create", fake_create)
|
||||
|
||||
self.request_body = {
|
||||
@@ -80,27 +75,18 @@ class FlavorManageTestV21(test.NoDBTestCase):
|
||||
}
|
||||
}
|
||||
self.expected_flavor = self.request_body
|
||||
self.controller = flavors.FlavorsController()
|
||||
|
||||
def _get_http_request(self, url=''):
|
||||
return fakes.HTTPRequest.blank(url, version=self.microversion,
|
||||
use_admin_context=True)
|
||||
|
||||
@property
|
||||
def app(self):
|
||||
return fakes.wsgi_app_v21()
|
||||
|
||||
@mock.patch('nova.objects.Flavor.destroy')
|
||||
def test_delete(self, mock_destroy):
|
||||
req = self._get_http_request()
|
||||
res = self.controller.delete(req, 1234)
|
||||
self.controller.delete(req, 1234)
|
||||
|
||||
# NOTE: on v2.1, http status code is set as wsgi_codes of API
|
||||
# method instead of status_int in a response object.
|
||||
if isinstance(self.controller,
|
||||
flavors_v21.FlavorsController):
|
||||
status_int = self.controller.delete.wsgi_codes(req)
|
||||
else:
|
||||
status_int = res.status_int
|
||||
status_int = self.controller.delete.wsgi_codes(req)
|
||||
self.assertEqual(202, status_int)
|
||||
|
||||
# subsequent delete should fail
|
||||
@@ -126,8 +112,9 @@ class FlavorManageTestV21(test.NoDBTestCase):
|
||||
|
||||
del body['flavor'][parameter]
|
||||
|
||||
self.assertRaises(self.validation_error, self.controller.create,
|
||||
self._get_http_request(), body=body)
|
||||
self.assertRaises(
|
||||
exception.ValidationError, self.controller.create,
|
||||
self._get_http_request(), body=body)
|
||||
|
||||
def test_create_missing_name(self):
|
||||
self._test_create_missing_parameter('name')
|
||||
@@ -141,40 +128,33 @@ class FlavorManageTestV21(test.NoDBTestCase):
|
||||
def test_create_missing_disk(self):
|
||||
self._test_create_missing_parameter('disk')
|
||||
|
||||
def _create_flavor_success_case(self, body, req=None, version=None):
|
||||
req = req if req else self._get_http_request(url=self.base_url)
|
||||
req.headers['Content-Type'] = 'application/json'
|
||||
req.headers['X-OpenStack-Nova-API-Version'] = (
|
||||
version or self.microversion)
|
||||
req.method = 'POST'
|
||||
req.body = jsonutils.dump_as_bytes(body)
|
||||
res = req.get_response(self.app)
|
||||
self.assertEqual(200, res.status_code)
|
||||
return jsonutils.loads(res.body)
|
||||
|
||||
def test_create(self):
|
||||
body = self._create_flavor_success_case(self.request_body)
|
||||
req = self._get_http_request('')
|
||||
body = self.controller.create(req, body=self.request_body)
|
||||
for key in self.expected_flavor["flavor"]:
|
||||
self.assertEqual(body["flavor"][key],
|
||||
self.expected_flavor["flavor"][key])
|
||||
|
||||
def test_create_public_default(self):
|
||||
del self.request_body['flavor']['os-flavor-access:is_public']
|
||||
body = self._create_flavor_success_case(self.request_body)
|
||||
req = self._get_http_request('')
|
||||
body = self.controller.create(req, body=self.request_body)
|
||||
for key in self.expected_flavor["flavor"]:
|
||||
self.assertEqual(body["flavor"][key],
|
||||
self.expected_flavor["flavor"][key])
|
||||
|
||||
def test_create_without_flavorid(self):
|
||||
del self.request_body['flavor']['id']
|
||||
body = self._create_flavor_success_case(self.request_body)
|
||||
req = self._get_http_request('')
|
||||
body = self.controller.create(req, body=self.request_body)
|
||||
for key in self.expected_flavor["flavor"]:
|
||||
self.assertEqual(body["flavor"][key],
|
||||
self.expected_flavor["flavor"][key])
|
||||
|
||||
def _create_flavor_bad_request_case(self, body):
|
||||
self.assertRaises(self.validation_error, self.controller.create,
|
||||
self._get_http_request(), body=body)
|
||||
self.assertRaises(
|
||||
exception.ValidationError, self.controller.create,
|
||||
self._get_http_request(), body=body)
|
||||
|
||||
def test_create_invalid_name(self):
|
||||
self.request_body['flavor']['name'] = 'bad !@#!$%\x00 name'
|
||||
@@ -197,10 +177,10 @@ class FlavorManageTestV21(test.NoDBTestCase):
|
||||
self._create_flavor_bad_request_case(self.request_body)
|
||||
|
||||
def test_create_with_name_leading_trailing_spaces_compat_mode(self):
|
||||
req = self._get_http_request(url=self.base_url)
|
||||
req = self._get_http_request('/v2.1/flavors')
|
||||
req.set_legacy_v2()
|
||||
self.request_body['flavor']['name'] = ' test '
|
||||
body = self._create_flavor_success_case(self.request_body, req)
|
||||
body = self.controller.create(req, body=self.request_body)
|
||||
self.assertEqual('test', body['flavor']['name'])
|
||||
|
||||
def test_create_without_flavorname(self):
|
||||
@@ -248,6 +228,14 @@ class FlavorManageTestV21(test.NoDBTestCase):
|
||||
self.request_body['flavor']['ram'] = db_const.MAX_INT + 1
|
||||
self._create_flavor_bad_request_case(self.request_body)
|
||||
|
||||
def test_create_with_minus_ram(self):
|
||||
self.request_body['flavor']['ram'] = -1
|
||||
self._create_flavor_bad_request_case(self.request_body)
|
||||
|
||||
def test_create_with_invalid_ram(self):
|
||||
self.request_body['flavor']['ram'] = 'invalid'
|
||||
self._create_flavor_bad_request_case(self.request_body)
|
||||
|
||||
def test_create_without_vcpus(self):
|
||||
del self.request_body['flavor']['vcpus']
|
||||
self._create_flavor_bad_request_case(self.request_body)
|
||||
@@ -260,22 +248,38 @@ class FlavorManageTestV21(test.NoDBTestCase):
|
||||
self.request_body['flavor']['vcpus'] = db_const.MAX_INT + 1
|
||||
self._create_flavor_bad_request_case(self.request_body)
|
||||
|
||||
def test_create_without_disk(self):
|
||||
del self.request_body['flavor']['disk']
|
||||
def test_create_with_minus_vcpus(self):
|
||||
self.request_body['flavor']['vcpus'] = -1
|
||||
self._create_flavor_bad_request_case(self.request_body)
|
||||
|
||||
def test_create_with_minus_disk(self):
|
||||
self.request_body['flavor']['disk'] = -1
|
||||
def test_create_with_invalid_vcpus(self):
|
||||
self.request_body['flavor']['vcpus'] = 'invalid'
|
||||
self._create_flavor_bad_request_case(self.request_body)
|
||||
|
||||
def test_create_without_disk(self):
|
||||
del self.request_body['flavor']['disk']
|
||||
self._create_flavor_bad_request_case(self.request_body)
|
||||
|
||||
def test_create_with_disk_exceed_max_limit(self):
|
||||
self.request_body['flavor']['disk'] = db_const.MAX_INT + 1
|
||||
self._create_flavor_bad_request_case(self.request_body)
|
||||
|
||||
def test_create_with_minus_disk(self):
|
||||
self.request_body['flavor']['disk'] = -1
|
||||
self._create_flavor_bad_request_case(self.request_body)
|
||||
|
||||
def test_create_with_invalid_disk(self):
|
||||
self.request_body['flavor']['disk'] = 'invalid'
|
||||
self._create_flavor_bad_request_case(self.request_body)
|
||||
|
||||
def test_create_with_minus_ephemeral(self):
|
||||
self.request_body['flavor']['OS-FLV-EXT-DATA:ephemeral'] = -1
|
||||
self._create_flavor_bad_request_case(self.request_body)
|
||||
|
||||
def test_create_with_invalid_ephemeral(self):
|
||||
self.request_body['flavor']['OS-FLV-EXT-DATA:ephemeral'] = 'invalid'
|
||||
self._create_flavor_bad_request_case(self.request_body)
|
||||
|
||||
def test_create_with_ephemeral_exceed_max_limit(self):
|
||||
self.request_body['flavor'][
|
||||
'OS-FLV-EXT-DATA:ephemeral'] = db_const.MAX_INT + 1
|
||||
@@ -285,6 +289,10 @@ class FlavorManageTestV21(test.NoDBTestCase):
|
||||
self.request_body['flavor']['swap'] = -1
|
||||
self._create_flavor_bad_request_case(self.request_body)
|
||||
|
||||
def test_create_with_invalid_swap(self):
|
||||
self.request_body['flavor']['swap'] = 'invalid'
|
||||
self._create_flavor_bad_request_case(self.request_body)
|
||||
|
||||
def test_create_with_swap_exceed_max_limit(self):
|
||||
self.request_body['flavor']['swap'] = db_const.MAX_INT + 1
|
||||
self._create_flavor_bad_request_case(self.request_body)
|
||||
@@ -325,37 +333,25 @@ class FlavorManageTestV21(test.NoDBTestCase):
|
||||
self.assertRaises(webob.exc.HTTPConflict, self.controller.create,
|
||||
self._get_http_request(), body=expected)
|
||||
|
||||
def test_invalid_memory_mb(self):
|
||||
"""Check negative and decimal number can't be accepted."""
|
||||
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_with_description(self):
|
||||
"""With microversion <2.55 this should return a failure."""
|
||||
self.request_body['flavor']['description'] = 'invalid'
|
||||
ex = self.assertRaises(
|
||||
self.validation_error, self.controller.create,
|
||||
exception.ValidationError, self.controller.create,
|
||||
self._get_http_request(), body=self.request_body)
|
||||
self.assertIn('description', str(ex))
|
||||
|
||||
def test_flavor_update_description(self):
|
||||
"""With microversion <2.55 this should return a failure."""
|
||||
flavor = self._create_flavor_success_case(self.request_body)['flavor']
|
||||
req = self._get_http_request('')
|
||||
flavor = self.controller.create(req, body=self.request_body)['flavor']
|
||||
self.assertRaises(
|
||||
exception.VersionNotFoundForAPIMethod, self.controller.update,
|
||||
self._get_http_request(), flavor['id'],
|
||||
body={'flavor': {'description': 'nope'}})
|
||||
|
||||
|
||||
class FlavorManageTestV2_55(FlavorManageTestV21):
|
||||
class FlavorManageTestV255(FlavorManageTestV21):
|
||||
microversion = '2.55'
|
||||
|
||||
def get_flavor(self, flavor, **kwargs):
|
||||
@@ -371,7 +367,7 @@ class FlavorManageTestV2_55(FlavorManageTestV21):
|
||||
**kwargs)
|
||||
|
||||
def setUp(self):
|
||||
super(FlavorManageTestV2_55, self).setUp()
|
||||
super().setUp()
|
||||
# Send a description in POST /flavors requests.
|
||||
self.request_body['flavor']['description'] = 'test description'
|
||||
|
||||
@@ -384,9 +380,11 @@ class FlavorManageTestV2_55(FlavorManageTestV21):
|
||||
def test_flavor_update_description(self, mock_flavor_save, mock_get):
|
||||
"""Tests updating a flavor description."""
|
||||
# First create a flavor.
|
||||
flavor = self._create_flavor_success_case(self.request_body)['flavor']
|
||||
req = self._get_http_request('')
|
||||
flavor = self.controller.create(req, body=self.request_body)['flavor']
|
||||
self.assertEqual('test description', flavor['description'])
|
||||
mock_get.return_value = self.get_flavor(flavor)
|
||||
|
||||
# Now null out the flavor description.
|
||||
flavor = self.controller.update(
|
||||
self._get_http_request(), flavor['id'],
|
||||
@@ -409,7 +407,7 @@ class FlavorManageTestV2_55(FlavorManageTestV21):
|
||||
"""Tests that a schema validation error is raised if no description
|
||||
is provided in the update request body.
|
||||
"""
|
||||
self.assertRaises(self.validation_error,
|
||||
self.assertRaises(exception.ValidationError,
|
||||
self.controller.update,
|
||||
self._get_http_request(), 'invalid',
|
||||
body={'flavor': {}})
|
||||
@@ -421,14 +419,16 @@ class FlavorManageTestV2_55(FlavorManageTestV21):
|
||||
for description in ('bad !@#!$%\x00 description', # printable chars
|
||||
'a' * 65536): # maxLength
|
||||
self.request_body['flavor']['description'] = description
|
||||
self.assertRaises(self.validation_error, self.controller.create,
|
||||
self._get_http_request(), body=self.request_body)
|
||||
self.assertRaises(
|
||||
exception.ValidationError, self.controller.create,
|
||||
self._get_http_request(), body=self.request_body)
|
||||
|
||||
@mock.patch('nova.objects.Flavor.get_by_flavor_id')
|
||||
@mock.patch('nova.objects.Flavor.save')
|
||||
def test_update_with_invalid_description(self, mock_flavor_save, mock_get):
|
||||
# First create a flavor.
|
||||
flavor = self._create_flavor_success_case(self.request_body)['flavor']
|
||||
req = self._get_http_request('')
|
||||
flavor = self.controller.create(req, body=self.request_body)['flavor']
|
||||
self.assertEqual('test description', flavor['description'])
|
||||
mock_get.return_value = objects.Flavor(
|
||||
flavorid=flavor['id'], name=flavor['name'],
|
||||
@@ -444,21 +444,22 @@ class FlavorManageTestV2_55(FlavorManageTestV21):
|
||||
for description in ('bad !@#!$%\x00 description', # printable chars
|
||||
'a' * 65536): # maxLength
|
||||
self.request_body['flavor']['description'] = description
|
||||
self.assertRaises(self.validation_error, self.controller.update,
|
||||
self._get_http_request(), flavor['id'],
|
||||
body={'flavor': {'description': description}})
|
||||
self.assertRaises(
|
||||
exception.ValidationError, self.controller.update,
|
||||
self._get_http_request(), flavor['id'],
|
||||
body={'flavor': {'description': description}})
|
||||
|
||||
|
||||
class FlavorManageTestV2_61(FlavorManageTestV2_55):
|
||||
class FlavorManageTestV261(FlavorManageTestV255):
|
||||
"""Run the same tests as we would for v2.55 but with a extra_specs."""
|
||||
microversion = '2.61'
|
||||
|
||||
def get_flavor(self, flavor):
|
||||
return super(FlavorManageTestV2_61, self).get_flavor(
|
||||
return super().get_flavor(
|
||||
flavor, extra_specs={"key1": "value1"})
|
||||
|
||||
def setUp(self):
|
||||
super(FlavorManageTestV2_61, self).setUp()
|
||||
super().setUp()
|
||||
self.expected_flavor = copy.deepcopy(self.request_body)
|
||||
self.expected_flavor['flavor']['extra_specs'] = {}
|
||||
|
||||
@@ -466,7 +467,8 @@ class FlavorManageTestV2_61(FlavorManageTestV2_55):
|
||||
@mock.patch('nova.objects.Flavor.save')
|
||||
def test_flavor_update_extra_spec(self, mock_flavor_save, mock_get):
|
||||
# First create a flavor.
|
||||
flavor = self._create_flavor_success_case(self.request_body)['flavor']
|
||||
req = self._get_http_request('')
|
||||
flavor = self.controller.create(req, body=self.request_body)['flavor']
|
||||
mock_get.return_value = self.get_flavor(flavor)
|
||||
flavor = self.controller.update(
|
||||
self._get_http_request(), flavor['id'],
|
||||
@@ -474,7 +476,7 @@ class FlavorManageTestV2_61(FlavorManageTestV2_55):
|
||||
self.assertEqual({"key1": "value1"}, flavor['extra_specs'])
|
||||
|
||||
|
||||
class FlavorManageTestV2_75(FlavorManageTestV2_61):
|
||||
class FlavorManageTestV275(FlavorManageTestV261):
|
||||
microversion = '2.75'
|
||||
|
||||
FLAVOR_WITH_NO_SWAP = objects.Flavor(
|
||||
@@ -494,8 +496,9 @@ class FlavorManageTestV2_75(FlavorManageTestV2_61):
|
||||
def test_create_flavor_default_swap_value_old_version(self):
|
||||
self.stub_out("nova.objects.Flavor.create", fake_create_without_swap)
|
||||
del self.request_body['flavor']['swap']
|
||||
resp = self._create_flavor_success_case(self.request_body,
|
||||
version='2.74')
|
||||
req = fakes.HTTPRequest.blank(
|
||||
'', version='2.74', use_admin_context=True)
|
||||
resp = self.controller.create(req, body=self.request_body)
|
||||
self.assertEqual(resp['flavor']['swap'], "")
|
||||
|
||||
@mock.patch('nova.objects.Flavor.get_by_flavor_id')
|
||||
@@ -504,23 +507,23 @@ class FlavorManageTestV2_75(FlavorManageTestV2_61):
|
||||
mock_get):
|
||||
self.stub_out("nova.objects.Flavor.create", fake_create_without_swap)
|
||||
del self.request_body['flavor']['swap']
|
||||
flavor = self._create_flavor_success_case(self.request_body,
|
||||
version='2.74')['flavor']
|
||||
req = fakes.HTTPRequest.blank(
|
||||
'', version='2.74', use_admin_context=True)
|
||||
flavor = self.controller.create(req, body=self.request_body)['flavor']
|
||||
|
||||
mock_get.return_value = self.FLAVOR_WITH_NO_SWAP
|
||||
req = fakes.HTTPRequest.blank('/%s/flavors' % fakes.FAKE_PROJECT_ID,
|
||||
version='2.74')
|
||||
req.method = 'PUT'
|
||||
response = self.controller.update(
|
||||
flavor = self.controller.update(
|
||||
req, flavor['id'],
|
||||
body={'flavor': {'description': None}})['flavor']
|
||||
self.assertEqual(response['swap'], '')
|
||||
self.assertEqual(flavor['swap'], '')
|
||||
|
||||
@mock.patch('nova.objects.FlavorList.get_all')
|
||||
def test_create_flavor_default_swap_value(self, mock_get):
|
||||
self.stub_out("nova.objects.Flavor.create", fake_create_without_swap)
|
||||
del self.request_body['flavor']['swap']
|
||||
resp = self._create_flavor_success_case(self.request_body)
|
||||
self.assertEqual(resp['flavor']['swap'], 0)
|
||||
req = self._get_http_request('')
|
||||
body = self.controller.create(req, body=self.request_body)
|
||||
self.assertEqual(body['flavor']['swap'], 0)
|
||||
|
||||
@mock.patch('nova.objects.Flavor.get_by_flavor_id')
|
||||
@mock.patch('nova.objects.Flavor.save')
|
||||
@@ -528,23 +531,21 @@ class FlavorManageTestV2_75(FlavorManageTestV2_61):
|
||||
self.stub_out("nova.objects.Flavor.create", fake_create_without_swap)
|
||||
del self.request_body['flavor']['swap']
|
||||
mock_get.return_value = self.FLAVOR_WITH_NO_SWAP
|
||||
flavor = self._create_flavor_success_case(self.request_body)['flavor']
|
||||
req = fakes.HTTPRequest.blank('/%s/flavors' % fakes.FAKE_PROJECT_ID,
|
||||
version=self.microversion)
|
||||
response = self.controller.update(
|
||||
req = self._get_http_request('')
|
||||
flavor = self.controller.create(req, body=self.request_body)['flavor']
|
||||
|
||||
flavor = self.controller.update(
|
||||
req, flavor['id'],
|
||||
body={'flavor': {'description': None}})['flavor']
|
||||
self.assertEqual(response['swap'], 0)
|
||||
self.assertEqual(flavor['swap'], 0)
|
||||
|
||||
|
||||
class PrivateFlavorManageTestV21(test.TestCase):
|
||||
controller = flavors_v21.FlavorsController()
|
||||
base_url = '/v2.1/flavors'
|
||||
|
||||
def setUp(self):
|
||||
super(PrivateFlavorManageTestV21, self).setUp()
|
||||
self.flavor_access_controller = (flavor_access_v21.
|
||||
FlavorAccessController())
|
||||
super().setUp()
|
||||
self.flavor_controller = flavors.FlavorsController()
|
||||
self.flavor_access_controller = flavor_access.FlavorAccessController()
|
||||
self.expected = {
|
||||
"flavor": {
|
||||
"name": "test",
|
||||
@@ -557,27 +558,14 @@ class PrivateFlavorManageTestV21(test.TestCase):
|
||||
}
|
||||
}
|
||||
|
||||
@property
|
||||
def app(self):
|
||||
return fakes.wsgi_app_v21(fake_auth_context=self._get_http_request().
|
||||
environ['nova.context'])
|
||||
|
||||
def _get_http_request(self, url=''):
|
||||
return fakes.HTTPRequest.blank(url)
|
||||
|
||||
def _get_response(self):
|
||||
req = self._get_http_request(self.base_url)
|
||||
req.headers['Content-Type'] = 'application/json'
|
||||
req.method = 'POST'
|
||||
req.body = jsonutils.dump_as_bytes(self.expected)
|
||||
res = req.get_response(self.app)
|
||||
return jsonutils.loads(res.body)
|
||||
|
||||
def test_create_private_flavor_should_not_grant_flavor_access(self):
|
||||
self.expected["flavor"]["os-flavor-access:is_public"] = False
|
||||
body = self._get_response()
|
||||
body = self.flavor_controller.create(
|
||||
fakes.HTTPRequest.blank(''), body=self.expected
|
||||
)
|
||||
for key in self.expected["flavor"]:
|
||||
self.assertEqual(body["flavor"][key], self.expected["flavor"][key])
|
||||
|
||||
# Because for normal user can't access the non-public flavor without
|
||||
# access. So it need admin context at here.
|
||||
flavor_access_body = self.flavor_access_controller.index(
|
||||
@@ -592,6 +580,8 @@ class PrivateFlavorManageTestV21(test.TestCase):
|
||||
|
||||
def test_create_public_flavor_should_not_create_flavor_access(self):
|
||||
self.expected["flavor"]["os-flavor-access:is_public"] = True
|
||||
body = self._get_response()
|
||||
body = self.flavor_controller.create(
|
||||
fakes.HTTPRequest.blank(''), body=self.expected
|
||||
)
|
||||
for key in self.expected["flavor"]:
|
||||
self.assertEqual(body["flavor"][key], self.expected["flavor"][key])
|
||||
|
||||
@@ -19,7 +19,7 @@ from urllib import parse as urlparse
|
||||
import webob
|
||||
|
||||
from nova.api.openstack import common
|
||||
from nova.api.openstack.compute import flavors as flavors_v21
|
||||
from nova.api.openstack.compute import flavors
|
||||
from nova import context
|
||||
from nova import exception
|
||||
from nova import objects
|
||||
@@ -27,9 +27,6 @@ from nova import test
|
||||
from nova.tests.unit.api.openstack import fakes
|
||||
from nova.tests.unit import matchers
|
||||
|
||||
NS = "{http://docs.openstack.org/compute/api/v1.1}"
|
||||
ATOMNS = "{http://www.w3.org/2005/Atom}"
|
||||
|
||||
|
||||
def fake_get_limit_and_marker(request, max_limit=1):
|
||||
params = common.get_pagination_params(request)
|
||||
@@ -45,8 +42,6 @@ def return_flavor_not_found(context, flavor_id, read_deleted=None):
|
||||
|
||||
|
||||
class FlavorsTestV21(test.TestCase):
|
||||
Controller = flavors_v21.FlavorsController
|
||||
fake_request = fakes.HTTPRequestV21
|
||||
microversion = '2.1'
|
||||
# Flag to tell the test if a description should be expected in a response.
|
||||
expect_description = False
|
||||
@@ -54,15 +49,15 @@ class FlavorsTestV21(test.TestCase):
|
||||
expect_extra_specs = False
|
||||
|
||||
def setUp(self):
|
||||
super(FlavorsTestV21, self).setUp()
|
||||
super().setUp()
|
||||
fakes.stub_out_networking(self)
|
||||
fakes.stub_out_flavor_get_all(self)
|
||||
fakes.stub_out_flavor_get_by_flavor_id(self)
|
||||
self.controller = self.Controller()
|
||||
self.controller = flavors.FlavorsController()
|
||||
|
||||
def _build_request(self, url):
|
||||
return self.fake_request.blank(
|
||||
'/v2.1' + url, version=self.microversion)
|
||||
return fakes.HTTPRequestV21.blank(
|
||||
url, version=self.microversion, base_url='http://localhost/v2.1')
|
||||
|
||||
def _set_expected_body(self, expected, flavor):
|
||||
expected['OS-FLV-EXT-DATA:ephemeral'] = flavor.ephemeral_gb
|
||||
@@ -599,11 +594,11 @@ class FlavorsTestV21(test.TestCase):
|
||||
{
|
||||
"rel": "self",
|
||||
"href": "http://localhost/v2.1/flavors/2",
|
||||
},
|
||||
{
|
||||
},
|
||||
{
|
||||
"rel": "bookmark",
|
||||
"href": "http://localhost/flavors/2",
|
||||
},
|
||||
},
|
||||
],
|
||||
}]
|
||||
if expected:
|
||||
@@ -746,19 +741,19 @@ class FlavorsTestV21(test.TestCase):
|
||||
'/flavors/detail?is_public=invalid', expected)
|
||||
|
||||
|
||||
class FlavorsTestV2_55(FlavorsTestV21):
|
||||
class FlavorsTestV255(FlavorsTestV21):
|
||||
"""Run the same tests as we would for v2.1 but with a description."""
|
||||
microversion = '2.55'
|
||||
expect_description = True
|
||||
|
||||
|
||||
class FlavorsTestV2_61(FlavorsTestV2_55):
|
||||
class FlavorsTestV261(FlavorsTestV255):
|
||||
"""Run the same tests as we would for v2.55 but with a extra_specs."""
|
||||
microversion = '2.61'
|
||||
expect_extra_specs = True
|
||||
|
||||
|
||||
class FlavorsTestV2_75(FlavorsTestV2_61):
|
||||
class FlavorsTestV275(FlavorsTestV261):
|
||||
microversion = '2.75'
|
||||
|
||||
FLAVOR_WITH_NO_SWAP = objects.Flavor(
|
||||
@@ -779,11 +774,12 @@ class FlavorsTestV2_75(FlavorsTestV2_61):
|
||||
)
|
||||
|
||||
def test_list_flavors_with_additional_filter_old_version(self):
|
||||
req = self.fake_request.blank(
|
||||
req = fakes.HTTPRequestV21.blank(
|
||||
'/flavors?limit=1&marker=1&additional=something',
|
||||
version='2.74')
|
||||
version='2.74', base_url='http://localhost/v2.1')
|
||||
self._test_list_flavors_with_allowed_filter(
|
||||
'/flavors?limit=1&marker=1&additional=something', req=req)
|
||||
'/flavors?limit=1&marker=1&additional=something',
|
||||
req=req)
|
||||
|
||||
def test_list_detail_flavors_with_additional_filter_old_version(self):
|
||||
expected = {
|
||||
@@ -796,8 +792,9 @@ class FlavorsTestV2_75(FlavorsTestV2_61):
|
||||
"OS-FLV-DISABLED:disabled": fakes.FLAVORS['2'].disabled,
|
||||
"swap": fakes.FLAVORS['2'].swap
|
||||
}
|
||||
req = self.fake_request.blank(
|
||||
'/flavors?limit=1&marker=1&additional=something', version='2.74')
|
||||
req = fakes.HTTPRequestV21.blank(
|
||||
'/flavors?limit=1&marker=1&additional=something',
|
||||
version='2.74', base_url='http://localhost/v2.1')
|
||||
self._test_list_flavors_with_allowed_filter(
|
||||
'/flavors/detail?limit=1&marker=1&additional=something',
|
||||
expected, req=req)
|
||||
@@ -822,9 +819,8 @@ class FlavorsTestV2_75(FlavorsTestV2_61):
|
||||
def test_list_flavor_detail_default_swap_value_old_version(self, mock_get):
|
||||
mock_get.return_value = objects.FlavorList(
|
||||
objects=[self.FLAVOR_WITH_NO_SWAP])
|
||||
req = self.fake_request.blank(
|
||||
'/%s/flavors/detail?limit=1' % fakes.FAKE_PROJECT_ID,
|
||||
version='2.74')
|
||||
req = fakes.HTTPRequestV21.blank(
|
||||
'/flavors/detail?limit=1', version='2.74')
|
||||
response = self.controller.detail(req)
|
||||
response_list = response["flavors"]
|
||||
self.assertEqual(response_list[0]['swap'], "")
|
||||
@@ -832,9 +828,8 @@ class FlavorsTestV2_75(FlavorsTestV2_61):
|
||||
@mock.patch('nova.objects.Flavor.get_by_flavor_id')
|
||||
def test_show_flavor_default_swap_value_old_version(self, mock_get):
|
||||
mock_get.return_value = self.FLAVOR_WITH_NO_SWAP
|
||||
req = self.fake_request.blank(
|
||||
'/%s/flavors/detail?limit=1' % fakes.FAKE_PROJECT_ID,
|
||||
version='2.74')
|
||||
req = fakes.HTTPRequestV21.blank(
|
||||
'/flavors/detail?limit=1', version='2.74')
|
||||
response = self.controller.show(req, 1)
|
||||
response_list = response["flavor"]
|
||||
self.assertEqual(response_list['swap'], "")
|
||||
@@ -843,9 +838,8 @@ class FlavorsTestV2_75(FlavorsTestV2_61):
|
||||
def test_list_flavor_detail_default_swap_value(self, mock_get):
|
||||
mock_get.return_value = objects.FlavorList(
|
||||
objects=[self.FLAVOR_WITH_NO_SWAP])
|
||||
req = self.fake_request.blank(
|
||||
'/%s/flavors/detail?limit=1' % fakes.FAKE_PROJECT_ID,
|
||||
version=self.microversion)
|
||||
req = fakes.HTTPRequestV21.blank(
|
||||
'/flavors/detail?limit=1', version=self.microversion)
|
||||
response = self.controller.detail(req)
|
||||
response_list = response["flavors"]
|
||||
self.assertEqual(response_list[0]['swap'], 0)
|
||||
@@ -853,9 +847,8 @@ class FlavorsTestV2_75(FlavorsTestV2_61):
|
||||
@mock.patch('nova.objects.Flavor.get_by_flavor_id')
|
||||
def test_show_flavor_default_swap_value(self, mock_get):
|
||||
mock_get.return_value = self.FLAVOR_WITH_NO_SWAP
|
||||
req = self.fake_request.blank(
|
||||
'/%s/flavors/detail?limit=1' % fakes.FAKE_PROJECT_ID,
|
||||
version=self.microversion)
|
||||
req = fakes.HTTPRequestV21.blank(
|
||||
'/flavors/detail?limit=1', version=self.microversion)
|
||||
response = self.controller.show(req, 1)
|
||||
response_list = response["flavor"]
|
||||
self.assertEqual(response_list['swap'], 0)
|
||||
@@ -863,21 +856,19 @@ class FlavorsTestV2_75(FlavorsTestV2_61):
|
||||
|
||||
class DisabledFlavorsWithRealDBTestV21(test.TestCase):
|
||||
"""Tests that disabled flavors should not be shown nor listed."""
|
||||
Controller = flavors_v21.FlavorsController
|
||||
fake_request = fakes.HTTPRequestV21
|
||||
|
||||
def setUp(self):
|
||||
super(DisabledFlavorsWithRealDBTestV21, self).setUp()
|
||||
super().setUp()
|
||||
|
||||
# Add a new disabled type to the list of flavors
|
||||
self.req = self.fake_request.blank('/v2.1/flavors')
|
||||
self.req = fakes.HTTPRequestV21.blank('/flavors')
|
||||
self.context = self.req.environ['nova.context']
|
||||
self.admin_context = context.get_admin_context()
|
||||
|
||||
self.disabled_type = self._create_disabled_flavor()
|
||||
self.addCleanup(self.disabled_type.destroy)
|
||||
self.flavors = objects.FlavorList.get_all(self.admin_context)
|
||||
self.controller = self.Controller()
|
||||
self.controller = flavors.FlavorsController()
|
||||
|
||||
def _create_disabled_flavor(self):
|
||||
flavor = objects.Flavor(context=self.admin_context,
|
||||
@@ -938,11 +929,10 @@ class DisabledFlavorsWithRealDBTestV21(test.TestCase):
|
||||
|
||||
|
||||
class ParseIsPublicTestV21(test.TestCase):
|
||||
Controller = flavors_v21.FlavorsController
|
||||
|
||||
def setUp(self):
|
||||
super(ParseIsPublicTestV21, self).setUp()
|
||||
self.controller = self.Controller()
|
||||
super().setUp()
|
||||
self.controller = flavors.FlavorsController()
|
||||
|
||||
def assertPublic(self, expected, is_public):
|
||||
self.assertIs(expected, self.controller._parse_is_public(is_public),
|
||||
@@ -971,4 +961,4 @@ class ParseIsPublicTestV21(test.TestCase):
|
||||
|
||||
def test_other(self):
|
||||
self.assertRaises(
|
||||
webob.exc.HTTPBadRequest, self.assertPublic, None, 'other')
|
||||
webob.exc.HTTPBadRequest, self.assertPublic, None, 'other')
|
||||
|
||||
Reference in New Issue
Block a user