// Code generated by private/model/cli/gen-api/main.go. DO NOT EDIT.

package cloudhsmv2

import (
	"fmt"
	"time"

	"github.com/aws/aws-sdk-go/aws"
	"github.com/aws/aws-sdk-go/aws/awsutil"
	"github.com/aws/aws-sdk-go/aws/request"
)

const opCreateCluster = "CreateCluster"

// CreateClusterRequest generates a "aws/request.Request" representing the
// client's request for the CreateCluster operation. The "output" return
// value will be populated with the request's response once the request complets
// successfuly.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See CreateCluster for more information on using the CreateCluster
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the CreateClusterRequest method.
//    req, resp := client.CreateClusterRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// Please also see https://docs.aws.amazon.com/goto/WebAPI/cloudhsmv2-2017-04-28/CreateCluster
func (c *CloudHSMV2) CreateClusterRequest(input *CreateClusterInput) (req *request.Request, output *CreateClusterOutput) {
	op := &request.Operation{
		Name:       opCreateCluster,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &CreateClusterInput{}
	}

	output = &CreateClusterOutput{}
	req = c.newRequest(op, input, output)
	return
}

// CreateCluster API operation for AWS CloudHSM V2.
//
// Creates a new AWS CloudHSM cluster.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for AWS CloudHSM V2's
// API operation CreateCluster for usage and error information.
//
// Returned Error Codes:
//   * ErrCodeCloudHsmInternalFailureException "CloudHsmInternalFailureException"
//   The request was rejected because of an AWS CloudHSM internal failure. The
//   request can be retried.
//
//   * ErrCodeCloudHsmServiceException "CloudHsmServiceException"
//   The request was rejected because an error occurred.
//
//   * ErrCodeCloudHsmResourceNotFoundException "CloudHsmResourceNotFoundException"
//   The request was rejected because it refers to a resource that cannot be found.
//
//   * ErrCodeCloudHsmInvalidRequestException "CloudHsmInvalidRequestException"
//   The request was rejected because it is not a valid request.
//
//   * ErrCodeCloudHsmAccessDeniedException "CloudHsmAccessDeniedException"
//   The request was rejected because the requester does not have permission to
//   perform the requested operation.
//
// Please also see https://docs.aws.amazon.com/goto/WebAPI/cloudhsmv2-2017-04-28/CreateCluster
func (c *CloudHSMV2) CreateCluster(input *CreateClusterInput) (*CreateClusterOutput, error) {
	req, out := c.CreateClusterRequest(input)
	return out, req.Send()
}

// CreateClusterWithContext is the same as CreateCluster with the addition of
// the ability to pass a context and additional request options.
//
// See CreateCluster for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *CloudHSMV2) CreateClusterWithContext(ctx aws.Context, input *CreateClusterInput, opts ...request.Option) (*CreateClusterOutput, error) {
	req, out := c.CreateClusterRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opCreateHsm = "CreateHsm"

// CreateHsmRequest generates a "aws/request.Request" representing the
// client's request for the CreateHsm operation. The "output" return
// value will be populated with the request's response once the request complets
// successfuly.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See CreateHsm for more information on using the CreateHsm
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the CreateHsmRequest method.
//    req, resp := client.CreateHsmRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// Please also see https://docs.aws.amazon.com/goto/WebAPI/cloudhsmv2-2017-04-28/CreateHsm
func (c *CloudHSMV2) CreateHsmRequest(input *CreateHsmInput) (req *request.Request, output *CreateHsmOutput) {
	op := &request.Operation{
		Name:       opCreateHsm,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &CreateHsmInput{}
	}

	output = &CreateHsmOutput{}
	req = c.newRequest(op, input, output)
	return
}

// CreateHsm API operation for AWS CloudHSM V2.
//
// Creates a new hardware security module (HSM) in the specified AWS CloudHSM
// cluster.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for AWS CloudHSM V2's
// API operation CreateHsm for usage and error information.
//
// Returned Error Codes:
//   * ErrCodeCloudHsmInternalFailureException "CloudHsmInternalFailureException"
//   The request was rejected because of an AWS CloudHSM internal failure. The
//   request can be retried.
//
//   * ErrCodeCloudHsmServiceException "CloudHsmServiceException"
//   The request was rejected because an error occurred.
//
//   * ErrCodeCloudHsmInvalidRequestException "CloudHsmInvalidRequestException"
//   The request was rejected because it is not a valid request.
//
//   * ErrCodeCloudHsmResourceNotFoundException "CloudHsmResourceNotFoundException"
//   The request was rejected because it refers to a resource that cannot be found.
//
//   * ErrCodeCloudHsmAccessDeniedException "CloudHsmAccessDeniedException"
//   The request was rejected because the requester does not have permission to
//   perform the requested operation.
//
// Please also see https://docs.aws.amazon.com/goto/WebAPI/cloudhsmv2-2017-04-28/CreateHsm
func (c *CloudHSMV2) CreateHsm(input *CreateHsmInput) (*CreateHsmOutput, error) {
	req, out := c.CreateHsmRequest(input)
	return out, req.Send()
}

// CreateHsmWithContext is the same as CreateHsm with the addition of
// the ability to pass a context and additional request options.
//
// See CreateHsm for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *CloudHSMV2) CreateHsmWithContext(ctx aws.Context, input *CreateHsmInput, opts ...request.Option) (*CreateHsmOutput, error) {
	req, out := c.CreateHsmRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDeleteCluster = "DeleteCluster"

