mdns: allow specifying which interfaces to listen on

Change-Id: I887af3efde729a33e05eff779012175889649033
This commit is contained in:
Dmitry Tantsur 2019-06-07 16:25:42 +02:00
parent 617056b2a3
commit 56887c9660
2 changed files with 21 additions and 1 deletions

View File

@ -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):

View File

@ -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 = (