// Copyright 2022 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

syntax = "proto3";

package google.cloud.networkanalyzer.logging.v1;

import "google/protobuf/timestamp.proto";

option csharp_namespace = "Google.Cloud.NetworkAnalyzer.Logging.V1";
option go_package = "cloud.google.com/go/networkanalyzer/logging/apiv1/loggingpb;loggingpb";
option java_multiple_files = true;
option java_outer_classname = "AnalyzerLogProto";
option java_package = "com.google.cloud.networkanalyzer.logging.v1";
option php_namespace = "Google\\Cloud\\NetworkAnalyzer\\Logging\\V1";
option ruby_package = "Google::Cloud::NetworkAnalyzer::Logging::V1";

enum ReportCauseCode {
  REPORT_CAUSE_CODE_UNSPECIFIED = 0;

  // VPC Basics
  ROUTE_INVALID_NEXT_HOP_VM_IP_FORWARDING_DISABLED = 1;

  ROUTE_INVALID_NEXT_HOP_VM_DELETED = 2;

  ROUTE_INVALID_NEXT_HOP_VM_STOPPED = 3;

  ROUTE_INVALID_NEXT_HOP_ILB_MISCONFIGURED = 4;

  ROUTE_INVALID_NEXT_HOP_VPN_TUNNEL_DELETED = 5;

  ROUTE_INVALID_NEXT_HOP_ILB_BACKEND_IP_FORWARDING_DISABLED = 6;

  IP_UTILIZATION_IP_ALLOCATION_RATIO_HIGH = 20;

  // Summary of ip utilization of all subnet ranges in the project.
  IP_UTILIZATION_IP_ALLOCATION_SUMMARY = 21;

  // Kubernetes Engine
  GKE_NODE_TO_CONTROL_PLANE_BLOCKED_BY_ROUTING_ISSUE = 201;

  GKE_NODE_TO_CONTROL_PLANE_PUBLIC_ENDPOINT_BLOCKED_BY_EGRESS_FIREWALL = 202;

  GKE_NODE_TO_CONTROL_PLANE_PRIVATE_ENDPOINT_BLOCKED_BY_EGRESS_FIREWALL = 203;

  GKE_CONTROL_PLANE_TO_NODE_BLOCKED_BY_ROUTING_ISSUE = 211;

  GKE_CONTROL_PLANE_TO_NODE_BLOCKED_BY_INGRESS_FIREWALL_ON_NODE = 212;

  GKE_IP_UTILIZATION_POD_RANGES_ALLOCATION_HIGH = 221;

  GKE_IP_UTILIZATION_POD_RANGES_ALLOCATION_LIMITES_AUTOSCALING = 222;

  // Managed Services
  CLOUD_SQL_PRIVATE_IP_BLOCKED_BY_EGRESS_FIREWALL = 601;

  CLOUD_SQL_PRIVATE_IP_BLOCKED_BY_ROUTING_ISSUE = 602;

  CLOUD_SQL_PRIVATE_IP_INSTANCE_NOT_RUNNING = 603;

  // Hybrid Connectivity
  DYNAMIC_ROUTE_SHADOWED_FULLY_SHADOWED_BY_SUBNET_ROUTE = 801;

  DYNAMIC_ROUTE_SHADOWED_FULLY_SHADOWED_BY_PEERING_SUBNET_ROUTE = 802;

  DYNAMIC_ROUTE_SHADOWED_FULLY_SHADOWED_BY_STATIC_ROUTE = 803;

  DYNAMIC_ROUTE_SHADOWED_FULLY_SHADOWED_BY_PEERING_STATIC_ROUTE = 804;

  DYNAMIC_ROUTE_SHADOWED_PARTIALLY_SHADOWED_BY_SUBNET_ROUTE = 805;

  DYNAMIC_ROUTE_SHADOWED_PARTIALLY_SHADOWED_BY_PEERING_SUBNET_ROUTE = 806;