// DeleteClusterRequest generates a "aws/request.Request" representing the
// client's request for the DeleteCluster operation. The "output" return
// value will be populated with the request's response once the request complets
// successfuly.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DeleteCluster for more information on using the DeleteCluster
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DeleteClusterRequest method.
//    req, resp := client.DeleteClusterRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// Please also see https://docs.aws.amazon.com/goto/WebAPI/cloudhsmv2-2017-04-28/DeleteCluster
func (c *CloudHSMV2) DeleteClusterRequest(input *DeleteClusterInput) (req *request.Request, output *DeleteClusterOutput) {
	op := &request.Operation{
		Name:       opDeleteCluster,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DeleteClusterInput{}
	}

	output = &DeleteClusterOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DeleteCluster API operation for AWS CloudHSM V2.
//
// Deletes the specified AWS CloudHSM cluster. Before you can delete a cluster,
// you must delete all HSMs in the cluster. To see if the cluster contains any
// HSMs, use DescribeClusters. To delete an HSM, use DeleteHsm.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for AWS CloudHSM V2's
// API operation DeleteCluster for usage and error information.
//
// Returned Error Codes:
//   * ErrCodeCloudHsmInternalFailureException "CloudHsmInternalFailureException"
//   The request was rejected because of an AWS CloudHSM internal failure. The
//   request can be retried.
//
//   * ErrCodeCloudHsmServiceException "CloudHsmServiceException"
//   The request was rejected because an error occurred.
//
//   * ErrCodeCloudHsmResourceNotFoundException "CloudHsmResourceNotFoundException"
//   The request was rejected because it refers to a resource that cannot be found.
//
//   * ErrCodeCloudHsmInvalidRequestException "CloudHsmInvalidRequestException"
//   The request was rejected because it is not a valid request.
//
//   * ErrCodeCloudHsmAccessDeniedException "CloudHsmAccessDeniedException"
//   The request was rejected because the requester does not have permission to
//   perform the requested operation.
//
// Please also see https://docs.aws.amazon.com/goto/WebAPI/cloudhsmv2-2017-04-28/DeleteCluster
func (c *CloudHSMV2) DeleteCluster(input *DeleteClusterInput) (*DeleteClusterOutput, error) {
	req, out := c.DeleteClusterRequest(input)
	return out, req.Send()
}

// DeleteClusterWithContext is the same as DeleteCluster with the addition of
// the ability to pass a context and additional request options.
//
// See DeleteCluster for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *CloudHSMV2) DeleteClusterWithContext(ctx aws.Context, input *DeleteClusterInput, opts ...request.Option) (*DeleteClusterOutput, error) {
	req, out := c.DeleteClusterRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDeleteHsm = "DeleteHsm"

// DeleteHsmRequest generates a "aws/request.Request" representing the
// client's request for the DeleteHsm operation. The "output" return
// value will be populated with the request's response once the request complets
// successfuly.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DeleteHsm for more information on using the DeleteHsm
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DeleteHsmRequest method.
//    req, resp := client.DeleteHsmRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// Please also see https://docs.aws.amazon.com/goto/WebAPI/cloudhsmv2-2017-04-28/DeleteHsm
func (c *CloudHSMV2) DeleteHsmRequest(input *DeleteHsmInput) (req *request.Request, output *DeleteHsmOutput) {
	op := &request.Operation{
		Name:       opDeleteHsm,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DeleteHsmInput{}
	}

	output = &DeleteHsmOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DeleteHsm API operation for AWS CloudHSM V2.
//
// Deletes the specified HSM. To specify an HSM, you can use its identifier
// (ID), the IP address of the HSM's elastic network interface (ENI), or the
// ID of the HSM's ENI. You need to specify only one of these values. To find
// these values, use DescribeClusters.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for AWS CloudHSM V2's
// API operation DeleteHsm for usage and error information.
//
// Returned Error Codes:
//   * ErrCodeCloudHsmInternalFailureException "CloudHsmInternalFailureException"
//   The request was rejected because of an AWS CloudHSM internal failure. The
//   request can be retried.
//
//   * ErrCodeCloudHsmServiceException "CloudHsmServiceException"
//   The request was rejected because an error occurred.
//
//   * ErrCodeCloudHsmResourceNotFoundException "CloudHsmResourceNotFoundException"
//   The request was rejected because it refers to a resource that cannot be found.
//
//   * ErrCodeCloudHsmInvalidRequestException "CloudHsmInvalidRequestException"
//   The request was rejected because it is not a valid request.
//
//   * ErrCodeCloudHsmAccessDeniedException "CloudHsmAccessDeniedException"
//   The request was rejected because the requester does not have permission to
//   perform the requested operation.
//
// Please also see https://docs.aws.amazon.com/goto/WebAPI/cloudhsmv2-2017-04-28/DeleteHsm
func (c *CloudHSMV2) DeleteHsm(input *DeleteHsmInput) (*DeleteHsmOutput, error) {
	req, out := c.DeleteHsmRequest(input)
	return out, req.Send()
}

// DeleteHsmWithContext is the same as DeleteHsm with the addition of
// the ability to pass a context and additional request options.
//
// See DeleteHsm for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *CloudHSMV2) DeleteHsmWithContext(ctx aws.Context, input *DeleteHsmInput, opts ...request.Option) (*DeleteHsmOutput, error) {
	req, out := c.DeleteHsmRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeBackups = "DescribeBackups"

// DescribeBackupsRequest generates a "aws/request.Request" representing the
// client's request for the DescribeBackups operation. The "output" return
// value will be populated with the request's response once the request complets
// successfuly.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeBackups for more information on using the DescribeBackups
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeBackupsRequest method.
//    req, resp := client.DescribeBackupsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// Please also see https://docs.aws.amazon.com/goto/WebAPI/cloudhsmv2-2017-04-28/DescribeBackups
func (c *CloudHSMV2) DescribeBackupsRequest(input *DescribeBackupsInput) (req *request.Request, output *DescribeBackupsOutput) {
	op := &request.Operation{
		Name:       opDescribeBackups,
		HTTPMethod: "POST",
		HTTPPath:   "/",
		Paginator: &request.Paginator{
			InputTokens:     []string{"NextToken"},
			OutputTokens:    []string{"NextToken"},
			LimitToken:      "MaxResults",
			TruncationToken: "",
		},
	}

	if input == nil {
		input = &DescribeBackupsInput{}
	}

	output = &DescribeBackupsOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeBackups API operation for AWS CloudHSM V2.
//
// Gets information about backups of AWS CloudHSM clusters.
//
// This is a paginated operation, which means that each response might contain
// only a subset of all the backups. When the response contains only a subset
// of backups, it includes a NextToken value. Use this value in a subsequent
// DescribeBackups request to get more backups. When you receive a response
// with no NextToken (or an empty or null value), that means there are no more
// backups to get.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for AWS CloudHSM V2's
// API operation DescribeBackups for usage and error information.
//
// Returned Error Codes:
//   * ErrCodeCloudHsmInternalFailureException "CloudHsmInternalFailureException"
//   The request was rejected because of an AWS CloudHSM internal failure. The
//   request can be retried.
//
//   * ErrCodeCloudHsmServiceException "CloudHsmServiceException"
//   The request was rejected because an error occurred.
//
//   * ErrCodeCloudHsmResourceNotFoundException "CloudHsmResourceNotFoundException"
//   The request was rejected because it refers to a resource that cannot be found.
//
//   * ErrCodeCloudHsmInvalidRequestException "CloudHsmInvalidRequestException"
//   The request was rejected because it is not a valid request.
//
//   * ErrCodeCloudHsmAccessDeniedException "CloudHsmAccessDeniedException"
//   The request was rejected because the requester does not have permission to
//   perform the requested operation.
//
// Please also see https://docs.aws.amazon.com/goto/WebAPI/cloudhsmv2-2017-04-28/DescribeBackups
func (c *CloudHSMV2) DescribeBackups(input *DescribeBackupsInput) (*DescribeBackupsOutput, error) {
	req, out := c.DescribeBackupsRequest(input)
	return out, req.Send()
}

// DescribeBackupsWithContext is the same as DescribeBackups with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeBackups for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *CloudHSMV2) DescribeBackupsWithContext(ctx aws.Context, input *DescribeBackupsInput, opts ...request.Option) (*DescribeBackupsOutput, error) {
	req, out := c.DescribeBackupsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

// DescribeBackupsPages iterates over the pages of a DescribeBackups operation,
// calling the "fn" function with the response data for each page. To stop
// iterating, return false from the fn function.
//
// See DescribeBackups method for more information on how to use this operation.
//
// Note: This operation can generate multiple requests to a service.
//
//    // Example iterating over at most 3 pages of a DescribeBackups operation.
//    pageNum := 0
//    err := client.DescribeBackupsPages(params,
//        func(page *DescribeBackupsOutput, lastPage bool) bool {
//            pageNum++
//            fmt.Println(page)
//            return pageNum <= 3
//        })
//
func (c *CloudHSMV2) DescribeBackupsPages(input *DescribeBackupsInput, fn func(*DescribeBackupsOutput, bool) bool) error {
	return c.DescribeBackupsPagesWithContext(aws.BackgroundContext(), input, fn)
}

// DescribeBackupsPagesWithContext same as DescribeBackupsPages except
// it takes a Context and allows setting request options on the pages.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *CloudHSMV2) DescribeBackupsPagesWithContext(ctx aws.Context, input *DescribeBackupsInput, fn func(*DescribeBackupsOutput, bool) bool, opts ...request.Option) error {
	p := request.Pagination{
		NewRequest: func() (*request.Request, error) {
			var inCpy *DescribeBackupsInput
			if input != nil {
				tmp := *input
				inCpy = &tmp
			}
			req, _ := c.DescribeBackupsRequest(inCpy)
			req.SetContext(ctx)
			req.ApplyOptions(opts...)
			return req, nil
		},
	}

	cont := true
	for p.Next() && cont {
		cont = fn(p.Page().(*DescribeBackupsOutput), !p.HasNextPage())
	}
	return p.Err()
}

const opDescribeClusters = "DescribeClusters"

// DescribeClustersRequest generates a "aws/request.Request" representing the
// client's request for the DescribeClusters operation. The "output" return
// value will be populated with the request's response once the request complets
// successfuly.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeClusters for more information on using the DescribeClusters
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeClustersRequest method.
//    req, resp := client.DescribeClustersRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// Please also see https://docs.aws.amazon.com/goto/WebAPI/cloudhsmv2-2017-04-28/DescribeClusters
func (c *CloudHSMV2) DescribeClustersRequest(input *DescribeClustersInput) (req *request.Request, output *DescribeClustersOutput) {
	op := &request.Operation{
		Name:       opDescribeClusters,
		HTTPMethod: "POST",
		HTTPPath:   "/",
		Paginator: &request.Paginator{
			InputTokens:     []string{"NextToken"},
			OutputTokens:    []string{"NextToken"},
			LimitToken:      "MaxResults",
			TruncationToken: "",
		},
	}

	if input == nil {
		input = &DescribeClustersInput{}
	}

	output = &DescribeClustersOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeClusters API operation for AWS CloudHSM V2.
//
// Gets information about AWS CloudHSM clusters.
//
// This is a paginated operation, which means that each response might contain
// only a subset of all the clusters. When the response contains only a subset
// of clusters, it includes a NextToken value. Use this value in a subsequent
// DescribeClusters request to get more clusters. When you receive a response
// with no NextToken (or an empty or null value), that means there are no more
// clusters to get.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for AWS CloudHSM V2's
// API operation DescribeClusters for usage and error information.
//
// Returned Error Codes:
//   * ErrCodeCloudHsmInternalFailureException "CloudHsmInternalFailureException"
//   The request was rejected because of an AWS CloudHSM internal failure. The
//   request can be retried.
//
//   * ErrCodeCloudHsmServiceException "CloudHsmServiceException"
//   The request was rejected because an error occurred.
//
//   * ErrCodeCloudHsmInvalidRequestException "CloudHsmInvalidRequestException"
//   The request was rejected because it is not a valid request.
//
//   * ErrCodeCloudHsmAccessDeniedException "CloudHsmAccessDeniedException"
//   The request was rejected because the requester does not have permission to
//   perform the requested operation.
//
// Please also see https://docs.aws.amazon.com/goto/WebAPI/cloudhsmv2-2017-04-28/DescribeClusters
func (c *CloudHSMV2) DescribeClusters(input *DescribeClustersInput) (*DescribeClustersOutput, error) {
	req, out := c.DescribeClustersRequest(input)
	return out, req.Send()
}

// DescribeClustersWithContext is the same as DescribeClusters with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeClusters for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *CloudHSMV2) DescribeClustersWithContext(ctx aws.Context, input *DescribeClustersInput, opts ...request.Option) (*DescribeClustersOutput, error) {
	req, out := c.DescribeClustersRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

// DescribeClustersPages iterates over the pages of a DescribeClusters operation,
// calling the "fn" function with the response data for each page. To stop
// iterating, return false from the fn function.
//
// See DescribeClusters method for more information on how to use this operation.
//
// Note: This operation can generate multiple requests to a service.
//
//    // Example iterating over at most 3 pages of a DescribeClusters operation.
//    pageNum := 0
//    err := client.DescribeClustersPages(params,
//        func(page *DescribeClustersOutput, lastPage bool) bool {
//            pageNum++
//            fmt.Println(page)
//            return pageNum <= 3
//        })
//
func (c *CloudHSMV2) DescribeClustersPages(input *DescribeClustersInput, fn func(*DescribeClustersOutput, bool) bool) error {
	return c.DescribeClustersPagesWithContext(aws.BackgroundContext(), input, fn)
}

// DescribeClustersPagesWithContext same as DescribeClustersPages except
// it takes a Context and allows setting request options on the pages.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *CloudHSMV2) DescribeClustersPagesWithContext(ctx aws.Context, input *DescribeClustersInput, fn func(*DescribeClustersOutput, bool) bool, opts ...request.Option) error {
	p := request.Pagination{
		NewRequest: func() (*request.Request, error) {
			var inCpy *DescribeClustersInput
			if input != nil {
				tmp := *input
				inCpy = &tmp
			}
			req, _ := c.DescribeClustersRequest(inCpy)
			req.SetContext(ctx)
			req.ApplyOptions(opts...)
			return req, nil
		},
	}

	cont := true
	for p.Next() && cont {
		cont = fn(p.Page().(*DescribeClustersOutput), !p.HasNextPage())
	}
	return p.Err()
}

const opInitializeCluster = "InitializeCluster"

// InitializeClusterRequest generates a "aws/request.Request" representing the
// client's request for the InitializeCluster operation. The "output" return
// value will be populated with the request's response once the request complets
// successfuly.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See InitializeCluster for more information on using the InitializeCluster
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the InitializeClusterRequest method.
//    req, resp := client.InitializeClusterRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// Please also see https://docs.aws.amazon.com/goto/WebAPI/cloudhsmv2-2017-04-28/InitializeCluster
func (c *CloudHSMV2) InitializeClusterRequest(input *InitializeClusterInput) (req *request.Request, output *InitializeClusterOutput) {
	op := &request.Operation{
		Name:       opInitializeCluster,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &InitializeClusterInput{}
	}

	output = &InitializeClusterOutput{}
	req = c.newRequest(op, input, output)
	return
}

// InitializeCluster API operation for AWS CloudHSM V2.
//
// Claims an AWS CloudHSM cluster by submitting the cluster certificate issued
// by your issuing certificate authority (CA) and the CA's root certificate.
// Before you can claim a cluster, you must sign the cluster's certificate signing
// request (CSR) with your issuing CA. To get the cluster's CSR, use DescribeClusters.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for AWS CloudHSM V2's
// API operation InitializeCluster for usage and error information.
//
// Returned Error Codes:
//   * ErrCodeCloudHsmInternalFailureException "CloudHsmInternalFailureException"
//   The request was rejected because of an AWS CloudHSM internal failure. The
//   request can be retried.
//
//   * ErrCodeCloudHsmServiceException "CloudHsmServiceException"
//   The request was rejected because an error occurred.
//
//   * ErrCodeCloudHsmResourceNotFoundException "CloudHsmResourceNotFoundException"
//   The request was rejected because it refers to a resource that cannot be found.
//
//   * ErrCodeCloudHsmInvalidRequestException "CloudHsmInvalidRequestException"
//   The request was rejected because it is not a valid request.
//
//   * ErrCodeCloudHsmAccessDeniedException "CloudHsmAccessDeniedException"
//   The request was rejected because the requester does not have permission to
//   perform the requested operation.
//
// Please also see https://docs.aws.amazon.com/goto/WebAPI/cloudhsmv2-2017-04-28/InitializeCluster
func (c *CloudHSMV2) InitializeCluster(input *InitializeClusterInput) (*InitializeClusterOutput, error) {
	req, out := c.InitializeClusterRequest(input)
	return out, req.Send()
}

// InitializeClusterWithContext is the same as InitializeCluster with the addition of
// the ability to pass a context and additional request options.
//
// See InitializeCluster for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *CloudHSMV2) InitializeClusterWithContext(ctx aws.Context, input *InitializeClusterInput, opts ...request.Option) (*InitializeClusterOutput, error) {
	req, out := c.InitializeClusterRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opListTags = "ListTags"

// ListTagsRequest generates a "aws/request.Request" representing the
// client's request for the ListTags operation. The "output" return
// value will be populated with the request's response once the request complets
// successfuly.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See ListTags for more information on using the ListTags
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the ListTagsRequest method.
//    req, resp := client.ListTagsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// Please also see https://docs.aws.amazon.com/goto/WebAPI/cloudhsmv2-2017-04-28/ListTags
func (c *CloudHSMV2) ListTagsRequest(input *ListTagsInput) (req *request.Request, output *ListTagsOutput) {
	op := &request.Operation{
		Name:       opListTags,
		HTTPMethod: "POST",
		HTTPPath:   "/",
		Paginator: &request.Paginator{
			InputTokens:     []string{"NextToken"},
			OutputTokens:    []string{"NextToken"},
			LimitToken:      "MaxResults",
			TruncationToken: "",
		},
	}

	if input == nil {
		input = &ListTagsInput{}
	}

	output = &ListTagsOutput{}
	req = c.newRequest(op, input, output)
	return
}

// ListTags API operation for AWS CloudHSM V2.
//
// Gets a list of tags for the specified AWS CloudHSM cluster.
//
// This is a paginated operation, which means that each response might contain
// only a subset of all the tags. When the response contains only a subset of
// tags, it includes a NextToken value. Use this value in a subsequent ListTags
// request to get more tags. When you receive a response with no NextToken (or
// an empty or null value), that means there are no more tags to get.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for AWS CloudHSM V2's
// API operation ListTags for usage and error information.
//
// Returned Error Codes:
//   * ErrCodeCloudHsmInternalFailureException "CloudHsmInternalFailureException"
//   The request was rejected because of an AWS CloudHSM internal failure. The
//   request can be retried.
//
//   * ErrCodeCloudHsmServiceException "CloudHsmServiceException"
//   The request was rejected because an error occurred.
//
//   * ErrCodeCloudHsmResourceNotFoundException "CloudHsmResourceNotFoundException"
//   The request was rejected because it refers to a resource that cannot be found.
//
//   * ErrCodeCloudHsmInvalidRequestException "CloudHsmInvalidRequestException"
//   The request was rejected because it is not a valid request.
//
//   * ErrCodeCloudHsmAccessDeniedException "CloudHsmAccessDeniedException"
//   The request was rejected because the requester does not have permission to
//   perform the requested operation.
//
// Please also see https://docs.aws.amazon.com/goto/WebAPI/cloudhsmv2-2017-04-28/ListTags
func (c *CloudHSMV2) ListTags(input *ListTagsInput) (*ListTagsOutput, error) {
	req, out := c.ListTagsRequest(input)
	return out, req.Send()
}

// ListTagsWithContext is the same as ListTags with the addition of
// the ability to pass a context and additional request options.
//
// See ListTags for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *CloudHSMV2) ListTagsWithContext(ctx aws.Context, input *ListTagsInput, opts ...request.Option) (*ListTagsOutput, error) {
	req, out := c.ListTagsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

// ListTagsPages iterates over the pages of a ListTags operation,
// calling the "fn" function with the response data for each page. To stop
// iterating, return false from the fn function.
//
// See ListTags method for more information on how to use this operation.
//
// Note: This operation can generate multiple requests to a service.
//
//    // Example iterating over at most 3 pages of a ListTags operation.
//    pageNum := 0
//    err := client.ListTagsPages(params,
//        func(page *ListTagsOutput, lastPage bool) bool {
//            pageNum++
//            fmt.Println(page)
//            return pageNum <= 3
//        })
//
func (c *CloudHSMV2) ListTagsPages(input *ListTagsInput, fn func(*ListTagsOutput, bool) bool) error {
	return c.ListTagsPagesWithContext(aws.BackgroundContext(), input, fn)
}

// ListTagsPagesWithContext same as ListTagsPages except
// it takes a Context and allows setting request options on the pages.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *CloudHSMV2) ListTagsPagesWithContext(ctx aws.Context, input *ListTagsInput, fn func(*ListTagsOutput, bool) bool, opts ...request.Option) error {
	p := request.Pagination{
		NewRequest: func() (*request.Request, error) {
			var inCpy *ListTagsInput
			if input != nil {
				tmp := *input
				inCpy = &tmp
			}
			req, _ := c.ListTagsRequest(inCpy)
			req.SetContext(ctx)
			req.ApplyOptions(opts...)
			return req, nil
		},
	}

	cont := true
	for p.Next() && cont {
		cont = fn(p.Page().(*ListTagsOutput), !p.HasNextPage())
	}
	return p.Err()
}

const opTagResource = "TagResource"

// TagResourceRequest generates a "aws/request.Request" representing the
// client's request for the TagResource operation. The "output" return
// value will be populated with the request's response once the request complets
// successfuly.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See TagResource for more information on using the TagResource
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the TagResourceRequest method.
//    req, resp := client.TagResourceRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// Please also see https://docs.aws.amazon.com/goto/WebAPI/cloudhsmv2-2017-04-28/TagResource
func (c *CloudHSMV2) TagResourceRequest(input *TagResourceInput) (req *request.Request, output *TagResourceOutput) {
	op := &request.Operation{
		Name:       opTagResource,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &TagResourceInput{}
	}

	output = &TagResourceOutput{}
	req = c.newRequest(op, input, output)
	return
}

// TagResource API operation for AWS CloudHSM V2.
//
// Adds or overwrites one or more tags for the specified AWS CloudHSM cluster.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for AWS CloudHSM V2's
// API operation TagResource for usage and error information.
//
// Returned Error Codes:
//   * ErrCodeCloudHsmInternalFailureException "CloudHsmInternalFailureException"
//   The request was rejected because of an AWS CloudHSM internal failure. The
//   request can be retried.
//
//   * ErrCodeCloudHsmServiceException "CloudHsmServiceException"
//   The request was rejected because an error occurred.
//
//   * ErrCodeCloudHsmResourceNotFoundException "CloudHsmResourceNotFoundException"
//   The request was rejected because it refers to a resource that cannot be found.
//
//   * ErrCodeCloudHsmInvalidRequestException "CloudHsmInvalidRequestException"
//   The request was rejected because it is not a valid request.
//
//   * ErrCodeCloudHsmAccessDeniedException "CloudHsmAccessDeniedException"
//   The request was rejected because the requester does not have permission to
//   perform the requested operation.
//
// Please also see https://docs.aws.amazon.com/goto/WebAPI/cloudhsmv2-2017-04-28/TagResource
func (c *CloudHSMV2) TagResource(input *TagResourceInput) (*TagResourceOutput, error) {
	req, out := c.TagResourceRequest(input)
	return out, req.Send()
}

// TagResourceWithContext is the same as TagResource with the addition of
// the ability to pass a context and additional request options.
//
// See TagResource for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *CloudHSMV2) TagResourceWithContext(ctx aws.Context, input *TagResourceInput, opts ...request.Option) (*TagResourceOutput, error) {
	req, out := c.TagResourceRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opUntagResource = "UntagResource"

// UntagResourceRequest generates a "aws/request.Request" representing the
// client's request for the UntagResource operation. The "output" return
// value will be populated with the request's response once the request complets
// successfuly.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See UntagResource for more information on using the UntagResource
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the UntagResourceRequest method.
//    req, resp := client.UntagResourceRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// Please also see https://docs.aws.amazon.com/goto/WebAPI/cloudhsmv2-2017-04-28/UntagResource
func (c *CloudHSMV2) UntagResourceRequest(input *UntagResourceInput) (req *request.Request, output *UntagResourceOutput) {
	op := &request.Operation{
		Name:       opUntagResource,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &UntagResourceInput{}
	}

	output = &UntagResourceOutput{}
	req = c.newRequest(op, input, output)
	return
}

// UntagResource API operation for AWS CloudHSM V2.
//
// Removes the specified tag or tags from the specified AWS CloudHSM cluster.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for AWS CloudHSM V2's
// API operation UntagResource for usage and error information.
//
// Returned Error Codes:
//   * ErrCodeCloudHsmInternalFailureException "CloudHsmInternalFailureException"
//   The request was rejected because of an AWS CloudHSM internal failure. The
//   request can be retried.
//
//   * ErrCodeCloudHsmServiceException "CloudHsmServiceException"
//   The request was rejected because an error occurred.
//
//   * ErrCodeCloudHsmResourceNotFoundException "CloudHsmResourceNotFoundException"
//   The request was rejected because it refers to a resource that cannot be found.
//
//   * ErrCodeCloudHsmInvalidRequestException "CloudHsmInvalidRequestException"
//   The request was rejected because it is not a valid request.
//
//   * ErrCodeCloudHsmAccessDeniedException "CloudHsmAccessDeniedException"
//   The request was rejected because the requester does not have permission to
//   perform the requested operation.
//
// Please also see https://docs.aws.amazon.com/goto/WebAPI/cloudhsmv2-2017-04-28/UntagResource
func (c *CloudHSMV2) UntagResource(input *UntagResourceInput) (*UntagResourceOutput, error) {
	req, out := c.UntagResourceRequest(input)
	return out, req.Send()
}

// UntagResourceWithContext is the same as UntagResource with the addition of
// the ability to pass a context and additional request options.
//
// See UntagResource for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *CloudHSMV2) UntagResourceWithContext(ctx aws.Context, input *UntagResourceInput, opts ...request.Option) (*UntagResourceOutput, error) {
	req, out := c.UntagResourceRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

// Contains information about a backup of an AWS CloudHSM cluster.
// Please also see https://docs.aws.amazon.com/goto/WebAPI/cloudhsmv2-2017-04-28/Backup
type Backup struct {
	_ struct{} `type:"structure"`

	// The identifier (ID) of the backup.
	//
	// BackupId is a required field
	BackupId *string `type:"string" required:"true"`

	// The state of the backup.
	BackupState *string `type:"string" enum:"BackupState"`

	// The identifier (ID) of the cluster that was backed up.
	ClusterId *string `type:"string"`

	// The date and time when the backup was created.
	CreateTimestamp *time.Time `type:"timestamp" timestampFormat:"unix"`
}

// String returns the string representation
func (s Backup) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s Backup) GoString() string {
	return s.String()
}

