Skip to content

Instantly share code, notes, and snippets.

@rickcrawford
Last active May 11, 2020 22:18
Show Gist options
  • Save rickcrawford/c529c0e3f75da62c21de3d50d966e388 to your computer and use it in GitHub Desktop.
Save rickcrawford/c529c0e3f75da62c21de3d50d966e388 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 script is provided without any warrantees and is for testing purposes.

python3 -m venv .venv
source .venv/bin/activate
pip install --upgrade pip
pip install -r requirements.txt

Login default credentials

gcloud auth application-default login
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}')
cachetools==4.1.0
certifi==2020.4.5.1
chardet==3.0.4
google-api-core==1.17.0
google-api-python-client==1.8.2
google-auth==1.14.1
google-auth-httplib2==0.0.3
googleapis-common-protos==1.51.0
httplib2==0.17.3
idna==2.9
oauth2client==4.1.3
protobuf==3.11.3
pyasn1==0.4.8
pyasn1-modules==0.2.8
pytz==2020.1
requests==2.23.0
rsa==4.0
six==1.14.0
uritemplate==3.0.1
urllib3==1.25.9
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment