def test_get_host_address(self, mock_check_yaml, mock_get, *args):
        kubernetes_config = {'instances': [{'kubelet_port': 1337}]}
        pod_list = {
            'items': [{
                'status': {
                    'podIP': '127.0.0.1',
                    'containerStatuses': [
                        {'containerID': 'docker://389dc8a4361f3d6c866e9e9a7b6972b26a31c589c4e2f097375d55656a070bc9'}
                    ]
                }
            }]
        }

        # (inspect, tpl_var, expected_result)
        ip_address_inspects = [
            ({'NetworkSettings': {}}, 'host', None),
            ({'NetworkSettings': {'IPAddress': ''}}, 'host', None),

            ({'NetworkSettings': {'IPAddress': '127.0.0.1'}}, 'host', '127.0.0.1'),
            ({'NetworkSettings': {'IPAddress': '127.0.0.1', 'Networks': {}}}, 'host', '127.0.0.1'),
            ({'NetworkSettings': {
                'IPAddress': '127.0.0.1',
                'Networks': {'bridge': {'IPAddress': '127.0.0.1'}}}},
             'host', '127.0.0.1'),
            ({'NetworkSettings': {
                'IPAddress': '',
                'Networks': {'bridge': {'IPAddress': '127.0.0.1'}}}},
             'host_bridge', '127.0.0.1'),
            ({'NetworkSettings': {
                'IPAddress': '127.0.0.1',
                'Networks': {
                    'bridge': {'IPAddress': '172.17.0.2'},
                    'foo': {'IPAddress': '192.168.0.2'}}}},
             'host', '172.17.0.2'),

            ({'NetworkSettings': {'Networks': {}}}, 'host', None),
            ({'NetworkSettings': {'Networks': {}}}, 'host_bridge', None),
            ({'NetworkSettings': {'Networks': {'bridge': {}}}}, 'host', None),
            ({'NetworkSettings': {'Networks': {'bridge': {}}}}, 'host_bridge', None),
            ({'NetworkSettings': {
                'Networks': {
                    'bridge': {'IPAddress': '172.17.0.2'}
                }}},
             'host_bridge', '172.17.0.2'),
            ({'NetworkSettings': {
                'Networks': {
                    'bridge': {'IPAddress': '172.17.0.2'},
                    'foo': {'IPAddress': '192.168.0.2'}
                }}},
             'host_foo', '192.168.0.2')
        ]

        mock_check_yaml.return_value = kubernetes_config
        mock_get.return_value = Response(pod_list)

        for c_ins, tpl_var, expected_ip in ip_address_inspects:
            state = _SDDockerBackendConfigFetchState(lambda _: c_ins)
            sd_backend = get_sd_backend(agentConfig=self.auto_conf_agentConfig)
            self.assertEquals(sd_backend._get_host_address(state, 'container id', tpl_var), expected_ip)
            clear_singletons(self.auto_conf_agentConfig)
    def test_get_host_address(self, mock_check_yaml, mock_get, *args):
        kubernetes_config = {'instances': [{'kubelet_port': 1337}]}
        pod_list = {
            'items': [{
                'status': {
                    'podIP': '127.0.0.1',
                    'containerStatuses': [
                        {'containerID': 'docker://389dc8a4361f3d6c866e9e9a7b6972b26a31c589c4e2f097375d55656a070bc9'}
                    ]
                }
            }]
        }

        # (inspect, tpl_var, expected_result)
        ip_address_inspects = [
            ({'NetworkSettings': {}}, 'host', None),
            ({'NetworkSettings': {'IPAddress': ''}}, 'host', None),

            ({'NetworkSettings': {'IPAddress': '127.0.0.1'}}, 'host', '127.0.0.1'),
            ({'NetworkSettings': {'IPAddress': '127.0.0.1', 'Networks': {}}}, 'host', '127.0.0.1'),
            ({'NetworkSettings': {
                'IPAddress': '127.0.0.1',
                'Networks': {'bridge': {'IPAddress': '127.0.0.1'}}}},
             'host', '127.0.0.1'),
            ({'NetworkSettings': {
                'IPAddress': '',
                'Networks': {'bridge': {'IPAddress': '127.0.0.1'}}}},
             'host_bridge', '127.0.0.1'),
            ({'NetworkSettings': {
                'IPAddress': '127.0.0.1',
                'Networks': {
                    'bridge': {'IPAddress': '172.17.0.2'},
                    'foo': {'IPAddress': '192.168.0.2'}}}},
             'host', '172.17.0.2'),

            ({'NetworkSettings': {'Networks': {}}}, 'host', None),
            ({'NetworkSettings': {'Networks': {}}}, 'host_bridge', None),
            ({'NetworkSettings': {'Networks': {'bridge': {}}}}, 'host', None),
            ({'NetworkSettings': {'Networks': {'bridge': {}}}}, 'host_bridge', None),
            ({'NetworkSettings': {
                'Networks': {
                    'bridge': {'IPAddress': '172.17.0.2'}
                }}},
             'host_bridge', '172.17.0.2'),
            ({'NetworkSettings': {
                'Networks': {
                    'bridge': {'IPAddress': '172.17.0.2'},
                    'foo': {'IPAddress': '192.168.0.2'}
                }}},
             'host_foo', '192.168.0.2')
        ]

        mock_check_yaml.return_value = kubernetes_config
        mock_get.return_value = Response(pod_list)

        for c_ins, tpl_var, expected_ip in ip_address_inspects:
            state = _SDDockerBackendConfigFetchState(lambda _: c_ins)
            sd_backend = get_sd_backend(agentConfig=self.auto_conf_agentConfig)
            self.assertEquals(sd_backend._get_host_address(state, 'container id', tpl_var), expected_ip)
            clear_singletons(self.auto_conf_agentConfig)
 def test_get_container_pid(self, *args):
     for c_ins, _, var_tpl, _, _, expected_pid in self.container_inspects:
         state = _SDDockerBackendConfigFetchState(lambda _: c_ins)
         sd_backend = get_sd_backend(agentConfig=self.auto_conf_agentConfig)
         self.assertEquals(
             sd_backend._get_container_pid(state, 'container id', var_tpl),
             expected_pid)
         clear_singletons(self.auto_conf_agentConfig)
 def test_get_port(self, *args):
     for c_ins, _, var_tpl, expected_ports, _ in self.container_inspects:
         state = _SDDockerBackendConfigFetchState(lambda _: c_ins)
         sd_backend = get_sd_backend(agentConfig=self.auto_conf_agentConfig)
         if isinstance(expected_ports, str):
             self.assertEquals(sd_backend._get_port(state, 'container id', var_tpl), expected_ports)
         else:
             self.assertRaises(expected_ports, sd_backend._get_port, state, 'c_id', var_tpl)
         clear_singletons(self.auto_conf_agentConfig)
 def test_get_port(self, *args):
     for c_ins, _, var_tpl, expected_ports, _, _ in self.container_inspects:
         state = _SDDockerBackendConfigFetchState(lambda _: c_ins)
         sd_backend = get_sd_backend(agentConfig=self.auto_conf_agentConfig)
         if isinstance(expected_ports, str):
             self.assertEquals(sd_backend._get_port(state, 'container id', var_tpl), expected_ports)
         else:
             self.assertRaises(expected_ports, sd_backend._get_port, state, 'c_id', var_tpl)
         clear_singletons(self.auto_conf_agentConfig)
 def test_get_check_configs(self, *args):
     """Test get_check_config with mocked container inspect and config template"""
     c_id = self.docker_container_inspect.get('Id')
     for image in self.mock_templates.keys():
         sd_backend = get_sd_backend(agentConfig=self.auto_conf_agentConfig)
         state = _SDDockerBackendConfigFetchState(_get_container_inspect)
         self.assertEquals(
             sd_backend._get_check_configs(state, c_id, image)[0],
             self.mock_templates[image][1])
         clear_singletons(self.auto_conf_agentConfig)
 def test_get_check_configs(self, *args):
     """Test get_check_config with mocked container inspect and config template"""
     c_id = self.docker_container_inspect.get('Id')
     for image in self.mock_templates.keys():
         sd_backend = get_sd_backend(agentConfig=self.auto_conf_agentConfig)
         state = _SDDockerBackendConfigFetchState(_get_container_inspect)
         self.assertEquals(
             sd_backend._get_check_configs(state, c_id, image)[0],
             self.mock_templates[image][1])
         clear_singletons(self.auto_conf_agentConfig)
 def test_get_kube_tags(self, *args):
     inspect = {
         'Id': 'eae3f1f47eea2527be52b5380f8bfa6db34764bcc05da7506dbcf42f92a40a0e',
         'Image': 'sha256:c3eb149853f0ec3390629c547c0ed75c020d91db8511927d7d13deb456de1997',
         'Name': '/k8s_redis_redis-3073568142-z7gxl_default_c50800e9-dbf7-11e7-807b-06809d17eee8_0',
         'Config': {
             "Labels": {
                 "io.kubernetes.container.name": "redis",
                 "io.kubernetes.docker.type": "container",
                 "io.kubernetes.pod.name": "redis-3073568142-z7gxl",
                 "io.kubernetes.pod.namespace": "default",
                 "io.kubernetes.sandbox.id": "f8ca7c0144ecab47fd13713b93eb1d2cc1ac143726d66027fd5d83b4e583be29"
             },
         },
         'NetworkSettings': {'IPAddress': '', 'Ports': None}
     }
     kube_pods = [{
         "metadata": {
             "name": "redis-3073568142-z7gxl",
             "generateName": "redis-3073568142-",
             "namespace": "default",
             "uid": "c50800e9-dbf7-11e7-807b-06809d17eee8",
             "labels": {
                 "pod-template-hash": "3073568142",
                 "run": "redis"
             }
         },
         "status": {"containerStatuses": [
             {"name": "redis",
              "image": "redis:latest",
              "imageID": "docker-pullable://redis@sha256:de4e675f62e4f3f71f43e98ae46a67dba92459ff950de4428d13289b69328f96",
              "containerID": "docker://eae3f1f47eea2527be52b5380f8bfa6db34764bcc05da7506dbcf42f92a40a0e"}
         ]}}]
     clear_singletons(self.auto_conf_agentConfig)
     state = _SDDockerBackendConfigFetchState(lambda _: inspect, kube_pods)
     docker = SDDockerBackend(self.auto_conf_agentConfig)
     tags = docker.get_tags(state, inspect["Id"])
     self.assertIn('kube_container_name:redis', tags)
     self.assertIn('kube_namespace:default', tags)
     self.assertIn('run:redis', tags)
     self.assertIn('pod-template-hash:3073568142', tags)
    def test_fill_tpl(self, *args):
        """Test _fill_tpl with mocked docker client"""

        valid_configs = [
            # ((inspect, instance_tpl, variables, tags), (expected_instance_tpl, expected_var_values))
            (({}, {
                'host': 'localhost'
            }, [], None), ({
                'host': 'localhost'
            }, {})),
            (({
                'NetworkSettings': {
                    'IPAddress': ''
                }
            }, {
                'host': 'localhost'
            }, [], None), ({
                'host': 'localhost'
            }, {})),
            (({
                'NetworkSettings': {
                    'Networks': {}
                }
            }, {
                'host': 'localhost'
            }, [], None), ({
                'host': 'localhost'
            }, {})),
            (({
                'NetworkSettings': {
                    'Networks': {
                        'bridge': {}
                    }
                }
            }, {
                'host': 'localhost'
            }, [], None), ({
                'host': 'localhost'
            }, {})),
            (
                ({
                    'NetworkSettings': {
                        'IPAddress': '127.0.0.1'
                    }
                }, {
                    'host': '%%host%%',
                    'port': 1337
                }, ['host'], ['foo', 'bar:baz']),
                ({
                    'host': '%%host%%',
                    'port': 1337,
                    'tags': ['foo', 'bar:baz']
                }, {
                    'host': '127.0.0.1'
                }),
            ),
            (
                ({
                    'NetworkSettings': {
                        'IPAddress': '127.0.0.1',
                        'Networks': {}
                    }
                }, {
                    'host': '%%host%%',
                    'port': 1337
                }, ['host'], ['foo', 'bar:baz']),
                ({
                    'host': '%%host%%',
                    'port': 1337,
                    'tags': ['foo', 'bar:baz']
                }, {
                    'host': '127.0.0.1'
                }),
            ),
            (
                ({
                    'NetworkSettings': {
                        'IPAddress': '127.0.0.1',
                        'Networks': {
                            'bridge': {
                                'IPAddress': '172.17.0.2'
                            }
                        }
                    }
                }, {
                    'host': '%%host%%',
                    'port': 1337
                }, ['host'], ['foo', 'bar:baz']),
                ({
                    'host': '%%host%%',
                    'port': 1337,
                    'tags': ['foo', 'bar:baz']
                }, {
                    'host': '172.17.0.2'
                }),
            ),
            (
                ({
                    'NetworkSettings': {
                        'IPAddress': '',
                        'Networks': {
                            'bridge': {
                                'IPAddress': '172.17.0.2'
                            },
                            'foo': {
                                'IPAddress': '192.168.0.2'
                            }
                        }
                    }
                }, {
                    'host': '%%host_bridge%%',
                    'port': 1337
                }, ['host_bridge'], ['foo', 'bar:baz']),
                ({
                    'host': '%%host_bridge%%',
                    'port': 1337,
                    'tags': ['foo', 'bar:baz']
                }, {
                    'host_bridge': '172.17.0.2'
                }),
            ),
            (
                ({
                    'NetworkSettings': {
                        'IPAddress': '',
                        'Networks': {
                            'bridge': {
                                'IPAddress': '172.17.0.2'
                            },
                            'foo': {
                                'IPAddress': '192.168.0.2'
                            }
                        }
                    }
                }, {
                    'host': '%%host_foo%%',
                    'port': 1337
                }, ['host_foo'], ['foo', 'bar:baz']),
                ({
                    'host': '%%host_foo%%',
                    'port': 1337,
                    'tags': ['foo', 'bar:baz']
                }, {
                    'host_foo': '192.168.0.2'
                }),
            ),
            (({
                'NetworkSettings': {
                    'IPAddress': '127.0.0.1',
                    'Ports': {
                        '42/tcp': None,
                        '22/tcp': None
                    }
                }
            }, {
                'host': '%%host%%',
                'port': '%%port_1%%',
                'tags': ['env:test']
            }, ['host', 'port_1'], ['foo', 'bar:baz']), ({
                'host':
                '%%host%%',
                'port':
                '%%port_1%%',
                'tags': ['env:test', 'foo', 'bar:baz']
            }, {
                'host': '127.0.0.1',
                'port_1': '42'
            }))
        ]

        # should not fail but return something specific
        edge_cases = [
            # ((inspect, instance_tpl, variables, tags), (expected_instance_tpl, expected_var_values))

            # specify bridge but there is also a default IPAddress (networks should be preferred)
            (({
                'NetworkSettings': {
                    'IPAddress': '127.0.0.1',
                    'Networks': {
                        'bridge': {
                            'IPAddress': '172.17.0.2'
                        }
                    }
                }
            }, {
                'host': '%%host_bridge%%',
                'port': 1337
            }, ['host_bridge'], ['foo', 'bar:baz']), ({
                'host':
                '%%host_bridge%%',
                'port':
                1337,
                'tags': ['foo', 'bar:baz']
            }, {
                'host_bridge':
                '172.17.0.2'
            })),
            # specify index but there is a default IPAddress (there's a specifier, even if it's wrong, walking networks should be preferred)
            (
                ({
                    'NetworkSettings': {
                        'IPAddress': '127.0.0.1',
                        'Networks': {
                            'bridge': {
                                'IPAddress': '172.17.0.2'
                            }
                        }
                    }
                }, {
                    'host': '%%host_0%%',
                    'port': 1337
                }, ['host_0'], ['foo', 'bar:baz']),
                ({
                    'host': '%%host_0%%',
                    'port': 1337,
                    'tags': ['foo', 'bar:baz']
                }, {
                    'host_0': '172.17.0.2'
                }),
            ),
            # missing key for host, bridge network should be preferred
            (
                ({
                    'NetworkSettings': {
                        'Networks': {
                            'bridge': {
                                'IPAddress': '127.0.0.1'
                            },
                            'foo': {
                                'IPAddress': '172.17.0.2'
                            }
                        }
                    }
                }, {
                    'host': '%%host_bar%%',
                    'port': 1337
                }, ['host_bar'], []),
                ({
                    'host': '%%host_bar%%',
                    'port': 1337
                }, {
                    'host_bar': '127.0.0.1'
                }),
            ),
            # missing index for port
            (({
                'NetworkSettings': {
                    'IPAddress': '127.0.0.1',
                    'Ports': {
                        '42/tcp': None,
                        '22/tcp': None
                    }
                }
            }, {
                'host': '%%host%%',
                'port': '%%port_2%%',
                'tags': ['env:test']
            }, ['host', 'port_2'], ['foo', 'bar:baz']), ({
                'host':
                '%%host%%',
                'port':
                '%%port_2%%',
                'tags': ['env:test', 'foo', 'bar:baz']
            }, {
                'host': '127.0.0.1',
                'port_2': '42'
            }))
        ]

        # should raise
        invalid_config = [
            # ((inspect, instance_tpl, variables, tags), expected_exception)

            # template variable but no IPAddress available
            (
                ({
                    'NetworkSettings': {
                        'Networks': {}
                    }
                }, {
                    'host': '%%host%%',
                    'port': 1337
                }, ['host'], ['foo', 'bar:baz']),
                Exception,
            ),
            # index but no IPAddress available
            (
                ({
                    'NetworkSettings': {
                        'Networks': {}
                    }
                }, {
                    'host': '%%host_0%%',
                    'port': 1337
                }, ['host_0'], ['foo', 'bar:baz']),
                Exception,
            ),
            # key but no IPAddress available
            (
                ({
                    'NetworkSettings': {
                        'Networks': {}
                    }
                }, {
                    'host': '%%host_foo%%',
                    'port': 1337
                }, ['host_foo'], ['foo', 'bar:baz']),
                Exception,
            ),

            # template variable but no port available
            (
                ({
                    'NetworkSettings': {
                        'Networks': {}
                    }
                }, {
                    'host': 'localhost',
                    'port': '%%port%%'
                }, ['port'], []),
                Exception,
            ),
            # index but no port available
            (
                ({
                    'NetworkSettings': {
                        'Networks': {}
                    }
                }, {
                    'host': 'localhost',
                    'port_0': '%%port%%'
                }, ['port_0'], []),
                Exception,
            ),
            # key but no port available
            (
                ({
                    'NetworkSettings': {
                        'Networks': {}
                    }
                }, {
                    'host': 'localhost',
                    'port': '%%port_foo%%'
                }, ['port_foo'], []),
                Exception,
            )
        ]

        for ac in self.agentConfigs:
            sd_backend = get_sd_backend(agentConfig=ac)
            try:
                for co in valid_configs + edge_cases:
                    inspect, tpl, variables, tags = co[0]
                    state = _SDDockerBackendConfigFetchState(lambda _: inspect)
                    instance_tpl, var_values = sd_backend._fill_tpl(
                        state, 'c_id', tpl, variables, tags)
                    for key in instance_tpl.keys():
                        if isinstance(instance_tpl[key], list):
                            self.assertEquals(len(instance_tpl[key]),
                                              len(co[1][0].get(key)))
                            for elem in instance_tpl[key]:
                                self.assertTrue(elem in co[1][0].get(key))
                        else:
                            self.assertEquals(instance_tpl[key],
                                              co[1][0].get(key))
                    self.assertEquals(var_values, co[1][1])

                for co in invalid_config:
                    inspect, tpl, variables, tags = co[0]
                    state = _SDDockerBackendConfigFetchState(lambda _: inspect)
                    self.assertRaises(
                        co[1],
                        sd_backend._fill_tpl(state, 'c_id', tpl, variables,
                                             tags))
            finally:
                clear_singletons(ac)
    def test_fill_tpl(self, *args):
        """Test _fill_tpl with mocked docker client"""

        valid_configs = [
            # ((inspect, instance_tpl, variables, tags), (expected_instance_tpl, expected_var_values))
            (({}, {'host': 'localhost'}, [], None), ({'host': 'localhost'}, {})),
            (
                ({'NetworkSettings': {'IPAddress': ''}}, {'host': 'localhost'}, [], None),
                ({'host': 'localhost'}, {})
            ),
            (
                ({'NetworkSettings': {'Networks': {}}}, {'host': 'localhost'}, [], None),
                ({'host': 'localhost'}, {})
            ),
            (
                ({'NetworkSettings': {'Networks': {'bridge': {}}}}, {'host': 'localhost'}, [], None),
                ({'host': 'localhost'}, {})
            ),
            (
                ({'NetworkSettings': {'IPAddress': '127.0.0.1'}},
                 {'host': '%%host%%', 'port': 1337}, ['host'], ['foo', 'bar:baz']),
                ({'host': '%%host%%', 'port': 1337, 'tags': ['foo', 'bar:baz']}, {'host': '127.0.0.1'}),
            ),
            (
                ({'NetworkSettings': {'IPAddress': '127.0.0.1', 'Networks': {}}},
                 {'host': '%%host%%', 'port': 1337}, ['host'], ['foo', 'bar:baz']),
                ({'host': '%%host%%', 'port': 1337, 'tags': ['foo', 'bar:baz']}, {'host': '127.0.0.1'}),
            ),
            (
                ({'NetworkSettings': {
                    'IPAddress': '127.0.0.1',
                    'Networks': {'bridge': {'IPAddress': '172.17.0.2'}}}
                  },
                 {'host': '%%host%%', 'port': 1337}, ['host'], ['foo', 'bar:baz']),
                ({'host': '%%host%%', 'port': 1337, 'tags': ['foo', 'bar:baz']}, {'host': '172.17.0.2'}),
            ),
            (
                ({'NetworkSettings': {
                    'IPAddress': '',
                    'Networks': {
                        'bridge': {'IPAddress': '172.17.0.2'},
                        'foo': {'IPAddress': '192.168.0.2'}
                    }}
                  },
                 {'host': '%%host_bridge%%', 'port': 1337}, ['host_bridge'], ['foo', 'bar:baz']),
                ({'host': '%%host_bridge%%', 'port': 1337, 'tags': ['foo', 'bar:baz']},
                 {'host_bridge': '172.17.0.2'}),
            ),
            (
                ({'NetworkSettings': {
                    'IPAddress': '',
                    'Networks': {
                        'bridge': {'IPAddress': '172.17.0.2'},
                        'foo': {'IPAddress': '192.168.0.2'}
                    }}
                  },
                 {'host': '%%host_foo%%', 'port': 1337}, ['host_foo'], ['foo', 'bar:baz']),
                ({'host': '%%host_foo%%', 'port': 1337, 'tags': ['foo', 'bar:baz']},
                 {'host_foo': '192.168.0.2'}),
            ),
            (
                ({'NetworkSettings': {'IPAddress': '127.0.0.1', 'Ports': {'42/tcp': None, '22/tcp': None}}},
                 {'host': '%%host%%', 'port': '%%port_1%%', 'tags': ['env:test']},
                 ['host', 'port_1'], ['foo', 'bar:baz']),
                ({'host': '%%host%%', 'port': '%%port_1%%', 'tags': ['env:test', 'foo', 'bar:baz']},
                 {'host': '127.0.0.1', 'port_1': '42'})
            )
        ]

        # should not fail but return something specific
        edge_cases = [
            # ((inspect, instance_tpl, variables, tags), (expected_instance_tpl, expected_var_values))

            # specify bridge but there is also a default IPAddress (networks should be preferred)
            (
                ({'NetworkSettings': {
                    'IPAddress': '127.0.0.1',
                    'Networks': {'bridge': {'IPAddress': '172.17.0.2'}}}},
                 {'host': '%%host_bridge%%', 'port': 1337}, ['host_bridge'], ['foo', 'bar:baz']),
                ({'host': '%%host_bridge%%', 'port': 1337, 'tags': ['foo', 'bar:baz']},
                 {'host_bridge': '172.17.0.2'})
            ),
            # specify index but there is a default IPAddress (there's a specifier, even if it's wrong, walking networks should be preferred)
            (
                ({'NetworkSettings': {
                    'IPAddress': '127.0.0.1',
                    'Networks': {'bridge': {'IPAddress': '172.17.0.2'}}}},
                 {'host': '%%host_0%%', 'port': 1337}, ['host_0'], ['foo', 'bar:baz']),
                ({'host': '%%host_0%%', 'port': 1337, 'tags': ['foo', 'bar:baz']}, {'host_0': '172.17.0.2'}),
            ),
            # missing key for host, bridge network should be preferred
            (
                ({'NetworkSettings': {'Networks': {
                    'bridge': {'IPAddress': '127.0.0.1'},
                    'foo': {'IPAddress': '172.17.0.2'}}}},
                 {'host': '%%host_bar%%', 'port': 1337}, ['host_bar'], []),
                ({'host': '%%host_bar%%', 'port': 1337}, {'host_bar': '127.0.0.1'}),
            ),
            # missing index for port
            (
                ({'NetworkSettings': {'IPAddress': '127.0.0.1', 'Ports': {'42/tcp': None, '22/tcp': None}}},
                 {'host': '%%host%%', 'port': '%%port_2%%', 'tags': ['env:test']},
                 ['host', 'port_2'], ['foo', 'bar:baz']),
                ({'host': '%%host%%', 'port': '%%port_2%%', 'tags': ['env:test', 'foo', 'bar:baz']},
                 {'host': '127.0.0.1', 'port_2': '42'})
            )
        ]

        # should raise
        invalid_config = [
            # ((inspect, instance_tpl, variables, tags), expected_exception)

            # template variable but no IPAddress available
            (
                ({'NetworkSettings': {'Networks': {}}},
                 {'host': '%%host%%', 'port': 1337}, ['host'], ['foo', 'bar:baz']),
                Exception,
            ),
            # index but no IPAddress available
            (
                ({'NetworkSettings': {'Networks': {}}},
                 {'host': '%%host_0%%', 'port': 1337}, ['host_0'], ['foo', 'bar:baz']),
                Exception,
            ),
            # key but no IPAddress available
            (
                ({'NetworkSettings': {'Networks': {}}},
                 {'host': '%%host_foo%%', 'port': 1337}, ['host_foo'], ['foo', 'bar:baz']),
                Exception,
            ),

            # template variable but no port available
            (
                ({'NetworkSettings': {'Networks': {}}},
                 {'host': 'localhost', 'port': '%%port%%'}, ['port'], []),
                Exception,
            ),
            # index but no port available
            (
                ({'NetworkSettings': {'Networks': {}}},
                 {'host': 'localhost', 'port_0': '%%port%%'}, ['port_0'], []),
                Exception,
            ),
            # key but no port available
            (
                ({'NetworkSettings': {'Networks': {}}},
                 {'host': 'localhost', 'port': '%%port_foo%%'}, ['port_foo'], []),
                Exception,
            )
        ]

        for ac in self.agentConfigs:
            sd_backend = get_sd_backend(agentConfig=ac)
            try:
                for co in valid_configs + edge_cases:
                    inspect, tpl, variables, tags = co[0]
                    state = _SDDockerBackendConfigFetchState(lambda _: inspect)
                    instance_tpl, var_values = sd_backend._fill_tpl(state, 'c_id', tpl, variables, tags)
                    for key in instance_tpl.keys():
                        if isinstance(instance_tpl[key], list):
                            self.assertEquals(len(instance_tpl[key]), len(co[1][0].get(key)))
                            for elem in instance_tpl[key]:
                                self.assertTrue(elem in co[1][0].get(key))
                        else:
                            self.assertEquals(instance_tpl[key], co[1][0].get(key))
                    self.assertEquals(var_values, co[1][1])

                for co in invalid_config:
                    inspect, tpl, variables, tags = co[0]
                    state = _SDDockerBackendConfigFetchState(lambda _: inspect)
                    self.assertRaises(co[1], sd_backend._fill_tpl(state, 'c_id', tpl, variables, tags))
            finally:
                clear_singletons(ac)
 def test_get_container_pid(self, *args):
     for c_ins, _, var_tpl, _, _, expected_pid in self.container_inspects:
         state = _SDDockerBackendConfigFetchState(lambda _: c_ins)
         sd_backend = get_sd_backend(agentConfig=self.auto_conf_agentConfig)
         self.assertEquals(sd_backend._get_container_pid(state, 'container id', var_tpl), expected_pid)
         clear_singletons(self.auto_conf_agentConfig)