// Copyright 2024 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.gdchardwaremanagement.v1alpha;

import "google/api/field_behavior.proto";
import "google/api/field_info.proto";
import "google/api/resource.proto";
import "google/protobuf/timestamp.proto";
import "google/type/date.proto";
import "google/type/datetime.proto";
import "google/type/dayofweek.proto";
import "google/type/postal_address.proto";
import "google/type/timeofday.proto";

option csharp_namespace = "Google.Cloud.GdcHardwareManagement.V1Alpha";
option go_package = "cloud.google.com/go/gdchardwaremanagement/apiv1alpha/gdchardwaremanagementpb;gdchardwaremanagementpb";
option java_multiple_files = true;
option java_outer_classname = "ResourcesProto";
option java_package = "com.google.cloud.gdchardwaremanagement.v1alpha";
option php_namespace = "Google\\Cloud\\GdcHardwareManagement\\V1alpha";
option ruby_package = "Google::Cloud::GDCHardwareManagement::V1alpha";

// The power supply options.
enum PowerSupply {
  // Power supply is unspecified.
  POWER_SUPPLY_UNSPECIFIED = 0;

  // AC power supply.
  POWER_SUPPLY_AC = 1;

  // DC power supply.
  POWER_SUPPLY_DC = 2;
}

// An order for GDC hardware.
message Order {
  option (google.api.resource) = {
    type: "gdchardwaremanagement.googleapis.com/Order"
    pattern: "projects/{project}/locations/{location}/orders/{order}"
    plural: "orders"
    singular: "order"
  };

  // Valid states of an order.
  enum State {
    // State of the order is unspecified.
    STATE_UNSPECIFIED = 0;

    // Order is being drafted by the customer and has not been submitted yet.
    DRAFT = 1;

    // Order has been submitted to Google.
    SUBMITTED = 2;

    // Order has been accepted by Google.
    ACCEPTED = 3;

    // Order needs more information from the customer.
    ADDITIONAL_INFO_NEEDED = 4;

    // Google has initiated building hardware for the order.
    BUILDING = 5;

    // The hardware has been built and is being shipped.
    SHIPPING = 6;

    // The hardware is being installed.
    INSTALLING = 7;

    // An error occurred in processing the order and customer intervention is
    // required.
    FAILED = 8;

    // Order has been partially completed i.e., some hardware have been
    // delivered and installed.
    PARTIALLY_COMPLETED = 9;

    // Order has been completed.
    COMPLETED = 10;

    // Order has been cancelled.
    CANCELLED = 11;
  }

  // Valid types of an Order.
  enum Type {
    // Type of the order is unspecified.
    TYPE_UNSPECIFIED = 0;

    // Paid by the customer.
    PAID = 1;

    // Proof of concept for the customer.
    POC = 2;
  }

  // Identifier. Name of this order.
  // Format: `projects/{project}/locations/{location}/orders/{order}`
  string name = 1 [(google.api.field_behavior) = IDENTIFIER];

  // Optional. Display name of this order.
  string display_name = 13 [(google.api.field_behavior) = OPTIONAL];

  // Output only. Time when this order was created.
  google.protobuf.Timestamp create_time = 2
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Time when this order was last updated.
  google.protobuf.Timestamp update_time = 3
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Optional. Labels associated with this order as key value pairs.
  // For more information about labels, see [Create and manage
  // labels](https://cloud.google.com/resource-manager/docs/creating-managing-labels).
  map<string, string> labels = 4 [(google.api.field_behavior) = OPTIONAL];

  // Output only. State of this order. On order creation, state will be set to
  // DRAFT.
  State state = 5 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Required. Customer contact information.
  OrganizationContact organization_contact = 6
      [(google.api.field_behavior) = REQUIRED];

  // Optional. Customer specified workloads of interest targeted by this order.
  // This must contain <= 20 elements and the length of each element must be <=
  // 50 characters.
  repeated string target_workloads = 7 [(google.api.field_behavior) = OPTIONAL];

  // Required. Information about the customer's motivation for this order. The
  // length of this field must be <= 1000 characters.
  string customer_motivation = 8 [(google.api.field_behavior) = REQUIRED];

  // Required. Customer specified deadline by when this order should be
  // fulfilled.
  google.protobuf.Timestamp fulfillment_time = 9
      [(google.api.field_behavior) = REQUIRED];

  // Required. [Unicode CLDR](http://cldr.unicode.org/) region code where this
  // order will be deployed. For a list of valid CLDR region codes, see the
  // [Language Subtag
  // Registry](https://www.iana.org/assignments/language-subtag-registry/language-subtag-registry).
  string region_code = 10 [(google.api.field_behavior) = REQUIRED];

  // Output only. Link to the order form.
  string order_form_uri = 11 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Type of this Order.
  Type type = 12 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Time when the order was submitted. Is auto-populated to the
  // current time when an order is submitted.
  google.protobuf.Timestamp submit_time = 14
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Required. The Google Cloud Billing ID to be charged for this order.
  string billing_id = 15 [(google.api.field_behavior) = REQUIRED];

  // Optional. Existing hardware to be removed as part of this order.
  // Note: any hardware removed will be recycled unless otherwise agreed.
  repeated HardwareLocation existing_hardware = 16
      [(google.api.field_behavior) = OPTIONAL];
}

