// Copyright 2023 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.deploy.v1;

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/duration.proto";
import "google/protobuf/empty.proto";
import "google/protobuf/field_mask.proto";
import "google/protobuf/timestamp.proto";
import "google/type/date.proto";

option go_package = "cloud.google.com/go/deploy/apiv1/deploypb;deploypb";
option java_multiple_files = true;
option java_outer_classname = "CloudDeployProto";
option java_package = "com.google.cloud.deploy.v1";
option (google.api.resource_definition) = {
  type: "cloudbuild.googleapis.com/Build"
  pattern: "projects/{project}/locations/{location}/builds/{build}"
};
option (google.api.resource_definition) = {
  type: "container.googleapis.com/Cluster"
  pattern: "projects/{project}/locations/{location}/clusters/{cluster}"
};
option (google.api.resource_definition) = {
  type: "clouddeploy.googleapis.com/Operation"
  pattern: "projects/{project}/locations/{location}/operations/{operation}"
};
option (google.api.resource_definition) = {
  type: "cloudbuild.googleapis.com/WorkerPool"
  pattern: "projects/{project}/locations/{location}/workerPools/{worker_pool}"
};
option (google.api.resource_definition) = {
  type: "gkehub.googleapis.com/Membership"
  pattern: "projects/{project}/locations/{location}/memberships/{membership}"
};
option (google.api.resource_definition) = {
  type: "run.googleapis.com/Service"
  pattern: "projects/{project}/locations/{location}/services/{service}"
};
option (google.api.resource_definition) = {
  type: "run.googleapis.com/Job"
  pattern: "projects/{project}/locations/{location}/jobs/{job}"
};

