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

package appstream

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/appstream/types"
	"github.com/aws/smithy-go/middleware"
	smithyhttp "github.com/aws/smithy-go/transport/http"
)

// Creates an image builder. An image builder is a virtual machine that is used to
// create an image. The initial state of the builder is PENDING. When it is ready,
// the state is RUNNING.
func (c *Client) CreateImageBuilder(ctx context.Context, params *CreateImageBuilderInput, optFns ...func(*Options)) (*CreateImageBuilderOutput, error) {
	if params == nil {
		params = &CreateImageBuilderInput{}
	}

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

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

type CreateImageBuilderInput struct {

	// The instance type to use when launching the image builder. The following
	// instance types are available:
	//
	// * stream.standard.small
	//
	// *
	// stream.standard.medium
	//
	// * stream.standard.large
	//
	// * stream.compute.large
	//
	// *
	// stream.compute.xlarge
	//
	// * stream.compute.2xlarge
	//
	// * stream.compute.4xlarge
	//
	// *
	// stream.compute.8xlarge
	//
	// * stream.memory.large
	//
	// * stream.memory.xlarge
	//
	// *
	// stream.memory.2xlarge
	//
	// * stream.memory.4xlarge
	//
	// * stream.memory.8xlarge
	//
	// *
	// stream.memory.z1d.large
	//
	// * stream.memory.z1d.xlarge
	//
	// *
	// stream.memory.z1d.2xlarge
	//
	// * stream.memory.z1d.3xlarge
	//
	// *
	// stream.memory.z1d.6xlarge
	//
	// * stream.memory.z1d.12xlarge
	//
	// *
	// stream.graphics-design.large
	//
	// * stream.graphics-design.xlarge
	//
	// *
	// stream.graphics-design.2xlarge
	//
	// * stream.graphics-design.4xlarge
	//
	// *
	// stream.graphics-desktop.2xlarge
	//
	// * stream.graphics.g4dn.xlarge
	//
	// *
	// stream.graphics.g4dn.2xlarge
	//
	// * stream.graphics.g4dn.4xlarge
	//
	// *
	// stream.graphics.g4dn.8xlarge
	//
	// * stream.graphics.g4dn.12xlarge
	//
	// *
	// stream.graphics.g4dn.16xlarge
	//
	// * stream.graphics-pro.4xlarge
	//
	// *
	// stream.graphics-pro.8xlarge
	//
	// * stream.graphics-pro.16xlarge
	//
	// This member is required.
	InstanceType *string

	// A unique name for the image builder.
	//
	// This member is required.
	Name *string

	// The list of interface VPC endpoint (interface endpoint) objects. Administrators
	// can connect to the image builder only through the specified endpoints.
	AccessEndpoints []types.AccessEndpoint

	// The version of the AppStream 2.0 agent to use for this image builder. To use the
	// latest version of the AppStream 2.0 agent, specify [LATEST].
	AppstreamAgentVersion *string

	// The description to display.
	Description *string

	// The image builder name to display.
	DisplayName *string

	// The name of the directory and organizational unit (OU) to use to join the image
	// builder to a Microsoft Active Directory domain.
	DomainJoinInfo *types.DomainJoinInfo

	// Enables or disables default internet access for the image builder.
	EnableDefaultInternetAccess *bool

	// The Amazon Resource Name (ARN) of the IAM role to apply to the image builder. To
	// assume a role, the image builder calls the AWS Security Token Service (STS)
	// AssumeRole API operation and passes the ARN of the role to use. The operation
	// creates a new session with temporary credentials. AppStream 2.0 retrieves the
	// temporary credentials and creates the appstream_machine_role credential profile
	// on the instance. For more information, see Using an IAM Role to Grant
	// Permissions to Applications and Scripts Running on AppStream 2.0 Streaming
	// Instances
	// (https://docs.aws.amazon.com/appstream2/latest/developerguide/using-iam-roles-to-grant-permissions-to-applications-scripts-streaming-instances.html)
	// in the Amazon AppStream 2.0 Administration Guide.
	IamRoleArn *string

	// The ARN of the public, private, or shared image to use.
	ImageArn *string

	// The name of the image used to create the image builder.
	ImageName *string

	// The tags to associate with the image builder. A tag is a key-value pair, and the
	// value is optional. For example, Environment=Test. If you do not specify a value,
	// Environment=. Generally allowed characters are: letters, numbers, and spaces
	// representable in UTF-8, and the following special characters: _ . : / = + \ - @
	// If you do not specify a value, the value is set to an empty string. For more
	// information about tags, see Tagging Your Resources
	// (https://docs.aws.amazon.com/appstream2/latest/developerguide/tagging-basic.html)
	// in the Amazon AppStream 2.0 Administration Guide.
	Tags map[string]string

	// The VPC configuration for the image builder. You can specify only one subnet.
	VpcConfig *types.VpcConfig

	noSmithyDocumentSerde
}

type CreateImageBuilderOutput struct {

	// Information about the image builder.
	ImageBuilder *types.ImageBuilder

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

	noSmithyDocumentSerde
}

func (c *Client) addOperationCreateImageBuilderMiddlewares(stack *middleware.Stack, options Options) (err error) {
	err = stack.Serialize.Add(&awsAwsjson11_serializeOpCreateImageBuilder{}, middleware.After)
	if err != nil {
		return err
	}
	err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpCreateImageBuilder{}, 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 = addOpCreateImageBuilderValidationMiddleware(stack); err != nil {
		return err
	}
	if err = stack.Initialize.Add(newServiceMetadataMiddleware_opCreateImageBuilder(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_opCreateImageBuilder(region string) *awsmiddleware.RegisterServiceMetadata {
	return &awsmiddleware.RegisterServiceMetadata{
		Region:        region,
		ServiceID:     ServiceID,
		SigningName:   "appstream",
		OperationName: "CreateImageBuilder",
	}
}