// A physical site where hardware will be installed.
message Site {
  option (google.api.resource) = {
    type: "gdchardwaremanagement.googleapis.com/Site"
    pattern: "projects/{project}/locations/{location}/sites/{site}"
    plural: "sites"
    singular: "site"
  };

  // Identifier. Name of the site.
  // Format: `projects/{project}/locations/{location}/sites/{site}`
  string name = 1 [(google.api.field_behavior) = IDENTIFIER];

  // Optional. Display name of this Site.
  string display_name = 24 [(google.api.field_behavior) = OPTIONAL];

  // Optional. Description of this Site.
  string description = 25 [(google.api.field_behavior) = OPTIONAL];

  // Output only. Time when this site was created.
  google.protobuf.Timestamp create_time = 2
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Time when this site was last updated.
  google.protobuf.Timestamp update_time = 3
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Optional. Labels associated with this site as key value pairs.
  // For more information about labels, see [Create and manage
  // labels](https://cloud.google.com/resource-manager/docs/creating-managing-labels).
  map<string, string> labels = 4 [(google.api.field_behavior) = OPTIONAL];

  // Required. Contact information for this site.
  OrganizationContact organization_contact = 5
      [(google.api.field_behavior) = REQUIRED];

  // Required. A URL to the Google Maps address location of the site.
  // An example value is `https://goo.gl/maps/xxxxxxxxx`.
  string google_maps_pin_uri = 6 [(google.api.field_behavior) = REQUIRED];

  // Optional. The time periods when the site is accessible.
  // If this field is empty, the site is accessible at all times.
  repeated TimePeriod access_times = 26
      [(google.api.field_behavior) = OPTIONAL];

  // Optional. Any additional notes for this Site. Please include information
  // about:
  //  - security or access restrictions
  //  - any regulations affecting the technicians visiting the site
  //  - any special process or approval required to move the equipment
  //  - whether a representative will be available during site visits
  string notes = 27 [(google.api.field_behavior) = OPTIONAL];
}