// CloudDeploy service creates and manages Continuous Delivery operations
// on Google Cloud Platform via Skaffold (https://skaffold.dev).
service CloudDeploy {
  option (google.api.default_host) = "clouddeploy.googleapis.com";
  option (google.api.oauth_scopes) =
      "https://www.googleapis.com/auth/cloud-platform";

  // Lists DeliveryPipelines in a given project and location.
  rpc ListDeliveryPipelines(ListDeliveryPipelinesRequest)
      returns (ListDeliveryPipelinesResponse) {
    option (google.api.http) = {
      get: "/v1/{parent=projects/*/locations/*}/deliveryPipelines"
    };
    option (google.api.method_signature) = "parent";
  }

  // Gets details of a single DeliveryPipeline.
  rpc GetDeliveryPipeline(GetDeliveryPipelineRequest)
      returns (DeliveryPipeline) {
    option (google.api.http) = {
      get: "/v1/{name=projects/*/locations/*/deliveryPipelines/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Creates a new DeliveryPipeline in a given project and location.
  rpc CreateDeliveryPipeline(CreateDeliveryPipelineRequest)
      returns (google.longrunning.Operation) {
    option (google.api.http) = {
      post: "/v1/{parent=projects/*/locations/*}/deliveryPipelines"
      body: "delivery_pipeline"
    };
    option (google.api.method_signature) =
        "parent,delivery_pipeline,delivery_pipeline_id";
    option (google.longrunning.operation_info) = {
      response_type: "DeliveryPipeline"
      metadata_type: "OperationMetadata"
    };
  }

  // Updates the parameters of a single DeliveryPipeline.
  rpc UpdateDeliveryPipeline(UpdateDeliveryPipelineRequest)
      returns (google.longrunning.Operation) {
    option (google.api.http) = {
      patch: "/v1/{delivery_pipeline.name=projects/*/locations/*/deliveryPipelines/*}"
      body: "delivery_pipeline"
    };
    option (google.api.method_signature) = "delivery_pipeline,update_mask";
    option (google.longrunning.operation_info) = {
      response_type: "DeliveryPipeline"
      metadata_type: "OperationMetadata"
    };
  }

  // Deletes a single DeliveryPipeline.
  rpc DeleteDeliveryPipeline(DeleteDeliveryPipelineRequest)
      returns (google.longrunning.Operation) {
    option (google.api.http) = {
      delete: "/v1/{name=projects/*/locations/*/deliveryPipelines/*}"
    };
    option (google.api.method_signature) = "name";
    option (google.longrunning.operation_info) = {
      response_type: "google.protobuf.Empty"
      metadata_type: "OperationMetadata"
    };
  }

  // Lists Targets in a given project and location.
  rpc ListTargets(ListTargetsRequest) returns (ListTargetsResponse) {
    option (google.api.http) = {
      get: "/v1/{parent=projects/*/locations/*}/targets"
    };
    option (google.api.method_signature) = "parent";
  }

  // Creates a `Rollout` to roll back the specified target.
  rpc RollbackTarget(RollbackTargetRequest) returns (RollbackTargetResponse) {
    option (google.api.http) = {
      post: "/v1/{name=projects/*/locations/*/deliveryPipelines/*}:rollbackTarget"
      body: "*"
    };
    option (google.api.method_signature) = "name,target_id,rollout_id";
  }

  // Gets details of a single Target.
  rpc GetTarget(GetTargetRequest) returns (Target) {
    option (google.api.http) = {
      get: "/v1/{name=projects/*/locations/*/targets/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Creates a new Target in a given project and location.
  rpc CreateTarget(CreateTargetRequest) returns (google.longrunning.Operation) {
    option (google.api.http) = {
      post: "/v1/{parent=projects/*/locations/*}/targets"
      body: "target"
    };
    option (google.api.method_signature) = "parent,target,target_id";
    option (google.longrunning.operation_info) = {
      response_type: "Target"
      metadata_type: "OperationMetadata"
    };
  }

  // Updates the parameters of a single Target.
  rpc UpdateTarget(UpdateTargetRequest) returns (google.longrunning.Operation) {
    option (google.api.http) = {
      patch: "/v1/{target.name=projects/*/locations/*/targets/*}"
      body: "target"
    };
    option (google.api.method_signature) = "target,update_mask";
    option (google.longrunning.operation_info) = {
      response_type: "Target"
      metadata_type: "OperationMetadata"
    };
  }

  // Deletes a single Target.
  rpc DeleteTarget(DeleteTargetRequest) returns (google.longrunning.Operation) {
    option (google.api.http) = {
      delete: "/v1/{name=projects/*/locations/*/targets/*}"
    };
    option (google.api.method_signature) = "name";
    option (google.longrunning.operation_info) = {
      response_type: "google.protobuf.Empty"
      metadata_type: "OperationMetadata"
    };
  }

  // Lists Releases in a given project and location.
  rpc ListReleases(ListReleasesRequest) returns (ListReleasesResponse) {
    option (google.api.http) = {
      get: "/v1/{parent=projects/*/locations/*/deliveryPipelines/*}/releases"
    };
    option (google.api.method_signature) = "parent";
  }

  // Gets details of a single Release.
  rpc GetRelease(GetReleaseRequest) returns (Release) {
    option (google.api.http) = {
      get: "/v1/{name=projects/*/locations/*/deliveryPipelines/*/releases/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Creates a new Release in a given project and location.
  rpc CreateRelease(CreateReleaseRequest)
      returns (google.longrunning.Operation) {
    option (google.api.http) = {
      post: "/v1/{parent=projects/*/locations/*/deliveryPipelines/*}/releases"
      body: "release"
    };
    option (google.api.method_signature) = "parent,release,release_id";
    option (google.longrunning.operation_info) = {
      response_type: "Release"
      metadata_type: "OperationMetadata"
    };
  }

  // Abandons a Release in the Delivery Pipeline.
  rpc AbandonRelease(AbandonReleaseRequest) returns (AbandonReleaseResponse) {
    option (google.api.http) = {
      post: "/v1/{name=projects/*/locations/*/deliveryPipelines/*/releases/*}:abandon"
      body: "*"
    };
    option (google.api.method_signature) = "name";
  }

  // Approves a Rollout.
  rpc ApproveRollout(ApproveRolloutRequest) returns (ApproveRolloutResponse) {
    option (google.api.http) = {
      post: "/v1/{name=projects/*/locations/*/deliveryPipelines/*/releases/*/rollouts/*}:approve"
      body: "*"
    };
    option (google.api.method_signature) = "name";
  }

  // Advances a Rollout in a given project and location.
  rpc AdvanceRollout(AdvanceRolloutRequest) returns (AdvanceRolloutResponse) {
    option (google.api.http) = {
      post: "/v1/{name=projects/*/locations/*/deliveryPipelines/*/releases/*/rollouts/*}:advance"
      body: "*"
    };
    option (google.api.method_signature) = "name,phase_id";
  }

  // Cancels a Rollout in a given project and location.
  rpc CancelRollout(CancelRolloutRequest) returns (CancelRolloutResponse) {
    option (google.api.http) = {
      post: "/v1/{name=projects/*/locations/*/deliveryPipelines/*/releases/*/rollouts/*}:cancel"
      body: "*"
    };
    option (google.api.method_signature) = "name";
  }

  // Lists Rollouts in a given project and location.
  rpc ListRollouts(ListRolloutsRequest) returns (ListRolloutsResponse) {
    option (google.api.http) = {
      get: "/v1/{parent=projects/*/locations/*/deliveryPipelines/*/releases/*}/rollouts"
    };
    option (google.api.method_signature) = "parent";
  }

  // Gets details of a single Rollout.
  rpc GetRollout(GetRolloutRequest) returns (Rollout) {
    option (google.api.http) = {
      get: "/v1/{name=projects/*/locations/*/deliveryPipelines/*/releases/*/rollouts/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Creates a new Rollout in a given project and location.
  rpc CreateRollout(CreateRolloutRequest)
      returns (google.longrunning.Operation) {
    option (google.api.http) = {
      post: "/v1/{parent=projects/*/locations/*/deliveryPipelines/*/releases/*}/rollouts"
      body: "rollout"
    };
    option (google.api.method_signature) = "parent,rollout,rollout_id";
    option (google.longrunning.operation_info) = {
      response_type: "Rollout"
      metadata_type: "OperationMetadata"
    };
  }

  // Ignores the specified Job in a Rollout.
  rpc IgnoreJob(IgnoreJobRequest) returns (IgnoreJobResponse) {
    option (google.api.http) = {
      post: "/v1/{rollout=projects/*/locations/*/deliveryPipelines/*/releases/*/rollouts/*}:ignoreJob"
      body: "*"
    };
    option (google.api.method_signature) = "rollout,phase_id,job_id";
  }

  // Retries the specified Job in a Rollout.
  rpc RetryJob(RetryJobRequest) returns (RetryJobResponse) {
    option (google.api.http) = {
      post: "/v1/{rollout=projects/*/locations/*/deliveryPipelines/*/releases/*/rollouts/*}:retryJob"
      body: "*"
    };
    option (google.api.method_signature) = "rollout,phase_id,job_id";
  }

  // Lists JobRuns in a given project and location.
  rpc ListJobRuns(ListJobRunsRequest) returns (ListJobRunsResponse) {
    option (google.api.http) = {
      get: "/v1/{parent=projects/*/locations/*/deliveryPipelines/*/releases/*/rollouts/*}/jobRuns"
    };
    option (google.api.method_signature) = "parent";
  }

  // Gets details of a single JobRun.
  rpc GetJobRun(GetJobRunRequest) returns (JobRun) {
    option (google.api.http) = {
      get: "/v1/{name=projects/*/locations/*/deliveryPipelines/*/releases/*/rollouts/*/jobRuns/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Terminates a Job Run in a given project and location.
  rpc TerminateJobRun(TerminateJobRunRequest)
      returns (TerminateJobRunResponse) {
    option (google.api.http) = {
      post: "/v1/{name=projects/*/locations/*/deliveryPipelines/*/releases/*/rollouts/*/jobRuns/*}:terminate"
      body: "*"
    };
    option (google.api.method_signature) = "name";
  }

  // Gets the configuration for a location.
  rpc GetConfig(GetConfigRequest) returns (Config) {
    option (google.api.http) = {
      get: "/v1/{name=projects/*/locations/*/config}"
    };
    option (google.api.method_signature) = "name";
  }

  // Creates a new Automation in a given project and location.
  rpc CreateAutomation(CreateAutomationRequest)
      returns (google.longrunning.Operation) {
    option (google.api.http) = {
      post: "/v1/{parent=projects/*/locations/*/deliveryPipelines/*}/automations"
      body: "automation"
    };
    option (google.api.method_signature) = "parent,automation,automation_id";
    option (google.longrunning.operation_info) = {
      response_type: "Automation"
      metadata_type: "OperationMetadata"
    };
  }

  // Updates the parameters of a single Automation resource.
  rpc UpdateAutomation(UpdateAutomationRequest)
      returns (google.longrunning.Operation) {
    option (google.api.http) = {
      patch: "/v1/{automation.name=projects/*/locations/*/deliveryPipelines/*/automations/*}"
      body: "automation"
    };
    option (google.api.method_signature) = "automation,update_mask";
    option (google.longrunning.operation_info) = {
      response_type: "Automation"
      metadata_type: "OperationMetadata"
    };
  }

  // Deletes a single Automation resource.
  rpc DeleteAutomation(DeleteAutomationRequest)
      returns (google.longrunning.Operation) {
    option (google.api.http) = {
      delete: "/v1/{name=projects/*/locations/*/deliveryPipelines/*/automations/*}"
    };
    option (google.api.method_signature) = "name";
    option (google.longrunning.operation_info) = {
      response_type: "google.protobuf.Empty"
      metadata_type: "OperationMetadata"
    };
  }

  // Gets details of a single Automation.
  rpc GetAutomation(GetAutomationRequest) returns (Automation) {
    option (google.api.http) = {
      get: "/v1/{name=projects/*/locations/*/deliveryPipelines/*/automations/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Lists Automations in a given project and location.
  rpc ListAutomations(ListAutomationsRequest)
      returns (ListAutomationsResponse) {
    option (google.api.http) = {
      get: "/v1/{parent=projects/*/locations/*/deliveryPipelines/*}/automations"
    };
    option (google.api.method_signature) = "parent";
  }

  // Gets details of a single AutomationRun.
  rpc GetAutomationRun(GetAutomationRunRequest) returns (AutomationRun) {
    option (google.api.http) = {
      get: "/v1/{name=projects/*/locations/*/deliveryPipelines/*/automationRuns/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Lists AutomationRuns in a given project and location.
  rpc ListAutomationRuns(ListAutomationRunsRequest)
      returns (ListAutomationRunsResponse) {
    option (google.api.http) = {
      get: "/v1/{parent=projects/*/locations/*/deliveryPipelines/*}/automationRuns"
    };
    option (google.api.method_signature) = "parent";
  }

  // Cancels an AutomationRun. The `state` of the `AutomationRun` after
  // cancelling is `CANCELLED`. `CancelAutomationRun` can be called on
  // AutomationRun in the state `IN_PROGRESS` and `PENDING`; AutomationRun
  // in a different state returns an `FAILED_PRECONDITION` error.
  rpc CancelAutomationRun(CancelAutomationRunRequest)
      returns (CancelAutomationRunResponse) {
    option (google.api.http) = {
      post: "/v1/{name=projects/*/locations/*/deliveryPipelines/*/automationRuns/*}:cancel"
      body: "*"
    };
    option (google.api.method_signature) = "name";
  }
}

// A `DeliveryPipeline` resource in the Cloud Deploy API.
//
// A `DeliveryPipeline` defines a pipeline through which a Skaffold
// configuration can progress.
message DeliveryPipeline {
  option (google.api.resource) = {
    type: "clouddeploy.googleapis.com/DeliveryPipeline"
    pattern: "projects/{project}/locations/{location}/deliveryPipelines/{delivery_pipeline}"
  };

  // Optional. Name of the `DeliveryPipeline`. Format is
  // `projects/{project}/locations/{location}/deliveryPipelines/[a-z][a-z0-9\-]{0,62}`.
  string name = 1 [(google.api.field_behavior) = OPTIONAL];

  // Output only. Unique identifier of the `DeliveryPipeline`.
  string uid = 2 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Description of the `DeliveryPipeline`. Max length is 255 characters.
  string description = 3;

  // User annotations. These attributes can only be set and used by the
  // user, and not by Cloud Deploy.
  map<string, string> annotations = 4;

  // Labels are attributes that can be set and used by both the
  // user and by Cloud Deploy. Labels must meet the following constraints:
  //
  // * Keys and values can contain only lowercase letters, numeric characters,
  // underscores, and dashes.
  // * All characters must use UTF-8 encoding, and international characters are
  // allowed.
  // * Keys must start with a lowercase letter or international character.
  // * Each resource is limited to a maximum of 64 labels.
  //
  // Both keys and values are additionally constrained to be <= 128 bytes.
  map<string, string> labels = 5;

  // Output only. Time at which the pipeline was created.
  google.protobuf.Timestamp create_time = 6
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Most recent time at which the pipeline was updated.
  google.protobuf.Timestamp update_time = 7
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // The ordering configuration of the `DeliveryPipeline`.
  oneof pipeline {
    // SerialPipeline defines a sequential set of stages for a
    // `DeliveryPipeline`.
    SerialPipeline serial_pipeline = 8;
  }

  // Output only. Information around the state of the Delivery Pipeline.
  PipelineCondition condition = 11 [(google.api.field_behavior) = OUTPUT_ONLY];

  // This checksum is computed by the server based on the value of other
  // fields, and may be sent on update and delete requests to ensure the
  // client has an up-to-date value before proceeding.
  string etag = 10;

  // When suspended, no new releases or rollouts can be created,
  // but in-progress ones will complete.
  bool suspended = 12;
}

// SerialPipeline defines a sequential set of stages for a `DeliveryPipeline`.
message SerialPipeline {
  // Each stage specifies configuration for a `Target`. The ordering
  // of this list defines the promotion flow.
  repeated Stage stages = 1;
}

// Stage specifies a location to which to deploy.
message Stage {
  // The target_id to which this stage points. This field refers exclusively to
  // the last segment of a target name. For example, this field would just be
  // `my-target` (rather than
  // `projects/project/locations/location/targets/my-target`). The location of
  // the `Target` is inferred to be the same as the location of the
  // `DeliveryPipeline` that contains this `Stage`.
  string target_id = 1;

  // Skaffold profiles to use when rendering the manifest for this stage's
  // `Target`.
  repeated string profiles = 2;

  // Optional. The strategy to use for a `Rollout` to this stage.
  Strategy strategy = 5 [(google.api.field_behavior) = OPTIONAL];

  // Optional. The deploy parameters to use for the target in this stage.
  repeated DeployParameters deploy_parameters = 6
      [(google.api.field_behavior) = OPTIONAL];
}

// DeployParameters contains deploy parameters information.
message DeployParameters {
  // Required. Values are deploy parameters in key-value pairs.
  map<string, string> values = 1 [(google.api.field_behavior) = REQUIRED];

  // Optional. Deploy parameters are applied to targets with match labels.
  // If unspecified, deploy parameters are applied to all targets (including
  // child targets of a multi-target).
  map<string, string> match_target_labels = 2
      [(google.api.field_behavior) = OPTIONAL];
}

// Strategy contains deployment strategy information.
message Strategy {
  // Deployment strategy details.
  oneof deployment_strategy {
    // Standard deployment strategy executes a single deploy and allows
    // verifying the deployment.
    Standard standard = 1;

    // Canary deployment strategy provides progressive percentage based
    // deployments to a Target.
    Canary canary = 2;
  }
}

// Predeploy contains the predeploy job configuration information.
message Predeploy {
  // Optional. A sequence of Skaffold custom actions to invoke during execution
  // of the predeploy job.
  repeated string actions = 1 [(google.api.field_behavior) = OPTIONAL];
}

// Postdeploy contains the postdeploy job configuration information.
message Postdeploy {
  // Optional. A sequence of Skaffold custom actions to invoke during execution
  // of the postdeploy job.
  repeated string actions = 1 [(google.api.field_behavior) = OPTIONAL];
}

// Standard represents the standard deployment strategy.
message Standard {
  // Whether to verify a deployment.
  bool verify = 1;

  // Optional. Configuration for the predeploy job. If this is not configured,
  // predeploy job will not be present.
  Predeploy predeploy = 2 [(google.api.field_behavior) = OPTIONAL];

  // Optional. Configuration for the postdeploy job. If this is not configured,
  // postdeploy job will not be present.
  Postdeploy postdeploy = 3 [(google.api.field_behavior) = OPTIONAL];
}

// Canary represents the canary deployment strategy.
message Canary {
  // Optional. Runtime specific configurations for the deployment strategy. The
  // runtime configuration is used to determine how Cloud Deploy will split
  // traffic to enable a progressive deployment.
  RuntimeConfig runtime_config = 1 [(google.api.field_behavior) = OPTIONAL];

  // The mode to use for the canary deployment strategy.
  oneof mode {
    // Configures the progressive based deployment for a Target.
    CanaryDeployment canary_deployment = 2;

    // Configures the progressive based deployment for a Target, but allows
    // customizing at the phase level where a phase represents each of the
    // percentage deployments.
    CustomCanaryDeployment custom_canary_deployment = 3;
  }
}

// CanaryDeployment represents the canary deployment configuration
message CanaryDeployment {
  // Required. The percentage based deployments that will occur as a part of a
  // `Rollout`. List is expected in ascending order and each integer n is
  // 0 <= n < 100.
  repeated int32 percentages = 1 [(google.api.field_behavior) = REQUIRED];

  // Whether to run verify tests after each percentage deployment.
  bool verify = 2;

  // Optional. Configuration for the predeploy job of the first phase. If this
  // is not configured, there will be no predeploy job for this phase.
  Predeploy predeploy = 3 [(google.api.field_behavior) = OPTIONAL];

  // Optional. Configuration for the postdeploy job of the last phase. If this
  // is not configured, there will be no postdeploy job for this phase.
  Postdeploy postdeploy = 4 [(google.api.field_behavior) = OPTIONAL];
}

// CustomCanaryDeployment represents the custom canary deployment
// configuration.
message CustomCanaryDeployment {
  // PhaseConfig represents the configuration for a phase in the custom
  // canary deployment.
  message PhaseConfig {
    // Required. The ID to assign to the `Rollout` phase.
    // This value must consist of lower-case letters, numbers, and hyphens,
    // start with a letter and end with a letter or a number, and have a max
    // length of 63 characters. In other words, it must match the following
    // regex: `^[a-z]([a-z0-9-]{0,61}[a-z0-9])?$`.
    string phase_id = 1 [(google.api.field_behavior) = REQUIRED];

    // Required. Percentage deployment for the phase.
    int32 percentage = 2 [(google.api.field_behavior) = REQUIRED];

    // Skaffold profiles to use when rendering the manifest for this phase.
    // These are in addition to the profiles list specified in the
    // `DeliveryPipeline` stage.
    repeated string profiles = 3;

    // Whether to run verify tests after the deployment.
    bool verify = 4;

    // Optional. Configuration for the predeploy job of this phase. If this is
    // not configured, there will be no predeploy job for this phase.
    Predeploy predeploy = 5 [(google.api.field_behavior) = OPTIONAL];

    // Optional. Configuration for the postdeploy job of this phase. If this is
    // not configured, there will be no postdeploy job for this phase.
    Postdeploy postdeploy = 6 [(google.api.field_behavior) = OPTIONAL];
  }

  // Required. Configuration for each phase in the canary deployment in the
  // order executed.
  repeated PhaseConfig phase_configs = 1
      [(google.api.field_behavior) = REQUIRED];
}

// KubernetesConfig contains the Kubernetes runtime configuration.
message KubernetesConfig {
  // Information about the Kubernetes Gateway API service mesh configuration.
  message GatewayServiceMesh {
    // Required. Name of the Gateway API HTTPRoute.
    string http_route = 1 [(google.api.field_behavior) = REQUIRED];

    // Required. Name of the Kubernetes Service.
    string service = 2 [(google.api.field_behavior) = REQUIRED];

    // Required. Name of the Kubernetes Deployment whose traffic is managed by
    // the specified HTTPRoute and Service.
    string deployment = 3 [(google.api.field_behavior) = REQUIRED];

    // Optional. The time to wait for route updates to propagate. The maximum
    // configurable time is 3 hours, in seconds format. If unspecified, there is
    // no wait time.
    google.protobuf.Duration route_update_wait_time = 4
        [(google.api.field_behavior) = OPTIONAL];
  }

  // Information about the Kubernetes Service networking configuration.
  message ServiceNetworking {
    // Required. Name of the Kubernetes Service.
    string service = 1 [(google.api.field_behavior) = REQUIRED];

    // Required. Name of the Kubernetes Deployment whose traffic is managed by
    // the specified Service.
    string deployment = 2 [(google.api.field_behavior) = REQUIRED];

    // Optional. Whether to disable Pod overprovisioning. If Pod
    // overprovisioning is disabled then Cloud Deploy will limit the number of
    // total Pods used for the deployment strategy to the number of Pods the
    // Deployment has on the cluster.
    bool disable_pod_overprovisioning = 3
        [(google.api.field_behavior) = OPTIONAL];
  }

  // The service definition configuration.
  oneof service_definition {
    // Kubernetes Gateway API service mesh configuration.
    GatewayServiceMesh gateway_service_mesh = 1;

    // Kubernetes Service networking configuration.
    ServiceNetworking service_networking = 2;
  }
}

// CloudRunConfig contains the Cloud Run runtime configuration.
message CloudRunConfig {
  // Whether Cloud Deploy should update the traffic stanza in a Cloud Run
  // Service on the user's behalf to facilitate traffic splitting. This is
  // required to be true for CanaryDeployments, but optional for
  // CustomCanaryDeployments.
  bool automatic_traffic_control = 1;
}

// RuntimeConfig contains the runtime specific configurations for a deployment
// strategy.
message RuntimeConfig {
  // The runtime configuration details.
  oneof runtime_config {
    // Kubernetes runtime configuration.
    KubernetesConfig kubernetes = 1;

    // Cloud Run runtime configuration.
    CloudRunConfig cloud_run = 2;
  }
}

// PipelineReadyCondition contains information around the status of the
// Pipeline.
message PipelineReadyCondition {
  // True if the Pipeline is in a valid state. Otherwise at least one condition
  // in `PipelineCondition` is in an invalid state. Iterate over those
  // conditions and see which condition(s) has status = false to find out what
  // is wrong with the Pipeline.
  bool status = 3;

  // Last time the condition was updated.
  google.protobuf.Timestamp update_time = 4;
}

// TargetsPresentCondition contains information on any Targets defined in
// the Delivery Pipeline that do not actually exist.
message TargetsPresentCondition {
  // True if there aren't any missing Targets.
  bool status = 1;

  // The list of Target names that do not exist. For example,
  // `projects/{project_id}/locations/{location_name}/targets/{target_name}`.
  repeated string missing_targets = 2 [(google.api.resource_reference) = {
    type: "clouddeploy.googleapis.com/Target"
  }];

  // Last time the condition was updated.
  google.protobuf.Timestamp update_time = 4;
}

// TargetsTypeCondition contains information on whether the Targets defined in
// the Delivery Pipeline are of the same type.
message TargetsTypeCondition {
  // True if the targets are all a comparable type. For example this is true if
  // all targets are GKE clusters. This is false if some targets are Cloud Run
  // targets and others are GKE clusters.
  bool status = 1;

  // Human readable error message.
  string error_details = 2;
}

// PipelineCondition contains all conditions relevant to a Delivery Pipeline.
message PipelineCondition {
  // Details around the Pipeline's overall status.
  PipelineReadyCondition pipeline_ready_condition = 1;

  // Details around targets enumerated in the pipeline.
  TargetsPresentCondition targets_present_condition = 3;

  // Details on the whether the targets enumerated in the pipeline are of the
  // same type.
  TargetsTypeCondition targets_type_condition = 4;
}

// The request object for `ListDeliveryPipelines`.
message ListDeliveryPipelinesRequest {
  // Required. The parent, which owns this collection of pipelines. Format must
  // be `projects/{project_id}/locations/{location_name}`.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "clouddeploy.googleapis.com/DeliveryPipeline"
    }
  ];

  // The maximum number of pipelines to return. The service may return
  // fewer than this value. If unspecified, at most 50 pipelines will
  // be returned. The maximum value is 1000; values above 1000 will be set
  // to 1000.
  int32 page_size = 2;

  // A page token, received from a previous `ListDeliveryPipelines` call.
  // Provide this to retrieve the subsequent page.
  //
  // When paginating, all other provided parameters match
  // the call that provided the page token.
  string page_token = 3;

  // Filter pipelines to be returned. See https://google.aip.dev/160 for more
  // details.
  string filter = 4;

  // Field to sort by. See https://google.aip.dev/132#ordering for more details.
  string order_by = 5;
}

// The response object from `ListDeliveryPipelines`.
message ListDeliveryPipelinesResponse {
  // The `DeliveryPipeline` objects.
  repeated DeliveryPipeline delivery_pipelines = 1;

  // A token, which 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;
}

// The request object for `GetDeliveryPipeline`
message GetDeliveryPipelineRequest {
  // Required. Name of the `DeliveryPipeline`. Format must be
  // `projects/{project_id}/locations/{location_name}/deliveryPipelines/{pipeline_name}`.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "clouddeploy.googleapis.com/DeliveryPipeline"
    }
  ];
}

// The request object for `CreateDeliveryPipeline`.
message CreateDeliveryPipelineRequest {
  // Required. The parent collection in which the `DeliveryPipeline` should be
  // created. Format should be
  // `projects/{project_id}/locations/{location_name}`.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "clouddeploy.googleapis.com/DeliveryPipeline"
    }
  ];

  // Required. ID of the `DeliveryPipeline`.
  string delivery_pipeline_id = 2 [(google.api.field_behavior) = REQUIRED];

  // Required. The `DeliveryPipeline` to create.
  DeliveryPipeline delivery_pipeline = 3
      [(google.api.field_behavior) = REQUIRED];

  // Optional. A request ID to identify requests. Specify a unique request ID
  // so that if you must retry your request, the server will know to ignore
  // the request if it has already been completed. The server will guarantee
  // that for at least 60 minutes since the first request.
  //
  // For example, consider a situation where you make an initial request and the
  // request times out. If you make the request again with the same request ID,
  // the server can check if original operation with the same request ID was
  // received, and if so, will ignore the second request. This prevents clients
  // from accidentally creating duplicate commitments.
  //
  // The request ID must be a valid UUID with the exception that zero UUID is
  // not supported (00000000-0000-0000-0000-000000000000).
  string request_id = 4 [(google.api.field_behavior) = OPTIONAL];

  // Optional. If set to true, the request is validated and the user is provided
  // with an expected result, but no actual change is made.
  bool validate_only = 5 [(google.api.field_behavior) = OPTIONAL];
}

// The request object for `UpdateDeliveryPipeline`.
message UpdateDeliveryPipelineRequest {
  // Required. Field mask is used to specify the fields to be overwritten in the
  // `DeliveryPipeline` resource by the update.
  // The fields specified in the update_mask are relative to the resource, not
  // the full request. A field will be overwritten if it is in the mask. If the
  // user does not provide a mask then all fields will be overwritten.
  google.protobuf.FieldMask update_mask = 1
      [(google.api.field_behavior) = REQUIRED];

  // Required. The `DeliveryPipeline` to update.
  DeliveryPipeline delivery_pipeline = 2
      [(google.api.field_behavior) = REQUIRED];

  // Optional. A request ID to identify requests. Specify a unique request ID
  // so that if you must retry your request, the server will know to ignore
  // the request if it has already been completed. The server will guarantee
  // that for at least 60 minutes since the first request.
  //
  // For example, consider a situation where you make an initial request and the
  // request times out. If you make the request again with the same request ID,
  // the server can check if original operation with the same request ID was
  // received, and if so, will ignore the second request. This prevents clients
  // from accidentally creating duplicate commitments.
  //
  // The request ID must be a valid UUID with the exception that zero UUID is
  // not supported (00000000-0000-0000-0000-000000000000).
  string request_id = 3 [(google.api.field_behavior) = OPTIONAL];

  // Optional. If set to true, updating a `DeliveryPipeline` that does not exist
  // will result in the creation of a new `DeliveryPipeline`.
  bool allow_missing = 4 [(google.api.field_behavior) = OPTIONAL];

  // Optional. If set to true, the request is validated and the user is provided
  // with an expected result, but no actual change is made.
  bool validate_only = 5 [(google.api.field_behavior) = OPTIONAL];
}

// The request object for `DeleteDeliveryPipeline`.
message DeleteDeliveryPipelineRequest {
  // Required. The name of the `DeliveryPipeline` to delete. Format should be
  // `projects/{project_id}/locations/{location_name}/deliveryPipelines/{pipeline_name}`.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "clouddeploy.googleapis.com/DeliveryPipeline"
    }
  ];

  // Optional. A request ID to identify requests. Specify a unique request ID
  // so that if you must retry your request, the server will know to ignore
  // the request if it has already been completed. The server will guarantee
  // that for at least 60 minutes after the first request.
  //
  // For example, consider a situation where you make an initial request and the
  // request times out. If you make the request again with the same request ID,
  // the server can check if original operation with the same request ID was
  // received, and if so, will ignore the second request. This prevents clients
  // from accidentally creating duplicate commitments.
  //
  // The request ID must be a valid UUID with the exception that zero UUID is
  // not supported (00000000-0000-0000-0000-000000000000).
  string request_id = 2 [(google.api.field_behavior) = OPTIONAL];

  // Optional. If set to true, then deleting an already deleted or non-existing
  // `DeliveryPipeline` will succeed.
  bool allow_missing = 3 [(google.api.field_behavior) = OPTIONAL];

  // Optional. If set, validate the request and preview the review, but do not
  // actually post it.
  bool validate_only = 4 [(google.api.field_behavior) = OPTIONAL];

  // Optional. If set to true, all child resources under this pipeline will also
  // be deleted. Otherwise, the request will only work if the pipeline has no
  // child resources.
  bool force = 6 [(google.api.field_behavior) = OPTIONAL];

  // Optional. This checksum is computed by the server based on the value of
  // other fields, and may be sent on update and delete requests to ensure the
  // client has an up-to-date value before proceeding.
  string etag = 5 [(google.api.field_behavior) = OPTIONAL];
}

// Configs for the Rollback rollout.
message RollbackTargetConfig {
  // Optional. The rollback `Rollout` to create.
  Rollout rollout = 1 [(google.api.field_behavior) = OPTIONAL];

  // Optional. The starting phase ID for the `Rollout`. If unspecified, the
  // `Rollout` will start in the stable phase.
  string starting_phase_id = 2 [(google.api.field_behavior) = OPTIONAL];
}

// The request object for `RollbackTarget`.
message RollbackTargetRequest {
  // Required. The `DeliveryPipeline` for which the rollback `Rollout` should be
  // created. Format should be
  // `projects/{project_id}/locations/{location_name}/deliveryPipelines/{pipeline_name}`.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "clouddeploy.googleapis.com/DeliveryPipeline"
    }
  ];

  // Required. ID of the `Target` that is being rolled back.
  string target_id = 2 [(google.api.field_behavior) = REQUIRED];

  // Required. ID of the rollback `Rollout` to create.
  string rollout_id = 3 [(google.api.field_behavior) = REQUIRED];

  // Optional. ID of the `Release` to roll back to. If this isn't specified, the
  // previous successful `Rollout` to the specified target will be used to
  // determine the `Release`.
  string release_id = 4 [(google.api.field_behavior) = OPTIONAL];

  // Optional. If provided, this must be the latest `Rollout` that is on the
  // `Target`.
  string rollout_to_roll_back = 5 [(google.api.field_behavior) = OPTIONAL];

  // Optional. Configs for the rollback `Rollout`.
  RollbackTargetConfig rollback_config = 6
      [(google.api.field_behavior) = OPTIONAL];

  // Optional. If set to true, the request is validated and the user is provided
  // with a `RollbackTargetResponse`.
  bool validate_only = 7 [(google.api.field_behavior) = OPTIONAL];
}

// The response object from `RollbackTarget`.
message RollbackTargetResponse {
  // The config of the rollback `Rollout` created or will be created.
  RollbackTargetConfig rollback_config = 1;
}

// A `Target` resource in the Cloud Deploy API.
//
// A `Target` defines a location to which a Skaffold configuration
// can be deployed.
message Target {
  option (google.api.resource) = {
    type: "clouddeploy.googleapis.com/Target"
    pattern: "projects/{project}/locations/{location}/targets/{target}"
  };

  // Optional. Name of the `Target`. Format is
  // `projects/{project}/locations/{location}/targets/[a-z][a-z0-9\-]{0,62}`.
  string name = 1 [(google.api.field_behavior) = OPTIONAL];

  // Output only. Resource id of the `Target`.
  string target_id = 2 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Unique identifier of the `Target`.
  string uid = 3 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Optional. Description of the `Target`. Max length is 255 characters.
  string description = 4 [(google.api.field_behavior) = OPTIONAL];

  // Optional. User annotations. These attributes can only be set and used by
  // the user, and not by Cloud Deploy. See
  // https://google.aip.dev/128#annotations for more details such as format and
  // size limitations.
  map<string, string> annotations = 5 [(google.api.field_behavior) = OPTIONAL];

  // Optional. Labels are attributes that can be set and used by both the
  // user and by Cloud Deploy. Labels must meet the following constraints:
  //
  // * Keys and values can contain only lowercase letters, numeric characters,
  // underscores, and dashes.
  // * All characters must use UTF-8 encoding, and international characters are
  // allowed.
  // * Keys must start with a lowercase letter or international character.
  // * Each resource is limited to a maximum of 64 labels.
  //
  // Both keys and values are additionally constrained to be <= 128 bytes.
  map<string, string> labels = 6 [(google.api.field_behavior) = OPTIONAL];

  // Optional. Whether or not the `Target` requires approval.
  bool require_approval = 13 [(google.api.field_behavior) = OPTIONAL];

  // Output only. Time at which the `Target` was created.
  google.protobuf.Timestamp create_time = 8
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Most recent time at which the `Target` was updated.
  google.protobuf.Timestamp update_time = 9
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Destination to which the Skaffold configuration is applied during a
  // rollout.
  oneof deployment_target {
    // Optional. Information specifying a GKE Cluster.
    GkeCluster gke = 15 [(google.api.field_behavior) = OPTIONAL];

    // Optional. Information specifying an Anthos Cluster.
    AnthosCluster anthos_cluster = 17 [(google.api.field_behavior) = OPTIONAL];

    // Optional. Information specifying a Cloud Run deployment target.
    CloudRunLocation run = 18 [(google.api.field_behavior) = OPTIONAL];

    // Optional. Information specifying a multiTarget.
    MultiTarget multi_target = 19 [(google.api.field_behavior) = OPTIONAL];
  }

  // Optional. This checksum is computed by the server based on the value of
  // other fields, and may be sent on update and delete requests to ensure the
  // client has an up-to-date value before proceeding.
  string etag = 12 [(google.api.field_behavior) = OPTIONAL];

  // Configurations for all execution that relates to this `Target`.
  // Each `ExecutionEnvironmentUsage` value may only be used in a single
  // configuration; using the same value multiple times is an error.
  // When one or more configurations are specified, they must include the
  // `RENDER` and `DEPLOY` `ExecutionEnvironmentUsage` values.
  // When no configurations are specified, execution will use the default
  // specified in `DefaultPool`.
  repeated ExecutionConfig execution_configs = 16;

  // Optional. The deploy parameters to use for this target.
  map<string, string> deploy_parameters = 20
      [(google.api.field_behavior) = OPTIONAL];
}

// Configuration of the environment to use when calling Skaffold.
message ExecutionConfig {
  // Possible usages of this configuration.
  enum ExecutionEnvironmentUsage {
    // Default value. This value is unused.
    EXECUTION_ENVIRONMENT_USAGE_UNSPECIFIED = 0;

    // Use for rendering.
    RENDER = 1;

    // Use for deploying and deployment hooks.
    DEPLOY = 2;

    // Use for deployment verification.
    VERIFY = 3;

    // Use for predeploy job execution.
    PREDEPLOY = 4;

    // Use for postdeploy job execution.
    POSTDEPLOY = 5;
  }

  // Required. Usages when this configuration should be applied.
  repeated ExecutionEnvironmentUsage usages = 1
      [(google.api.field_behavior) = REQUIRED];

  // Details of the environment.
  oneof execution_environment {
    // Optional. Use default Cloud Build pool.
    DefaultPool default_pool = 2 [(google.api.field_behavior) = OPTIONAL];

    // Optional. Use private Cloud Build pool.
    PrivatePool private_pool = 3 [(google.api.field_behavior) = OPTIONAL];
  }

  // Optional. The resource name of the `WorkerPool`, with the format
  // `projects/{project}/locations/{location}/workerPools/{worker_pool}`.
  // If this optional field is unspecified, the default Cloud Build pool will be
  // used.
  string worker_pool = 4 [
    (google.api.field_behavior) = OPTIONAL,
    (google.api.resource_reference) = {
      type: "cloudbuild.googleapis.com/WorkerPool"
    }
  ];

  // Optional. Google service account to use for execution. If unspecified,
  // the project execution service account
  // (<PROJECT_NUMBER>-compute@developer.gserviceaccount.com) is used.
  string service_account = 5 [(google.api.field_behavior) = OPTIONAL];

  // Optional. Cloud Storage location in which to store execution outputs. This
  // can either be a bucket ("gs://my-bucket") or a path within a bucket
  // ("gs://my-bucket/my-dir").
  // If unspecified, a default bucket located in the same region will be used.
  string artifact_storage = 6 [(google.api.field_behavior) = OPTIONAL];

  // Optional. Execution timeout for a Cloud Build Execution. This must be
  // between 10m and 24h in seconds format. If unspecified, a default timeout of
  // 1h is used.
  google.protobuf.Duration execution_timeout = 7
      [(google.api.field_behavior) = OPTIONAL];
}

// Execution using the default Cloud Build pool.
message DefaultPool {
  // Optional. Google service account to use for execution. If unspecified,
  // the project execution service account
  // (<PROJECT_NUMBER>-compute@developer.gserviceaccount.com) will be used.
  string service_account = 1 [(google.api.field_behavior) = OPTIONAL];

  // Optional. Cloud Storage location where execution outputs should be stored.
  // This can either be a bucket ("gs://my-bucket") or a path within a bucket
  // ("gs://my-bucket/my-dir").
  // If unspecified, a default bucket located in the same region will be used.
  string artifact_storage = 2 [(google.api.field_behavior) = OPTIONAL];
}

// Execution using a private Cloud Build pool.
message PrivatePool {
  // Required. Resource name of the Cloud Build worker pool to use. The format
  // is `projects/{project}/locations/{location}/workerPools/{pool}`.
  string worker_pool = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "cloudbuild.googleapis.com/WorkerPool"
    }
  ];

  // Optional. Google service account to use for execution. If unspecified,
  // the project execution service account
  // (<PROJECT_NUMBER>-compute@developer.gserviceaccount.com) will be used.
  string service_account = 2 [(google.api.field_behavior) = OPTIONAL];

  // Optional. Cloud Storage location where execution outputs should be stored.
  // This can either be a bucket ("gs://my-bucket") or a path within a bucket
  // ("gs://my-bucket/my-dir").
  // If unspecified, a default bucket located in the same region will be used.
  string artifact_storage = 3 [(google.api.field_behavior) = OPTIONAL];
}

// Information specifying a GKE Cluster.
message GkeCluster {
  // Information specifying a GKE Cluster. Format is
  // `projects/{project_id}/locations/{location_id}/clusters/{cluster_id}`.
  string cluster = 1 [(google.api.resource_reference) = {
    type: "container.googleapis.com/Cluster"
  }];

  // Optional. If true, `cluster` is accessed using the private IP address of
  // the control plane endpoint. Otherwise, the default IP address of the
  // control plane endpoint is used. The default IP address is the private IP
  // address for clusters with private control-plane endpoints and the public IP
  // address otherwise.
  //
  // Only specify this option when `cluster` is a [private GKE
  // cluster](https://cloud.google.com/kubernetes-engine/docs/concepts/private-cluster-concept).
  bool internal_ip = 2 [(google.api.field_behavior) = OPTIONAL];
}

// Information specifying an Anthos Cluster.
message AnthosCluster {
  // Membership of the GKE Hub-registered cluster to which to apply the Skaffold
  // configuration. Format is
  // `projects/{project}/locations/{location}/memberships/{membership_name}`.
  string membership = 1 [(google.api.resource_reference) = {
    type: "gkehub.googleapis.com/Membership"
  }];
}

// Information specifying where to deploy a Cloud Run Service.
message CloudRunLocation {
  // Required. The location for the Cloud Run Service. Format must be
  // `projects/{project}/locations/{location}`.
  string location = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "locations.googleapis.com/Location"
    }
  ];
}

