// Code generated by smithy-go-codegen DO NOT EDIT.

package types

import (
	smithydocument "github.com/aws/smithy-go/document"
	"time"
)

// Represents an application source.
type ApplicationSource struct {

	// The Amazon Resource Name (ARN) of a AWS CloudFormation stack.
	CloudFormationStackARN *string

	// A set of tags (up to 50).
	TagFilters []TagFilter

	noSmithyDocumentSerde
}

// Represents a CloudWatch metric of your choosing that can be used for predictive
// scaling.
//
// For predictive scaling to work with a customized load metric specification, AWS
// Auto Scaling needs access to the Sum and Average statistics that CloudWatch
// computes from metric data.
//
// When you choose a load metric, make sure that the required Sum and Average
// statistics for your metric are available in CloudWatch and that they provide
// relevant data for predictive scaling. The Sum statistic must represent the
// total load on the resource, and the Average statistic must represent the
// average load per capacity unit of the resource. For example, there is a metric
// that counts the number of requests processed by your Auto Scaling group. If the
// Sum statistic represents the total request count processed by the group, then
// the Average statistic for the specified metric must represent the average
// request count processed by each instance of the group.
//
// If you publish your own metrics, you can aggregate the data points at a given
// interval and then publish the aggregated data points to CloudWatch. Before AWS
// Auto Scaling generates the forecast, it sums up all the metric data points that
// occurred within each hour to match the granularity period that is used in the
// forecast (60 minutes).
//
// For information about terminology, available metrics, or how to publish new
// metrics, see [Amazon CloudWatch Concepts]in the Amazon CloudWatch User Guide.
//
// After creating your scaling plan, you can use the AWS Auto Scaling console to
// visualize forecasts for the specified metric. For more information, see [View Scaling Information for a Resource]in the
// AWS Auto Scaling User Guide.
//
// [View Scaling Information for a Resource]: https://docs.aws.amazon.com/autoscaling/plans/userguide/gs-create-scaling-plan.html#gs-view-resource
// [Amazon CloudWatch Concepts]: https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch_concepts.html
type CustomizedLoadMetricSpecification struct {

	// The name of the metric.
	//
	// This member is required.
	MetricName *string

	// The namespace of the metric.
	//
	// This member is required.
	Namespace *string

	// The statistic of the metric. The only valid value is Sum .
	//
	// This member is required.
	Statistic MetricStatistic

	// The dimensions of the metric.
	//
	// Conditional: If you published your metric with dimensions, you must specify the
	// same dimensions in your customized load metric specification.
	Dimensions []MetricDimension

	// The unit of the metric.
	Unit *string

	noSmithyDocumentSerde
}

// Represents a CloudWatch metric of your choosing that can be used for dynamic
// scaling as part of a target tracking scaling policy.
//
// To create your customized scaling metric specification:
//
//   - Add values for each required parameter from CloudWatch. You can use an
//     existing metric, or a new metric that you create. To use your own metric, you
//     must first publish the metric to CloudWatch. For more information, see [Publish Custom Metrics]in the
//     Amazon CloudWatch User Guide.
//
//   - Choose a metric that changes proportionally with capacity. The value of the
//     metric should increase or decrease in inverse proportion to the number of
//     capacity units. That is, the value of the metric should decrease when capacity
//     increases.
//
// For information about terminology, available metrics, or how to publish new
// metrics, see [Amazon CloudWatch Concepts]in the Amazon CloudWatch User Guide.
//
// [Amazon CloudWatch Concepts]: https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch_concepts.html
// [Publish Custom Metrics]: https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/publishingMetrics.html
type CustomizedScalingMetricSpecification struct {

	// The name of the metric.
	//
	// This member is required.
	MetricName *string

	// The namespace of the metric.
	//
	// This member is required.
	Namespace *string

	// The statistic of the metric.
	//
	// This member is required.
	Statistic MetricStatistic

	// The dimensions of the metric.
	//
	// Conditional: If you published your metric with dimensions, you must specify the
	// same dimensions in your customized scaling metric specification.
	Dimensions []MetricDimension

	// The unit of the metric.
	Unit *string

	noSmithyDocumentSerde
}