// A group of hardware that is part of the same order, has the same SKU, and is
// delivered to the same site.
message HardwareGroup {
  option (google.api.resource) = {
    type: "gdchardwaremanagement.googleapis.com/HardwareGroup"
    pattern: "projects/{project}/locations/{location}/orders/{order}/hardwareGroups/{hardware_group}"
    plural: "hardwareGroups"
    singular: "hardwareGroup"
  };

  // Valid states of a HardwareGroup.
  enum State {
    // State of the HardwareGroup is unspecified.
    STATE_UNSPECIFIED = 0;

    // More information is required from the customer to make progress.
    ADDITIONAL_INFO_NEEDED = 1;

    // Google has initiated building hardware for this HardwareGroup.
    BUILDING = 2;

    // The hardware has been built and is being shipped.
    SHIPPING = 3;

    // The hardware is being installed.
    INSTALLING = 4;

    // Some hardware in the HardwareGroup have been installed.
    PARTIALLY_INSTALLED = 5;

    // All hardware in the HardwareGroup have been installed.
    INSTALLED = 6;

    // An error occurred and customer intervention is required.
    FAILED = 7;
  }

  // Identifier. Name of this hardware group.
  // Format:
  // `projects/{project}/locations/{location}/orders/{order}/hardwareGroups/{hardware_group}`
  string name = 1 [(google.api.field_behavior) = IDENTIFIER];

  // Output only. Time when this hardware group was created.
  google.protobuf.Timestamp create_time = 2
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Time when this hardware group was last updated.
  google.protobuf.Timestamp update_time = 3
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Optional. Labels associated with this hardware group as key value pairs.
  // For more information about labels, see [Create and manage
  // labels](https://cloud.google.com/resource-manager/docs/creating-managing-labels).
  map<string, string> labels = 4 [(google.api.field_behavior) = OPTIONAL];

  // Required. Number of hardware in this HardwareGroup.
  int32 hardware_count = 5 [(google.api.field_behavior) = REQUIRED];

  // Required. Configuration for hardware in this HardwareGroup.
  HardwareConfig config = 6 [(google.api.field_behavior) = REQUIRED];

  // Required. Name of the site where the hardware in this HardwareGroup will be
  // delivered.
  // Format: `projects/{project}/locations/{location}/sites/{site}`
  string site = 7 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "gdchardwaremanagement.googleapis.com/Site"
    }
  ];

  // Output only. Current state of this HardwareGroup.
  State state = 8 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Optional. Name of the zone that the hardware in this HardwareGroup belongs
  // to. Format: `projects/{project}/locations/{location}/zones/{zone}`
  string zone = 9 [
    (google.api.field_behavior) = OPTIONAL,
    (google.api.resource_reference) = {
      type: "gdchardwaremanagement.googleapis.com/Zone"
    }
  ];

  // Optional. Requested installation date for the hardware in this
  // HardwareGroup. Filled in by the customer.
  google.type.Date requested_installation_date = 10
      [(google.api.field_behavior) = OPTIONAL];
}

// An instance of hardware installed at a site.
message Hardware {
  option (google.api.resource) = {
    type: "gdchardwaremanagement.googleapis.com/Hardware"
    pattern: "projects/{project}/locations/{location}/hardware/{hardware}"
    plural: "hardware"
    singular: "hardware"
  };

  // Valid states for hardware.
  enum State {
    // State of the Hardware is unspecified.
    STATE_UNSPECIFIED = 0;

    // More information is required from the customer to make progress.
    ADDITIONAL_INFO_NEEDED = 1;

    // Google has initiated building hardware for this Hardware.
    BUILDING = 2;

    // The hardware has been built and is being shipped.
    SHIPPING = 3;

    // The hardware is being installed.
    INSTALLING = 4;

    // The hardware has been installed.
    INSTALLED = 5;

    // An error occurred and customer intervention is required.
    FAILED = 6;
  }

  // Identifier. Name of this hardware.
  // Format: `projects/{project}/locations/{location}/hardware/{hardware}`
  string name = 1 [(google.api.field_behavior) = IDENTIFIER];

  // Optional. Display name for this hardware.
  string display_name = 2 [(google.api.field_behavior) = OPTIONAL];

  // Output only. Time when this hardware was created.
  google.protobuf.Timestamp create_time = 3
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Time when this hardware was last updated.
  google.protobuf.Timestamp update_time = 4
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Optional. Labels associated with this hardware as key value pairs.
  // For more information about labels, see [Create and manage
  // labels](https://cloud.google.com/resource-manager/docs/creating-managing-labels).
  map<string, string> labels = 5 [(google.api.field_behavior) = OPTIONAL];

  // Required. Name of the order that this hardware belongs to.
  // Format: `projects/{project}/locations/{location}/orders/{order}`
  string order = 6 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "gdchardwaremanagement.googleapis.com/Order"
    }
  ];

  // Output only. Name for the hardware group that this hardware belongs to.
  // Format:
  // `projects/{project}/locations/{location}/orders/{order}/hardwareGroups/{hardware_group}`
  string hardware_group = 7 [
    (google.api.field_behavior) = OUTPUT_ONLY,
    (google.api.resource_reference) = {
      type: "gdchardwaremanagement.googleapis.com/HardwareGroup"
    }
  ];

  // Required. Name for the site that this hardware belongs to.
  // Format: `projects/{project}/locations/{location}/sites/{site}`
  string site = 8 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "gdchardwaremanagement.googleapis.com/Site"
    }
  ];

  // Output only. Current state for this hardware.
  State state = 9 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Link to the Customer Intake Questionnaire (CIQ) sheet for this
  // Hardware.
  string ciq_uri = 10 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Required. Configuration for this hardware.
  HardwareConfig config = 11 [(google.api.field_behavior) = REQUIRED];

  // Output only. Estimated installation date for this hardware.
  google.type.Date estimated_installation_date = 12
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Optional. Physical properties of this hardware.
  HardwarePhysicalInfo physical_info = 13
      [(google.api.field_behavior) = OPTIONAL];

  // Optional. Information for installation of this hardware.
  HardwareInstallationInfo installation_info = 14
      [(google.api.field_behavior) = OPTIONAL];

  // Required. Name for the zone that this hardware belongs to.
  // Format: `projects/{project}/locations/{location}/zones/{zone}`
  string zone = 15 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "gdchardwaremanagement.googleapis.com/Zone"
    }
  ];

  // Optional. Requested installation date for this hardware. This is
  // auto-populated when the order is accepted, if the hardware's HardwareGroup
  // specifies this. It can also be filled in by the customer.
  google.type.Date requested_installation_date = 16
      [(google.api.field_behavior) = OPTIONAL];

  // Output only. Actual installation date for this hardware. Filled in by
  // Google.
  google.type.Date actual_installation_date = 17
      [(google.api.field_behavior) = OUTPUT_ONLY];
}