// Information specifying a multiTarget.
message MultiTarget {
  // Required. The target_ids of this multiTarget.
  repeated string target_ids = 1 [(google.api.field_behavior) = REQUIRED];
}

// The request object for `ListTargets`.
message ListTargetsRequest {
  // Required. The parent, which owns this collection of targets. Format must be
  // `projects/{project_id}/locations/{location_name}`.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "clouddeploy.googleapis.com/Target"
    }
  ];

  // Optional. The maximum number of `Target` objects to return. The service may
  // return fewer than this value. If unspecified, at most 50 `Target` objects
  // will be returned. The maximum value is 1000; values above 1000 will be set
  // to 1000.
  int32 page_size = 2 [(google.api.field_behavior) = OPTIONAL];

  // Optional. A page token, received from a previous `ListTargets` call.
  // Provide this to retrieve the subsequent page.
  //
  // When paginating, all other provided parameters match
  // the call that provided the page token.
  string page_token = 3 [(google.api.field_behavior) = OPTIONAL];

  // Optional. Filter targets to be returned. See https://google.aip.dev/160 for
  // more details.
  string filter = 4 [(google.api.field_behavior) = OPTIONAL];

  // Optional. Field to sort by. See https://google.aip.dev/132#ordering for
  // more details.
  string order_by = 5 [(google.api.field_behavior) = OPTIONAL];
}

// The response object from `ListTargets`.
message ListTargetsResponse {
  // The `Target` objects.
  repeated Target targets = 1;

  // A token, which 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;
}

// The request object for `GetTarget`.
message GetTargetRequest {
  // Required. Name of the `Target`. Format must be
  // `projects/{project_id}/locations/{location_name}/targets/{target_name}`.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "clouddeploy.googleapis.com/Target"
    }
  ];
}

