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

package codedeploy

import (
	"context"
	awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware"
	"github.com/aws/aws-sdk-go-v2/aws/signer/v4"
	"github.com/aws/aws-sdk-go-v2/service/codedeploy/types"
	"github.com/aws/smithy-go/middleware"
	smithyhttp "github.com/aws/smithy-go/transport/http"
)

// Creates a deployment group to which application revisions are deployed.
func (c *Client) CreateDeploymentGroup(ctx context.Context, params *CreateDeploymentGroupInput, optFns ...func(*Options)) (*CreateDeploymentGroupOutput, error) {
	if params == nil {
		params = &CreateDeploymentGroupInput{}
	}

	result, metadata, err := c.invokeOperation(ctx, "CreateDeploymentGroup", params, optFns, c.addOperationCreateDeploymentGroupMiddlewares)
	if err != nil {
		return nil, err
	}

	out := result.(*CreateDeploymentGroupOutput)
	out.ResultMetadata = metadata
	return out, nil
}

// Represents the input of a CreateDeploymentGroup operation.
type CreateDeploymentGroupInput struct {

	// The name of an CodeDeploy application associated with the IAM user or Amazon Web
	// Services account.
	//
	// This member is required.
	ApplicationName *string

	// The name of a new deployment group for the specified application.
	//
	// This member is required.
	DeploymentGroupName *string

	// A service role Amazon Resource Name (ARN) that allows CodeDeploy to act on the
	// user's behalf when interacting with Amazon Web Services services.
	//
	// This member is required.
	ServiceRoleArn *string

	// Information to add about Amazon CloudWatch alarms when the deployment group is
	// created.
	AlarmConfiguration *types.AlarmConfiguration

	// Configuration information for an automatic rollback that is added when a
	// deployment group is created.
	AutoRollbackConfiguration *types.AutoRollbackConfiguration

	// A list of associated Amazon EC2 Auto Scaling groups.
	AutoScalingGroups []string

	// Information about blue/green deployment options for a deployment group.
	BlueGreenDeploymentConfiguration *types.BlueGreenDeploymentConfiguration

	// If specified, the deployment configuration name can be either one of the
	// predefined configurations provided with CodeDeploy or a custom deployment
	// configuration that you create by calling the create deployment configuration
	// operation. CodeDeployDefault.OneAtATime is the default deployment configuration.
	// It is used if a configuration isn't specified for the deployment or deployment
	// group. For more information about the predefined deployment configurations in
	// CodeDeploy, see Working with Deployment Configurations in CodeDeploy
	// (https://docs.aws.amazon.com/codedeploy/latest/userguide/deployment-configurations.html)
	// in the CodeDeploy User Guide.
	DeploymentConfigName *string

	// Information about the type of deployment, in-place or blue/green, that you want
	// to run and whether to route deployment traffic behind a load balancer.
	DeploymentStyle *types.DeploymentStyle

	// The Amazon EC2 tags on which to filter. The deployment group includes Amazon EC2
	// instances with any of the specified tags. Cannot be used in the same call as
	// ec2TagSet.
	Ec2TagFilters []types.EC2TagFilter

	// Information about groups of tags applied to Amazon EC2 instances. The deployment
	// group includes only Amazon EC2 instances identified by all the tag groups.
	// Cannot be used in the same call as ec2TagFilters.
	Ec2TagSet *types.EC2TagSet

	// The target Amazon ECS services in the deployment group. This applies only to
	// deployment groups that use the Amazon ECS compute platform. A target Amazon ECS
	// service is specified as an Amazon ECS cluster and service name pair using the
	// format :.
	EcsServices []types.ECSService

	// Information about the load balancer used in a deployment.
	LoadBalancerInfo *types.LoadBalancerInfo

	// The on-premises instance tags on which to filter. The deployment group includes
	// on-premises instances with any of the specified tags. Cannot be used in the same
	// call as OnPremisesTagSet.
	OnPremisesInstanceTagFilters []types.TagFilter

	// Information about groups of tags applied to on-premises instances. The
	// deployment group includes only on-premises instances identified by all of the
	// tag groups. Cannot be used in the same call as onPremisesInstanceTagFilters.
	OnPremisesTagSet *types.OnPremisesTagSet

	// Indicates what happens when new Amazon EC2 instances are launched mid-deployment
	// and do not receive the deployed application revision. If this option is set to
	// UPDATE or is unspecified, CodeDeploy initiates one or more 'auto-update outdated
	// instances' deployments to apply the deployed application revision to the new
	// Amazon EC2 instances. If this option is set to IGNORE, CodeDeploy does not
	// initiate a deployment to update the new Amazon EC2 instances. This may result in
	// instances having different revisions.
	OutdatedInstancesStrategy types.OutdatedInstancesStrategy

	// The metadata that you apply to CodeDeploy deployment groups to help you organize
	// and categorize them. Each tag consists of a key and an optional value, both of
	// which you define.
	Tags []types.Tag

	// Information about triggers to create when the deployment group is created. For
	// examples, see Create a Trigger for an CodeDeploy Event
	// (https://docs.aws.amazon.com/codedeploy/latest/userguide/how-to-notify-sns.html)
	// in the CodeDeploy User Guide.
	TriggerConfigurations []types.TriggerConfig

	noSmithyDocumentSerde
}