// A comment on an order.
message Comment {
  option (google.api.resource) = {
    type: "gdchardwaremanagement.googleapis.com/Comment"
    pattern: "projects/{project}/locations/{location}/orders/{order}/comments/{comment}"
    plural: "comments"
    singular: "comment"
  };

  // Identifier. Name of this comment.
  // Format:
  // `projects/{project}/locations/{location}/orders/{order}/comments/{comment}`
  string name = 1 [(google.api.field_behavior) = IDENTIFIER];

  // Output only. Time when this comment was created.
  google.protobuf.Timestamp create_time = 2
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Optional. Labels associated with this comment as key value pairs.
  // For more information about labels, see [Create and manage
  // labels](https://cloud.google.com/resource-manager/docs/creating-managing-labels).
  map<string, string> labels = 3 [(google.api.field_behavior) = OPTIONAL];

  // Output only. Username of the author of this comment. This is auto-populated
  // from the credentials used during creation of the comment.
  string author = 4 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Required. Text of this comment. The length of text must be <= 1000
  // characters.
  string text = 5 [(google.api.field_behavior) = REQUIRED];
}

// A log entry of a change made to an order.
message ChangeLogEntry {
  option (google.api.resource) = {
    type: "gdchardwaremanagement.googleapis.com/ChangeLogEntry"
    pattern: "projects/{project}/locations/{location}/orders/{order}/changeLogEntries/{change_log_entry}"
    plural: "changeLogEntries"
    singular: "changeLogEntry"
  };

  // Identifier. Name of this change log entry.
  // Format:
  // `projects/{project}/locations/{location}/orders/{order}/changeLogEntries/{change_log_entry}`
  string name = 1 [(google.api.field_behavior) = IDENTIFIER];

  // Output only. Time when this change log entry was created.
  google.protobuf.Timestamp create_time = 2
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Optional. Labels associated with this change log entry as key value pairs.
  // For more information about labels, see [Create and manage
  // labels](https://cloud.google.com/resource-manager/docs/creating-managing-labels).
  map<string, string> labels = 3 [(google.api.field_behavior) = OPTIONAL];

  // Output only. Content of this log entry.
  string log = 4 [(google.api.field_behavior) = OUTPUT_ONLY];
}

// A stock keeping unit (SKU) of GDC hardware.
message Sku {
  option (google.api.resource) = {
    type: "gdchardwaremanagement.googleapis.com/Sku"
    pattern: "projects/{project}/locations/{location}/skus/{sku}"
    plural: "skus"
    singular: "sku"
  };

  // Valid types of a SKU.
  enum Type {
    // Type of the SKU is unspecified. This is not an allowed value.
    TYPE_UNSPECIFIED = 0;

    // Rack SKU.
    RACK = 1;

    // Server SKU.
    SERVER = 2;
  }

  // Identifier. Name of this SKU.
  // Format: `projects/{project}/locations/{location}/skus/{sku}`
  string name = 1 [(google.api.field_behavior) = IDENTIFIER];

  // Output only. Display name of this SKU.
  string display_name = 2 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Time when this SKU was created.
  google.protobuf.Timestamp create_time = 3
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Time when this SKU was last updated.
  google.protobuf.Timestamp update_time = 4
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Configuration for this SKU.
  SkuConfig config = 6 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Available instances of this SKU. This field should be used for
  // checking availability of a SKU.
  repeated SkuInstance instances = 7
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Description of this SKU.
  string description = 8 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The SKU revision ID.
  // A new revision is created whenever `config` is updated. The format is an
  // 8-character hexadecimal string.
  string revision_id = 9 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Flag to indicate whether or not this revision is active. Only
  // an active revision can be used in a new Order.
  bool is_active = 10 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Type of this SKU.
  Type type = 11 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The vCPU count associated with this SKU.
  int32 vcpu_count = 12 [(google.api.field_behavior) = OUTPUT_ONLY];
}