  DYNAMIC_ROUTE_SHADOWED_PARTIALLY_SHADOWED_BY_STATIC_ROUTE = 807;

  DYNAMIC_ROUTE_SHADOWED_PARTIALLY_SHADOWED_BY_PEERING_STATIC_ROUTE = 808;

  // Network Services
  LOAD_BALANCER_HEALTH_CHECK_FIREWALL_HEALTH_CHECK_FIREWALL_NOT_CONFIGURED =
      1001;

  LOAD_BALANCER_HEALTH_CHECK_FIREWALL_HEALTH_CHECK_RANGE_BLOCKED = 1002;

  LOAD_BALANCER_HEALTH_CHECK_FIREWALL_FIREWALL_CONFIG_INCONSISTENT = 1003;

  LOAD_BALANCER_HEALTH_CHECK_FIREWALL_HEALTH_CHECK_RANGE_PARTIALLY_BLOCKED =
      1004;

  LOAD_BALANCER_BEST_PRACTICES_BACKEND_SERVICE_BALANCING_MODE_BREAKS_SESSION_AFFINITY =
      1021;

  LOAD_BALANCER_BEST_PRACTICES_BACKEND_SERVICE_HEALTH_CHECK_PORT_MISMATCH =
      1024;
}

message IpUtilizationInfo {
  message SubnetIpUtilization {
    // URI of subnet.
    string subnet_uri = 1;

    // Secondary range name. If the range is the primary range of the subnet,
    // this field is empty.
    string secondary_range_name = 2;

    // Total number of usable IP addresses in the IP range.
    uint64 total_usable_addresses = 3;

    // The ratio of allocated IP addresses from the total usable addresses.
    double allocation_ratio = 4;
  }

  repeated SubnetIpUtilization subnet_ip_utilization = 1;
}

// Log entry that describes a report from Network Analyzer.
message Report {
  // Priority level of an report.
  enum Priority {
    SEVERITY_UNSPECIFIED = 0;

    CRITICAL = 1;

    HIGH = 2;

    MEDIUM = 3;

    LOW = 4;
  }

  // Type of an report.
  enum Type {
    REPORT_TYPE_UNSPECIFIED = 0;

    INFO = 1;

    WARNING = 2;

    ERROR = 3;
  }

  // Status of an report.
  enum ReportStatus {
    REPORT_STATUS_UNSPECIFIED = 0;

    ACTIVE = 1;

    FIXED = 2;

    DISMISSED = 3;
  }

  // Groups of an report.
  enum ReportGroup {
    CATEGORY_UNSPECIFIED = 0;

    VPC_NETWORK = 1;

    NETWORK_SERVICES = 2;

    KUBERNETES_ENGINE = 3;

    HYBRID_CONNECTIVITY = 4;

    MANAGED_SERVICES = 5;
  }

  // The unique identifier of the report.
  string id = 1;

  // Priority of the report.
  Priority priority = 2;

  // Type of the report.
  Type type = 3;

  // Status of the report.
  ReportStatus status = 4;

  // The timestamp when the report was first discovered by Network Analyzer.
  google.protobuf.Timestamp first_report_time = 9;

  // Cause code of the report.
  ReportCauseCode cause_code = 12;

  // The resource that are reported with the report.
  // Contains the fully qualified resource name.
  // e.g.,
  // `//compute.googleapis.com/projects/{project_id}/global/networks/{network}`
  string resource_name = 15;

  // Location associated with the report. It can be global or GCP regions
  // and zones. e.g., https://cloud.google.com/compute/docs/regions-zones/
  string location = 16;

  // URI to the documentation of the report.
  string report_documentation_uri = 17;

  // The groups of the report. One report may be present in multiple groups.
  repeated ReportGroup report_groups = 18;

  oneof content {
    IpUtilizationInfo ip_utilization_info = 19;
  }
}
