// Copyright 2020 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.metastore.v1alpha;

import "google/api/annotations.proto";
import "google/api/client.proto";
import "google/api/field_behavior.proto";
import "google/api/resource.proto";
import "google/longrunning/operations.proto";
import "google/protobuf/field_mask.proto";
import "google/protobuf/timestamp.proto";

option go_package = "google.golang.org/genproto/googleapis/cloud/metastore/v1alpha;metastore";
option java_multiple_files = true;
option java_outer_classname = "MetastoreProto";
option java_package = "com.google.cloud.metastore.v1alpha";
option (google.api.resource_definition) = {
  type: "compute.googleapis.com/Network"
  pattern: "projects/{project}/global/networks/{network}"
};

// Configures and manages metastore services.
// Metastore services are fully managed, highly available, auto-scaled,
// auto-healing, OSS-native deployments of technical metadata management
// software. Each metastore service exposes a network endpoint through which
// metadata queries are served. Metadata queries can originate from a variety
// of sources, including Apache Hive, Apache Presto, and Apache Spark.
//
// The Dataproc Metastore API defines the following resource model:
//
// * The service works with a collection of Google Cloud projects, named:
// `/projects/*`
// * Each project has a collection of available locations, named: `/locations/*`
//   (a location must refer to a Google Cloud `region`)
// * Each location has a collection of services, named: `/services/*`
// * Dataproc Metastore services are resources with names of the form:
//
//   `/projects/{project_id}/locations/{location_id}/services/{service_id}`.
service DataprocMetastore {
  option (google.api.default_host) = "metastore.googleapis.com";
  option (google.api.oauth_scopes) = "https://www.googleapis.com/auth/cloud-platform";

  // Lists services in a project and location.
  rpc ListServices(ListServicesRequest) returns (ListServicesResponse) {
    option (google.api.http) = {
      get: "/v1alpha/{parent=projects/*/locations/*}/services"
    };
    option (google.api.method_signature) = "parent";
  }

  // Gets the details of a single service.
  rpc GetService(GetServiceRequest) returns (Service) {
    option (google.api.http) = {
      get: "/v1alpha/{name=projects/*/locations/*/services/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Creates a metastore service in a project and location.
  rpc CreateService(CreateServiceRequest) returns (google.longrunning.Operation) {
    option (google.api.http) = {
      post: "/v1alpha/{parent=projects/*/locations/*}/services"
      body: "service"
    };
    option (google.api.method_signature) = "parent,service,service_id";
    option (google.longrunning.operation_info) = {
      response_type: "Service"
      metadata_type: "OperationMetadata"
    };
  }

  // Updates the parameters of a single service.
  rpc UpdateService(UpdateServiceRequest) returns (google.longrunning.Operation) {
    option (google.api.http) = {
      patch: "/v1alpha/{service.name=projects/*/locations/*/services/*}"
      body: "service"
    };
    option (google.api.method_signature) = "service,update_mask";
    option (google.longrunning.operation_info) = {
      response_type: "Service"
      metadata_type: "OperationMetadata"
    };
  }

  // Deletes a single service.
  rpc DeleteService(DeleteServiceRequest) returns (google.longrunning.Operation) {
    option (google.api.http) = {
      delete: "/v1alpha/{name=projects/*/locations/*/services/*}"
    };
    option (google.api.method_signature) = "name";
    option (google.longrunning.operation_info) = {
      response_type: "google.protobuf.Empty"
      metadata_type: "OperationMetadata"
    };
  }

  // Lists imports in a service.
  rpc ListMetadataImports(ListMetadataImportsRequest) returns (ListMetadataImportsResponse) {
    option (google.api.http) = {
      get: "/v1alpha/{parent=projects/*/locations/*/services/*}/metadataImports"
    };
    option (google.api.method_signature) = "parent";
  }

  // Gets details of a single import.
  rpc GetMetadataImport(GetMetadataImportRequest) returns (MetadataImport) {
    option (google.api.http) = {
      get: "/v1alpha/{name=projects/*/locations/*/services/*/metadataImports/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Creates a new MetadataImport in a given project and location.
  rpc CreateMetadataImport(CreateMetadataImportRequest) returns (google.longrunning.Operation) {
    option (google.api.http) = {
      post: "/v1alpha/{parent=projects/*/locations/*/services/*}/metadataImports"
      body: "metadata_import"
    };
    option (google.api.method_signature) = "parent,metadata_import,metadata_import_id";
    option (google.longrunning.operation_info) = {
      response_type: "MetadataImport"
      metadata_type: "OperationMetadata"
    };
  }

  // Updates a single import.
  // Only the description field of MetadataImport is supported to be updated.
  rpc UpdateMetadataImport(UpdateMetadataImportRequest) returns (google.longrunning.Operation) {
    option (google.api.http) = {
      patch: "/v1alpha/{metadata_import.name=projects/*/locations/*/services/*/metadataImports/*}"
      body: "metadata_import"
    };
    option (google.api.method_signature) = "metadata_import,update_mask";
    option (google.longrunning.operation_info) = {
      response_type: "MetadataImport"
      metadata_type: "OperationMetadata"
    };
  }
}

// A managed metastore service that serves metadata queries.
message Service {
  option (google.api.resource) = {
    type: "metastore.googleapis.com/Service"
    pattern: "projects/{project}/locations/{location}/services/{service}"
  };

  // The current state of the metastore service.
  enum State {
    // The state of the metastore service is unknown.
    STATE_UNSPECIFIED = 0;

    // The metastore service is in the process of being created.
    CREATING = 1;

    // The metastore service is running and ready to serve queries.
    ACTIVE = 2;

    // The metastore service is entering suspension. Its query-serving
    // availability may cease unexpectedly.
    SUSPENDING = 3;

    // The metastore service is suspended and unable to serve queries.
    SUSPENDED = 4;

    // The metastore service is being updated. It remains usable but cannot
    // accept additional update requests or be deleted at this time.
    UPDATING = 5;

    // The metastore service is undergoing deletion. It cannot be used.
    DELETING = 6;

    // The metastore service has encountered an error and cannot be used. The
    // metastore service should be deleted.
    ERROR = 7;
  }

  // Available service tiers.
  enum Tier {
    // The tier is not set.
    TIER_UNSPECIFIED = 0;

    // The enterprise tier combines a powerful metastore serving layer with a
    // highly scalable data storage layer.
    ENTERPRISE = 3;
  }

  // Immutable. The relative resource name of the metastore service, of the form:
  //
  // "projects/{project_id}/locations/{location_id}/services/{service_id}".
  string name = 1 [(google.api.field_behavior) = IMMUTABLE];

  // Output only. The time when the metastore service was created.
  google.protobuf.Timestamp create_time = 2 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The time when the metastore service was last updated.
  google.protobuf.Timestamp update_time = 3 [(google.api.field_behavior) = OUTPUT_ONLY];

  // User-defined labels for the metastore service.
  map<string, string> labels = 4;

  // Configuration properties specific to the underlying metastore service
  // technology (the software that serves metastore queries).
  oneof metastore_config {
    // Configuration information specific to running Hive metastore
    // software as the metastore service.
    HiveMetastoreConfig hive_metastore_config = 5;
  }

  // Immutable. The relative resource name of the VPC network on which the instance can be
  // accessed. The network must belong to the same project as the metastore
  // instance. It is specified in the following form:
  //
  // "projects/{project_id}/global/networks/{network_id}".
  string network = 7 [
    (google.api.field_behavior) = IMMUTABLE,
    (google.api.resource_reference) = {
      type: "compute.googleapis.com/Network"
    }
  ];

  // Output only. The URI of the endpoint used to access the metastore service.
  string endpoint_uri = 8 [(google.api.field_behavior) = OUTPUT_ONLY];

  // The TCP port at which the metastore service is reached. Default: 9083.
  int32 port = 9;

  // Output only. The current state of the metastore service.
  State state = 10 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Additional information about the current state of the metastore service, if
  // available.
  string state_message = 11 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. A Cloud Storage URI (starting with `gs://`) that specifies where artifacts
  // related to the metastore service are stored.
  string artifact_gcs_uri = 12 [(google.api.field_behavior) = OUTPUT_ONLY];

  // The tier of the service.
  Tier tier = 13;
}

// Specifies configuration information specific to running Hive metastore
// software as the metastore service.
message HiveMetastoreConfig {
  // Immutable. The Hive metastore schema version.
  string version = 1 [(google.api.field_behavior) = IMMUTABLE];

  // A mapping of Hive metastore configuration key-value pairs to apply to the
  // Hive metastore (configured in `hive-site.xml`). The mappings
  // override system defaults (some keys cannot be overridden).
  map<string, string> config_overrides = 2;

  // Information used to configure the Hive metastore service as a service
  // principal in a Kerberos realm.
  KerberosConfig kerberos_config = 3;
}

// Configuration information for a Kerberos principal.
message KerberosConfig {
  // A Kerberos keytab file that can be used to authenticate a service principal
  // with a Kerberos Key Distribution Center (KDC).
  Secret keytab = 1;

  // A Kerberos principal that exists in the both the keytab the KDC
  // to authenticate as. A typical principal is of the form
  // "primary/instance@REALM", but there is no exact format.
  string principal = 2;

  // A Cloud Storage URI that specifies the path to a
  // krb5.conf file. It is of the form gs://{bucket_name}/path/to/krb5.conf,
  // although the file does not need to be named krb5.conf explicitly.
  string krb5_config_gcs_uri = 3;
}

// A securely stored value.
message Secret {
  oneof value {
    // The relative resource name of a Secret Manager secret version, in the
    // following form:
    //
    // "projects/{project_id}/secrets/{secret_id}/versions/{version_id}".
    string cloud_secret = 2;
  }
}

// A metastore resource that imports metadata.
message MetadataImport {
  option (google.api.resource) = {
    type: "metastore.googleapis.com/MetadataImport"
    pattern: "projects/{project}/locations/{location}/services/{service}/metadataImports/{metadata_import}"
  };

  // A specification of the location of and metadata about a database dump from
  // a relational database management system.
  message DatabaseDump {
    // The type of the database.
    enum DatabaseType {
      // The type of the source database is unknown.
      DATABASE_TYPE_UNSPECIFIED = 0;

      // The type of the source database is MySQL.
      MYSQL = 1;
    }

    // The type of the database.
    DatabaseType database_type = 1;

    // A Cloud Storage object URI that specifies the source from which to
    // import metadata. It must begin with `gs://`.
    string gcs_uri = 2;

    // The name of the source database.
    string source_database = 3;
  }

  // The current state of the metadata import.
  enum State {
    // The state of the metadata import is unknown.
    STATE_UNSPECIFIED = 0;

    // The metadata import is running.
    RUNNING = 1;

    // The metadata import completed successfully.
    SUCCEEDED = 2;

    // The metadata import is being updated.
    UPDATING = 3;

    // The metadata import failed, and attempted metadata changes were rolled
    // back.
    FAILED = 4;
  }

  // Immutable. The relative resource name of the metadata import, of the form:
  //
  // "projects/{project_id}/locations/{location_id}/services/{service_id}/metadataImports/{metadata_import_id}".
  string name = 1 [(google.api.field_behavior) = IMMUTABLE];

  // The description of the metadata import.
  string description = 2;

  // Output only. The time when the metadata import was created.
  google.protobuf.Timestamp create_time = 3 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The time when the metadata import was last updated.
  google.protobuf.Timestamp update_time = 4 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The current state of the metadata import.
  State state = 5 [(google.api.field_behavior) = OUTPUT_ONLY];

  // The metadata to be imported.
  oneof metadata {
    // Immutable. A database dump from a pre-existing metastore's database.
    DatabaseDump database_dump = 6 [(google.api.field_behavior) = IMMUTABLE];
  }
}

// Request message for [DataprocMetastore.ListServices][google.cloud.metastore.v1alpha.DataprocMetastore.ListServices].
message ListServicesRequest {
  // Required. The relative resource name of the location of metastore services to
  // list, in the following form:
  //
  // "projects/{project_id}/locations/{location_id}".
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "locations.googleapis.com/Location"
    }
  ];

  // Optional. The maximum number of services to return. The response may contain less
  // than the maximum number. If unspecified, no more than 500 services are
  // returned. The maximum value is 1000; values above 1000 are changed to 1000.
  int32 page_size = 2 [(google.api.field_behavior) = OPTIONAL];

  // Optional. A page token, received from a previous [DataprocMetastore.ListServices][google.cloud.metastore.v1alpha.DataprocMetastore.ListServices]
  // call. Provide this token to retrieve the subsequent page.
  //
  // To retrieve the first page, supply an empty page token.
  //
  // When paginating, other parameters provided to
  // [DataprocMetastore.ListServices][google.cloud.metastore.v1alpha.DataprocMetastore.ListServices] must match the call that provided the
  // page token.
  string page_token = 3 [(google.api.field_behavior) = OPTIONAL];

  // Optional. The filter to apply to list results.
  string filter = 4 [(google.api.field_behavior) = OPTIONAL];

  // Optional. Specify the ordering of results as described in
  // [Sorting Order](/apis/design/design_patterns#sorting_order). If not
  // specified, the results will be sorted in the default order.
  string order_by = 5 [(google.api.field_behavior) = OPTIONAL];
}

// Response message for [DataprocMetastore.ListServices][google.cloud.metastore.v1alpha.DataprocMetastore.ListServices].
message ListServicesResponse {
  // The services in the specified location.
  repeated Service services = 1;

  // A token that can be sent as `page_token` to retrieve the next page. If this
  // field is omitted, there are no subsequent pages.
  string next_page_token = 2;

  // Locations that could not be reached.
  repeated string unreachable = 3;
}

// Request message for [DataprocMetastore.GetService][google.cloud.metastore.v1alpha.DataprocMetastore.GetService].
message GetServiceRequest {
  // Required. The relative resource name of the metastore service to retrieve, in the
  // following form:
  //
  // "projects/{project_id}/locations/{location_id}/services/{service_id}".
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "metastore.googleapis.com/Service"
    }
  ];
}