// SetBackupId sets the BackupId field's value.
func (s *Backup) SetBackupId(v string) *Backup {
	s.BackupId = &v
	return s
}

// SetBackupState sets the BackupState field's value.
func (s *Backup) SetBackupState(v string) *Backup {
	s.BackupState = &v
	return s
}

// SetClusterId sets the ClusterId field's value.
func (s *Backup) SetClusterId(v string) *Backup {
	s.ClusterId = &v
	return s
}

// SetCreateTimestamp sets the CreateTimestamp field's value.
func (s *Backup) SetCreateTimestamp(v time.Time) *Backup {
	s.CreateTimestamp = &v
	return s
}

// Contains one or more certificates or a certificate signing request (CSR).
// Please also see https://docs.aws.amazon.com/goto/WebAPI/cloudhsmv2-2017-04-28/Certificates
type Certificates struct {
	_ struct{} `type:"structure"`

	// The HSM hardware certificate issued (signed) by AWS CloudHSM.
	AwsHardwareCertificate *string `type:"string"`

	// The cluster certificate issued (signed) by the issuing certificate authority
	// (CA) of the cluster's owner.
	ClusterCertificate *string `type:"string"`

	// The cluster's certificate signing request (CSR). The CSR exists only when
	// the cluster's state is UNINITIALIZED.
	ClusterCsr *string `type:"string"`

	// The HSM certificate issued (signed) by the HSM hardware.
	HsmCertificate *string `type:"string"`

	// The HSM hardware certificate issued (signed) by the hardware manufacturer.
	ManufacturerHardwareCertificate *string `type:"string"`
}