// The request object for `CreateTarget`.
message CreateTargetRequest {
  // Required. The parent collection in which the `Target` should be created.
  // Format should be
  // `projects/{project_id}/locations/{location_name}`.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "clouddeploy.googleapis.com/Target"
    }
  ];

  // Required. ID of the `Target`.
  string target_id = 2 [(google.api.field_behavior) = REQUIRED];

  // Required. The `Target` to create.
  Target target = 3 [(google.api.field_behavior) = REQUIRED];

  // Optional. A request ID to identify requests. Specify a unique request ID
  // so that if you must retry your request, the server will know to ignore
  // the request if it has already been completed. The server will guarantee
  // that for at least 60 minutes since the first request.
  //
  // For example, consider a situation where you make an initial request and the
  // request times out. If you make the request again with the same request ID,
  // the server can check if original operation with the same request ID was
  // received, and if so, will ignore the second request. This prevents clients
  // from accidentally creating duplicate commitments.
  //
  // The request ID must be a valid UUID with the exception that zero UUID is
  // not supported (00000000-0000-0000-0000-000000000000).
  string request_id = 4 [(google.api.field_behavior) = OPTIONAL];

  // Optional. If set to true, the request is validated and the user is provided
  // with an expected result, but no actual change is made.
  bool validate_only = 5 [(google.api.field_behavior) = OPTIONAL];
}

// The request object for `UpdateTarget`.
message UpdateTargetRequest {
  // Required. Field mask is used to specify the fields to be overwritten in the
  // Target resource by the update.
  // The fields specified in the update_mask are relative to the resource, not
  // the full request. A field will be overwritten if it is in the mask. If the
  // user does not provide a mask then all fields will be overwritten.
  google.protobuf.FieldMask update_mask = 1
      [(google.api.field_behavior) = REQUIRED];

  // Required. The `Target` to update.
  Target target = 2 [(google.api.field_behavior) = REQUIRED];

  // Optional. A request ID to identify requests. Specify a unique request ID
  // so that if you must retry your request, the server will know to ignore
  // the request if it has already been completed. The server will guarantee
  // that for at least 60 minutes since the first request.
  //
  // For example, consider a situation where you make an initial request and the
  // request times out. If you make the request again with the same request ID,
  // the server can check if original operation with the same request ID was
  // received, and if so, will ignore the second request. This prevents clients
  // from accidentally creating duplicate commitments.
  //
  // The request ID must be a valid UUID with the exception that zero UUID is
  // not supported (00000000-0000-0000-0000-000000000000).
  string request_id = 3 [(google.api.field_behavior) = OPTIONAL];

  // Optional. If set to true, updating a `Target` that does not exist will
  // result in the creation of a new `Target`.
  bool allow_missing = 4 [(google.api.field_behavior) = OPTIONAL];

  // Optional. If set to true, the request is validated and the user is provided
  // with an expected result, but no actual change is made.
  bool validate_only = 5 [(google.api.field_behavior) = OPTIONAL];
}

// The request object for `DeleteTarget`.
message DeleteTargetRequest {
  // Required. The name of the `Target` to delete. Format should be
  // `projects/{project_id}/locations/{location_name}/targets/{target_name}`.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "clouddeploy.googleapis.com/Target"
    }
  ];

  // Optional. A request ID to identify requests. Specify a unique request ID
  // so that if you must retry your request, the server will know to ignore
  // the request if it has already been completed. The server will guarantee
  // that for at least 60 minutes after the first request.
  //
  // For example, consider a situation where you make an initial request and the
  // request times out. If you make the request again with the same request ID,
  // the server can check if original operation with the same request ID was
  // received, and if so, will ignore the second request. This prevents clients
  // from accidentally creating duplicate commitments.
  //
  // The request ID must be a valid UUID with the exception that zero UUID is
  // not supported (00000000-0000-0000-0000-000000000000).
  string request_id = 2 [(google.api.field_behavior) = OPTIONAL];

  // Optional. If set to true, then deleting an already deleted or non-existing
  // `Target` will succeed.
  bool allow_missing = 3 [(google.api.field_behavior) = OPTIONAL];

  // Optional. If set, validate the request and preview the review, but do not
  // actually post it.
  bool validate_only = 4 [(google.api.field_behavior) = OPTIONAL];

  // Optional. This checksum is computed by the server based on the value of
  // other fields, and may be sent on update and delete requests to ensure the
  // client has an up-to-date value before proceeding.
  string etag = 5 [(google.api.field_behavior) = OPTIONAL];
}

// Contains criteria for selecting Targets. Attributes provided must match the
// target resource in order for policy restrictions to apply. E.g. if id "prod"
// and labels "foo: bar" are given the target resource must match both that id
// and have that label in order to be selected.
message TargetAttribute {
  // ID of the `Target`. The value of this field could be one of the
  // following:
  // * The last segment of a target name. It only needs the ID to determine
  // which target is being referred to
  // * "*", all targets in a location.
  string id = 1;

  // Target labels.
  map<string, string> labels = 2;
}

// A `Release` resource in the Cloud Deploy API.
//
// A `Release` defines a specific Skaffold configuration instance
// that can be deployed.
message Release {
  option (google.api.resource) = {
    type: "clouddeploy.googleapis.com/Release"
    pattern: "projects/{project}/locations/{location}/deliveryPipelines/{delivery_pipeline}/releases/{release}"
  };

  // Valid states of the render operation.
  enum RenderState {
    // The render state is unspecified.
    RENDER_STATE_UNSPECIFIED = 0;

    // All rendering operations have completed successfully.
    SUCCEEDED = 1;

    // All rendering operations have completed, and one or more have failed.
    FAILED = 2;

    // Rendering has started and is not complete.
    IN_PROGRESS = 3;
  }

  // Details of rendering for a single target.
  message TargetRender {
    // Valid states of the render operation.
    enum TargetRenderState {
      // The render operation state is unspecified.
      TARGET_RENDER_STATE_UNSPECIFIED = 0;

      // The render operation has completed successfully.
      SUCCEEDED = 1;

      // The render operation has failed.
      FAILED = 2;

      // The render operation is in progress.
      IN_PROGRESS = 3;
    }

    // Well-known rendering failures.
    enum FailureCause {
      // No reason for failure is specified.
      FAILURE_CAUSE_UNSPECIFIED = 0;

      // Cloud Build is not available, either because it is not enabled or
      // because Cloud Deploy has insufficient permissions. See [required
      // permission](https://cloud.google.com/deploy/docs/cloud-deploy-service-account#required_permissions).
      CLOUD_BUILD_UNAVAILABLE = 1;

      // The render operation did not complete successfully; check Cloud Build
      // logs.
      EXECUTION_FAILED = 2;

      // Cloud Build failed to fulfill Cloud Deploy's request. See
      // failure_message for additional details.
      CLOUD_BUILD_REQUEST_FAILED = 3;

      // The render operation did not complete successfully because the
      // verification stanza required for verify was not found on the skaffold
      // configuration.
      VERIFICATION_CONFIG_NOT_FOUND = 4;

      // The render operation did not complete successfully because the custom
      // action required for predeploy or postdeploy was not found in the
      // skaffold configuration. See failure_message for additional details.
      CUSTOM_ACTION_NOT_FOUND = 5;
    }

    // Output only. The resource name of the Cloud Build `Build` object that is
    // used to render the manifest for this target. Format is
    // `projects/{project}/locations/{location}/builds/{build}`.
    string rendering_build = 1 [
      (google.api.field_behavior) = OUTPUT_ONLY,
      (google.api.resource_reference) = {
        type: "cloudbuild.googleapis.com/Build"
      }
    ];

    // Output only. Current state of the render operation for this Target.
    TargetRenderState rendering_state = 2
        [(google.api.field_behavior) = OUTPUT_ONLY];

    // Output only. Metadata related to the `Release` render for this Target.
    RenderMetadata metadata = 6 [(google.api.field_behavior) = OUTPUT_ONLY];

    // Output only. Reason this render failed. This will always be unspecified
    // while the render in progress.
    FailureCause failure_cause = 4 [(google.api.field_behavior) = OUTPUT_ONLY];

    // Output only. Additional information about the render failure, if
    // available.
    string failure_message = 5 [(google.api.field_behavior) = OUTPUT_ONLY];
  }

  // ReleaseReadyCondition contains information around the status of the
  // Release. If a release is not ready, you cannot create a rollout with the
  // release.
  message ReleaseReadyCondition {
    // True if the Release is in a valid state. Otherwise at least one condition
    // in `ReleaseCondition` is in an invalid state. Iterate over those
    // conditions and see which condition(s) has status = false to find out what
    // is wrong with the Release.
    bool status = 1;
  }

  // SkaffoldSupportedCondition contains information about when support for the
  // release's version of skaffold ends.
  message SkaffoldSupportedCondition {
    // True if the version of skaffold used by this release is supported.
    bool status = 1;

    // The skaffold support state for this release's version of skaffold.
    SkaffoldSupportState skaffold_support_state = 2;

    // The time at which this release's version of skaffold will enter
    // maintenance mode.
    google.protobuf.Timestamp maintenance_mode_time = 3;

    // The time at which this release's version of skaffold will no longer be
    // supported.
    google.protobuf.Timestamp support_expiration_time = 4;
  }

  // ReleaseCondition contains all conditions relevant to a Release.
  message ReleaseCondition {
    // Details around the Releases's overall status.
    ReleaseReadyCondition release_ready_condition = 1;

    // Details around the support state of the release's skaffold
    // version.
    SkaffoldSupportedCondition skaffold_supported_condition = 2;
  }

  // Optional. Name of the `Release`. Format is
  // `projects/{project}/locations/{location}/deliveryPipelines/{deliveryPipeline}/releases/[a-z][a-z0-9\-]{0,62}`.
  string name = 1 [(google.api.field_behavior) = OPTIONAL];

  // Output only. Unique identifier of the `Release`.
  string uid = 2 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Description of the `Release`. Max length is 255 characters.
  string description = 3;

  // User annotations. These attributes can only be set and used by the
  // user, and not by Cloud Deploy. See https://google.aip.dev/128#annotations
  // for more details such as format and size limitations.
  map<string, string> annotations = 4;

  // Labels are attributes that can be set and used by both the
  // user and by Cloud Deploy. Labels must meet the following constraints:
  //
  // * Keys and values can contain only lowercase letters, numeric characters,
  // underscores, and dashes.
  // * All characters must use UTF-8 encoding, and international characters are
  // allowed.
  // * Keys must start with a lowercase letter or international character.
  // * Each resource is limited to a maximum of 64 labels.
  //
  // Both keys and values are additionally constrained to be <= 128 bytes.
  map<string, string> labels = 5;

  // Output only. Indicates whether this is an abandoned release.
  bool abandoned = 23 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Time at which the `Release` was created.
  google.protobuf.Timestamp create_time = 6
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Time at which the render began.
  google.protobuf.Timestamp render_start_time = 7
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Time at which the render completed.
  google.protobuf.Timestamp render_end_time = 8
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Cloud Storage URI of tar.gz archive containing Skaffold configuration.
  string skaffold_config_uri = 17;

  // Filepath of the Skaffold config inside of the config URI.
  string skaffold_config_path = 9;

  // List of artifacts to pass through to Skaffold command.
  repeated BuildArtifact build_artifacts = 10;

  // Output only. Snapshot of the parent pipeline taken at release creation
  // time.
  DeliveryPipeline delivery_pipeline_snapshot = 11
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Snapshot of the targets taken at release creation time.
  repeated Target target_snapshots = 12
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Current state of the render operation.
  RenderState render_state = 13 [(google.api.field_behavior) = OUTPUT_ONLY];

  // This checksum is computed by the server based on the value of other
  // fields, and may be sent on update and delete requests to ensure the
  // client has an up-to-date value before proceeding.
  string etag = 16;

  // The Skaffold version to use when operating on this release, such as
  // "1.20.0". Not all versions are valid; Cloud Deploy supports a specific set
  // of versions.
  //
  // If unset, the most recent supported Skaffold version will be used.
  string skaffold_version = 19;

  // Output only. Map from target ID to the target artifacts created
  // during the render operation.
  map<string, TargetArtifact> target_artifacts = 20
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Map from target ID to details of the render operation for that
  // target.
  map<string, TargetRender> target_renders = 22
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Information around the state of the Release.
  ReleaseCondition condition = 24 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Optional. The deploy parameters to use for all targets in this release.
  map<string, string> deploy_parameters = 25
      [(google.api.field_behavior) = OPTIONAL];
}

// Description of an a image to use during Skaffold rendering.
message BuildArtifact {
  // Image name in Skaffold configuration.
  string image = 3;

  // Image tag to use. This will generally be the full path to an image, such
  // as "gcr.io/my-project/busybox:1.2.3" or
  // "gcr.io/my-project/busybox@sha256:abc123".
  string tag = 2;
}

// The artifacts produced by a target render operation.
message TargetArtifact {
  // Contains the paths to the artifacts, relative to the URI, for a phase.
  message PhaseArtifact {
    // Output only. File path of the resolved Skaffold configuration relative to
    // the URI.
    string skaffold_config_path = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

    // Output only. File path of the rendered manifest relative to the URI.
    string manifest_path = 3 [(google.api.field_behavior) = OUTPUT_ONLY];

    // Output only. File path of the directory of rendered job manifests
    // relative to the URI. This is only set if it is applicable.
    string job_manifests_path = 4 [(google.api.field_behavior) = OUTPUT_ONLY];
  }

  oneof uri {
    // Output only. URI of a directory containing the artifacts. This contains
    // deployment configuration used by Skaffold during a rollout, and all
    // paths are relative to this location.
    string artifact_uri = 4 [(google.api.field_behavior) = OUTPUT_ONLY];
  }

  // Output only. File path of the resolved Skaffold configuration relative to
  // the URI.
  string skaffold_config_path = 2 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. File path of the rendered manifest relative to the URI.
  string manifest_path = 3 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Map from the phase ID to the phase artifacts for the `Target`.
  map<string, PhaseArtifact> phase_artifacts = 5
      [(google.api.field_behavior) = OUTPUT_ONLY];
}

// The artifacts produced by a deploy operation.
message DeployArtifact {
  // Output only. URI of a directory containing the artifacts. All paths are
  // relative to this location.
  string artifact_uri = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. File paths of the manifests applied during the deploy
  // operation relative to the URI.
  repeated string manifest_paths = 2
      [(google.api.field_behavior) = OUTPUT_ONLY];
}

// CloudRunRenderMetadata contains Cloud Run information associated with a
// `Release` render.
message CloudRunRenderMetadata {
  // Output only. The name of the Cloud Run Service in the rendered manifest.
  // Format is `projects/{project}/locations/{location}/services/{service}`.
  string service = 1 [
    (google.api.field_behavior) = OUTPUT_ONLY,
    (google.api.resource_reference) = { type: "run.googleapis.com/Service" }
  ];
}

// RenderMetadata includes information associated with a `Release` render.
message RenderMetadata {
  // Output only. Metadata associated with rendering for Cloud Run.
  CloudRunRenderMetadata cloud_run = 1
      [(google.api.field_behavior) = OUTPUT_ONLY];
}

// The request object for `ListReleases`.
message ListReleasesRequest {
  // Required. The `DeliveryPipeline` which owns this collection of `Release`
  // objects.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "clouddeploy.googleapis.com/DeliveryPipeline"
    }
  ];

  // Optional. The maximum number of `Release` objects to return. The service
  // may return fewer than this value. If unspecified, at most 50 `Release`
  // objects will be returned. The maximum value is 1000; values above 1000 will
  // be set to 1000.
  int32 page_size = 2 [(google.api.field_behavior) = OPTIONAL];

  // Optional. A page token, received from a previous `ListReleases` call.
  // Provide this to retrieve the subsequent page.
  //
  // When paginating, all other provided parameters match
  // the call that provided the page token.
  string page_token = 3 [(google.api.field_behavior) = OPTIONAL];

  // Optional. Filter releases to be returned. See https://google.aip.dev/160
  // for more details.
  string filter = 4 [(google.api.field_behavior) = OPTIONAL];

  // Optional. Field to sort by. See https://google.aip.dev/132#ordering for
  // more details.
  string order_by = 5 [(google.api.field_behavior) = OPTIONAL];
}