// Request message for [DataprocMetastore.CreateService][google.cloud.metastore.v1alpha.DataprocMetastore.CreateService].
message CreateServiceRequest {
  // Required. The relative resource name of the location in which to create a metastore
  // service, in the following form:
  //
  // "projects/{project_id}/locations/{location_id}".
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "locations.googleapis.com/Location"
    }
  ];

  // Required. The ID of the metastore service, which is used as the final
  // component of the metastore service's name.
  //
  // This value must be between 1 and 64 characters long, begin with a
  // letter, end with a letter or number, and consist of alpha-numeric
  // ASCII characters or hyphens.
  string service_id = 2 [(google.api.field_behavior) = REQUIRED];

  // Required. The Metastore service to create. The `name` field is
  // ignored. The ID of the created metastore service must be provided in
  // the request's `service_id` field.
  Service service = 3 [(google.api.field_behavior) = REQUIRED];

  // Optional. A request ID. Specify a unique request ID to allow the server to ignore the
  // request if it has completed. The server will ignore subsequent requests
  // that provide a duplicate request ID for at least 60 minutes after the first
  // request.
  //
  // For example, if an initial request times out, followed by another request
  // with the same request ID, the server ignores the second request to prevent
  // the creation of duplicate commitments.
  //
  // The request ID must be a valid
  // [UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier#Format)
  // A zero UUID (00000000-0000-0000-0000-000000000000) is not supported.
  string request_id = 4 [(google.api.field_behavior) = OPTIONAL];
}