// A zone holding a set of hardware.
message Zone {
  option (google.api.resource) = {
    type: "gdchardwaremanagement.googleapis.com/Zone"
    pattern: "projects/{project}/locations/{location}/zones/{zone}"
    plural: "zones"
    singular: "zone"
  };

  // Valid states for a zone.
  enum State {
    // State of the Zone is unspecified.
    STATE_UNSPECIFIED = 0;

    // More information is required from the customer to make progress.
    ADDITIONAL_INFO_NEEDED = 1;

    // Google is preparing the Zone.
    PREPARING = 2;

    // Factory turnup has succeeded.
    READY_FOR_CUSTOMER_FACTORY_TURNUP_CHECKS = 5;

    // The Zone is ready for site turnup.
    READY_FOR_SITE_TURNUP = 6;

    // The Zone failed in factory turnup checks.
    CUSTOMER_FACTORY_TURNUP_CHECKS_FAILED = 7;

    // The Zone is available to use.
    ACTIVE = 3;

    // The Zone has been cancelled.
    CANCELLED = 4;
  }

  // Identifier. Name of this zone.
  // Format: `projects/{project}/locations/{location}/zones/{zone}`
  string name = 1 [(google.api.field_behavior) = IDENTIFIER];

  // Output only. Time when this zone was created.
  google.protobuf.Timestamp create_time = 2
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Time when this zone was last updated.
  google.protobuf.Timestamp update_time = 3
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Optional. Labels associated with this zone as key value pairs.
  // For more information about labels, see [Create and manage
  // labels](https://cloud.google.com/resource-manager/docs/creating-managing-labels).
  map<string, string> labels = 4 [(google.api.field_behavior) = OPTIONAL];

  // Optional. Human friendly display name of this zone.
  string display_name = 5 [(google.api.field_behavior) = OPTIONAL];

  // Output only. Current state for this zone.
  State state = 8 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Required. The points of contact.
  repeated Contact contacts = 9 [(google.api.field_behavior) = REQUIRED];

  // Output only. Link to the Customer Intake Questionnaire (CIQ) sheet for this
  // zone.
  string ciq_uri = 10 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Optional. Networking configuration for this zone.
  ZoneNetworkConfig network_config = 11
      [(google.api.field_behavior) = OPTIONAL];

  // Output only. Globally unique identifier generated for this Edge Zone.
  string globally_unique_id = 12 [(google.api.field_behavior) = OUTPUT_ONLY];
}

// Contact information of the customer organization.
message OrganizationContact {
  // Required. The organization's address.
  google.type.PostalAddress address = 1
      [(google.api.field_behavior) = REQUIRED];

  // Optional. The organization's email.
  string email = 2 [(google.api.field_behavior) = OPTIONAL];

  // Optional. The organization's phone number.
  string phone = 3 [(google.api.field_behavior) = OPTIONAL];

  // Required. The individual points of contact in the organization at this
  // location.
  repeated Contact contacts = 4 [(google.api.field_behavior) = REQUIRED];
}

// Contact details of a point of contact.
message Contact {
  // Required. Given name of the contact.
  string given_name = 1 [(google.api.field_behavior) = REQUIRED];

  // Optional. Family name of the contact.
  string family_name = 2 [(google.api.field_behavior) = OPTIONAL];

  // Required. Email of the contact.
  string email = 3 [(google.api.field_behavior) = REQUIRED];

  // Required. Phone number of the contact.
  string phone = 4 [(google.api.field_behavior) = REQUIRED];

  // Optional. Time zone of the contact.
  google.type.TimeZone time_zone = 5 [(google.api.field_behavior) = OPTIONAL];

  // Optional. The time periods when the contact is reachable.
  // If this field is empty, the contact is reachable at all times.
  repeated TimePeriod reachable_times = 6
      [(google.api.field_behavior) = OPTIONAL];
}