// The response object from `ListReleases`.
message ListReleasesResponse {
  // The `Release` objects.
  repeated Release releases = 1;

  // A token, which 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;
}

// The request object for `GetRelease`.
message GetReleaseRequest {
  // Required. Name of the `Release`. Format must be
  // `projects/{project_id}/locations/{location_name}/deliveryPipelines/{pipeline_name}/releases/{release_name}`.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "clouddeploy.googleapis.com/Release"
    }
  ];
}

// The request object for `CreateRelease`,
message CreateReleaseRequest {
  // Required. The parent collection in which the `Release` should be created.
  // Format should be
  // `projects/{project_id}/locations/{location_name}/deliveryPipelines/{pipeline_name}`.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "clouddeploy.googleapis.com/DeliveryPipeline"
    }
  ];

  // Required. ID of the `Release`.
  string release_id = 2 [(google.api.field_behavior) = REQUIRED];

  // Required. The `Release` to create.
  Release release = 3 [(google.api.field_behavior) = REQUIRED];

  // Optional. A request ID to identify requests. Specify a unique request ID
  // so that if you must retry your request, the server will know to ignore
  // the request if it has already been completed. The server will guarantee
  // that for at least 60 minutes since the first request.
  //
  // For example, consider a situation where you make an initial request and the
  // request times out. If you make the request again with the same request ID,
  // the server can check if original operation with the same request ID was
  // received, and if so, will ignore the second request. This prevents clients
  // from accidentally creating duplicate commitments.
  //
  // The request ID must be a valid UUID with the exception that zero UUID is
  // not supported (00000000-0000-0000-0000-000000000000).
  string request_id = 4 [(google.api.field_behavior) = OPTIONAL];

  // Optional. If set to true, the request is validated and the user is provided
  // with an expected result, but no actual change is made.
  bool validate_only = 5 [(google.api.field_behavior) = OPTIONAL];
}

// A `Rollout` resource in the Cloud Deploy API.
//
// A `Rollout` contains information around a specific deployment to a `Target`.
message Rollout {
  option (google.api.resource) = {
    type: "clouddeploy.googleapis.com/Rollout"
    pattern: "projects/{project}/locations/{location}/deliveryPipelines/{delivery_pipeline}/releases/{release}/rollouts/{rollout}"
  };

  // Valid approval states of a `Rollout`.
  enum ApprovalState {
    // The `Rollout` has an unspecified approval state.
    APPROVAL_STATE_UNSPECIFIED = 0;

    // The `Rollout` requires approval.
    NEEDS_APPROVAL = 1;

    // The `Rollout` does not require approval.
    DOES_NOT_NEED_APPROVAL = 2;

    // The `Rollout` has been approved.
    APPROVED = 3;

    // The `Rollout` has been rejected.
    REJECTED = 4;
  }

  // Valid states of a `Rollout`.
  enum State {
    // The `Rollout` has an unspecified state.
    STATE_UNSPECIFIED = 0;

    // The `Rollout` has completed successfully.
    SUCCEEDED = 1;

    // The `Rollout` has failed.
    FAILED = 2;

    // The `Rollout` is being deployed.
    IN_PROGRESS = 3;

    // The `Rollout` needs approval.
    PENDING_APPROVAL = 4;

    // An approver rejected the `Rollout`.
    APPROVAL_REJECTED = 5;

    // The `Rollout` is waiting for an earlier Rollout(s) to complete on this
    // `Target`.
    PENDING = 6;

    // The `Rollout` is waiting for the `Release` to be fully rendered.
    PENDING_RELEASE = 7;

    // The `Rollout` is in the process of being cancelled.
    CANCELLING = 8;

    // The `Rollout` has been cancelled.
    CANCELLED = 9;

    // The `Rollout` is halted.
    HALTED = 10;
  }

  // Well-known rollout failures.
  enum FailureCause {
    // No reason for failure is specified.
    FAILURE_CAUSE_UNSPECIFIED = 0;

    // Cloud Build is not available, either because it is not enabled or because
    // Cloud Deploy has insufficient permissions. See [required
    // permission](https://cloud.google.com/deploy/docs/cloud-deploy-service-account#required_permissions).
    CLOUD_BUILD_UNAVAILABLE = 1;

    // The deploy operation did not complete successfully; check Cloud Build
    // logs.
    EXECUTION_FAILED = 2;

    // Deployment did not complete within the alloted time.
    DEADLINE_EXCEEDED = 3;

    // Release is in a failed state.
    RELEASE_FAILED = 4;

    // Release is abandoned.
    RELEASE_ABANDONED = 5;

    // No skaffold verify configuration was found.
    VERIFICATION_CONFIG_NOT_FOUND = 6;

    // Cloud Build failed to fulfill Cloud Deploy's request. See failure_message
    // for additional details.
    CLOUD_BUILD_REQUEST_FAILED = 7;
  }

  // Optional. Name of the `Rollout`. Format is
  // `projects/{project}/locations/{location}/deliveryPipelines/{deliveryPipeline}/releases/{release}/rollouts/[a-z][a-z0-9\-]{0,62}`.
  string name = 1 [(google.api.field_behavior) = OPTIONAL];

  // Output only. Unique identifier of the `Rollout`.
  string uid = 2 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Description of the `Rollout` for user purposes. Max length is 255
  // characters.
  string description = 3;

  // User annotations. These attributes can only be set and used by the
  // user, and not by Cloud Deploy. See https://google.aip.dev/128#annotations
  // for more details such as format and size limitations.
  map<string, string> annotations = 4;

  // Labels are attributes that can be set and used by both the
  // user and by Cloud Deploy. Labels must meet the following constraints:
  //
  // * Keys and values can contain only lowercase letters, numeric characters,
  // underscores, and dashes.
  // * All characters must use UTF-8 encoding, and international characters are
  // allowed.
  // * Keys must start with a lowercase letter or international character.
  // * Each resource is limited to a maximum of 64 labels.
  //
  // Both keys and values are additionally constrained to be <= 128 bytes.
  map<string, string> labels = 5;

  // Output only. Time at which the `Rollout` was created.
  google.protobuf.Timestamp create_time = 6
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Time at which the `Rollout` was approved.
  google.protobuf.Timestamp approve_time = 7
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Time at which the `Rollout` was enqueued.
  google.protobuf.Timestamp enqueue_time = 8
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Time at which the `Rollout` started deploying.
  google.protobuf.Timestamp deploy_start_time = 9
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Time at which the `Rollout` finished deploying.
  google.protobuf.Timestamp deploy_end_time = 10
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Required. The ID of Target to which this `Rollout` is deploying.
  string target_id = 18 [(google.api.field_behavior) = REQUIRED];

  // Output only. Approval state of the `Rollout`.
  ApprovalState approval_state = 12 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Current state of the `Rollout`.
  State state = 13 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Additional information about the rollout failure, if
  // available.
  string failure_reason = 14 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The resource name of the Cloud Build `Build` object that is
  // used to deploy the Rollout. Format is
  // `projects/{project}/locations/{location}/builds/{build}`.
  string deploying_build = 17 [
    (google.api.field_behavior) = OUTPUT_ONLY,
    (google.api.resource_reference) = {
      type: "cloudbuild.googleapis.com/Build"
    }
  ];

  // This checksum is computed by the server based on the value of other
  // fields, and may be sent on update and delete requests to ensure the
  // client has an up-to-date value before proceeding.
  string etag = 16;

  // Output only. The reason this rollout failed. This will always be
  // unspecified while the rollout is in progress.
  FailureCause deploy_failure_cause = 19
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The phases that represent the workflows of this `Rollout`.
  repeated Phase phases = 23 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Metadata contains information about the rollout.
  Metadata metadata = 24 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Name of the `ControllerRollout`. Format is
  // `projects/{project}/locations/{location}/deliveryPipelines/{deliveryPipeline}/releases/{release}/rollouts/[a-z][a-z0-9\-]{0,62}`.
  string controller_rollout = 25 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Name of the `Rollout` that is rolled back by this `Rollout`.
  // Empty if this `Rollout` wasn't created as a rollback.
  string rollback_of_rollout = 26 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Names of `Rollouts` that rolled back this `Rollout`.
  repeated string rolled_back_by_rollouts = 27
      [(google.api.field_behavior) = OUTPUT_ONLY];
}

// Metadata includes information associated with a `Rollout`.
message Metadata {
  // Output only. The name of the Cloud Run Service that is associated with a
  // `Rollout`.
  CloudRunMetadata cloud_run = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. AutomationRolloutMetadata contains the information about the
  // interactions between Automation service and this rollout.
  AutomationRolloutMetadata automation = 2
      [(google.api.field_behavior) = OUTPUT_ONLY];
}

// DeployJobRunMetadata surfaces information associated with a `DeployJobRun` to
// the user.
message DeployJobRunMetadata {
  // Output only. The name of the Cloud Run Service that is associated with a
  // `DeployJobRun`.
  CloudRunMetadata cloud_run = 1 [(google.api.field_behavior) = OUTPUT_ONLY];
}

// CloudRunMetadata contains information from a Cloud Run deployment.
message CloudRunMetadata {
  // Output only. The name of the Cloud Run Service that is associated with a
  // `Rollout`. Format is
  // `projects/{project}/locations/{location}/services/{service}`.
  string service = 1 [
    (google.api.field_behavior) = OUTPUT_ONLY,
    (google.api.resource_reference) = { type: "run.googleapis.com/Service" }
  ];

  // Output only. The Cloud Run Service urls that are associated with a
  // `Rollout`.
  repeated string service_urls = 2 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The Cloud Run Revision id associated with a `Rollout`.
  string revision = 3 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The name of the Cloud Run job that is associated with a
  // `Rollout`. Format is
  // `projects/{project}/locations/{location}/jobs/{job_name}`.
  string job = 4 [
    (google.api.field_behavior) = OUTPUT_ONLY,
    (google.api.resource_reference) = { type: "run.googleapis.com/Job" }
  ];
}

// AutomationRolloutMetadata contains Automation-related actions that
// were performed on a rollout.
message AutomationRolloutMetadata {
  // Output only. The ID of the AutomationRun initiated by a promote release
  // rule.
  string promote_automation_run = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The IDs of the AutomationRuns initiated by an advance rollout
  // rule.
  repeated string advance_automation_runs = 2
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The IDs of the AutomationRuns initiated by a repair rollout
  // rule.
  repeated string repair_automation_runs = 3
      [(google.api.field_behavior) = OUTPUT_ONLY];
}

// Phase represents a collection of jobs that are logically grouped together
// for a `Rollout`.
message Phase {
  // Valid states of a Phase.
  enum State {
    // The Phase has an unspecified state.
    STATE_UNSPECIFIED = 0;

    // The Phase is waiting for an earlier Phase(s) to complete.
    PENDING = 1;

    // The Phase is in progress.
    IN_PROGRESS = 2;

    // The Phase has succeeded.
    SUCCEEDED = 3;

    // The Phase has failed.
    FAILED = 4;

    // The Phase was aborted.
    ABORTED = 5;

    // The Phase was skipped.
    SKIPPED = 6;
  }

  // Output only. The ID of the Phase.
  string id = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Current state of the Phase.
  State state = 3 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Additional information on why the Phase was skipped, if
  // available.
  string skip_message = 6 [(google.api.field_behavior) = OUTPUT_ONLY];

  // The job composition of this Phase.
  oneof jobs {
    // Output only. Deployment job composition.
    DeploymentJobs deployment_jobs = 4
        [(google.api.field_behavior) = OUTPUT_ONLY];

    // Output only. ChildRollout job composition.
    ChildRolloutJobs child_rollout_jobs = 5
        [(google.api.field_behavior) = OUTPUT_ONLY];
  }
}

// Deployment job composition.
message DeploymentJobs {
  // Output only. The deploy Job. This is the deploy job in the phase.
  Job deploy_job = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The verify Job. Runs after a deploy if the deploy succeeds.
  Job verify_job = 2 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The predeploy Job, which is the first job on the phase.
  Job predeploy_job = 3 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The postdeploy Job, which is the last job on the phase.
  Job postdeploy_job = 4 [(google.api.field_behavior) = OUTPUT_ONLY];
}

// ChildRollouts job composition
message ChildRolloutJobs {
  // Output only. List of CreateChildRolloutJobs
  repeated Job create_rollout_jobs = 1
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. List of AdvanceChildRolloutJobs
  repeated Job advance_rollout_jobs = 2
      [(google.api.field_behavior) = OUTPUT_ONLY];
}

// Job represents an operation for a `Rollout`.
message Job {
  // Valid states of a Job.
  enum State {
    // The Job has an unspecified state.
    STATE_UNSPECIFIED = 0;

    // The Job is waiting for an earlier Phase(s) or Job(s) to complete.
    PENDING = 1;

    // The Job is disabled.
    DISABLED = 2;

    // The Job is in progress.
    IN_PROGRESS = 3;

    // The Job succeeded.
    SUCCEEDED = 4;

    // The Job failed.
    FAILED = 5;

    // The Job was aborted.
    ABORTED = 6;

    // The Job was skipped.
    SKIPPED = 7;

    // The Job was ignored.
    IGNORED = 8;
  }

  // Output only. The ID of the Job.
  string id = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

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

  // Output only. Additional information on why the Job was skipped, if
  // available.
  string skip_message = 8 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The name of the `JobRun` responsible for the most recent
  // invocation of this Job.
  string job_run = 3 [
    (google.api.field_behavior) = OUTPUT_ONLY,
    (google.api.resource_reference) = {
      type: "clouddeploy.googleapis.com/JobRun"
    }
  ];

  // The type of Job.
  oneof job_type {
    // Output only. A deploy Job.
    DeployJob deploy_job = 4 [(google.api.field_behavior) = OUTPUT_ONLY];

    // Output only. A verify Job.
    VerifyJob verify_job = 5 [(google.api.field_behavior) = OUTPUT_ONLY];

    // Output only. A predeploy Job.
    PredeployJob predeploy_job = 9 [(google.api.field_behavior) = OUTPUT_ONLY];

    // Output only. A postdeploy Job.
    PostdeployJob postdeploy_job = 10
        [(google.api.field_behavior) = OUTPUT_ONLY];

    // Output only. A createChildRollout Job.
    CreateChildRolloutJob create_child_rollout_job = 6
        [(google.api.field_behavior) = OUTPUT_ONLY];

    // Output only. An advanceChildRollout Job.
    AdvanceChildRolloutJob advance_child_rollout_job = 7
        [(google.api.field_behavior) = OUTPUT_ONLY];
  }
}

// A deploy Job.
message DeployJob {}

// A verify Job.
message VerifyJob {}

// A predeploy Job.
message PredeployJob {
  // Output only. The custom actions that the predeploy Job executes.
  repeated string actions = 1 [(google.api.field_behavior) = OUTPUT_ONLY];
}

// A postdeploy Job.
message PostdeployJob {
  // Output only. The custom actions that the postdeploy Job executes.
  repeated string actions = 1 [(google.api.field_behavior) = OUTPUT_ONLY];
}

// A createChildRollout Job.
message CreateChildRolloutJob {}

// An advanceChildRollout Job.
message AdvanceChildRolloutJob {}