// Request message for [DataprocMetastore.UpdateService][google.cloud.metastore.v1alpha.DataprocMetastore.UpdateService].
message UpdateServiceRequest {
  // Required. A field mask used to specify the fields to be overwritten in the
  // metastore service resource by the update.
  // Fields specified in the `update_mask` are relative to the resource (not
  // to the full request). A field is overwritten if it is in the mask.
  google.protobuf.FieldMask update_mask = 1 [(google.api.field_behavior) = REQUIRED];

  // Required. The metastore service to update. The server only merges fields
  // in the service if they are specified in `update_mask`.
  //
  // The metastore service's `name` field is used to identify the metastore
  // service to be updated.
  Service service = 2 [(google.api.field_behavior) = REQUIRED];

  // Optional. A request ID. Specify a unique request ID to allow the server to ignore the
  // request if it has completed. The server will ignore subsequent requests
  // that provide a duplicate request ID for at least 60 minutes after the first
  // request.
  //
  // For example, if an initial request times out, followed by another request
  // with the same request ID, the server ignores the second request to prevent
  // the creation of duplicate commitments.
  //
  // The request ID must be a valid
  // [UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier#Format)
  // A zero UUID (00000000-0000-0000-0000-000000000000) is not supported.
  string request_id = 3 [(google.api.field_behavior) = OPTIONAL];
}

