Created
May 11, 2020 22:13
-
-
Save rickcrawford/134a0e2876bb6d43874193691d12335a to your computer and use it in GitHub Desktop.
Reporting on your network settings based on the APIs available here: https://cloud.google.com/vpc/docs/apis
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import sys | |
import json | |
from pprint import pprint | |
from googleapiclient import discovery | |
from oauth2client.client import GoogleCredentials | |
def get_forwarding_rules(service, project): | |
request = service.forwardingRules().aggregatedList(project=project) | |
nextFn = service.forwardingRules().aggregatedList_next | |
return _aggregated_list(request, nextFn) | |
def get_firewalls(service, project): | |
request = service.firewalls().list(project=project) | |
nextFn = service.firewalls().list_next | |
return _list(request, nextFn) | |
def get_routes(service, project): | |
request = service.routes().list(project=project) | |
nextFn = service.routes().list_next | |
return _list(request, nextFn) | |
def get_subnets(service, project): | |
request = service.subnetworks().aggregatedList(project=project) | |
nextFn = service.subnetworks().aggregatedList_next | |
return _aggregated_list(request, nextFn) | |
def get_networks(service, project): | |
request = service.networks().list(project=project) | |
nextFn = service.networks().list_next | |
return _list(request, nextFn) | |
def get_service_projects(service, project): | |
request = service.projects().getXpnResources(project=project) | |
nextFn = service.projects().getXpnResources_next | |
items_key='resources' | |
return _list(request, nextFn, items_key) | |
def get_routers(service, project): | |
request = service.routers().aggregatedList(project=project) | |
nextFn = service.routers().aggregatedList_next | |
return _aggregated_list(request, nextFn) | |
def _list(request, nextFn, items_key='items'): | |
results = [] | |
try: | |
while request is not None: | |
response = request.execute() | |
for item in response[items_key]: | |
results.append(item) | |
request = nextFn(previous_request=request, previous_response=response) | |
except: | |
pass | |
return results | |
def _aggregated_list(request, nextFn, items_key='items'): | |
results = {} | |
try: | |
while request is not None: | |
response = request.execute() | |
for name, values in response[items_key].items(): | |
results[name] = values | |
request = nextFn(previous_request=request, previous_response=response) | |
except: | |
pass | |
return results | |
def _main(project): | |
credentials = GoogleCredentials.get_application_default() | |
service = discovery.build('compute', 'v1', credentials=credentials) | |
results = {} | |
results['firewalls'] = get_firewalls(service, project) | |
results['forwardingRules'] = get_forwarding_rules(service, project) | |
results['routes'] = get_routes(service, project) | |
results['routers'] = get_routers(service, project) | |
results['networks'] = get_networks(service, project) | |
results['serviceProjects'] = get_service_projects(service, project) | |
results['subnets'] = get_subnets(service, project) | |
print(json.dumps(results, sort_keys=True, indent=4)) | |
if __name__ == "__main__": | |
if len(sys.argv) > 1: | |
project = sys.argv[1] | |
_main(project) | |
else: | |
print('usage: network_report.py {project ID}') |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment