Merge "Refactor scheduler RPC API test cases"
This commit is contained in:
@@ -85,7 +85,7 @@ class SchedulerAPI(rpc.RPCAPI):
|
||||
'filter_properties_list': filter_properties_list,
|
||||
}
|
||||
|
||||
return cctxt.cast(ctxt, 'create_consistencygroup', **msg_args)
|
||||
cctxt.cast(ctxt, 'create_consistencygroup', **msg_args)
|
||||
|
||||
def create_group(self, ctxt, group, group_spec=None,
|
||||
request_spec_list=None, group_filter_properties=None,
|
||||
@@ -101,7 +101,7 @@ class SchedulerAPI(rpc.RPCAPI):
|
||||
'filter_properties_list': filter_properties_list,
|
||||
}
|
||||
|
||||
return cctxt.cast(ctxt, 'create_group', **msg_args)
|
||||
cctxt.cast(ctxt, 'create_group', **msg_args)
|
||||
|
||||
def create_volume(self, ctxt, volume, snapshot_id=None, image_id=None,
|
||||
request_spec=None, filter_properties=None):
|
||||
|
||||
@@ -22,97 +22,55 @@ from datetime import datetime
|
||||
import ddt
|
||||
import mock
|
||||
|
||||
from cinder import context
|
||||
from cinder import exception
|
||||
from cinder import objects
|
||||
from cinder.scheduler import rpcapi as scheduler_rpcapi
|
||||
from cinder import test
|
||||
from cinder.tests.unit import fake_constants
|
||||
from cinder.tests.unit import fake_group
|
||||
from cinder.tests.unit import fake_volume
|
||||
|
||||
|
||||
@ddt.ddt
|
||||
class SchedulerRpcAPITestCase(test.TestCase):
|
||||
|
||||
class SchedulerRPCAPITestCase(test.RPCAPITestCase):
|
||||
def setUp(self):
|
||||
super(SchedulerRpcAPITestCase, self).setUp()
|
||||
self.context = context.RequestContext('fake_user', 'fake_project')
|
||||
super(SchedulerRPCAPITestCase, self).setUp()
|
||||
self.rpcapi = scheduler_rpcapi.SchedulerAPI
|
||||
self.base_version = '3.0'
|
||||
self.volume_id = fake_constants.VOLUME_ID
|
||||
|
||||
def _test_scheduler_api(self, method, rpc_method,
|
||||
fanout=False, ignore_for_method=None,
|
||||
ignore_for_rpc=None, **kwargs):
|
||||
ctxt = self.context
|
||||
rpcapi = scheduler_rpcapi.SchedulerAPI()
|
||||
expected_retval = 'foo' if rpc_method == 'call' else None
|
||||
ignore_for_method = ignore_for_method or []
|
||||
ignore_for_rpc = ignore_for_rpc or []
|
||||
|
||||
target = {
|
||||
"fanout": fanout,
|
||||
"version": kwargs.pop('version', rpcapi.RPC_API_VERSION)
|
||||
}
|
||||
|
||||
expected_msg = {k: v for k, v in kwargs.items()
|
||||
if k not in ignore_for_rpc}
|
||||
|
||||
method_args = {k: v for k, v in kwargs.items()
|
||||
if k not in ignore_for_method}
|
||||
|
||||
self.fake_args = None
|
||||
self.fake_kwargs = None
|
||||
|
||||
def _fake_prepare_method(*args, **kwds):
|
||||
for kwd in kwds:
|
||||
self.assertEqual(target[kwd], kwds[kwd])
|
||||
return rpcapi.client
|
||||
|
||||
def _fake_rpc_method(*args, **kwargs):
|
||||
self.fake_args = args
|
||||
self.fake_kwargs = kwargs
|
||||
if expected_retval:
|
||||
return expected_retval
|
||||
|
||||
with mock.patch.object(rpcapi.client, "prepare") as mock_prepared:
|
||||
mock_prepared.side_effect = _fake_prepare_method
|
||||
|
||||
with mock.patch.object(rpcapi.client, rpc_method) as mock_method:
|
||||
mock_method.side_effect = _fake_rpc_method
|
||||
retval = getattr(rpcapi, method)(ctxt, **method_args)
|
||||
self.assertEqual(expected_retval, retval)
|
||||
expected_args = [ctxt, method, expected_msg]
|
||||
for arg, expected_arg in zip(self.fake_args, expected_args):
|
||||
self.assertEqual(expected_arg, arg)
|
||||
|
||||
for kwarg, value in self.fake_kwargs.items():
|
||||
self.assertEqual(expected_msg[kwarg], value)
|
||||
self.fake_volume = fake_volume.fake_volume_obj(
|
||||
self.context, expected_attrs=['metadata', 'admin_metadata',
|
||||
'glance_metadata'])
|
||||
self.fake_consistencygroup = fake_group
|
||||
self.fake_rs_obj = objects.RequestSpec.from_primitives({})
|
||||
self.fake_rs_dict = {'volume_id': self.volume_id}
|
||||
self.fake_fp_dict = {'availability_zone': 'fake_az'}
|
||||
|
||||
@ddt.data('3.0', '3.3')
|
||||
@mock.patch('oslo_messaging.RPCClient.can_send_version')
|
||||
def test_update_service_capabilities(self, version, can_send_version):
|
||||
can_send_version.side_effect = lambda x: x == version
|
||||
self._test_scheduler_api('update_service_capabilities',
|
||||
rpc_method='cast',
|
||||
service_name='fake_name',
|
||||
host='fake_host',
|
||||
cluster_name='cluster_name',
|
||||
capabilities={},
|
||||
fanout=True,
|
||||
version=version,
|
||||
timestamp='123')
|
||||
self._test_rpc_api('update_service_capabilities',
|
||||
rpc_method='cast',
|
||||
service_name='fake_name',
|
||||
host='fake_host',
|
||||
cluster_name='cluster_name',
|
||||
capabilities={},
|
||||
fanout=True,
|
||||
version=version,
|
||||
timestamp='123')
|
||||
can_send_version.assert_called_once_with('3.3')
|
||||
|
||||
def test_create_volume(self):
|
||||
volume = fake_volume.fake_volume_obj(self.context)
|
||||
create_worker_mock = self.mock_object(volume, 'create_worker')
|
||||
self._test_scheduler_api('create_volume',
|
||||
rpc_method='cast',
|
||||
snapshot_id='snapshot_id',
|
||||
image_id='image_id',
|
||||
request_spec='fake_request_spec',
|
||||
filter_properties='filter_properties',
|
||||
volume=volume,
|
||||
version='3.0')
|
||||
create_worker_mock = self.mock_object(self.fake_volume,
|
||||
'create_worker')
|
||||
self._test_rpc_api('create_volume',
|
||||
rpc_method='cast',
|
||||
volume=self.fake_volume,
|
||||
snapshot_id=fake_constants.SNAPSHOT_ID,
|
||||
image_id=fake_constants.IMAGE_ID,
|
||||
request_spec=self.fake_rs_obj,
|
||||
filter_properties=self.fake_fp_dict)
|
||||
create_worker_mock.assert_called_once()
|
||||
|
||||
@mock.patch('oslo_messaging.RPCClient.can_send_version', return_value=True)
|
||||
@@ -122,14 +80,13 @@ class SchedulerRpcAPITestCase(test.TestCase):
|
||||
'total': '10.01', }
|
||||
with mock.patch('oslo_utils.timeutils.utcnow',
|
||||
return_value=datetime(1970, 1, 1)):
|
||||
self._test_scheduler_api('notify_service_capabilities',
|
||||
rpc_method='cast',
|
||||
service_name='fake_name',
|
||||
backend='fake_host',
|
||||
capabilities=capabilities,
|
||||
timestamp='1970-01-01T00:00:00.000000',
|
||||
ignore_for_method=['timestamp'],
|
||||
version='3.5')
|
||||
self._test_rpc_api('notify_service_capabilities',
|
||||
rpc_method='cast',
|
||||
service_name='fake_name',
|
||||
backend='fake_host',
|
||||
capabilities=capabilities,
|
||||
timestamp='1970-01-01T00:00:00.000000',
|
||||
version='3.5')
|
||||
|
||||
@mock.patch('oslo_messaging.RPCClient.can_send_version',
|
||||
side_effect=(True, False))
|
||||
@@ -137,15 +94,14 @@ class SchedulerRpcAPITestCase(test.TestCase):
|
||||
"""Test sending old host RPC parameter instead of backend."""
|
||||
capabilities = {'host': 'fake_host',
|
||||
'total': '10.01', }
|
||||
self._test_scheduler_api('notify_service_capabilities',
|
||||
rpc_method='cast',
|
||||
service_name='fake_name',
|
||||
host='fake_host',
|
||||
backend='fake_host',
|
||||
capabilities=capabilities,
|
||||
ignore_for_method=['host'],
|
||||
ignore_for_rpc=['backend'],
|
||||
version='3.1')
|
||||
self._test_rpc_api('notify_service_capabilities',
|
||||
rpc_method='cast',
|
||||
service_name='fake_name',
|
||||
server='fake_host',
|
||||
expected_kwargs_diff={'host': 'fake_host'},
|
||||
backend='fake_host',
|
||||
capabilities=capabilities,
|
||||
version='3.1')
|
||||
|
||||
@mock.patch('oslo_messaging.RPCClient.can_send_version',
|
||||
return_value=False)
|
||||
@@ -153,114 +109,96 @@ class SchedulerRpcAPITestCase(test.TestCase):
|
||||
capabilities = {'host': 'fake_host',
|
||||
'total': '10.01', }
|
||||
self.assertRaises(exception.ServiceTooOld,
|
||||
self._test_scheduler_api,
|
||||
self._test_rpc_api,
|
||||
'notify_service_capabilities',
|
||||
rpc_method='cast',
|
||||
service_name='fake_name',
|
||||
backend='fake_host',
|
||||
host='fake_host',
|
||||
ignore_for_method=['host'],
|
||||
ignore_for_rpc=['backend'],
|
||||
server='fake_host',
|
||||
# ignore_for_method=['host'],
|
||||
# ignore_for_rpc=['backend'],
|
||||
capabilities=capabilities,
|
||||
version='3.1')
|
||||
|
||||
def test_create_volume_serialization(self):
|
||||
volume = fake_volume.fake_volume_obj(self.context)
|
||||
create_worker_mock = self.mock_object(volume, 'create_worker')
|
||||
self._test_scheduler_api('create_volume',
|
||||
rpc_method='cast',
|
||||
snapshot_id='snapshot_id',
|
||||
image_id='image_id',
|
||||
request_spec={'volume_type': {}},
|
||||
filter_properties='filter_properties',
|
||||
volume=volume,
|
||||
version='3.0')
|
||||
create_worker_mock.assert_called_once()
|
||||
|
||||
@mock.patch('oslo_messaging.RPCClient.can_send_version')
|
||||
def test_migrate_volume(self, can_send_version):
|
||||
volume = fake_volume.fake_volume_obj(self.context)
|
||||
create_worker_mock = self.mock_object(volume, 'create_worker')
|
||||
self._test_scheduler_api('migrate_volume',
|
||||
rpc_method='cast',
|
||||
backend='host',
|
||||
force_copy=True,
|
||||
request_spec='fake_request_spec',
|
||||
filter_properties='filter_properties',
|
||||
volume=volume,
|
||||
version='3.3')
|
||||
create_worker_mock = self.mock_object(self.fake_volume,
|
||||
'create_worker')
|
||||
self._test_rpc_api('migrate_volume',
|
||||
rpc_method='cast',
|
||||
backend='host',
|
||||
force_copy=True,
|
||||
request_spec='fake_request_spec',
|
||||
filter_properties='filter_properties',
|
||||
volume=self.fake_volume,
|
||||
version='3.3')
|
||||
create_worker_mock.assert_not_called()
|
||||
|
||||
def test_retype(self):
|
||||
volume = fake_volume.fake_volume_obj(self.context)
|
||||
create_worker_mock = self.mock_object(volume, 'create_worker')
|
||||
self._test_scheduler_api('retype',
|
||||
rpc_method='cast',
|
||||
request_spec='fake_request_spec',
|
||||
filter_properties='filter_properties',
|
||||
volume=volume,
|
||||
version='3.0')
|
||||
create_worker_mock.assert_not_called()
|
||||
self._test_rpc_api('retype',
|
||||
rpc_method='cast',
|
||||
request_spec=self.fake_rs_dict,
|
||||
filter_properties=self.fake_fp_dict,
|
||||
volume=self.fake_volume)
|
||||
|
||||
def test_manage_existing(self):
|
||||
volume = fake_volume.fake_volume_obj(self.context)
|
||||
create_worker_mock = self.mock_object(volume, 'create_worker')
|
||||
self._test_scheduler_api('manage_existing',
|
||||
rpc_method='cast',
|
||||
request_spec='fake_request_spec',
|
||||
filter_properties='filter_properties',
|
||||
volume=volume,
|
||||
version='3.0')
|
||||
create_worker_mock.assert_not_called()
|
||||
self._test_rpc_api('manage_existing',
|
||||
rpc_method='cast',
|
||||
request_spec=self.fake_rs_dict,
|
||||
filter_properties=self.fake_fp_dict,
|
||||
volume=self.fake_volume)
|
||||
|
||||
@mock.patch('oslo_messaging.RPCClient.can_send_version',
|
||||
return_value=False)
|
||||
def test_extend_volume_capped(self, can_send_version_mock):
|
||||
new_size = 4
|
||||
volume = fake_volume.fake_volume_obj(self.context)
|
||||
self.assertRaises(exception.ServiceTooOld,
|
||||
self._test_scheduler_api,
|
||||
self._test_rpc_api,
|
||||
'extend_volume',
|
||||
rpc_method='cast',
|
||||
request_spec='fake_request_spec',
|
||||
filter_properties='filter_properties',
|
||||
volume=volume,
|
||||
new_size=new_size,
|
||||
volume=self.fake_volume,
|
||||
new_size=4,
|
||||
reservations=['RESERVATIONS'],
|
||||
version='3.0')
|
||||
|
||||
@mock.patch('oslo_messaging.RPCClient.can_send_version', return_value=True)
|
||||
def test_extend_volume(self, can_send_version_mock):
|
||||
new_size = 4
|
||||
volume = fake_volume.fake_volume_obj(self.context)
|
||||
create_worker_mock = self.mock_object(volume, 'create_worker')
|
||||
self._test_scheduler_api('extend_volume',
|
||||
rpc_method='cast',
|
||||
request_spec='fake_request_spec',
|
||||
filter_properties='filter_properties',
|
||||
volume=volume,
|
||||
new_size=new_size,
|
||||
reservations=['RESERVATIONS'],
|
||||
version='3.0')
|
||||
create_worker_mock = self.mock_object(self.fake_volume,
|
||||
'create_worker')
|
||||
self._test_rpc_api('extend_volume',
|
||||
rpc_method='cast',
|
||||
request_spec='fake_request_spec',
|
||||
filter_properties='filter_properties',
|
||||
volume=self.fake_volume,
|
||||
new_size=4,
|
||||
reservations=['RESERVATIONS'])
|
||||
create_worker_mock.assert_not_called()
|
||||
|
||||
def test_get_pools(self):
|
||||
self._test_scheduler_api('get_pools',
|
||||
rpc_method='call',
|
||||
filters=None,
|
||||
version='3.0')
|
||||
self._test_rpc_api('get_pools',
|
||||
rpc_method='call',
|
||||
filters=None,
|
||||
retval=[{
|
||||
'name': 'fake_pool',
|
||||
'capabilities': {},
|
||||
}])
|
||||
|
||||
def test_create_consistencygroup(self):
|
||||
self._test_rpc_api('create_consistencygroup',
|
||||
rpc_method='cast',
|
||||
group='group',
|
||||
request_spec_list=[self.fake_rs_dict],
|
||||
filter_properties_list=[self.fake_fp_dict])
|
||||
|
||||
def test_create_group(self):
|
||||
self._test_scheduler_api('create_group',
|
||||
rpc_method='cast',
|
||||
group='group',
|
||||
group_spec='group_spec_p',
|
||||
request_spec_list=['fake_request_spec_list'],
|
||||
group_filter_properties=
|
||||
'fake_group_filter_properties',
|
||||
filter_properties_list=
|
||||
['fake_filter_properties_list'],
|
||||
version='3.0')
|
||||
self._test_rpc_api('create_group',
|
||||
rpc_method='cast',
|
||||
group='group',
|
||||
group_spec=self.fake_rs_dict,
|
||||
request_spec_list=[self.fake_rs_dict],
|
||||
group_filter_properties=[self.fake_fp_dict],
|
||||
filter_properties_list=[self.fake_fp_dict])
|
||||
|
||||
@ddt.data(('work_cleanup', 'myhost', None),
|
||||
('work_cleanup', 'myhost', 'mycluster'),
|
||||
|
||||
Reference in New Issue
Block a user