// Represents the output of a CreateDeploymentGroup operation.
type CreateDeploymentGroupOutput struct {

	// A unique deployment group ID.
	DeploymentGroupId *string

	// Metadata pertaining to the operation's result.
	ResultMetadata middleware.Metadata

	noSmithyDocumentSerde
}

func (c *Client) addOperationCreateDeploymentGroupMiddlewares(stack *middleware.Stack, options Options) (err error) {
	err = stack.Serialize.Add(&awsAwsjson11_serializeOpCreateDeploymentGroup{}, middleware.After)
	if err != nil {
		return err
	}
	err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpCreateDeploymentGroup{}, middleware.After)
	if err != nil {
		return err
	}
	if err = addSetLoggerMiddleware(stack, options); err != nil {
		return err
	}
	if err = awsmiddleware.AddClientRequestIDMiddleware(stack); err != nil {
		return err
	}
	if err = smithyhttp.AddComputeContentLengthMiddleware(stack); err != nil {
		return err
	}
	if err = addResolveEndpointMiddleware(stack, options); err != nil {
		return err
	}
	if err = v4.AddComputePayloadSHA256Middleware(stack); err != nil {
		return err
	}
	if err = addRetryMiddlewares(stack, options); err != nil {
		return err
	}
	if err = addHTTPSignerV4Middleware(stack, options); err != nil {
		return err
	}
	if err = awsmiddleware.AddRawResponseToMetadata(stack); err != nil {
		return err
	}
	if err = awsmiddleware.AddRecordResponseTiming(stack); err != nil {
		return err
	}
	if err = addClientUserAgent(stack); err != nil {
		return err
	}
	if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {
		return err
	}
	if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {
		return err
	}
	if err = addOpCreateDeploymentGroupValidationMiddleware(stack); err != nil {
		return err
	}
	if err = stack.Initialize.Add(newServiceMetadataMiddleware_opCreateDeploymentGroup(options.Region), middleware.Before); err != nil {
		return err
	}
	if err = addRequestIDRetrieverMiddleware(stack); err != nil {
		return err
	}
	if err = addResponseErrorMiddleware(stack); err != nil {
		return err
	}
	if err = addRequestResponseLogging(stack, options); err != nil {
		return err
	}
	return nil
}

func newServiceMetadataMiddleware_opCreateDeploymentGroup(region string) *awsmiddleware.RegisterServiceMetadata {
	return &awsmiddleware.RegisterServiceMetadata{
		Region:        region,
		ServiceID:     ServiceID,
		SigningName:   "codedeploy",
		OperationName: "CreateDeploymentGroup",
	}
}
