import json
import subprocess

def get_kubectl_output(command):
    result = subprocess.run(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
    if result.returncode != 0:
        raise Exception(f"Error running command: {result.stderr}")
    return json.loads(result.stdout)

def filter_namespaces(items):
    system_namespaces = ['kube-system', 'default', 'kube-node-lease']
    return [item for item in items if 'd8-' not in item['metadata']['namespace'] and item['metadata']['namespace'] not in system_namespaces]

def main():
    services = get_kubectl_output("kubectl get services --all-namespaces -o json")
    pods = get_kubectl_output("kubectl get pods --all-namespaces -o json")

    filtered_services = filter_namespaces(services['items'])
    filtered_pods = filter_namespaces(pods['items'])

    service_dict = {}
    for svc in filtered_services:
        svc_namespace = svc['metadata']['namespace']
        svc_name = svc['metadata']['name']
        selectors = svc['spec'].get('selector', {})
        service_dict[(svc_namespace, svc_name)] = selectors

    pod_dict = {}
    for pod in filtered_pods:
        pod_namespace = pod['metadata']['namespace']
        pod_labels = pod['metadata'].get('labels', {})
        pod_name = pod['metadata']['name']
        pod_dict[(pod_namespace, pod_name)] = pod_labels

    cross_namespace_communication = []

    for (svc_namespace, svc_name), selectors in service_dict.items():
        for (pod_namespace, pod_name), labels in pod_dict.items():
            if svc_namespace != pod_namespace and all(labels.get(key) == value for key, value in selectors.items()):
                cross_namespace_communication.append({
                    "service_namespace": svc_namespace,
                    "service_name": svc_name,
                    "service_selectors": selectors,
                    "pod_namespace": pod_namespace,
                    "pod_name": pod_name,
                    "pod_labels": labels
                })

    for comm in cross_namespace_communication:
        print(f"Service {comm['service_namespace']}/{comm['service_name']} (selectors: {comm['service_selectors']}) communicates with Pod {comm['pod_namespace']}/{comm['pod_name']} (labels: {comm['pod_labels']}) in different namespace")

if __name__ == "__main__":
    main()
