Skip to content

Instantly share code, notes, and snippets.

@rickcrawford
Created May 11, 2020 22:13
Show Gist options
  • Save rickcrawford/134a0e2876bb6d43874193691d12335a to your computer and use it in GitHub Desktop.
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
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