// Represents a single value in the forecast data used for predictive scaling.
type Datapoint struct {

	// The time stamp for the data point in UTC format.
	Timestamp *time.Time

	// The value of the data point.
	Value *float64

	noSmithyDocumentSerde
}

// Represents a dimension for a customized metric.
type MetricDimension struct {

	// The name of the dimension.
	//
	// This member is required.
	Name *string

	// The value of the dimension.
	//
	// This member is required.
	Value *string

	noSmithyDocumentSerde
}

// Represents a predefined metric that can be used for predictive scaling.
//
// After creating your scaling plan, you can use the AWS Auto Scaling console to
// visualize forecasts for the specified metric. For more information, see [View Scaling Information for a Resource]in the
// AWS Auto Scaling User Guide.
//
// [View Scaling Information for a Resource]: https://docs.aws.amazon.com/autoscaling/plans/userguide/gs-create-scaling-plan.html#gs-view-resource
type PredefinedLoadMetricSpecification struct {

	// The metric type.
	//
	// This member is required.
	PredefinedLoadMetricType LoadMetricType

	// Identifies the resource associated with the metric type. You can't specify a
	// resource label unless the metric type is ALBTargetGroupRequestCount and there
	// is a target group for an Application Load Balancer attached to the Auto Scaling
	// group.
	//
	// You create the resource label by appending the final portion of the load
	// balancer ARN and the final portion of the target group ARN into a single value,
	// separated by a forward slash (/). The format is app///targetgroup//, where:
	//
	//   - app// is the final portion of the load balancer ARN
	//
	//   - targetgroup// is the final portion of the target group ARN.
	//
	// This is an example:
	// app/EC2Co-EcsEl-1TKLTMITMM0EO/f37c06a68c1748aa/targetgroup/EC2Co-Defau-LDNM7Q3ZH1ZN/6d4ea56ca2d6a18d.
	//
	// To find the ARN for an Application Load Balancer, use the [DescribeLoadBalancers] API operation. To
	// find the ARN for the target group, use the [DescribeTargetGroups]API operation.
	//
	// [DescribeTargetGroups]: https://docs.aws.amazon.com/elasticloadbalancing/latest/APIReference/API_DescribeTargetGroups.html
	// [DescribeLoadBalancers]: https://docs.aws.amazon.com/elasticloadbalancing/latest/APIReference/API_DescribeLoadBalancers.html
	ResourceLabel *string

	noSmithyDocumentSerde
}

// Represents a predefined metric that can be used for dynamic scaling as part of
// a target tracking scaling policy.
type PredefinedScalingMetricSpecification struct {

	// The metric type. The ALBRequestCountPerTarget metric type applies only to Auto
	// Scaling groups, Spot Fleet requests, and ECS services.
	//
	// This member is required.
	PredefinedScalingMetricType ScalingMetricType

	// Identifies the resource associated with the metric type. You can't specify a
	// resource label unless the metric type is ALBRequestCountPerTarget and there is
	// a target group for an Application Load Balancer attached to the Auto Scaling
	// group, Spot Fleet request, or ECS service.
	//
	// You create the resource label by appending the final portion of the load
	// balancer ARN and the final portion of the target group ARN into a single value,
	// separated by a forward slash (/). The format is app///targetgroup//, where:
	//
	//   - app// is the final portion of the load balancer ARN
	//
	//   - targetgroup// is the final portion of the target group ARN.
	//
	// This is an example:
	// app/EC2Co-EcsEl-1TKLTMITMM0EO/f37c06a68c1748aa/targetgroup/EC2Co-Defau-LDNM7Q3ZH1ZN/6d4ea56ca2d6a18d.
	//
	// To find the ARN for an Application Load Balancer, use the [DescribeLoadBalancers] API operation. To
	// find the ARN for the target group, use the [DescribeTargetGroups]API operation.
	//
	// [DescribeTargetGroups]: https://docs.aws.amazon.com/elasticloadbalancing/latest/APIReference/API_DescribeTargetGroups.html
	// [DescribeLoadBalancers]: https://docs.aws.amazon.com/elasticloadbalancing/latest/APIReference/API_DescribeLoadBalancers.html
	ResourceLabel *string

	noSmithyDocumentSerde
}

