in gcpdiag/runbook/nat/public_nat_ip_allocation_failed.py [0:0]
def execute(self):
"""Checking the nat_allocation_failed metric for NAT IP allocation failure
and the NAT router status.
"""
project = crm.get_project(op.get(flags.PROJECT_ID))
gw_name = op.get(flags.NAT_GATEWAY_NAME)
region = op.get(flags.REGION)
# check the nat router status
router_status = network.nat_router_status(
project_id=op.get(flags.PROJECT_ID),
router_name=op.get(flags.CLOUD_ROUTER_NAME),
region=op.get(flags.REGION))
if not router_status:
op.info('unable to fetch router status for the router: %s',
op.get(flags.CLOUD_ROUTER_NAME))
else:
min_extra_ips_needed = router_status.min_extra_nat_ips_needed
vms_with_nat_mappings = router_status.num_vms_with_nat_mappings
nat_allocation_failed = monitoring.query(
op.get(flags.PROJECT_ID),
'fetch nat_gateway::router.googleapis.com/nat/nat_allocation_failed '
f'| filter (resource.gateway_name == \'{gw_name}\' && resource.region == \'{region}\')'
' | within 5m')
if nat_allocation_failed:
values = nat_allocation_failed.values()
for value in values:
if value.get('values')[0][0] or min_extra_ips_needed:
op.add_failed(project,
reason=op.prep_msg(
op.FAILURE_REASON,
nat_gateway_name=op.get(flags.NAT_GATEWAY_NAME),
router_name=op.get(flags.CLOUD_ROUTER_NAME),
min_extra_ips_needed=min_extra_ips_needed,
vms_with_nat_mappings=vms_with_nat_mappings),
remediation=op.prep_msg(
op.FAILURE_REMEDIATION,
nat_gateway_name=op.get(flags.NAT_GATEWAY_NAME),
router_name=op.get(flags.CLOUD_ROUTER_NAME),
min_extra_ips_needed=min_extra_ips_needed,
vms_with_nat_mappings=vms_with_nat_mappings))
else:
op.add_ok(project,
reason=op.prep_msg(
op.SUCCESS_REASON,
nat_gateway_name=op.get(flags.NAT_GATEWAY_NAME),
router_name=op.get(flags.CLOUD_ROUTER_NAME),
min_extra_ips_needed=min_extra_ips_needed,
vms_with_nat_mappings=vms_with_nat_mappings))
op.add_skipped(project,
reason=op.prep_msg(
op.SKIPPED_REASON,
nat_gateway_name=op.get(flags.NAT_GATEWAY_NAME),
router_name=op.get(flags.CLOUD_ROUTER_NAME)))
else:
op.add_uncertain(project,
reason=op.prep_msg(op.UNCERTAIN_REASON,
nat_gateway_name=op.get(
flags.NAT_GATEWAY_NAME)),
remediation=op.prep_msg(op.UNCERTAIN_REMEDIATION,
nat_gateway_name=op.get(
flags.NAT_GATEWAY_NAME)))