// ListRolloutsRequest is the request object used by `ListRollouts`.
message ListRolloutsRequest {
  // Required. The `Release` which owns this collection of `Rollout` objects.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "clouddeploy.googleapis.com/Release"
    }
  ];

  // Optional. The maximum number of `Rollout` objects to return. The service
  // may return fewer than this value. If unspecified, at most 50 `Rollout`
  // objects will be returned. The maximum value is 1000; values above 1000 will
  // be set to 1000.
  int32 page_size = 2 [(google.api.field_behavior) = OPTIONAL];

  // Optional. A page token, received from a previous `ListRollouts` call.
  // Provide this to retrieve the subsequent page.
  //
  // When paginating, all other provided parameters match
  // the call that provided the page token.
  string page_token = 3 [(google.api.field_behavior) = OPTIONAL];

  // Optional. Filter rollouts to be returned. See https://google.aip.dev/160
  // for more details.
  string filter = 4 [(google.api.field_behavior) = OPTIONAL];

  // Optional. Field to sort by. See https://google.aip.dev/132#ordering for
  // more details.
  string order_by = 5 [(google.api.field_behavior) = OPTIONAL];
}

// ListRolloutsResponse is the response object reutrned by `ListRollouts`.
message ListRolloutsResponse {
  // The `Rollout` objects.
  repeated Rollout rollouts = 1;

  // A token, which 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;
}

// GetRolloutRequest is the request object used by `GetRollout`.
message GetRolloutRequest {
  // Required. Name of the `Rollout`. Format must be
  // `projects/{project_id}/locations/{location_name}/deliveryPipelines/{pipeline_name}/releases/{release_name}/rollouts/{rollout_name}`.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "clouddeploy.googleapis.com/Rollout"
    }
  ];
}

// CreateRolloutRequest is the request object used by `CreateRollout`.
message CreateRolloutRequest {
  // Required. The parent collection in which the `Rollout` should be created.
  // Format should be
  // `projects/{project_id}/locations/{location_name}/deliveryPipelines/{pipeline_name}/releases/{release_name}`.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "clouddeploy.googleapis.com/Release"
    }
  ];

  // Required. ID of the `Rollout`.
  string rollout_id = 2 [(google.api.field_behavior) = REQUIRED];

  // Required. The `Rollout` to create.
  Rollout rollout = 3 [(google.api.field_behavior) = REQUIRED];

  // Optional. A request ID to identify requests. Specify a unique request ID
  // so that if you must retry your request, the server will know to ignore
  // the request if it has already been completed. The server will guarantee
  // that for at least 60 minutes since the first request.
  //
  // For example, consider a situation where you make an initial request and the
  // request times out. If you make the request again with the same request ID,
  // the server can check if original operation with the same request ID was
  // received, and if so, will ignore the second request. This prevents clients
  // from accidentally creating duplicate commitments.
  //
  // The request ID must be a valid UUID with the exception that zero UUID is
  // not supported (00000000-0000-0000-0000-000000000000).
  string request_id = 4 [(google.api.field_behavior) = OPTIONAL];

  // Optional. If set to true, the request is validated and the user is provided
  // with an expected result, but no actual change is made.
  bool validate_only = 5 [(google.api.field_behavior) = OPTIONAL];

  // Optional. The starting phase ID for the `Rollout`. If empty the `Rollout`
  // will start at the first phase.
  string starting_phase_id = 7 [(google.api.field_behavior) = OPTIONAL];
}

// Represents the metadata of the 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 user 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];
}

// The request object used by `ApproveRollout`.
message ApproveRolloutRequest {
  // Required. Name of the Rollout. Format is
  // `projects/{project}/locations/{location}/deliveryPipelines/{deliveryPipeline}/releases/{release}/rollouts/{rollout}`.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "clouddeploy.googleapis.com/Rollout"
    }
  ];

  // Required. True = approve; false = reject
  bool approved = 2 [(google.api.field_behavior) = REQUIRED];
}

// The response object from `ApproveRollout`.
message ApproveRolloutResponse {}

// The request object used by `AdvanceRollout`.
message AdvanceRolloutRequest {
  // Required. Name of the Rollout. Format is
  // `projects/{project}/locations/{location}/deliveryPipelines/{deliveryPipeline}/releases/{release}/rollouts/{rollout}`.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "clouddeploy.googleapis.com/Rollout"
    }
  ];

  // Required. The phase ID to advance the `Rollout` to.
  string phase_id = 2 [(google.api.field_behavior) = REQUIRED];
}

// The response object from `AdvanceRollout`.
message AdvanceRolloutResponse {}

// The request object used by `CancelRollout`.
message CancelRolloutRequest {
  // Required. Name of the Rollout. Format is
  // `projects/{project}/locations/{location}/deliveryPipelines/{deliveryPipeline}/releases/{release}/rollouts/{rollout}`.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "clouddeploy.googleapis.com/Rollout"
    }
  ];
}

// The response object from `CancelRollout`.
message CancelRolloutResponse {}

// The request object used by `IgnoreJob`.
message IgnoreJobRequest {
  // Required. Name of the Rollout. Format is
  // `projects/{project}/locations/{location}/deliveryPipelines/{deliveryPipeline}/releases/{release}/rollouts/{rollout}`.
  string rollout = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "clouddeploy.googleapis.com/Rollout"
    }
  ];

  // Required. The phase ID the Job to ignore belongs to.
  string phase_id = 2 [(google.api.field_behavior) = REQUIRED];

  // Required. The job ID for the Job to ignore.
  string job_id = 3 [(google.api.field_behavior) = REQUIRED];
}

// The response object from `IgnoreJob`.
message IgnoreJobResponse {}

// RetryJobRequest is the request object used by `RetryJob`.
message RetryJobRequest {
  // Required. Name of the Rollout. Format is
  // `projects/{project}/locations/{location}/deliveryPipelines/{deliveryPipeline}/releases/{release}/rollouts/{rollout}`.
  string rollout = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "clouddeploy.googleapis.com/Rollout"
    }
  ];

  // Required. The phase ID the Job to retry belongs to.
  string phase_id = 2 [(google.api.field_behavior) = REQUIRED];

  // Required. The job ID for the Job to retry.
  string job_id = 3 [(google.api.field_behavior) = REQUIRED];
}

// The response object from 'RetryJob'.
message RetryJobResponse {}

// The request object used by `AbandonRelease`.
message AbandonReleaseRequest {
  // Required. Name of the Release. Format is
  // `projects/{project}/locations/{location}/deliveryPipelines/{deliveryPipeline}/releases/{release}`.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "clouddeploy.googleapis.com/Release"
    }
  ];
}

// The response object for `AbandonRelease`.
message AbandonReleaseResponse {}

// A `JobRun` resource in the Cloud Deploy API.
//
// A `JobRun` contains information of a single `Rollout` job evaluation.
message JobRun {
  option (google.api.resource) = {
    type: "clouddeploy.googleapis.com/JobRun"
    pattern: "projects/{project}/locations/{location}/deliveryPipelines/{delivery_pipeline}/releases/{release}/rollouts/{rollout}/jobRuns/{job_run}"
  };

  // Valid states of a `JobRun`.
  enum State {
    // The `JobRun` has an unspecified state.
    STATE_UNSPECIFIED = 0;

    // The `JobRun` is in progress.
    IN_PROGRESS = 1;

    // The `JobRun` has succeeded.
    SUCCEEDED = 2;

    // The `JobRun` has failed.
    FAILED = 3;

    // The `JobRun` is terminating.
    TERMINATING = 4;

    // The `JobRun` was terminated.
    TERMINATED = 5;
  }

  // Optional. Name of the `JobRun`. Format is
  // `projects/{project}/locations/{location}/deliveryPipelines/{deliveryPipeline}/releases/{releases}/rollouts/{rollouts}/jobRuns/{uuid}`.
  string name = 1 [(google.api.field_behavior) = OPTIONAL];

  // Output only. Unique identifier of the `JobRun`.
  string uid = 2 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. ID of the `Rollout` phase this `JobRun` belongs in.
  string phase_id = 3 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. ID of the `Rollout` job this `JobRun` corresponds to.
  string job_id = 4 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Time at which the `JobRun` was created.
  google.protobuf.Timestamp create_time = 5
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Time at which the `JobRun` was started.
  google.protobuf.Timestamp start_time = 6
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Time at which the `JobRun` ended.
  google.protobuf.Timestamp end_time = 7
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The current state of the `JobRun`.
  State state = 8 [(google.api.field_behavior) = OUTPUT_ONLY];

  // The `JobRun` type and the information for that type.
  oneof job_run {
    // Output only. Information specific to a deploy `JobRun`.
    DeployJobRun deploy_job_run = 9 [(google.api.field_behavior) = OUTPUT_ONLY];

    // Output only. Information specific to a verify `JobRun`.
    VerifyJobRun verify_job_run = 10
        [(google.api.field_behavior) = OUTPUT_ONLY];

    // Output only. Information specific to a predeploy `JobRun`.
    PredeployJobRun predeploy_job_run = 14
        [(google.api.field_behavior) = OUTPUT_ONLY];

    // Output only. Information specific to a postdeploy `JobRun`.
    PostdeployJobRun postdeploy_job_run = 15
        [(google.api.field_behavior) = OUTPUT_ONLY];

    // Output only. Information specific to a createChildRollout `JobRun`.
    CreateChildRolloutJobRun create_child_rollout_job_run = 12
        [(google.api.field_behavior) = OUTPUT_ONLY];

    // Output only. Information specific to an advanceChildRollout `JobRun`
    AdvanceChildRolloutJobRun advance_child_rollout_job_run = 13
        [(google.api.field_behavior) = OUTPUT_ONLY];
  }

  // Output only. This checksum is computed by the server based on the value of
  // other fields, and may be sent on update and delete requests to ensure the
  // client has an up-to-date value before proceeding.
  string etag = 11 [(google.api.field_behavior) = OUTPUT_ONLY];
}

// DeployJobRun contains information specific to a deploy `JobRun`.
message DeployJobRun {
  // Well-known deploy failures.
  enum FailureCause {
    // No reason for failure is specified.
    FAILURE_CAUSE_UNSPECIFIED = 0;

    // Cloud Build is not available, either because it is not enabled or because
    // Cloud Deploy has insufficient permissions. See [Required
    // permission](https://cloud.google.com/deploy/docs/cloud-deploy-service-account#required_permissions).
    CLOUD_BUILD_UNAVAILABLE = 1;

    // The deploy operation did not complete successfully; check Cloud Build
    // logs.
    EXECUTION_FAILED = 2;

    // The deploy job run did not complete within the alloted time.
    DEADLINE_EXCEEDED = 3;

    // There were missing resources in the runtime environment required for a
    // canary deployment. Check the Cloud Build logs for more information.
    MISSING_RESOURCES_FOR_CANARY = 4;

    // Cloud Build failed to fulfill Cloud Deploy's request. See failure_message
    // for additional details.
    CLOUD_BUILD_REQUEST_FAILED = 5;
  }

  // Output only. The resource name of the Cloud Build `Build` object that is
  // used to deploy. Format is
  // `projects/{project}/locations/{location}/builds/{build}`.
  string build = 1 [
    (google.api.field_behavior) = OUTPUT_ONLY,
    (google.api.resource_reference) = {
      type: "cloudbuild.googleapis.com/Build"
    }
  ];

  // Output only. The reason the deploy failed. This will always be unspecified
  // while the deploy is in progress or if it succeeded.
  FailureCause failure_cause = 2 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Additional information about the deploy failure, if available.
  string failure_message = 3 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Metadata containing information about the deploy job run.
  DeployJobRunMetadata metadata = 4 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The artifact of a deploy job run, if available.
  DeployArtifact artifact = 5 [(google.api.field_behavior) = OUTPUT_ONLY];
}

// VerifyJobRun contains information specific to a verify `JobRun`.
message VerifyJobRun {
  // Well-known verify failures.
  enum FailureCause {
    // No reason for failure is specified.
    FAILURE_CAUSE_UNSPECIFIED = 0;

    // Cloud Build is not available, either because it is not enabled or because
    // Cloud Deploy has insufficient permissions. See [required
    // permission](https://cloud.google.com/deploy/docs/cloud-deploy-service-account#required_permissions).
    CLOUD_BUILD_UNAVAILABLE = 1;

    // The verify operation did not complete successfully; check Cloud Build
    // logs.
    EXECUTION_FAILED = 2;

    // The verify job run did not complete within the alloted time.
    DEADLINE_EXCEEDED = 3;

    // No Skaffold verify configuration was found.
    VERIFICATION_CONFIG_NOT_FOUND = 4;

    // Cloud Build failed to fulfill Cloud Deploy's request. See failure_message
    // for additional details.
    CLOUD_BUILD_REQUEST_FAILED = 5;
  }

  // Output only. The resource name of the Cloud Build `Build` object that is
  // used to verify. Format is
  // `projects/{project}/locations/{location}/builds/{build}`.
  string build = 1 [
    (google.api.field_behavior) = OUTPUT_ONLY,
    (google.api.resource_reference) = {
      type: "cloudbuild.googleapis.com/Build"
    }
  ];

  // Output only. URI of a directory containing the verify artifacts. This
  // contains the Skaffold event log.
  string artifact_uri = 2 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. File path of the Skaffold event log relative to the artifact
  // URI.
  string event_log_path = 3 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The reason the verify failed. This will always be unspecified
  // while the verify is in progress or if it succeeded.
  FailureCause failure_cause = 4 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Additional information about the verify failure, if available.
  string failure_message = 5 [(google.api.field_behavior) = OUTPUT_ONLY];
}

// PredeployJobRun contains information specific to a predeploy `JobRun`.
message PredeployJobRun {
  // Well-known predeploy failures.
  enum FailureCause {
    // No reason for failure is specified.
    FAILURE_CAUSE_UNSPECIFIED = 0;

    // Cloud Build is not available, either because it is not enabled or because
    // Cloud Deploy has insufficient permissions. See [required
    // permission](https://cloud.google.com/deploy/docs/cloud-deploy-service-account#required_permissions).
    CLOUD_BUILD_UNAVAILABLE = 1;

    // The predeploy operation did not complete successfully; check Cloud Build
    // logs.
    EXECUTION_FAILED = 2;

    // The predeploy job run did not complete within the alloted time.
    DEADLINE_EXCEEDED = 3;

    // Cloud Build failed to fulfill Cloud Deploy's request. See failure_message
    // for additional details.
    CLOUD_BUILD_REQUEST_FAILED = 4;
  }

  // Output only. The resource name of the Cloud Build `Build` object that is
  // used to execute the custom actions associated with the predeploy Job.
  // Format is `projects/{project}/locations/{location}/builds/{build}`.
  string build = 1 [
    (google.api.field_behavior) = OUTPUT_ONLY,
    (google.api.resource_reference) = {
      type: "cloudbuild.googleapis.com/Build"
    }
  ];

  // Output only. The reason the predeploy failed. This will always be
  // unspecified while the predeploy is in progress or if it succeeded.
  FailureCause failure_cause = 2 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Additional information about the predeploy failure, if
  // available.
  string failure_message = 3 [(google.api.field_behavior) = OUTPUT_ONLY];
}