// Describes a scaling instruction for a scalable resource in a scaling plan. Each
// scaling instruction applies to one resource.
//
// AWS Auto Scaling creates target tracking scaling policies based on the scaling
// instructions. Target tracking scaling policies adjust the capacity of your
// scalable resource as required to maintain resource utilization at the target
// value that you specified.
//
// AWS Auto Scaling also configures predictive scaling for your Amazon EC2 Auto
// Scaling groups using a subset of parameters, including the load metric, the
// scaling metric, the target value for the scaling metric, the predictive scaling
// mode (forecast and scale or forecast only), and the desired behavior when the
// forecast capacity exceeds the maximum capacity of the resource. With predictive
// scaling, AWS Auto Scaling generates forecasts with traffic predictions for the
// two days ahead and schedules scaling actions that proactively add and remove
// resource capacity to match the forecast.
//
// We recommend waiting a minimum of 24 hours after creating an Auto Scaling group
// to configure predictive scaling. At minimum, there must be 24 hours of
// historical data to generate a forecast. For more information, see [Best Practices for AWS Auto Scaling]in the AWS
// Auto Scaling User Guide.
//
// [Best Practices for AWS Auto Scaling]: https://docs.aws.amazon.com/autoscaling/plans/userguide/gs-best-practices.html
type ScalingInstruction struct {

	// The maximum capacity of the resource. The exception to this upper limit is if
	// you specify a non-default setting for PredictiveScalingMaxCapacityBehavior.
	//
	// This member is required.
	MaxCapacity *int32

	// The minimum capacity of the resource.
	//
	// This member is required.
	MinCapacity *int32

	// The ID of the resource. This string consists of the resource type and unique
	// identifier.
	//
	//   - Auto Scaling group - The resource type is autoScalingGroup and the unique
	//   identifier is the name of the Auto Scaling group. Example:
	//   autoScalingGroup/my-asg .
	//
	//   - ECS service - The resource type is service and the unique identifier is the
	//   cluster name and service name. Example: service/default/sample-webapp .
	//
	//   - Spot Fleet request - The resource type is spot-fleet-request and the unique
	//   identifier is the Spot Fleet request ID. Example:
	//   spot-fleet-request/sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE .
	//
	//   - DynamoDB table - The resource type is table and the unique identifier is the
	//   resource ID. Example: table/my-table .
	//
	//   - DynamoDB global secondary index - The resource type is index and the unique
	//   identifier is the resource ID. Example: table/my-table/index/my-table-index .
	//
	//   - Aurora DB cluster - The resource type is cluster and the unique identifier
	//   is the cluster name. Example: cluster:my-db-cluster .
	//
	// This member is required.
	ResourceId *string

	// The scalable dimension associated with the resource.
	//
	//   - autoscaling:autoScalingGroup:DesiredCapacity - The desired capacity of an
	//   Auto Scaling group.
	//
	//   - ecs:service:DesiredCount - The desired task count of an ECS service.
	//
	//   - ec2:spot-fleet-request:TargetCapacity - The target capacity of a Spot Fleet
	//   request.
	//
	//   - dynamodb:table:ReadCapacityUnits - The provisioned read capacity for a
	//   DynamoDB table.
	//
	//   - dynamodb:table:WriteCapacityUnits - The provisioned write capacity for a
	//   DynamoDB table.
	//
	//   - dynamodb:index:ReadCapacityUnits - The provisioned read capacity for a
	//   DynamoDB global secondary index.
	//
	//   - dynamodb:index:WriteCapacityUnits - The provisioned write capacity for a
	//   DynamoDB global secondary index.
	//
	//   - rds:cluster:ReadReplicaCount - The count of Aurora Replicas in an Aurora DB
	//   cluster. Available for Aurora MySQL-compatible edition and Aurora
	//   PostgreSQL-compatible edition.
	//
	// This member is required.
	ScalableDimension ScalableDimension

	// The namespace of the AWS service.
	//
	// This member is required.
	ServiceNamespace ServiceNamespace

	// The target tracking configurations (up to 10). Each of these structures must
	// specify a unique scaling metric and a target value for the metric.
	//
	// This member is required.
	TargetTrackingConfigurations []TargetTrackingConfiguration

	// The customized load metric to use for predictive scaling. This parameter or a
	// PredefinedLoadMetricSpecification is required when configuring predictive
	// scaling, and cannot be used otherwise.
	CustomizedLoadMetricSpecification *CustomizedLoadMetricSpecification

	// Controls whether dynamic scaling by AWS Auto Scaling is disabled. When dynamic
	// scaling is enabled, AWS Auto Scaling creates target tracking scaling policies
	// based on the specified target tracking configurations.
	//
	// The default is enabled ( false ).
	DisableDynamicScaling *bool

	// The predefined load metric to use for predictive scaling. This parameter or a
	// CustomizedLoadMetricSpecification is required when configuring predictive
	// scaling, and cannot be used otherwise.
	PredefinedLoadMetricSpecification *PredefinedLoadMetricSpecification

	// Defines the behavior that should be applied if the forecast capacity approaches
	// or exceeds the maximum capacity specified for the resource. The default value is
	// SetForecastCapacityToMaxCapacity .
	//
	// The following are possible values:
	//
	//   - SetForecastCapacityToMaxCapacity - AWS Auto Scaling cannot scale resource
	//   capacity higher than the maximum capacity. The maximum capacity is enforced as a
	//   hard limit.
	//
	//   - SetMaxCapacityToForecastCapacity - AWS Auto Scaling may scale resource
	//   capacity higher than the maximum capacity to equal but not exceed forecast
	//   capacity.
	//
	//   - SetMaxCapacityAboveForecastCapacity - AWS Auto Scaling may scale resource
	//   capacity higher than the maximum capacity by a specified buffer value. The
	//   intention is to give the target tracking scaling policy extra capacity if
	//   unexpected traffic occurs.
	//
	// Only valid when configuring predictive scaling.
	PredictiveScalingMaxCapacityBehavior PredictiveScalingMaxCapacityBehavior

	// The size of the capacity buffer to use when the forecast capacity is close to
	// or exceeds the maximum capacity. The value is specified as a percentage relative
	// to the forecast capacity. For example, if the buffer is 10, this means a 10
	// percent buffer, such that if the forecast capacity is 50, and the maximum
	// capacity is 40, then the effective maximum capacity is 55.
	//
	// Only valid when configuring predictive scaling. Required if the
	// PredictiveScalingMaxCapacityBehavior is set to
	// SetMaxCapacityAboveForecastCapacity , and cannot be used otherwise.
	//
	// The range is 1-100.
	PredictiveScalingMaxCapacityBuffer *int32

	// The predictive scaling mode. The default value is ForecastAndScale . Otherwise,
	// AWS Auto Scaling forecasts capacity but does not create any scheduled scaling
	// actions based on the capacity forecast.
	PredictiveScalingMode PredictiveScalingMode

	// Controls whether a resource's externally created scaling policies are kept or
	// replaced.
	//
	// The default value is KeepExternalPolicies . If the parameter is set to
	// ReplaceExternalPolicies , any scaling policies that are external to AWS Auto
	// Scaling are deleted and new target tracking scaling policies created.
	//
	// Only valid when configuring dynamic scaling.
	//
	// Condition: The number of existing policies to be replaced must be less than or
	// equal to 50. If there are more than 50 policies to be replaced, AWS Auto Scaling
	// keeps all existing policies and does not create new ones.
	ScalingPolicyUpdateBehavior ScalingPolicyUpdateBehavior

	// The amount of time, in seconds, to buffer the run time of scheduled scaling
	// actions when scaling out. For example, if the forecast says to add capacity at
	// 10:00 AM, and the buffer time is 5 minutes, then the run time of the
	// corresponding scheduled scaling action will be 9:55 AM. The intention is to give
	// resources time to be provisioned. For example, it can take a few minutes to
	// launch an EC2 instance. The actual amount of time required depends on several
	// factors, such as the size of the instance and whether there are startup scripts
	// to complete.
	//
	// The value must be less than the forecast interval duration of 3600 seconds (60
	// minutes). The default is 300 seconds.
	//
	// Only valid when configuring predictive scaling.
	ScheduledActionBufferTime *int32

	noSmithyDocumentSerde
}

