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

package synthetics

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"
	"github.com/aws/aws-sdk-go/private/protocol"
	"github.com/aws/aws-sdk-go/private/protocol/restjson"
)

const opAssociateResource = "AssociateResource"

// AssociateResourceRequest generates a "aws/request.Request" representing the
// client's request for the AssociateResource operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// 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 AssociateResource for more information on using the AssociateResource
// 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 AssociateResourceRequest method.
//	req, resp := client.AssociateResourceRequest(params)
//
//	err := req.Send()
//	if err == nil { // resp is now filled
//	    fmt.Println(resp)
//	}
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/synthetics-2017-10-11/AssociateResource
func (c *Synthetics) AssociateResourceRequest(input *AssociateResourceInput) (req *request.Request, output *AssociateResourceOutput) {
	op := &request.Operation{
		Name:       opAssociateResource,
		HTTPMethod: "PATCH",
		HTTPPath:   "/group/{groupIdentifier}/associate",
	}

	if input == nil {
		input = &AssociateResourceInput{}
	}

	output = &AssociateResourceOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(restjson.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// AssociateResource API operation for Synthetics.
//
// Associates a canary with a group. Using groups can help you with managing
// and automating your canaries, and you can also view aggregated run results
// and statistics for all canaries in a group.
//
// You must run this operation in the Region where the canary exists.
//
// 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 Synthetics's
// API operation AssociateResource for usage and error information.
//
// Returned Error Types:
//
//   - InternalServerException
//     An unknown internal error occurred.
//
//   - ValidationException
//     A parameter could not be validated.
//
//   - ResourceNotFoundException
//     One of the specified resources was not found.
//
//   - ConflictException
//     A conflicting operation is already in progress.
//
//   - ServiceQuotaExceededException
//     The request exceeded a service quota value.
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/synthetics-2017-10-11/AssociateResource
func (c *Synthetics) AssociateResource(input *AssociateResourceInput) (*AssociateResourceOutput, error) {
	req, out := c.AssociateResourceRequest(input)
	return out, req.Send()
}

// AssociateResourceWithContext is the same as AssociateResource with the addition of
// the ability to pass a context and additional request options.
//
// See AssociateResource 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 *Synthetics) AssociateResourceWithContext(ctx aws.Context, input *AssociateResourceInput, opts ...request.Option) (*AssociateResourceOutput, error) {
	req, out := c.AssociateResourceRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opCreateCanary = "CreateCanary"

// CreateCanaryRequest generates a "aws/request.Request" representing the
// client's request for the CreateCanary operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// 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 CreateCanary for more information on using the CreateCanary
// 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 CreateCanaryRequest method.
//	req, resp := client.CreateCanaryRequest(params)
//
//	err := req.Send()
//	if err == nil { // resp is now filled
//	    fmt.Println(resp)
//	}
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/synthetics-2017-10-11/CreateCanary
func (c *Synthetics) CreateCanaryRequest(input *CreateCanaryInput) (req *request.Request, output *CreateCanaryOutput) {
	op := &request.Operation{
		Name:       opCreateCanary,
		HTTPMethod: "POST",
		HTTPPath:   "/canary",
	}

	if input == nil {
		input = &CreateCanaryInput{}
	}

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

// CreateCanary API operation for Synthetics.
//
// Creates a canary. Canaries are scripts that monitor your endpoints and APIs
// from the outside-in. Canaries help you check the availability and latency
// of your web services and troubleshoot anomalies by investigating load time
// data, screenshots of the UI, logs, and metrics. You can set up a canary to
// run continuously or just once.
//
// Do not use CreateCanary to modify an existing canary. Use UpdateCanary (https://docs.aws.amazon.com/AmazonSynthetics/latest/APIReference/API_UpdateCanary.html)
// instead.
//
// To create canaries, you must have the CloudWatchSyntheticsFullAccess policy.
// If you are creating a new IAM role for the canary, you also need the iam:CreateRole,
// iam:CreatePolicy and iam:AttachRolePolicy permissions. For more information,
// see Necessary Roles and Permissions (https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_Roles).
//
// Do not include secrets or proprietary information in your canary names. The
// canary name makes up part of the Amazon Resource Name (ARN) for the canary,
// and the ARN is included in outbound calls over the internet. For more information,
// see Security Considerations for Synthetics Canaries (https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/servicelens_canaries_security.html).
//
// 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 Synthetics's
// API operation CreateCanary for usage and error information.
//
// Returned Error Types:
//
//   - InternalServerException
//     An unknown internal error occurred.
//
//   - ValidationException
//     A parameter could not be validated.
//
//   - RequestEntityTooLargeException
//     One of the input resources is larger than is allowed.
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/synthetics-2017-10-11/CreateCanary
func (c *Synthetics) CreateCanary(input *CreateCanaryInput) (*CreateCanaryOutput, error) {
	req, out := c.CreateCanaryRequest(input)
	return out, req.Send()
}

// CreateCanaryWithContext is the same as CreateCanary with the addition of
// the ability to pass a context and additional request options.
//
// See CreateCanary 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 *Synthetics) CreateCanaryWithContext(ctx aws.Context, input *CreateCanaryInput, opts ...request.Option) (*CreateCanaryOutput, error) {
	req, out := c.CreateCanaryRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opCreateGroup = "CreateGroup"

// CreateGroupRequest generates a "aws/request.Request" representing the
// client's request for the CreateGroup operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// 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 CreateGroup for more information on using the CreateGroup
// 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 CreateGroupRequest method.
//	req, resp := client.CreateGroupRequest(params)
//
//	err := req.Send()
//	if err == nil { // resp is now filled
//	    fmt.Println(resp)
//	}
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/synthetics-2017-10-11/CreateGroup
func (c *Synthetics) CreateGroupRequest(input *CreateGroupInput) (req *request.Request, output *CreateGroupOutput) {
	op := &request.Operation{
		Name:       opCreateGroup,
		HTTPMethod: "POST",
		HTTPPath:   "/group",
	}

	if input == nil {
		input = &CreateGroupInput{}
	}

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

// CreateGroup API operation for Synthetics.
//
// Creates a group which you can use to associate canaries with each other,
// including cross-Region canaries. Using groups can help you with managing
// and automating your canaries, and you can also view aggregated run results
// and statistics for all canaries in a group.
//
// Groups are global resources. When you create a group, it is replicated across
// Amazon Web Services Regions, and you can view it and add canaries to it from
// any Region. Although the group ARN format reflects the Region name where
// it was created, a group is not constrained to any Region. This means that
// you can put canaries from multiple Regions into the same group, and then
// use that group to view and manage all of those canaries in a single view.
//
// Groups are supported in all Regions except the Regions that are disabled
// by default. For more information about these Regions, see Enabling a Region
// (https://docs.aws.amazon.com/general/latest/gr/rande-manage.html#rande-manage-enable).
//
// Each group can contain as many as 10 canaries. You can have as many as 20
// groups in your account. Any single canary can be a member of up to 10 groups.
//
// 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 Synthetics's
// API operation CreateGroup for usage and error information.
//
// Returned Error Types:
//
//   - InternalServerException
//     An unknown internal error occurred.
//
//   - ValidationException
//     A parameter could not be validated.
//
//   - ConflictException
//     A conflicting operation is already in progress.
//
//   - ServiceQuotaExceededException
//     The request exceeded a service quota value.
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/synthetics-2017-10-11/CreateGroup
func (c *Synthetics) CreateGroup(input *CreateGroupInput) (*CreateGroupOutput, error) {
	req, out := c.CreateGroupRequest(input)
	return out, req.Send()
}

// CreateGroupWithContext is the same as CreateGroup with the addition of
// the ability to pass a context and additional request options.
//
// See CreateGroup 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 *Synthetics) CreateGroupWithContext(ctx aws.Context, input *CreateGroupInput, opts ...request.Option) (*CreateGroupOutput, error) {
	req, out := c.CreateGroupRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDeleteCanary = "DeleteCanary"

// DeleteCanaryRequest generates a "aws/request.Request" representing the
// client's request for the DeleteCanary operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// 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 DeleteCanary for more information on using the DeleteCanary
// 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 DeleteCanaryRequest method.
//	req, resp := client.DeleteCanaryRequest(params)
//
//	err := req.Send()
//	if err == nil { // resp is now filled
//	    fmt.Println(resp)
//	}
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/synthetics-2017-10-11/DeleteCanary
func (c *Synthetics) DeleteCanaryRequest(input *DeleteCanaryInput) (req *request.Request, output *DeleteCanaryOutput) {
	op := &request.Operation{
		Name:       opDeleteCanary,
		HTTPMethod: "DELETE",
		HTTPPath:   "/canary/{name}",
	}

	if input == nil {
		input = &DeleteCanaryInput{}
	}

	output = &DeleteCanaryOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(restjson.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// DeleteCanary API operation for Synthetics.
//
// Permanently deletes the specified canary.
//
// If you specify DeleteLambda to true, CloudWatch Synthetics also deletes the
// Lambda functions and layers that are used by the canary.
//
// Other resources used and created by the canary are not automatically deleted.
// After you delete a canary that you do not intend to use again, you should
// also delete the following:
//
//   - The CloudWatch alarms created for this canary. These alarms have a name
//     of Synthetics-SharpDrop-Alarm-MyCanaryName .
//
//   - Amazon S3 objects and buckets, such as the canary's artifact location.
//
//   - IAM roles created for the canary. If they were created in the console,
//     these roles have the name role/service-role/CloudWatchSyntheticsRole-MyCanaryName .
//
//   - CloudWatch Logs log groups created for the canary. These logs groups
//     have the name /aws/lambda/cwsyn-MyCanaryName .
//
// Before you delete a canary, you might want to use GetCanary to display the
// information about this canary. Make note of the information returned by this
// operation so that you can delete these resources after you delete the canary.
//
// 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 Synthetics's
// API operation DeleteCanary for usage and error information.
//
// Returned Error Types:
//
//   - InternalServerException
//     An unknown internal error occurred.
//
//   - ValidationException
//     A parameter could not be validated.
//
//   - ResourceNotFoundException
//     One of the specified resources was not found.
//
//   - ConflictException
//     A conflicting operation is already in progress.
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/synthetics-2017-10-11/DeleteCanary
func (c *Synthetics) DeleteCanary(input *DeleteCanaryInput) (*DeleteCanaryOutput, error) {
	req, out := c.DeleteCanaryRequest(input)
	return out, req.Send()
}

// DeleteCanaryWithContext is the same as DeleteCanary with the addition of
// the ability to pass a context and additional request options.
//
// See DeleteCanary 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 *Synthetics) DeleteCanaryWithContext(ctx aws.Context, input *DeleteCanaryInput, opts ...request.Option) (*DeleteCanaryOutput, error) {
	req, out := c.DeleteCanaryRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDeleteGroup = "DeleteGroup"

// DeleteGroupRequest generates a "aws/request.Request" representing the
// client's request for the DeleteGroup operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// 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 DeleteGroup for more information on using the DeleteGroup
// 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 DeleteGroupRequest method.
//	req, resp := client.DeleteGroupRequest(params)
//
//	err := req.Send()
//	if err == nil { // resp is now filled
//	    fmt.Println(resp)
//	}
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/synthetics-2017-10-11/DeleteGroup
func (c *Synthetics) DeleteGroupRequest(input *DeleteGroupInput) (req *request.Request, output *DeleteGroupOutput) {
	op := &request.Operation{
		Name:       opDeleteGroup,
		HTTPMethod: "DELETE",
		HTTPPath:   "/group/{groupIdentifier}",
	}

	if input == nil {
		input = &DeleteGroupInput{}
	}

	output = &DeleteGroupOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(restjson.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// DeleteGroup API operation for Synthetics.
//
// Deletes a group. The group doesn't need to be empty to be deleted. If there
// are canaries in the group, they are not deleted when you delete the group.
//
// Groups are a global resource that appear in all Regions, but the request
// to delete a group must be made from its home Region. You can find the home
// Region of a group within its ARN.
//
// 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 Synthetics's
// API operation DeleteGroup for usage and error information.
//
// Returned Error Types:
//
//   - InternalServerException
//     An unknown internal error occurred.
//
//   - ValidationException
//     A parameter could not be validated.
//
//   - ResourceNotFoundException
//     One of the specified resources was not found.
//
//   - ConflictException
//     A conflicting operation is already in progress.
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/synthetics-2017-10-11/DeleteGroup
func (c *Synthetics) DeleteGroup(input *DeleteGroupInput) (*DeleteGroupOutput, error) {
	req, out := c.DeleteGroupRequest(input)
	return out, req.Send()
}

// DeleteGroupWithContext is the same as DeleteGroup with the addition of
// the ability to pass a context and additional request options.
//
// See DeleteGroup 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 *Synthetics) DeleteGroupWithContext(ctx aws.Context, input *DeleteGroupInput, opts ...request.Option) (*DeleteGroupOutput, error) {
	req, out := c.DeleteGroupRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeCanaries = "DescribeCanaries"

// DescribeCanariesRequest generates a "aws/request.Request" representing the
// client's request for the DescribeCanaries operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// 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 DescribeCanaries for more information on using the DescribeCanaries
// 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 DescribeCanariesRequest method.
//	req, resp := client.DescribeCanariesRequest(params)
//
//	err := req.Send()
//	if err == nil { // resp is now filled
//	    fmt.Println(resp)
//	}
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/synthetics-2017-10-11/DescribeCanaries
func (c *Synthetics) DescribeCanariesRequest(input *DescribeCanariesInput) (req *request.Request, output *DescribeCanariesOutput) {
	op := &request.Operation{
		Name:       opDescribeCanaries,
		HTTPMethod: "POST",
		HTTPPath:   "/canaries",
		Paginator: &request.Paginator{
			InputTokens:     []string{"NextToken"},
			OutputTokens:    []string{"NextToken"},
			LimitToken:      "MaxResults",
			TruncationToken: "",
		},
	}

	if input == nil {
		input = &DescribeCanariesInput{}
	}

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

// DescribeCanaries API operation for Synthetics.
//
// This operation returns a list of the canaries in your account, along with
// full details about each canary.
//
// This operation supports resource-level authorization using an IAM policy
// and the Names parameter. If you specify the Names parameter, the operation
// is successful only if you have authorization to view all the canaries that
// you specify in your request. If you do not have permission to view any of
// the canaries, the request fails with a 403 response.
//
// You are required to use the Names parameter if you are logged on to a user
// or role that has an IAM policy that restricts which canaries that you are
// allowed to view. For more information, see Limiting a user to viewing specific
// canaries (https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_Restricted.html).
//
// 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 Synthetics's
// API operation DescribeCanaries for usage and error information.
//
// Returned Error Types:
//
//   - InternalServerException
//     An unknown internal error occurred.
//
//   - ValidationException
//     A parameter could not be validated.
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/synthetics-2017-10-11/DescribeCanaries
func (c *Synthetics) DescribeCanaries(input *DescribeCanariesInput) (*DescribeCanariesOutput, error) {
	req, out := c.DescribeCanariesRequest(input)
	return out, req.Send()
}

// DescribeCanariesWithContext is the same as DescribeCanaries with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeCanaries 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 *Synthetics) DescribeCanariesWithContext(ctx aws.Context, input *DescribeCanariesInput, opts ...request.Option) (*DescribeCanariesOutput, error) {
	req, out := c.DescribeCanariesRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

// DescribeCanariesPages iterates over the pages of a DescribeCanaries operation,
// calling the "fn" function with the response data for each page. To stop
// iterating, return false from the fn function.
//
// See DescribeCanaries 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 DescribeCanaries operation.
//	pageNum := 0
//	err := client.DescribeCanariesPages(params,
//	    func(page *synthetics.DescribeCanariesOutput, lastPage bool) bool {
//	        pageNum++
//	        fmt.Println(page)
//	        return pageNum <= 3
//	    })
func (c *Synthetics) DescribeCanariesPages(input *DescribeCanariesInput, fn func(*DescribeCanariesOutput, bool) bool) error {
	return c.DescribeCanariesPagesWithContext(aws.BackgroundContext(), input, fn)
}

// DescribeCanariesPagesWithContext same as DescribeCanariesPages 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 *Synthetics) DescribeCanariesPagesWithContext(ctx aws.Context, input *DescribeCanariesInput, fn func(*DescribeCanariesOutput, bool) bool, opts ...request.Option) error {
	p := request.Pagination{
		NewRequest: func() (*request.Request, error) {
			var inCpy *DescribeCanariesInput
			if input != nil {
				tmp := *input
				inCpy = &tmp
			}
			req, _ := c.DescribeCanariesRequest(inCpy)
			req.SetContext(ctx)
			req.ApplyOptions(opts...)
			return req, nil
		},
	}

	for p.Next() {
		if !fn(p.Page().(*DescribeCanariesOutput), !p.HasNextPage()) {
			break
		}
	}

	return p.Err()
}

const opDescribeCanariesLastRun = "DescribeCanariesLastRun"

// DescribeCanariesLastRunRequest generates a "aws/request.Request" representing the
// client's request for the DescribeCanariesLastRun operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// 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 DescribeCanariesLastRun for more information on using the DescribeCanariesLastRun
// 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 DescribeCanariesLastRunRequest method.
//	req, resp := client.DescribeCanariesLastRunRequest(params)
//
//	err := req.Send()
//	if err == nil { // resp is now filled
//	    fmt.Println(resp)
//	}
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/synthetics-2017-10-11/DescribeCanariesLastRun
func (c *Synthetics) DescribeCanariesLastRunRequest(input *DescribeCanariesLastRunInput) (req *request.Request, output *DescribeCanariesLastRunOutput) {
	op := &request.Operation{
		Name:       opDescribeCanariesLastRun,
		HTTPMethod: "POST",
		HTTPPath:   "/canaries/last-run",
		Paginator: &request.Paginator{
			InputTokens:     []string{"NextToken"},
			OutputTokens:    []string{"NextToken"},
			LimitToken:      "MaxResults",
			TruncationToken: "",
		},
	}

	if input == nil {
		input = &DescribeCanariesLastRunInput{}
	}

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

// DescribeCanariesLastRun API operation for Synthetics.
//
// Use this operation to see information from the most recent run of each canary
// that you have created.
//
// This operation supports resource-level authorization using an IAM policy
// and the Names parameter. If you specify the Names parameter, the operation
// is successful only if you have authorization to view all the canaries that
// you specify in your request. If you do not have permission to view any of
// the canaries, the request fails with a 403 response.
//
// You are required to use the Names parameter if you are logged on to a user
// or role that has an IAM policy that restricts which canaries that you are
// allowed to view. For more information, see Limiting a user to viewing specific
// canaries (https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_Restricted.html).
//
// 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 Synthetics's
// API operation DescribeCanariesLastRun for usage and error information.
//
// Returned Error Types:
//
//   - InternalServerException
//     An unknown internal error occurred.
//
//   - ValidationException
//     A parameter could not be validated.
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/synthetics-2017-10-11/DescribeCanariesLastRun
func (c *Synthetics) DescribeCanariesLastRun(input *DescribeCanariesLastRunInput) (*DescribeCanariesLastRunOutput, error) {
	req, out := c.DescribeCanariesLastRunRequest(input)
	return out, req.Send()
}

// DescribeCanariesLastRunWithContext is the same as DescribeCanariesLastRun with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeCanariesLastRun 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 *Synthetics) DescribeCanariesLastRunWithContext(ctx aws.Context, input *DescribeCanariesLastRunInput, opts ...request.Option) (*DescribeCanariesLastRunOutput, error) {
	req, out := c.DescribeCanariesLastRunRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

// DescribeCanariesLastRunPages iterates over the pages of a DescribeCanariesLastRun operation,
// calling the "fn" function with the response data for each page. To stop
// iterating, return false from the fn function.
//
// See DescribeCanariesLastRun 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 DescribeCanariesLastRun operation.
//	pageNum := 0
//	err := client.DescribeCanariesLastRunPages(params,
//	    func(page *synthetics.DescribeCanariesLastRunOutput, lastPage bool) bool {
//	        pageNum++
//	        fmt.Println(page)
//	        return pageNum <= 3
//	    })
func (c *Synthetics) DescribeCanariesLastRunPages(input *DescribeCanariesLastRunInput, fn func(*DescribeCanariesLastRunOutput, bool) bool) error {
	return c.DescribeCanariesLastRunPagesWithContext(aws.BackgroundContext(), input, fn)
}

// DescribeCanariesLastRunPagesWithContext same as DescribeCanariesLastRunPages 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 *Synthetics) DescribeCanariesLastRunPagesWithContext(ctx aws.Context, input *DescribeCanariesLastRunInput, fn func(*DescribeCanariesLastRunOutput, bool) bool, opts ...request.Option) error {
	p := request.Pagination{
		NewRequest: func() (*request.Request, error) {
			var inCpy *DescribeCanariesLastRunInput
			if input != nil {
				tmp := *input
				inCpy = &tmp
			}
			req, _ := c.DescribeCanariesLastRunRequest(inCpy)
			req.SetContext(ctx)
			req.ApplyOptions(opts...)
			return req, nil
		},
	}

	for p.Next() {
		if !fn(p.Page().(*DescribeCanariesLastRunOutput), !p.HasNextPage()) {
			break
		}
	}

	return p.Err()
}

const opDescribeRuntimeVersions = "DescribeRuntimeVersions"

// DescribeRuntimeVersionsRequest generates a "aws/request.Request" representing the
// client's request for the DescribeRuntimeVersions operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// 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 DescribeRuntimeVersions for more information on using the DescribeRuntimeVersions
// 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 DescribeRuntimeVersionsRequest method.
//	req, resp := client.DescribeRuntimeVersionsRequest(params)
//
//	err := req.Send()
//	if err == nil { // resp is now filled
//	    fmt.Println(resp)
//	}
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/synthetics-2017-10-11/DescribeRuntimeVersions
func (c *Synthetics) DescribeRuntimeVersionsRequest(input *DescribeRuntimeVersionsInput) (req *request.Request, output *DescribeRuntimeVersionsOutput) {
	op := &request.Operation{
		Name:       opDescribeRuntimeVersions,
		HTTPMethod: "POST",
		HTTPPath:   "/runtime-versions",
		Paginator: &request.Paginator{
			InputTokens:     []string{"NextToken"},
			OutputTokens:    []string{"NextToken"},
			LimitToken:      "MaxResults",
			TruncationToken: "",
		},
	}

	if input == nil {
		input = &DescribeRuntimeVersionsInput{}
	}

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

// DescribeRuntimeVersions API operation for Synthetics.
//
// Returns a list of Synthetics canary runtime versions. For more information,
// see Canary Runtime Versions (https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_Library.html).
//
// 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 Synthetics's
// API operation DescribeRuntimeVersions for usage and error information.
//
// Returned Error Types:
//
//   - InternalServerException
//     An unknown internal error occurred.
//
//   - ValidationException
//     A parameter could not be validated.
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/synthetics-2017-10-11/DescribeRuntimeVersions
func (c *Synthetics) DescribeRuntimeVersions(input *DescribeRuntimeVersionsInput) (*DescribeRuntimeVersionsOutput, error) {
	req, out := c.DescribeRuntimeVersionsRequest(input)
	return out, req.Send()
}

// DescribeRuntimeVersionsWithContext is the same as DescribeRuntimeVersions with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeRuntimeVersions 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 *Synthetics) DescribeRuntimeVersionsWithContext(ctx aws.Context, input *DescribeRuntimeVersionsInput, opts ...request.Option) (*DescribeRuntimeVersionsOutput, error) {
	req, out := c.DescribeRuntimeVersionsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

// DescribeRuntimeVersionsPages iterates over the pages of a DescribeRuntimeVersions operation,
// calling the "fn" function with the response data for each page. To stop
// iterating, return false from the fn function.
//
// See DescribeRuntimeVersions 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 DescribeRuntimeVersions operation.
//	pageNum := 0
//	err := client.DescribeRuntimeVersionsPages(params,
//	    func(page *synthetics.DescribeRuntimeVersionsOutput, lastPage bool) bool {
//	        pageNum++
//	        fmt.Println(page)
//	        return pageNum <= 3
//	    })
func (c *Synthetics) DescribeRuntimeVersionsPages(input *DescribeRuntimeVersionsInput, fn func(*DescribeRuntimeVersionsOutput, bool) bool) error {
	return c.DescribeRuntimeVersionsPagesWithContext(aws.BackgroundContext(), input, fn)
}

// DescribeRuntimeVersionsPagesWithContext same as DescribeRuntimeVersionsPages 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 *Synthetics) DescribeRuntimeVersionsPagesWithContext(ctx aws.Context, input *DescribeRuntimeVersionsInput, fn func(*DescribeRuntimeVersionsOutput, bool) bool, opts ...request.Option) error {
	p := request.Pagination{
		NewRequest: func() (*request.Request, error) {
			var inCpy *DescribeRuntimeVersionsInput
			if input != nil {
				tmp := *input
				inCpy = &tmp
			}
			req, _ := c.DescribeRuntimeVersionsRequest(inCpy)
			req.SetContext(ctx)
			req.ApplyOptions(opts...)
			return req, nil
		},
	}

	for p.Next() {
		if !fn(p.Page().(*DescribeRuntimeVersionsOutput), !p.HasNextPage()) {
			break
		}
	}

	return p.Err()
}

const opDisassociateResource = "DisassociateResource"

// DisassociateResourceRequest generates a "aws/request.Request" representing the
// client's request for the DisassociateResource operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// 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 DisassociateResource for more information on using the DisassociateResource
// 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 DisassociateResourceRequest method.
//	req, resp := client.DisassociateResourceRequest(params)
//
//	err := req.Send()
//	if err == nil { // resp is now filled
//	    fmt.Println(resp)
//	}
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/synthetics-2017-10-11/DisassociateResource
func (c *Synthetics) DisassociateResourceRequest(input *DisassociateResourceInput) (req *request.Request, output *DisassociateResourceOutput) {
	op := &request.Operation{
		Name:       opDisassociateResource,
		HTTPMethod: "PATCH",
		HTTPPath:   "/group/{groupIdentifier}/disassociate",
	}

	if input == nil {
		input = &DisassociateResourceInput{}
	}

	output = &DisassociateResourceOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(restjson.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// DisassociateResource API operation for Synthetics.
//
// Removes a canary from a group. You must run this operation in the Region
// where the canary exists.
//
// 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 Synthetics's
// API operation DisassociateResource for usage and error information.
//
// Returned Error Types:
//
//   - InternalServerException
//     An unknown internal error occurred.
//
//   - ValidationException
//     A parameter could not be validated.
//
//   - ResourceNotFoundException
//     One of the specified resources was not found.
//
//   - ConflictException
//     A conflicting operation is already in progress.
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/synthetics-2017-10-11/DisassociateResource
func (c *Synthetics) DisassociateResource(input *DisassociateResourceInput) (*DisassociateResourceOutput, error) {
	req, out := c.DisassociateResourceRequest(input)
	return out, req.Send()
}

// DisassociateResourceWithContext is the same as DisassociateResource with the addition of
// the ability to pass a context and additional request options.
//
// See DisassociateResource 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 *Synthetics) DisassociateResourceWithContext(ctx aws.Context, input *DisassociateResourceInput, opts ...request.Option) (*DisassociateResourceOutput, error) {
	req, out := c.DisassociateResourceRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opGetCanary = "GetCanary"

// GetCanaryRequest generates a "aws/request.Request" representing the
// client's request for the GetCanary operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// 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 GetCanary for more information on using the GetCanary
// 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 GetCanaryRequest method.
//	req, resp := client.GetCanaryRequest(params)
//
//	err := req.Send()
//	if err == nil { // resp is now filled
//	    fmt.Println(resp)
//	}
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/synthetics-2017-10-11/GetCanary
func (c *Synthetics) GetCanaryRequest(input *GetCanaryInput) (req *request.Request, output *GetCanaryOutput) {
	op := &request.Operation{
		Name:       opGetCanary,
		HTTPMethod: "GET",
		HTTPPath:   "/canary/{name}",
	}

	if input == nil {
		input = &GetCanaryInput{}
	}

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

// GetCanary API operation for Synthetics.
//
// Retrieves complete information about one canary. You must specify the name
// of the canary that you want. To get a list of canaries and their names, use
// DescribeCanaries (https://docs.aws.amazon.com/AmazonSynthetics/latest/APIReference/API_DescribeCanaries.html).
//
// 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 Synthetics's
// API operation GetCanary for usage and error information.
//
// Returned Error Types:
//
//   - InternalServerException
//     An unknown internal error occurred.
//
//   - ValidationException
//     A parameter could not be validated.
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/synthetics-2017-10-11/GetCanary
func (c *Synthetics) GetCanary(input *GetCanaryInput) (*GetCanaryOutput, error) {
	req, out := c.GetCanaryRequest(input)
	return out, req.Send()
}

// GetCanaryWithContext is the same as GetCanary with the addition of
// the ability to pass a context and additional request options.
//
// See GetCanary 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 *Synthetics) GetCanaryWithContext(ctx aws.Context, input *GetCanaryInput, opts ...request.Option) (*GetCanaryOutput, error) {
	req, out := c.GetCanaryRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opGetCanaryRuns = "GetCanaryRuns"

// GetCanaryRunsRequest generates a "aws/request.Request" representing the
// client's request for the GetCanaryRuns operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// 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 GetCanaryRuns for more information on using the GetCanaryRuns
// 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 GetCanaryRunsRequest method.
//	req, resp := client.GetCanaryRunsRequest(params)
//
//	err := req.Send()
//	if err == nil { // resp is now filled
//	    fmt.Println(resp)
//	}
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/synthetics-2017-10-11/GetCanaryRuns
func (c *Synthetics) GetCanaryRunsRequest(input *GetCanaryRunsInput) (req *request.Request, output *GetCanaryRunsOutput) {
	op := &request.Operation{
		Name:       opGetCanaryRuns,
		HTTPMethod: "POST",
		HTTPPath:   "/canary/{name}/runs",
		Paginator: &request.Paginator{
			InputTokens:     []string{"NextToken"},
			OutputTokens:    []string{"NextToken"},
			LimitToken:      "MaxResults",
			TruncationToken: "",
		},
	}

	if input == nil {
		input = &GetCanaryRunsInput{}
	}

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

// GetCanaryRuns API operation for Synthetics.
//
// Retrieves a list of runs for a specified canary.
//
// 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 Synthetics's
// API operation GetCanaryRuns for usage and error information.
//
// Returned Error Types:
//
//   - InternalServerException
//     An unknown internal error occurred.
//
//   - ValidationException
//     A parameter could not be validated.
//
//   - ResourceNotFoundException
//     One of the specified resources was not found.
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/synthetics-2017-10-11/GetCanaryRuns
func (c *Synthetics) GetCanaryRuns(input *GetCanaryRunsInput) (*GetCanaryRunsOutput, error) {
	req, out := c.GetCanaryRunsRequest(input)
	return out, req.Send()
}

// GetCanaryRunsWithContext is the same as GetCanaryRuns with the addition of
// the ability to pass a context and additional request options.
//
// See GetCanaryRuns 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 *Synthetics) GetCanaryRunsWithContext(ctx aws.Context, input *GetCanaryRunsInput, opts ...request.Option) (*GetCanaryRunsOutput, error) {
	req, out := c.GetCanaryRunsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

// GetCanaryRunsPages iterates over the pages of a GetCanaryRuns operation,
// calling the "fn" function with the response data for each page. To stop
// iterating, return false from the fn function.
//
// See GetCanaryRuns 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 GetCanaryRuns operation.
//	pageNum := 0
//	err := client.GetCanaryRunsPages(params,
//	    func(page *synthetics.GetCanaryRunsOutput, lastPage bool) bool {
//	        pageNum++
//	        fmt.Println(page)
//	        return pageNum <= 3
//	    })
func (c *Synthetics) GetCanaryRunsPages(input *GetCanaryRunsInput, fn func(*GetCanaryRunsOutput, bool) bool) error {
	return c.GetCanaryRunsPagesWithContext(aws.BackgroundContext(), input, fn)
}

// GetCanaryRunsPagesWithContext same as GetCanaryRunsPages 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 *Synthetics) GetCanaryRunsPagesWithContext(ctx aws.Context, input *GetCanaryRunsInput, fn func(*GetCanaryRunsOutput, bool) bool, opts ...request.Option) error {
	p := request.Pagination{
		NewRequest: func() (*request.Request, error) {
			var inCpy *GetCanaryRunsInput
			if input != nil {
				tmp := *input
				inCpy = &tmp
			}
			req, _ := c.GetCanaryRunsRequest(inCpy)
			req.SetContext(ctx)
			req.ApplyOptions(opts...)
			return req, nil
		},
	}

	for p.Next() {
		if !fn(p.Page().(*GetCanaryRunsOutput), !p.HasNextPage()) {
			break
		}
	}

	return p.Err()
}

const opGetGroup = "GetGroup"

// GetGroupRequest generates a "aws/request.Request" representing the
// client's request for the GetGroup operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// 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 GetGroup for more information on using the GetGroup
// 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 GetGroupRequest method.
//	req, resp := client.GetGroupRequest(params)
//
//	err := req.Send()
//	if err == nil { // resp is now filled
//	    fmt.Println(resp)
//	}
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/synthetics-2017-10-11/GetGroup
func (c *Synthetics) GetGroupRequest(input *GetGroupInput) (req *request.Request, output *GetGroupOutput) {
	op := &request.Operation{
		Name:       opGetGroup,
		HTTPMethod: "GET",
		HTTPPath:   "/group/{groupIdentifier}",
	}

	if input == nil {
		input = &GetGroupInput{}
	}

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

// GetGroup API operation for Synthetics.
//
// Returns information about one group. Groups are a global resource, so you
// can use this operation from any Region.
//
// 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 Synthetics's
// API operation GetGroup for usage and error information.
//
// Returned Error Types:
//
//   - InternalServerException
//     An unknown internal error occurred.
//
//   - ValidationException
//     A parameter could not be validated.
//
//   - ResourceNotFoundException
//     One of the specified resources was not found.
//
//   - ConflictException
//     A conflicting operation is already in progress.
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/synthetics-2017-10-11/GetGroup
func (c *Synthetics) GetGroup(input *GetGroupInput) (*GetGroupOutput, error) {
	req, out := c.GetGroupRequest(input)
	return out, req.Send()
}

// GetGroupWithContext is the same as GetGroup with the addition of
// the ability to pass a context and additional request options.
//
// See GetGroup 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 *Synthetics) GetGroupWithContext(ctx aws.Context, input *GetGroupInput, opts ...request.Option) (*GetGroupOutput, error) {
	req, out := c.GetGroupRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opListAssociatedGroups = "ListAssociatedGroups"

// ListAssociatedGroupsRequest generates a "aws/request.Request" representing the
// client's request for the ListAssociatedGroups operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// 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 ListAssociatedGroups for more information on using the ListAssociatedGroups
// 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 ListAssociatedGroupsRequest method.
//	req, resp := client.ListAssociatedGroupsRequest(params)
//
//	err := req.Send()
//	if err == nil { // resp is now filled
//	    fmt.Println(resp)
//	}
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/synthetics-2017-10-11/ListAssociatedGroups
func (c *Synthetics) ListAssociatedGroupsRequest(input *ListAssociatedGroupsInput) (req *request.Request, output *ListAssociatedGroupsOutput) {
	op := &request.Operation{
		Name:       opListAssociatedGroups,
		HTTPMethod: "POST",
		HTTPPath:   "/resource/{resourceArn}/groups",
		Paginator: &request.Paginator{
			InputTokens:     []string{"NextToken"},
			OutputTokens:    []string{"NextToken"},
			LimitToken:      "MaxResults",
			TruncationToken: "",
		},
	}

	if input == nil {
		input = &ListAssociatedGroupsInput{}
	}

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

// ListAssociatedGroups API operation for Synthetics.
//
// Returns a list of the groups that the specified canary is associated with.
// The canary that you specify must be in the current Region.
//
// 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 Synthetics's
// API operation ListAssociatedGroups for usage and error information.
//
// Returned Error Types:
//
//   - InternalServerException
//     An unknown internal error occurred.
//
//   - ValidationException
//     A parameter could not be validated.
//
//   - ResourceNotFoundException
//     One of the specified resources was not found.
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/synthetics-2017-10-11/ListAssociatedGroups
func (c *Synthetics) ListAssociatedGroups(input *ListAssociatedGroupsInput) (*ListAssociatedGroupsOutput, error) {
	req, out := c.ListAssociatedGroupsRequest(input)
	return out, req.Send()
}

// ListAssociatedGroupsWithContext is the same as ListAssociatedGroups with the addition of
// the ability to pass a context and additional request options.
//
// See ListAssociatedGroups 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 *Synthetics) ListAssociatedGroupsWithContext(ctx aws.Context, input *ListAssociatedGroupsInput, opts ...request.Option) (*ListAssociatedGroupsOutput, error) {
	req, out := c.ListAssociatedGroupsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

// ListAssociatedGroupsPages iterates over the pages of a ListAssociatedGroups operation,
// calling the "fn" function with the response data for each page. To stop
// iterating, return false from the fn function.
//
// See ListAssociatedGroups 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 ListAssociatedGroups operation.
//	pageNum := 0
//	err := client.ListAssociatedGroupsPages(params,
//	    func(page *synthetics.ListAssociatedGroupsOutput, lastPage bool) bool {
//	        pageNum++
//	        fmt.Println(page)
//	        return pageNum <= 3
//	    })
func (c *Synthetics) ListAssociatedGroupsPages(input *ListAssociatedGroupsInput, fn func(*ListAssociatedGroupsOutput, bool) bool) error {
	return c.ListAssociatedGroupsPagesWithContext(aws.BackgroundContext(), input, fn)
}

// ListAssociatedGroupsPagesWithContext same as ListAssociatedGroupsPages 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 *Synthetics) ListAssociatedGroupsPagesWithContext(ctx aws.Context, input *ListAssociatedGroupsInput, fn func(*ListAssociatedGroupsOutput, bool) bool, opts ...request.Option) error {
	p := request.Pagination{
		NewRequest: func() (*request.Request, error) {
			var inCpy *ListAssociatedGroupsInput
			if input != nil {
				tmp := *input
				inCpy = &tmp
			}
			req, _ := c.ListAssociatedGroupsRequest(inCpy)
			req.SetContext(ctx)
			req.ApplyOptions(opts...)
			return req, nil
		},
	}

	for p.Next() {
		if !fn(p.Page().(*ListAssociatedGroupsOutput), !p.HasNextPage()) {
			break
		}
	}

	return p.Err()
}

const opListGroupResources = "ListGroupResources"

// ListGroupResourcesRequest generates a "aws/request.Request" representing the
// client's request for the ListGroupResources operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// 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 ListGroupResources for more information on using the ListGroupResources
// 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 ListGroupResourcesRequest method.
//	req, resp := client.ListGroupResourcesRequest(params)
//
//	err := req.Send()
//	if err == nil { // resp is now filled
//	    fmt.Println(resp)
//	}
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/synthetics-2017-10-11/ListGroupResources
func (c *Synthetics) ListGroupResourcesRequest(input *ListGroupResourcesInput) (req *request.Request, output *ListGroupResourcesOutput) {
	op := &request.Operation{
		Name:       opListGroupResources,
		HTTPMethod: "POST",
		HTTPPath:   "/group/{groupIdentifier}/resources",
		Paginator: &request.Paginator{
			InputTokens:     []string{"NextToken"},
			OutputTokens:    []string{"NextToken"},
			LimitToken:      "MaxResults",
			TruncationToken: "",
		},
	}

	if input == nil {
		input = &ListGroupResourcesInput{}
	}

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

// ListGroupResources API operation for Synthetics.
//
// This operation returns a list of the ARNs of the canaries that are associated
// with the specified group.
//
// 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 Synthetics's
// API operation ListGroupResources for usage and error information.
//
// Returned Error Types:
//
//   - InternalServerException
//     An unknown internal error occurred.
//
//   - ValidationException
//     A parameter could not be validated.
//
//   - ResourceNotFoundException
//     One of the specified resources was not found.
//
//   - ConflictException
//     A conflicting operation is already in progress.
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/synthetics-2017-10-11/ListGroupResources
func (c *Synthetics) ListGroupResources(input *ListGroupResourcesInput) (*ListGroupResourcesOutput, error) {
	req, out := c.ListGroupResourcesRequest(input)
	return out, req.Send()
}

// ListGroupResourcesWithContext is the same as ListGroupResources with the addition of
// the ability to pass a context and additional request options.
//
// See ListGroupResources 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 *Synthetics) ListGroupResourcesWithContext(ctx aws.Context, input *ListGroupResourcesInput, opts ...request.Option) (*ListGroupResourcesOutput, error) {
	req, out := c.ListGroupResourcesRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

// ListGroupResourcesPages iterates over the pages of a ListGroupResources operation,
// calling the "fn" function with the response data for each page. To stop
// iterating, return false from the fn function.
//
// See ListGroupResources 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 ListGroupResources operation.
//	pageNum := 0
//	err := client.ListGroupResourcesPages(params,
//	    func(page *synthetics.ListGroupResourcesOutput, lastPage bool) bool {
//	        pageNum++
//	        fmt.Println(page)
//	        return pageNum <= 3
//	    })
func (c *Synthetics) ListGroupResourcesPages(input *ListGroupResourcesInput, fn func(*ListGroupResourcesOutput, bool) bool) error {
	return c.ListGroupResourcesPagesWithContext(aws.BackgroundContext(), input, fn)
}

// ListGroupResourcesPagesWithContext same as ListGroupResourcesPages 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 *Synthetics) ListGroupResourcesPagesWithContext(ctx aws.Context, input *ListGroupResourcesInput, fn func(*ListGroupResourcesOutput, bool) bool, opts ...request.Option) error {
	p := request.Pagination{
		NewRequest: func() (*request.Request, error) {
			var inCpy *ListGroupResourcesInput
			if input != nil {
				tmp := *input
				inCpy = &tmp
			}
			req, _ := c.ListGroupResourcesRequest(inCpy)
			req.SetContext(ctx)
			req.ApplyOptions(opts...)
			return req, nil
		},
	}

	for p.Next() {
		if !fn(p.Page().(*ListGroupResourcesOutput), !p.HasNextPage()) {
			break
		}
	}

	return p.Err()
}

const opListGroups = "ListGroups"

// ListGroupsRequest generates a "aws/request.Request" representing the
// client's request for the ListGroups operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// 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 ListGroups for more information on using the ListGroups
// 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 ListGroupsRequest method.
//	req, resp := client.ListGroupsRequest(params)
//
//	err := req.Send()
//	if err == nil { // resp is now filled
//	    fmt.Println(resp)
//	}
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/synthetics-2017-10-11/ListGroups
func (c *Synthetics) ListGroupsRequest(input *ListGroupsInput) (req *request.Request, output *ListGroupsOutput) {
	op := &request.Operation{
		Name:       opListGroups,
		HTTPMethod: "POST",
		HTTPPath:   "/groups",
		Paginator: &request.Paginator{
			InputTokens:     []string{"NextToken"},
			OutputTokens:    []string{"NextToken"},
			LimitToken:      "MaxResults",
			TruncationToken: "",
		},
	}

	if input == nil {
		input = &ListGroupsInput{}
	}

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

// ListGroups API operation for Synthetics.
//
// Returns a list of all groups in the account, displaying their names, unique
// IDs, and ARNs. The groups from all Regions are returned.
//
// 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 Synthetics's
// API operation ListGroups for usage and error information.
//
// Returned Error Types:
//
//   - InternalServerException
//     An unknown internal error occurred.
//
//   - ValidationException
//     A parameter could not be validated.
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/synthetics-2017-10-11/ListGroups
func (c *Synthetics) ListGroups(input *ListGroupsInput) (*ListGroupsOutput, error) {
	req, out := c.ListGroupsRequest(input)
	return out, req.Send()
}

// ListGroupsWithContext is the same as ListGroups with the addition of
// the ability to pass a context and additional request options.
//
// See ListGroups 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 *Synthetics) ListGroupsWithContext(ctx aws.Context, input *ListGroupsInput, opts ...request.Option) (*ListGroupsOutput, error) {
	req, out := c.ListGroupsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

// ListGroupsPages iterates over the pages of a ListGroups operation,
// calling the "fn" function with the response data for each page. To stop
// iterating, return false from the fn function.
//
// See ListGroups 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 ListGroups operation.
//	pageNum := 0
//	err := client.ListGroupsPages(params,
//	    func(page *synthetics.ListGroupsOutput, lastPage bool) bool {
//	        pageNum++
//	        fmt.Println(page)
//	        return pageNum <= 3
//	    })
func (c *Synthetics) ListGroupsPages(input *ListGroupsInput, fn func(*ListGroupsOutput, bool) bool) error {
	return c.ListGroupsPagesWithContext(aws.BackgroundContext(), input, fn)
}

// ListGroupsPagesWithContext same as ListGroupsPages 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 *Synthetics) ListGroupsPagesWithContext(ctx aws.Context, input *ListGroupsInput, fn func(*ListGroupsOutput, bool) bool, opts ...request.Option) error {
	p := request.Pagination{
		NewRequest: func() (*request.Request, error) {
			var inCpy *ListGroupsInput
			if input != nil {
				tmp := *input
				inCpy = &tmp
			}
			req, _ := c.ListGroupsRequest(inCpy)
			req.SetContext(ctx)
			req.ApplyOptions(opts...)
			return req, nil
		},
	}

	for p.Next() {
		if !fn(p.Page().(*ListGroupsOutput), !p.HasNextPage()) {
			break
		}
	}

	return p.Err()
}

const opListTagsForResource = "ListTagsForResource"

// ListTagsForResourceRequest generates a "aws/request.Request" representing the
// client's request for the ListTagsForResource operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// 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 ListTagsForResource for more information on using the ListTagsForResource
// 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 ListTagsForResourceRequest method.
//	req, resp := client.ListTagsForResourceRequest(params)
//
//	err := req.Send()
//	if err == nil { // resp is now filled
//	    fmt.Println(resp)
//	}
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/synthetics-2017-10-11/ListTagsForResource
func (c *Synthetics) ListTagsForResourceRequest(input *ListTagsForResourceInput) (req *request.Request, output *ListTagsForResourceOutput) {
	op := &request.Operation{
		Name:       opListTagsForResource,
		HTTPMethod: "GET",
		HTTPPath:   "/tags/{resourceArn}",
	}

	if input == nil {
		input = &ListTagsForResourceInput{}
	}

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

// ListTagsForResource API operation for Synthetics.
//
// Displays the tags associated with a canary or group.
//
// 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 Synthetics's
// API operation ListTagsForResource for usage and error information.
//
// Returned Error Types:
//
//   - BadRequestException
//     The request was not valid.
//
//   - NotFoundException
//     The specified resource was not found.
//
//   - TooManyRequestsException
//     There were too many simultaneous requests. Try the operation again.
//
//   - ConflictException
//     A conflicting operation is already in progress.
//
//   - InternalFailureException
//     An internal failure occurred. Try the operation again.
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/synthetics-2017-10-11/ListTagsForResource
func (c *Synthetics) ListTagsForResource(input *ListTagsForResourceInput) (*ListTagsForResourceOutput, error) {
	req, out := c.ListTagsForResourceRequest(input)
	return out, req.Send()
}

// ListTagsForResourceWithContext is the same as ListTagsForResource with the addition of
// the ability to pass a context and additional request options.
//
// See ListTagsForResource 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 *Synthetics) ListTagsForResourceWithContext(ctx aws.Context, input *ListTagsForResourceInput, opts ...request.Option) (*ListTagsForResourceOutput, error) {
	req, out := c.ListTagsForResourceRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opStartCanary = "StartCanary"

// StartCanaryRequest generates a "aws/request.Request" representing the
// client's request for the StartCanary operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// 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 StartCanary for more information on using the StartCanary
// 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 StartCanaryRequest method.
//	req, resp := client.StartCanaryRequest(params)
//
//	err := req.Send()
//	if err == nil { // resp is now filled
//	    fmt.Println(resp)
//	}
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/synthetics-2017-10-11/StartCanary
func (c *Synthetics) StartCanaryRequest(input *StartCanaryInput) (req *request.Request, output *StartCanaryOutput) {
	op := &request.Operation{
		Name:       opStartCanary,
		HTTPMethod: "POST",
		HTTPPath:   "/canary/{name}/start",
	}

	if input == nil {
		input = &StartCanaryInput{}
	}

	output = &StartCanaryOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(restjson.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// StartCanary API operation for Synthetics.
//
// Use this operation to run a canary that has already been created. The frequency
// of the canary runs is determined by the value of the canary's Schedule. To
// see a canary's schedule, use GetCanary (https://docs.aws.amazon.com/AmazonSynthetics/latest/APIReference/API_GetCanary.html).
//
// 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 Synthetics's
// API operation StartCanary for usage and error information.
//
// Returned Error Types:
//
//   - InternalServerException
//     An unknown internal error occurred.
//
//   - ValidationException
//     A parameter could not be validated.
//
//   - ResourceNotFoundException
//     One of the specified resources was not found.
//
//   - ConflictException
//     A conflicting operation is already in progress.
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/synthetics-2017-10-11/StartCanary
func (c *Synthetics) StartCanary(input *StartCanaryInput) (*StartCanaryOutput, error) {
	req, out := c.StartCanaryRequest(input)
	return out, req.Send()
}

// StartCanaryWithContext is the same as StartCanary with the addition of
// the ability to pass a context and additional request options.
//
// See StartCanary 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 *Synthetics) StartCanaryWithContext(ctx aws.Context, input *StartCanaryInput, opts ...request.Option) (*StartCanaryOutput, error) {
	req, out := c.StartCanaryRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opStopCanary = "StopCanary"

// StopCanaryRequest generates a "aws/request.Request" representing the
// client's request for the StopCanary operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// 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 StopCanary for more information on using the StopCanary
// 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 StopCanaryRequest method.
//	req, resp := client.StopCanaryRequest(params)
//
//	err := req.Send()
//	if err == nil { // resp is now filled
//	    fmt.Println(resp)
//	}
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/synthetics-2017-10-11/StopCanary
func (c *Synthetics) StopCanaryRequest(input *StopCanaryInput) (req *request.Request, output *StopCanaryOutput) {
	op := &request.Operation{
		Name:       opStopCanary,
		HTTPMethod: "POST",
		HTTPPath:   "/canary/{name}/stop",
	}

	if input == nil {
		input = &StopCanaryInput{}
	}

	output = &StopCanaryOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(restjson.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// StopCanary API operation for Synthetics.
//
// Stops the canary to prevent all future runs. If the canary is currently running,the
// run that is in progress completes on its own, publishes metrics, and uploads
// artifacts, but it is not recorded in Synthetics as a completed run.
//
// You can use StartCanary to start it running again with the canary’s current
// schedule at any point in the future.
//
// 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 Synthetics's
// API operation StopCanary for usage and error information.
//
// Returned Error Types:
//
//   - InternalServerException
//     An unknown internal error occurred.
//
//   - ValidationException
//     A parameter could not be validated.
//
//   - ResourceNotFoundException
//     One of the specified resources was not found.
//
//   - ConflictException
//     A conflicting operation is already in progress.
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/synthetics-2017-10-11/StopCanary
func (c *Synthetics) StopCanary(input *StopCanaryInput) (*StopCanaryOutput, error) {
	req, out := c.StopCanaryRequest(input)
	return out, req.Send()
}

// StopCanaryWithContext is the same as StopCanary with the addition of
// the ability to pass a context and additional request options.
//
// See StopCanary 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 *Synthetics) StopCanaryWithContext(ctx aws.Context, input *StopCanaryInput, opts ...request.Option) (*StopCanaryOutput, error) {
	req, out := c.StopCanaryRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

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 completes
// successfully.
//
// 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)
//	}
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/synthetics-2017-10-11/TagResource
func (c *Synthetics) TagResourceRequest(input *TagResourceInput) (req *request.Request, output *TagResourceOutput) {
	op := &request.Operation{
		Name:       opTagResource,
		HTTPMethod: "POST",
		HTTPPath:   "/tags/{resourceArn}",
	}

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

	output = &TagResourceOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(restjson.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// TagResource API operation for Synthetics.
//
// Assigns one or more tags (key-value pairs) to the specified canary or group.
//
// Tags can help you organize and categorize your resources. You can also use
// them to scope user permissions, by granting a user permission to access or
// change only resources with certain tag values.
//
// Tags don't have any semantic meaning to Amazon Web Services and are interpreted
// strictly as strings of characters.
//
// You can use the TagResource action with a resource that already has tags.
// If you specify a new tag key for the resource, this tag is appended to the
// list of tags associated with the resource. If you specify a tag key that
// is already associated with the resource, the new tag value that you specify
// replaces the previous value for that tag.
//
// You can associate as many as 50 tags with a canary or group.
//
// 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 Synthetics's
// API operation TagResource for usage and error information.
//
// Returned Error Types:
//
//   - BadRequestException
//     The request was not valid.
//
//   - NotFoundException
//     The specified resource was not found.
//
//   - TooManyRequestsException
//     There were too many simultaneous requests. Try the operation again.
//
//   - ConflictException
//     A conflicting operation is already in progress.
//
//   - InternalFailureException
//     An internal failure occurred. Try the operation again.
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/synthetics-2017-10-11/TagResource
func (c *Synthetics) 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 *Synthetics) 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 completes
// successfully.
//
// 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)
//	}
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/synthetics-2017-10-11/UntagResource
func (c *Synthetics) UntagResourceRequest(input *UntagResourceInput) (req *request.Request, output *UntagResourceOutput) {
	op := &request.Operation{
		Name:       opUntagResource,
		HTTPMethod: "DELETE",
		HTTPPath:   "/tags/{resourceArn}",
	}

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

	output = &UntagResourceOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(restjson.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// UntagResource API operation for Synthetics.
//
// Removes one or more tags from the specified resource.
//
// 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 Synthetics's
// API operation UntagResource for usage and error information.
//
// Returned Error Types:
//
//   - BadRequestException
//     The request was not valid.
//
//   - NotFoundException
//     The specified resource was not found.
//
//   - TooManyRequestsException
//     There were too many simultaneous requests. Try the operation again.
//
//   - ConflictException
//     A conflicting operation is already in progress.
//
//   - InternalFailureException
//     An internal failure occurred. Try the operation again.
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/synthetics-2017-10-11/UntagResource
func (c *Synthetics) 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 *Synthetics) 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()
}

const opUpdateCanary = "UpdateCanary"

// UpdateCanaryRequest generates a "aws/request.Request" representing the
// client's request for the UpdateCanary operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// 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 UpdateCanary for more information on using the UpdateCanary
// 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 UpdateCanaryRequest method.
//	req, resp := client.UpdateCanaryRequest(params)
//
//	err := req.Send()
//	if err == nil { // resp is now filled
//	    fmt.Println(resp)
//	}
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/synthetics-2017-10-11/UpdateCanary
func (c *Synthetics) UpdateCanaryRequest(input *UpdateCanaryInput) (req *request.Request, output *UpdateCanaryOutput) {
	op := &request.Operation{
		Name:       opUpdateCanary,
		HTTPMethod: "PATCH",
		HTTPPath:   "/canary/{name}",
	}

	if input == nil {
		input = &UpdateCanaryInput{}
	}

	output = &UpdateCanaryOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(restjson.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// UpdateCanary API operation for Synthetics.
//
// Updates the configuration of a canary that has already been created.
//
// You can't use this operation to update the tags of an existing canary. To
// change the tags of an existing canary, use TagResource (https://docs.aws.amazon.com/AmazonSynthetics/latest/APIReference/API_TagResource.html).
//
// 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 Synthetics's
// API operation UpdateCanary for usage and error information.
//
// Returned Error Types:
//
//   - InternalServerException
//     An unknown internal error occurred.
//
//   - ValidationException
//     A parameter could not be validated.
//
//   - ResourceNotFoundException
//     One of the specified resources was not found.
//
//   - ConflictException
//     A conflicting operation is already in progress.
//
//   - RequestEntityTooLargeException
//     One of the input resources is larger than is allowed.
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/synthetics-2017-10-11/UpdateCanary
func (c *Synthetics) UpdateCanary(input *UpdateCanaryInput) (*UpdateCanaryOutput, error) {
	req, out := c.UpdateCanaryRequest(input)
	return out, req.Send()
}

// UpdateCanaryWithContext is the same as UpdateCanary with the addition of
// the ability to pass a context and additional request options.
//
// See UpdateCanary 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 *Synthetics) UpdateCanaryWithContext(ctx aws.Context, input *UpdateCanaryInput, opts ...request.Option) (*UpdateCanaryOutput, error) {
	req, out := c.UpdateCanaryRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

// A structure that contains the configuration for canary artifacts, including
// the encryption-at-rest settings for artifacts that the canary uploads to
// Amazon S3.
type ArtifactConfigInput_ struct {
	_ struct{} `type:"structure"`

	// A structure that contains the configuration of the encryption-at-rest settings
	// for artifacts that the canary uploads to Amazon S3. Artifact encryption functionality
	// is available only for canaries that use Synthetics runtime version syn-nodejs-puppeteer-3.3
	// or later. For more information, see Encrypting canary artifacts (https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_artifact_encryption.html)
	S3Encryption *S3EncryptionConfig `type:"structure"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s ArtifactConfigInput_) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s ArtifactConfigInput_) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *ArtifactConfigInput_) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "ArtifactConfigInput_"}
	if s.S3Encryption != nil {
		if err := s.S3Encryption.Validate(); err != nil {
			invalidParams.AddNested("S3Encryption", err.(request.ErrInvalidParams))
		}
	}

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

// SetS3Encryption sets the S3Encryption field's value.
func (s *ArtifactConfigInput_) SetS3Encryption(v *S3EncryptionConfig) *ArtifactConfigInput_ {
	s.S3Encryption = v
	return s
}

// A structure that contains the configuration for canary artifacts, including
// the encryption-at-rest settings for artifacts that the canary uploads to
// Amazon S3.
type ArtifactConfigOutput_ struct {
	_ struct{} `type:"structure"`

	// A structure that contains the configuration of encryption settings for canary
	// artifacts that are stored in Amazon S3.
	S3Encryption *S3EncryptionConfig `type:"structure"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s ArtifactConfigOutput_) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s ArtifactConfigOutput_) GoString() string {
	return s.String()
}

// SetS3Encryption sets the S3Encryption field's value.
func (s *ArtifactConfigOutput_) SetS3Encryption(v *S3EncryptionConfig) *ArtifactConfigOutput_ {
	s.S3Encryption = v
	return s
}

type AssociateResourceInput struct {
	_ struct{} `type:"structure"`

	// Specifies the group. You can specify the group name, the ARN, or the group
	// ID as the GroupIdentifier.
	//
	// GroupIdentifier is a required field
	GroupIdentifier *string `location:"uri" locationName:"groupIdentifier" min:"1" type:"string" required:"true"`

	// The ARN of the canary that you want to associate with the specified group.
	//
	// ResourceArn is a required field
	ResourceArn *string `min:"1" type:"string" required:"true"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s AssociateResourceInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s AssociateResourceInput) GoString() string {
	return s.String()
}

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

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

// SetGroupIdentifier sets the GroupIdentifier field's value.
func (s *AssociateResourceInput) SetGroupIdentifier(v string) *AssociateResourceInput {
	s.GroupIdentifier = &v
	return s
}

// SetResourceArn sets the ResourceArn field's value.
func (s *AssociateResourceInput) SetResourceArn(v string) *AssociateResourceInput {
	s.ResourceArn = &v
	return s
}

type AssociateResourceOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s AssociateResourceOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s AssociateResourceOutput) GoString() string {
	return s.String()
}

// The request was not valid.
type BadRequestException struct {
	_            struct{}                  `type:"structure"`
	RespMetadata protocol.ResponseMetadata `json:"-" xml:"-"`

	Message_ *string `locationName:"Message" type:"string"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s BadRequestException) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s BadRequestException) GoString() string {
	return s.String()
}

func newErrorBadRequestException(v protocol.ResponseMetadata) error {
	return &BadRequestException{
		RespMetadata: v,
	}
}

// Code returns the exception type name.
func (s *BadRequestException) Code() string {
	return "BadRequestException"
}

// Message returns the exception's message.
func (s *BadRequestException) Message() string {
	if s.Message_ != nil {
		return *s.Message_
	}
	return ""
}

// OrigErr always returns nil, satisfies awserr.Error interface.
func (s *BadRequestException) OrigErr() error {
	return nil
}

func (s *BadRequestException) Error() string {
	return fmt.Sprintf("%s: %s", s.Code(), s.Message())
}

// Status code returns the HTTP status code for the request's response error.
func (s *BadRequestException) StatusCode() int {
	return s.RespMetadata.StatusCode
}

// RequestID returns the service's response RequestID for request.
func (s *BadRequestException) RequestID() string {
	return s.RespMetadata.RequestID
}

// A structure representing a screenshot that is used as a baseline during visual
// monitoring comparisons made by the canary.
type BaseScreenshot struct {
	_ struct{} `type:"structure"`

	// Coordinates that define the part of a screen to ignore during screenshot
	// comparisons. To obtain the coordinates to use here, use the CloudWatch console
	// to draw the boundaries on the screen. For more information, see Editing or
	// deleting a canary (https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/synthetics_canaries_deletion.html)
	IgnoreCoordinates []*string `type:"list"`

	// The name of the screenshot. This is generated the first time the canary is
	// run after the UpdateCanary operation that specified for this canary to perform
	// visual monitoring.
	//
	// ScreenshotName is a required field
	ScreenshotName *string `min:"1" type:"string" required:"true"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s BaseScreenshot) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s BaseScreenshot) GoString() string {
	return s.String()
}

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

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

// SetIgnoreCoordinates sets the IgnoreCoordinates field's value.
func (s *BaseScreenshot) SetIgnoreCoordinates(v []*string) *BaseScreenshot {
	s.IgnoreCoordinates = v
	return s
}

// SetScreenshotName sets the ScreenshotName field's value.
func (s *BaseScreenshot) SetScreenshotName(v string) *BaseScreenshot {
	s.ScreenshotName = &v
	return s
}

// This structure contains all information about one canary in your account.
type Canary struct {
	_ struct{} `type:"structure"`

	// A structure that contains the configuration for canary artifacts, including
	// the encryption-at-rest settings for artifacts that the canary uploads to
	// Amazon S3.
	ArtifactConfig *ArtifactConfigOutput_ `type:"structure"`

	// The location in Amazon S3 where Synthetics stores artifacts from the runs
	// of this canary. Artifacts include the log file, screenshots, and HAR files.
	ArtifactS3Location *string `min:"1" type:"string"`

	// This structure contains information about the canary's Lambda handler and
	// where its code is stored by CloudWatch Synthetics.
	Code *CanaryCodeOutput `type:"structure"`

	// The ARN of the Lambda function that is used as your canary's engine. For
	// more information about Lambda ARN format, see Resources and Conditions for
	// Lambda Actions (https://docs.aws.amazon.com/lambda/latest/dg/lambda-api-permissions-ref.html).
	EngineArn *string `min:"1" type:"string"`

	// The ARN of the IAM role used to run the canary. This role must include lambda.amazonaws.com
	// as a principal in the trust policy.
	ExecutionRoleArn *string `min:"1" type:"string"`

	// The number of days to retain data about failed runs of this canary.
	FailureRetentionPeriodInDays *int64 `min:"1" type:"integer"`

	// The unique ID of this canary.
	Id *string `type:"string"`

	// The name of the canary.
	Name *string `min:"1" type:"string"`

	// A structure that contains information about a canary run.
	RunConfig *CanaryRunConfigOutput `type:"structure"`

	// Specifies the runtime version to use for the canary. For more information
	// about runtime versions, see Canary Runtime Versions (https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_Library.html).
	RuntimeVersion *string `min:"1" type:"string"`

	// A structure that contains information about how often the canary is to run,
	// and when these runs are to stop.
	Schedule *CanaryScheduleOutput `type:"structure"`

	// A structure that contains information about the canary's status.
	Status *CanaryStatus `type:"structure"`

	// The number of days to retain data about successful runs of this canary.
	SuccessRetentionPeriodInDays *int64 `min:"1" type:"integer"`

	// The list of key-value pairs that are associated with the canary.
	Tags map[string]*string `min:"1" type:"map"`

	// A structure that contains information about when the canary was created,
	// modified, and most recently run.
	Timeline *CanaryTimeline `type:"structure"`

	// If this canary performs visual monitoring by comparing screenshots, this
	// structure contains the ID of the canary run to use as the baseline for screenshots,
	// and the coordinates of any parts of the screen to ignore during the visual
	// monitoring comparison.
	VisualReference *VisualReferenceOutput_ `type:"structure"`

	// If this canary is to test an endpoint in a VPC, this structure contains information
	// about the subnets and security groups of the VPC endpoint. For more information,
	// see Running a Canary in a VPC (https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_VPC.html).
	VpcConfig *VpcConfigOutput `type:"structure"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s Canary) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s Canary) GoString() string {
	return s.String()
}

// SetArtifactConfig sets the ArtifactConfig field's value.
func (s *Canary) SetArtifactConfig(v *ArtifactConfigOutput_) *Canary {
	s.ArtifactConfig = v
	return s
}

// SetArtifactS3Location sets the ArtifactS3Location field's value.
func (s *Canary) SetArtifactS3Location(v string) *Canary {
	s.ArtifactS3Location = &v
	return s
}

// SetCode sets the Code field's value.
func (s *Canary) SetCode(v *CanaryCodeOutput) *Canary {
	s.Code = v
	return s
}

// SetEngineArn sets the EngineArn field's value.
func (s *Canary) SetEngineArn(v string) *Canary {
	s.EngineArn = &v
	return s
}

// SetExecutionRoleArn sets the ExecutionRoleArn field's value.
func (s *Canary) SetExecutionRoleArn(v string) *Canary {
	s.ExecutionRoleArn = &v
	return s
}

// SetFailureRetentionPeriodInDays sets the FailureRetentionPeriodInDays field's value.
func (s *Canary) SetFailureRetentionPeriodInDays(v int64) *Canary {
	s.FailureRetentionPeriodInDays = &v
	return s
}

// SetId sets the Id field's value.
func (s *Canary) SetId(v string) *Canary {
	s.Id = &v
	return s
}

// SetName sets the Name field's value.
func (s *Canary) SetName(v string) *Canary {
	s.Name = &v
	return s
}

// SetRunConfig sets the RunConfig field's value.
func (s *Canary) SetRunConfig(v *CanaryRunConfigOutput) *Canary {
	s.RunConfig = v
	return s
}

// SetRuntimeVersion sets the RuntimeVersion field's value.
func (s *Canary) SetRuntimeVersion(v string) *Canary {
	s.RuntimeVersion = &v
	return s
}

// SetSchedule sets the Schedule field's value.
func (s *Canary) SetSchedule(v *CanaryScheduleOutput) *Canary {
	s.Schedule = v
	return s
}

// SetStatus sets the Status field's value.
func (s *Canary) SetStatus(v *CanaryStatus) *Canary {
	s.Status = v
	return s
}

// SetSuccessRetentionPeriodInDays sets the SuccessRetentionPeriodInDays field's value.
func (s *Canary) SetSuccessRetentionPeriodInDays(v int64) *Canary {
	s.SuccessRetentionPeriodInDays = &v
	return s
}

// SetTags sets the Tags field's value.
func (s *Canary) SetTags(v map[string]*string) *Canary {
	s.Tags = v
	return s
}

// SetTimeline sets the Timeline field's value.
func (s *Canary) SetTimeline(v *CanaryTimeline) *Canary {
	s.Timeline = v
	return s
}

// SetVisualReference sets the VisualReference field's value.
func (s *Canary) SetVisualReference(v *VisualReferenceOutput_) *Canary {
	s.VisualReference = v
	return s
}

// SetVpcConfig sets the VpcConfig field's value.
func (s *Canary) SetVpcConfig(v *VpcConfigOutput) *Canary {
	s.VpcConfig = v
	return s
}

// Use this structure to input your script code for the canary. This structure
// contains the Lambda handler with the location where the canary should start
// running the script. If the script is stored in an S3 bucket, the bucket name,
// key, and version are also included. If the script was passed into the canary
// directly, the script code is contained in the value of Zipfile.
type CanaryCodeInput struct {
	_ struct{} `type:"structure"`

	// The entry point to use for the source code when running the canary. For canaries
	// that use the syn-python-selenium-1.0 runtime or a syn-nodejs.puppeteer runtime
	// earlier than syn-nodejs.puppeteer-3.4, the handler must be specified as fileName.handler.
	// For syn-python-selenium-1.1, syn-nodejs.puppeteer-3.4, and later runtimes,
	// the handler can be specified as fileName.functionName , or you can specify
	// a folder where canary scripts reside as folder/fileName.functionName .
	//
	// Handler is a required field
	Handler *string `min:"1" type:"string" required:"true"`

	// If your canary script is located in S3, specify the bucket name here. Do
	// not include s3:// as the start of the bucket name.
	S3Bucket *string `min:"1" type:"string"`

	// The S3 key of your script. For more information, see Working with Amazon
	// S3 Objects (https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingObjects.html).
	S3Key *string `min:"1" type:"string"`

	// The S3 version ID of your script.
	S3Version *string `min:"1" type:"string"`

	// If you input your canary script directly into the canary instead of referring
	// to an S3 location, the value of this parameter is the base64-encoded contents
	// of the .zip file that contains the script. It must be smaller than 225 Kb.
	//
	// For large canary scripts, we recommend that you use an S3 location instead
	// of inputting it directly with this parameter.
	// ZipFile is automatically base64 encoded/decoded by the SDK.
	ZipFile []byte `min:"1" type:"blob"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s CanaryCodeInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s CanaryCodeInput) GoString() string {
	return s.String()
}

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

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

// SetHandler sets the Handler field's value.
func (s *CanaryCodeInput) SetHandler(v string) *CanaryCodeInput {
	s.Handler = &v
	return s
}

// SetS3Bucket sets the S3Bucket field's value.
func (s *CanaryCodeInput) SetS3Bucket(v string) *CanaryCodeInput {
	s.S3Bucket = &v
	return s
}

// SetS3Key sets the S3Key field's value.
func (s *CanaryCodeInput) SetS3Key(v string) *CanaryCodeInput {
	s.S3Key = &v
	return s
}

// SetS3Version sets the S3Version field's value.
func (s *CanaryCodeInput) SetS3Version(v string) *CanaryCodeInput {
	s.S3Version = &v
	return s
}

// SetZipFile sets the ZipFile field's value.
func (s *CanaryCodeInput) SetZipFile(v []byte) *CanaryCodeInput {
	s.ZipFile = v
	return s
}

// This structure contains information about the canary's Lambda handler and
// where its code is stored by CloudWatch Synthetics.
type CanaryCodeOutput struct {
	_ struct{} `type:"structure"`

	// The entry point to use for the source code when running the canary.
	Handler *string `min:"1" type:"string"`

	// The ARN of the Lambda layer where Synthetics stores the canary script code.
	SourceLocationArn *string `min:"1" type:"string"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s CanaryCodeOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s CanaryCodeOutput) GoString() string {
	return s.String()
}

// SetHandler sets the Handler field's value.
func (s *CanaryCodeOutput) SetHandler(v string) *CanaryCodeOutput {
	s.Handler = &v
	return s
}

// SetSourceLocationArn sets the SourceLocationArn field's value.
func (s *CanaryCodeOutput) SetSourceLocationArn(v string) *CanaryCodeOutput {
	s.SourceLocationArn = &v
	return s
}

// This structure contains information about the most recent run of a single
// canary.
type CanaryLastRun struct {
	_ struct{} `type:"structure"`

	// The name of the canary.
	CanaryName *string `min:"1" type:"string"`

	// The results from this canary's most recent run.
	LastRun *CanaryRun `type:"structure"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s CanaryLastRun) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s CanaryLastRun) GoString() string {
	return s.String()
}

// SetCanaryName sets the CanaryName field's value.
func (s *CanaryLastRun) SetCanaryName(v string) *CanaryLastRun {
	s.CanaryName = &v
	return s
}

// SetLastRun sets the LastRun field's value.
func (s *CanaryLastRun) SetLastRun(v *CanaryRun) *CanaryLastRun {
	s.LastRun = v
	return s
}

// This structure contains the details about one run of one canary.
type CanaryRun struct {
	_ struct{} `type:"structure"`

	// The location where the canary stored artifacts from the run. Artifacts include
	// the log file, screenshots, and HAR files.
	ArtifactS3Location *string `min:"1" type:"string"`

	// A unique ID that identifies this canary run.
	Id *string `type:"string"`

	// The name of the canary.
	Name *string `min:"1" type:"string"`

	// The status of this run.
	Status *CanaryRunStatus `type:"structure"`

	// A structure that contains the start and end times of this run.
	Timeline *CanaryRunTimeline `type:"structure"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s CanaryRun) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s CanaryRun) GoString() string {
	return s.String()
}

// SetArtifactS3Location sets the ArtifactS3Location field's value.
func (s *CanaryRun) SetArtifactS3Location(v string) *CanaryRun {
	s.ArtifactS3Location = &v
	return s
}

// SetId sets the Id field's value.
func (s *CanaryRun) SetId(v string) *CanaryRun {
	s.Id = &v
	return s
}

// SetName sets the Name field's value.
func (s *CanaryRun) SetName(v string) *CanaryRun {
	s.Name = &v
	return s
}

// SetStatus sets the Status field's value.
func (s *CanaryRun) SetStatus(v *CanaryRunStatus) *CanaryRun {
	s.Status = v
	return s
}

// SetTimeline sets the Timeline field's value.
func (s *CanaryRun) SetTimeline(v *CanaryRunTimeline) *CanaryRun {
	s.Timeline = v
	return s
}

// A structure that contains input information for a canary run.
type CanaryRunConfigInput struct {
	_ struct{} `type:"structure"`

	// Specifies whether this canary is to use active X-Ray tracing when it runs.
	// Active tracing enables this canary run to be displayed in the ServiceLens
	// and X-Ray service maps even if the canary does not hit an endpoint that has
	// X-Ray tracing enabled. Using X-Ray tracing incurs charges. For more information,
	// see Canaries and X-Ray tracing (https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_tracing.html).
	//
	// You can enable active tracing only for canaries that use version syn-nodejs-2.0
	// or later for their canary runtime.
	ActiveTracing *bool `type:"boolean"`

	// Specifies the keys and values to use for any environment variables used in
	// the canary script. Use the following format:
	//
	// { "key1" : "value1", "key2" : "value2", ...}
	//
	// Keys must start with a letter and be at least two characters. The total size
	// of your environment variables cannot exceed 4 KB. You can't specify any Lambda
	// reserved environment variables as the keys for your environment variables.
	// For more information about reserved keys, see Runtime environment variables
	// (https://docs.aws.amazon.com/lambda/latest/dg/configuration-envvars.html#configuration-envvars-runtime).
	//
	// The environment variables keys and values are not encrypted. Do not store
	// sensitive information in this field.
	EnvironmentVariables map[string]*string `type:"map"`

	// The maximum amount of memory available to the canary while it is running,
	// in MB. This value must be a multiple of 64.
	MemoryInMB *int64 `min:"960" type:"integer"`

	// How long the canary is allowed to run before it must stop. You can't set
	// this time to be longer than the frequency of the runs of this canary.
	//
	// If you omit this field, the frequency of the canary is used as this value,
	// up to a maximum of 14 minutes.
	TimeoutInSeconds *int64 `min:"3" type:"integer"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s CanaryRunConfigInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s CanaryRunConfigInput) GoString() string {
	return s.String()
}

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

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

// SetActiveTracing sets the ActiveTracing field's value.
func (s *CanaryRunConfigInput) SetActiveTracing(v bool) *CanaryRunConfigInput {
	s.ActiveTracing = &v
	return s
}

// SetEnvironmentVariables sets the EnvironmentVariables field's value.
func (s *CanaryRunConfigInput) SetEnvironmentVariables(v map[string]*string) *CanaryRunConfigInput {
	s.EnvironmentVariables = v
	return s
}

// SetMemoryInMB sets the MemoryInMB field's value.
func (s *CanaryRunConfigInput) SetMemoryInMB(v int64) *CanaryRunConfigInput {
	s.MemoryInMB = &v
	return s
}

// SetTimeoutInSeconds sets the TimeoutInSeconds field's value.
func (s *CanaryRunConfigInput) SetTimeoutInSeconds(v int64) *CanaryRunConfigInput {
	s.TimeoutInSeconds = &v
	return s
}

// A structure that contains information about a canary run.
type CanaryRunConfigOutput struct {
	_ struct{} `type:"structure"`

	// Displays whether this canary run used active X-Ray tracing.
	ActiveTracing *bool `type:"boolean"`

	// The maximum amount of memory available to the canary while it is running,
	// in MB. This value must be a multiple of 64.
	MemoryInMB *int64 `min:"960" type:"integer"`

	// How long the canary is allowed to run before it must stop.
	TimeoutInSeconds *int64 `min:"3" type:"integer"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s CanaryRunConfigOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s CanaryRunConfigOutput) GoString() string {
	return s.String()
}

// SetActiveTracing sets the ActiveTracing field's value.
func (s *CanaryRunConfigOutput) SetActiveTracing(v bool) *CanaryRunConfigOutput {
	s.ActiveTracing = &v
	return s
}

// SetMemoryInMB sets the MemoryInMB field's value.
func (s *CanaryRunConfigOutput) SetMemoryInMB(v int64) *CanaryRunConfigOutput {
	s.MemoryInMB = &v
	return s
}

// SetTimeoutInSeconds sets the TimeoutInSeconds field's value.
func (s *CanaryRunConfigOutput) SetTimeoutInSeconds(v int64) *CanaryRunConfigOutput {
	s.TimeoutInSeconds = &v
	return s
}

// This structure contains the status information about a canary run.
type CanaryRunStatus struct {
	_ struct{} `type:"structure"`

	// The current state of the run.
	State *string `type:"string" enum:"CanaryRunState"`

	// If run of the canary failed, this field contains the reason for the error.
	StateReason *string `min:"1" type:"string"`

	// If this value is CANARY_FAILURE, an exception occurred in the canary code.
	// If this value is EXECUTION_FAILURE, an exception occurred in CloudWatch Synthetics.
	StateReasonCode *string `type:"string" enum:"CanaryRunStateReasonCode"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s CanaryRunStatus) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s CanaryRunStatus) GoString() string {
	return s.String()
}

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

// SetStateReason sets the StateReason field's value.
func (s *CanaryRunStatus) SetStateReason(v string) *CanaryRunStatus {
	s.StateReason = &v
	return s
}

// SetStateReasonCode sets the StateReasonCode field's value.
func (s *CanaryRunStatus) SetStateReasonCode(v string) *CanaryRunStatus {
	s.StateReasonCode = &v
	return s
}

// This structure contains the start and end times of a single canary run.
type CanaryRunTimeline struct {
	_ struct{} `type:"structure"`

	// The end time of the run.
	Completed *time.Time `type:"timestamp"`

	// The start time of the run.
	Started *time.Time `type:"timestamp"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s CanaryRunTimeline) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s CanaryRunTimeline) GoString() string {
	return s.String()
}

// SetCompleted sets the Completed field's value.
func (s *CanaryRunTimeline) SetCompleted(v time.Time) *CanaryRunTimeline {
	s.Completed = &v
	return s
}

// SetStarted sets the Started field's value.
func (s *CanaryRunTimeline) SetStarted(v time.Time) *CanaryRunTimeline {
	s.Started = &v
	return s
}

// This structure specifies how often a canary is to make runs and the date
// and time when it should stop making runs.
type CanaryScheduleInput struct {
	_ struct{} `type:"structure"`

	// How long, in seconds, for the canary to continue making regular runs according
	// to the schedule in the Expression value. If you specify 0, the canary continues
	// making runs until you stop it. If you omit this field, the default of 0 is
	// used.
	DurationInSeconds *int64 `type:"long"`

	// A rate expression or a cron expression that defines how often the canary
	// is to run.
	//
	// For a rate expression, The syntax is rate(number unit). unit can be minute,
	// minutes, or hour.
	//
	// For example, rate(1 minute) runs the canary once a minute, rate(10 minutes)
	// runs it once every 10 minutes, and rate(1 hour) runs it once every hour.
	// You can specify a frequency between rate(1 minute) and rate(1 hour).
	//
	// Specifying rate(0 minute) or rate(0 hour) is a special value that causes
	// the canary to run only once when it is started.
	//
	// Use cron(expression) to specify a cron expression. You can't schedule a canary
	// to wait for more than a year before running. For information about the syntax
	// for cron expressions, see Scheduling canary runs using cron (https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_cron.html).
	//
	// Expression is a required field
	Expression *string `min:"1" type:"string" required:"true"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s CanaryScheduleInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s CanaryScheduleInput) GoString() string {
	return s.String()
}

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

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

// SetDurationInSeconds sets the DurationInSeconds field's value.
func (s *CanaryScheduleInput) SetDurationInSeconds(v int64) *CanaryScheduleInput {
	s.DurationInSeconds = &v
	return s
}

// SetExpression sets the Expression field's value.
func (s *CanaryScheduleInput) SetExpression(v string) *CanaryScheduleInput {
	s.Expression = &v
	return s
}

// How long, in seconds, for the canary to continue making regular runs according
// to the schedule in the Expression value.
type CanaryScheduleOutput struct {
	_ struct{} `type:"structure"`

	// How long, in seconds, for the canary to continue making regular runs after
	// it was created. The runs are performed according to the schedule in the Expression
	// value.
	DurationInSeconds *int64 `type:"long"`

	// A rate expression or a cron expression that defines how often the canary
	// is to run.
	//
	// For a rate expression, The syntax is rate(number unit). unit can be minute,
	// minutes, or hour.
	//
	// For example, rate(1 minute) runs the canary once a minute, rate(10 minutes)
	// runs it once every 10 minutes, and rate(1 hour) runs it once every hour.
	// You can specify a frequency between rate(1 minute) and rate(1 hour).
	//
	// Specifying rate(0 minute) or rate(0 hour) is a special value that causes
	// the canary to run only once when it is started.
	//
	// Use cron(expression) to specify a cron expression. For information about
	// the syntax for cron expressions, see Scheduling canary runs using cron (https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_cron.html).
	Expression *string `min:"1" type:"string"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s CanaryScheduleOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s CanaryScheduleOutput) GoString() string {
	return s.String()
}

// SetDurationInSeconds sets the DurationInSeconds field's value.
func (s *CanaryScheduleOutput) SetDurationInSeconds(v int64) *CanaryScheduleOutput {
	s.DurationInSeconds = &v
	return s
}

// SetExpression sets the Expression field's value.
func (s *CanaryScheduleOutput) SetExpression(v string) *CanaryScheduleOutput {
	s.Expression = &v
	return s
}

// A structure that contains the current state of the canary.
type CanaryStatus struct {
	_ struct{} `type:"structure"`

	// The current state of the canary.
	State *string `type:"string" enum:"CanaryState"`

	// If the canary has insufficient permissions to run, this field provides more
	// details.
	StateReason *string `min:"1" type:"string"`

	// If the canary cannot run or has failed, this field displays the reason.
	StateReasonCode *string `type:"string" enum:"CanaryStateReasonCode"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s CanaryStatus) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s CanaryStatus) GoString() string {
	return s.String()
}

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

// SetStateReason sets the StateReason field's value.
func (s *CanaryStatus) SetStateReason(v string) *CanaryStatus {
	s.StateReason = &v
	return s
}

// SetStateReasonCode sets the StateReasonCode field's value.
func (s *CanaryStatus) SetStateReasonCode(v string) *CanaryStatus {
	s.StateReasonCode = &v
	return s
}

// This structure contains information about when the canary was created and
// modified.
type CanaryTimeline struct {
	_ struct{} `type:"structure"`

	// The date and time the canary was created.
	Created *time.Time `type:"timestamp"`

	// The date and time the canary was most recently modified.
	LastModified *time.Time `type:"timestamp"`

	// The date and time that the canary's most recent run started.
	LastStarted *time.Time `type:"timestamp"`

	// The date and time that the canary's most recent run ended.
	LastStopped *time.Time `type:"timestamp"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s CanaryTimeline) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s CanaryTimeline) GoString() string {
	return s.String()
}

// SetCreated sets the Created field's value.
func (s *CanaryTimeline) SetCreated(v time.Time) *CanaryTimeline {
	s.Created = &v
	return s
}

// SetLastModified sets the LastModified field's value.
func (s *CanaryTimeline) SetLastModified(v time.Time) *CanaryTimeline {
	s.LastModified = &v
	return s
}

// SetLastStarted sets the LastStarted field's value.
func (s *CanaryTimeline) SetLastStarted(v time.Time) *CanaryTimeline {
	s.LastStarted = &v
	return s
}

// SetLastStopped sets the LastStopped field's value.
func (s *CanaryTimeline) SetLastStopped(v time.Time) *CanaryTimeline {
	s.LastStopped = &v
	return s
}

// A conflicting operation is already in progress.
type ConflictException struct {
	_            struct{}                  `type:"structure"`
	RespMetadata protocol.ResponseMetadata `json:"-" xml:"-"`

	Message_ *string `locationName:"Message" type:"string"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s ConflictException) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s ConflictException) GoString() string {
	return s.String()
}

func newErrorConflictException(v protocol.ResponseMetadata) error {
	return &ConflictException{
		RespMetadata: v,
	}
}

// Code returns the exception type name.
func (s *ConflictException) Code() string {
	return "ConflictException"
}

// Message returns the exception's message.
func (s *ConflictException) Message() string {
	if s.Message_ != nil {
		return *s.Message_
	}
	return ""
}

// OrigErr always returns nil, satisfies awserr.Error interface.
func (s *ConflictException) OrigErr() error {
	return nil
}

func (s *ConflictException) Error() string {
	return fmt.Sprintf("%s: %s", s.Code(), s.Message())
}

// Status code returns the HTTP status code for the request's response error.
func (s *ConflictException) StatusCode() int {
	return s.RespMetadata.StatusCode
}

// RequestID returns the service's response RequestID for request.
func (s *ConflictException) RequestID() string {
	return s.RespMetadata.RequestID
}

type CreateCanaryInput struct {
	_ struct{} `type:"structure"`

	// A structure that contains the configuration for canary artifacts, including
	// the encryption-at-rest settings for artifacts that the canary uploads to
	// Amazon S3.
	ArtifactConfig *ArtifactConfigInput_ `type:"structure"`

	// The location in Amazon S3 where Synthetics stores artifacts from the test
	// runs of this canary. Artifacts include the log file, screenshots, and HAR
	// files. The name of the S3 bucket can't include a period (.).
	//
	// ArtifactS3Location is a required field
	ArtifactS3Location *string `min:"1" type:"string" required:"true"`

	// A structure that includes the entry point from which the canary should start
	// running your script. If the script is stored in an S3 bucket, the bucket
	// name, key, and version are also included.
	//
	// Code is a required field
	Code *CanaryCodeInput `type:"structure" required:"true"`

	// The ARN of the IAM role to be used to run the canary. This role must already
	// exist, and must include lambda.amazonaws.com as a principal in the trust
	// policy. The role must also have the following permissions:
	//
	//    * s3:PutObject
	//
	//    * s3:GetBucketLocation
	//
	//    * s3:ListAllMyBuckets
	//
	//    * cloudwatch:PutMetricData
	//
	//    * logs:CreateLogGroup
	//
	//    * logs:CreateLogStream
	//
	//    * logs:PutLogEvents
	//
	// ExecutionRoleArn is a required field
	ExecutionRoleArn *string `min:"1" type:"string" required:"true"`

	// The number of days to retain data about failed runs of this canary. If you
	// omit this field, the default of 31 days is used. The valid range is 1 to
	// 455 days.
	FailureRetentionPeriodInDays *int64 `min:"1" type:"integer"`

	// The name for this canary. Be sure to give it a descriptive name that distinguishes
	// it from other canaries in your account.
	//
	// Do not include secrets or proprietary information in your canary names. The
	// canary name makes up part of the canary ARN, and the ARN is included in outbound
	// calls over the internet. For more information, see Security Considerations
	// for Synthetics Canaries (https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/servicelens_canaries_security.html).
	//
	// Name is a required field
	Name *string `min:"1" type:"string" required:"true"`

	// A structure that contains the configuration for individual canary runs, such
	// as timeout value and environment variables.
	//
	// The environment variables keys and values are not encrypted. Do not store
	// sensitive information in this field.
	RunConfig *CanaryRunConfigInput `type:"structure"`

	// Specifies the runtime version to use for the canary. For a list of valid
	// runtime versions and more information about runtime versions, see Canary
	// Runtime Versions (https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_Library.html).
	//
	// RuntimeVersion is a required field
	RuntimeVersion *string `min:"1" type:"string" required:"true"`

	// A structure that contains information about how often the canary is to run
	// and when these test runs are to stop.
	//
	// Schedule is a required field
	Schedule *CanaryScheduleInput `type:"structure" required:"true"`

	// The number of days to retain data about successful runs of this canary. If
	// you omit this field, the default of 31 days is used. The valid range is 1
	// to 455 days.
	SuccessRetentionPeriodInDays *int64 `min:"1" type:"integer"`

	// A list of key-value pairs to associate with the canary. You can associate
	// as many as 50 tags with a canary.
	//
	// Tags can help you organize and categorize your resources. You can also use
	// them to scope user permissions, by granting a user permission to access or
	// change only the resources that have certain tag values.
	Tags map[string]*string `min:"1" type:"map"`

	// If this canary is to test an endpoint in a VPC, this structure contains information
	// about the subnet and security groups of the VPC endpoint. For more information,
	// see Running a Canary in a VPC (https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_VPC.html).
	VpcConfig *VpcConfigInput `type:"structure"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s CreateCanaryInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s CreateCanaryInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *CreateCanaryInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "CreateCanaryInput"}
	if s.ArtifactS3Location == nil {
		invalidParams.Add(request.NewErrParamRequired("ArtifactS3Location"))
	}
	if s.ArtifactS3Location != nil && len(*s.ArtifactS3Location) < 1 {
		invalidParams.Add(request.NewErrParamMinLen("ArtifactS3Location", 1))
	}
	if s.Code == nil {
		invalidParams.Add(request.NewErrParamRequired("Code"))
	}
	if s.ExecutionRoleArn == nil {
		invalidParams.Add(request.NewErrParamRequired("ExecutionRoleArn"))
	}
	if s.ExecutionRoleArn != nil && len(*s.ExecutionRoleArn) < 1 {
		invalidParams.Add(request.NewErrParamMinLen("ExecutionRoleArn", 1))
	}
	if s.FailureRetentionPeriodInDays != nil && *s.FailureRetentionPeriodInDays < 1 {
		invalidParams.Add(request.NewErrParamMinValue("FailureRetentionPeriodInDays", 1))
	}
	if s.Name == nil {
		invalidParams.Add(request.NewErrParamRequired("Name"))
	}
	if s.Name != nil && len(*s.Name) < 1 {
		invalidParams.Add(request.NewErrParamMinLen("Name", 1))
	}
	if s.RuntimeVersion == nil {
		invalidParams.Add(request.NewErrParamRequired("RuntimeVersion"))
	}
	if s.RuntimeVersion != nil && len(*s.RuntimeVersion) < 1 {
		invalidParams.Add(request.NewErrParamMinLen("RuntimeVersion", 1))
	}
	if s.Schedule == nil {
		invalidParams.Add(request.NewErrParamRequired("Schedule"))
	}
	if s.SuccessRetentionPeriodInDays != nil && *s.SuccessRetentionPeriodInDays < 1 {
		invalidParams.Add(request.NewErrParamMinValue("SuccessRetentionPeriodInDays", 1))
	}
	if s.Tags != nil && len(s.Tags) < 1 {
		invalidParams.Add(request.NewErrParamMinLen("Tags", 1))
	}
	if s.ArtifactConfig != nil {
		if err := s.ArtifactConfig.Validate(); err != nil {
			invalidParams.AddNested("ArtifactConfig", err.(request.ErrInvalidParams))
		}
	}
	if s.Code != nil {
		if err := s.Code.Validate(); err != nil {
			invalidParams.AddNested("Code", err.(request.ErrInvalidParams))
		}
	}
	if s.RunConfig != nil {
		if err := s.RunConfig.Validate(); err != nil {
			invalidParams.AddNested("RunConfig", err.(request.ErrInvalidParams))
		}
	}
	if s.Schedule != nil {
		if err := s.Schedule.Validate(); err != nil {
			invalidParams.AddNested("Schedule", err.(request.ErrInvalidParams))
		}
	}

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

// SetArtifactConfig sets the ArtifactConfig field's value.
func (s *CreateCanaryInput) SetArtifactConfig(v *ArtifactConfigInput_) *CreateCanaryInput {
	s.ArtifactConfig = v
	return s
}

// SetArtifactS3Location sets the ArtifactS3Location field's value.
func (s *CreateCanaryInput) SetArtifactS3Location(v string) *CreateCanaryInput {
	s.ArtifactS3Location = &v
	return s
}

// SetCode sets the Code field's value.
func (s *CreateCanaryInput) SetCode(v *CanaryCodeInput) *CreateCanaryInput {
	s.Code = v
	return s
}

// SetExecutionRoleArn sets the ExecutionRoleArn field's value.
func (s *CreateCanaryInput) SetExecutionRoleArn(v string) *CreateCanaryInput {
	s.ExecutionRoleArn = &v
	return s
}

// SetFailureRetentionPeriodInDays sets the FailureRetentionPeriodInDays field's value.
func (s *CreateCanaryInput) SetFailureRetentionPeriodInDays(v int64) *CreateCanaryInput {
	s.FailureRetentionPeriodInDays = &v
	return s
}

// SetName sets the Name field's value.
func (s *CreateCanaryInput) SetName(v string) *CreateCanaryInput {
	s.Name = &v
	return s
}

// SetRunConfig sets the RunConfig field's value.
func (s *CreateCanaryInput) SetRunConfig(v *CanaryRunConfigInput) *CreateCanaryInput {
	s.RunConfig = v
	return s
}

// SetRuntimeVersion sets the RuntimeVersion field's value.
func (s *CreateCanaryInput) SetRuntimeVersion(v string) *CreateCanaryInput {
	s.RuntimeVersion = &v
	return s
}

// SetSchedule sets the Schedule field's value.
func (s *CreateCanaryInput) SetSchedule(v *CanaryScheduleInput) *CreateCanaryInput {
	s.Schedule = v
	return s
}

// SetSuccessRetentionPeriodInDays sets the SuccessRetentionPeriodInDays field's value.
func (s *CreateCanaryInput) SetSuccessRetentionPeriodInDays(v int64) *CreateCanaryInput {
	s.SuccessRetentionPeriodInDays = &v
	return s
}

// SetTags sets the Tags field's value.
func (s *CreateCanaryInput) SetTags(v map[string]*string) *CreateCanaryInput {
	s.Tags = v
	return s
}

// SetVpcConfig sets the VpcConfig field's value.
func (s *CreateCanaryInput) SetVpcConfig(v *VpcConfigInput) *CreateCanaryInput {
	s.VpcConfig = v
	return s
}

type CreateCanaryOutput struct {
	_ struct{} `type:"structure"`

	// The full details about the canary you have created.
	Canary *Canary `type:"structure"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s CreateCanaryOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s CreateCanaryOutput) GoString() string {
	return s.String()
}

// SetCanary sets the Canary field's value.
func (s *CreateCanaryOutput) SetCanary(v *Canary) *CreateCanaryOutput {
	s.Canary = v
	return s
}

type CreateGroupInput struct {
	_ struct{} `type:"structure"`

	// The name for the group. It can include any Unicode characters.
	//
	// The names for all groups in your account, across all Regions, must be unique.
	//
	// Name is a required field
	Name *string `min:"1" type:"string" required:"true"`

	// A list of key-value pairs to associate with the group. You can associate
	// as many as 50 tags with a group.
	//
	// Tags can help you organize and categorize your resources. You can also use
	// them to scope user permissions, by granting a user permission to access or
	// change only the resources that have certain tag values.
	Tags map[string]*string `min:"1" type:"map"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s CreateGroupInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s CreateGroupInput) GoString() string {
	return s.String()
}

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

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

// SetName sets the Name field's value.
func (s *CreateGroupInput) SetName(v string) *CreateGroupInput {
	s.Name = &v
	return s
}

// SetTags sets the Tags field's value.
func (s *CreateGroupInput) SetTags(v map[string]*string) *CreateGroupInput {
	s.Tags = v
	return s
}

type CreateGroupOutput struct {
	_ struct{} `type:"structure"`

	// A structure that contains information about the group that was just created.
	Group *Group `type:"structure"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s CreateGroupOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s CreateGroupOutput) GoString() string {
	return s.String()
}

// SetGroup sets the Group field's value.
func (s *CreateGroupOutput) SetGroup(v *Group) *CreateGroupOutput {
	s.Group = v
	return s
}

type DeleteCanaryInput struct {
	_ struct{} `type:"structure" nopayload:"true"`

	// Specifies whether to also delete the Lambda functions and layers used by
	// this canary. The default is false.
	//
	// Type: Boolean
	DeleteLambda *bool `location:"querystring" locationName:"deleteLambda" type:"boolean"`

	// The name of the canary that you want to delete. To find the names of your
	// canaries, use DescribeCanaries (https://docs.aws.amazon.com/AmazonSynthetics/latest/APIReference/API_DescribeCanaries.html).
	//
	// Name is a required field
	Name *string `location:"uri" locationName:"name" min:"1" type:"string" required:"true"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s DeleteCanaryInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s DeleteCanaryInput) GoString() string {
	return s.String()
}

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

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

// SetDeleteLambda sets the DeleteLambda field's value.
func (s *DeleteCanaryInput) SetDeleteLambda(v bool) *DeleteCanaryInput {
	s.DeleteLambda = &v
	return s
}

// SetName sets the Name field's value.
func (s *DeleteCanaryInput) SetName(v string) *DeleteCanaryInput {
	s.Name = &v
	return s
}

type DeleteCanaryOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s DeleteCanaryOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s DeleteCanaryOutput) GoString() string {
	return s.String()
}

type DeleteGroupInput struct {
	_ struct{} `type:"structure" nopayload:"true"`

	// Specifies which group to delete. You can specify the group name, the ARN,
	// or the group ID as the GroupIdentifier.
	//
	// GroupIdentifier is a required field
	GroupIdentifier *string `location:"uri" locationName:"groupIdentifier" min:"1" type:"string" required:"true"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s DeleteGroupInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s DeleteGroupInput) GoString() string {
	return s.String()
}

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

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

// SetGroupIdentifier sets the GroupIdentifier field's value.
func (s *DeleteGroupInput) SetGroupIdentifier(v string) *DeleteGroupInput {
	s.GroupIdentifier = &v
	return s
}

type DeleteGroupOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s DeleteGroupOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s DeleteGroupOutput) GoString() string {
	return s.String()
}

type DescribeCanariesInput struct {
	_ struct{} `type:"structure"`

	// Specify this parameter to limit how many canaries are returned each time
	// you use the DescribeCanaries operation. If you omit this parameter, the default
	// of 100 is used.
	MaxResults *int64 `min:"1" type:"integer"`

	// Use this parameter to return only canaries that match the names that you
	// specify here. You can specify as many as five canary names.
	//
	// If you specify this parameter, the operation is successful only if you have
	// authorization to view all the canaries that you specify in your request.
	// If you do not have permission to view any of the canaries, the request fails
	// with a 403 response.
	//
	// You are required to use this parameter if you are logged on to a user or
	// role that has an IAM policy that restricts which canaries that you are allowed
	// to view. For more information, see Limiting a user to viewing specific canaries
	// (https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_Restricted.html).
	Names []*string `min:"1" type:"list"`

	// A token that indicates that there is more data available. You can use this
	// token in a subsequent operation to retrieve the next set of results.
	NextToken *string `min:"4" type:"string"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s DescribeCanariesInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s DescribeCanariesInput) GoString() string {
	return s.String()
}

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

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

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

// SetNames sets the Names field's value.
func (s *DescribeCanariesInput) SetNames(v []*string) *DescribeCanariesInput {
	s.Names = v
	return s
}

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

type DescribeCanariesLastRunInput struct {
	_ struct{} `type:"structure"`

	// Specify this parameter to limit how many runs are returned each time you
	// use the DescribeLastRun operation. If you omit this parameter, the default
	// of 100 is used.
	MaxResults *int64 `min:"1" type:"integer"`

	// Use this parameter to return only canaries that match the names that you
	// specify here. You can specify as many as five canary names.
	//
	// If you specify this parameter, the operation is successful only if you have
	// authorization to view all the canaries that you specify in your request.
	// If you do not have permission to view any of the canaries, the request fails
	// with a 403 response.
	//
	// You are required to use the Names parameter if you are logged on to a user
	// or role that has an IAM policy that restricts which canaries that you are
	// allowed to view. For more information, see Limiting a user to viewing specific
	// canaries (https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_Restricted.html).
	Names []*string `min:"1" type:"list"`

	// A token that indicates that there is more data available. You can use this
	// token in a subsequent DescribeCanariesLastRun operation to retrieve the next
	// set of results.
	NextToken *string `min:"4" type:"string"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s DescribeCanariesLastRunInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s DescribeCanariesLastRunInput) GoString() string {
	return s.String()
}

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

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

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

// SetNames sets the Names field's value.
func (s *DescribeCanariesLastRunInput) SetNames(v []*string) *DescribeCanariesLastRunInput {
	s.Names = v
	return s
}

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

type DescribeCanariesLastRunOutput struct {
	_ struct{} `type:"structure"`

	// An array that contains the information from the most recent run of each canary.
	CanariesLastRun []*CanaryLastRun `type:"list"`

	// A token that indicates that there is more data available. You can use this
	// token in a subsequent DescribeCanariesLastRun operation to retrieve the next
	// set of results.
	NextToken *string `min:"4" type:"string"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s DescribeCanariesLastRunOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s DescribeCanariesLastRunOutput) GoString() string {
	return s.String()
}

// SetCanariesLastRun sets the CanariesLastRun field's value.
func (s *DescribeCanariesLastRunOutput) SetCanariesLastRun(v []*CanaryLastRun) *DescribeCanariesLastRunOutput {
	s.CanariesLastRun = v
	return s
}

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

type DescribeCanariesOutput struct {
	_ struct{} `type:"structure"`

	// Returns an array. Each item in the array contains the full information about
	// one canary.
	Canaries []*Canary `type:"list"`

	// A token that indicates that there is more data available. You can use this
	// token in a subsequent DescribeCanaries operation to retrieve the next set
	// of results.
	NextToken *string `min:"4" type:"string"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s DescribeCanariesOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s DescribeCanariesOutput) GoString() string {
	return s.String()
}

// SetCanaries sets the Canaries field's value.
func (s *DescribeCanariesOutput) SetCanaries(v []*Canary) *DescribeCanariesOutput {
	s.Canaries = v
	return s
}

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

type DescribeRuntimeVersionsInput struct {
	_ struct{} `type:"structure"`

	// Specify this parameter to limit how many runs are returned each time you
	// use the DescribeRuntimeVersions operation. If you omit this parameter, the
	// default of 100 is used.
	MaxResults *int64 `min:"1" type:"integer"`

	// A token that indicates that there is more data available. You can use this
	// token in a subsequent DescribeRuntimeVersions operation to retrieve the next
	// set of results.
	NextToken *string `min:"4" type:"string"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s DescribeRuntimeVersionsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s DescribeRuntimeVersionsInput) GoString() string {
	return s.String()
}

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

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

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

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

type DescribeRuntimeVersionsOutput struct {
	_ struct{} `type:"structure"`

	// A token that indicates that there is more data available. You can use this
	// token in a subsequent DescribeRuntimeVersions operation to retrieve the next
	// set of results.
	NextToken *string `min:"4" type:"string"`

	// An array of objects that display the details about each Synthetics canary
	// runtime version.
	RuntimeVersions []*RuntimeVersion `type:"list"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s DescribeRuntimeVersionsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s DescribeRuntimeVersionsOutput) GoString() string {
	return s.String()
}

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

// SetRuntimeVersions sets the RuntimeVersions field's value.
func (s *DescribeRuntimeVersionsOutput) SetRuntimeVersions(v []*RuntimeVersion) *DescribeRuntimeVersionsOutput {
	s.RuntimeVersions = v
	return s
}

type DisassociateResourceInput struct {
	_ struct{} `type:"structure"`

	// Specifies the group. You can specify the group name, the ARN, or the group
	// ID as the GroupIdentifier.
	//
	// GroupIdentifier is a required field
	GroupIdentifier *string `location:"uri" locationName:"groupIdentifier" min:"1" type:"string" required:"true"`

	// The ARN of the canary that you want to remove from the specified group.
	//
	// ResourceArn is a required field
	ResourceArn *string `min:"1" type:"string" required:"true"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s DisassociateResourceInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s DisassociateResourceInput) GoString() string {
	return s.String()
}

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

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

// SetGroupIdentifier sets the GroupIdentifier field's value.
func (s *DisassociateResourceInput) SetGroupIdentifier(v string) *DisassociateResourceInput {
	s.GroupIdentifier = &v
	return s
}

// SetResourceArn sets the ResourceArn field's value.
func (s *DisassociateResourceInput) SetResourceArn(v string) *DisassociateResourceInput {
	s.ResourceArn = &v
	return s
}

type DisassociateResourceOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s DisassociateResourceOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s DisassociateResourceOutput) GoString() string {
	return s.String()
}

type GetCanaryInput struct {
	_ struct{} `type:"structure" nopayload:"true"`

	// The name of the canary that you want details for.
	//
	// Name is a required field
	Name *string `location:"uri" locationName:"name" min:"1" type:"string" required:"true"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s GetCanaryInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s GetCanaryInput) GoString() string {
	return s.String()
}

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

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

// SetName sets the Name field's value.
func (s *GetCanaryInput) SetName(v string) *GetCanaryInput {
	s.Name = &v
	return s
}

type GetCanaryOutput struct {
	_ struct{} `type:"structure"`

	// A structure that contains the full information about the canary.
	Canary *Canary `type:"structure"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s GetCanaryOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s GetCanaryOutput) GoString() string {
	return s.String()
}

// SetCanary sets the Canary field's value.
func (s *GetCanaryOutput) SetCanary(v *Canary) *GetCanaryOutput {
	s.Canary = v
	return s
}

type GetCanaryRunsInput struct {
	_ struct{} `type:"structure"`

	// Specify this parameter to limit how many runs are returned each time you
	// use the GetCanaryRuns operation. If you omit this parameter, the default
	// of 100 is used.
	MaxResults *int64 `min:"1" type:"integer"`

	// The name of the canary that you want to see runs for.
	//
	// Name is a required field
	Name *string `location:"uri" locationName:"name" min:"1" type:"string" required:"true"`

	// A token that indicates that there is more data available. You can use this
	// token in a subsequent GetCanaryRuns operation to retrieve the next set of
	// results.
	NextToken *string `min:"4" type:"string"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s GetCanaryRunsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s GetCanaryRunsInput) GoString() string {
	return s.String()
}

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

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

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

// SetName sets the Name field's value.
func (s *GetCanaryRunsInput) SetName(v string) *GetCanaryRunsInput {
	s.Name = &v
	return s
}

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

type GetCanaryRunsOutput struct {
	_ struct{} `type:"structure"`

	// An array of structures. Each structure contains the details of one of the
	// retrieved canary runs.
	CanaryRuns []*CanaryRun `type:"list"`

	// A token that indicates that there is more data available. You can use this
	// token in a subsequent GetCanaryRuns operation to retrieve the next set of
	// results.
	NextToken *string `min:"4" type:"string"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s GetCanaryRunsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s GetCanaryRunsOutput) GoString() string {
	return s.String()
}

// SetCanaryRuns sets the CanaryRuns field's value.
func (s *GetCanaryRunsOutput) SetCanaryRuns(v []*CanaryRun) *GetCanaryRunsOutput {
	s.CanaryRuns = v
	return s
}

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

type GetGroupInput struct {
	_ struct{} `type:"structure" nopayload:"true"`

	// Specifies the group to return information for. You can specify the group
	// name, the ARN, or the group ID as the GroupIdentifier.
	//
	// GroupIdentifier is a required field
	GroupIdentifier *string `location:"uri" locationName:"groupIdentifier" min:"1" type:"string" required:"true"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s GetGroupInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s GetGroupInput) GoString() string {
	return s.String()
}

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

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

// SetGroupIdentifier sets the GroupIdentifier field's value.
func (s *GetGroupInput) SetGroupIdentifier(v string) *GetGroupInput {
	s.GroupIdentifier = &v
	return s
}

type GetGroupOutput struct {
	_ struct{} `type:"structure"`

	// A structure that contains information about the group.
	Group *Group `type:"structure"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s GetGroupOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s GetGroupOutput) GoString() string {
	return s.String()
}

// SetGroup sets the Group field's value.
func (s *GetGroupOutput) SetGroup(v *Group) *GetGroupOutput {
	s.Group = v
	return s
}

// This structure contains information about one group.
type Group struct {
	_ struct{} `type:"structure"`

	// The ARN of the group.
	Arn *string `min:"1" type:"string"`

	// The date and time that the group was created.
	CreatedTime *time.Time `type:"timestamp"`

	// The unique ID of the group.
	Id *string `min:"1" type:"string"`

	// The date and time that the group was most recently updated.
	LastModifiedTime *time.Time `type:"timestamp"`

	// The name of the group.
	Name *string `min:"1" type:"string"`

	// The list of key-value pairs that are associated with the canary.
	Tags map[string]*string `min:"1" type:"map"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s Group) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s Group) GoString() string {
	return s.String()
}

// SetArn sets the Arn field's value.
func (s *Group) SetArn(v string) *Group {
	s.Arn = &v
	return s
}

// SetCreatedTime sets the CreatedTime field's value.
func (s *Group) SetCreatedTime(v time.Time) *Group {
	s.CreatedTime = &v
	return s
}

// SetId sets the Id field's value.
func (s *Group) SetId(v string) *Group {
	s.Id = &v
	return s
}

// SetLastModifiedTime sets the LastModifiedTime field's value.
func (s *Group) SetLastModifiedTime(v time.Time) *Group {
	s.LastModifiedTime = &v
	return s
}

// SetName sets the Name field's value.
func (s *Group) SetName(v string) *Group {
	s.Name = &v
	return s
}

// SetTags sets the Tags field's value.
func (s *Group) SetTags(v map[string]*string) *Group {
	s.Tags = v
	return s
}

// A structure containing some information about a group.
type GroupSummary struct {
	_ struct{} `type:"structure"`

	// The ARN of the group.
	Arn *string `min:"1" type:"string"`

	// The unique ID of the group.
	Id *string `min:"1" type:"string"`

	// The name of the group.
	Name *string `min:"1" type:"string"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s GroupSummary) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s GroupSummary) GoString() string {
	return s.String()
}

// SetArn sets the Arn field's value.
func (s *GroupSummary) SetArn(v string) *GroupSummary {
	s.Arn = &v
	return s
}

// SetId sets the Id field's value.
func (s *GroupSummary) SetId(v string) *GroupSummary {
	s.Id = &v
	return s
}

// SetName sets the Name field's value.
func (s *GroupSummary) SetName(v string) *GroupSummary {
	s.Name = &v
	return s
}

// An internal failure occurred. Try the operation again.
type InternalFailureException struct {
	_            struct{}                  `type:"structure"`
	RespMetadata protocol.ResponseMetadata `json:"-" xml:"-"`

	Message_ *string `locationName:"Message" type:"string"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s InternalFailureException) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s InternalFailureException) GoString() string {
	return s.String()
}

func newErrorInternalFailureException(v protocol.ResponseMetadata) error {
	return &InternalFailureException{
		RespMetadata: v,
	}
}

// Code returns the exception type name.
func (s *InternalFailureException) Code() string {
	return "InternalFailureException"
}

// Message returns the exception's message.
func (s *InternalFailureException) Message() string {
	if s.Message_ != nil {
		return *s.Message_
	}
	return ""
}

// OrigErr always returns nil, satisfies awserr.Error interface.
func (s *InternalFailureException) OrigErr() error {
	return nil
}

func (s *InternalFailureException) Error() string {
	return fmt.Sprintf("%s: %s", s.Code(), s.Message())
}

// Status code returns the HTTP status code for the request's response error.
func (s *InternalFailureException) StatusCode() int {
	return s.RespMetadata.StatusCode
}

// RequestID returns the service's response RequestID for request.
func (s *InternalFailureException) RequestID() string {
	return s.RespMetadata.RequestID
}

// An unknown internal error occurred.
type InternalServerException struct {
	_            struct{}                  `type:"structure"`
	RespMetadata protocol.ResponseMetadata `json:"-" xml:"-"`

	Message_ *string `locationName:"Message" type:"string"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s InternalServerException) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s InternalServerException) GoString() string {
	return s.String()
}

func newErrorInternalServerException(v protocol.ResponseMetadata) error {
	return &InternalServerException{
		RespMetadata: v,
	}
}

// Code returns the exception type name.
func (s *InternalServerException) Code() string {
	return "InternalServerException"
}

// Message returns the exception's message.
func (s *InternalServerException) Message() string {
	if s.Message_ != nil {
		return *s.Message_
	}
	return ""
}

// OrigErr always returns nil, satisfies awserr.Error interface.
func (s *InternalServerException) OrigErr() error {
	return nil
}

func (s *InternalServerException) Error() string {
	return fmt.Sprintf("%s: %s", s.Code(), s.Message())
}

// Status code returns the HTTP status code for the request's response error.
func (s *InternalServerException) StatusCode() int {
	return s.RespMetadata.StatusCode
}

// RequestID returns the service's response RequestID for request.
func (s *InternalServerException) RequestID() string {
	return s.RespMetadata.RequestID
}

type ListAssociatedGroupsInput struct {
	_ struct{} `type:"structure"`

	// Specify this parameter to limit how many groups are returned each time you
	// use the ListAssociatedGroups operation. If you omit this parameter, the default
	// of 20 is used.
	MaxResults *int64 `min:"1" type:"integer"`

	// A token that indicates that there is more data available. You can use this
	// token in a subsequent operation to retrieve the next set of results.
	NextToken *string `min:"1" type:"string"`

	// The ARN of the canary that you want to view groups for.
	//
	// ResourceArn is a required field
	ResourceArn *string `location:"uri" locationName:"resourceArn" min:"1" type:"string" required:"true"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s ListAssociatedGroupsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s ListAssociatedGroupsInput) GoString() string {
	return s.String()
}

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

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

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

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

// SetResourceArn sets the ResourceArn field's value.
func (s *ListAssociatedGroupsInput) SetResourceArn(v string) *ListAssociatedGroupsInput {
	s.ResourceArn = &v
	return s
}

type ListAssociatedGroupsOutput struct {
	_ struct{} `type:"structure"`

	// An array of structures that contain information about the groups that this
	// canary is associated with.
	Groups []*GroupSummary `type:"list"`

	// A token that indicates that there is more data available. You can use this
	// token in a subsequent ListAssociatedGroups operation to retrieve the next
	// set of results.
	NextToken *string `min:"1" type:"string"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s ListAssociatedGroupsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s ListAssociatedGroupsOutput) GoString() string {
	return s.String()
}

// SetGroups sets the Groups field's value.
func (s *ListAssociatedGroupsOutput) SetGroups(v []*GroupSummary) *ListAssociatedGroupsOutput {
	s.Groups = v
	return s
}

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

type ListGroupResourcesInput struct {
	_ struct{} `type:"structure"`

	// Specifies the group to return information for. You can specify the group
	// name, the ARN, or the group ID as the GroupIdentifier.
	//
	// GroupIdentifier is a required field
	GroupIdentifier *string `location:"uri" locationName:"groupIdentifier" min:"1" type:"string" required:"true"`

	// Specify this parameter to limit how many canary ARNs are returned each time
	// you use the ListGroupResources operation. If you omit this parameter, the
	// default of 20 is used.
	MaxResults *int64 `min:"1" type:"integer"`

	// A token that indicates that there is more data available. You can use this
	// token in a subsequent operation to retrieve the next set of results.
	NextToken *string `min:"1" type:"string"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s ListGroupResourcesInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s ListGroupResourcesInput) GoString() string {
	return s.String()
}

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

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

// SetGroupIdentifier sets the GroupIdentifier field's value.
func (s *ListGroupResourcesInput) SetGroupIdentifier(v string) *ListGroupResourcesInput {
	s.GroupIdentifier = &v
	return s
}

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

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

type ListGroupResourcesOutput struct {
	_ struct{} `type:"structure"`

	// A token that indicates that there is more data available. You can use this
	// token in a subsequent ListGroupResources operation to retrieve the next set
	// of results.
	NextToken *string `min:"1" type:"string"`

	// An array of ARNs. These ARNs are for the canaries that are associated with
	// the group.
	Resources []*string `type:"list"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s ListGroupResourcesOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s ListGroupResourcesOutput) GoString() string {
	return s.String()
}

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

// SetResources sets the Resources field's value.
func (s *ListGroupResourcesOutput) SetResources(v []*string) *ListGroupResourcesOutput {
	s.Resources = v
	return s
}

type ListGroupsInput struct {
	_ struct{} `type:"structure"`

	// Specify this parameter to limit how many groups are returned each time you
	// use the ListGroups operation. If you omit this parameter, the default of
	// 20 is used.
	MaxResults *int64 `min:"1" type:"integer"`

	// A token that indicates that there is more data available. You can use this
	// token in a subsequent operation to retrieve the next set of results.
	NextToken *string `min:"1" type:"string"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s ListGroupsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s ListGroupsInput) GoString() string {
	return s.String()
}

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

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

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

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

type ListGroupsOutput struct {
	_ struct{} `type:"structure"`

	// An array of structures that each contain information about one group.
	Groups []*GroupSummary `type:"list"`

	// A token that indicates that there is more data available. You can use this
	// token in a subsequent ListGroups operation to retrieve the next set of results.
	NextToken *string `min:"4" type:"string"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s ListGroupsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s ListGroupsOutput) GoString() string {
	return s.String()
}

// SetGroups sets the Groups field's value.
func (s *ListGroupsOutput) SetGroups(v []*GroupSummary) *ListGroupsOutput {
	s.Groups = v
	return s
}

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

type ListTagsForResourceInput struct {
	_ struct{} `type:"structure" nopayload:"true"`

	// The ARN of the canary or group that you want to view tags for.
	//
	// The ARN format of a canary is arn:aws:synthetics:Region:account-id:canary:canary-name .
	//
	// The ARN format of a group is arn:aws:synthetics:Region:account-id:group:group-name
	//
	// ResourceArn is a required field
	ResourceArn *string `location:"uri" locationName:"resourceArn" min:"1" type:"string" required:"true"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s ListTagsForResourceInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s ListTagsForResourceInput) GoString() string {
	return s.String()
}

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

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

// SetResourceArn sets the ResourceArn field's value.
func (s *ListTagsForResourceInput) SetResourceArn(v string) *ListTagsForResourceInput {
	s.ResourceArn = &v
	return s
}

type ListTagsForResourceOutput struct {
	_ struct{} `type:"structure"`

	// The list of tag keys and values associated with the resource that you specified.
	Tags map[string]*string `min:"1" type:"map"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s ListTagsForResourceOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s ListTagsForResourceOutput) GoString() string {
	return s.String()
}

// SetTags sets the Tags field's value.
func (s *ListTagsForResourceOutput) SetTags(v map[string]*string) *ListTagsForResourceOutput {
	s.Tags = v
	return s
}

// The specified resource was not found.
type NotFoundException struct {
	_            struct{}                  `type:"structure"`
	RespMetadata protocol.ResponseMetadata `json:"-" xml:"-"`

	Message_ *string `locationName:"Message" type:"string"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s NotFoundException) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s NotFoundException) GoString() string {
	return s.String()
}

func newErrorNotFoundException(v protocol.ResponseMetadata) error {
	return &NotFoundException{
		RespMetadata: v,
	}
}

// Code returns the exception type name.
func (s *NotFoundException) Code() string {
	return "NotFoundException"
}

// Message returns the exception's message.
func (s *NotFoundException) Message() string {
	if s.Message_ != nil {
		return *s.Message_
	}
	return ""
}

// OrigErr always returns nil, satisfies awserr.Error interface.
func (s *NotFoundException) OrigErr() error {
	return nil
}

func (s *NotFoundException) Error() string {
	return fmt.Sprintf("%s: %s", s.Code(), s.Message())
}

// Status code returns the HTTP status code for the request's response error.
func (s *NotFoundException) StatusCode() int {
	return s.RespMetadata.StatusCode
}

// RequestID returns the service's response RequestID for request.
func (s *NotFoundException) RequestID() string {
	return s.RespMetadata.RequestID
}

// One of the input resources is larger than is allowed.
type RequestEntityTooLargeException struct {
	_            struct{}                  `type:"structure"`
	RespMetadata protocol.ResponseMetadata `json:"-" xml:"-"`

	Message_ *string `locationName:"Message" type:"string"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s RequestEntityTooLargeException) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s RequestEntityTooLargeException) GoString() string {
	return s.String()
}

func newErrorRequestEntityTooLargeException(v protocol.ResponseMetadata) error {
	return &RequestEntityTooLargeException{
		RespMetadata: v,
	}
}

// Code returns the exception type name.
func (s *RequestEntityTooLargeException) Code() string {
	return "RequestEntityTooLargeException"
}

// Message returns the exception's message.
func (s *RequestEntityTooLargeException) Message() string {
	if s.Message_ != nil {
		return *s.Message_
	}
	return ""
}

// OrigErr always returns nil, satisfies awserr.Error interface.
func (s *RequestEntityTooLargeException) OrigErr() error {
	return nil
}

func (s *RequestEntityTooLargeException) Error() string {
	return fmt.Sprintf("%s: %s", s.Code(), s.Message())
}

// Status code returns the HTTP status code for the request's response error.
func (s *RequestEntityTooLargeException) StatusCode() int {
	return s.RespMetadata.StatusCode
}

// RequestID returns the service's response RequestID for request.
func (s *RequestEntityTooLargeException) RequestID() string {
	return s.RespMetadata.RequestID
}

// One of the specified resources was not found.
type ResourceNotFoundException struct {
	_            struct{}                  `type:"structure"`
	RespMetadata protocol.ResponseMetadata `json:"-" xml:"-"`

	Message_ *string `locationName:"Message" type:"string"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s ResourceNotFoundException) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s ResourceNotFoundException) GoString() string {
	return s.String()
}

func newErrorResourceNotFoundException(v protocol.ResponseMetadata) error {
	return &ResourceNotFoundException{
		RespMetadata: v,
	}
}

// Code returns the exception type name.
func (s *ResourceNotFoundException) Code() string {
	return "ResourceNotFoundException"
}

// Message returns the exception's message.
func (s *ResourceNotFoundException) Message() string {
	if s.Message_ != nil {
		return *s.Message_
	}
	return ""
}

// OrigErr always returns nil, satisfies awserr.Error interface.
func (s *ResourceNotFoundException) OrigErr() error {
	return nil
}

func (s *ResourceNotFoundException) Error() string {
	return fmt.Sprintf("%s: %s", s.Code(), s.Message())
}

// Status code returns the HTTP status code for the request's response error.
func (s *ResourceNotFoundException) StatusCode() int {
	return s.RespMetadata.StatusCode
}

// RequestID returns the service's response RequestID for request.
func (s *ResourceNotFoundException) RequestID() string {
	return s.RespMetadata.RequestID
}

// This structure contains information about one canary runtime version. For
// more information about runtime versions, see Canary Runtime Versions (https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_Library.html).
type RuntimeVersion struct {
	_ struct{} `type:"structure"`

	// If this runtime version is deprecated, this value is the date of deprecation.
	DeprecationDate *time.Time `type:"timestamp"`

	// A description of the runtime version, created by Amazon.
	Description *string `min:"1" type:"string"`

	// The date that the runtime version was released.
	ReleaseDate *time.Time `type:"timestamp"`

	// The name of the runtime version. For a list of valid runtime versions, see
	// Canary Runtime Versions (https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_Library.html).
	VersionName *string `min:"1" type:"string"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s RuntimeVersion) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s RuntimeVersion) GoString() string {
	return s.String()
}

// SetDeprecationDate sets the DeprecationDate field's value.
func (s *RuntimeVersion) SetDeprecationDate(v time.Time) *RuntimeVersion {
	s.DeprecationDate = &v
	return s
}

// SetDescription sets the Description field's value.
func (s *RuntimeVersion) SetDescription(v string) *RuntimeVersion {
	s.Description = &v
	return s
}

// SetReleaseDate sets the ReleaseDate field's value.
func (s *RuntimeVersion) SetReleaseDate(v time.Time) *RuntimeVersion {
	s.ReleaseDate = &v
	return s
}

// SetVersionName sets the VersionName field's value.
func (s *RuntimeVersion) SetVersionName(v string) *RuntimeVersion {
	s.VersionName = &v
	return s
}

// A structure that contains the configuration of encryption-at-rest settings
// for canary artifacts that the canary uploads to Amazon S3.
//
// For more information, see Encrypting canary artifacts (https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_artifact_encryption.html)
type S3EncryptionConfig struct {
	_ struct{} `type:"structure"`

	// The encryption method to use for artifacts created by this canary. Specify
	// SSE_S3 to use server-side encryption (SSE) with an Amazon S3-managed key.
	// Specify SSE-KMS to use server-side encryption with a customer-managed KMS
	// key.
	//
	// If you omit this parameter, an Amazon Web Services-managed KMS key is used.
	EncryptionMode *string `type:"string" enum:"EncryptionMode"`

	// The ARN of the customer-managed KMS key to use, if you specify SSE-KMS for
	// EncryptionMode
	KmsKeyArn *string `min:"1" type:"string"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s S3EncryptionConfig) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s S3EncryptionConfig) GoString() string {
	return s.String()
}

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

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

// SetEncryptionMode sets the EncryptionMode field's value.
func (s *S3EncryptionConfig) SetEncryptionMode(v string) *S3EncryptionConfig {
	s.EncryptionMode = &v
	return s
}

// SetKmsKeyArn sets the KmsKeyArn field's value.
func (s *S3EncryptionConfig) SetKmsKeyArn(v string) *S3EncryptionConfig {
	s.KmsKeyArn = &v
	return s
}

// The request exceeded a service quota value.
type ServiceQuotaExceededException struct {
	_            struct{}                  `type:"structure"`
	RespMetadata protocol.ResponseMetadata `json:"-" xml:"-"`

	Message_ *string `locationName:"Message" type:"string"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s ServiceQuotaExceededException) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s ServiceQuotaExceededException) GoString() string {
	return s.String()
}

func newErrorServiceQuotaExceededException(v protocol.ResponseMetadata) error {
	return &ServiceQuotaExceededException{
		RespMetadata: v,
	}
}

// Code returns the exception type name.
func (s *ServiceQuotaExceededException) Code() string {
	return "ServiceQuotaExceededException"
}

// Message returns the exception's message.
func (s *ServiceQuotaExceededException) Message() string {
	if s.Message_ != nil {
		return *s.Message_
	}
	return ""
}

// OrigErr always returns nil, satisfies awserr.Error interface.
func (s *ServiceQuotaExceededException) OrigErr() error {
	return nil
}

func (s *ServiceQuotaExceededException) Error() string {
	return fmt.Sprintf("%s: %s", s.Code(), s.Message())
}

// Status code returns the HTTP status code for the request's response error.
func (s *ServiceQuotaExceededException) StatusCode() int {
	return s.RespMetadata.StatusCode
}

// RequestID returns the service's response RequestID for request.
func (s *ServiceQuotaExceededException) RequestID() string {
	return s.RespMetadata.RequestID
}

type StartCanaryInput struct {
	_ struct{} `type:"structure" nopayload:"true"`

	// The name of the canary that you want to run. To find canary names, use DescribeCanaries
	// (https://docs.aws.amazon.com/AmazonSynthetics/latest/APIReference/API_DescribeCanaries.html).
	//
	// Name is a required field
	Name *string `location:"uri" locationName:"name" min:"1" type:"string" required:"true"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s StartCanaryInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s StartCanaryInput) GoString() string {
	return s.String()
}

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

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

// SetName sets the Name field's value.
func (s *StartCanaryInput) SetName(v string) *StartCanaryInput {
	s.Name = &v
	return s
}

type StartCanaryOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s StartCanaryOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s StartCanaryOutput) GoString() string {
	return s.String()
}

type StopCanaryInput struct {
	_ struct{} `type:"structure" nopayload:"true"`

	// The name of the canary that you want to stop. To find the names of your canaries,
	// use ListCanaries (https://docs.aws.amazon.com/AmazonSynthetics/latest/APIReference/API_DescribeCanaries.html).
	//
	// Name is a required field
	Name *string `location:"uri" locationName:"name" min:"1" type:"string" required:"true"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s StopCanaryInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s StopCanaryInput) GoString() string {
	return s.String()
}

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

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

// SetName sets the Name field's value.
func (s *StopCanaryInput) SetName(v string) *StopCanaryInput {
	s.Name = &v
	return s
}

type StopCanaryOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s StopCanaryOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s StopCanaryOutput) GoString() string {
	return s.String()
}

type TagResourceInput struct {
	_ struct{} `type:"structure"`

	// The ARN of the canary or group that you're adding tags to.
	//
	// The ARN format of a canary is arn:aws:synthetics:Region:account-id:canary:canary-name .
	//
	// The ARN format of a group is arn:aws:synthetics:Region:account-id:group:group-name
	//
	// ResourceArn is a required field
	ResourceArn *string `location:"uri" locationName:"resourceArn" min:"1" type:"string" required:"true"`

	// The list of key-value pairs to associate with the resource.
	//
	// Tags is a required field
	Tags map[string]*string `min:"1" type:"map" required:"true"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s TagResourceInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
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.ResourceArn == nil {
		invalidParams.Add(request.NewErrParamRequired("ResourceArn"))
	}
	if s.ResourceArn != nil && len(*s.ResourceArn) < 1 {
		invalidParams.Add(request.NewErrParamMinLen("ResourceArn", 1))
	}
	if s.Tags == nil {
		invalidParams.Add(request.NewErrParamRequired("Tags"))
	}
	if s.Tags != nil && len(s.Tags) < 1 {
		invalidParams.Add(request.NewErrParamMinLen("Tags", 1))
	}

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

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

// SetTags sets the Tags field's value.
func (s *TagResourceInput) SetTags(v map[string]*string) *TagResourceInput {
	s.Tags = v
	return s
}

type TagResourceOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s TagResourceOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s TagResourceOutput) GoString() string {
	return s.String()
}

// There were too many simultaneous requests. Try the operation again.
type TooManyRequestsException struct {
	_            struct{}                  `type:"structure"`
	RespMetadata protocol.ResponseMetadata `json:"-" xml:"-"`

	Message_ *string `locationName:"Message" type:"string"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s TooManyRequestsException) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s TooManyRequestsException) GoString() string {
	return s.String()
}

func newErrorTooManyRequestsException(v protocol.ResponseMetadata) error {
	return &TooManyRequestsException{
		RespMetadata: v,
	}
}

// Code returns the exception type name.
func (s *TooManyRequestsException) Code() string {
	return "TooManyRequestsException"
}

// Message returns the exception's message.
func (s *TooManyRequestsException) Message() string {
	if s.Message_ != nil {
		return *s.Message_
	}
	return ""
}

// OrigErr always returns nil, satisfies awserr.Error interface.
func (s *TooManyRequestsException) OrigErr() error {
	return nil
}

func (s *TooManyRequestsException) Error() string {
	return fmt.Sprintf("%s: %s", s.Code(), s.Message())
}

// Status code returns the HTTP status code for the request's response error.
func (s *TooManyRequestsException) StatusCode() int {
	return s.RespMetadata.StatusCode
}

// RequestID returns the service's response RequestID for request.
func (s *TooManyRequestsException) RequestID() string {
	return s.RespMetadata.RequestID
}

type UntagResourceInput struct {
	_ struct{} `type:"structure" nopayload:"true"`

	// The ARN of the canary or group that you're removing tags from.
	//
	// The ARN format of a canary is arn:aws:synthetics:Region:account-id:canary:canary-name .
	//
	// The ARN format of a group is arn:aws:synthetics:Region:account-id:group:group-name
	//
	// ResourceArn is a required field
	ResourceArn *string `location:"uri" locationName:"resourceArn" min:"1" type:"string" required:"true"`

	// The list of tag keys to remove from the resource.
	//
	// TagKeys is a required field
	TagKeys []*string `location:"querystring" locationName:"tagKeys" min:"1" type:"list" required:"true"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s UntagResourceInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
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.ResourceArn == nil {
		invalidParams.Add(request.NewErrParamRequired("ResourceArn"))
	}
	if s.ResourceArn != nil && len(*s.ResourceArn) < 1 {
		invalidParams.Add(request.NewErrParamMinLen("ResourceArn", 1))
	}
	if s.TagKeys == nil {
		invalidParams.Add(request.NewErrParamRequired("TagKeys"))
	}
	if s.TagKeys != nil && len(s.TagKeys) < 1 {
		invalidParams.Add(request.NewErrParamMinLen("TagKeys", 1))
	}

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

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

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

type UntagResourceOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s UntagResourceOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s UntagResourceOutput) GoString() string {
	return s.String()
}

type UpdateCanaryInput struct {
	_ struct{} `type:"structure"`

	// A structure that contains the configuration for canary artifacts, including
	// the encryption-at-rest settings for artifacts that the canary uploads to
	// Amazon S3.
	ArtifactConfig *ArtifactConfigInput_ `type:"structure"`

	// The location in Amazon S3 where Synthetics stores artifacts from the test
	// runs of this canary. Artifacts include the log file, screenshots, and HAR
	// files. The name of the S3 bucket can't include a period (.).
	ArtifactS3Location *string `min:"1" type:"string"`

	// A structure that includes the entry point from which the canary should start
	// running your script. If the script is stored in an S3 bucket, the bucket
	// name, key, and version are also included.
	Code *CanaryCodeInput `type:"structure"`

	// The ARN of the IAM role to be used to run the canary. This role must already
	// exist, and must include lambda.amazonaws.com as a principal in the trust
	// policy. The role must also have the following permissions:
	//
	//    * s3:PutObject
	//
	//    * s3:GetBucketLocation
	//
	//    * s3:ListAllMyBuckets
	//
	//    * cloudwatch:PutMetricData
	//
	//    * logs:CreateLogGroup
	//
	//    * logs:CreateLogStream
	//
	//    * logs:CreateLogStream
	ExecutionRoleArn *string `min:"1" type:"string"`

	// The number of days to retain data about failed runs of this canary.
	FailureRetentionPeriodInDays *int64 `min:"1" type:"integer"`

	// The name of the canary that you want to update. To find the names of your
	// canaries, use DescribeCanaries (https://docs.aws.amazon.com/AmazonSynthetics/latest/APIReference/API_DescribeCanaries.html).
	//
	// You cannot change the name of a canary that has already been created.
	//
	// Name is a required field
	Name *string `location:"uri" locationName:"name" min:"1" type:"string" required:"true"`

	// A structure that contains the timeout value that is used for each individual
	// run of the canary.
	//
	// The environment variables keys and values are not encrypted. Do not store
	// sensitive information in this field.
	RunConfig *CanaryRunConfigInput `type:"structure"`

	// Specifies the runtime version to use for the canary. For a list of valid
	// runtime versions and for more information about runtime versions, see Canary
	// Runtime Versions (https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_Library.html).
	RuntimeVersion *string `min:"1" type:"string"`

	// A structure that contains information about how often the canary is to run,
	// and when these runs are to stop.
	Schedule *CanaryScheduleInput `type:"structure"`

	// The number of days to retain data about successful runs of this canary.
	SuccessRetentionPeriodInDays *int64 `min:"1" type:"integer"`

	// Defines the screenshots to use as the baseline for comparisons during visual
	// monitoring comparisons during future runs of this canary. If you omit this
	// parameter, no changes are made to any baseline screenshots that the canary
	// might be using already.
	//
	// Visual monitoring is supported only on canaries running the syn-puppeteer-node-3.2
	// runtime or later. For more information, see Visual monitoring (https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_SyntheticsLogger_VisualTesting.html)
	// and Visual monitoring blueprint (https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_Blueprints_VisualTesting.html)
	VisualReference *VisualReferenceInput_ `type:"structure"`

	// If this canary is to test an endpoint in a VPC, this structure contains information
	// about the subnet and security groups of the VPC endpoint. For more information,
	// see Running a Canary in a VPC (https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_VPC.html).
	VpcConfig *VpcConfigInput `type:"structure"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s UpdateCanaryInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s UpdateCanaryInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *UpdateCanaryInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "UpdateCanaryInput"}
	if s.ArtifactS3Location != nil && len(*s.ArtifactS3Location) < 1 {
		invalidParams.Add(request.NewErrParamMinLen("ArtifactS3Location", 1))
	}
	if s.ExecutionRoleArn != nil && len(*s.ExecutionRoleArn) < 1 {
		invalidParams.Add(request.NewErrParamMinLen("ExecutionRoleArn", 1))
	}
	if s.FailureRetentionPeriodInDays != nil && *s.FailureRetentionPeriodInDays < 1 {
		invalidParams.Add(request.NewErrParamMinValue("FailureRetentionPeriodInDays", 1))
	}
	if s.Name == nil {
		invalidParams.Add(request.NewErrParamRequired("Name"))
	}
	if s.Name != nil && len(*s.Name) < 1 {
		invalidParams.Add(request.NewErrParamMinLen("Name", 1))
	}
	if s.RuntimeVersion != nil && len(*s.RuntimeVersion) < 1 {
		invalidParams.Add(request.NewErrParamMinLen("RuntimeVersion", 1))
	}
	if s.SuccessRetentionPeriodInDays != nil && *s.SuccessRetentionPeriodInDays < 1 {
		invalidParams.Add(request.NewErrParamMinValue("SuccessRetentionPeriodInDays", 1))
	}
	if s.ArtifactConfig != nil {
		if err := s.ArtifactConfig.Validate(); err != nil {
			invalidParams.AddNested("ArtifactConfig", err.(request.ErrInvalidParams))
		}
	}
	if s.Code != nil {
		if err := s.Code.Validate(); err != nil {
			invalidParams.AddNested("Code", err.(request.ErrInvalidParams))
		}
	}
	if s.RunConfig != nil {
		if err := s.RunConfig.Validate(); err != nil {
			invalidParams.AddNested("RunConfig", err.(request.ErrInvalidParams))
		}
	}
	if s.Schedule != nil {
		if err := s.Schedule.Validate(); err != nil {
			invalidParams.AddNested("Schedule", err.(request.ErrInvalidParams))
		}
	}
	if s.VisualReference != nil {
		if err := s.VisualReference.Validate(); err != nil {
			invalidParams.AddNested("VisualReference", err.(request.ErrInvalidParams))
		}
	}

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

// SetArtifactConfig sets the ArtifactConfig field's value.
func (s *UpdateCanaryInput) SetArtifactConfig(v *ArtifactConfigInput_) *UpdateCanaryInput {
	s.ArtifactConfig = v
	return s
}

// SetArtifactS3Location sets the ArtifactS3Location field's value.
func (s *UpdateCanaryInput) SetArtifactS3Location(v string) *UpdateCanaryInput {
	s.ArtifactS3Location = &v
	return s
}

// SetCode sets the Code field's value.
func (s *UpdateCanaryInput) SetCode(v *CanaryCodeInput) *UpdateCanaryInput {
	s.Code = v
	return s
}

// SetExecutionRoleArn sets the ExecutionRoleArn field's value.
func (s *UpdateCanaryInput) SetExecutionRoleArn(v string) *UpdateCanaryInput {
	s.ExecutionRoleArn = &v
	return s
}

// SetFailureRetentionPeriodInDays sets the FailureRetentionPeriodInDays field's value.
func (s *UpdateCanaryInput) SetFailureRetentionPeriodInDays(v int64) *UpdateCanaryInput {
	s.FailureRetentionPeriodInDays = &v
	return s
}

// SetName sets the Name field's value.
func (s *UpdateCanaryInput) SetName(v string) *UpdateCanaryInput {
	s.Name = &v
	return s
}

// SetRunConfig sets the RunConfig field's value.
func (s *UpdateCanaryInput) SetRunConfig(v *CanaryRunConfigInput) *UpdateCanaryInput {
	s.RunConfig = v
	return s
}

// SetRuntimeVersion sets the RuntimeVersion field's value.
func (s *UpdateCanaryInput) SetRuntimeVersion(v string) *UpdateCanaryInput {
	s.RuntimeVersion = &v
	return s
}

// SetSchedule sets the Schedule field's value.
func (s *UpdateCanaryInput) SetSchedule(v *CanaryScheduleInput) *UpdateCanaryInput {
	s.Schedule = v
	return s
}

// SetSuccessRetentionPeriodInDays sets the SuccessRetentionPeriodInDays field's value.
func (s *UpdateCanaryInput) SetSuccessRetentionPeriodInDays(v int64) *UpdateCanaryInput {
	s.SuccessRetentionPeriodInDays = &v
	return s
}

// SetVisualReference sets the VisualReference field's value.
func (s *UpdateCanaryInput) SetVisualReference(v *VisualReferenceInput_) *UpdateCanaryInput {
	s.VisualReference = v
	return s
}

// SetVpcConfig sets the VpcConfig field's value.
func (s *UpdateCanaryInput) SetVpcConfig(v *VpcConfigInput) *UpdateCanaryInput {
	s.VpcConfig = v
	return s
}

type UpdateCanaryOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s UpdateCanaryOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s UpdateCanaryOutput) GoString() string {
	return s.String()
}

// A parameter could not be validated.
type ValidationException struct {
	_            struct{}                  `type:"structure"`
	RespMetadata protocol.ResponseMetadata `json:"-" xml:"-"`

	Message_ *string `locationName:"Message" type:"string"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s ValidationException) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s ValidationException) GoString() string {
	return s.String()
}

func newErrorValidationException(v protocol.ResponseMetadata) error {
	return &ValidationException{
		RespMetadata: v,
	}
}

// Code returns the exception type name.
func (s *ValidationException) Code() string {
	return "ValidationException"
}

// Message returns the exception's message.
func (s *ValidationException) Message() string {
	if s.Message_ != nil {
		return *s.Message_
	}
	return ""
}

// OrigErr always returns nil, satisfies awserr.Error interface.
func (s *ValidationException) OrigErr() error {
	return nil
}

func (s *ValidationException) Error() string {
	return fmt.Sprintf("%s: %s", s.Code(), s.Message())
}

// Status code returns the HTTP status code for the request's response error.
func (s *ValidationException) StatusCode() int {
	return s.RespMetadata.StatusCode
}

// RequestID returns the service's response RequestID for request.
func (s *ValidationException) RequestID() string {
	return s.RespMetadata.RequestID
}

// An object that specifies what screenshots to use as a baseline for visual
// monitoring by this canary. It can optionally also specify parts of the screenshots
// to ignore during the visual monitoring comparison.
//
// Visual monitoring is supported only on canaries running the syn-puppeteer-node-3.2
// runtime or later. For more information, see Visual monitoring (https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_SyntheticsLogger_VisualTesting.html)
// and Visual monitoring blueprint (https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_Blueprints_VisualTesting.html)
type VisualReferenceInput_ struct {
	_ struct{} `type:"structure"`

	// Specifies which canary run to use the screenshots from as the baseline for
	// future visual monitoring with this canary. Valid values are nextrun to use
	// the screenshots from the next run after this update is made, lastrun to use
	// the screenshots from the most recent run before this update was made, or
	// the value of Id in the CanaryRun (https://docs.aws.amazon.com/AmazonSynthetics/latest/APIReference/API_CanaryRun.html)
	// from any past run of this canary.
	//
	// BaseCanaryRunId is a required field
	BaseCanaryRunId *string `min:"1" type:"string" required:"true"`

	// An array of screenshots that will be used as the baseline for visual monitoring
	// in future runs of this canary. If there is a screenshot that you don't want
	// to be used for visual monitoring, remove it from this array.
	BaseScreenshots []*BaseScreenshot `type:"list"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s VisualReferenceInput_) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s VisualReferenceInput_) GoString() string {
	return s.String()
}

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

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

// SetBaseCanaryRunId sets the BaseCanaryRunId field's value.
func (s *VisualReferenceInput_) SetBaseCanaryRunId(v string) *VisualReferenceInput_ {
	s.BaseCanaryRunId = &v
	return s
}

// SetBaseScreenshots sets the BaseScreenshots field's value.
func (s *VisualReferenceInput_) SetBaseScreenshots(v []*BaseScreenshot) *VisualReferenceInput_ {
	s.BaseScreenshots = v
	return s
}

// If this canary performs visual monitoring by comparing screenshots, this
// structure contains the ID of the canary run that is used as the baseline
// for screenshots, and the coordinates of any parts of those screenshots that
// are ignored during visual monitoring comparison.
//
// Visual monitoring is supported only on canaries running the syn-puppeteer-node-3.2
// runtime or later.
type VisualReferenceOutput_ struct {
	_ struct{} `type:"structure"`

	// The ID of the canary run that produced the baseline screenshots that are
	// used for visual monitoring comparisons by this canary.
	BaseCanaryRunId *string `min:"1" type:"string"`

	// An array of screenshots that are used as the baseline for comparisons during
	// visual monitoring.
	BaseScreenshots []*BaseScreenshot `type:"list"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s VisualReferenceOutput_) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s VisualReferenceOutput_) GoString() string {
	return s.String()
}

// SetBaseCanaryRunId sets the BaseCanaryRunId field's value.
func (s *VisualReferenceOutput_) SetBaseCanaryRunId(v string) *VisualReferenceOutput_ {
	s.BaseCanaryRunId = &v
	return s
}

// SetBaseScreenshots sets the BaseScreenshots field's value.
func (s *VisualReferenceOutput_) SetBaseScreenshots(v []*BaseScreenshot) *VisualReferenceOutput_ {
	s.BaseScreenshots = v
	return s
}

// If this canary is to test an endpoint in a VPC, this structure contains information
// about the subnets and security groups of the VPC endpoint. For more information,
// see Running a Canary in a VPC (https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_VPC.html).
type VpcConfigInput struct {
	_ struct{} `type:"structure"`

	// The IDs of the security groups for this canary.
	SecurityGroupIds []*string `type:"list"`

	// The IDs of the subnets where this canary is to run.
	SubnetIds []*string `type:"list"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s VpcConfigInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s VpcConfigInput) GoString() string {
	return s.String()
}

// SetSecurityGroupIds sets the SecurityGroupIds field's value.
func (s *VpcConfigInput) SetSecurityGroupIds(v []*string) *VpcConfigInput {
	s.SecurityGroupIds = v
	return s
}

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

// If this canary is to test an endpoint in a VPC, this structure contains information
// about the subnets and security groups of the VPC endpoint. For more information,
// see Running a Canary in a VPC (https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_VPC.html).
type VpcConfigOutput struct {
	_ struct{} `type:"structure"`

	// The IDs of the security groups for this canary.
	SecurityGroupIds []*string `type:"list"`

	// The IDs of the subnets where this canary is to run.
	SubnetIds []*string `type:"list"`

	// The IDs of the VPC where this canary is to run.
	VpcId *string `type:"string"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s VpcConfigOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s VpcConfigOutput) GoString() string {
	return s.String()
}

// SetSecurityGroupIds sets the SecurityGroupIds field's value.
func (s *VpcConfigOutput) SetSecurityGroupIds(v []*string) *VpcConfigOutput {
	s.SecurityGroupIds = v
	return s
}

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

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

const (
	// CanaryRunStateRunning is a CanaryRunState enum value
	CanaryRunStateRunning = "RUNNING"

	// CanaryRunStatePassed is a CanaryRunState enum value
	CanaryRunStatePassed = "PASSED"

	// CanaryRunStateFailed is a CanaryRunState enum value
	CanaryRunStateFailed = "FAILED"
)

// CanaryRunState_Values returns all elements of the CanaryRunState enum
func CanaryRunState_Values() []string {
	return []string{
		CanaryRunStateRunning,
		CanaryRunStatePassed,
		CanaryRunStateFailed,
	}
}

const (
	// CanaryRunStateReasonCodeCanaryFailure is a CanaryRunStateReasonCode enum value
	CanaryRunStateReasonCodeCanaryFailure = "CANARY_FAILURE"

	// CanaryRunStateReasonCodeExecutionFailure is a CanaryRunStateReasonCode enum value
	CanaryRunStateReasonCodeExecutionFailure = "EXECUTION_FAILURE"
)

// CanaryRunStateReasonCode_Values returns all elements of the CanaryRunStateReasonCode enum
func CanaryRunStateReasonCode_Values() []string {
	return []string{
		CanaryRunStateReasonCodeCanaryFailure,
		CanaryRunStateReasonCodeExecutionFailure,
	}
}

const (
	// CanaryStateCreating is a CanaryState enum value
	CanaryStateCreating = "CREATING"

	// CanaryStateReady is a CanaryState enum value
	CanaryStateReady = "READY"

	// CanaryStateStarting is a CanaryState enum value
	CanaryStateStarting = "STARTING"

	// CanaryStateRunning is a CanaryState enum value
	CanaryStateRunning = "RUNNING"

	// CanaryStateUpdating is a CanaryState enum value
	CanaryStateUpdating = "UPDATING"

	// CanaryStateStopping is a CanaryState enum value
	CanaryStateStopping = "STOPPING"

	// CanaryStateStopped is a CanaryState enum value
	CanaryStateStopped = "STOPPED"

	// CanaryStateError is a CanaryState enum value
	CanaryStateError = "ERROR"

	// CanaryStateDeleting is a CanaryState enum value
	CanaryStateDeleting = "DELETING"
)

// CanaryState_Values returns all elements of the CanaryState enum
func CanaryState_Values() []string {
	return []string{
		CanaryStateCreating,
		CanaryStateReady,
		CanaryStateStarting,
		CanaryStateRunning,
		CanaryStateUpdating,
		CanaryStateStopping,
		CanaryStateStopped,
		CanaryStateError,
		CanaryStateDeleting,
	}
}

const (
	// CanaryStateReasonCodeInvalidPermissions is a CanaryStateReasonCode enum value
	CanaryStateReasonCodeInvalidPermissions = "INVALID_PERMISSIONS"

	// CanaryStateReasonCodeCreatePending is a CanaryStateReasonCode enum value
	CanaryStateReasonCodeCreatePending = "CREATE_PENDING"

	// CanaryStateReasonCodeCreateInProgress is a CanaryStateReasonCode enum value
	CanaryStateReasonCodeCreateInProgress = "CREATE_IN_PROGRESS"

	// CanaryStateReasonCodeCreateFailed is a CanaryStateReasonCode enum value
	CanaryStateReasonCodeCreateFailed = "CREATE_FAILED"

	// CanaryStateReasonCodeUpdatePending is a CanaryStateReasonCode enum value
	CanaryStateReasonCodeUpdatePending = "UPDATE_PENDING"

	// CanaryStateReasonCodeUpdateInProgress is a CanaryStateReasonCode enum value
	CanaryStateReasonCodeUpdateInProgress = "UPDATE_IN_PROGRESS"

	// CanaryStateReasonCodeUpdateComplete is a CanaryStateReasonCode enum value
	CanaryStateReasonCodeUpdateComplete = "UPDATE_COMPLETE"

	// CanaryStateReasonCodeRollbackComplete is a CanaryStateReasonCode enum value
	CanaryStateReasonCodeRollbackComplete = "ROLLBACK_COMPLETE"

	// CanaryStateReasonCodeRollbackFailed is a CanaryStateReasonCode enum value
	CanaryStateReasonCodeRollbackFailed = "ROLLBACK_FAILED"

	// CanaryStateReasonCodeDeleteInProgress is a CanaryStateReasonCode enum value
	CanaryStateReasonCodeDeleteInProgress = "DELETE_IN_PROGRESS"

	// CanaryStateReasonCodeDeleteFailed is a CanaryStateReasonCode enum value
	CanaryStateReasonCodeDeleteFailed = "DELETE_FAILED"

	// CanaryStateReasonCodeSyncDeleteInProgress is a CanaryStateReasonCode enum value
	CanaryStateReasonCodeSyncDeleteInProgress = "SYNC_DELETE_IN_PROGRESS"
)

// CanaryStateReasonCode_Values returns all elements of the CanaryStateReasonCode enum
func CanaryStateReasonCode_Values() []string {
	return []string{
		CanaryStateReasonCodeInvalidPermissions,
		CanaryStateReasonCodeCreatePending,
		CanaryStateReasonCodeCreateInProgress,
		CanaryStateReasonCodeCreateFailed,
		CanaryStateReasonCodeUpdatePending,
		CanaryStateReasonCodeUpdateInProgress,
		CanaryStateReasonCodeUpdateComplete,
		CanaryStateReasonCodeRollbackComplete,
		CanaryStateReasonCodeRollbackFailed,
		CanaryStateReasonCodeDeleteInProgress,
		CanaryStateReasonCodeDeleteFailed,
		CanaryStateReasonCodeSyncDeleteInProgress,
	}
}

const (
	// EncryptionModeSseS3 is a EncryptionMode enum value
	EncryptionModeSseS3 = "SSE_S3"

	// EncryptionModeSseKms is a EncryptionMode enum value
	EncryptionModeSseKms = "SSE_KMS"
)

// EncryptionMode_Values returns all elements of the EncryptionMode enum
func EncryptionMode_Values() []string {
	return []string{
		EncryptionModeSseS3,
		EncryptionModeSseKms,
	}
}