// Request message for [DataprocMetastore.DeleteService][google.cloud.metastore.v1alpha.DataprocMetastore.DeleteService].
message DeleteServiceRequest {
  // Required. The relative resource name of the metastore service to delete, in the
  // following form:
  //
  // "projects/{project_id}/locations/{location_id}/services/{service_id}".
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "metastore.googleapis.com/Service"
    }
  ];

  // Optional. A request ID. Specify a unique request ID to allow the server to ignore the
  // request if it has completed. The server will ignore subsequent requests
  // that provide a duplicate request ID for at least 60 minutes after the first
  // request.
  //
  // For example, if an initial request times out, followed by another request
  // with the same request ID, the server ignores the second request to prevent
  // the creation of duplicate commitments.
  //
  // The request ID must be a valid
  // [UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier#Format)
  // A zero UUID (00000000-0000-0000-0000-000000000000) is not supported.
  string request_id = 2 [(google.api.field_behavior) = OPTIONAL];
}

// Request message for [DataprocMetastore.ListMetadataImports][google.cloud.metastore.v1alpha.DataprocMetastore.ListMetadataImports].
message ListMetadataImportsRequest {
  // Required. The relative resource name of the service whose metadata imports to
  // list, in the following form:
  //
  // "projects/{project_id}/locations/{location_id}/services/{service_id}/metadataImports".
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "metastore.googleapis.com/Service"
    }
  ];

  // Optional. The maximum number of imports to return. The response may contain less
  // than the maximum number. If unspecified, no more than 500 imports are
  // returned. The maximum value is 1000; values above 1000 are changed to 1000.
  int32 page_size = 2 [(google.api.field_behavior) = OPTIONAL];

  // Optional. A page token, received from a previous [DataprocMetastore.ListServices][google.cloud.metastore.v1alpha.DataprocMetastore.ListServices]
  // call. Provide this token to retrieve the subsequent page.
  //
  // To retrieve the first page, supply an empty page token.
  //
  // When paginating, other parameters provided to
  // [DataprocMetastore.ListServices][google.cloud.metastore.v1alpha.DataprocMetastore.ListServices] must match the call that provided the
  // page token.
  string page_token = 3 [(google.api.field_behavior) = OPTIONAL];

  // Optional. The filter to apply to list results.
  string filter = 4 [(google.api.field_behavior) = OPTIONAL];

  // Optional. Specify the ordering of results as described in
  // [Sorting Order](/apis/design/design_patterns#sorting_order). If not
  // specified, the results will be sorted in the default order.
  string order_by = 5 [(google.api.field_behavior) = OPTIONAL];
}

