def test_parse_labels(self): kv = ServiceRegistrator.parse_labels(self.container.labels) self.assertEqual( kv, { '180_CHECK_TCP': 'false', '180_CHECK_SCRIPT': "command 'arg=val'", '180_NAME': 'dummyservice180', '80_TAGS': 'prod,dummytag', 'CHECK_INTERVAL': '25s', 'NAME': 'dummyservicenoportfromlabel' })
def test_parse_env(self): kv = ServiceRegistrator.parse_env( self.container.attrs['Config']['Env']) self.assertEqual( kv, { '80_CHECK_TCP': 'true', '80_CHECK_SCRIPT': "date --date='@2147483647'", '80_CHECK_TIMEOUT': '10s', '80_NAME': 'dummyservice', 'CHECK_TIMEOUT': '15s', 'NAME': 'dummyservicenoportfromenv', 'TAGS': 'noporttag' })
def test_extract_ports(self): ports = ServiceRegistrator.extract_ports(self.container) self.assertEqual( set(ports), set([ Ports(internal=180, external=18082, protocol='udp', ip='127.0.0.1'), Ports(internal=80, external=28082, protocol='tcp', ip='0.0.0.0'), Ports(internal=80, external=8082, protocol='tcp', ip='0.0.0.0') ]))
def test_extract_ports_no_port_but_bindings(self): self.container.attrs['HostConfig'][ 'PortBindings'] = self.container.attrs['NetworkSettings'][ 'Ports'].copy() self.container.attrs['NetworkSettings']['Ports'] = {} ports = ServiceRegistrator.extract_ports(self.container) self.assertEqual( set(ports), set([ Ports(internal=180, external=18082, protocol='udp', ip='127.0.0.1'), Ports(internal=80, external=28082, protocol='tcp', ip='0.0.0.0'), Ports(internal=80, external=8082, protocol='tcp', ip='0.0.0.0') ]))
def main(**options): """Register docker containers as consul services""" context = Context(options) delay = context.options['delay'] consul_connected = False try: import os import stat is_socket = stat.S_ISSOCK(os.stat(context.options['dockersock']).st_mode) if not is_socket: raise Exception("%r isn't a socket file" % context.options['dockersock']) except Exception as e: log.critical("Option dockersock: %s" % e) context.kill_now = True if context.options['debug_requests']: import http.client http.client.HTTPConnection.debuglevel = 1 while not context.kill_now: try: context.serviceregistrator = ServiceRegistrator(context) consul_connected = True context.serviceregistrator.sync_with_containers() context.serviceregistrator.watch_events() except ConsulConnectionError as e: if consul_connected: log.error(e) consul_connected = False except docker.errors.DockerException as e: log.error(e) except Exception as e: log.error(e) log.error(traceback.format_exc()) finally: if not context.kill_now: log.debug(f"sleeping {delay} second(s)...") for _unused in range(0, delay): if not context.kill_now: sleep(1)
def test_parse_service_meta(self): metadata, metadata_with_port = ServiceRegistrator.parse_service_meta( self.container) self.assertIsInstance(metadata, ContainerMetadata) self.assertIsInstance(metadata_with_port, dict) self.assertEqual( metadata, ContainerMetadata({ 'attrs': { 'check_interval': '25s', 'check_timeout': '15s' }, 'name': 'dummyservicenoportfromenv', 'tags': ['noporttag'] })) self.assertIn(80, metadata_with_port) self.assertIn(180, metadata_with_port) self.assertEqual( metadata_with_port[80]['attrs'], { 'check_interval': '25s', 'check_timeout': '10s', 'check_tcp': 'true', 'check_script': "date --date='@2147483647'", }) self.assertEqual(metadata_with_port[80]['name'], 'dummyservice') self.assertEqual(set(metadata_with_port[80]['tags']), set(['dummytag', 'prod', 'noporttag'])) self.assertEqual( metadata_with_port[180]['attrs'], { 'check_interval': '25s', 'check_timeout': '15s', 'check_tcp': 'false', 'check_script': "command 'arg=val'" }) self.assertEqual(metadata_with_port[180]['name'], 'dummyservice180') self.assertEqual(metadata_with_port[180]['tags'], ['noporttag'])
class TestIsOurIdentifier(unittest.TestCase): def setUp(self): def dummyfunc(x): pass ServiceRegistrator._init_consul = dummyfunc ServiceRegistrator._init_docker = dummyfunc context = Mock() self.registrator = ServiceRegistrator(context) self.registrator.hostname = 'my_hostname' def test_too_short(self): yes, comment = self.registrator.is_our_identifier('x') self.assertFalse(yes) self.assertEqual(comment, 'length < 3') def test_too_short_different_prefix(self): yes, comment = self.registrator.is_our_identifier('x', prefix='abc') self.assertFalse(yes) self.assertEqual(comment, 'different prefix') def test_too_short_same_prefix(self): yes, comment = self.registrator.is_our_identifier('abc:x', prefix='abc') self.assertFalse(yes) self.assertEqual(comment, 'length < 3') def test_too_short_2elems(self): yes, comment = self.registrator.is_our_identifier('x:y') self.assertFalse(yes) self.assertEqual(comment, 'length < 3') def test_3elems_different_hostname(self): yes, comment = self.registrator.is_our_identifier('x:y:z') self.assertFalse(yes) self.assertEqual(comment, 'different hostname') def test_3elems_same_hostname(self): yes, comment = self.registrator.is_our_identifier( self.registrator.hostname + ':y:z') self.assertTrue(yes) self.assertIsNone(comment) def test_3elems_same_hostname_different_prefix(self): yes, comment = self.registrator.is_our_identifier( self.registrator.hostname + ':y:z', prefix='abc') self.assertFalse(yes) self.assertEqual(comment, 'different prefix') def test_3elems_same_hostname_same_prefix(self): yes, comment = self.registrator.is_our_identifier( 'abc:' + self.registrator.hostname + ':y:z', prefix='abc') self.assertTrue(yes) self.assertIsNone(comment) def test_4elems_same_hostname_same_prefix_no_udp(self): yes, comment = self.registrator.is_our_identifier( 'abc:' + self.registrator.hostname + ':y:z:hhh', prefix='abc') self.assertFalse(yes) self.assertEqual(comment, 'no udp') def test_4elems_same_hostname_same_prefix_udp(self): yes, comment = self.registrator.is_our_identifier( 'abc:' + self.registrator.hostname + ':y:z:udp', prefix='abc') self.assertTrue(yes) self.assertIsNone(comment)
def test_extract_ports_no_port_no_bindings(self): self.container.attrs['HostConfig']['PortBindings'] = {} self.container.attrs['NetworkSettings']['Ports'] = {} ports = ServiceRegistrator.extract_ports(self.container) self.assertEqual(ports, [])
def test_extract_ports_no_port(self): self.container.attrs['Config']['ExposedPorts'] = {} ports = ServiceRegistrator.extract_ports(self.container) self.assertEqual(ports, [])
def test_extract_ports_no_port_no_bindings(self): ports = ServiceRegistrator.extract_ports(self.container) self.assertEqual(ports, [])