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')
         ]))
Exemplo n.º 5
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'])
Exemplo n.º 7
0
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, [])