def execute()

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)))