// Represents a scaling plan.
type ScalingPlan struct {

	// A CloudFormation stack or a set of tags. You can create one scaling plan per
	// application source.
	//
	// This member is required.
	ApplicationSource *ApplicationSource

	// The scaling instructions.
	//
	// This member is required.
	ScalingInstructions []ScalingInstruction

	// The name of the scaling plan.
	//
	// This member is required.
	ScalingPlanName *string

	// The version number of the scaling plan.
	//
	// This member is required.
	ScalingPlanVersion *int64

	// The status of the scaling plan.
	//
	//   - Active - The scaling plan is active.
	//
	//   - ActiveWithProblems - The scaling plan is active, but the scaling
	//   configuration for one or more resources could not be applied.
	//
	//   - CreationInProgress - The scaling plan is being created.
	//
	//   - CreationFailed - The scaling plan could not be created.
	//
	//   - DeletionInProgress - The scaling plan is being deleted.
	//
	//   - DeletionFailed - The scaling plan could not be deleted.
	//
	//   - UpdateInProgress - The scaling plan is being updated.
	//
	//   - UpdateFailed - The scaling plan could not be updated.
	//
	// This member is required.
	StatusCode ScalingPlanStatusCode

	// The Unix time stamp when the scaling plan was created.
	CreationTime *time.Time

	// A simple message about the current status of the scaling plan.
	StatusMessage *string

	// The Unix time stamp when the scaling plan entered the current status.
	StatusStartTime *time.Time

	noSmithyDocumentSerde
}