// String returns the string representation
func (s Certificates) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s Certificates) GoString() string {
	return s.String()
}

// SetAwsHardwareCertificate sets the AwsHardwareCertificate field's value.
func (s *Certificates) SetAwsHardwareCertificate(v string) *Certificates {
	s.AwsHardwareCertificate = &v
	return s
}

// SetClusterCertificate sets the ClusterCertificate field's value.
func (s *Certificates) SetClusterCertificate(v string) *Certificates {
	s.ClusterCertificate = &v
	return s
}

// SetClusterCsr sets the ClusterCsr field's value.
func (s *Certificates) SetClusterCsr(v string) *Certificates {
	s.ClusterCsr = &v
	return s
}

// SetHsmCertificate sets the HsmCertificate field's value.
func (s *Certificates) SetHsmCertificate(v string) *Certificates {
	s.HsmCertificate = &v
	return s
}

// SetManufacturerHardwareCertificate sets the ManufacturerHardwareCertificate field's value.
func (s *Certificates) SetManufacturerHardwareCertificate(v string) *Certificates {
	s.ManufacturerHardwareCertificate = &v
	return s
}

// Contains information about an AWS CloudHSM cluster.
// Please also see https://docs.aws.amazon.com/goto/WebAPI/cloudhsmv2-2017-04-28/Cluster
type Cluster struct {
	_ struct{} `type:"structure"`

	// The cluster's backup policy.
	BackupPolicy *string `type:"string" enum:"BackupPolicy"`

	// Contains one or more certificates or a certificate signing request (CSR).
	Certificates *Certificates `type:"structure"`

	// The cluster's identifier (ID).
	ClusterId *string `type:"string"`

	// The date and time when the cluster was created.
	CreateTimestamp *time.Time `type:"timestamp" timestampFormat:"unix"`

	// The type of HSM that the cluster contains.
	HsmType *string `type:"string"`

	// Contains information about the HSMs in the cluster.
	Hsms []*Hsm `type:"list"`

	// The default password for the cluster's Pre-Crypto Officer (PRECO) user.
	PreCoPassword *string `min:"7" type:"string"`

	// The identifier (ID) of the cluster's security group.
	SecurityGroup *string `type:"string"`

	// The identifier (ID) of the backup used to create the cluster. This value
	// exists only when the cluster was created from a backup.
	SourceBackupId *string `type:"string"`

	// The cluster's state.
	State *string `type:"string" enum:"ClusterState"`

	// A description of the cluster's state.
	StateMessage *string `type:"string"`

	// A map of the cluster's subnets and their corresponding Availability Zones.
	SubnetMapping map[string]*string `type:"map"`

	// The identifier (ID) of the virtual private cloud (VPC) that contains the
	// cluster.
	VpcId *string `type:"string"`
}