// Response message for [DataprocMetastore.ListMetadataImports][google.cloud.metastore.v1alpha.DataprocMetastore.ListMetadataImports].
message ListMetadataImportsResponse {
  // The imports in the specified service.
  repeated MetadataImport metadata_imports = 1;

  // A token that can be sent as `page_token` to retrieve the next page. If this
  // field is omitted, there are no subsequent pages.
  string next_page_token = 2;

  // Locations that could not be reached.
  repeated string unreachable = 3;
}

// Request message for [DataprocMetastore.GetMetadataImport][google.cloud.metastore.v1alpha.DataprocMetastore.GetMetadataImport].
message GetMetadataImportRequest {
  // Required. The relative resource name of the metadata import to retrieve, in the
  // following form:
  //
  // "projects/{project_id}/locations/{location_id}/services/{service_id}/metadataImports/{import_id}".
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "metastore.googleapis.com/MetadataImport"
    }
  ];
}

// Request message for [DataprocMetastore.CreateMetadataImport][google.cloud.metastore.v1alpha.DataprocMetastore.CreateMetadataImport].
message CreateMetadataImportRequest {
  // Required. The relative resource name of the service in which to create a metastore
  // import, in the following form:
  //
  // "projects/{project_id}/locations/{location_id}/services/{service_id}"
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "metastore.googleapis.com/Service"
    }
  ];

  // Required. The ID of the metadata import, which is used as the final component of the
  // metadata import's name.
  //
  // This value must be between 1 and 64 characters long, begin with a letter,
  // end with a letter or number, and consist of alpha-numeric ASCII characters
  // or hyphens.
  string metadata_import_id = 2 [(google.api.field_behavior) = REQUIRED];

  // Required. The metadata import to create. The `name` field is ignored. The ID of the
  // created metadata import must be provided in the request's
  // `metadata_import_id` field.
  MetadataImport metadata_import = 3 [(google.api.field_behavior) = REQUIRED];

  // Optional. A request ID. Specify a unique request ID to allow the server to ignore the
  // request if it has completed. The server will ignore subsequent requests
  // that provide a duplicate request ID for at least 60 minutes after the first
  // request.
  //
  // For example, if an initial request times out, followed by another request
  // with the same request ID, the server ignores the second request to prevent
  // the creation of duplicate commitments.
  //
  // The request ID must be a valid
  // [UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier#Format)
  // A zero UUID (00000000-0000-0000-0000-000000000000) is not supported.
  string request_id = 4 [(google.api.field_behavior) = OPTIONAL];
}