// PostdeployJobRun contains information specific to a postdeploy `JobRun`.
message PostdeployJobRun {
  // Well-known postdeploy failures.
  enum FailureCause {
    // No reason for failure is specified.
    FAILURE_CAUSE_UNSPECIFIED = 0;

    // Cloud Build is not available, either because it is not enabled or because
    // Cloud Deploy has insufficient permissions. See [required
    // permission](https://cloud.google.com/deploy/docs/cloud-deploy-service-account#required_permissions).
    CLOUD_BUILD_UNAVAILABLE = 1;

    // The postdeploy operation did not complete successfully; check Cloud Build
    // logs.
    EXECUTION_FAILED = 2;

    // The postdeploy job run did not complete within the alloted time.
    DEADLINE_EXCEEDED = 3;

    // Cloud Build failed to fulfill Cloud Deploy's request. See failure_message
    // for additional details.
    CLOUD_BUILD_REQUEST_FAILED = 4;
  }

  // Output only. The resource name of the Cloud Build `Build` object that is
  // used to execute the custom actions associated with the postdeploy Job.
  // Format is `projects/{project}/locations/{location}/builds/{build}`.
  string build = 1 [
    (google.api.field_behavior) = OUTPUT_ONLY,
    (google.api.resource_reference) = {
      type: "cloudbuild.googleapis.com/Build"
    }
  ];

  // Output only. The reason the postdeploy failed. This will always be
  // unspecified while the postdeploy is in progress or if it succeeded.
  FailureCause failure_cause = 2 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Additional information about the postdeploy failure, if
  // available.
  string failure_message = 3 [(google.api.field_behavior) = OUTPUT_ONLY];
}

// CreateChildRolloutJobRun contains information specific to a
// createChildRollout `JobRun`.
message CreateChildRolloutJobRun {
  // Output only. Name of the `ChildRollout`. Format is
  // `projects/{project}/locations/{location}/deliveryPipelines/{deliveryPipeline}/releases/{release}/rollouts/[a-z][a-z0-9\-]{0,62}`.
  string rollout = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The ID of the childRollout Phase initiated by this JobRun.
  string rollout_phase_id = 2 [(google.api.field_behavior) = OUTPUT_ONLY];
}

// AdvanceChildRolloutJobRun contains information specific to a
// advanceChildRollout `JobRun`.
message AdvanceChildRolloutJobRun {
  // Output only. Name of the `ChildRollout`. Format is
  // `projects/{project}/locations/{location}/deliveryPipelines/{deliveryPipeline}/releases/{release}/rollouts/[a-z][a-z0-9\-]{0,62}`.
  string rollout = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. the ID of the ChildRollout's Phase.
  string rollout_phase_id = 2 [(google.api.field_behavior) = OUTPUT_ONLY];
}

// ListJobRunsRequest is the request object used by `ListJobRuns`.
message ListJobRunsRequest {
  // Required. The `Rollout` which owns this collection of `JobRun` objects.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "clouddeploy.googleapis.com/Rollout"
    }
  ];

  // Optional. The maximum number of `JobRun` objects to return. The service may
  // return fewer than this value. If unspecified, at most 50 `JobRun` objects
  // will be returned. The maximum value is 1000; values above 1000 will be set
  // to 1000.
  int32 page_size = 2 [(google.api.field_behavior) = OPTIONAL];

  // Optional. A page token, received from a previous `ListJobRuns` call.
  // Provide this to retrieve the subsequent page.
  //
  // When paginating, all other provided parameters match the call that provided
  // the page token.
  string page_token = 3 [(google.api.field_behavior) = OPTIONAL];

  // Optional. Filter results to be returned. See https://google.aip.dev/160 for
  // more details.
  string filter = 4 [(google.api.field_behavior) = OPTIONAL];

  // Optional. Field to sort by. See https://google.aip.dev/132#ordering for
  // more details.
  string order_by = 5 [(google.api.field_behavior) = OPTIONAL];
}

// ListJobRunsResponse is the response object returned by `ListJobRuns`.
message ListJobRunsResponse {
  // The `JobRun` objects.
  repeated JobRun job_runs = 1;

  // A token, which 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;
}

// GetJobRunRequest is the request object used by `GetJobRun`.
message GetJobRunRequest {
  // Required. Name of the `JobRun`. Format must be
  // `projects/{project_id}/locations/{location_name}/deliveryPipelines/{pipeline_name}/releases/{release_name}/rollouts/{rollout_name}/jobRuns/{job_run_name}`.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "clouddeploy.googleapis.com/JobRun"
    }
  ];
}

// The request object used by `TerminateJobRun`.
message TerminateJobRunRequest {
  // Required. Name of the `JobRun`. Format must be
  // `projects/{project}/locations/{location}/deliveryPipelines/{deliveryPipeline}/releases/{release}/rollouts/{rollout}/jobRuns/{jobRun}`.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "clouddeploy.googleapis.com/JobRun"
    }
  ];
}

// The response object from `TerminateJobRun`.
message TerminateJobRunResponse {}

// Service-wide configuration.
message Config {
  option (google.api.resource) = {
    type: "clouddeploy.googleapis.com/Config"
    pattern: "projects/{project}/locations/{location}/config"
  };

  // Name of the configuration.
  string name = 1;

  // All supported versions of Skaffold.
  repeated SkaffoldVersion supported_versions = 2;

  // Default Skaffold version that is assigned when a Release is created without
  // specifying a Skaffold version.
  string default_skaffold_version = 3;
}

// Details of a supported Skaffold version.
message SkaffoldVersion {
  // Release version number. For example, "1.20.3".
  string version = 1;

  // The time at which this version of skaffold will enter maintenance mode.
  google.protobuf.Timestamp maintenance_mode_time = 3;

  // The time at which this version of skaffold will no longer be supported.
  google.protobuf.Timestamp support_expiration_time = 4;

  // Date when this version is expected to no longer be supported.
  google.type.Date support_end_date = 2;
}

// Request to get a configuration.
message GetConfigRequest {
  // Required. Name of requested configuration.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "clouddeploy.googleapis.com/Config"
    }
  ];
}

// An `Automation` resource in the Cloud Deploy API.
//
// An `Automation` enables the automation of manually driven actions for
// a Delivery Pipeline, which includes Release promotion amongst Targets,
// Rollout repair and Rollout deployment strategy advancement. The intention
// of Automation is to reduce manual intervention in the continuous delivery
// process.
message Automation {
  option (google.api.resource) = {
    type: "clouddeploy.googleapis.com/Automation"
    pattern: "projects/{project}/locations/{location}/deliveryPipelines/{delivery_pipeline}/automations/{automation}"
    style: DECLARATIVE_FRIENDLY
  };

  // Output only. Name of the `Automation`. Format is
  // `projects/{project}/locations/{location}/deliveryPipelines/{delivery_pipeline}/automations/{automation}`.
  string name = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Unique identifier of the `Automation`.
  string uid = 2 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Optional. Description of the `Automation`. Max length is 255 characters.
  string description = 3 [(google.api.field_behavior) = OPTIONAL];

  // Output only. Time at which the automation was created.
  google.protobuf.Timestamp create_time = 4
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Time at which the automation was updated.
  google.protobuf.Timestamp update_time = 5
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Optional. User annotations. These attributes can only be set and used by
  // the user, and not by Cloud Deploy. Annotations must meet the following
  // constraints:
  //
  // * Annotations are key/value pairs.
  // * Valid annotation keys have two segments: an optional prefix and name,
  // separated by a slash (`/`).
  // * The name segment is required and must be 63 characters or less,
  // beginning and ending with an alphanumeric character (`[a-z0-9A-Z]`) with
  // dashes (`-`), underscores (`_`), dots (`.`), and alphanumerics between.
  // * The prefix is optional. If specified, the prefix must be a DNS subdomain:
  // a series of DNS labels separated by dots(`.`), not longer than 253
  // characters in total, followed by a slash (`/`).
  //
  // See
  // https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/#syntax-and-character-set
  // for more details.
  map<string, string> annotations = 6 [(google.api.field_behavior) = OPTIONAL];

  // Optional. Labels are attributes that can be set and used by both the
  // user and by Cloud Deploy. Labels must meet the following constraints:
  //
  // * Keys and values can contain only lowercase letters, numeric characters,
  // underscores, and dashes.
  // * All characters must use UTF-8 encoding, and international characters are
  // allowed.
  // * Keys must start with a lowercase letter or international character.
  // * Each resource is limited to a maximum of 64 labels.
  //
  // Both keys and values are additionally constrained to be <= 63 characters.
  map<string, string> labels = 7 [(google.api.field_behavior) = OPTIONAL];

  // Optional. The weak etag of the `Automation` resource.
  // This checksum is computed by the server based on the value of other
  // fields, and may be sent on update and delete requests to ensure the
  // client has an up-to-date value before proceeding.
  string etag = 8 [(google.api.field_behavior) = OPTIONAL];

  // Optional. When Suspended, automation is deactivated from execution.
  bool suspended = 9 [(google.api.field_behavior) = OPTIONAL];

  // Required. Email address of the user-managed IAM service account that
  // creates Cloud Deploy release and rollout resources.
  string service_account = 10 [(google.api.field_behavior) = REQUIRED];

  // Required. Selected resources to which the automation will be applied.
  AutomationResourceSelector selector = 11
      [(google.api.field_behavior) = REQUIRED];

  // Required. List of Automation rules associated with the Automation resource.
  // Must have at least one rule and limited to 250 rules per Delivery Pipeline.
  // Note: the order of the rules here is not the same as the order of
  // execution.
  repeated AutomationRule rules = 14 [(google.api.field_behavior) = REQUIRED];
}

// AutomationResourceSelector contains the information to select the resources
// to which an Automation is going to be applied.
message AutomationResourceSelector {
  // Contains attributes about a target.
  repeated TargetAttribute targets = 1;
}

// `AutomationRule` defines the automation activities.
message AutomationRule {
  // The configuration of the Automation rule.
  oneof rule {
    // Optional. `PromoteReleaseRule` will automatically promote a release from
    // the current target to a specified target.
    PromoteReleaseRule promote_release_rule = 1
        [(google.api.field_behavior) = OPTIONAL];

    // Optional. The `AdvanceRolloutRule` will automatically advance a
    // successful Rollout.
    AdvanceRolloutRule advance_rollout_rule = 2
        [(google.api.field_behavior) = OPTIONAL];

    // Optional. The `RepairRolloutRule` will automatically repair a failed
    // rollout.
    RepairRolloutRule repair_rollout_rule = 3
        [(google.api.field_behavior) = OPTIONAL];
  }
}

// `PromoteRelease` rule will automatically promote a release from the current
// target to a specified target.
message PromoteReleaseRule {
  // Required. ID of the rule. This id must be unique in the `Automation`
  // resource to which this rule belongs. The format is `[a-z][a-z0-9\-]{0,62}`.
  string id = 1 [(google.api.field_behavior) = REQUIRED];

  // Optional. How long the release need to be paused until being promoted to
  // the next target.
  google.protobuf.Duration wait = 2 [(google.api.field_behavior) = OPTIONAL];

  // Optional. The ID of the stage in the pipeline to which this `Release` is
  // deploying. If unspecified, default it to the next stage in the promotion
  // flow. The value of this field could be one of the following:
  // * The last segment of a target name. It only needs the ID to determine
  // if the target is one of the stages in the promotion sequence defined
  // in the pipeline.
  // * "@next", the next target in the promotion sequence.
  string destination_target_id = 7 [(google.api.field_behavior) = OPTIONAL];

  // Output only. Information around the state of the Automation rule.
  AutomationRuleCondition condition = 5
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Optional. The starting phase of the rollout created by this operation.
  // Default to the first phase.
  string destination_phase = 8 [(google.api.field_behavior) = OPTIONAL];
}

// The `AdvanceRollout` automation rule will automatically advance a successful
// Rollout to the next phase.
message AdvanceRolloutRule {
  // Required. ID of the rule. This id must be unique in the `Automation`
  // resource to which this rule belongs. The format is `[a-z][a-z0-9\-]{0,62}`.
  string id = 1 [(google.api.field_behavior) = REQUIRED];

  // Optional. Proceeds only after phase name matched any one in the list.
  // This value must consist of lower-case letters, numbers, and hyphens,
  // start with a letter and end with a letter or a number, and have a max
  // length of 63 characters. In other words, it must match the following
  // regex: `^[a-z]([a-z0-9-]{0,61}[a-z0-9])?$`.
  repeated string source_phases = 6 [(google.api.field_behavior) = OPTIONAL];

  // Optional. How long to wait after a rollout is finished.
  google.protobuf.Duration wait = 3 [(google.api.field_behavior) = OPTIONAL];

  // Output only. Information around the state of the Automation rule.
  AutomationRuleCondition condition = 5
      [(google.api.field_behavior) = OUTPUT_ONLY];
}

// The `RepairRolloutRule` automation rule will automatically repair a failed
// `Rollout`.
message RepairRolloutRule {
  // Required. ID of the rule. This id must be unique in the `Automation`
  // resource to which this rule belongs. The format is `[a-z][a-z0-9\-]{0,62}`.
  string id = 1 [(google.api.field_behavior) = REQUIRED];

  // Optional. Phases within which jobs are subject to automatic repair actions
  // on failure. Proceeds only after phase name matched any one in the list, or
  // for all phases if unspecified. This value must consist of lower-case
  // letters, numbers, and hyphens, start with a letter and end with a letter or
  // a number, and have a max length of 63 characters. In other words, it must
  // match the following regex: `^[a-z]([a-z0-9-]{0,61}[a-z0-9])?$`.
  repeated string source_phases = 2 [(google.api.field_behavior) = OPTIONAL];

  // Optional. Jobs to repair. Proceeds only after job name matched any one in
  // the list, or for all jobs if unspecified or empty. The phase that includes
  // the job must match the phase ID specified in `source_phase`. This value
  // must consist of lower-case letters, numbers, and hyphens, start with a
  // letter and end with a letter or a number, and have a max length of 63
  // characters. In other words, it must match the following regex:
  // `^[a-z]([a-z0-9-]{0,61}[a-z0-9])?$`.
  repeated string jobs = 3 [(google.api.field_behavior) = OPTIONAL];

  // Required. Defines the types of automatic repair actions for failed jobs.
  repeated RepairMode repair_modes = 4 [(google.api.field_behavior) = REQUIRED];

  // Output only. Information around the state of the 'Automation' rule.
  AutomationRuleCondition condition = 6
      [(google.api.field_behavior) = OUTPUT_ONLY];
}

// Configuration of the repair action.
message RepairMode {
  // The repair action to perform.
  oneof mode {
    // Optional. Retries a failed job.
    Retry retry = 1 [(google.api.field_behavior) = OPTIONAL];

    // Optional. Rolls back a `Rollout`.
    Rollback rollback = 2 [(google.api.field_behavior) = OPTIONAL];
  }
}

// Retries the failed job.
message Retry {
  // Required. Total number of retries. Retry will skipped if set to 0; The
  // minimum value is 1, and the maximum value is 10.
  int64 attempts = 1 [(google.api.field_behavior) = REQUIRED];

  // Optional. How long to wait for the first retry. Default is 0, and the
  // maximum value is 14d.
  google.protobuf.Duration wait = 2 [(google.api.field_behavior) = OPTIONAL];

  // Optional. The pattern of how wait time will be increased. Default is
  // linear. Backoff mode will be ignored if `wait` is 0.
  BackoffMode backoff_mode = 3 [(google.api.field_behavior) = OPTIONAL];
}

// Rolls back a `Rollout`.
message Rollback {
  // Optional. The starting phase ID for the `Rollout`. If unspecified, the
  // `Rollout` will start in the stable phase.
  string destination_phase = 1 [(google.api.field_behavior) = OPTIONAL];
}

// `AutomationRuleCondition` contains conditions relevant to an
// `Automation` rule.
message AutomationRuleCondition {
  // Optional. Details around targets enumerated in the rule.
  TargetsPresentCondition targets_present_condition = 1
      [(google.api.field_behavior) = OPTIONAL];
}

