import json import subprocess import os import argparse import yaml from kubernetes import client, config import base64 import time import csv from datetime import datetime result = subprocess.run(['gcloud', 'compute', 'routers', 'list','--format', 'json'], stdout=subprocess.PIPE) routersDict = json.loads(result.stdout) routers = [] for router in routersDict: name = '' if 'name' in router: name = router['name'] routers.append([router['id'], name, router['region'], router['selfLink']]) outfile='routers.csv' csvFile = open(outfile, 'w', newline='') fieldnames = ['id', 'name', 'zone', 'selfLink'] writer = csv.DictWriter(csvFile, fieldnames=fieldnames) writer.writeheader() allRunRouters = [] gardenerConfigs = ["gardener-dev", "gardener-staging", "gardener-stability"] for gardenConfig in gardenerConfigs: config.kube_config.load_kube_config(config_file=gardenConfig) apiClient = client.CoreV1Api() namespaces = apiClient.list_namespace() shootClient = client.CustomObjectsApi() for ns in namespaces.items: shoots = shootClient.list_namespaced_custom_object( group="core.gardener.cloud", version="v1beta1", namespace=ns.metadata.name, plural="shoots", ) for shoot in shoots['items']: shootName = str.replace(ns.metadata.name, "garden-", '') if shoot['spec']['provider']['type'] == "gcp": allRunRouters.append('shoot--{}--{}-cloud-router'.format(shootName, shoot["metadata"]["name"])) leakRoutes = [] for router in routers: foundIt = False for runRouter in allRunRouters: if router[1] == runRouter: foundIt = True break if not foundIt and 'shoot--' in router[1]: writer.writerow({ 'id': router[0], 'name': router[1], 'zone': router[2], 'selfLink': router[3]}) leakRoutes.append(router) csvFile.close() outfile='nats.csv' csvFile = open(outfile, 'w', newline='') fieldnames = ['name'] writer = csv.DictWriter(csvFile, fieldnames=fieldnames) writer.writeheader() for leakRoute in leakRoutes: seps = leakRoute[2].split('/') region = seps[len(seps) -1 ] print(leakRoute[1], region) result = subprocess.run(['gcloud', 'compute', 'routers', 'nats', 'list', '--router={}'.format(leakRoute[1]), "--router-region={}".format(region), '--format', 'json'], stdout=subprocess.PIPE) natsDict = json.loads(result.stdout) for nat in natsDict: writer.writerow( { 'name': nat['name'], } ) csvFile.close() outfile='loadbalancers.csv' csvFile = open(outfile, 'w', newline='') fieldnames = ['name'] writer = csv.DictWriter(csvFile, fieldnames=fieldnames) writer.writeheader() result = subprocess.run(['gcloud', 'compute', 'instances', 'list','--format', 'json'], stdout=subprocess.PIPE) instances = json.loads(result.stdout) instancesDict = {} for instance in instances: if 'name' in instance: name = instance['name'] instancesDict[instance['name']] = instances result = subprocess.run(['gcloud', 'compute', 'forwarding-rules', 'list','--format', 'json'], stdout=subprocess.PIPE) loadbalances = json.loads(result.stdout) loadbalancesDict = {} for loadbalance in loadbalances: loadbalancesDict[loadbalance['id']] = loadbalance result = subprocess.run(['gcloud', 'compute', 'target-pools', 'list','--format', 'json'], stdout=subprocess.PIPE) targetPools = json.loads(result.stdout) targetPoolsDict = {} for targetPool in targetPools: targetPoolsDict[targetPool['name']] = targetPool print(targetPoolsDict) for loadbalance in loadbalances: if 'target' not in loadbalance: continue targetPoolSep = loadbalance["target"].split('/') targetPoolId = targetPoolSep[len(targetPoolSep) -1] # print(loadbalancesDict[targetPoolId]) # if "instances" not in loadbalancesDict[targetPoolId]: # continue # print(targetPoolsDict[targetPoolId]) if 'instances' not in targetPoolsDict[targetPoolId]: writer.writerow( { 'name': loadbalance['id'], } ) continue instances = targetPoolsDict[targetPoolId]['instances'] foundIt = False for instanceFullName in instances: instanceSeps = instanceFullName.split('/') instanceName = instanceFullName[len(instanceFullName) - 1] if instanceName in instancesDict: foundIt = True break if not foundIt: writer.writerow( { 'name': loadbalance['id'], } ) csvFile.close()