// Request message for [DataprocMetastore.UpdateMetadataImport][google.cloud.metastore.v1alpha.DataprocMetastore.UpdateMetadataImport].
message UpdateMetadataImportRequest {
  // Required. A field mask used to specify the fields to be overwritten in the
  // metadata import resource by the update.
  // Fields specified in the `update_mask` are relative to the resource (not
  // to the full request). A field is overwritten if it is in the mask.
  google.protobuf.FieldMask update_mask = 1 [(google.api.field_behavior) = REQUIRED];

  // Required. The metadata import to update. The server only merges fields
  // in the import if they are specified in `update_mask`.
  //
  // The metadata import's `name` field is used to identify the metastore
  // import to be updated.
  MetadataImport metadata_import = 2 [(google.api.field_behavior) = REQUIRED];

  // Optional. A request ID. Specify a unique request ID to allow the server to ignore the
  // request if it has completed. The server will ignore subsequent requests
  // that provide a duplicate request ID for at least 60 minutes after the first
  // request.
  //
  // For example, if an initial request times out, followed by another request
  // with the same request ID, the server ignores the second request to prevent
  // the creation of duplicate commitments.
  //
  // The request ID must be a valid
  // [UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier#Format)
  // A zero UUID (00000000-0000-0000-0000-000000000000) is not supported.
  string request_id = 3 [(google.api.field_behavior) = OPTIONAL];
}

// Represents the metadata of a long-running operation.
message OperationMetadata {
  // Output only. The time the operation was created.
  google.protobuf.Timestamp create_time = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The time the operation finished running.
  google.protobuf.Timestamp end_time = 2 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Server-defined resource path for the target of the operation.
  string target = 3 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Name of the verb executed by the operation.
  string verb = 4 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Human-readable status of the operation, if any.
  string status_message = 5 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Identifies whether the caller has requested cancellation
  // of the operation. Operations that have successfully been cancelled
  // have [Operation.error][] value with a [google.rpc.Status.code][google.rpc.Status.code] of 1,
  // corresponding to `Code.CANCELLED`.
  bool requested_cancellation = 6 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. API version used to start the operation.
  string api_version = 7 [(google.api.field_behavior) = OUTPUT_ONLY];
}

// Metadata about the service in a location.
message LocationMetadata {
  // A specification of a supported version of the Hive Metastore software.
  message HiveMetastoreVersion {
    // The semantic version of the Hive Metastore software.
    string version = 1;

    // Whether `version` will be chosen by the server if a metastore service is
    // created with a `HiveMetastoreConfig` that omits the `version`.
    bool is_default = 2;
  }

  // The versions of Hive Metastore that can be used when creating a new
  // metastore service in this location. The server guarantees that exactly one
  // `HiveMetastoreVersion` in the list will set `is_default`.
  repeated HiveMetastoreVersion supported_hive_metastore_versions = 1;
}