// Configuration for GDC hardware.
message HardwareConfig {
  // Required. Reference to the SKU for this hardware. This can point to a
  // specific SKU revision in the form of `resource_name@revision_id` as defined
  // in [AIP-162](https://google.aip.dev/162). If no revision_id is specified,
  // it refers to the latest revision.
  string sku = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "gdchardwaremanagement.googleapis.com/Sku"
    }
  ];

  // Required. Power supply type for this hardware.
  PowerSupply power_supply = 2 [(google.api.field_behavior) = REQUIRED];

  // Optional. Subscription duration for the hardware in months.
  int32 subscription_duration_months = 3
      [(google.api.field_behavior) = OPTIONAL];
}

// Configuration for a SKU.
message SkuConfig {
  // Information about CPU configuration.
  string cpu = 1;

  // Information about GPU configuration.
  string gpu = 2;

  // Information about RAM configuration.
  string ram = 3;

  // Information about storage configuration.
  string storage = 4;
}

// A specific instance of the SKU.
message SkuInstance {
  // The [Unicode CLDR](https://cldr.unicode.org) region code where this
  // instance is available.
  string region_code = 1;

  // Power supply type for this instance.
  PowerSupply power_supply = 2;

  // Reference to the corresponding SKU in the Cloud Billing API.
  // The estimated price information can be retrieved using that API.
  // Format: `services/{service}/skus/{sku}`
  string billing_sku = 3;

  // Reference to the corresponding SKU per vCPU in the Cloud Billing API.
  // The estimated price information can be retrieved using that API.
  // Format: `services/{service}/skus/{sku}`
  string billing_sku_per_vcpu = 4;

  // Subscription duration for the hardware in months.
  int32 subscription_duration_months = 5;
}

// Physical properties of a hardware.
message HardwarePhysicalInfo {
  // Valid power receptacle types.
  enum PowerReceptacleType {
    // Facility plug type is unspecified.
    POWER_RECEPTACLE_TYPE_UNSPECIFIED = 0;

    // NEMA 5-15.
    NEMA_5_15 = 1;

    // C13.
    C_13 = 2;

    // Standard european receptacle.
    STANDARD_EU = 3;
  }

  // Valid network uplink types.
  enum NetworkUplinkType {
    // Network uplink type is unspecified.
    NETWORK_UPLINK_TYPE_UNSPECIFIED = 0;

    // RJ-45.
    RJ_45 = 1;
  }

  // Valid voltage values.
  enum Voltage {
    // Voltage is unspecified.
    VOLTAGE_UNSPECIFIED = 0;

    // 120V.
    VOLTAGE_110 = 1;

    // 220V.
    VOLTAGE_220 = 3;
  }

  // Valid amperes values.
  enum Amperes {
    // Amperes is unspecified.
    AMPERES_UNSPECIFIED = 0;

    // 15A.
    AMPERES_15 = 1;
  }

  // Required. The power receptacle type.
  PowerReceptacleType power_receptacle = 1
      [(google.api.field_behavior) = REQUIRED];

  // Required. Type of the uplink network connection.
  NetworkUplinkType network_uplink = 2 [(google.api.field_behavior) = REQUIRED];

  // Required. Voltage of the power supply.
  Voltage voltage = 3 [(google.api.field_behavior) = REQUIRED];

  // Required. Amperes of the power supply.
  Amperes amperes = 4 [(google.api.field_behavior) = REQUIRED];
}

// Information for installation of a Hardware.
message HardwareInstallationInfo {
  // Valid rack types.
  enum RackType {
    // Rack type is unspecified.
    RACK_TYPE_UNSPECIFIED = 0;

    // Two post rack.
    TWO_POST = 1;

    // Four post rack.
    FOUR_POST = 2;
  }

  // Optional. Location of the rack in the site e.g. Floor 2, Room 201, Row 7,
  // Rack 3.
  string rack_location = 1 [(google.api.field_behavior) = OPTIONAL];

  // Required. Distance from the power outlet in meters.
  int32 power_distance_meters = 2 [(google.api.field_behavior) = REQUIRED];

  // Required. Distance from the network switch in meters.
  int32 switch_distance_meters = 3 [(google.api.field_behavior) = REQUIRED];

  // Required. Dimensions of the rack unit.
  Dimensions rack_unit_dimensions = 4 [(google.api.field_behavior) = REQUIRED];

  // Required. Rack space allocated for the hardware.
  RackSpace rack_space = 5 [(google.api.field_behavior) = REQUIRED];

  // Required. Type of the rack.
  RackType rack_type = 6 [(google.api.field_behavior) = REQUIRED];
}

