# Copyright 2019 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
#
#     https://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.


module Google
  module Cloud
    module Dataproc
      module V1beta2
        # Describes an autoscaling policy for Dataproc cluster autoscaler.
        # @!attribute [rw] id
        #   @return [String]
        #     Required. The policy id.
        #
        #     The id must contain only letters (a-z, A-Z), numbers (0-9),
        #     underscores (_), and hyphens (-). Cannot begin or end with underscore
        #     or hyphen. Must consist of between 3 and 50 characters.
        # @!attribute [rw] name
        #   @return [String]
        #     Output only. The "resource name" of the autoscaling policy, as described
        #     in https://cloud.google.com/apis/design/resource_names.
        #
        #     * For `projects.regions.autoscalingPolicies`, the resource name of the
        #       policy has the following format:
        #       `projects/{project_id}/regions/{region}/autoscalingPolicies/{policy_id}`
        #
        #     * For `projects.locations.autoscalingPolicies`, the resource name of the
        #       policy has the following format:
        #       `projects/{project_id}/locations/{location}/autoscalingPolicies/{policy_id}`
        # @!attribute [rw] basic_algorithm
        #   @return [Google::Cloud::Dataproc::V1beta2::BasicAutoscalingAlgorithm]
        # @!attribute [rw] worker_config
        #   @return [Google::Cloud::Dataproc::V1beta2::InstanceGroupAutoscalingPolicyConfig]
        #     Required. Describes how the autoscaler will operate for primary workers.
        # @!attribute [rw] secondary_worker_config
        #   @return [Google::Cloud::Dataproc::V1beta2::InstanceGroupAutoscalingPolicyConfig]
        #     Optional. Describes how the autoscaler will operate for secondary workers.
        class AutoscalingPolicy; end

        # Basic algorithm for autoscaling.
        # @!attribute [rw] yarn_config
        #   @return [Google::Cloud::Dataproc::V1beta2::BasicYarnAutoscalingConfig]
        #     Required. YARN autoscaling configuration.
        # @!attribute [rw] cooldown_period
        #   @return [Google::Protobuf::Duration]
        #     Optional. Duration between scaling events. A scaling period starts after
        #     the update operation from the previous event has completed.
        #
        #     Bounds: [2m, 1d]. Default: 2m.
        class BasicAutoscalingAlgorithm; end

        # Basic autoscaling configurations for YARN.
        # @!attribute [rw] graceful_decommission_timeout
        #   @return [Google::Protobuf::Duration]
        #     Required. Timeout for YARN graceful decommissioning of Node Managers.
        #     Specifies the duration to wait for jobs to complete before forcefully
        #     removing workers (and potentially interrupting jobs). Only applicable to
        #     downscaling operations.
        #
        #     Bounds: [0s, 1d].
        # @!attribute [rw] scale_up_factor
        #   @return [Float]
        #     Required. Fraction of average pending memory in the last cooldown period
        #     for which to add workers. A scale-up factor of 1.0 will result in scaling
        #     up so that there is no pending memory remaining after the update (more
        #     aggressive scaling). A scale-up factor closer to 0 will result in a smaller
        #     magnitude of scaling up (less aggressive scaling).
        #
        #     Bounds: [0.0, 1.0].
        # @!attribute [rw] scale_down_factor
        #   @return [Float]
        #     Required. Fraction of average pending memory in the last cooldown period
        #     for which to remove workers. A scale-down factor of 1 will result in
        #     scaling down so that there is no available memory remaining after the
        #     update (more aggressive scaling). A scale-down factor of 0 disables
        #     removing workers, which can be beneficial for autoscaling a single job.
        #
        #     Bounds: [0.0, 1.0].
        # @!attribute [rw] scale_up_min_worker_fraction
        #   @return [Float]
        #     Optional. Minimum scale-up threshold as a fraction of total cluster size
        #     before scaling occurs. For example, in a 20-worker cluster, a threshold of
        #     0.1 means the autoscaler must recommend at least a 2-worker scale-up for
        #     the cluster to scale. A threshold of 0 means the autoscaler will scale up
        #     on any recommended change.
        #
        #     Bounds: [0.0, 1.0]. Default: 0.0.
        # @!attribute [rw] scale_down_min_worker_fraction
        #   @return [Float]
        #     Optional. Minimum scale-down threshold as a fraction of total cluster size
        #     before scaling occurs. For example, in a 20-worker cluster, a threshold of
        #     0.1 means the autoscaler must recommend at least a 2 worker scale-down for
        #     the cluster to scale. A threshold of 0 means the autoscaler will scale down
        #     on any recommended change.
        #
        #     Bounds: [0.0, 1.0]. Default: 0.0.
        class BasicYarnAutoscalingConfig; end

        # Configuration for the size bounds of an instance group, including its
        # proportional size to other groups.
        # @!attribute [rw] min_instances
        #   @return [Integer]
        #     Optional. Minimum number of instances for this group.
        #
        #     Primary workers - Bounds: [2, max_instances]. Default: 2.
        #     Secondary workers - Bounds: [0, max_instances]. Default: 0.
        # @!attribute [rw] max_instances
        #   @return [Integer]
        #     Optional. Maximum number of instances for this group. Required for primary
        #     workers. Note that by default, clusters will not use secondary workers.
        #     Required for secondary workers if the minimum secondary instances is set.
        #
        #     Primary workers - Bounds: [min_instances, ). Required.
        #     Secondary workers - Bounds: [min_instances, ). Default: 0.
        # @!attribute [rw] weight
        #   @return [Integer]
        #     Optional. Weight for the instance group, which is used to determine the
        #     fraction of total workers in the cluster from this instance group.
        #     For example, if primary workers have weight 2, and secondary workers have
        #     weight 1, the cluster will have approximately 2 primary workers for each
        #     secondary worker.
        #
        #     The cluster may not reach the specified balance if constrained
        #     by min/max bounds or other autoscaling settings. For example, if
        #     `max_instances` for secondary workers is 0, then only primary workers will
        #     be added. The cluster can also be out of balance when created.
        #
        #     If weight is not set on any instance group, the cluster will default to
        #     equal weight for all groups: the cluster will attempt to maintain an equal
        #     number of workers in each group within the configured size bounds for each
        #     group. If weight is set for one group only, the cluster will default to
        #     zero weight on the unset group. For example if weight is set only on
        #     primary workers, the cluster will use primary workers only and no
        #     secondary workers.
        class InstanceGroupAutoscalingPolicyConfig; end

        # A request to create an autoscaling policy.
        # @!attribute [rw] parent
        #   @return [String]
        #     Required. The "resource name" of the region or location, as described
        #     in https://cloud.google.com/apis/design/resource_names.
        #
        #     * For `projects.regions.autoscalingPolicies.create`, the resource name
        #       has the following format:
        #       `projects/{project_id}/regions/{region}`
        #
        #     * For `projects.locations.autoscalingPolicies.create`, the resource name
        #       has the following format:
        #       `projects/{project_id}/locations/{location}`
        # @!attribute [rw] policy
        #   @return [Google::Cloud::Dataproc::V1beta2::AutoscalingPolicy]
        #     Required. The autoscaling policy to create.
        class CreateAutoscalingPolicyRequest; end

        # A request to fetch an autoscaling policy.
        # @!attribute [rw] name
        #   @return [String]
        #     Required. The "resource name" of the autoscaling policy, as described
        #     in https://cloud.google.com/apis/design/resource_names.
        #
        #     * For `projects.regions.autoscalingPolicies.get`, the resource name
        #       of the policy has the following format:
        #       `projects/{project_id}/regions/{region}/autoscalingPolicies/{policy_id}`
        #
        #     * For `projects.locations.autoscalingPolicies.get`, the resource name
        #       of the policy has the following format:
        #       `projects/{project_id}/locations/{location}/autoscalingPolicies/{policy_id}`
        class GetAutoscalingPolicyRequest; end

        # A request to update an autoscaling policy.
        # @!attribute [rw] policy
        #   @return [Google::Cloud::Dataproc::V1beta2::AutoscalingPolicy]
        #     Required. The updated autoscaling policy.
        class UpdateAutoscalingPolicyRequest; end

        # A request to delete an autoscaling policy.
        #
        # Autoscaling policies in use by one or more clusters will not be deleted.
        # @!attribute [rw] name
        #   @return [String]
        #     Required. The "resource name" of the autoscaling policy, as described
        #     in https://cloud.google.com/apis/design/resource_names.
        #
        #     * For `projects.regions.autoscalingPolicies.delete`, the resource name
        #       of the policy has the following format:
        #       `projects/{project_id}/regions/{region}/autoscalingPolicies/{policy_id}`
        #
        #     * For `projects.locations.autoscalingPolicies.delete`, the resource name
        #       of the policy has the following format:
        #       `projects/{project_id}/locations/{location}/autoscalingPolicies/{policy_id}`
        class DeleteAutoscalingPolicyRequest; end

        # A request to list autoscaling policies in a project.
        # @!attribute [rw] parent
        #   @return [String]
        #     Required. The "resource name" of the region or location, as described
        #     in https://cloud.google.com/apis/design/resource_names.
        #
        #     * For `projects.regions.autoscalingPolicies.list`, the resource name
        #       of the region has the following format:
        #       `projects/{project_id}/regions/{region}`
        #
        #     * For `projects.locations.autoscalingPolicies.list`, the resource name
        #       of the location has the following format:
        #       `projects/{project_id}/locations/{location}`
        # @!attribute [rw] page_size
        #   @return [Integer]
        #     Optional. The maximum number of results to return in each response.
        #     Must be less than or equal to 1000. Defaults to 100.
        # @!attribute [rw] page_token
        #   @return [String]
        #     Optional. The page token, returned by a previous call, to request the
        #     next page of results.
        class ListAutoscalingPoliciesRequest; end

        # A response to a request to list autoscaling policies in a project.
        # @!attribute [rw] policies
        #   @return [Array<Google::Cloud::Dataproc::V1beta2::AutoscalingPolicy>]
        #     Output only. Autoscaling policies list.
        # @!attribute [rw] next_page_token
        #   @return [String]
        #     Output only. This token is included in the response if there are more
        #     results to fetch.
        class ListAutoscalingPoliciesResponse; end
      end
    end
  end
end