// String returns the string representation
func (s Cluster) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s Cluster) GoString() string {
	return s.String()
}

// SetBackupPolicy sets the BackupPolicy field's value.
func (s *Cluster) SetBackupPolicy(v string) *Cluster {
	s.BackupPolicy = &v
	return s
}

// SetCertificates sets the Certificates field's value.
func (s *Cluster) SetCertificates(v *Certificates) *Cluster {
	s.Certificates = v
	return s
}

// SetClusterId sets the ClusterId field's value.
func (s *Cluster) SetClusterId(v string) *Cluster {
	s.ClusterId = &v
	return s
}

// SetCreateTimestamp sets the CreateTimestamp field's value.
func (s *Cluster) SetCreateTimestamp(v time.Time) *Cluster {
	s.CreateTimestamp = &v
	return s
}

// SetHsmType sets the HsmType field's value.
func (s *Cluster) SetHsmType(v string) *Cluster {
	s.HsmType = &v
	return s
}

// SetHsms sets the Hsms field's value.
func (s *Cluster) SetHsms(v []*Hsm) *Cluster {
	s.Hsms = v
	return s
}

// SetPreCoPassword sets the PreCoPassword field's value.
func (s *Cluster) SetPreCoPassword(v string) *Cluster {
	s.PreCoPassword = &v
	return s
}

// SetSecurityGroup sets the SecurityGroup field's value.
func (s *Cluster) SetSecurityGroup(v string) *Cluster {
	s.SecurityGroup = &v
	return s
}

// SetSourceBackupId sets the SourceBackupId field's value.
func (s *Cluster) SetSourceBackupId(v string) *Cluster {
	s.SourceBackupId = &v
	return s
}

// SetState sets the State field's value.
func (s *Cluster) SetState(v string) *Cluster {
	s.State = &v
	return s
}

// SetStateMessage sets the StateMessage field's value.
func (s *Cluster) SetStateMessage(v string) *Cluster {
	s.StateMessage = &v
	return s
}

// SetSubnetMapping sets the SubnetMapping field's value.
func (s *Cluster) SetSubnetMapping(v map[string]*string) *Cluster {
	s.SubnetMapping = v
	return s
}

// SetVpcId sets the VpcId field's value.
func (s *Cluster) SetVpcId(v string) *Cluster {
	s.VpcId = &v
	return s
}

// Please also see https://docs.aws.amazon.com/goto/WebAPI/cloudhsmv2-2017-04-28/CreateClusterRequest
type CreateClusterInput struct {
	_ struct{} `type:"structure"`

	// The type of HSM to use in the cluster. Currently the only allowed value is
	// hsm1.medium.
	//
	// HsmType is a required field
	HsmType *string `type:"string" required:"true"`

	// The identifier (ID) of the cluster backup to restore. Use this value to restore
	// the cluster from a backup instead of creating a new cluster. To find the
	// backup ID, use DescribeBackups.
	SourceBackupId *string `type:"string"`

	// The identifiers (IDs) of the subnets where you are creating the cluster.
	// You must specify at least one subnet. If you specify multiple subnets, they
	// must meet the following criteria:
	//
	//    * All subnets must be in the same virtual private cloud (VPC).
	//
	//    * You can specify only one subnet per Availability Zone.
	//
	// SubnetIds is a required field
	SubnetIds []*string `min:"1" type:"list" required:"true"`
}