// Networking configuration for a zone.
message ZoneNetworkConfig {
  // Required. An IPv4 address block for machine management.
  // Should be a private RFC1918 or public CIDR block large enough to allocate
  // at least one address per machine in the Zone.
  // Should be in `management_ipv4_subnet`, and disjoint with other address
  // ranges.
  string machine_mgmt_ipv4_range = 1 [
    (google.api.field_info).format = IPV4,
    (google.api.field_behavior) = REQUIRED
  ];

  // Required. An IPv4 address block for kubernetes nodes.
  // Should be a private RFC1918 or public CIDR block large enough to allocate
  // at least one address per machine in the Zone.
  // Should be in `kubernetes_ipv4_subnet`, and disjoint with other address
  // ranges.
  string kubernetes_node_ipv4_range = 2 [
    (google.api.field_info).format = IPV4,
    (google.api.field_behavior) = REQUIRED
  ];

  // Required. An IPv4 address block for kubernetes control plane.
  // Should be a private RFC1918 or public CIDR block large enough to allocate
  // at least one address per cluster in the Zone.
  // Should be in `kubernetes_ipv4_subnet`, and disjoint with other address
  // ranges.
  string kubernetes_control_plane_ipv4_range = 3 [
    (google.api.field_info).format = IPV4,
    (google.api.field_behavior) = REQUIRED
  ];

  // Required. An IPv4 subnet for the management network.
  Subnet management_ipv4_subnet = 4 [(google.api.field_behavior) = REQUIRED];

  // Optional. An IPv4 subnet for the kubernetes network.
  // If unspecified, the kubernetes subnet will be the same as the management
  // subnet.
  Subnet kubernetes_ipv4_subnet = 5 [(google.api.field_behavior) = OPTIONAL];
}

// Represents a subnet.
message Subnet {
  // Required. Address range for this subnet in CIDR notation.
  string address_range = 1 [
    (google.api.field_info).format = IPV4,
    (google.api.field_behavior) = REQUIRED
  ];

  // Required. Default gateway for this subnet.
  string default_gateway_ip_address = 2 [
    (google.api.field_info).format = IPV4,
    (google.api.field_behavior) = REQUIRED
  ];
}

// Represents a time period in a week.
message TimePeriod {
  // Required. The start of the time period.
  google.type.TimeOfDay start_time = 1 [(google.api.field_behavior) = REQUIRED];

  // Required. The end of the time period.
  google.type.TimeOfDay end_time = 2 [(google.api.field_behavior) = REQUIRED];

  // Required. The days of the week that the time period is active.
  repeated google.type.DayOfWeek days = 3
      [(google.api.field_behavior) = REQUIRED];
}

// Represents the dimensions of an object.
message Dimensions {
  // Required. Width in inches.
  float width_inches = 1 [(google.api.field_behavior) = REQUIRED];

  // Required. Height in inches.
  float height_inches = 2 [(google.api.field_behavior) = REQUIRED];

  // Required. Depth in inches.
  float depth_inches = 3 [(google.api.field_behavior) = REQUIRED];
}

// Represents contiguous space in a rack.
message RackSpace {
  // Required. First rack unit of the rack space (inclusive).
  int32 start_rack_unit = 1 [(google.api.field_behavior) = REQUIRED];

  // Required. Last rack unit of the rack space (inclusive).
  int32 end_rack_unit = 2 [(google.api.field_behavior) = REQUIRED];
}

// Represents the location of one or many hardware.
message HardwareLocation {
  // Required. Name of the site where the hardware are present.
  // Format: `projects/{project}/locations/{location}/sites/{site}`
  string site = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "gdchardwaremanagement.googleapis.com/Site"
    }
  ];

  // Required. Location of the rack in the site e.g. Floor 2, Room 201, Row 7,
  // Rack 3.
  string rack_location = 2 [(google.api.field_behavior) = REQUIRED];

  // Optional. Spaces occupied by the hardware in the rack.
  // If unset, this location is assumed to be the entire rack.
  repeated RackSpace rack_space = 3 [(google.api.field_behavior) = OPTIONAL];
}
