def _build_envoy_location_dict( envoy_host: str, envoy_admin_port: int, envoy_admin_endpoint_format: str, registration: str, pods: Iterable[V1Pod], location: str, should_return_individual_backends: bool, ) -> MutableMapping[str, Any]: backends = envoy_tools.get_backends( registration, envoy_host=envoy_host, envoy_admin_port=envoy_admin_port, envoy_admin_endpoint_format=envoy_admin_endpoint_format, ) sorted_envoy_backends = sorted( [ backend[0] for _, service_backends in backends.items() for backend in service_backends ], key=lambda backend: backend["eds_health_status"], ) casper_proxied_backends = { (backend["address"], backend["port_value"]) for _, service_backends in backends.items() for backend, is_casper_proxied_backend in service_backends if is_casper_proxied_backend } matched_envoy_backends_and_pods = envoy_tools.match_backends_and_pods( sorted_envoy_backends, pods, ) return envoy_tools.build_envoy_location_dict( location, matched_envoy_backends_and_pods, should_return_individual_backends, casper_proxied_backends, )
def test_match_backends_and_pods(mock_backends): backends = mock_backends good_pod_1 = mock.Mock(status=mock.Mock(pod_ip="10.50.2.4")) good_pod_2 = mock.Mock(status=mock.Mock(pod_ip="10.50.2.5")) bad_pod_1 = mock.Mock(status=mock.Mock(pod_ip="10.50.2.10")) pods = [good_pod_1, good_pod_2, bad_pod_1] expected = [ (backends[0], good_pod_1), (backends[1], good_pod_2), (None, bad_pod_1), (backends[2], None), (backends[3], None), (backends[4], None), ] actual = match_backends_and_pods(backends, pods) def keyfunc(t): sorted_backend = tuple(sorted((t[0] or {}).items())) pod_ip = t[1].status.pod_ip if t[1] else "" return sorted_backend, pod_ip assert sorted(actual, key=keyfunc) == sorted(expected, key=keyfunc)