// String returns the string representation
func (s CreateClusterInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateClusterInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *CreateClusterInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "CreateClusterInput"}
	if s.HsmType == nil {
		invalidParams.Add(request.NewErrParamRequired("HsmType"))
	}
	if s.SubnetIds == nil {
		invalidParams.Add(request.NewErrParamRequired("SubnetIds"))
	}
	if s.SubnetIds != nil && len(s.SubnetIds) < 1 {
		invalidParams.Add(request.NewErrParamMinLen("SubnetIds", 1))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetHsmType sets the HsmType field's value.
func (s *CreateClusterInput) SetHsmType(v string) *CreateClusterInput {
	s.HsmType = &v
	return s
}

// SetSourceBackupId sets the SourceBackupId field's value.
func (s *CreateClusterInput) SetSourceBackupId(v string) *CreateClusterInput {
	s.SourceBackupId = &v
	return s
}

// SetSubnetIds sets the SubnetIds field's value.
func (s *CreateClusterInput) SetSubnetIds(v []*string) *CreateClusterInput {
	s.SubnetIds = v
	return s
}

// Please also see https://docs.aws.amazon.com/goto/WebAPI/cloudhsmv2-2017-04-28/CreateClusterResponse
type CreateClusterOutput struct {
	_ struct{} `type:"structure"`

	// Information about the cluster that was created.
	Cluster *Cluster `type:"structure"`
}

// String returns the string representation
func (s CreateClusterOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateClusterOutput) GoString() string {
	return s.String()
}

// SetCluster sets the Cluster field's value.
func (s *CreateClusterOutput) SetCluster(v *Cluster) *CreateClusterOutput {
	s.Cluster = v
	return s
}

// Please also see https://docs.aws.amazon.com/goto/WebAPI/cloudhsmv2-2017-04-28/CreateHsmRequest
type CreateHsmInput struct {
	_ struct{} `type:"structure"`

	// The Availability Zone where you are creating the HSM. To find the cluster's
	// Availability Zones, use DescribeClusters.
	//
	// AvailabilityZone is a required field
	AvailabilityZone *string `type:"string" required:"true"`

	// The identifier (ID) of the HSM's cluster. To find the cluster ID, use DescribeClusters.
	//
	// ClusterId is a required field
	ClusterId *string `type:"string" required:"true"`

	// The HSM's IP address. If you specify an IP address, use an available address
	// from the subnet that maps to the Availability Zone where you are creating
	// the HSM. If you don't specify an IP address, one is chosen for you from that
	// subnet.
	IpAddress *string `type:"string"`
}

// String returns the string representation
func (s CreateHsmInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateHsmInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *CreateHsmInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "CreateHsmInput"}
	if s.AvailabilityZone == nil {
		invalidParams.Add(request.NewErrParamRequired("AvailabilityZone"))
	}
	if s.ClusterId == nil {
		invalidParams.Add(request.NewErrParamRequired("ClusterId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetAvailabilityZone sets the AvailabilityZone field's value.
func (s *CreateHsmInput) SetAvailabilityZone(v string) *CreateHsmInput {
	s.AvailabilityZone = &v
	return s
}

// SetClusterId sets the ClusterId field's value.
func (s *CreateHsmInput) SetClusterId(v string) *CreateHsmInput {
	s.ClusterId = &v
	return s
}

// SetIpAddress sets the IpAddress field's value.
func (s *CreateHsmInput) SetIpAddress(v string) *CreateHsmInput {
	s.IpAddress = &v
	return s
}

// Please also see https://docs.aws.amazon.com/goto/WebAPI/cloudhsmv2-2017-04-28/CreateHsmResponse
type CreateHsmOutput struct {
	_ struct{} `type:"structure"`

	// Information about the HSM that was created.
	Hsm *Hsm `type:"structure"`
}

// String returns the string representation
func (s CreateHsmOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateHsmOutput) GoString() string {
	return s.String()
}

// SetHsm sets the Hsm field's value.
func (s *CreateHsmOutput) SetHsm(v *Hsm) *CreateHsmOutput {
	s.Hsm = v
	return s
}

// Please also see https://docs.aws.amazon.com/goto/WebAPI/cloudhsmv2-2017-04-28/DeleteClusterRequest
type DeleteClusterInput struct {
	_ struct{} `type:"structure"`

	// The identifier (ID) of the cluster that you are deleting. To find the cluster
	// ID, use DescribeClusters.
	//
	// ClusterId is a required field
	ClusterId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s DeleteClusterInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteClusterInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DeleteClusterInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DeleteClusterInput"}
	if s.ClusterId == nil {
		invalidParams.Add(request.NewErrParamRequired("ClusterId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetClusterId sets the ClusterId field's value.
func (s *DeleteClusterInput) SetClusterId(v string) *DeleteClusterInput {
	s.ClusterId = &v
	return s
}

// Please also see https://docs.aws.amazon.com/goto/WebAPI/cloudhsmv2-2017-04-28/DeleteClusterResponse
type DeleteClusterOutput struct {
	_ struct{} `type:"structure"`

	// Information about the cluster that was deleted.
	Cluster *Cluster `type:"structure"`
}

// String returns the string representation
func (s DeleteClusterOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteClusterOutput) GoString() string {
	return s.String()
}

// SetCluster sets the Cluster field's value.
func (s *DeleteClusterOutput) SetCluster(v *Cluster) *DeleteClusterOutput {
	s.Cluster = v
	return s
}

// Please also see https://docs.aws.amazon.com/goto/WebAPI/cloudhsmv2-2017-04-28/DeleteHsmRequest
type DeleteHsmInput struct {
	_ struct{} `type:"structure"`

	// The identifier (ID) of the cluster that contains the HSM that you are deleting.
	//
	// ClusterId is a required field
	ClusterId *string `type:"string" required:"true"`

	// The identifier (ID) of the elastic network interface (ENI) of the HSM that
	// you are deleting.
	EniId *string `type:"string"`

	// The IP address of the elastic network interface (ENI) of the HSM that you
	// are deleting.
	EniIp *string `type:"string"`

	// The identifier (ID) of the HSM that you are deleting.
	HsmId *string `type:"string"`
}

// String returns the string representation
func (s DeleteHsmInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteHsmInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DeleteHsmInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DeleteHsmInput"}
	if s.ClusterId == nil {
		invalidParams.Add(request.NewErrParamRequired("ClusterId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetClusterId sets the ClusterId field's value.
func (s *DeleteHsmInput) SetClusterId(v string) *DeleteHsmInput {
	s.ClusterId = &v
	return s
}

// SetEniId sets the EniId field's value.
func (s *DeleteHsmInput) SetEniId(v string) *DeleteHsmInput {
	s.EniId = &v
	return s
}

// SetEniIp sets the EniIp field's value.
func (s *DeleteHsmInput) SetEniIp(v string) *DeleteHsmInput {
	s.EniIp = &v
	return s
}

// SetHsmId sets the HsmId field's value.
func (s *DeleteHsmInput) SetHsmId(v string) *DeleteHsmInput {
	s.HsmId = &v
	return s
}

// Please also see https://docs.aws.amazon.com/goto/WebAPI/cloudhsmv2-2017-04-28/DeleteHsmResponse
type DeleteHsmOutput struct {
	_ struct{} `type:"structure"`

	// The identifier (ID) of the HSM that was deleted.
	HsmId *string `type:"string"`
}

// String returns the string representation
func (s DeleteHsmOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteHsmOutput) GoString() string {
	return s.String()
}

// SetHsmId sets the HsmId field's value.
func (s *DeleteHsmOutput) SetHsmId(v string) *DeleteHsmOutput {
	s.HsmId = &v
	return s
}

// Please also see https://docs.aws.amazon.com/goto/WebAPI/cloudhsmv2-2017-04-28/DescribeBackupsRequest
type DescribeBackupsInput struct {
	_ struct{} `type:"structure"`

	// One or more filters to limit the items returned in the response.
	//
	// Use the backupIds filter to return only the specified backups. Specify backups
	// by their backup identifier (ID).
	//
	// Use the clusterIds filter to return only the backups for the specified clusters.
	// Specify clusters by their cluster identifier (ID).
	//
	// Use the states filter to return only backups that match the specified state.
	Filters map[string][]*string `type:"map"`

	// The maximum number of backups to return in the response. When there are more
	// backups than the number you specify, the response contains a NextToken value.
	MaxResults *int64 `min:"1" type:"integer"`

	// The NextToken value that you received in the previous response. Use this
	// value to get more backups.
	NextToken *string `type:"string"`
}

// String returns the string representation
func (s DescribeBackupsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeBackupsInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DescribeBackupsInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DescribeBackupsInput"}
	if s.MaxResults != nil && *s.MaxResults < 1 {
		invalidParams.Add(request.NewErrParamMinValue("MaxResults", 1))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetFilters sets the Filters field's value.
func (s *DescribeBackupsInput) SetFilters(v map[string][]*string) *DescribeBackupsInput {
	s.Filters = v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *DescribeBackupsInput) SetMaxResults(v int64) *DescribeBackupsInput {
	s.MaxResults = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeBackupsInput) SetNextToken(v string) *DescribeBackupsInput {
	s.NextToken = &v
	return s
}

// Please also see https://docs.aws.amazon.com/goto/WebAPI/cloudhsmv2-2017-04-28/DescribeBackupsResponse
type DescribeBackupsOutput struct {
	_ struct{} `type:"structure"`

	// A list of backups.
	Backups []*Backup `type:"list"`

	// An opaque string that indicates that the response contains only a subset
	// of backups. Use this value in a subsequent DescribeBackups request to get
	// more backups.
	NextToken *string `type:"string"`
}

// String returns the string representation
func (s DescribeBackupsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeBackupsOutput) GoString() string {
	return s.String()
}

// SetBackups sets the Backups field's value.
func (s *DescribeBackupsOutput) SetBackups(v []*Backup) *DescribeBackupsOutput {
	s.Backups = v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeBackupsOutput) SetNextToken(v string) *DescribeBackupsOutput {
	s.NextToken = &v
	return s
}

// Please also see https://docs.aws.amazon.com/goto/WebAPI/cloudhsmv2-2017-04-28/DescribeClustersRequest
type DescribeClustersInput struct {
	_ struct{} `type:"structure"`

	// One or more filters to limit the items returned in the response.
	//
	// Use the clusterIds filter to return only the specified clusters. Specify
	// clusters by their cluster identifier (ID).
	//
	// Use the vpcIds filter to return only the clusters in the specified virtual
	// private clouds (VPCs). Specify VPCs by their VPC identifier (ID).
	//
	// Use the states filter to return only clusters that match the specified state.
	Filters map[string][]*string `type:"map"`

	// The maximum number of clusters to return in the response. When there are
	// more clusters than the number you specify, the response contains a NextToken
	// value.
	MaxResults *int64 `min:"1" type:"integer"`

	// The NextToken value that you received in the previous response. Use this
	// value to get more clusters.
	NextToken *string `type:"string"`
}

// String returns the string representation
func (s DescribeClustersInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeClustersInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DescribeClustersInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DescribeClustersInput"}
	if s.MaxResults != nil && *s.MaxResults < 1 {
		invalidParams.Add(request.NewErrParamMinValue("MaxResults", 1))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetFilters sets the Filters field's value.
func (s *DescribeClustersInput) SetFilters(v map[string][]*string) *DescribeClustersInput {
	s.Filters = v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *DescribeClustersInput) SetMaxResults(v int64) *DescribeClustersInput {
	s.MaxResults = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeClustersInput) SetNextToken(v string) *DescribeClustersInput {
	s.NextToken = &v
	return s
}

// Please also see https://docs.aws.amazon.com/goto/WebAPI/cloudhsmv2-2017-04-28/DescribeClustersResponse
type DescribeClustersOutput struct {
	_ struct{} `type:"structure"`

	// A list of clusters.
	Clusters []*Cluster `type:"list"`

	// An opaque string that indicates that the response contains only a subset
	// of clusters. Use this value in a subsequent DescribeClusters request to get
	// more clusters.
	NextToken *string `type:"string"`
}

// String returns the string representation
func (s DescribeClustersOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeClustersOutput) GoString() string {
	return s.String()
}

// SetClusters sets the Clusters field's value.
func (s *DescribeClustersOutput) SetClusters(v []*Cluster) *DescribeClustersOutput {
	s.Clusters = v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeClustersOutput) SetNextToken(v string) *DescribeClustersOutput {
	s.NextToken = &v
	return s
}

// Contains information about a hardware security module (HSM) in an AWS CloudHSM
// cluster.
// Please also see https://docs.aws.amazon.com/goto/WebAPI/cloudhsmv2-2017-04-28/Hsm
type Hsm struct {
	_ struct{} `type:"structure"`

	// The Availability Zone that contains the HSM.
	AvailabilityZone *string `type:"string"`

	// The identifier (ID) of the cluster that contains the HSM.
	ClusterId *string `type:"string"`

	// The identifier (ID) of the HSM's elastic network interface (ENI).
	EniId *string `type:"string"`

	// The IP address of the HSM's elastic network interface (ENI).
	EniIp *string `type:"string"`

	// The HSM's identifier (ID).
	//
	// HsmId is a required field
	HsmId *string `type:"string" required:"true"`

	// The HSM's state.
	State *string `type:"string" enum:"HsmState"`

	// A description of the HSM's state.
	StateMessage *string `type:"string"`

	// The subnet that contains the HSM's elastic network interface (ENI).
	SubnetId *string `type:"string"`
}

// String returns the string representation
func (s Hsm) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s Hsm) GoString() string {
	return s.String()
}

// SetAvailabilityZone sets the AvailabilityZone field's value.
func (s *Hsm) SetAvailabilityZone(v string) *Hsm {
	s.AvailabilityZone = &v
	return s
}

// SetClusterId sets the ClusterId field's value.
func (s *Hsm) SetClusterId(v string) *Hsm {
	s.ClusterId = &v
	return s
}

// SetEniId sets the EniId field's value.
func (s *Hsm) SetEniId(v string) *Hsm {
	s.EniId = &v
	return s
}

// SetEniIp sets the EniIp field's value.
func (s *Hsm) SetEniIp(v string) *Hsm {
	s.EniIp = &v
	return s
}

// SetHsmId sets the HsmId field's value.
func (s *Hsm) SetHsmId(v string) *Hsm {
	s.HsmId = &v
	return s
}

// SetState sets the State field's value.
func (s *Hsm) SetState(v string) *Hsm {
	s.State = &v
	return s
}

// SetStateMessage sets the StateMessage field's value.
func (s *Hsm) SetStateMessage(v string) *Hsm {
	s.StateMessage = &v
	return s
}

// SetSubnetId sets the SubnetId field's value.
func (s *Hsm) SetSubnetId(v string) *Hsm {
	s.SubnetId = &v
	return s
}

// Please also see https://docs.aws.amazon.com/goto/WebAPI/cloudhsmv2-2017-04-28/InitializeClusterRequest
type InitializeClusterInput struct {
	_ struct{} `type:"structure"`

	// The identifier (ID) of the cluster that you are claiming. To find the cluster
	// ID, use DescribeClusters.
	//
	// ClusterId is a required field
	ClusterId *string `type:"string" required:"true"`

	// The cluster certificate issued (signed) by your issuing certificate authority
	// (CA). The certificate must be in PEM format.
	//
	// SignedCert is a required field
	SignedCert *string `type:"string" required:"true"`

	// The issuing certificate of the issuing certificate authority (CA) that issued
	// (signed) the cluster certificate. This can be a root (self-signed) certificate
	// or a certificate chain that begins with the certificate that issued the cluster
	// certificate and ends with a root certificate. The certificate or certificate
	// chain must be in PEM format.
	//
	// TrustAnchor is a required field
	TrustAnchor *string `type:"string" required:"true"`
}

// String returns the string representation
func (s InitializeClusterInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s InitializeClusterInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *InitializeClusterInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "InitializeClusterInput"}
	if s.ClusterId == nil {
		invalidParams.Add(request.NewErrParamRequired("ClusterId"))
	}
	if s.SignedCert == nil {
		invalidParams.Add(request.NewErrParamRequired("SignedCert"))
	}
	if s.TrustAnchor == nil {
		invalidParams.Add(request.NewErrParamRequired("TrustAnchor"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetClusterId sets the ClusterId field's value.
func (s *InitializeClusterInput) SetClusterId(v string) *InitializeClusterInput {
	s.ClusterId = &v
	return s
}

// SetSignedCert sets the SignedCert field's value.
func (s *InitializeClusterInput) SetSignedCert(v string) *InitializeClusterInput {
	s.SignedCert = &v
	return s
}

// SetTrustAnchor sets the TrustAnchor field's value.
func (s *InitializeClusterInput) SetTrustAnchor(v string) *InitializeClusterInput {
	s.TrustAnchor = &v
	return s
}

// Please also see https://docs.aws.amazon.com/goto/WebAPI/cloudhsmv2-2017-04-28/InitializeClusterResponse
type InitializeClusterOutput struct {
	_ struct{} `type:"structure"`

	// The cluster's state.
	State *string `type:"string" enum:"ClusterState"`

	// A description of the cluster's state.
	StateMessage *string `type:"string"`
}

// String returns the string representation
func (s InitializeClusterOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s InitializeClusterOutput) GoString() string {
	return s.String()
}

// SetState sets the State field's value.
func (s *InitializeClusterOutput) SetState(v string) *InitializeClusterOutput {
	s.State = &v
	return s
}

// SetStateMessage sets the StateMessage field's value.
func (s *InitializeClusterOutput) SetStateMessage(v string) *InitializeClusterOutput {
	s.StateMessage = &v
	return s
}

// Please also see https://docs.aws.amazon.com/goto/WebAPI/cloudhsmv2-2017-04-28/ListTagsRequest
type ListTagsInput struct {
	_ struct{} `type:"structure"`

	// The maximum number of tags to return in the response. When there are more
	// tags than the number you specify, the response contains a NextToken value.
	MaxResults *int64 `min:"1" type:"integer"`

	// The NextToken value that you received in the previous response. Use this
	// value to get more tags.
	NextToken *string `type:"string"`

	// The cluster identifier (ID) for the cluster whose tags you are getting. To
	// find the cluster ID, use DescribeClusters.
	//
	// ResourceId is a required field
	ResourceId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s ListTagsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ListTagsInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *ListTagsInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "ListTagsInput"}
	if s.MaxResults != nil && *s.MaxResults < 1 {
		invalidParams.Add(request.NewErrParamMinValue("MaxResults", 1))
	}
	if s.ResourceId == nil {
		invalidParams.Add(request.NewErrParamRequired("ResourceId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetMaxResults sets the MaxResults field's value.
func (s *ListTagsInput) SetMaxResults(v int64) *ListTagsInput {
	s.MaxResults = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *ListTagsInput) SetNextToken(v string) *ListTagsInput {
	s.NextToken = &v
	return s
}

// SetResourceId sets the ResourceId field's value.
func (s *ListTagsInput) SetResourceId(v string) *ListTagsInput {
	s.ResourceId = &v
	return s
}

// Please also see https://docs.aws.amazon.com/goto/WebAPI/cloudhsmv2-2017-04-28/ListTagsResponse
type ListTagsOutput struct {
	_ struct{} `type:"structure"`

	// An opaque string that indicates that the response contains only a subset
	// of tags. Use this value in a subsequent ListTags request to get more tags.
	NextToken *string `type:"string"`

	// A list of tags.
	//
	// TagList is a required field
	TagList []*Tag `min:"1" type:"list" required:"true"`
}

// String returns the string representation
func (s ListTagsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ListTagsOutput) GoString() string {
	return s.String()
}

// SetNextToken sets the NextToken field's value.
func (s *ListTagsOutput) SetNextToken(v string) *ListTagsOutput {
	s.NextToken = &v
	return s
}

// SetTagList sets the TagList field's value.
func (s *ListTagsOutput) SetTagList(v []*Tag) *ListTagsOutput {
	s.TagList = v
	return s
}

// Contains a tag. A tag is a key-value pair.
// Please also see https://docs.aws.amazon.com/goto/WebAPI/cloudhsmv2-2017-04-28/Tag
type Tag struct {
	_ struct{} `type:"structure"`

	// The key of the tag.
	//
	// Key is a required field
	Key *string `min:"1" type:"string" required:"true"`

	// The value of the tag.
	//
	// Value is a required field
	Value *string `type:"string" required:"true"`
}

// String returns the string representation
func (s Tag) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s Tag) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *Tag) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "Tag"}
	if s.Key == nil {
		invalidParams.Add(request.NewErrParamRequired("Key"))
	}
	if s.Key != nil && len(*s.Key) < 1 {
		invalidParams.Add(request.NewErrParamMinLen("Key", 1))
	}
	if s.Value == nil {
		invalidParams.Add(request.NewErrParamRequired("Value"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetKey sets the Key field's value.
func (s *Tag) SetKey(v string) *Tag {
	s.Key = &v
	return s
}

// SetValue sets the Value field's value.
func (s *Tag) SetValue(v string) *Tag {
	s.Value = &v
	return s
}

// Please also see https://docs.aws.amazon.com/goto/WebAPI/cloudhsmv2-2017-04-28/TagResourceRequest
type TagResourceInput struct {
	_ struct{} `type:"structure"`

	// The cluster identifier (ID) for the cluster that you are tagging. To find
	// the cluster ID, use DescribeClusters.
	//
	// ResourceId is a required field
	ResourceId *string `type:"string" required:"true"`

	// A list of one or more tags.
	//
	// TagList is a required field
	TagList []*Tag `min:"1" type:"list" required:"true"`
}

// String returns the string representation
func (s TagResourceInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s TagResourceInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *TagResourceInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "TagResourceInput"}
	if s.ResourceId == nil {
		invalidParams.Add(request.NewErrParamRequired("ResourceId"))
	}
	if s.TagList == nil {
		invalidParams.Add(request.NewErrParamRequired("TagList"))
	}
	if s.TagList != nil && len(s.TagList) < 1 {
		invalidParams.Add(request.NewErrParamMinLen("TagList", 1))
	}
	if s.TagList != nil {
		for i, v := range s.TagList {
			if v == nil {
				continue
			}
			if err := v.Validate(); err != nil {
				invalidParams.AddNested(fmt.Sprintf("%s[%v]", "TagList", i), err.(request.ErrInvalidParams))
			}
		}
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetResourceId sets the ResourceId field's value.
func (s *TagResourceInput) SetResourceId(v string) *TagResourceInput {
	s.ResourceId = &v
	return s
}

// SetTagList sets the TagList field's value.
func (s *TagResourceInput) SetTagList(v []*Tag) *TagResourceInput {
	s.TagList = v
	return s
}

// Please also see https://docs.aws.amazon.com/goto/WebAPI/cloudhsmv2-2017-04-28/TagResourceResponse
type TagResourceOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s TagResourceOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s TagResourceOutput) GoString() string {
	return s.String()
}

// Please also see https://docs.aws.amazon.com/goto/WebAPI/cloudhsmv2-2017-04-28/UntagResourceRequest
type UntagResourceInput struct {
	_ struct{} `type:"structure"`

	// The cluster identifier (ID) for the cluster whose tags you are removing.
	// To find the cluster ID, use DescribeClusters.
	//
	// ResourceId is a required field
	ResourceId *string `type:"string" required:"true"`

	// A list of one or more tag keys for the tags that you are removing. Specify
	// only the tag keys, not the tag values.
	//
	// TagKeyList is a required field
	TagKeyList []*string `min:"1" type:"list" required:"true"`
}

// String returns the string representation
func (s UntagResourceInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s UntagResourceInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *UntagResourceInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "UntagResourceInput"}
	if s.ResourceId == nil {
		invalidParams.Add(request.NewErrParamRequired("ResourceId"))
	}
	if s.TagKeyList == nil {
		invalidParams.Add(request.NewErrParamRequired("TagKeyList"))
	}
	if s.TagKeyList != nil && len(s.TagKeyList) < 1 {
		invalidParams.Add(request.NewErrParamMinLen("TagKeyList", 1))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetResourceId sets the ResourceId field's value.
func (s *UntagResourceInput) SetResourceId(v string) *UntagResourceInput {
	s.ResourceId = &v
	return s
}

// SetTagKeyList sets the TagKeyList field's value.
func (s *UntagResourceInput) SetTagKeyList(v []*string) *UntagResourceInput {
	s.TagKeyList = v
	return s
}

// Please also see https://docs.aws.amazon.com/goto/WebAPI/cloudhsmv2-2017-04-28/UntagResourceResponse
type UntagResourceOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s UntagResourceOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s UntagResourceOutput) GoString() string {
	return s.String()
}

const (
	// BackupPolicyDefault is a BackupPolicy enum value
	BackupPolicyDefault = "DEFAULT"
)

const (
	// BackupStateCreateInProgress is a BackupState enum value
	BackupStateCreateInProgress = "CREATE_IN_PROGRESS"

	// BackupStateReady is a BackupState enum value
	BackupStateReady = "READY"

	// BackupStateDeleted is a BackupState enum value
	BackupStateDeleted = "DELETED"
)

const (
	// ClusterStateCreateInProgress is a ClusterState enum value
	ClusterStateCreateInProgress = "CREATE_IN_PROGRESS"

	// ClusterStateUninitialized is a ClusterState enum value
	ClusterStateUninitialized = "UNINITIALIZED"

	// ClusterStateInitializeInProgress is a ClusterState enum value
	ClusterStateInitializeInProgress = "INITIALIZE_IN_PROGRESS"

	// ClusterStateInitialized is a ClusterState enum value
	ClusterStateInitialized = "INITIALIZED"

	// ClusterStateActive is a ClusterState enum value
	ClusterStateActive = "ACTIVE"

	// ClusterStateUpdateInProgress is a ClusterState enum value
	ClusterStateUpdateInProgress = "UPDATE_IN_PROGRESS"

	// ClusterStateDeleteInProgress is a ClusterState enum value
	ClusterStateDeleteInProgress = "DELETE_IN_PROGRESS"

	// ClusterStateDeleted is a ClusterState enum value
	ClusterStateDeleted = "DELETED"

	// ClusterStateDegraded is a ClusterState enum value
	ClusterStateDegraded = "DEGRADED"
)

const (
	// HsmStateCreateInProgress is a HsmState enum value
	HsmStateCreateInProgress = "CREATE_IN_PROGRESS"

	// HsmStateActive is a HsmState enum value
	HsmStateActive = "ACTIVE"

	// HsmStateDegraded is a HsmState enum value
	HsmStateDegraded = "DEGRADED"

	// HsmStateDeleteInProgress is a HsmState enum value
	HsmStateDeleteInProgress = "DELETE_IN_PROGRESS"

	// HsmStateDeleted is a HsmState enum value
	HsmStateDeleted = "DELETED"
)
