def create_federated_clusters()

in source/eksfedctl/create_script.py [0:0]


def create_federated_clusters(config):
    metadata = config.yaml["metadata"]
    [region1, region2] = metadata["regions"]
    zones = [get_availability_zones(region1), get_availability_zones(region2)]

    logs.log(
        f"Deploying federated Amazon EKS clusters in {region1} and {region2}..."
    )

    root_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), "..")
    os.chdir(f"{root_path}/cdk-vpc-peering/")
    exec_command(["npm", "install", "--quiet", "--no-progress", "--no-fund"])

    clusters = []
    output_config = dict()
    for idx, region in enumerate(metadata["regions"]):
        cluster_name = f"{metadata['name']}-{idx+1}"
        output_config[f"CLUSTER{idx+1}_NAME"] = cluster_name
        output_config[f"CLUSTER{idx+1}_REGION"] = region
        logs.log(f"Deploying cluster {cluster_name} to {region}")

        eks = boto3.client("eks", region_name=region)
        if cluster_name in eks.list_clusters()["clusters"]:
            raise Exception(f"Cluster \"{cluster_name}\" already exists")

        cluster_template = copy.deepcopy(config.spec)
        cluster_template["metadata"]["name"] = cluster_name
        cluster_template["metadata"]["region"] = region
        cluster_template["vpc"]["cidr"] = get_cidr_for_vpc(idx+1)
        cluster_template["availabilityZones"] = zones[idx]

        cluster_yaml = yaml.dump(cluster_template)

        exec_command(["eksctl", "create", "cluster", "-f", "-"], cluster_yaml)
        cluster_details = eks.describe_cluster(name=cluster_name)["cluster"]
        clusters.append(cluster_details)
        create_identity_mapping(config, region, cluster_details)

    vpc1id = clusters[0]["resourcesVpcConfig"]["vpcId"]
    vpc2id = clusters[1]["resourcesVpcConfig"]["vpcId"]

    logs.log(f"Creating VPC peering")
    bastion = config.bastion
    create_vpc_peering(config, f"{metadata['name']}-peering-clusters",
                               region1, vpc1id, get_cidr_for_vpc(1),
                               region2, vpc2id, get_cidr_for_vpc(2))

    create_vpc_peering(config, f"{metadata['name']}-peering-bastion-{vpc1id}",
                               bastion.region, bastion.vpcid, bastion.vpccidr,
                               region1, vpc1id, get_cidr_for_vpc(1))

    create_vpc_peering(config, f"{metadata['name']}-peering-bastion-{vpc2id}",
                               bastion.region, bastion.vpcid, bastion.vpccidr,
                               region2, vpc2id, get_cidr_for_vpc(2))

    os.chdir("..")
    clusters_disable_public_access(config, clusters)

    logs.log(f"Joining clusters into federation")
    clusters_join_federation(config, clusters)

    output_config["BASE_NAME"] = metadata["name"]
    output_config["BASTION_REGION"] = bastion.region
    write_output_config(config, output_config)

    logs.log("Done. Federated EKS clusters has been created")