// 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
// (https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch_concepts.html)
// 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
// (https://docs.aws.amazon.com/autoscaling/plans/userguide/gs-create-scaling-plan.html#gs-view-resource)
// in the AWS Auto Scaling User Guide.
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
// (https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/publishingMetrics.html)
// 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
// (https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch_concepts.html)
// in the Amazon CloudWatch User Guide.
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
// (https://docs.aws.amazon.com/autoscaling/plans/userguide/gs-create-scaling-plan.html#gs-view-resource)
// in the AWS Auto Scaling User Guide.
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
	// (https://docs.aws.amazon.com/elasticloadbalancing/latest/APIReference/API_DescribeLoadBalancers.html)
	// API operation. To find the ARN for the target group, use the
	// DescribeTargetGroups
	// (https://docs.aws.amazon.com/elasticloadbalancing/latest/APIReference/API_DescribeTargetGroups.html)
	// API operation.
	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
	// (https://docs.aws.amazon.com/elasticloadbalancing/latest/APIReference/API_DescribeLoadBalancers.html)
	// API operation. To find the ARN for the target group, use the
	// DescribeTargetGroups
	// (https://docs.aws.amazon.com/elasticloadbalancing/latest/APIReference/API_DescribeTargetGroups.html)
	// API operation.
	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
// (https://docs.aws.amazon.com/autoscaling/plans/userguide/gs-best-practices.html)
// in the AWS Auto Scaling User Guide.
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 ScalingInstruction and 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