// The request object for `CreateAutomation`.
message CreateAutomationRequest {
  // Required. The parent collection in which the `Automation` should be
  // created. Format should be
  // `projects/{project_id}/locations/{location_name}/deliveryPipelines/{pipeline_name}`.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "clouddeploy.googleapis.com/Automation"
    }
  ];

  // Required. ID of the `Automation`.
  string automation_id = 2 [(google.api.field_behavior) = REQUIRED];

  // Required. The `Automation` to create.
  Automation automation = 3 [(google.api.field_behavior) = REQUIRED];

  // Optional. A request ID to identify requests. Specify a unique request ID
  // so that if you must retry your request, the server will know to ignore
  // the request if it has already been completed. The server will guarantee
  // that for at least 60 minutes since the first request.
  //
  // For example, consider a situation where you make an initial request and the
  // request times out. If you make the request again with the same request ID,
  // the server can check if original operation with the same request ID was
  // received, and if so, will ignore the second request. This prevents clients
  // from accidentally creating duplicate commitments.
  //
  // The request ID must be a valid UUID with the exception that zero UUID is
  // not supported (00000000-0000-0000-0000-000000000000).
  string request_id = 4 [(google.api.field_behavior) = OPTIONAL];

  // Optional. If set to true, the request is validated and the user is provided
  // with an expected result, but no actual change is made.
  bool validate_only = 5 [(google.api.field_behavior) = OPTIONAL];
}

// The request object for `UpdateAutomation`.
message UpdateAutomationRequest {
  // Required. Field mask is used to specify the fields to be overwritten in the
  // `Automation` resource by the update.
  // The fields specified in the update_mask are relative to the resource, not
  // the full request. A field will be overwritten if it is in the mask. If the
  // user does not provide a mask then all fields will be overwritten.
  google.protobuf.FieldMask update_mask = 1
      [(google.api.field_behavior) = REQUIRED];

  // Required. The `Automation` to update.
  Automation automation = 2 [(google.api.field_behavior) = REQUIRED];

  // Optional. A request ID to identify requests. Specify a unique request ID
  // so that if you must retry your request, the server will know to ignore
  // the request if it has already been completed. The server will guarantee
  // that for at least 60 minutes since the first request.
  //
  // For example, consider a situation where you make an initial request and the
  // request times out. If you make the request again with the same request ID,
  // the server can check if original operation with the same request ID was
  // received, and if so, will ignore the second request. This prevents clients
  // from accidentally creating duplicate commitments.
  //
  // The request ID must be a valid UUID with the exception that zero UUID is
  // not supported (00000000-0000-0000-0000-000000000000).
  string request_id = 3 [(google.api.field_behavior) = OPTIONAL];

  // Optional. If set to true, updating a `Automation` that does not exist will
  // result in the creation of a new `Automation`.
  bool allow_missing = 4 [(google.api.field_behavior) = OPTIONAL];

  // Optional. If set to true, the request is validated and the user is provided
  // with an expected result, but no actual change is made.
  bool validate_only = 5 [(google.api.field_behavior) = OPTIONAL];
}

// The request object for `DeleteAutomation`.
message DeleteAutomationRequest {
  // Required. The name of the `Automation` to delete. Format should be
  // `projects/{project_id}/locations/{location_name}/deliveryPipelines/{pipeline_name}/automations/{automation_name}`.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "clouddeploy.googleapis.com/Automation"
    }
  ];

  // Optional. A request ID to identify requests. Specify a unique request ID
  // so that if you must retry your request, the server will know to ignore
  // the request if it has already been completed. The server will guarantee
  // that for at least 60 minutes after the first request.
  //
  // For example, consider a situation where you make an initial request and the
  // request times out. If you make the request again with the same request ID,
  // the server can check if original operation with the same request ID was
  // received, and if so, will ignore the second request. This prevents clients
  // from accidentally creating duplicate commitments.
  //
  // The request ID must be a valid UUID with the exception that zero UUID is
  // not supported (00000000-0000-0000-0000-000000000000).
  string request_id = 2 [(google.api.field_behavior) = OPTIONAL];

  // Optional. If set to true, then deleting an already deleted or non-existing
  // `Automation` will succeed.
  bool allow_missing = 3 [(google.api.field_behavior) = OPTIONAL];

  // Optional. If set, validate the request and verify whether the resource
  // exists, but do not actually post it.
  bool validate_only = 4 [(google.api.field_behavior) = OPTIONAL];

  // Optional. The weak etag of the request.
  // This checksum is computed by the server based on the value of other
  // fields, and may be sent on update and delete requests to ensure the
  // client has an up-to-date value before proceeding.
  string etag = 5 [(google.api.field_behavior) = OPTIONAL];
}

// The request object for `ListAutomations`.
message ListAutomationsRequest {
  // Required. The parent, which owns this collection of automations. Format
  // must be
  // `projects/{project_id}/locations/{location_name}/deliveryPipelines/{pipeline_name}`.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "clouddeploy.googleapis.com/Automation"
    }
  ];

  // The maximum number of automations to return. The service may return
  // fewer than this value. If unspecified, at most 50 automations will
  // be returned. The maximum value is 1000; values above 1000 will be set
  // to 1000.
  int32 page_size = 2;

  // A page token, received from a previous `ListAutomations` call.
  // Provide this to retrieve the subsequent page.
  //
  // When paginating, all other provided parameters match
  // the call that provided the page token.
  string page_token = 3;

  // Filter automations to be returned. All fields can be used in the
  // filter.
  string filter = 4;

  // Field to sort by.
  string order_by = 5;
}

// The response object from `ListAutomations`.
message ListAutomationsResponse {
  // The `Automations` objects.
  repeated Automation automations = 1;

  // A token, which 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;
}

// The request object for `GetAutomation`
message GetAutomationRequest {
  // Required. Name of the `Automation`. Format must be
  // `projects/{project_id}/locations/{location_name}/deliveryPipelines/{pipeline_name}/automations/{automation_name}`.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "clouddeploy.googleapis.com/Automation"
    }
  ];
}

// An `AutomationRun` resource in the Cloud Deploy API.
//
// An `AutomationRun` represents an automation execution instance of an
// automation rule.
message AutomationRun {
  option (google.api.resource) = {
    type: "clouddeploy.googleapis.com/AutomationRun"
    pattern: "projects/{project}/locations/{location}/deliveryPipelines/{delivery_pipeline}/automationRuns/{automation_run}"
  };

  // Valid state of an `AutomationRun`.
  enum State {
    // The `AutomationRun` has an unspecified state.
    STATE_UNSPECIFIED = 0;

    // The `AutomationRun` has succeeded.
    SUCCEEDED = 1;

    // The `AutomationRun` was cancelled.
    CANCELLED = 2;

    // The `AutomationRun` has failed.
    FAILED = 3;

    // The `AutomationRun` is in progress.
    IN_PROGRESS = 4;

    // The `AutomationRun` is pending.
    PENDING = 5;
  }

  // Output only. Name of the `AutomationRun`. Format is
  // `projects/{project}/locations/{location}/deliveryPipelines/{delivery_pipeline}/automationRuns/{automation_run}`.
  string name = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Time at which the `AutomationRun` was created.
  google.protobuf.Timestamp create_time = 2
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Time at which the automationRun was updated.
  google.protobuf.Timestamp update_time = 3
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The weak etag of the `AutomationRun` resource.
  // This checksum is computed by the server based on the value of other
  // fields, and may be sent on update and delete requests to ensure the
  // client has an up-to-date value before proceeding.
  string etag = 4 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Email address of the user-managed IAM service account that
  // performs the operations against Cloud Deploy resources.
  string service_account = 5 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Snapshot of the Automation taken at AutomationRun creation
  // time.
  Automation automation_snapshot = 6
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The ID of the target that represents the promotion stage that
  // initiates the `AutomationRun`. The value of this field is the last segment
  // of a target name.
  string target_id = 7 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Current state of the `AutomationRun`.
  State state = 8 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Explains the current state of the `AutomationRun`. Present
  // only an explanation is needed.
  string state_description = 9 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Time the `AutomationRun` will expire. An `AutomationRun` will
  // expire after 14 days from its creation date.
  google.protobuf.Timestamp expire_time = 11
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The ID of the automation rule that initiated the operation.
  string rule_id = 12 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The ID of the automation that initiated the operation.
  string automation_id = 15 [(google.api.field_behavior) = OUTPUT_ONLY];

  // The operation that the `AutomationRun` will perform.
  oneof operation {
    // Output only. Promotes a release to a specified 'Target'.
    PromoteReleaseOperation promote_release_operation = 13
        [(google.api.field_behavior) = OUTPUT_ONLY];

    // Output only. Advances a rollout to the next phase.
    AdvanceRolloutOperation advance_rollout_operation = 14
        [(google.api.field_behavior) = OUTPUT_ONLY];

    // Output only. Repairs a failed 'Rollout'.
    RepairRolloutOperation repair_rollout_operation = 17
        [(google.api.field_behavior) = OUTPUT_ONLY];
  }

  // Output only. Earliest time the `AutomationRun` will attempt to resume.
  // Wait-time is configured by `wait` in automation rule.
  google.protobuf.Timestamp wait_until_time = 16
      [(google.api.field_behavior) = OUTPUT_ONLY];
}

// Contains the information of an automated promote-release operation.
message PromoteReleaseOperation {
  // Output only. The ID of the target that represents the promotion stage to
  // which the release will be promoted. The value of this field is the last
  // segment of a target name.
  string target_id = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. How long the operation will be paused.
  google.protobuf.Duration wait = 2 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The name of the rollout that initiates the `AutomationRun`.
  string rollout = 3 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The starting phase of the rollout created by this operation.
  string phase = 4 [(google.api.field_behavior) = OUTPUT_ONLY];
}

// Contains the information of an automated advance-rollout operation.
message AdvanceRolloutOperation {
  // Output only. The phase of a deployment that initiated the operation.
  string source_phase = 5 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. How long the operation will be paused.
  google.protobuf.Duration wait = 2 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The name of the rollout that initiates the `AutomationRun`.
  string rollout = 3 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The phase to which the rollout will be advanced to.
  string destination_phase = 4 [(google.api.field_behavior) = OUTPUT_ONLY];
}

// Contains the information for an automated `repair rollout` operation.
message RepairRolloutOperation {
  // Output only. The name of the rollout that initiates the `AutomationRun`.
  string rollout = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The index of the current repair action in the repair sequence.
  int64 current_repair_mode_index = 2
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Records of the repair attempts. Each repair phase may have
  // multiple retry attempts or single rollback attempt.
  repeated RepairPhase repair_phases = 3
      [(google.api.field_behavior) = OUTPUT_ONLY];
}

// RepairPhase tracks the repair attempts that have been made for
// each `RepairMode` specified in the `Automation` resource.
message RepairPhase {
  oneof repair_phase {
    // Output only. Records of the retry attempts for retry repair mode.
    RetryPhase retry = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

    // Output only. Rollback attempt for rollback repair mode .
    RollbackAttempt rollback = 2 [(google.api.field_behavior) = OUTPUT_ONLY];
  }
}

// RetryPhase contains the retry attempts and the metadata for initiating a
// new attempt.
message RetryPhase {
  // Output only. The number of attempts that have been made.
  int64 total_attempts = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The pattern of how the wait time of the retry attempt is
  // calculated.
  BackoffMode backoff_mode = 2 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The phase ID of the phase that includes the job being retried.
  string phase_id = 3 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The job ID for the Job to retry.
  string job_id = 4 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Detail of a retry action.
  repeated RetryAttempt attempts = 5
      [(google.api.field_behavior) = OUTPUT_ONLY];
}

// RetryAttempt represents an action of retrying the failed Cloud Deploy job.
message RetryAttempt {
  // Output only. The index of this retry attempt.
  int64 attempt = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. How long the operation will be paused.
  google.protobuf.Duration wait = 2 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Valid state of this retry action.
  RepairState state = 5 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Description of the state of the Retry.
  string state_desc = 6 [(google.api.field_behavior) = OUTPUT_ONLY];
}

// RollbackAttempt represents an action of rolling back a Cloud Deploy 'Target'.
message RollbackAttempt {
  // Output only. The phase to which the rollout will be rolled back to.
  string destination_phase = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. ID of the rollback `Rollout` to create.
  string rollout_id = 2 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Valid state of this rollback action.
  RepairState state = 3 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Description of the state of the Rollback.
  string state_desc = 4 [(google.api.field_behavior) = OUTPUT_ONLY];
}

// The request object for `ListAutomationRuns`.
message ListAutomationRunsRequest {
  // Required. The parent, which owns this collection of automationRuns. Format
  // must be
  // `projects/{project}/locations/{location}/deliveryPipelines/{delivery_pipeline}`.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "clouddeploy.googleapis.com/AutomationRun"
    }
  ];

  // The maximum number of automationRuns to return. The service may return
  // fewer than this value. If unspecified, at most 50 automationRuns will
  // be returned. The maximum value is 1000; values above 1000 will be set
  // to 1000.
  int32 page_size = 2;

  // A page token, received from a previous `ListAutomationRuns` call.
  // Provide this to retrieve the subsequent page.
  //
  // When paginating, all other provided parameters match
  // the call that provided the page token.
  string page_token = 3;

  // Filter automationRuns to be returned. All fields can be used in the
  // filter.
  string filter = 4;

  // Field to sort by.
  string order_by = 5;
}

// The response object from `ListAutomationRuns`.
message ListAutomationRunsResponse {
  // The `AutomationRuns` objects.
  repeated AutomationRun automation_runs = 1;

  // A token, which 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;
}

// The request object for `GetAutomationRun`
message GetAutomationRunRequest {
  // Required. Name of the `AutomationRun`. Format must be
  // `projects/{project}/locations/{location}/deliveryPipelines/{delivery_pipeline}/automationRuns/{automation_run}`.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "clouddeploy.googleapis.com/AutomationRun"
    }
  ];
}

// The request object used by `CancelAutomationRun`.
message CancelAutomationRunRequest {
  // Required. Name of the `AutomationRun`. Format is
  // `projects/{project}/locations/{location}/deliveryPipelines/{delivery_pipeline}/automationRuns/{automation_run}`.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "clouddeploy.googleapis.com/AutomationRun"
    }
  ];
}

// The response object from `CancelAutomationRun`.
message CancelAutomationRunResponse {}

// The support state of a specific Skaffold version.
enum SkaffoldSupportState {
  // Default value. This value is unused.
  SKAFFOLD_SUPPORT_STATE_UNSPECIFIED = 0;

  // This skaffold version is currently supported.
  SKAFFOLD_SUPPORT_STATE_SUPPORTED = 1;

  // This skaffold version is in maintenance mode.
  SKAFFOLD_SUPPORT_STATE_MAINTENANCE_MODE = 2;

  // This skaffold version is no longer supported.
  SKAFFOLD_SUPPORT_STATE_UNSUPPORTED = 3;
}

// The pattern of how wait time is increased.
enum BackoffMode {
  // No WaitMode is specified.
  BACKOFF_MODE_UNSPECIFIED = 0;

  // Increases the wait time linearly.
  BACKOFF_MODE_LINEAR = 1;

  // Increases the wait time exponentially.
  BACKOFF_MODE_EXPONENTIAL = 2;
}

// Valid state of a repair attempt.
enum RepairState {
  // The `repair` has an unspecified state.
  REPAIR_STATE_UNSPECIFIED = 0;

  // The `repair` action has succeeded.
  REPAIR_STATE_SUCCEEDED = 1;

  // The `repair` action was cancelled.
  REPAIR_STATE_CANCELLED = 2;

  // The `repair` action has failed.
  REPAIR_STATE_FAILED = 3;

  // The `repair` action is in progress.
  REPAIR_STATE_IN_PROGRESS = 4;

  // The `repair` action is pending.
  REPAIR_STATE_PENDING = 5;

  // The `repair` action was skipped.
  REPAIR_STATE_SKIPPED = 6;
}
