Remove legacy v2 unit tests[q-v]

There are two implementation code for similar API in Nova repository.
One is newer: v2.1 API, another is legacy: v2 API. v2.1 API has been
used as the default API since Liberty and legacy v2 API has been marked
as deprecated. We have used and tested v2.1 API so well and now is nice
time to remove legacy API code based on the consensus of the design
summit of Austin. This patch removes unit tests of legacy v2 API[q-v].

Partially implements blueprint remove-legacy-v2-api-code

Change-Id: I7fd86265ffa4d5bf3d4350a98b48685258947e43
This commit is contained in:
Ken'ichi Ohmichi
2016-05-01 19:58:52 -07:00
parent 7eb7a3dbb2
commit de67ca52c5
26 changed files with 3 additions and 914 deletions
@@ -472,13 +472,6 @@ class _TestNeutronSecurityGroupRulesBase(object):
pass
class TestNeutronSecurityGroupRulesV2(
_TestNeutronSecurityGroupRulesBase,
test_security_groups.TestSecurityGroupRulesV2,
TestNeutronSecurityGroupRulesTestCase):
pass
class TestNeutronSecurityGroupRulesV21(
_TestNeutronSecurityGroupRulesBase,
test_security_groups.TestSecurityGroupRulesV21,
@@ -13,8 +13,6 @@
# License for the specific language governing permissions and limitations
# under the License.
from nova.api.openstack.compute.legacy_v2.contrib import admin_actions as \
pause_server_v2
from nova.api.openstack.compute import pause_server as \
pause_server_v21
from nova import exception
@@ -66,15 +64,6 @@ class PauseServerTestsV21(admin_only_action_common.CommonTests):
self._test_actions_with_locked_instance(['_pause', '_unpause'])
class PauseServerTestsV2(PauseServerTestsV21):
pause_server = pause_server_v2
controller_name = 'AdminActionsController'
_api_version = '2'
def test_actions_raise_on_not_implemented(self):
pass
class PauseServerPolicyEnforcementV21(test.NoDBTestCase):
def setUp(self):
@@ -16,10 +16,8 @@
import webob
from nova.api.openstack.compute import extension_info
from nova.api.openstack.compute.legacy_v2.contrib import quota_classes
from nova.api.openstack.compute import quota_classes \
as quota_classes_v21
from nova.api.openstack import extensions
from nova import exception
from nova import test
from nova.tests.unit.api.openstack import fakes
@@ -141,26 +139,6 @@ class QuotaClassSetsTestV21(test.TestCase):
self.req, 'test_class', body=body)
class QuotaClassSetsTestV2(QuotaClassSetsTestV21):
validation_error = webob.exc.HTTPBadRequest
def _setup(self):
ext_mgr = extensions.ExtensionManager()
ext_mgr.extensions = {}
self.req = fakes.HTTPRequest.blank('', use_admin_context=True)
self.non_admin_req = fakes.HTTPRequest.blank('')
self.controller = quota_classes.QuotaClassSetsController(ext_mgr)
def test_quotas_show_as_unauthorized_user(self):
self.assertRaises(webob.exc.HTTPForbidden, self.controller.show,
self.non_admin_req, 'test_class')
def test_quotas_update_as_user(self):
body = {'quota_class_set': {}}
self.assertRaises(webob.exc.HTTPForbidden, self.controller.update,
self.non_admin_req, 'test_class', body=body)
class QuotaClassesPolicyEnforcementV21(test.NoDBTestCase):
def setUp(self):
@@ -14,12 +14,9 @@
# License for the specific language governing permissions and limitations
# under the License.
import copy
import mock
import webob
from nova.api.openstack.compute.legacy_v2.contrib import quotas as quotas_v2
from nova.api.openstack.compute import quota_sets as quotas_v21
from nova.api.openstack import extensions
from nova import db
@@ -44,29 +41,10 @@ def quota_set(id, include_server_group_quotas=True):
class BaseQuotaSetsTest(test.TestCase):
def _is_v20_api_test(self):
# NOTE(oomichi): If a test is for v2.0 API, this method returns
# True. Otherwise(v2.1 API test), returns False.
return (self.plugin == quotas_v2)
def setup_mock_for_show(self):
if self._is_v20_api_test():
self.ext_mgr.is_loaded('os-user-quotas').AndReturn(True)
self.mox.ReplayAll()
def setup_mock_for_update(self):
if self._is_v20_api_test():
self.ext_mgr.is_loaded('os-extended-quotas').AndReturn(True)
self.ext_mgr.is_loaded('os-user-quotas').AndReturn(True)
self.mox.ReplayAll()
def get_delete_status_int(self, res):
if self._is_v20_api_test():
return res.status_int
else:
# NOTE: on v2.1, http status code is set as wsgi_code of API
# method instead of status_int in a response object.
return self.controller.delete.wsgi_code
# NOTE: on v2.1, http status code is set as wsgi_code of API
# method instead of status_int in a response object.
return self.controller.delete.wsgi_code
class QuotaSetsTestV21(BaseQuotaSetsTest):
@@ -184,7 +162,6 @@ class QuotaSetsTestV21(BaseQuotaSetsTest):
self.assertEqual(res_dict, expected)
def test_quotas_show(self):
self.setup_mock_for_show()
req = self._get_http_request()
res_dict = self.controller.show(req, 1234)
@@ -192,7 +169,6 @@ class QuotaSetsTestV21(BaseQuotaSetsTest):
self.assertEqual(res_dict, ref_quota_set)
def test_quotas_update(self):
self.setup_mock_for_update()
self.default_quotas.update({
'instances': 50,
'cores': 50
@@ -204,7 +180,6 @@ class QuotaSetsTestV21(BaseQuotaSetsTest):
@mock.patch('nova.objects.Quotas.create_limit')
def test_quotas_update_with_good_data(self, mock_createlimit):
self.setup_mock_for_update()
self.default_quotas.update({})
body = {'quota_set': self.default_quotas}
req = self._get_http_request()
@@ -216,7 +191,6 @@ class QuotaSetsTestV21(BaseQuotaSetsTest):
@mock.patch('nova.objects.Quotas.create_limit')
def test_quotas_update_with_bad_data(self, mock_createlimit,
mock_validate):
self.setup_mock_for_update()
self.default_quotas.update({
'instances': 50,
'cores': -50
@@ -229,7 +203,6 @@ class QuotaSetsTestV21(BaseQuotaSetsTest):
len(mock_createlimit.mock_calls))
def test_quotas_update_zero_value(self):
self.setup_mock_for_update()
body = {'quota_set': {'instances': 0, 'cores': 0,
'ram': 0, 'floating_ips': 0,
'metadata_items': 0,
@@ -248,7 +221,6 @@ class QuotaSetsTestV21(BaseQuotaSetsTest):
self.assertEqual(body, res_dict)
def _quotas_update_bad_request_case(self, body):
self.setup_mock_for_update()
req = self._get_http_request()
self.assertRaises(self.validation_error, self.controller.update,
req, 'update_me', body=body)
@@ -296,8 +268,6 @@ class QuotaSetsTestV21(BaseQuotaSetsTest):
self._quotas_update_bad_request_case(body)
def test_quotas_delete(self):
if self._is_v20_api_test():
self.ext_mgr.is_loaded('os-extended-quotas').AndReturn(True)
req = self._get_http_request()
self.mox.StubOutWithMock(quota.QUOTAS,
"destroy_all_by_project")
@@ -315,7 +285,6 @@ class ExtendedQuotasTestV21(BaseQuotaSetsTest):
def setUp(self):
super(ExtendedQuotasTestV21, self).setUp()
self._setup_controller()
self.setup_mock_for_update()
fake_quotas = {'ram': {'limit': 51200,
'in_use': 12800,
@@ -424,14 +393,12 @@ class UserQuotasTestV21(BaseQuotaSetsTest):
self.controller = self.plugin.QuotaSetsController(self.ext_mgr)
def test_user_quotas_show(self):
self.setup_mock_for_show()
req = self._get_http_request('/v2/fake4/os-quota-sets/1234?user_id=1')
res_dict = self.controller.show(req, 1234)
ref_quota_set = quota_set('1234', self.include_server_group_quotas)
self.assertEqual(res_dict, ref_quota_set)
def test_user_quotas_update(self):
self.setup_mock_for_update()
body = {'quota_set': {'instances': 10, 'cores': 20,
'ram': 51200, 'floating_ips': 10,
'fixed_ips': -1, 'metadata_items': 128,
@@ -452,7 +419,6 @@ class UserQuotasTestV21(BaseQuotaSetsTest):
self.assertEqual(body, res_dict)
def test_user_quotas_update_exceed_project(self):
self.setup_mock_for_update()
body = {'quota_set': {'instances': 20}}
url = '/v2/fake4/os-quota-sets/update_me?user_id=1'
@@ -461,9 +427,6 @@ class UserQuotasTestV21(BaseQuotaSetsTest):
req, 'update_me', body=body)
def test_user_quotas_delete(self):
if self._is_v20_api_test():
self.ext_mgr.is_loaded('os-extended-quotas').AndReturn(True)
self.ext_mgr.is_loaded('os-user-quotas').AndReturn(True)
url = '/v2/fake4/os-quota-sets/1234?user_id=1'
req = self._get_http_request(url)
self.mox.StubOutWithMock(quota.QUOTAS,
@@ -477,7 +440,6 @@ class UserQuotasTestV21(BaseQuotaSetsTest):
@mock.patch('nova.objects.Quotas.create_limit')
def test_user_quotas_update_good_data(self, mock_createlimit):
self.setup_mock_for_update()
body = {'quota_set': {'instances': 1,
'cores': 1}}
@@ -489,7 +451,6 @@ class UserQuotasTestV21(BaseQuotaSetsTest):
@mock.patch('nova.objects.Quotas.create_limit')
def test_user_quotas_update_bad_data(self, mock_createlimit):
self.setup_mock_for_update()
body = {'quota_set': {'instances': 20,
'cores': 1}}
@@ -501,201 +462,6 @@ class UserQuotasTestV21(BaseQuotaSetsTest):
len(mock_createlimit.mock_calls))
class QuotaSetsTestV2(QuotaSetsTestV21):
plugin = quotas_v2
validation_error = webob.exc.HTTPBadRequest
def _setup_controller(self):
self.ext_mgr = self.mox.CreateMock(extensions.ExtensionManager)
self.ext_mgr.is_loaded('os-server-group-quotas').MultipleTimes().\
AndReturn(self.include_server_group_quotas)
self.mox.ReplayAll()
self.controller = self.plugin.QuotaSetsController(self.ext_mgr)
self.mox.ResetAll()
def _get_http_request(self, url=''):
return fakes.HTTPRequest.blank(url, use_admin_context=True)
# NOTE: The following tests are tricky and v2.1 API does not allow
# this kind of input by strong input validation. Just for test coverage,
# we keep them now.
def test_quotas_update_invalid_value_json_fromat_empty_string(self):
self.setup_mock_for_update()
self.default_quotas.update({
'instances': 50,
'cores': 50
})
expected_resp = {'quota_set': self.default_quotas}
# when PUT JSON format with empty string for quota
body = copy.deepcopy(expected_resp)
body['quota_set']['ram'] = ''
req = fakes.HTTPRequest.blank('/v2/fake4/os-quota-sets/update_me',
use_admin_context=True)
res_dict = self.controller.update(req, 'update_me', body)
self.assertEqual(res_dict, expected_resp)
def test_quotas_update_invalid_value_xml_fromat_empty_string(self):
self.default_quotas.update({
'instances': 50,
'cores': 50
})
expected_resp = {'quota_set': self.default_quotas}
# when PUT XML format with empty string for quota
body = copy.deepcopy(expected_resp)
body['quota_set']['ram'] = {}
req = fakes.HTTPRequest.blank('/v2/fake4/os-quota-sets/update_me',
use_admin_context=True)
self.setup_mock_for_update()
res_dict = self.controller.update(req, 'update_me', body)
self.assertEqual(res_dict, expected_resp)
# NOTE: os-extended-quotas and os-user-quotas are only for v2.0.
# On v2.1, these features are always enable. So we need the following
# tests only for v2.0.
def test_delete_quotas_when_extension_not_loaded(self):
self.ext_mgr.is_loaded('os-extended-quotas').AndReturn(False)
self.mox.ReplayAll()
req = fakes.HTTPRequest.blank('/v2/fake4/os-quota-sets/1234')
self.assertRaises(webob.exc.HTTPNotFound, self.controller.delete,
req, 1234)
def test_delete_user_quotas_when_extension_not_loaded(self):
self.ext_mgr.is_loaded('os-extended-quotas').AndReturn(True)
self.ext_mgr.is_loaded('os-user-quotas').AndReturn(False)
self.mox.ReplayAll()
req = fakes.HTTPRequest.blank('/v2/fake4/os-quota-sets/1234?user_id=1')
self.assertRaises(webob.exc.HTTPNotFound, self.controller.delete,
req, 1234)
def test_quotas_delete_as_unauthorized_user(self):
if self._is_v20_api_test():
self.ext_mgr.is_loaded('os-extended-quotas').AndReturn(True)
self.mox.ReplayAll()
req = fakes.HTTPRequest.blank('/v2/fake4/os-quota-sets/1234')
self.assertRaises(webob.exc.HTTPForbidden, self.controller.delete,
req, 1234)
def test_quotas_show_as_unauthorized_user(self):
self.setup_mock_for_show()
req = fakes.HTTPRequest.blank('/v2/fake4/os-quota-sets/1234')
self.assertRaises(webob.exc.HTTPForbidden, self.controller.show,
req, 1234)
def test_quotas_update_as_user(self):
self.default_quotas.update({
'instances': 50,
'cores': 50
})
body = {'quota_set': self.default_quotas}
req = fakes.HTTPRequest.blank('/v2/fake4/os-quota-sets/update_me')
self.assertRaises(webob.exc.HTTPForbidden, self.controller.update,
req, 'update_me', body=body)
class QuotaSetsTestV2WithoutServerGroupQuotas(QuotaSetsTestV2):
include_server_group_quotas = False
# NOTE: os-server-group-quotas is only for v2.0. On v2.1 this feature
# is always enabled, so this test is only needed for v2.0
def test_quotas_update_without_server_group_quotas_extenstion(self):
self.setup_mock_for_update()
self.default_quotas.update({
'server_groups': 50,
'sever_group_members': 50
})
body = {'quota_set': self.default_quotas}
req = fakes.HTTPRequest.blank('/v2/fake4/os-quota-sets/update_me',
use_admin_context=True)
self.assertRaises(webob.exc.HTTPBadRequest, self.controller.update,
req, 'update_me', body=body)
class ExtendedQuotasTestV2(ExtendedQuotasTestV21):
plugin = quotas_v2
def _setup_controller(self):
self.ext_mgr = self.mox.CreateMock(extensions.ExtensionManager)
self.ext_mgr.is_loaded('os-server-group-quotas').MultipleTimes().\
AndReturn(False)
self.mox.ReplayAll()
self.controller = self.plugin.QuotaSetsController(self.ext_mgr)
self.mox.ResetAll()
def _get_http_request(self, url=''):
return fakes.HTTPRequest.blank(url, use_admin_context=True)
class UserQuotasTestV2(UserQuotasTestV21):
plugin = quotas_v2
def _setup_controller(self):
self.ext_mgr = self.mox.CreateMock(extensions.ExtensionManager)
self.ext_mgr.is_loaded('os-server-group-quotas').MultipleTimes().\
AndReturn(self.include_server_group_quotas)
self.mox.ReplayAll()
self.controller = self.plugin.QuotaSetsController(self.ext_mgr)
self.mox.ResetAll()
def _get_http_request(self, url=''):
return fakes.HTTPRequest.blank(url, use_admin_context=True)
def test_user_quotas_delete_with_non_admin(self):
self.setup_mock_for_update()
req = fakes.HTTPRequest.blank('/v2/fake4/os-quota-sets/1234?user_id=1')
self.assertRaises(webob.exc.HTTPForbidden, self.controller.delete,
req, '1234')
def test_user_quotas_show_as_unauthorized_user(self):
self.setup_mock_for_show()
req = fakes.HTTPRequest.blank('/v2/fake4/os-quota-sets/1234?user_id=1')
self.assertRaises(webob.exc.HTTPForbidden, self.controller.show,
req, 1234)
def test_user_quotas_update_as_user(self):
body = {'quota_set': {'instances': 10, 'cores': 20,
'ram': 51200, 'floating_ips': 10,
'fixed_ips': -1, 'metadata_items': 128,
'injected_files': 5,
'injected_file_content_bytes': 10240,
'key_pairs': 100,
'security_groups': 10,
'security_group_rules': 20}}
url = '/v2/fake4/os-quota-sets/update_me?user_id=1'
req = fakes.HTTPRequest.blank(url)
self.assertRaises(webob.exc.HTTPForbidden, self.controller.update,
req, 'update_me', body=body)
class UserQuotasTestV2WithoutServerGroupQuotas(UserQuotasTestV2):
include_server_group_quotas = False
# NOTE: os-server-group-quotas is only for v2.0. On v2.1 this feature
# is always enabled, so this test is only needed for v2.0
def test_user_quotas_update_as_admin_without_sg_quota_extension(self):
self.setup_mock_for_update()
body = {'quota_set': {'instances': 10, 'cores': 20,
'ram': 51200, 'floating_ips': 10,
'fixed_ips': -1, 'metadata_items': 128,
'injected_files': 5,
'injected_file_content_bytes': 10240,
'injected_file_path_bytes': 255,
'security_groups': 10,
'security_group_rules': 20,
'key_pairs': 100,
'server_groups': 100,
'server_group_members': 200}}
url = '/v2/fake4/os-quota-sets/update_me?user_id=1'
req = fakes.HTTPRequest.blank(url, use_admin_context=True)
self.assertRaises(webob.exc.HTTPBadRequest, self.controller.update,
req, 'update_me', body=body)
class QuotaSetsPolicyEnforcementV21(test.NoDBTestCase):
def setUp(self):
@@ -17,8 +17,6 @@ import mock
import webob
from nova.api.openstack import api_version_request
from nova.api.openstack.compute.legacy_v2.contrib import consoles \
as console_v2
from nova.api.openstack.compute import remote_consoles \
as console_v21
from nova.compute import api as compute_api
@@ -607,20 +605,6 @@ class ConsolesExtensionTestV28(ConsolesExtensionTestV26):
'webmks')
class ConsolesExtensionTestV2(ConsolesExtensionTestV21):
controller_class = console_v2.ConsolesController
validation_error = webob.exc.HTTPBadRequest
def test_get_vnc_console_with_undefined_param(self):
pass
def test_get_spice_console_with_undefined_param(self):
pass
def test_get_rdp_console_with_undefined_param(self):
pass
class TestRemoteConsolePolicyEnforcementV21(test.NoDBTestCase):
def setUp(self):
@@ -15,9 +15,7 @@
import mock
import webob
from nova.api.openstack.compute.legacy_v2.contrib import rescue as rescue_v2
from nova.api.openstack.compute import rescue as rescue_v21
from nova.api.openstack import extensions
from nova import compute
import nova.conf
from nova import exception
@@ -198,24 +196,6 @@ class RescueTestV21(test.NoDBTestCase):
self.fake_req, UUID, body=body)
class RescueTestV20(RescueTestV21):
def _set_up_controller(self):
ext_mgr = extensions.ExtensionManager()
ext_mgr.extensions = {'os-extended-rescue-with-image': 'fake'}
return rescue_v2.RescueController(ext_mgr)
def test_rescue_with_invalid_property(self):
# NOTE(cyeoh): input validation in original v2 code does not
# check for invalid properties.
pass
def test_rescue_disable_password(self):
# NOTE(cyeoh): Original v2.0 code does not support disabling
# the admin password being returned through a conf setting
pass
class RescuePolicyEnforcementV21(test.NoDBTestCase):
def setUp(self):
@@ -15,18 +15,14 @@
import datetime
import mock
from oslo_config import cfg
from oslo_serialization import jsonutils
from nova.api.openstack import compute
from nova.api.openstack.compute import extension_info
from nova.api.openstack.compute.legacy_v2 import servers as servers_v2
from nova.api.openstack.compute import servers as servers_v21
from nova.api.openstack import extensions
import nova.compute.api
from nova.compute import flavors
from nova import exception
from nova import test
from nova.tests.unit.api.openstack import fakes
from nova.tests.unit import fake_instance
@@ -144,36 +140,6 @@ class SchedulerHintsTestCaseV21(test.TestCase):
self._create_server_with_scheduler_hints_bad_request(param)
class SchedulerHintsTestCaseV2(SchedulerHintsTestCaseV21):
def _set_up_router(self):
self.flags(
osapi_compute_extension=[
'nova.api.openstack.compute.contrib.select_extensions'],
osapi_compute_ext_list=['Scheduler_hints'])
self.app = compute.APIRouter(init_only=('servers',))
def _get_request(self):
return fakes.HTTPRequest.blank('/fake/servers')
def test_create_server_bad_hints_long_group(self):
# NOTE: v2.0 API cannot handle this bad request case now.
# We skip this test for v2.0.
pass
def test_create_server_with_bad_different_host_hint(self):
# NOTE: v2.0 API cannot handle this bad request case now.
# We skip this test for v2.0.
pass
@mock.patch(
'nova.api.openstack.compute.legacy_v2.servers.Controller.create')
def test_create_server_with_non_uuid_group_hint(self, mock_create):
mock_create.side_effect = exception.InvalidInput(reason='')
self._create_server_with_scheduler_hints_bad_request(
{'group': 'non-uuid'})
class ServersControllerCreateTestV21(test.TestCase):
def setUp(self):
@@ -249,18 +215,3 @@ class ServersControllerCreateTestV21(test.TestCase):
self.stubs.Set(nova.compute.api.API, 'create', create)
self._test_create_extra(params)
class ServersControllerCreateTestV2(ServersControllerCreateTestV21):
def _set_up_controller(self):
self.ext_mgr = extensions.ExtensionManager()
self.ext_mgr.extensions = {}
self.no_scheduler_hints_controller = servers_v2.Controller(
self.ext_mgr)
def _verify_availability_zone(self, **kwargs):
self.assertEqual(kwargs['scheduler_hints'], {})
def _get_request(self):
return fakes.HTTPRequest.blank('/fake/servers')
@@ -15,8 +15,6 @@
import mock
import webob
from nova.api.openstack.compute.legacy_v2.contrib import \
security_group_default_rules as security_group_default_rules_v2
from nova.api.openstack.compute import \
security_group_default_rules as security_group_default_rules_v21
from nova import context
@@ -82,11 +80,6 @@ class TestSecurityGroupDefaultRulesNeutronV21(test.TestCase):
req, '602ed77c-a076-4f9b-a617-f93b847b62c5')
class TestSecurityGroupDefaultRulesNeutronV2(test.TestCase):
controller_cls = (security_group_default_rules_v2.
SecurityGroupDefaultRulesController)
class TestSecurityGroupDefaultRulesV21(test.TestCase):
controller_cls = (security_group_default_rules_v21.
SecurityGroupDefaultRulesController)
@@ -315,30 +308,6 @@ class TestSecurityGroupDefaultRulesV21(test.TestCase):
self.assertEqual(sgr['cidr'], security_group_rule.cidr)
class TestSecurityGroupDefaultRulesV2(test.TestCase):
controller_cls = (security_group_default_rules_v2.
SecurityGroupDefaultRulesController)
def setUp(self):
super(TestSecurityGroupDefaultRulesV2, self).setUp()
self.req = fakes.HTTPRequest.blank(
'/v2/fake/os-security-group-default-rules', use_admin_context=True)
self.non_admin_req = fakes.HTTPRequest.blank(
'/v2/fake/os-security-group-default-rules')
def test_create_security_group_default_rules_with_non_admin(self):
self.controller = self.controller_cls()
sgr = security_group_default_rule_template()
sgr_dict = dict(security_group_default_rule=sgr)
self.assertRaises(exception.AdminRequired, self.controller.create,
self.non_admin_req, sgr_dict)
def test_delete_security_group_default_rules_with_non_admin(self):
self.controller = self.controller_cls()
self.assertRaises(exception.AdminRequired,
self.controller.delete, self.non_admin_req, 1)
class SecurityGroupDefaultRulesPolicyEnforcementV21(test.NoDBTestCase):
def setUp(self):
@@ -19,8 +19,6 @@ from oslo_serialization import jsonutils
from oslo_utils import encodeutils
import webob
from nova.api.openstack.compute.legacy_v2.contrib import security_groups as \
secgroups_v2
from nova.api.openstack.compute import security_groups as \
secgroups_v21
from nova.api.openstack import wsgi
@@ -781,12 +779,6 @@ class TestSecurityGroupsV21(test.TestCase):
mock.ANY)
class TestSecurityGroupsV2(TestSecurityGroupsV21):
secgrp_ctl_cls = secgroups_v2.SecurityGroupController
server_secgrp_ctl_cls = secgroups_v2.ServerSecurityGroupController
secgrp_act_ctl_cls = secgroups_v2.SecurityGroupActionController
class TestSecurityGroupRulesV21(test.TestCase):
secgrp_ctl_cls = secgroups_v21.SecurityGroupRulesController
@@ -1262,10 +1254,6 @@ class TestSecurityGroupRulesV21(test.TestCase):
self.req, {'security_group_rule': rule})
class TestSecurityGroupRulesV2(TestSecurityGroupRulesV21):
secgrp_ctl_cls = secgroups_v2.SecurityGroupRulesController
UUID1 = '00000000-0000-0000-0000-000000000001'
UUID2 = '00000000-0000-0000-0000-000000000002'
UUID3 = '00000000-0000-0000-0000-000000000003'
@@ -1397,12 +1385,6 @@ class SecurityGroupsOutputTestV21(test.TestCase):
self.assertEqual(res.status_int, 404)
class SecurityGroupsOutputTestV2(SecurityGroupsOutputTestV21):
def _setup_app(self):
return fakes.wsgi_app(init_only=('servers',))
class SecurityGroupsOutputPolicyEnforcementV21(test.NoDBTestCase):
def setUp(self):
@@ -13,17 +13,14 @@
# License for the specific language governing permissions and limitations
# under the License.
import base64
import uuid
import mock
from mox3 import mox
from oslo_policy import policy as oslo_policy
from oslo_utils import uuidutils
import webob
from nova.api.openstack.compute import extension_info
from nova.api.openstack.compute.legacy_v2 import servers as servers_v2
from nova.api.openstack.compute import servers as servers_v21
from nova.compute import api as compute_api
from nova.compute import task_states
@@ -32,7 +29,6 @@ import nova.conf
from nova import exception
from nova.image import glance
from nova import objects
from nova import policy
from nova import test
from nova.tests.unit.api.openstack import fakes
from nova.tests.unit import fake_block_device
@@ -180,10 +176,6 @@ class ServerActionsControllerTestV21(test.TestCase):
'_action_rebuild': ((self.image_uuid,
'TNc53Dr8s7vw'), {})}
if self.servers == servers_v2:
args_map['_action_rebuild'] = ((self.image_uuid, 'TNc53Dr8s7vw'),
{'files_to_inject': None})
for action in actions:
method = method_translations.get(action)
self.mox.StubOutWithMock(compute_api.API, method)
@@ -1194,168 +1186,3 @@ class ServerActionsControllerTestV21(test.TestCase):
self.assertRaises(webob.exc.HTTPConflict,
self.controller._action_create_image,
self.req, FAKE_UUID, body=body)
class ServerActionsControllerTestV2(ServerActionsControllerTestV21):
image_base_url = 'http://localhost/v2/fake/images/'
servers = servers_v2
validation_error = webob.exc.HTTPBadRequest
request_too_large_error = webob.exc.HTTPRequestEntityTooLarge
image_url = 'http://localhost/v2/fake/images/'
def _get_controller(self):
class FakeExtManager(object):
def is_loaded(self, ext):
return False
return self.servers.Controller(ext_mgr=FakeExtManager())
def _set_fake_extension(self):
def fake_is_loaded(ext):
return ext == 'os-preserve-ephemeral-rebuild'
self.stubs.Set(self.controller.ext_mgr, 'is_loaded', fake_is_loaded)
def _rebuild(self, context, image_ref, value=None):
if value is not None:
compute_api.API.rebuild(context, mox.IgnoreArg(), image_ref,
mox.IgnoreArg(), preserve_ephemeral=value,
files_to_inject=None)
else:
compute_api.API.rebuild(context, mox.IgnoreArg(), image_ref,
mox.IgnoreArg(), files_to_inject=None)
def _stub_instance_get(self, uuid=None):
self.mox.StubOutWithMock(compute_api.API, 'get')
if uuid is None:
uuid = uuidutils.generate_uuid()
instance = fake_instance.fake_db_instance(
id=1, uuid=uuid, vm_state=vm_states.ACTIVE, task_state=None)
instance = objects.Instance._from_db_object(
self.context, objects.Instance(), instance)
self.compute_api.get(self.context, uuid,
expected_attrs=['flavor'],
want_objects=True).AndReturn(instance)
return instance
def test_rebuild_bad_personality(self):
body = {
"rebuild": {
"imageRef": self._image_href,
"personality": [{
"path": "/path/to/file",
"contents": "INVALID b64",
}]
},
}
self.assertRaises(webob.exc.HTTPBadRequest,
self.controller._action_rebuild,
self.req, FAKE_UUID, body=body)
def test_rebuild_personality(self):
body = {
"rebuild": {
"imageRef": self._image_href,
"personality": [{
"path": "/path/to/file",
"contents": base64.b64encode("Test String"),
}]
},
}
body = self.controller._action_rebuild(self.req, FAKE_UUID,
body=body).obj
self.assertNotIn('personality', body['server'])
def test_resize_server_with_extra_arg(self):
# NOTE: v2.0 API cannot cover this case, skip this.
pass
def test_resize_server_invalid_flavor_ref(self):
# NOTE: v2.0 API cannot cover this case, skip this.
pass
def test_create_image_glance_link_prefix(self):
self.flags(osapi_glance_link_prefix='https://glancehost')
body = {
'createImage': {
'name': 'Snapshot 1',
},
}
response = self.controller._action_create_image(self.req, FAKE_UUID,
body=body)
location = response.headers['Location']
self.assertEqual('https://glancehost/v2/fake/images/123', location)
def test_rebuild_preserve_ephemeral_is_ignored_when_ext_not_loaded(self):
return_server = fakes.fake_instance_get(image_ref='2',
vm_state=vm_states.ACTIVE,
host='fake_host')
self.stub_out('nova.db.instance_get_by_uuid', return_server)
body = {
"rebuild": {
"imageRef": self._image_href,
"preserve_ephemeral": False,
},
}
self.mox.StubOutWithMock(compute_api.API, 'rebuild')
compute_api.API.rebuild(self.context, mox.IgnoreArg(),
self._image_href,
mox.IgnoreArg(), files_to_inject=None)
self.mox.ReplayAll()
self.controller._action_rebuild(self.req, FAKE_UUID, body)
def test_create_vol_backed_img_snapshotting_policy_blocks_project(self):
"""Don't permit a snapshot of a volume backed instance if configured
not to based on project
"""
body = {
'createImage': {
'name': 'Snapshot 1',
},
}
rule_name = "compute:snapshot_volume_backed"
rules = {
rule_name: "project_id:no_id",
"compute:get": ""
}
policy.set_rules(oslo_policy.Rules.from_dict(rules))
with mock.patch.object(compute_api.API, 'is_volume_backed_instance',
return_value=True):
exc = self.assertRaises(exception.PolicyNotAuthorized,
self.controller._action_create_image,
self.req, FAKE_UUID, body=body)
self.assertEqual(
"Policy doesn't allow %s to be performed." % rule_name,
exc.format_message())
def test_create_vol_backed_img_snapshotting_policy_blocks_role(self):
"""Don't permit a snapshot of a volume backed instance if configured
not to based on role
"""
body = {
'createImage': {
'name': 'Snapshot 1',
},
}
rule_name = "compute:snapshot_volume_backed"
rules = {
rule_name: "role:no_role",
"compute:get": ""
}
policy.set_rules(oslo_policy.Rules.from_dict(rules))
with mock.patch.object(compute_api.API, 'is_volume_backed_instance',
return_value=True):
exc = self.assertRaises(exception.PolicyNotAuthorized,
self.controller._action_create_image,
self.req, FAKE_UUID, body=body)
self.assertEqual(
"Policy doesn't allow %s to be performed." % rule_name,
exc.format_message())
@@ -15,8 +15,6 @@
import mock
import webob
from nova.api.openstack.compute.legacy_v2.contrib import server_external_events \
as server_external_events_v2
from nova.api.openstack.compute import server_external_events \
as server_external_events_v21
from nova import exception
@@ -152,9 +150,3 @@ class ServerExternalEventsTestV21(test.NoDBTestCase):
body = {'events': self.event_1}
self.assertRaises(self.invalid_error,
self.api.create, self.req, body=body)
@mock.patch('nova.objects.instance.Instance.get_by_uuid', fake_get_by_uuid)
class ServerExternalEventsTestV2(ServerExternalEventsTestV21):
server_external_events = server_external_events_v2
invalid_error = webob.exc.HTTPBadRequest
@@ -17,9 +17,7 @@ from oslo_config import cfg
from oslo_utils import uuidutils
import webob
from nova.api.openstack.compute.legacy_v2.contrib import server_groups
from nova.api.openstack.compute import server_groups as sg_v21
from nova.api.openstack import extensions
from nova import context
from nova import quota
from nova import test
@@ -161,15 +159,3 @@ class ServerGroupQuotasTestV21(test.TestCase):
else:
status_int = resp.status_int
self.assertEqual(204, status_int)
class ServerGroupQuotasTestV2(ServerGroupQuotasTestV21):
def _setup_controller(self):
self.ext_mgr = self.mox.CreateMock(extensions.ExtensionManager)
self.controller = server_groups.ServerGroupController(self.ext_mgr)
def _setup_quotas(self):
self.ext_mgr.is_loaded('os-server-group-quotas').MultipleTimes()\
.AndReturn(True)
self.mox.ReplayAll()
@@ -18,9 +18,7 @@ import webob
import mock
from nova.api.openstack.compute.legacy_v2.contrib import server_groups
from nova.api.openstack.compute import server_groups as sg_v21
from nova.api.openstack import extensions
from nova import context
import nova.db
from nova import exception
@@ -424,15 +422,6 @@ class ServerGroupTestV21(test.TestCase):
self.req, 'invalid')
class ServerGroupTestV2(ServerGroupTestV21):
validation_error = webob.exc.HTTPBadRequest
def _setup_controller(self):
ext_mgr = extensions.ExtensionManager()
ext_mgr.extensions = {}
self.controller = server_groups.ServerGroupController(ext_mgr)
class ServerGroupTestV213(ServerGroupTestV21):
wsgi_api_version = '2.13'
@@ -22,8 +22,6 @@ from oslo_utils import timeutils
import six
import webob
from nova.api.openstack.compute.legacy_v2 import server_metadata \
as server_metadata_v2
from nova.api.openstack.compute import server_metadata \
as server_metadata_v21
from nova.compute import rpcapi as compute_rpcapi
@@ -669,19 +667,6 @@ class ServerMetaDataTestV21(test.TestCase):
body=data)
class ServerMetaDataTestV2(ServerMetaDataTestV21):
validation_ex = webob.exc.HTTPBadRequest
validation_ex_large = webob.exc.HTTPRequestEntityTooLarge
def _set_up_resources(self):
self.controller = server_metadata_v2.Controller()
self.uuid = str(uuid.uuid4())
self.url = '/v1.1/fake/servers/%s/metadata' % self.uuid
def _get_request(self, param_url=''):
return fakes.HTTPRequest.blank(self.url + param_url)
class BadStateServerMetaDataTestV21(test.TestCase):
def setUp(self):
@@ -762,16 +747,6 @@ class BadStateServerMetaDataTestV21(test.TestCase):
req, self.uuid, body=expected)
class BadStateServerMetaDataTestV2(BadStateServerMetaDataTestV21):
def _set_up_resources(self):
self.controller = server_metadata_v2.Controller()
self.uuid = str(uuid.uuid4())
self.url = '/v1.1/fake/servers/%s/metadata' % self.uuid
def _get_request(self, param_url=''):
return fakes.HTTPRequest.blank(self.url + param_url)
class ServerMetaPolicyEnforcementV21(test.NoDBTestCase):
def setUp(self):
@@ -18,8 +18,6 @@ import mock
from oslo_config import cfg
from nova.api.metadata import password
from nova.api.openstack.compute.legacy_v2.contrib import server_password \
as server_password_v2
from nova.api.openstack.compute import server_password \
as server_password_v21
from nova import compute
@@ -30,8 +28,6 @@ from nova.tests.unit import fake_instance
CONF = cfg.CONF
CONF.import_opt('osapi_compute_ext_list',
'nova.api.openstack.compute.legacy_v2.contrib')
class ServerPasswordTestV21(test.NoDBTestCase):
@@ -76,11 +72,6 @@ class ServerPasswordTestV21(test.NoDBTestCase):
self.assertEqual(res['password'], '')
class ServerPasswordTestV2(ServerPasswordTestV21):
server_password = server_password_v2
delete_call = 'self.controller.delete'
class ServerPasswordPolicyEnforcementV21(test.NoDBTestCase):
def setUp(self):
@@ -17,8 +17,6 @@ import webob
from nova.api.openstack.compute import admin_actions \
as admin_actions_v21
from nova.api.openstack.compute.legacy_v2.contrib import admin_actions \
as admin_actions_v2
from nova.compute import vm_states
from nova import exception
from nova import objects
@@ -120,8 +118,3 @@ class ResetStateTestsV21(test.NoDBTestCase):
else:
status_int = result.status_int
self.assertEqual(202, status_int)
class ResetStateTestsV2(ResetStateTestsV21):
admin_act = admin_actions_v2
bad_request = webob.exc.HTTPBadRequest
@@ -19,8 +19,6 @@ import webob
from oslo_policy import policy as oslo_policy
from nova.api.openstack.compute import extension_info
from nova.api.openstack.compute.legacy_v2.contrib import server_start_stop \
as server_v2
from nova.api.openstack.compute import servers \
as server_v21
from nova.compute import api as compute_api
@@ -164,11 +162,3 @@ class ServerStartStopTestV21(test.TestCase):
body = dict(stop="")
self.assertRaises(webob.exc.HTTPNotFound,
self.controller._stop_server, self.req, uuids.instance, body)
class ServerStartStopTestV2(ServerStartStopTestV21):
start_policy = "compute:start"
stop_policy = "compute:stop"
def _setup_controller(self):
self.controller = server_v2.ServerStartStopActionController()
@@ -22,8 +22,6 @@ from oslo_utils import fixture as utils_fixture
import webob.exc
from nova.api.openstack import api_version_request as api_version
from nova.api.openstack.compute.legacy_v2.contrib import services \
as services_v2
from nova.api.openstack.compute import services as services_v21
from nova.api.openstack import extensions
from nova.api.openstack import wsgi as os_wsgi
@@ -860,44 +858,6 @@ class ServicesTestV211(ServicesTestV21):
self.assertEqual(res_dict, response)
class ServicesTestV20(ServicesTestV21):
service_is_up_exc = KeyError
bad_request = webob.exc.HTTPBadRequest
def setUp(self):
super(ServicesTestV20, self).setUp()
self.req = fakes.HTTPRequest.blank('', use_admin_context=True)
self.non_admin_req = fakes.HTTPRequest.blank('')
def _set_up_controller(self):
self.controller = services_v2.ServiceController(self.ext_mgr)
def test_services_delete_not_enabled(self):
self.assertRaises(webob.exc.HTTPMethodNotAllowed,
self.controller.delete, self.req, '300')
def _process_output(self, services, has_disabled=False, has_id=False):
for service in services['services']:
if not has_disabled:
service.pop('disabled_reason')
if not has_id:
service.pop('id')
return services
def test_update_with_non_admin(self):
self.assertRaises(exception.AdminRequired, self.controller.update,
self.non_admin_req, fakes.FAKE_UUID, body={})
def test_delete_with_non_admin(self):
self.ext_mgr.extensions['os-extended-services-delete'] = True
self.assertRaises(exception.AdminRequired, self.controller.delete,
self.non_admin_req, fakes.FAKE_UUID)
def test_index_with_non_admin(self):
self.assertRaises(exception.AdminRequired, self.controller.index,
self.non_admin_req)
class ServicesCellsTestV21(test.TestCase):
def setUp(self):
@@ -972,15 +932,6 @@ class ServicesCellsTestV21(test.TestCase):
self.assertEqual(response, res_dict)
class ServicesCellsTestV20(ServicesCellsTestV21):
def _set_up_controller(self):
self.controller = services_v2.ServiceController(self.ext_mgr)
def _process_out(self, res_dict):
pass
class ServicesPolicyEnforcementV21(test.NoDBTestCase):
def setUp(self):
@@ -18,7 +18,6 @@ import mock
from oslo_policy import policy as oslo_policy
import webob
from nova.api.openstack.compute.legacy_v2.contrib import shelve as shelve_v2
from nova.api.openstack.compute import shelve as shelve_v21
from nova.compute import api as compute_api
from nova import exception
@@ -91,46 +90,6 @@ class ShelvePolicyTestV21(test.NoDBTestCase):
self.req, str(uuid.uuid4()), {})
class ShelvePolicyTestV2(ShelvePolicyTestV21):
plugin = shelve_v2
prefix = ''
offload = 'shelveOffload'
def _get_instance_other_project(self):
context = self.req.environ['nova.context']
project_id = '%s_unequal' % context.project_id
return objects.Instance(project_id=project_id)
@mock.patch('nova.objects.instance.Instance.get_by_uuid')
def test_shelve_allowed(self, mock_instance_get):
mock_instance_get.return_value = self._get_instance_other_project()
rules = {'compute:get': '',
'compute_extension:%sshelve' % self.prefix: ''}
policy.set_rules(oslo_policy.Rules.from_dict(rules))
self.assertRaises(exception.Forbidden, self.controller._shelve,
self.req, str(uuid.uuid4()), {})
@mock.patch('nova.objects.instance.Instance.get_by_uuid')
def test_unshelve_allowed(self, mock_instance_get):
mock_instance_get.return_value = self._get_instance_other_project()
rules = {'compute:get': '',
'compute_extension:%sunshelve' % self.prefix: ''}
policy.set_rules(oslo_policy.Rules.from_dict(rules))
self.assertRaises(exception.Forbidden, self.controller._unshelve,
self.req, str(uuid.uuid4()), {})
@mock.patch('nova.objects.instance.Instance.get_by_uuid')
def test_shelve_offload_allowed(self, mock_instance_get):
mock_instance_get.return_value = self._get_instance_other_project()
rules = {'compute:get': '',
'compute_extension:%s%s' % (self.prefix, self.offload): ''}
policy.set_rules(oslo_policy.Rules.from_dict(rules))
self.assertRaises(exception.Forbidden,
self.controller._shelve_offload,
self.req,
str(uuid.uuid4()), {})
class ShelvePolicyEnforcementV21(test.NoDBTestCase):
def setUp(self):
@@ -21,8 +21,6 @@ from oslo_utils import timeutils
from six.moves import range
import webob
from nova.api.openstack.compute.legacy_v2.contrib import simple_tenant_usage as \
simple_tenant_usage_v2
from nova.api.openstack.compute import simple_tenant_usage as \
simple_tenant_usage_v21
from nova.compute import vm_states
@@ -256,11 +254,6 @@ class SimpleTenantUsageTestV21(test.TestCase):
'start=%s' % (NOW - datetime.timedelta(5)).isoformat())
class SimpleTenantUsageTestV2(SimpleTenantUsageTestV21):
policy_rule_prefix = "compute_extension:simple_tenant_usage"
controller = simple_tenant_usage_v2.SimpleTenantUsageController()
class SimpleTenantUsageControllerTestV21(test.TestCase):
controller = simple_tenant_usage_v21.SimpleTenantUsageController()
@@ -308,10 +301,6 @@ class SimpleTenantUsageControllerTestV21(test.TestCase):
self.assertIsNone(flavor)
class SimpleTenantUsageControllerTestV2(SimpleTenantUsageControllerTestV21):
controller = simple_tenant_usage_v2.SimpleTenantUsageController()
class SimpleTenantUsageUtilsV21(test.NoDBTestCase):
simple_tenant_usage = simple_tenant_usage_v21
@@ -327,7 +316,3 @@ class SimpleTenantUsageUtilsV21(test.NoDBTestCase):
self.simple_tenant_usage.parse_strtime,
"2014-02-21 13:47:20.824060",
"%Y-%m-%dT%H:%M:%S.%f")
class SimpleTenantUsageUtilsV2(SimpleTenantUsageUtilsV21):
simple_tenant_usage = simple_tenant_usage_v2
@@ -16,7 +16,6 @@
import mock
import webob
from nova.api.openstack.compute.legacy_v2.contrib import volumes as volumes_v2
from nova.api.openstack.compute import volumes as volumes_v21
from nova import exception
from nova import test
@@ -119,8 +118,3 @@ class SnapshotApiTestV21(test.NoDBTestCase):
self.assertIn('snapshots', resp_dict)
resp_snapshots = resp_dict['snapshots']
self.assertEqual(3, len(resp_snapshots))
class SnapshotApiTestV2(SnapshotApiTestV21):
controller = volumes_v2.SnapshotController()
validation_error = webob.exc.HTTPBadRequest
@@ -12,8 +12,6 @@
# License for the specific language governing permissions and limitations
# under the License.
from nova.api.openstack.compute.legacy_v2.contrib import admin_actions as \
suspend_server_v2
from nova.api.openstack.compute import suspend_server as \
suspend_server_v21
from nova import exception
@@ -53,12 +51,6 @@ class SuspendServerTestsV21(admin_only_action_common.CommonTests):
self._test_actions_with_locked_instance(['_suspend', '_resume'])
class SuspendServerTestsV2(SuspendServerTestsV21):
suspend_server = suspend_server_v2
controller_name = 'AdminActionsController'
_api_version = '2'
class SuspendServerPolicyEnforcementV21(test.NoDBTestCase):
def setUp(self):
@@ -18,8 +18,6 @@ import mock
from oslo_config import cfg
import webob
from nova.api.openstack.compute.legacy_v2.contrib import os_tenant_networks \
as networks
from nova.api.openstack.compute import tenant_networks \
as networks_v21
from nova import exception
@@ -259,19 +257,6 @@ class TenantNetworksTestV21(test.NoDBTestCase):
self.controller.create, self.req, body=body)
class TenantNetworksTestV2(TenantNetworksTestV21):
ctrlr = networks.NetworkController
validation_error = webob.exc.HTTPBadRequest
def setUp(self):
super(TenantNetworksTestV2, self).setUp()
self.req = fakes.HTTPRequest.blank('', use_admin_context=True)
def test_network_create_empty_body(self):
self.assertRaises(webob.exc.HTTPUnprocessableEntity,
self.controller.create, self.req, {})
class TenantNetworksEnforcementV21(test.NoDBTestCase):
def setUp(self):
@@ -15,8 +15,6 @@
import six
from nova.api.openstack.compute.legacy_v2.contrib import used_limits \
as used_limits_v2
from nova.api.openstack.compute import used_limits \
as used_limits_v21
from nova.api.openstack import extensions
@@ -257,18 +255,3 @@ class UsedLimitsTestCaseV21(test.NoDBTestCase):
self.controller.index(fake_req, res)
abs_limits = res.obj['limits']['absolute']
self.assertNotIn('totalRAMUsed', abs_limits)
class UsedLimitsTestCaseV2(UsedLimitsTestCaseV21):
used_limit_extension = "compute_extension:used_limits_for_admin"
def _set_up_controller(self):
self.ext_mgr = self.mox.CreateMock(extensions.ExtensionManager)
self.controller = used_limits_v2.UsedLimitsController(self.ext_mgr)
self.mox.StubOutWithMock(used_limits_v2, 'authorize_for_admin')
self.authorize = used_limits_v2.authorize_for_admin
class UsedLimitsTestCaseV2WithoutServerGroupQuotas(UsedLimitsTestCaseV2):
used_limit_extension = "compute_extension:used_limits_for_admin"
include_server_group_quotas = False
@@ -16,8 +16,6 @@
import webob
from nova.api.openstack import api_version_request
from nova.api.openstack.compute.legacy_v2.contrib import virtual_interfaces \
as vi20
from nova.api.openstack.compute import virtual_interfaces as vi21
from nova import compute
from nova.compute import api as compute_api
@@ -118,12 +116,6 @@ class ServerVirtualInterfaceTestV21(test.NoDBTestCase):
self.controller.index, req, FAKE_UUID)
class ServerVirtualInterfaceTestV20(ServerVirtualInterfaceTestV21):
def _set_controller(self):
self.controller = vi20.ServerVirtualInterfaceController()
class ServerVirtualInterfaceTestV212(ServerVirtualInterfaceTestV21):
wsgi_api_version = '2.12'
@@ -25,11 +25,7 @@ from webob import exc
from nova.api.openstack import common
from nova.api.openstack.compute import assisted_volume_snapshots \
as assisted_snaps_v21
from nova.api.openstack.compute.legacy_v2.contrib import \
assisted_volume_snapshots as assisted_snaps_v2
from nova.api.openstack.compute.legacy_v2.contrib import volumes
from nova.api.openstack.compute import volumes as volumes_v21
from nova.api.openstack import extensions
from nova.compute import api as compute_api
from nova.compute import flavors
from nova.compute import vm_states
@@ -352,13 +348,6 @@ class VolumeApiTestV21(test.NoDBTestCase):
self.assertIn('Volume 456 could not be found.', resp.body)
class VolumeApiTestV2(VolumeApiTestV21):
@property
def app(self):
return fakes.wsgi_app(init_only=('os-volumes', 'servers'))
class VolumeAttachTestsV21(test.NoDBTestCase):
validation_error = exception.ValidationError
@@ -749,47 +738,6 @@ class VolumeAttachTestsV21(test.NoDBTestCase):
body=body)
class VolumeAttachTestsV2(VolumeAttachTestsV21):
validation_error = webob.exc.HTTPBadRequest
def _set_up_controller(self):
ext_mgr = extensions.ExtensionManager()
ext_mgr.extensions = {'os-volume-attachment-update'}
self.attachments = volumes.VolumeAttachmentController(ext_mgr)
ext_mgr_no_update = extensions.ExtensionManager()
ext_mgr_no_update.extensions = {}
self.attachments_no_update = volumes.VolumeAttachmentController(
ext_mgr_no_update)
def test_swap_volume_no_extension(self):
self.assertRaises(webob.exc.HTTPBadRequest, self._test_swap,
self.attachments_no_update)
@mock.patch.object(compute_api.API, 'attach_volume',
return_value=[])
def test_attach_volume_with_extra_arg(self, mock_attach):
# NOTE(gmann): V2 does not perform strong input validation
# so volume is attached successfully even with extra arg in
# request body.
body = {'volumeAttachment': {'volumeId': FAKE_UUID_A,
'device': '/dev/fake',
'extra': 'extra_arg'}}
req = fakes.HTTPRequest.blank('/v2/servers/id/os-volume_attachments')
req.method = 'POST'
req.body = jsonutils.dump_as_bytes({})
req.headers['content-type'] = 'application/json'
req.environ['nova.context'] = self.context
result = self.attachments.create(req, FAKE_UUID, body=body)
self.assertEqual('00000000-aaaa-aaaa-aaaa-000000000000',
result['volumeAttachment']['id'])
def test_swap_volume_with_extra_arg(self):
# NOTE(gmann): V2 does not perform strong input validation.
# Volume is swapped successfully even with extra arg in
# request body. So 'pass' this test for V2.
pass
class CommonBadRequestTestCase(object):
resource = None
@@ -836,19 +784,6 @@ class BadRequestVolumeTestCaseV21(CommonBadRequestTestCase,
bad_request = exception.ValidationError
class BadRequestVolumeTestCaseV2(BadRequestVolumeTestCaseV21):
controller_cls = volumes.VolumeController
bad_request = exc.HTTPBadRequest
class BadRequestAttachmentTestCase(CommonBadRequestTestCase,
test.NoDBTestCase):
resource = 'servers/' + FAKE_UUID + '/os-volume_attachments'
entity_name = 'volumeAttachment'
controller_cls = volumes.VolumeAttachmentController
kwargs = {'server_id': FAKE_UUID}
class BadRequestSnapshotTestCaseV21(CommonBadRequestTestCase,
test.NoDBTestCase):
@@ -858,11 +793,6 @@ class BadRequestSnapshotTestCaseV21(CommonBadRequestTestCase,
bad_request = exception.ValidationError
class BadRequestSnapshotTestCaseV2(BadRequestSnapshotTestCaseV21):
controller_cls = volumes.SnapshotController
bad_request = exc.HTTPBadRequest
class AssistedSnapshotCreateTestCaseV21(test.NoDBTestCase):
assisted_snaps = assisted_snaps_v21
bad_request = exception.ValidationError
@@ -910,16 +840,6 @@ class AssistedSnapshotCreateTestCaseV21(test.NoDBTestCase):
req, body=body)
class AssistedSnapshotCreateTestCaseV2(AssistedSnapshotCreateTestCaseV21):
assisted_snaps = assisted_snaps_v2
bad_request = webob.exc.HTTPBadRequest
def test_assisted_create_with_unexpected_attr(self):
# NOTE: legacy v2.0 API cannot handle this kind of invalid requests.
# So we need to skip the test on legacy v2.0 API.
pass
class AssistedSnapshotDeleteTestCaseV21(test.NoDBTestCase):
assisted_snaps = assisted_snaps_v21
@@ -952,13 +872,6 @@ class AssistedSnapshotDeleteTestCaseV21(test.NoDBTestCase):
req, '5')
class AssistedSnapshotDeleteTestCaseV2(AssistedSnapshotDeleteTestCaseV21):
assisted_snaps = assisted_snaps_v2
def _check_status(self, expected_status, res, controller_method):
self.assertEqual(expected_status, res.status_int)
class TestAssistedVolumeSnapshotsPolicyEnforcementV21(test.NoDBTestCase):
def setUp(self):