diff --git a/ironic_lib/mdns.py b/ironic_lib/mdns.py index 8560874c..e9bcc09b 100644 --- a/ironic_lib/mdns.py +++ b/ironic_lib/mdns.py @@ -45,6 +45,9 @@ opts = [ default={}, help='Additional parameters to pass for the registered ' 'service.'), + cfg.ListOpt('interfaces', + help='List of IP addresses of interfaces to use for mDNS. ' + 'Defaults to all interfaces on the system.'), ] CONF = cfg.CONF @@ -71,7 +74,9 @@ class Zeroconf(object): def __init__(self): """Initialize and start the mDNS server.""" - self._zc = zeroconf.Zeroconf() + interfaces = (CONF.mdns.interfaces if CONF.mdns.interfaces + else zeroconf.InterfaceChoice.All) + self._zc = zeroconf.Zeroconf(interfaces=interfaces) self._registered = [] def register_service(self, service_type, endpoint, params=None): diff --git a/ironic_lib/tests/test_mdns.py b/ironic_lib/tests/test_mdns.py index ea2d6111..21c7656a 100644 --- a/ironic_lib/tests/test_mdns.py +++ b/ironic_lib/tests/test_mdns.py @@ -29,6 +29,8 @@ class RegisterServiceTestCase(base.IronicLibTestCase): def test_ok(self, mock_zc): zc = mdns.Zeroconf() zc.register_service('baremetal', 'https://127.0.0.1/baremetal') + mock_zc.assert_called_once_with( + interfaces=zeroconf.InterfaceChoice.All) mock_zc.return_value.register_service.assert_called_once_with(mock.ANY) info = mock_zc.return_value.register_service.call_args[0][0] self.assertEqual('_openstack._tcp.local.', info.type) @@ -66,6 +68,19 @@ class RegisterServiceTestCase(base.IronicLibTestCase): self.assertEqual(4, mock_zc.return_value.register_service.call_count) mock_sleep.assert_has_calls([mock.call(i) for i in (0.1, 0.2, 0.4)]) + def test_with_interfaces(self, mock_zc): + CONF.set_override('interfaces', ['10.0.0.1', '192.168.1.1'], + group='mdns') + zc = mdns.Zeroconf() + zc.register_service('baremetal', 'https://127.0.0.1/baremetal') + mock_zc.assert_called_once_with(interfaces=['10.0.0.1', '192.168.1.1']) + mock_zc.return_value.register_service.assert_called_once_with(mock.ANY) + info = mock_zc.return_value.register_service.call_args[0][0] + self.assertEqual('_openstack._tcp.local.', info.type) + self.assertEqual('baremetal._openstack._tcp.local.', info.name) + self.assertEqual('127.0.0.1', socket.inet_ntoa(info.address)) + self.assertEqual({'path': '/baremetal'}, info.properties) + @mock.patch.object(mdns.time, 'sleep', autospec=True) def test_failure(self, mock_sleep, mock_zc): mock_zc.return_value.register_service.side_effect = (