// Represents a scalable resource.
type ScalingPlanResource struct {

	// The ID of the resource. This string consists of the resource type and unique
	// identifier.
	//
	//   - Auto Scaling group - The resource type is autoScalingGroup and the unique
	//   identifier is the name of the Auto Scaling group. Example:
	//   autoScalingGroup/my-asg .
	//
	//   - ECS service - The resource type is service and the unique identifier is the
	//   cluster name and service name. Example: service/default/sample-webapp .
	//
	//   - Spot Fleet request - The resource type is spot-fleet-request and the unique
	//   identifier is the Spot Fleet request ID. Example:
	//   spot-fleet-request/sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE .
	//
	//   - DynamoDB table - The resource type is table and the unique identifier is the
	//   resource ID. Example: table/my-table .
	//
	//   - DynamoDB global secondary index - The resource type is index and the unique
	//   identifier is the resource ID. Example: table/my-table/index/my-table-index .
	//
	//   - Aurora DB cluster - The resource type is cluster and the unique identifier
	//   is the cluster name. Example: cluster:my-db-cluster .
	//
	// This member is required.
	ResourceId *string

	// The scalable dimension for the resource.
	//
	//   - autoscaling:autoScalingGroup:DesiredCapacity - The desired capacity of an
	//   Auto Scaling group.
	//
	//   - ecs:service:DesiredCount - The desired task count of an ECS service.
	//
	//   - ec2:spot-fleet-request:TargetCapacity - The target capacity of a Spot Fleet
	//   request.
	//
	//   - dynamodb:table:ReadCapacityUnits - The provisioned read capacity for a
	//   DynamoDB table.
	//
	//   - dynamodb:table:WriteCapacityUnits - The provisioned write capacity for a
	//   DynamoDB table.
	//
	//   - dynamodb:index:ReadCapacityUnits - The provisioned read capacity for a
	//   DynamoDB global secondary index.
	//
	//   - dynamodb:index:WriteCapacityUnits - The provisioned write capacity for a
	//   DynamoDB global secondary index.
	//
	//   - rds:cluster:ReadReplicaCount - The count of Aurora Replicas in an Aurora DB
	//   cluster. Available for Aurora MySQL-compatible edition and Aurora
	//   PostgreSQL-compatible edition.
	//
	// This member is required.
	ScalableDimension ScalableDimension

	// The name of the scaling plan.
	//
	// This member is required.
	ScalingPlanName *string

	// The version number of the scaling plan.
	//
	// This member is required.
	ScalingPlanVersion *int64

	// The scaling status of the resource.
	//
	//   - Active - The scaling configuration is active.
	//
	//   - Inactive - The scaling configuration is not active because the scaling plan
	//   is being created or the scaling configuration could not be applied. Check the
	//   status message for more information.
	//
	//   - PartiallyActive - The scaling configuration is partially active because the
	//   scaling plan is being created or deleted or the scaling configuration could not
	//   be fully applied. Check the status message for more information.
	//
	// This member is required.
	ScalingStatusCode ScalingStatusCode

	// The namespace of the AWS service.
	//
	// This member is required.
	ServiceNamespace ServiceNamespace

	// The scaling policies.
	ScalingPolicies []ScalingPolicy

	// A simple message about the current scaling status of the resource.
	ScalingStatusMessage *string

	noSmithyDocumentSerde
}

