def test_get_topic_for_driver_doesnt_cache(self): CONF.set_override('host', 'fake-host') rpcapi = conductor_rpcapi.ConductorAPI(topic='fake-topic') self.assertRaises(exception.DriverNotFound, rpcapi.get_topic_for_driver, 'fake-driver') c = self.dbapi.register_conductor({ 'hostname': 'fake-host', 'drivers': [], }) self.dbapi.register_conductor_hardware_interfaces( c.id, [{ 'hardware_type': 'fake-driver', 'interface_type': 'deploy', 'interface_name': 'iscsi', 'default': True }, { 'hardware_type': 'fake-driver', 'interface_type': 'deploy', 'interface_name': 'direct', 'default': False }]) rpcapi = conductor_rpcapi.ConductorAPI(topic='fake-topic') self.assertEqual('fake-topic.fake-host', rpcapi.get_topic_for_driver('fake-driver'))
def test_get_topic_doesnt_cache(self): CONF.set_override('host', 'fake-host') rpcapi = conductor_rpcapi.ConductorAPI(topic='fake-topic') self.assertRaises(exception.TemporaryFailure, rpcapi.get_topic_for, self.fake_node_obj) c = self.dbapi.register_conductor({ 'hostname': 'fake-host', 'drivers': [] }) self.dbapi.register_conductor_hardware_interfaces( c.id, [{ 'hardware_type': 'fake-driver', 'interface_type': 'deploy', 'interface_name': 'iscsi', 'default': True }, { 'hardware_type': 'fake-driver', 'interface_type': 'deploy', 'interface_name': 'direct', 'default': False }]) rpcapi = conductor_rpcapi.ConductorAPI(topic='fake-topic') expected_topic = 'fake-topic.fake-host' self.assertEqual(expected_topic, rpcapi.get_topic_for(self.fake_node_obj))
def test_get_topic_for_driver_doesnt_cache(self): CONF.set_override('host', 'fake-host') rpcapi = conductor_rpcapi.ConductorAPI(topic='fake-topic') self.assertRaises(exception.DriverNotFound, rpcapi.get_topic_for_driver, 'fake-driver') self.dbapi.register_conductor({ 'hostname': 'fake-host', 'drivers': ['fake-driver'], }) rpcapi = conductor_rpcapi.ConductorAPI(topic='fake-topic') self.assertEqual('fake-topic.fake-host', rpcapi.get_topic_for_driver('fake-driver'))
def test_get_topic_doesnt_cache(self): CONF.set_override('host', 'fake-host') rpcapi = conductor_rpcapi.ConductorAPI(topic='fake-topic') self.assertRaises(exception.NoValidHost, rpcapi.get_topic_for, self.fake_node_obj) self.dbapi.register_conductor({'hostname': 'fake-host', 'drivers': ['fake-driver']}) rpcapi = conductor_rpcapi.ConductorAPI(topic='fake-topic') expected_topic = 'fake-topic.fake-host' self.assertEqual(expected_topic, rpcapi.get_topic_for(self.fake_node_obj))
def _test_rpcapi(self, method, rpc_method, **kwargs): ctxt = context.get_admin_context() rpcapi = conductor_rpcapi.ConductorAPI(topic='fake-topic') expected_retval = 'hello world' if method == 'call' else None expected_version = kwargs.pop('version', rpcapi.RPC_API_VERSION) expected_msg = rpcapi.make_msg(method, **kwargs) expected_msg['version'] = expected_version expected_topic = 'fake-topic' if 'host' in kwargs: expected_topic += ".%s" % kwargs['host'] self.fake_args = None self.fake_kwargs = None def _fake_rpc_method(*args, **kwargs): self.fake_args = args self.fake_kwargs = kwargs if expected_retval: return expected_retval self.stubs.Set(rpc, rpc_method, _fake_rpc_method) retval = getattr(rpcapi, method)(ctxt, **kwargs) self.assertEqual(retval, expected_retval) expected_args = [ctxt, expected_topic, expected_msg] for arg, expected_arg in zip(self.fake_args, expected_args): self.assertEqual(arg, expected_arg)
def test_get_random_topic(self): CONF.set_override('host', 'fake-host') self.dbapi.register_conductor({'hostname': 'fake-host', 'drivers': []}) rpcapi = conductor_rpcapi.ConductorAPI(topic='fake-topic') expected_topic = 'fake-topic.fake-host' self.assertEqual(expected_topic, rpcapi.get_random_topic())
def _notify_conductor_resume_clean(self, task): uuid = task.node.uuid rpc = rpcapi.ConductorAPI() topic = rpc.get_topic_for(task.node) # Need to release the lock to let the conductor take it task.release_resources() rpc.continue_node_clean(task.context, uuid, topic=topic)
def test_version_capped(self, mock_get_client, mock_release_mapping): CONF.set_override('pin_release_version', release_mappings.RELEASE_VERSIONS[0], enforce_type=True) mock_release_mapping.get.return_value = {'rpc': '3'} conductor_rpcapi.ConductorAPI() self.assertEqual('3', mock_get_client.call_args[1]['version_cap'])
def test_object_action_invalid_version(self, mock_send): rpcapi = conductor_rpcapi.ConductorAPI(topic='fake-topic') mock_send.return_value = False self.assertRaises(NotImplementedError, rpcapi.object_action, self.context, objinst='fake-object', objmethod='foo', args=tuple(), kwargs=dict())
def _test_rpcapi(self, method, rpc_method, **kwargs): ctxt = context.get_admin_context() rpcapi = conductor_rpcapi.ConductorAPI(topic='fake-topic') expected_retval = 'hello world' if rpc_method == 'call' else None expected_version = kwargs.pop('version', rpcapi.RPC_API_VERSION) expected_msg = rpcapi.make_msg(method, **kwargs) expected_msg['version'] = expected_version expected_topic = 'fake-topic' if 'host' in kwargs: expected_topic += ".%s" % kwargs['host'] self.fake_args = None self.fake_kwargs = None def _fake_rpc_method(*args, **kwargs): self.fake_args = args self.fake_kwargs = kwargs if expected_retval: return expected_retval self.useFixture( fixtures.MonkeyPatch("ironic.openstack.common.rpc.%s" % rpc_method, _fake_rpc_method)) retval = getattr(rpcapi, method)(ctxt, **kwargs) self.assertEqual(expected_retval, retval) expected_args = [ctxt, expected_topic, expected_msg] for arg, expected_arg in zip(self.fake_args, expected_args): self.assertEqual(expected_arg, arg)
def test_object_backport_versions_invalid_version(self, mock_send): rpcapi = conductor_rpcapi.ConductorAPI(topic='fake-topic') mock_send.return_value = False self.assertRaises(NotImplementedError, rpcapi.object_backport_versions, self.context, objinst='fake-object', object_versions={'fake-object': '1.0'})
def _test_can_send_rescue(self, can_send): rpcapi = conductor_rpcapi.ConductorAPI(topic='fake-topic') with mock.patch.object(rpcapi.client, "can_send_version") as mock_can_send_version: mock_can_send_version.return_value = can_send result = rpcapi.can_send_rescue() self.assertEqual(can_send, result) mock_can_send_version.assert_called_once_with("1.43")
def test_get_topic_for_unknown_driver(self): CONF.set_override('host', 'fake-host') self.dbapi.register_conductor({'hostname': 'fake-host', 'drivers': ['other-driver']}) rpcapi = conductor_rpcapi.ConductorAPI(topic='fake-topic') self.assertRaises(exception.NoValidHost, rpcapi.get_topic_for, self.fake_node_obj)
def test_get_topic_for_driver_known_driver(self): CONF.set_override('host', 'fake-host') self.dbapi.register_conductor({ 'hostname': 'fake-host', 'drivers': ['fake-driver'], }) rpcapi = conductor_rpcapi.ConductorAPI(topic='fake-topic') self.assertEqual('fake-topic.fake-host', rpcapi.get_topic_for_driver('fake-driver'))
def test_get_conductor_for(self): CONF.set_override('host', 'fake-host') c = self.dbapi.register_conductor({'hostname': 'fake-host', 'drivers': []}) self.dbapi.register_conductor_hardware_interfaces( c.id, 'fake-driver', 'deploy', ['iscsi', 'direct'], 'iscsi') rpcapi = conductor_rpcapi.ConductorAPI() self.assertEqual(rpcapi.get_conductor_for(self.fake_node_obj), 'fake-host')
def _notify_conductor_resume_clean(task): LOG.debug('Sending RPC to conductor to resume cleaning for node %s', task.node.uuid) uuid = task.node.uuid rpc = rpcapi.ConductorAPI() topic = rpc.get_topic_for(task.node) # Need to release the lock to let the conductor take it task.release_resources() rpc.continue_node_clean(task.context, uuid, topic=topic)
def test_get_topic_for_driver_unknown_driver(self): CONF.set_override('host', 'fake-host') c = self.dbapi.register_conductor({ 'hostname': 'fake-host', 'drivers': [], }) self.dbapi.register_conductor_hardware_interfaces( c.id, 'fake-driver', 'deploy', ['iscsi', 'direct'], 'iscsi') rpcapi = conductor_rpcapi.ConductorAPI(topic='fake-topic') self.assertRaises(exception.DriverNotFound, rpcapi.get_topic_for_driver, 'fake-driver-2')
def test_get_topic_for_driver_known_driver(self): CONF.set_override('host', 'fake-host') c = self.dbapi.register_conductor({ 'hostname': 'fake-host', 'drivers': [], }) self.dbapi.register_conductor_hardware_interfaces( c.id, 'fake-driver', 'deploy', ['iscsi', 'direct'], 'iscsi') rpcapi = conductor_rpcapi.ConductorAPI(topic='fake-topic') self.assertEqual('fake-topic.fake-host', rpcapi.get_topic_for_driver('fake-driver'))
def test_get_topic_for_unknown_driver(self): CONF.set_override('host', 'fake-host') c = self.dbapi.register_conductor({'hostname': 'fake-host', 'drivers': []}) self.dbapi.register_conductor_hardware_interfaces( c.id, 'other-driver', 'deploy', ['iscsi', 'direct'], 'iscsi') rpcapi = conductor_rpcapi.ConductorAPI(topic='fake-topic') self.assertRaises(exception.NoValidHost, rpcapi.get_topic_for, self.fake_node_obj)
def _test_rpcapi(self, method, rpc_method, **kwargs): rpcapi = conductor_rpcapi.ConductorAPI(topic='fake-topic') expected_retval = 'hello world' if rpc_method == 'call' else None expected_topic = 'fake-topic' if 'host' in kwargs: expected_topic += ".%s" % kwargs['host'] target = { "topic": expected_topic, "version": kwargs.pop('version', rpcapi.RPC_API_VERSION) } expected_msg = copy.deepcopy(kwargs) self.fake_args = None self.fake_kwargs = None def _fake_can_send_version_method(version): return messaging_utils.version_is_compatible( rpcapi.RPC_API_VERSION, version) def _fake_prepare_method(*args, **kwargs): for kwd in kwargs: self.assertEqual(kwargs[kwd], target[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, "can_send_version", autospec=True) as mock_can_send_version: mock_can_send_version.side_effect = _fake_can_send_version_method with mock.patch.object(rpcapi.client, "prepare", autospec=True) as mock_prepared: mock_prepared.side_effect = _fake_prepare_method with mock.patch.object(rpcapi.client, rpc_method, autospec=True) as mock_method: mock_method.side_effect = _fake_rpc_method retval = getattr(rpcapi, method)(self.context, **kwargs) self.assertEqual(retval, expected_retval) expected_args = [self.context, method, expected_msg] for arg, expected_arg in zip(self.fake_args, expected_args): self.assertEqual(arg, expected_arg)
def test_pass_vendor_info(self): ctxt = context.get_admin_context() rpcapi = conductor_rpcapi.ConductorAPI(topic='fake-topic') expected_retval = 'hello world' def _fake_rpc_method(*args, **kwargs): return expected_retval self.useFixture( fixtures.MonkeyPatch('ironic.openstack.common.rpc.call', _fake_rpc_method)) retval = rpcapi.vendor_passthru(ctxt, node_id=self.fake_node['uuid'], driver_method='foo', info={'bar': 'baz'}) self.assertEqual(retval, expected_retval)
def _notify_conductor_resume_operation(task, operation, method): """Notify the conductor to resume an operation. :param task: the task :param operation: the operation, a string :param method: The name of the RPC method, a string """ LOG.debug('Sending RPC to conductor to resume %(op)s for node %(node)s', {'op': operation, 'node': task.node.uuid}) from ironic.conductor import rpcapi uuid = task.node.uuid rpc = rpcapi.ConductorAPI() topic = rpc.get_topic_for(task.node) # Need to release the lock to let the conductor take it task.release_resources() getattr(rpc, method)(task.context, uuid, topic=topic)
def test_get_conductor_for(self): CONF.set_override('host', 'fake-host') c = self.dbapi.register_conductor({ 'hostname': 'fake-host', 'drivers': [] }) self.dbapi.register_conductor_hardware_interfaces( c.id, [{ 'hardware_type': 'fake-driver', 'interface_type': 'deploy', 'interface_name': 'ansible', 'default': True }, { 'hardware_type': 'fake-driver', 'interface_type': 'deploy', 'interface_name': 'direct', 'default': False }]) rpcapi = conductor_rpcapi.ConductorAPI() self.assertEqual(rpcapi.get_conductor_for(self.fake_node_obj), 'fake-host')
def test_get_topic_for_driver_known_driver(self): CONF.set_override('host', 'fake-host') c = self.dbapi.register_conductor({ 'hostname': 'fake-host', 'drivers': [], }) self.dbapi.register_conductor_hardware_interfaces( c.id, [{ 'hardware_type': 'fake-driver', 'interface_type': 'deploy', 'interface_name': 'ansible', 'default': True }, { 'hardware_type': 'fake-driver', 'interface_type': 'deploy', 'interface_name': 'direct', 'default': False }]) rpcapi = conductor_rpcapi.ConductorAPI(topic='fake-topic') self.assertEqual('fake-topic.fake-host', rpcapi.get_topic_for_driver('fake-driver'))
def _test_rpcapi(self, method, rpc_method, **kwargs): ctxt = context.get_admin_context() rpcapi = conductor_rpcapi.ConductorAPI(topic='fake-topic') expected_retval = 'hello world' if rpc_method == 'call' else None expected_topic = 'fake-topic' if 'host' in kwargs: expected_topic += ".%s" % kwargs['host'] target = { "topic": expected_topic, "version": kwargs.pop('version', rpcapi.RPC_API_VERSION) } expected_msg = copy.deepcopy(kwargs) self.fake_args = None self.fake_kwargs = None def _fake_prepare_method(*args, **kwargs): for kwd in kwargs: self.assertEqual(kwargs[kwd], target[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, **kwargs) self.assertEqual(retval, expected_retval) expected_args = [ctxt, method, expected_msg] for arg, expected_arg in zip(self.fake_args, expected_args): self.assertEqual(arg, expected_arg)
def before(self, state): state.request.rpcapi = rpcapi.ConductorAPI()
def __init__(self): super(IronicObjectIndirectionAPI, self).__init__() # FIXME(xek): importing here due to a cyclical import error from ironic.conductor import rpcapi as conductor_api self._conductor = conductor_api.ConductorAPI()
def __init__(self): super(IronicObjectIndirectionAPI, self).__init__() self._conductor = conductor_api.ConductorAPI()
def test_get_random_topic_no_conductors(self): CONF.set_override('host', 'fake-host') rpcapi = conductor_rpcapi.ConductorAPI(topic='fake-topic') self.assertRaises(exception.TemporaryFailure, rpcapi.get_random_topic)
def test_version_cap(self, mock_get_client): conductor_rpcapi.ConductorAPI() self.assertEqual(conductor_rpcapi.ConductorAPI.RPC_API_VERSION, mock_get_client.call_args[1]['version_cap'])