예제 #1
0
    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'))
예제 #2
0
    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))
예제 #3
0
    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'))
예제 #4
0
    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))
예제 #5
0
    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)
예제 #6
0
    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())
예제 #7
0
 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)
예제 #8
0
 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'])
예제 #9
0
 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())
예제 #10
0
    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)
예제 #11
0
 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'})
예제 #12
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")
예제 #13
0
    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)
예제 #14
0
 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'))
예제 #15
0
 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')
예제 #16
0
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)
예제 #17
0
 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')
예제 #18
0
 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'))
예제 #19
0
    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)
예제 #20
0
    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)
예제 #21
0
    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)
예제 #22
0
파일: utils.py 프로젝트: willliuwx/ironic
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)
예제 #23
0
 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')
예제 #24
0
 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'))
예제 #25
0
    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)
예제 #26
0
 def before(self, state):
     state.request.rpcapi = rpcapi.ConductorAPI()
예제 #27
0
파일: base.py 프로젝트: jriguera/ironic
 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()
예제 #28
0
 def __init__(self):
     super(IronicObjectIndirectionAPI, self).__init__()
     self._conductor = conductor_api.ConductorAPI()
예제 #29
0
    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)
예제 #30
0
 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'])