// Represents a scaling policy.
type ScalingPolicy struct {

	// The name of the scaling policy.
	//
	// This member is required.
	PolicyName *string

	// The type of scaling policy.
	//
	// This member is required.
	PolicyType PolicyType

	// The target tracking scaling policy. Includes support for predefined or
	// customized metrics.
	TargetTrackingConfiguration *TargetTrackingConfiguration

	noSmithyDocumentSerde
}

// Represents a tag.
type TagFilter struct {

	// The tag key.
	Key *string

	// The tag values (0 to 20).
	Values []string

	noSmithyDocumentSerde
}

// Describes a target tracking configuration to use with AWS Auto Scaling. Used
// with ScalingInstructionand ScalingPolicy.
type TargetTrackingConfiguration struct {

	// The target value for the metric. Although this property accepts numbers of type
	// Double, it won't accept values that are either too small or too large. Values
	// must be in the range of -2^360 to 2^360.
	//
	// This member is required.
	TargetValue *float64

	// A customized metric. You can specify either a predefined metric or a customized
	// metric.
	CustomizedScalingMetricSpecification *CustomizedScalingMetricSpecification

	// Indicates whether scale in by the target tracking scaling policy is disabled.
	// If the value is true , scale in is disabled and the target tracking scaling
	// policy doesn't remove capacity from the scalable resource. Otherwise, scale in
	// is enabled and the target tracking scaling policy can remove capacity from the
	// scalable resource.
	//
	// The default value is false .
	DisableScaleIn *bool

	// The estimated time, in seconds, until a newly launched instance can contribute
	// to the CloudWatch metrics. This value is used only if the resource is an Auto
	// Scaling group.
	EstimatedInstanceWarmup *int32

	// A predefined metric. You can specify either a predefined metric or a customized
	// metric.
	PredefinedScalingMetricSpecification *PredefinedScalingMetricSpecification

	// The amount of time, in seconds, after a scale-in activity completes before
	// another scale-in activity can start. This property is not used if the scalable
	// resource is an Auto Scaling group.
	//
	// With the scale-in cooldown period, the intention is to scale in conservatively
	// to protect your application’s availability, so scale-in activities are blocked
	// until the cooldown period has expired. However, if another alarm triggers a
	// scale-out activity during the scale-in cooldown period, Auto Scaling scales out
	// the target immediately. In this case, the scale-in cooldown period stops and
	// doesn't complete.
	ScaleInCooldown *int32

	// The amount of time, in seconds, to wait for a previous scale-out activity to
	// take effect. This property is not used if the scalable resource is an Auto
	// Scaling group.
	//
	// With the scale-out cooldown period, the intention is to continuously (but not
	// excessively) scale out. After Auto Scaling successfully scales out using a
	// target tracking scaling policy, it starts to calculate the cooldown time. The
	// scaling policy won't increase the desired capacity again unless either a larger
	// scale out is triggered or the cooldown period ends.
	ScaleOutCooldown *int32

	noSmithyDocumentSerde
}

type noSmithyDocumentSerde = smithydocument.NoSerde
