diff --git a/vendor/github.com/aws/aws-sdk-go/aws/endpoints/decode.go b/vendor/github.com/aws/aws-sdk-go/aws/endpoints/decode.go index 74f72de073..6dc035a535 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/endpoints/decode.go +++ b/vendor/github.com/aws/aws-sdk-go/aws/endpoints/decode.go @@ -4,6 +4,7 @@ import ( "encoding/json" "fmt" "io" + "os" "github.com/aws/aws-sdk-go/aws/awserr" ) @@ -84,11 +85,34 @@ func decodeV3Endpoints(modelDef modelDefinition, opts DecodeModelOptions) (Resol custAddEC2Metadata(p) custAddS3DualStack(p) custRmIotDataService(p) + + custFixCloudHSMv2SigningName(p) } return ps, nil } +func custFixCloudHSMv2SigningName(p *partition) { + // Workaround for aws/aws-sdk-go#1745 until the endpoint model can be + // fixed upstream. TODO remove this once the endpoints model is updated. + + s, ok := p.Services["cloudhsmv2"] + if !ok { + return + } + + if len(s.Defaults.CredentialScope.Service) != 0 { + fmt.Fprintf(os.Stderr, "cloudhsmv2 signing name already set, ignoring override.\n") + // If the value is already set don't override + return + } + + s.Defaults.CredentialScope.Service = "cloudhsm" + fmt.Fprintf(os.Stderr, "cloudhsmv2 signing name not set, overriding.\n") + + p.Services["cloudhsmv2"] = s +} + func custAddS3DualStack(p *partition) { if p.ID != "aws" { return diff --git a/vendor/github.com/aws/aws-sdk-go/aws/endpoints/defaults.go b/vendor/github.com/aws/aws-sdk-go/aws/endpoints/defaults.go index 5470a8c080..b2405175ac 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/endpoints/defaults.go +++ b/vendor/github.com/aws/aws-sdk-go/aws/endpoints/defaults.go @@ -52,6 +52,7 @@ const ( Appstream2ServiceID = "appstream2" // Appstream2. AthenaServiceID = "athena" // Athena. AutoscalingServiceID = "autoscaling" // Autoscaling. + AutoscalingPlansServiceID = "autoscaling-plans" // AutoscalingPlans. BatchServiceID = "batch" // Batch. BudgetsServiceID = "budgets" // Budgets. ClouddirectoryServiceID = "clouddirectory" // Clouddirectory. @@ -370,6 +371,22 @@ var awsPartition = partition{ "us-west-2": endpoint{}, }, }, + "autoscaling-plans": service{ + Defaults: endpoint{ + Hostname: "autoscaling.{region}.amazonaws.com", + Protocols: []string{"http", "https"}, + CredentialScope: credentialScope{ + Service: "autoscaling-plans", + }, + }, + Endpoints: endpoints{ + "ap-southeast-1": endpoint{}, + "eu-west-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-2": endpoint{}, + }, + }, "batch": service{ Endpoints: endpoints{ @@ -459,7 +476,11 @@ var awsPartition = partition{ }, }, "cloudhsmv2": service{ - + Defaults: endpoint{ + CredentialScope: credentialScope{ + Service: "cloudhsm", + }, + }, Endpoints: endpoints{ "ap-northeast-1": endpoint{}, "ap-south-1": endpoint{}, @@ -2430,6 +2451,12 @@ var awsusgovPartition = partition{ }, }, }, + "ecs": service{ + + Endpoints: endpoints{ + "us-gov-west-1": endpoint{}, + }, + }, "elasticache": service{ Endpoints: endpoints{ diff --git a/vendor/github.com/aws/aws-sdk-go/aws/request/request_pagination.go b/vendor/github.com/aws/aws-sdk-go/aws/request/request_pagination.go index 59de6736b6..159518a75c 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/request/request_pagination.go +++ b/vendor/github.com/aws/aws-sdk-go/aws/request/request_pagination.go @@ -142,13 +142,28 @@ func (r *Request) nextPageTokens() []interface{} { tokens := []interface{}{} tokenAdded := false for _, outToken := range r.Operation.OutputTokens { - v, _ := awsutil.ValuesAtPath(r.Data, outToken) - if len(v) > 0 { - tokens = append(tokens, v[0]) - tokenAdded = true - } else { + vs, _ := awsutil.ValuesAtPath(r.Data, outToken) + if len(vs) == 0 { tokens = append(tokens, nil) + continue } + v := vs[0] + + switch tv := v.(type) { + case *string: + if len(aws.StringValue(tv)) == 0 { + tokens = append(tokens, nil) + continue + } + case string: + if len(tv) == 0 { + tokens = append(tokens, nil) + continue + } + } + + tokenAdded = true + tokens = append(tokens, v) } if !tokenAdded { return nil diff --git a/vendor/github.com/aws/aws-sdk-go/aws/version.go b/vendor/github.com/aws/aws-sdk-go/aws/version.go index 73ac333a79..f0f5fa2322 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/version.go +++ b/vendor/github.com/aws/aws-sdk-go/aws/version.go @@ -5,4 +5,4 @@ package aws const SDKName = "aws-sdk-go" // SDKVersion is the version of this SDK -const SDKVersion = "1.12.67" +const SDKVersion = "1.12.70" diff --git a/vendor/github.com/aws/aws-sdk-go/service/codebuild/api.go b/vendor/github.com/aws/aws-sdk-go/service/codebuild/api.go index ce54c7c525..3087aecdec 100644 --- a/vendor/github.com/aws/aws-sdk-go/service/codebuild/api.go +++ b/vendor/github.com/aws/aws-sdk-go/service/codebuild/api.go @@ -388,7 +388,7 @@ func (c *CodeBuild) CreateWebhookRequest(input *CreateWebhookInput) (req *reques // AWS CodePipeline. Because billing is on a per-build basis, you will be billed // for both builds. Therefore, if you are using AWS CodePipeline, we recommend // that you disable webhooks in CodeBuild. In the AWS CodeBuild console, clear -// the Webhook box. For more information, see step 9 in Change a Build Project’s +// the Webhook box. For more information, see step 9 in Change a Build Project's // Settings (http://docs.aws.amazon.com/codebuild/latest/userguide/change-project.html#change-project-console). // // Returns awserr.Error for service API and SDK errors. Use runtime type assertions @@ -3430,6 +3430,9 @@ func (s *ProjectCache) SetType(v string) *ProjectCache { type ProjectEnvironment struct { _ struct{} `type:"structure"` + // The certificate to use with this build project. + Certificate *string `locationName:"certificate" type:"string"` + // Information about the compute resources the build project will use. Available // values include: // @@ -3516,6 +3519,12 @@ func (s *ProjectEnvironment) Validate() error { return nil } +// SetCertificate sets the Certificate field's value. +func (s *ProjectEnvironment) SetCertificate(v string) *ProjectEnvironment { + s.Certificate = &v + return s +} + // SetComputeType sets the ComputeType field's value. func (s *ProjectEnvironment) SetComputeType(v string) *ProjectEnvironment { s.ComputeType = &v @@ -3565,6 +3574,13 @@ type ProjectSource struct { // the source code to be built. Buildspec *string `locationName:"buildspec" type:"string"` + // Information about the git clone depth for the build project. + GitCloneDepth *int64 `locationName:"gitCloneDepth" type:"integer"` + + // Enable this flag to ignore SSL warnings while connecting to the project source + // code. + InsecureSsl *bool `locationName:"insecureSsl" type:"boolean"` + // Information about the location of the source code to be built. Valid values // include: // @@ -3665,6 +3681,18 @@ func (s *ProjectSource) SetBuildspec(v string) *ProjectSource { return s } +// SetGitCloneDepth sets the GitCloneDepth field's value. +func (s *ProjectSource) SetGitCloneDepth(v int64) *ProjectSource { + s.GitCloneDepth = &v + return s +} + +// SetInsecureSsl sets the InsecureSsl field's value. +func (s *ProjectSource) SetInsecureSsl(v bool) *ProjectSource { + s.InsecureSsl = &v + return s +} + // SetLocation sets the Location field's value. func (s *ProjectSource) SetLocation(v string) *ProjectSource { s.Location = &v @@ -3748,6 +3776,10 @@ type StartBuildInput struct { // ones already defined in the build project. EnvironmentVariablesOverride []*EnvironmentVariable `locationName:"environmentVariablesOverride" type:"list"` + // The user-defined depth of history, with a minimum value of 0, that overrides, + // for this build only, any previous depth of history defined in the build project. + GitCloneDepthOverride *int64 `locationName:"gitCloneDepthOverride" type:"integer"` + // The name of the build project to start running a build. // // ProjectName is a required field @@ -3841,6 +3873,12 @@ func (s *StartBuildInput) SetEnvironmentVariablesOverride(v []*EnvironmentVariab return s } +// SetGitCloneDepthOverride sets the GitCloneDepthOverride field's value. +func (s *StartBuildInput) SetGitCloneDepthOverride(v int64) *StartBuildInput { + s.GitCloneDepthOverride = &v + return s +} + // SetProjectName sets the ProjectName field's value. func (s *StartBuildInput) SetProjectName(v string) *StartBuildInput { s.ProjectName = &v @@ -4288,6 +4326,14 @@ func (s *VpcConfig) SetVpcId(v string) *VpcConfig { type Webhook struct { _ struct{} `type:"structure"` + // This is the server endpoint that will receive the webhook payload. + PayloadUrl *string `locationName:"payloadUrl" min:"1" type:"string"` + + // Use this secret while creating a webhook in GitHub for Enterprise. The secret + // allows webhook requests sent by GitHub for Enterprise to be authenticated + // by AWS CodeBuild. + Secret *string `locationName:"secret" min:"1" type:"string"` + // The URL to the webhook. Url *string `locationName:"url" min:"1" type:"string"` } @@ -4302,6 +4348,18 @@ func (s Webhook) GoString() string { return s.String() } +// SetPayloadUrl sets the PayloadUrl field's value. +func (s *Webhook) SetPayloadUrl(v string) *Webhook { + s.PayloadUrl = &v + return s +} + +// SetSecret sets the Secret field's value. +func (s *Webhook) SetSecret(v string) *Webhook { + s.Secret = &v + return s +} + // SetUrl sets the Url field's value. func (s *Webhook) SetUrl(v string) *Webhook { s.Url = &v @@ -4478,6 +4536,9 @@ const ( // SourceTypeBitbucket is a SourceType enum value SourceTypeBitbucket = "BITBUCKET" + + // SourceTypeGithubEnterprise is a SourceType enum value + SourceTypeGithubEnterprise = "GITHUB_ENTERPRISE" ) const ( diff --git a/vendor/github.com/aws/aws-sdk-go/service/devicefarm/api.go b/vendor/github.com/aws/aws-sdk-go/service/devicefarm/api.go index c4eeb0a05f..c8cb56ee43 100644 --- a/vendor/github.com/aws/aws-sdk-go/service/devicefarm/api.go +++ b/vendor/github.com/aws/aws-sdk-go/service/devicefarm/api.go @@ -2765,7 +2765,7 @@ func (c *DeviceFarm) ListJobsRequest(input *ListJobsInput) (req *request.Request // ListJobs API operation for AWS Device Farm. // -// Gets information about jobs. +// Gets information about jobs for a given test run. // // 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 @@ -3919,7 +3919,7 @@ func (c *DeviceFarm) ListSuitesRequest(input *ListSuitesInput) (req *request.Req // ListSuites API operation for AWS Device Farm. // -// Gets information about suites. +// Gets information about test suites for a given job. // // 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 @@ -4063,7 +4063,7 @@ func (c *DeviceFarm) ListTestsRequest(input *ListTestsInput) (req *request.Reque // ListTests API operation for AWS Device Farm. // -// Gets information about tests. +// Gets information about tests in a given test suite. // // 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 @@ -5885,7 +5885,7 @@ type CreateRemoteAccessSessionInput struct { // Unique identifier for the client. If you want access to multiple devices // on the same client, you should pass the same clientId value in each call // to CreateRemoteAccessSession. This is required only if remoteDebugEnabled - // is set to true true. + // is set to true. ClientId *string `locationName:"clientId" type:"string"` // The configuration information for the remote access session request. @@ -5897,6 +5897,20 @@ type CreateRemoteAccessSessionInput struct { // DeviceArn is a required field DeviceArn *string `locationName:"deviceArn" min:"32" type:"string" required:"true"` + // The interaction mode of the remote access session. Valid values are: + // + // * INTERACTIVE: You can interact with the iOS device by viewing, touching, + // and rotating the screen. You cannot run XCUITest framework-based tests + // in this mode. + // + // * NO_VIDEO: You are connected to the device but cannot interact with it + // or view the screen. This mode has the fastest test execution speed. You + // can run XCUITest framework-based tests in this mode. + // + // * VIDEO_ONLY: You can view the screen but cannot touch or rotate it. You + // can run XCUITest framework-based tests and watch the screen in this mode. + InteractionMode *string `locationName:"interactionMode" type:"string" enum:"InteractionMode"` + // The name of the remote access session that you wish to create. Name *string `locationName:"name" type:"string"` @@ -5910,6 +5924,13 @@ type CreateRemoteAccessSessionInput struct { // remote access session. RemoteDebugEnabled *bool `locationName:"remoteDebugEnabled" type:"boolean"` + // The Amazon Resource Name (ARN) for the app to be recorded in the remote access + // session. + RemoteRecordAppArn *string `locationName:"remoteRecordAppArn" min:"32" type:"string"` + + // Set to true to enable remote recording for the remote access session. + RemoteRecordEnabled *bool `locationName:"remoteRecordEnabled" type:"boolean"` + // The public key of the ssh key pair you want to use for connecting to remote // devices in your remote debugging session. This is only required if remoteDebugEnabled // is set to true. @@ -5941,6 +5962,9 @@ func (s *CreateRemoteAccessSessionInput) Validate() error { if s.ProjectArn != nil && len(*s.ProjectArn) < 32 { invalidParams.Add(request.NewErrParamMinLen("ProjectArn", 32)) } + if s.RemoteRecordAppArn != nil && len(*s.RemoteRecordAppArn) < 32 { + invalidParams.Add(request.NewErrParamMinLen("RemoteRecordAppArn", 32)) + } if invalidParams.Len() > 0 { return invalidParams @@ -5966,6 +5990,12 @@ func (s *CreateRemoteAccessSessionInput) SetDeviceArn(v string) *CreateRemoteAcc return s } +// SetInteractionMode sets the InteractionMode field's value. +func (s *CreateRemoteAccessSessionInput) SetInteractionMode(v string) *CreateRemoteAccessSessionInput { + s.InteractionMode = &v + return s +} + // SetName sets the Name field's value. func (s *CreateRemoteAccessSessionInput) SetName(v string) *CreateRemoteAccessSessionInput { s.Name = &v @@ -5984,6 +6014,18 @@ func (s *CreateRemoteAccessSessionInput) SetRemoteDebugEnabled(v bool) *CreateRe return s } +// SetRemoteRecordAppArn sets the RemoteRecordAppArn field's value. +func (s *CreateRemoteAccessSessionInput) SetRemoteRecordAppArn(v string) *CreateRemoteAccessSessionInput { + s.RemoteRecordAppArn = &v + return s +} + +// SetRemoteRecordEnabled sets the RemoteRecordEnabled field's value. +func (s *CreateRemoteAccessSessionInput) SetRemoteRecordEnabled(v bool) *CreateRemoteAccessSessionInput { + s.RemoteRecordEnabled = &v + return s +} + // SetSshPublicKey sets the SshPublicKey field's value. func (s *CreateRemoteAccessSessionInput) SetSshPublicKey(v string) *CreateRemoteAccessSessionInput { s.SshPublicKey = &v @@ -6617,6 +6659,9 @@ type Device struct { // The device's model name. Model *string `locationName:"model" type:"string"` + // The device's model ID. + ModelId *string `locationName:"modelId" type:"string"` + // The device's display name. Name *string `locationName:"name" type:"string"` @@ -6721,6 +6766,12 @@ func (s *Device) SetModel(v string) *Device { return s } +// SetModelId sets the ModelId field's value. +func (s *Device) SetModelId(v string) *Device { + s.ModelId = &v + return s +} + // SetName sets the Name field's value. func (s *Device) SetName(v string) *Device { s.Name = &v @@ -8562,7 +8613,7 @@ func (s *ListDevicesOutput) SetNextToken(v string) *ListDevicesOutput { type ListJobsInput struct { _ struct{} `type:"structure"` - // The jobs' ARNs. + // The run's Amazon Resource Name (ARN). // // Arn is a required field Arn *string `locationName:"arn" min:"32" type:"string" required:"true"` @@ -9344,7 +9395,7 @@ func (s *ListSamplesOutput) SetSamples(v []*Sample) *ListSamplesOutput { type ListSuitesInput struct { _ struct{} `type:"structure"` - // The suites' ARNs. + // The job's Amazon Resource Name (ARN). // // Arn is a required field Arn *string `locationName:"arn" min:"32" type:"string" required:"true"` @@ -9436,7 +9487,7 @@ func (s *ListSuitesOutput) SetSuites(v []*Suite) *ListSuitesOutput { type ListTestsInput struct { _ struct{} `type:"structure"` - // The tests' ARNs. + // The test suite's Amazon Resource Name (ARN). // // Arn is a required field Arn *string `locationName:"arn" min:"32" type:"string" required:"true"` @@ -10543,6 +10594,20 @@ type RemoteAccessSession struct { // Only returned if remote debugging is enabled for the remote access session. HostAddress *string `locationName:"hostAddress" type:"string"` + // The interaction mode of the remote access session. Valid values are: + // + // * INTERACTIVE: You can interact with the iOS device by viewing, touching, + // and rotating the screen. You cannot run XCUITest framework-based tests + // in this mode. + // + // * NO_VIDEO: You are connected to the device but cannot interact with it + // or view the screen. This mode has the fastest test execution speed. You + // can run XCUITest framework-based tests in this mode. + // + // * VIDEO_ONLY: You can view the screen but cannot touch or rotate it. You + // can run XCUITest framework-based tests and watch the screen in this mode. + InteractionMode *string `locationName:"interactionMode" type:"string" enum:"InteractionMode"` + // A message about the remote access session. Message *string `locationName:"message" type:"string"` @@ -10553,6 +10618,14 @@ type RemoteAccessSession struct { // session. RemoteDebugEnabled *bool `locationName:"remoteDebugEnabled" type:"boolean"` + // The Amazon Resource Name (ARN) for the app to be recorded in the remote access + // session. + RemoteRecordAppArn *string `locationName:"remoteRecordAppArn" min:"32" type:"string"` + + // This flag is set to true if remote recording is enabled for the remote access + // session. + RemoteRecordEnabled *bool `locationName:"remoteRecordEnabled" type:"boolean"` + // The result of the remote access session. Can be any of the following: // // * PENDING: A pending condition. @@ -10662,6 +10735,12 @@ func (s *RemoteAccessSession) SetHostAddress(v string) *RemoteAccessSession { return s } +// SetInteractionMode sets the InteractionMode field's value. +func (s *RemoteAccessSession) SetInteractionMode(v string) *RemoteAccessSession { + s.InteractionMode = &v + return s +} + // SetMessage sets the Message field's value. func (s *RemoteAccessSession) SetMessage(v string) *RemoteAccessSession { s.Message = &v @@ -10680,6 +10759,18 @@ func (s *RemoteAccessSession) SetRemoteDebugEnabled(v bool) *RemoteAccessSession return s } +// SetRemoteRecordAppArn sets the RemoteRecordAppArn field's value. +func (s *RemoteAccessSession) SetRemoteRecordAppArn(v string) *RemoteAccessSession { + s.RemoteRecordAppArn = &v + return s +} + +// SetRemoteRecordEnabled sets the RemoteRecordEnabled field's value. +func (s *RemoteAccessSession) SetRemoteRecordEnabled(v bool) *RemoteAccessSession { + s.RemoteRecordEnabled = &v + return s +} + // SetResult sets the Result field's value. func (s *RemoteAccessSession) SetResult(v string) *RemoteAccessSession { s.Result = &v @@ -10886,6 +10977,9 @@ func (s *Rule) SetValue(v string) *Rule { type Run struct { _ struct{} `type:"structure"` + // An app to upload or that has been uploaded. + AppUpload *string `locationName:"appUpload" min:"32" type:"string"` + // The run's ARN. Arn *string `locationName:"arn" min:"32" type:"string"` @@ -10908,6 +11002,22 @@ type Run struct { // Represents the total (metered or unmetered) minutes used by the test run. DeviceMinutes *DeviceMinutes `locationName:"deviceMinutes" type:"structure"` + // The ARN of the device pool for the run. + DevicePoolArn *string `locationName:"devicePoolArn" min:"32" type:"string"` + + // For fuzz tests, this is the number of events, between 1 and 10000, that the + // UI fuzz test should perform. + EventCount *int64 `locationName:"eventCount" type:"integer"` + + // The number of minutes the job will execute before it times out. + JobTimeoutMinutes *int64 `locationName:"jobTimeoutMinutes" type:"integer"` + + // Information about the locale that is used for the run. + Locale *string `locationName:"locale" type:"string"` + + // Information about the location that is used for the run. + Location *Location `locationName:"location" type:"structure"` + // A message about the run's result. Message *string `locationName:"message" type:"string"` @@ -10931,6 +11041,9 @@ type Run struct { // * IOS: The iOS platform. Platform *string `locationName:"platform" type:"string" enum:"DevicePlatform"` + // Information about the radio states for the run. + Radios *Radios `locationName:"radios" type:"structure"` + // The run's result. // // Allowed values include: @@ -10954,6 +11067,10 @@ type Run struct { // if the result is skipped because of test package parsing failure. ResultCode *string `locationName:"resultCode" type:"string" enum:"ExecutionResultCode"` + // For fuzz tests, this is a seed to use for randomizing the UI fuzz test. Using + // the same seed value between tests ensures identical event sequences. + Seed *int64 `locationName:"seed" type:"integer"` + // The run's start time. Started *time.Time `locationName:"started" type:"timestamp" timestampFormat:"unix"` @@ -11020,6 +11137,10 @@ type Run struct { // // * XCTEST_UI: The XCode UI test type. Type *string `locationName:"type" type:"string" enum:"TestType"` + + // A pre-signed Amazon S3 URL that can be used with a corresponding GET request + // to download the symbol file for the run. + WebUrl *string `locationName:"webUrl" type:"string"` } // String returns the string representation @@ -11032,6 +11153,12 @@ func (s Run) GoString() string { return s.String() } +// SetAppUpload sets the AppUpload field's value. +func (s *Run) SetAppUpload(v string) *Run { + s.AppUpload = &v + return s +} + // SetArn sets the Arn field's value. func (s *Run) SetArn(v string) *Run { s.Arn = &v @@ -11074,6 +11201,36 @@ func (s *Run) SetDeviceMinutes(v *DeviceMinutes) *Run { return s } +// SetDevicePoolArn sets the DevicePoolArn field's value. +func (s *Run) SetDevicePoolArn(v string) *Run { + s.DevicePoolArn = &v + return s +} + +// SetEventCount sets the EventCount field's value. +func (s *Run) SetEventCount(v int64) *Run { + s.EventCount = &v + return s +} + +// SetJobTimeoutMinutes sets the JobTimeoutMinutes field's value. +func (s *Run) SetJobTimeoutMinutes(v int64) *Run { + s.JobTimeoutMinutes = &v + return s +} + +// SetLocale sets the Locale field's value. +func (s *Run) SetLocale(v string) *Run { + s.Locale = &v + return s +} + +// SetLocation sets the Location field's value. +func (s *Run) SetLocation(v *Location) *Run { + s.Location = v + return s +} + // SetMessage sets the Message field's value. func (s *Run) SetMessage(v string) *Run { s.Message = &v @@ -11104,6 +11261,12 @@ func (s *Run) SetPlatform(v string) *Run { return s } +// SetRadios sets the Radios field's value. +func (s *Run) SetRadios(v *Radios) *Run { + s.Radios = v + return s +} + // SetResult sets the Result field's value. func (s *Run) SetResult(v string) *Run { s.Result = &v @@ -11116,6 +11279,12 @@ func (s *Run) SetResultCode(v string) *Run { return s } +// SetSeed sets the Seed field's value. +func (s *Run) SetSeed(v int64) *Run { + s.Seed = &v + return s +} + // SetStarted sets the Started field's value. func (s *Run) SetStarted(v time.Time) *Run { s.Started = &v @@ -11146,6 +11315,12 @@ func (s *Run) SetType(v string) *Run { return s } +// SetWebUrl sets the WebUrl field's value. +func (s *Run) SetWebUrl(v string) *Run { + s.WebUrl = &v + return s +} + // Represents a sample of performance data. // See also, https://docs.aws.amazon.com/goto/WebAPI/devicefarm-2015-06-23/Sample type Sample struct { @@ -12342,8 +12517,8 @@ func (s *UpdateDevicePoolOutput) SetDevicePool(v *DevicePool) *UpdateDevicePoolO type UpdateNetworkProfileInput struct { _ struct{} `type:"structure"` - // The Amazon Resource Name (ARN) of the project that you wish to update network - // profile settings. + // The Amazon Resource Name (ARN) of the project for which you want to update + // network profile settings. // // Arn is a required field Arn *string `locationName:"arn" min:"32" type:"string" required:"true"` @@ -12954,6 +13129,17 @@ const ( ExecutionStatusStopping = "STOPPING" ) +const ( + // InteractionModeInteractive is a InteractionMode enum value + InteractionModeInteractive = "INTERACTIVE" + + // InteractionModeNoVideo is a InteractionMode enum value + InteractionModeNoVideo = "NO_VIDEO" + + // InteractionModeVideoOnly is a InteractionMode enum value + InteractionModeVideoOnly = "VIDEO_ONLY" +) + const ( // NetworkProfileTypeCurated is a NetworkProfileType enum value NetworkProfileTypeCurated = "CURATED" @@ -13063,6 +13249,9 @@ const ( // TestTypeBuiltinExplorer is a TestType enum value TestTypeBuiltinExplorer = "BUILTIN_EXPLORER" + // TestTypeWebPerformanceProfile is a TestType enum value + TestTypeWebPerformanceProfile = "WEB_PERFORMANCE_PROFILE" + // TestTypeAppiumJavaJunit is a TestType enum value TestTypeAppiumJavaJunit = "APPIUM_JAVA_JUNIT" @@ -13098,6 +13287,12 @@ const ( // TestTypeXctestUi is a TestType enum value TestTypeXctestUi = "XCTEST_UI" + + // TestTypeRemoteAccessRecord is a TestType enum value + TestTypeRemoteAccessRecord = "REMOTE_ACCESS_RECORD" + + // TestTypeRemoteAccessReplay is a TestType enum value + TestTypeRemoteAccessReplay = "REMOTE_ACCESS_REPLAY" ) const ( diff --git a/vendor/github.com/aws/aws-sdk-go/service/guardduty/api.go b/vendor/github.com/aws/aws-sdk-go/service/guardduty/api.go index bd931c9eeb..a7016cf83f 100644 --- a/vendor/github.com/aws/aws-sdk-go/service/guardduty/api.go +++ b/vendor/github.com/aws/aws-sdk-go/service/guardduty/api.go @@ -3475,6 +3475,59 @@ func (s AcceptInvitationOutput) GoString() string { return s.String() } +// The IAM access key details (IAM user information) of a user that engaged +// in the activity that prompted GuardDuty to generate a finding. +// See also, https://docs.aws.amazon.com/goto/WebAPI/guardduty-2017-11-28/AccessKeyDetails +type AccessKeyDetails struct { + _ struct{} `type:"structure"` + + // Access key ID of the user. + AccessKeyId *string `locationName:"accessKeyId" type:"string"` + + // The principal ID of the user. + PrincipalId *string `locationName:"principalId" type:"string"` + + // The name of the user. + UserName *string `locationName:"userName" type:"string"` + + // The type of the user. + UserType *string `locationName:"userType" type:"string"` +} + +// String returns the string representation +func (s AccessKeyDetails) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s AccessKeyDetails) GoString() string { + return s.String() +} + +// SetAccessKeyId sets the AccessKeyId field's value. +func (s *AccessKeyDetails) SetAccessKeyId(v string) *AccessKeyDetails { + s.AccessKeyId = &v + return s +} + +// SetPrincipalId sets the PrincipalId field's value. +func (s *AccessKeyDetails) SetPrincipalId(v string) *AccessKeyDetails { + s.PrincipalId = &v + return s +} + +// SetUserName sets the UserName field's value. +func (s *AccessKeyDetails) SetUserName(v string) *AccessKeyDetails { + s.UserName = &v + return s +} + +// SetUserType sets the UserType field's value. +func (s *AccessKeyDetails) SetUserType(v string) *AccessKeyDetails { + s.UserType = &v + return s +} + // An object containing the member's accountId and email address. // See also, https://docs.aws.amazon.com/goto/WebAPI/guardduty-2017-11-28/AccountDetail type AccountDetail struct { @@ -7028,6 +7081,10 @@ func (s *RemotePortDetails) SetPortName(v string) *RemotePortDetails { type Resource struct { _ struct{} `type:"structure"` + // The IAM access key details (IAM user information) of a user that engaged + // in the activity that prompted GuardDuty to generate a finding. + AccessKeyDetails *AccessKeyDetails `locationName:"accessKeyDetails" type:"structure"` + // The information about the EC2 instance associated with the activity that // prompted GuardDuty to generate a finding. InstanceDetails *InstanceDetails `locationName:"instanceDetails" type:"structure"` @@ -7046,6 +7103,12 @@ func (s Resource) GoString() string { return s.String() } +// SetAccessKeyDetails sets the AccessKeyDetails field's value. +func (s *Resource) SetAccessKeyDetails(v *AccessKeyDetails) *Resource { + s.AccessKeyDetails = v + return s +} + // SetInstanceDetails sets the InstanceDetails field's value. func (s *Resource) SetInstanceDetails(v *InstanceDetails) *Resource { s.InstanceDetails = v diff --git a/vendor/github.com/aws/aws-sdk-go/service/lambda/api.go b/vendor/github.com/aws/aws-sdk-go/service/lambda/api.go index 844e58a49e..38516c2968 100644 --- a/vendor/github.com/aws/aws-sdk-go/service/lambda/api.go +++ b/vendor/github.com/aws/aws-sdk-go/service/lambda/api.go @@ -101,6 +101,11 @@ func (c *Lambda) AddPermissionRequest(input *AddPermissionInput) (req *request.R // // * ErrCodeTooManyRequestsException "TooManyRequestsException" // +// * ErrCodePreconditionFailedException "PreconditionFailedException" +// The RevisionId provided does not match the latest RevisionId for the Lambda +// function or alias. Call the GetFunction or the GetAlias API to retrieve the +// latest RevisionId for your resource. +// // See also, https://docs.aws.amazon.com/goto/WebAPI/lambda-2015-03-31/AddPermission func (c *Lambda) AddPermission(input *AddPermissionInput) (*AddPermissionOutput, error) { req, out := c.AddPermissionRequest(input) @@ -2326,6 +2331,11 @@ func (c *Lambda) PublishVersionRequest(input *PublishVersionInput) (req *request // * ErrCodeCodeStorageExceededException "CodeStorageExceededException" // You have exceeded your maximum total code size per account. Limits (http://docs.aws.amazon.com/lambda/latest/dg/limits.html) // +// * ErrCodePreconditionFailedException "PreconditionFailedException" +// The RevisionId provided does not match the latest RevisionId for the Lambda +// function or alias. Call the GetFunction or the GetAlias API to retrieve the +// latest RevisionId for your resource. +// // See also, https://docs.aws.amazon.com/goto/WebAPI/lambda-2015-03-31/PublishVersion func (c *Lambda) PublishVersion(input *PublishVersionInput) (*FunctionConfiguration, error) { req, out := c.PublishVersionRequest(input) @@ -2525,6 +2535,11 @@ func (c *Lambda) RemovePermissionRequest(input *RemovePermissionInput) (req *req // // * ErrCodeTooManyRequestsException "TooManyRequestsException" // +// * ErrCodePreconditionFailedException "PreconditionFailedException" +// The RevisionId provided does not match the latest RevisionId for the Lambda +// function or alias. Call the GetFunction or the GetAlias API to retrieve the +// latest RevisionId for your resource. +// // See also, https://docs.aws.amazon.com/goto/WebAPI/lambda-2015-03-31/RemovePermission func (c *Lambda) RemovePermission(input *RemovePermissionInput) (*RemovePermissionOutput, error) { req, out := c.RemovePermissionRequest(input) @@ -2806,6 +2821,11 @@ func (c *Lambda) UpdateAliasRequest(input *UpdateAliasInput) (req *request.Reque // // * ErrCodeTooManyRequestsException "TooManyRequestsException" // +// * ErrCodePreconditionFailedException "PreconditionFailedException" +// The RevisionId provided does not match the latest RevisionId for the Lambda +// function or alias. Call the GetFunction or the GetAlias API to retrieve the +// latest RevisionId for your resource. +// // See also, https://docs.aws.amazon.com/goto/WebAPI/lambda-2015-03-31/UpdateAlias func (c *Lambda) UpdateAlias(input *UpdateAliasInput) (*AliasConfiguration, error) { req, out := c.UpdateAliasRequest(input) @@ -3016,6 +3036,11 @@ func (c *Lambda) UpdateFunctionCodeRequest(input *UpdateFunctionCodeInput) (req // * ErrCodeCodeStorageExceededException "CodeStorageExceededException" // You have exceeded your maximum total code size per account. Limits (http://docs.aws.amazon.com/lambda/latest/dg/limits.html) // +// * ErrCodePreconditionFailedException "PreconditionFailedException" +// The RevisionId provided does not match the latest RevisionId for the Lambda +// function or alias. Call the GetFunction or the GetAlias API to retrieve the +// latest RevisionId for your resource. +// // See also, https://docs.aws.amazon.com/goto/WebAPI/lambda-2015-03-31/UpdateFunctionCode func (c *Lambda) UpdateFunctionCode(input *UpdateFunctionCodeInput) (*FunctionConfiguration, error) { req, out := c.UpdateFunctionCodeRequest(input) @@ -3119,6 +3144,11 @@ func (c *Lambda) UpdateFunctionConfigurationRequest(input *UpdateFunctionConfigu // * ErrCodeResourceConflictException "ResourceConflictException" // The resource already exists. // +// * ErrCodePreconditionFailedException "PreconditionFailedException" +// The RevisionId provided does not match the latest RevisionId for the Lambda +// function or alias. Call the GetFunction or the GetAlias API to retrieve the +// latest RevisionId for your resource. +// // See also, https://docs.aws.amazon.com/goto/WebAPI/lambda-2015-03-31/UpdateFunctionConfiguration func (c *Lambda) UpdateFunctionConfiguration(input *UpdateFunctionConfigurationInput) (*FunctionConfiguration, error) { req, out := c.UpdateFunctionConfigurationRequest(input) @@ -3303,6 +3333,13 @@ type AddPermissionInput struct { // arn:aws:lambda:aws-region:acct-id:function:function-name Qualifier *string `location:"querystring" locationName:"Qualifier" min:"1" type:"string"` + // An optional value you can use to ensure you are updating the latest update + // of the function version or alias. If the RevisionID you pass doesn't match + // the latest RevisionId of the function or alias, it will fail with an error + // message, advising you to retrieve the latest function version or alias RevisionID + // using either or . + RevisionId *string `type:"string"` + // This parameter is used for S3 and SES. The AWS account ID (without a hyphen) // of the source owner. For example, if the SourceArn identifies a bucket, then // this is the bucket owner's account ID. You can use this additional condition @@ -3399,6 +3436,12 @@ func (s *AddPermissionInput) SetQualifier(v string) *AddPermissionInput { return s } +// SetRevisionId sets the RevisionId field's value. +func (s *AddPermissionInput) SetRevisionId(v string) *AddPermissionInput { + s.RevisionId = &v + return s +} + // SetSourceAccount sets the SourceAccount field's value. func (s *AddPermissionInput) SetSourceAccount(v string) *AddPermissionInput { s.SourceAccount = &v @@ -3462,6 +3505,9 @@ type AliasConfiguration struct { // Alias name. Name *string `min:"1" type:"string"` + // Represents the latest updated revision of the function or alias. + RevisionId *string `type:"string"` + // Specifies an additional function versions the alias points to, allowing you // to dictate what percentage of traffic will invoke each version. For more // information, see lambda-traffic-shifting-using-aliases. @@ -3502,6 +3548,12 @@ func (s *AliasConfiguration) SetName(v string) *AliasConfiguration { return s } +// SetRevisionId sets the RevisionId field's value. +func (s *AliasConfiguration) SetRevisionId(v string) *AliasConfiguration { + s.RevisionId = &v + return s +} + // SetRoutingConfig sets the RoutingConfig field's value. func (s *AliasConfiguration) SetRoutingConfig(v *AliasRoutingConfiguration) *AliasConfiguration { s.RoutingConfig = v @@ -3833,7 +3885,7 @@ type CreateFunctionInput struct { // Node v0.10.42 is currently marked as deprecated. You must migrate existing // functions to the newer Node.js runtime versions available on AWS Lambda (nodejs4.3 // or nodejs6.10) as soon as possible. Failure to do so will result in an invalid - // parmaeter error being returned. Note that you will have to follow this procedure + // parameter error being returned. Note that you will have to follow this procedure // for each region that contains functions written in the Node v0.10.42 runtime. // // Runtime is a required field @@ -4642,6 +4694,9 @@ type FunctionConfiguration struct { // of 64 MB. MemorySize *int64 `min:"128" type:"integer"` + // Represents the latest updated revision of the function or alias. + RevisionId *string `type:"string"` + // The Amazon Resource Name (ARN) of the IAM role that Lambda assumes when it // executes your function to access any other Amazon Web Services (AWS) resources. Role *string `type:"string"` @@ -4746,6 +4801,12 @@ func (s *FunctionConfiguration) SetMemorySize(v int64) *FunctionConfiguration { return s } +// SetRevisionId sets the RevisionId field's value. +func (s *FunctionConfiguration) SetRevisionId(v string) *FunctionConfiguration { + s.RevisionId = &v + return s +} + // SetRole sets the Role field's value. func (s *FunctionConfiguration) SetRole(v string) *FunctionConfiguration { s.Role = &v @@ -5195,6 +5256,9 @@ type GetPolicyOutput struct { // returns the same as a string using a backslash ("\") as an escape character // in the JSON. Policy *string `type:"string"` + + // Represents the latest updated revision of the function or alias. + RevisionId *string `type:"string"` } // String returns the string representation @@ -5213,6 +5277,12 @@ func (s *GetPolicyOutput) SetPolicy(v string) *GetPolicyOutput { return s } +// SetRevisionId sets the RevisionId field's value. +func (s *GetPolicyOutput) SetRevisionId(v string) *GetPolicyOutput { + s.RevisionId = &v + return s +} + // See also, https://docs.aws.amazon.com/goto/WebAPI/lambda-2015-03-31/InvokeAsyncRequest type InvokeAsyncInput struct { _ struct{} `deprecated:"true" type:"structure" payload:"InvokeArgs"` @@ -6025,6 +6095,13 @@ type PublishVersionInput struct { // // FunctionName is a required field FunctionName *string `location:"uri" locationName:"FunctionName" min:"1" type:"string" required:"true"` + + // An optional value you can use to ensure you are updating the latest update + // of the function version or alias. If the RevisionID you pass doesn't match + // the latest RevisionId of the function or alias, it will fail with an error + // message, advising you to retrieve the latest function version or alias RevisionID + // using either or . + RevisionId *string `type:"string"` } // String returns the string representation @@ -6071,6 +6148,12 @@ func (s *PublishVersionInput) SetFunctionName(v string) *PublishVersionInput { return s } +// SetRevisionId sets the RevisionId field's value. +func (s *PublishVersionInput) SetRevisionId(v string) *PublishVersionInput { + s.RevisionId = &v + return s +} + // See also, https://docs.aws.amazon.com/goto/WebAPI/lambda-2015-03-31/PutFunctionConcurrencyRequest type PutFunctionConcurrencyInput struct { _ struct{} `type:"structure"` @@ -6175,6 +6258,13 @@ type RemovePermissionInput struct { // ARN. Qualifier *string `location:"querystring" locationName:"Qualifier" min:"1" type:"string"` + // An optional value you can use to ensure you are updating the latest update + // of the function version or alias. If the RevisionID you pass doesn't match + // the latest RevisionId of the function or alias, it will fail with an error + // message, advising you to retrieve the latest function version or alias RevisionID + // using either or . + RevisionId *string `location:"querystring" locationName:"RevisionId" type:"string"` + // Statement ID of the permission to remove. // // StatementId is a required field @@ -6228,6 +6318,12 @@ func (s *RemovePermissionInput) SetQualifier(v string) *RemovePermissionInput { return s } +// SetRevisionId sets the RevisionId field's value. +func (s *RemovePermissionInput) SetRevisionId(v string) *RemovePermissionInput { + s.RevisionId = &v + return s +} + // SetStatementId sets the StatementId field's value. func (s *RemovePermissionInput) SetStatementId(v string) *RemovePermissionInput { s.StatementId = &v @@ -6462,6 +6558,13 @@ type UpdateAliasInput struct { // Name is a required field Name *string `location:"uri" locationName:"Name" min:"1" type:"string" required:"true"` + // An optional value you can use to ensure you are updating the latest update + // of the function version or alias. If the RevisionID you pass doesn't match + // the latest RevisionId of the function or alias, it will fail with an error + // message, advising you to retrieve the latest function version or alias RevisionID + // using either or . + RevisionId *string `type:"string"` + // Specifies an additional version your alias can point to, allowing you to // dictate what percentage of traffic will invoke each version. For more information, // see lambda-traffic-shifting-using-aliases. @@ -6527,6 +6630,12 @@ func (s *UpdateAliasInput) SetName(v string) *UpdateAliasInput { return s } +// SetRevisionId sets the RevisionId field's value. +func (s *UpdateAliasInput) SetRevisionId(v string) *UpdateAliasInput { + s.RevisionId = &v + return s +} + // SetRoutingConfig sets the RoutingConfig field's value. func (s *UpdateAliasInput) SetRoutingConfig(v *AliasRoutingConfiguration) *UpdateAliasInput { s.RoutingConfig = v @@ -6648,6 +6757,13 @@ type UpdateFunctionCodeInput struct { // function and publish a version as an atomic operation. Publish *bool `type:"boolean"` + // An optional value you can use to ensure you are updating the latest update + // of the function version or alias. If the RevisionID you pass doesn't match + // the latest RevisionId of the function or alias, it will fail with an error + // message, advising you to retrieve the latest function version or alias RevisionID + // using either or . + RevisionId *string `type:"string"` + // Amazon S3 bucket name where the .zip file containing your deployment package // is stored. This bucket must reside in the same AWS Region where you are creating // the Lambda function. @@ -6723,6 +6839,12 @@ func (s *UpdateFunctionCodeInput) SetPublish(v bool) *UpdateFunctionCodeInput { return s } +// SetRevisionId sets the RevisionId field's value. +func (s *UpdateFunctionCodeInput) SetRevisionId(v string) *UpdateFunctionCodeInput { + s.RevisionId = &v + return s +} + // SetS3Bucket sets the S3Bucket field's value. func (s *UpdateFunctionCodeInput) SetS3Bucket(v string) *UpdateFunctionCodeInput { s.S3Bucket = &v @@ -6790,6 +6912,13 @@ type UpdateFunctionConfigurationInput struct { // MB. MemorySize *int64 `min:"128" type:"integer"` + // An optional value you can use to ensure you are updating the latest update + // of the function version or alias. If the RevisionID you pass doesn't match + // the latest RevisionId of the function or alias, it will fail with an error + // message, advising you to retrieve the latest function version or alias RevisionID + // using either or . + RevisionId *string `type:"string"` + // The Amazon Resource Name (ARN) of the IAM role that Lambda will assume when // it executes your function. Role *string `type:"string"` @@ -6898,6 +7027,12 @@ func (s *UpdateFunctionConfigurationInput) SetMemorySize(v int64) *UpdateFunctio return s } +// SetRevisionId sets the RevisionId field's value. +func (s *UpdateFunctionConfigurationInput) SetRevisionId(v string) *UpdateFunctionConfigurationInput { + s.RevisionId = &v + return s +} + // SetRole sets the Role field's value. func (s *UpdateFunctionConfigurationInput) SetRole(v string) *UpdateFunctionConfigurationInput { s.Role = &v diff --git a/vendor/github.com/aws/aws-sdk-go/service/lambda/errors.go b/vendor/github.com/aws/aws-sdk-go/service/lambda/errors.go index fc6715b5f4..57daa1c34e 100644 --- a/vendor/github.com/aws/aws-sdk-go/service/lambda/errors.go +++ b/vendor/github.com/aws/aws-sdk-go/service/lambda/errors.go @@ -109,6 +109,14 @@ const ( // Lambda function access policy is limited to 20 KB. ErrCodePolicyLengthExceededException = "PolicyLengthExceededException" + // ErrCodePreconditionFailedException for service response error code + // "PreconditionFailedException". + // + // The RevisionId provided does not match the latest RevisionId for the Lambda + // function or alias. Call the GetFunction or the GetAlias API to retrieve the + // latest RevisionId for your resource. + ErrCodePreconditionFailedException = "PreconditionFailedException" + // ErrCodeRequestTooLargeException for service response error code // "RequestTooLargeException". // diff --git a/vendor/github.com/terraform-providers/terraform-provider-aws/CHANGELOG.md b/vendor/github.com/terraform-providers/terraform-provider-aws/CHANGELOG.md index cda4f0e103..be7047e20d 100644 --- a/vendor/github.com/terraform-providers/terraform-provider-aws/CHANGELOG.md +++ b/vendor/github.com/terraform-providers/terraform-provider-aws/CHANGELOG.md @@ -1,34 +1,37 @@ -## 1.8.0 (Unreleased) +## 1.8.0 (January 29, 2018) FEATURES: -* **New Resource:** `aws_dynamodb_global_table` [GH-2517] -* **New Resource:** `aws_gamelift_build` [GH-2843] +* **New Resource:** `aws_dynamodb_global_table` ([#2517](https://github.com/terraform-providers/terraform-provider-aws/issues/2517)) +* **New Resource:** `aws_gamelift_build` ([#2843](https://github.com/terraform-providers/terraform-provider-aws/issues/2843)) ENHANCEMENTS: -* data-source/aws_kms_alias: Add target_key_arn attribute [GH-2551] -* resource/aws_api_gateway_integration: Allow update of content_handling attributes [GH-3123] -* resource/aws_appautoscaling_target: Support updating max_capacity, min_capacity, and role_arn attributes [GH-2950] -* resource/aws_cloudwatch_log_subscription_filter: Add support for distribution [GH-3046] -* resource/aws_cognito_user_pool: support pre_token_generation in lambda_config [GH-3093] -* resource/aws_elasticsearch_domain: Add support for encrypt_at_rest [GH-2632] -* resource/aws_emr_cluster: Support CustomAmiId [GH-2766] -* resource/aws_kms_alias: Add target_key_arn attribute [GH-3096] -* resource/aws_route: Allow adding IPv6 routes to instances and network interfaces [GH-2265] -* resource/aws_sqs_queue: Retry queue creation on QueueDeletedRecently error [GH-3113] -* resource/aws_vpn_connection: Add inside CIDR and pre-shared key attributes [GH-1862] +* provider: `cn-northwest-1` region is now supported ([#3142](https://github.com/terraform-providers/terraform-provider-aws/issues/3142)) +* data-source/aws_kms_alias: Add target_key_arn attribute ([#2551](https://github.com/terraform-providers/terraform-provider-aws/issues/2551)) +* resource/aws_api_gateway_integration: Allow update of content_handling attributes ([#3123](https://github.com/terraform-providers/terraform-provider-aws/issues/3123)) +* resource/aws_appautoscaling_target: Support updating max_capacity, min_capacity, and role_arn attributes ([#2950](https://github.com/terraform-providers/terraform-provider-aws/issues/2950)) +* resource/aws_cloudwatch_log_subscription_filter: Add support for distribution ([#3046](https://github.com/terraform-providers/terraform-provider-aws/issues/3046)) +* resource/aws_cognito_user_pool: support pre_token_generation in lambda_config ([#3093](https://github.com/terraform-providers/terraform-provider-aws/issues/3093)) +* resource/aws_elasticsearch_domain: Add support for encrypt_at_rest ([#2632](https://github.com/terraform-providers/terraform-provider-aws/issues/2632)) +* resource/aws_emr_cluster: Support CustomAmiId ([#2766](https://github.com/terraform-providers/terraform-provider-aws/issues/2766)) +* resource/aws_kms_alias: Add target_key_arn attribute ([#3096](https://github.com/terraform-providers/terraform-provider-aws/issues/3096)) +* resource/aws_route: Allow adding IPv6 routes to instances and network interfaces ([#2265](https://github.com/terraform-providers/terraform-provider-aws/issues/2265)) +* resource/aws_sqs_queue: Retry queue creation on QueueDeletedRecently error ([#3113](https://github.com/terraform-providers/terraform-provider-aws/issues/3113)) +* resource/aws_vpn_connection: Add inside CIDR and pre-shared key attributes ([#1862](https://github.com/terraform-providers/terraform-provider-aws/issues/1862)) BUG FIXES: -* resource/aws_appautoscaling_policy: Support additional predefined metric types in validation [GH-3122] -* resource/aws_ebs_snapshot: Fix `kms_key_id` attribute handling [GH-3085] -* resource/aws_eip_assocation: Retry association for pending instances [GH-3072] -* resource/aws_kinesis_firehose_delivery_stream: Prevent panic on missing S3 configuration prefix [GH-3073] -* resource/aws_lambda_function: Retry updates for IAM eventual consistency [GH-3116] -* resource/aws_route53_record: Suppress uppercase alias name diff [GH-3119] -* resource/aws_sqs_queue_policy: Prevent missing policy error on read [GH-2739] -* resource/aws_rds_cluster: Retry deletion on InvalidDBClusterStateFault [GH-3028] +* resource/aws_appautoscaling_policy: Support additional predefined metric types in validation [[#3122](https://github.com/terraform-providers/terraform-provider-aws/issues/3122)]] +* resource/aws_dynamodb_table: Recognize changes in `non_key_attributes` ([#3136](https://github.com/terraform-providers/terraform-provider-aws/issues/3136)) +* resource/aws_ebs_snapshot: Fix `kms_key_id` attribute handling ([#3085](https://github.com/terraform-providers/terraform-provider-aws/issues/3085)) +* resource/aws_eip_assocation: Retry association for pending instances ([#3072](https://github.com/terraform-providers/terraform-provider-aws/issues/3072)) +* resource/aws_elastic_beanstalk_application: Prevent crash on reading missing application ([#3171](https://github.com/terraform-providers/terraform-provider-aws/issues/3171)) +* resource/aws_kinesis_firehose_delivery_stream: Prevent panic on missing S3 configuration prefix ([#3073](https://github.com/terraform-providers/terraform-provider-aws/issues/3073)) +* resource/aws_lambda_function: Retry updates for IAM eventual consistency ([#3116](https://github.com/terraform-providers/terraform-provider-aws/issues/3116)) +* resource/aws_route53_record: Suppress uppercase alias name diff ([#3119](https://github.com/terraform-providers/terraform-provider-aws/issues/3119)) +* resource/aws_sqs_queue_policy: Prevent missing policy error on read ([#2739](https://github.com/terraform-providers/terraform-provider-aws/issues/2739)) +* resource/aws_rds_cluster: Retry deletion on InvalidDBClusterStateFault ([#3028](https://github.com/terraform-providers/terraform-provider-aws/issues/3028)) ## 1.7.1 (January 19, 2018) diff --git a/vendor/github.com/terraform-providers/terraform-provider-aws/aws/data_source_aws_dynamodb_table.go b/vendor/github.com/terraform-providers/terraform-provider-aws/aws/data_source_aws_dynamodb_table.go index 844bddfb98..1845b7c361 100644 --- a/vendor/github.com/terraform-providers/terraform-provider-aws/aws/data_source_aws_dynamodb_table.go +++ b/vendor/github.com/terraform-providers/terraform-provider-aws/aws/data_source_aws_dynamodb_table.go @@ -3,12 +3,10 @@ package aws import ( "bytes" "fmt" - "log" "strings" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/service/dynamodb" - "github.com/hashicorp/errwrap" "github.com/hashicorp/terraform/helper/hashcode" "github.com/hashicorp/terraform/helper/schema" ) @@ -174,21 +172,41 @@ func dataSourceAwsDynamoDbTable() *schema.Resource { } func dataSourceAwsDynamoDbTableRead(d *schema.ResourceData, meta interface{}) error { - dynamodbconn := meta.(*AWSClient).dynamodbconn + conn := meta.(*AWSClient).dynamodbconn - name := d.Get("name").(string) - req := &dynamodb.DescribeTableInput{ - TableName: aws.String(name), - } - - log.Printf("[DEBUG] Reading DynamoDB Table: %s", req) - result, err := dynamodbconn.DescribeTable(req) + result, err := conn.DescribeTable(&dynamodb.DescribeTableInput{ + TableName: aws.String(d.Get("name").(string)), + }) if err != nil { - return errwrap.Wrapf("Error retrieving DynamoDB table: {{err}}", err) + return fmt.Errorf("Error retrieving DynamoDB table: %s", err) } d.SetId(*result.Table.TableName) - return flattenAwsDynamoDbTableResource(d, meta, result.Table) + err = flattenAwsDynamoDbTableResource(d, result.Table) + if err != nil { + return err + } + + ttlOut, err := conn.DescribeTimeToLive(&dynamodb.DescribeTimeToLiveInput{ + TableName: aws.String(d.Id()), + }) + if err != nil { + return err + } + if ttlOut.TimeToLiveDescription != nil { + err := d.Set("ttl", flattenDynamoDbTtl(ttlOut.TimeToLiveDescription)) + if err != nil { + return err + } + } + + tags, err := readDynamoDbTableTags(d.Get("arn").(string), conn) + if err != nil { + return err + } + d.Set("tags", tags) + + return nil } diff --git a/vendor/github.com/terraform-providers/terraform-provider-aws/aws/resource_aws_dynamodb_table.go b/vendor/github.com/terraform-providers/terraform-provider-aws/aws/resource_aws_dynamodb_table.go index d9b072f88c..a138929a9c 100644 --- a/vendor/github.com/terraform-providers/terraform-provider-aws/aws/resource_aws_dynamodb_table.go +++ b/vendor/github.com/terraform-providers/terraform-provider-aws/aws/resource_aws_dynamodb_table.go @@ -7,28 +7,13 @@ import ( "strings" "time" - "github.com/hashicorp/errwrap" - "github.com/hashicorp/terraform/helper/resource" - "github.com/hashicorp/terraform/helper/schema" - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/awserr" "github.com/aws/aws-sdk-go/service/dynamodb" "github.com/hashicorp/terraform/helper/hashcode" + "github.com/hashicorp/terraform/helper/resource" + "github.com/hashicorp/terraform/helper/schema" ) -// Number of times to retry if a throttling-related exception occurs -const DYNAMODB_MAX_THROTTLE_RETRIES = 5 - -// How long to sleep when a throttle-event happens -const DYNAMODB_THROTTLE_SLEEP = 5 * time.Second - -// How long to sleep if a limit-exceeded event happens -const DYNAMODB_LIMIT_EXCEEDED_SLEEP = 10 * time.Second - -// A number of these are marked as computed because if you don't -// provide a value, DynamoDB will provide you with defaults (which are the -// default values specified below) func resourceAwsDynamoDbTable() *schema.Resource { return &schema.Resource{ Create: resourceAwsDynamoDbTableCreate, @@ -212,498 +197,201 @@ func resourceAwsDynamoDbTable() *schema.Resource { } func resourceAwsDynamoDbTableCreate(d *schema.ResourceData, meta interface{}) error { - dynamodbconn := meta.(*AWSClient).dynamodbconn + conn := meta.(*AWSClient).dynamodbconn - name := d.Get("name").(string) - - log.Printf("[DEBUG] DynamoDB table create: %s", name) - - throughput := &dynamodb.ProvisionedThroughput{ - ReadCapacityUnits: aws.Int64(int64(d.Get("read_capacity").(int))), - WriteCapacityUnits: aws.Int64(int64(d.Get("write_capacity").(int))), + keySchemaMap := map[string]interface{}{ + "hash_key": d.Get("hash_key").(string), + } + if v, ok := d.GetOk("range_key"); ok { + keySchemaMap["range_key"] = v.(string) } - hash_key_name := d.Get("hash_key").(string) - keyschema := []*dynamodb.KeySchemaElement{ - { - AttributeName: aws.String(hash_key_name), - KeyType: aws.String("HASH"), - }, - } - - if range_key, ok := d.GetOk("range_key"); ok { - range_schema_element := &dynamodb.KeySchemaElement{ - AttributeName: aws.String(range_key.(string)), - KeyType: aws.String("RANGE"), - } - keyschema = append(keyschema, range_schema_element) - } + log.Printf("[DEBUG] Creating DynamoDB table with key schema: %#v", keySchemaMap) req := &dynamodb.CreateTableInput{ - TableName: aws.String(name), - ProvisionedThroughput: throughput, - KeySchema: keyschema, + TableName: aws.String(d.Get("name").(string)), + ProvisionedThroughput: expandDynamoDbProvisionedThroughput(map[string]interface{}{ + "read_capacity": d.Get("read_capacity"), + "write_capacity": d.Get("write_capacity"), + }), + KeySchema: expandDynamoDbKeySchema(keySchemaMap), } - if attributedata, ok := d.GetOk("attribute"); ok { - attributes := []*dynamodb.AttributeDefinition{} - attributeSet := attributedata.(*schema.Set) - for _, attribute := range attributeSet.List() { - attr := attribute.(map[string]interface{}) - attributes = append(attributes, &dynamodb.AttributeDefinition{ - AttributeName: aws.String(attr["name"].(string)), - AttributeType: aws.String(attr["type"].(string)), - }) - } - - req.AttributeDefinitions = attributes + if v, ok := d.GetOk("attribute"); ok { + aSet := v.(*schema.Set) + req.AttributeDefinitions = expandDynamoDbAttributes(aSet.List()) } - if lsidata, ok := d.GetOk("local_secondary_index"); ok { - log.Printf("[DEBUG] Adding LSI data to the table") - - lsiSet := lsidata.(*schema.Set) - localSecondaryIndexes := []*dynamodb.LocalSecondaryIndex{} - for _, lsiObject := range lsiSet.List() { - lsi := lsiObject.(map[string]interface{}) - - projection := &dynamodb.Projection{ - ProjectionType: aws.String(lsi["projection_type"].(string)), - } - - if lsi["projection_type"] == "INCLUDE" { - non_key_attributes := []*string{} - for _, attr := range lsi["non_key_attributes"].([]interface{}) { - non_key_attributes = append(non_key_attributes, aws.String(attr.(string))) - } - projection.NonKeyAttributes = non_key_attributes - } - - localSecondaryIndexes = append(localSecondaryIndexes, &dynamodb.LocalSecondaryIndex{ - IndexName: aws.String(lsi["name"].(string)), - KeySchema: []*dynamodb.KeySchemaElement{ - { - AttributeName: aws.String(hash_key_name), - KeyType: aws.String("HASH"), - }, - { - AttributeName: aws.String(lsi["range_key"].(string)), - KeyType: aws.String("RANGE"), - }, - }, - Projection: projection, - }) - } - - req.LocalSecondaryIndexes = localSecondaryIndexes - - log.Printf("[DEBUG] Added %d LSI definitions", len(localSecondaryIndexes)) + if v, ok := d.GetOk("local_secondary_index"); ok { + lsiSet := v.(*schema.Set) + req.LocalSecondaryIndexes = expandDynamoDbLocalSecondaryIndexes(lsiSet.List(), keySchemaMap) } - if gsidata, ok := d.GetOk("global_secondary_index"); ok { + if v, ok := d.GetOk("global_secondary_index"); ok { globalSecondaryIndexes := []*dynamodb.GlobalSecondaryIndex{} - - gsiSet := gsidata.(*schema.Set) + gsiSet := v.(*schema.Set) for _, gsiObject := range gsiSet.List() { gsi := gsiObject.(map[string]interface{}) - gsiObject := createGSIFromData(&gsi) - globalSecondaryIndexes = append(globalSecondaryIndexes, &gsiObject) + gsiObject := expandDynamoDbGlobalSecondaryIndex(gsi) + globalSecondaryIndexes = append(globalSecondaryIndexes, gsiObject) } req.GlobalSecondaryIndexes = globalSecondaryIndexes } - if _, ok := d.GetOk("stream_enabled"); ok { - + if v, ok := d.GetOk("stream_enabled"); ok { req.StreamSpecification = &dynamodb.StreamSpecification{ - StreamEnabled: aws.Bool(d.Get("stream_enabled").(bool)), + StreamEnabled: aws.Bool(v.(bool)), StreamViewType: aws.String(d.Get("stream_view_type").(string)), } - - log.Printf("[DEBUG] Adding StreamSpecifications to the table") } - _, timeToLiveOk := d.GetOk("ttl") - _, tagsOk := d.GetOk("tags") - - attemptCount := 1 - for attemptCount <= DYNAMODB_MAX_THROTTLE_RETRIES { - output, err := dynamodbconn.CreateTable(req) + var output *dynamodb.CreateTableOutput + err := resource.Retry(2*time.Minute, func() *resource.RetryError { + var err error + output, err = conn.CreateTable(req) if err != nil { - if awsErr, ok := err.(awserr.Error); ok { - switch code := awsErr.Code(); code { - case "ThrottlingException": - log.Printf("[DEBUG] Attempt %d/%d: Sleeping for a bit to throttle back create request", attemptCount, DYNAMODB_MAX_THROTTLE_RETRIES) - time.Sleep(DYNAMODB_THROTTLE_SLEEP) - attemptCount += 1 - case "LimitExceededException": - // If we're at resource capacity, error out without retry. e.g. - // Subscriber limit exceeded: There is a limit of 256 tables per subscriber - // Do not error out on this similar throttling message: - // Subscriber limit exceeded: Only 10 tables can be created, updated, or deleted simultaneously - if strings.Contains(awsErr.Message(), "Subscriber limit exceeded:") && !strings.Contains(awsErr.Message(), "can be created, updated, or deleted simultaneously") { - return fmt.Errorf("AWS Error creating DynamoDB table: %s", err) - } - log.Printf("[DEBUG] Limit on concurrent table creations hit, sleeping for a bit") - time.Sleep(DYNAMODB_LIMIT_EXCEEDED_SLEEP) - attemptCount += 1 - default: - // Some other non-retryable exception occurred - return fmt.Errorf("AWS Error creating DynamoDB table: %s", err) - } - } else { - // Non-AWS exception occurred, give up - return fmt.Errorf("Error creating DynamoDB table: %s", err) + if isAWSErr(err, "ThrottlingException", "") { + return resource.RetryableError(err) } - } else { - // No error, set ID and return - d.SetId(*output.TableDescription.TableName) - tableArn := *output.TableDescription.TableArn - if err := d.Set("arn", tableArn); err != nil { - return err + if isAWSErr(err, dynamodb.ErrCodeLimitExceededException, "can be created, updated, or deleted simultaneously") { + return resource.RetryableError(err) + } + if isAWSErr(err, dynamodb.ErrCodeLimitExceededException, "indexed tables that can be created simultaneously") { + return resource.RetryableError(err) } - // Wait, till table is active before imitating any TimeToLive changes - if err := waitForTableToBeActive(d.Id(), meta); err != nil { - log.Printf("[DEBUG] Error waiting for table to be active: %s", err) - return err - } - - log.Printf("[DEBUG] Setting DynamoDB TimeToLive on arn: %s", tableArn) - if timeToLiveOk { - if err := updateTimeToLive(d, meta); err != nil { - log.Printf("[DEBUG] Error updating table TimeToLive: %s", err) - return err - } - } - - if tagsOk { - log.Printf("[DEBUG] Setting DynamoDB Tags on arn: %s", tableArn) - if err := createTableTags(d, meta); err != nil { - return err - } - } - - return resourceAwsDynamoDbTableRead(d, meta) + return resource.NonRetryableError(err) } + return nil + }) + if err != nil { + return err } - // Too many throttling events occurred, give up - return fmt.Errorf("Unable to create DynamoDB table '%s' after %d attempts", name, attemptCount) + d.SetId(*output.TableDescription.TableName) + d.Set("arn", output.TableDescription.TableArn) + + if err := waitForDynamoDbTableToBeActive(d.Id(), 10*time.Minute, conn); err != nil { + return err + } + + return resourceAwsDynamoDbTableUpdate(d, meta) } func resourceAwsDynamoDbTableUpdate(d *schema.ResourceData, meta interface{}) error { + conn := meta.(*AWSClient).dynamodbconn - log.Printf("[DEBUG] Updating DynamoDB table %s", d.Id()) - dynamodbconn := meta.(*AWSClient).dynamodbconn - - // Ensure table is active before trying to update - if err := waitForTableToBeActive(d.Id(), meta); err != nil { - return errwrap.Wrapf("Error waiting for Dynamo DB Table update: {{err}}", err) + // Cannot create or delete index while updating table IOPS + // so we update IOPS separately + if (d.HasChange("read_capacity") || d.HasChange("write_capacity")) && !d.IsNewResource() { + _, err := conn.UpdateTable(&dynamodb.UpdateTableInput{ + TableName: aws.String(d.Id()), + ProvisionedThroughput: expandDynamoDbProvisionedThroughput(map[string]interface{}{ + "read_capacity": d.Get("read_capacity"), + "write_capacity": d.Get("write_capacity"), + }), + }) + if err != nil { + return err + } + if err := waitForDynamoDbTableToBeActive(d.Id(), d.Timeout(schema.TimeoutUpdate), conn); err != nil { + return fmt.Errorf("Error waiting for DynamoDB Table update: %s", err) + } } - if d.HasChange("read_capacity") || d.HasChange("write_capacity") { - req := &dynamodb.UpdateTableInput{ + if (d.HasChange("stream_enabled") || d.HasChange("stream_view_type")) && !d.IsNewResource() { + input := &dynamodb.UpdateTableInput{ TableName: aws.String(d.Id()), + StreamSpecification: &dynamodb.StreamSpecification{ + StreamEnabled: aws.Bool(d.Get("stream_enabled").(bool)), + StreamViewType: aws.String(d.Get("stream_view_type").(string)), + }, } - - throughput := &dynamodb.ProvisionedThroughput{ - ReadCapacityUnits: aws.Int64(int64(d.Get("read_capacity").(int))), - WriteCapacityUnits: aws.Int64(int64(d.Get("write_capacity").(int))), - } - req.ProvisionedThroughput = throughput - - _, err := dynamodbconn.UpdateTable(req) - + _, err := conn.UpdateTable(input) if err != nil { return err } - if err := waitForTableToBeActive(d.Id(), meta); err != nil { - return errwrap.Wrapf("Error waiting for Dynamo DB Table update: {{err}}", err) + if err := waitForDynamoDbTableToBeActive(d.Id(), d.Timeout(schema.TimeoutUpdate), conn); err != nil { + return fmt.Errorf("Error waiting for DynamoDB Table update: %s", err) } } - if d.HasChange("stream_enabled") || d.HasChange("stream_view_type") { - req := &dynamodb.UpdateTableInput{ - TableName: aws.String(d.Id()), - } - - req.StreamSpecification = &dynamodb.StreamSpecification{ - StreamEnabled: aws.Bool(d.Get("stream_enabled").(bool)), - StreamViewType: aws.String(d.Get("stream_view_type").(string)), - } - - _, err := dynamodbconn.UpdateTable(req) - - if err != nil { - return err - } - - if err := waitForTableToBeActive(d.Id(), meta); err != nil { - return errwrap.Wrapf("Error waiting for Dynamo DB Table update: {{err}}", err) - } - } - - if d.HasChange("global_secondary_index") { - log.Printf("[DEBUG] Changed GSI data") - req := &dynamodb.UpdateTableInput{ - TableName: aws.String(d.Id()), + if d.HasChange("global_secondary_index") && !d.IsNewResource() { + var attributes []*dynamodb.AttributeDefinition + if v, ok := d.GetOk("attribute"); ok { + attributes = expandDynamoDbAttributes(v.(*schema.Set).List()) } o, n := d.GetChange("global_secondary_index") + ops, err := diffDynamoDbGSI(o.(*schema.Set).List(), n.(*schema.Set).List()) + if err != nil { + return fmt.Errorf("Computing difference for global_secondary_index failed: %s", err) + } + log.Printf("[DEBUG] Updating global secondary indexes:\n%s", ops) - oldSet := o.(*schema.Set) - newSet := n.(*schema.Set) - - // Track old names so we can know which ones we need to just update based on - // capacity changes, terraform appears to only diff on the set hash, not the - // contents so we need to make sure we don't delete any indexes that we - // just want to update the capacity for - oldGsiNameSet := make(map[string]bool) - newGsiNameSet := make(map[string]bool) - - for _, gsidata := range oldSet.List() { - gsiName := gsidata.(map[string]interface{})["name"].(string) - oldGsiNameSet[gsiName] = true + input := &dynamodb.UpdateTableInput{ + TableName: aws.String(d.Id()), + AttributeDefinitions: attributes, } - for _, gsidata := range newSet.List() { - gsiName := gsidata.(map[string]interface{})["name"].(string) - newGsiNameSet[gsiName] = true - } - - // First determine what's new - for _, newgsidata := range newSet.List() { - updates := []*dynamodb.GlobalSecondaryIndexUpdate{} - newGsiName := newgsidata.(map[string]interface{})["name"].(string) - if _, exists := oldGsiNameSet[newGsiName]; !exists { - attributes := []*dynamodb.AttributeDefinition{} - gsidata := newgsidata.(map[string]interface{}) - gsi := createGSIFromData(&gsidata) - log.Printf("[DEBUG] Adding GSI %s", *gsi.IndexName) - update := &dynamodb.GlobalSecondaryIndexUpdate{ - Create: &dynamodb.CreateGlobalSecondaryIndexAction{ - IndexName: gsi.IndexName, - KeySchema: gsi.KeySchema, - ProvisionedThroughput: gsi.ProvisionedThroughput, - Projection: gsi.Projection, - }, - } - updates = append(updates, update) - - // Hash key is required, range key isn't - hashkey_type, err := getAttributeType(d, *gsi.KeySchema[0].AttributeName) - if err != nil { - return err - } - - attributes = append(attributes, &dynamodb.AttributeDefinition{ - AttributeName: gsi.KeySchema[0].AttributeName, - AttributeType: aws.String(hashkey_type), - }) - - // If there's a range key, there will be 2 elements in KeySchema - if len(gsi.KeySchema) == 2 { - rangekey_type, err := getAttributeType(d, *gsi.KeySchema[1].AttributeName) - if err != nil { - return err - } - - attributes = append(attributes, &dynamodb.AttributeDefinition{ - AttributeName: gsi.KeySchema[1].AttributeName, - AttributeType: aws.String(rangekey_type), - }) - } - - req.AttributeDefinitions = attributes - req.GlobalSecondaryIndexUpdates = updates - _, err = dynamodbconn.UpdateTable(req) - - if err != nil { - return err - } - - if err := waitForTableToBeActive(d.Id(), meta); err != nil { - return errwrap.Wrapf("Error waiting for Dynamo DB Table update: {{err}}", err) - } - - if err := waitForGSIToBeActive(d.Id(), *gsi.IndexName, meta); err != nil { - return errwrap.Wrapf("Error waiting for Dynamo DB GSIT to be active: {{err}}", err) - } - - } - } - - for _, oldgsidata := range oldSet.List() { - updates := []*dynamodb.GlobalSecondaryIndexUpdate{} - oldGsiName := oldgsidata.(map[string]interface{})["name"].(string) - if _, exists := newGsiNameSet[oldGsiName]; !exists { - gsidata := oldgsidata.(map[string]interface{}) - log.Printf("[DEBUG] Deleting GSI %s", gsidata["name"].(string)) - update := &dynamodb.GlobalSecondaryIndexUpdate{ - Delete: &dynamodb.DeleteGlobalSecondaryIndexAction{ - IndexName: aws.String(gsidata["name"].(string)), - }, - } - updates = append(updates, update) - - req.GlobalSecondaryIndexUpdates = updates - _, err := dynamodbconn.UpdateTable(req) - - if err != nil { - return err - } - - if err := waitForTableToBeActive(d.Id(), meta); err != nil { - return errwrap.Wrapf("Error waiting for Dynamo DB Table update: {{err}}", err) - } - } - } - } - - // Update any out-of-date read / write capacity - if gsiObjects, ok := d.GetOk("global_secondary_index"); ok { - gsiSet := gsiObjects.(*schema.Set) - if len(gsiSet.List()) > 0 { - log.Printf("Updating capacity as needed!") - - // We can only change throughput, but we need to make sure it's actually changed - tableDescription, err := dynamodbconn.DescribeTable(&dynamodb.DescribeTableInput{ - TableName: aws.String(d.Id()), - }) - + // Only 1 online index can be created or deleted simultaneously per table + for _, op := range ops { + input.GlobalSecondaryIndexUpdates = []*dynamodb.GlobalSecondaryIndexUpdate{op} + _, err := conn.UpdateTable(input) if err != nil { return err } - - table := tableDescription.Table - - for _, updatedgsidata := range gsiSet.List() { - updates := []*dynamodb.GlobalSecondaryIndexUpdate{} - gsidata := updatedgsidata.(map[string]interface{}) - gsiName := gsidata["name"].(string) - gsiWriteCapacity := gsidata["write_capacity"].(int) - gsiReadCapacity := gsidata["read_capacity"].(int) - - log.Printf("[DEBUG] Updating GSI %s", gsiName) - gsi, err := getGlobalSecondaryIndex(gsiName, table.GlobalSecondaryIndexes) - - if err != nil { - return err + if op.Create != nil { + idxName := *op.Create.IndexName + if err := waitForDynamoDbGSIToBeActive(d.Id(), idxName, conn); err != nil { + return fmt.Errorf("Error waiting for DynamoDB GSI %q to be created: %s", idxName, err) } - - capacityUpdated := false - - if int64(gsiReadCapacity) != *gsi.ProvisionedThroughput.ReadCapacityUnits || - int64(gsiWriteCapacity) != *gsi.ProvisionedThroughput.WriteCapacityUnits { - capacityUpdated = true + } + if op.Update != nil { + idxName := *op.Update.IndexName + if err := waitForDynamoDbGSIToBeActive(d.Id(), idxName, conn); err != nil { + return fmt.Errorf("Error waiting for DynamoDB GSI %q to be updated: %s", idxName, err) } - - if capacityUpdated { - update := &dynamodb.GlobalSecondaryIndexUpdate{ - Update: &dynamodb.UpdateGlobalSecondaryIndexAction{ - IndexName: aws.String(gsidata["name"].(string)), - ProvisionedThroughput: &dynamodb.ProvisionedThroughput{ - WriteCapacityUnits: aws.Int64(int64(gsiWriteCapacity)), - ReadCapacityUnits: aws.Int64(int64(gsiReadCapacity)), - }, - }, - } - updates = append(updates, update) - - } - - if len(updates) > 0 { - - req := &dynamodb.UpdateTableInput{ - TableName: aws.String(d.Id()), - } - - req.GlobalSecondaryIndexUpdates = updates - - log.Printf("[DEBUG] Updating GSI read / write capacity on %s", d.Id()) - _, err := dynamodbconn.UpdateTable(req) - - if err != nil { - log.Printf("[DEBUG] Error updating table: %s", err) - return err - } - - if err := waitForGSIToBeActive(d.Id(), gsiName, meta); err != nil { - return errwrap.Wrapf("Error waiting for Dynamo DB GSI to be active: {{err}}", err) - } + } + if op.Delete != nil { + idxName := *op.Delete.IndexName + if err := waitForDynamoDbGSIToBeDeleted(d.Id(), idxName, conn); err != nil { + return fmt.Errorf("Error waiting for DynamoDB GSI %q to be deleted: %s", idxName, err) } } } + if err := waitForDynamoDbTableToBeActive(d.Id(), d.Timeout(schema.TimeoutUpdate), conn); err != nil { + return fmt.Errorf("Error waiting for DynamoDB Table op: %s", err) + } } if d.HasChange("ttl") { - if err := updateTimeToLive(d, meta); err != nil { + if err := updateDynamoDbTimeToLive(d, conn); err != nil { log.Printf("[DEBUG] Error updating table TimeToLive: %s", err) return err } } - // Update tags - if err := setTagsDynamoDb(dynamodbconn, d); err != nil { - return err + if d.HasChange("tags") { + if err := setTagsDynamoDb(conn, d); err != nil { + return err + } } return resourceAwsDynamoDbTableRead(d, meta) } -func updateTimeToLive(d *schema.ResourceData, meta interface{}) error { - dynamodbconn := meta.(*AWSClient).dynamodbconn - - if ttl, ok := d.GetOk("ttl"); ok { - - timeToLiveSet := ttl.(*schema.Set) - - spec := &dynamodb.TimeToLiveSpecification{} - - timeToLive := timeToLiveSet.List()[0].(map[string]interface{}) - spec.AttributeName = aws.String(timeToLive["attribute_name"].(string)) - spec.Enabled = aws.Bool(timeToLive["enabled"].(bool)) - - req := &dynamodb.UpdateTimeToLiveInput{ - TableName: aws.String(d.Id()), - TimeToLiveSpecification: spec, - } - - _, err := dynamodbconn.UpdateTimeToLive(req) - - if err != nil { - // If ttl was not set within the .tf file before and has now been added we still run this command to update - // But there has been no change so lets continue - if awsErr, ok := err.(awserr.Error); ok && awsErr.Code() == "ValidationException" && awsErr.Message() == "TimeToLive is already disabled" { - return nil - } - log.Printf("[DEBUG] Error updating TimeToLive on table: %s", err) - return err - } - - log.Printf("[DEBUG] Updated TimeToLive on table") - - if err := waitForTimeToLiveUpdateToBeCompleted(d.Id(), timeToLive["enabled"].(bool), meta); err != nil { - return errwrap.Wrapf("Error waiting for Dynamo DB TimeToLive to be updated: {{err}}", err) - } - } - - return nil -} - func resourceAwsDynamoDbTableRead(d *schema.ResourceData, meta interface{}) error { - dynamodbconn := meta.(*AWSClient).dynamodbconn - log.Printf("[DEBUG] Loading data for DynamoDB table '%s'", d.Id()) - req := &dynamodb.DescribeTableInput{ - TableName: aws.String(d.Id()), - } + conn := meta.(*AWSClient).dynamodbconn - result, err := dynamodbconn.DescribeTable(req) + result, err := conn.DescribeTable(&dynamodb.DescribeTableInput{ + TableName: aws.String(d.Id()), + }) if err != nil { - if awsErr, ok := err.(awserr.Error); ok && awsErr.Code() == "ResourceNotFoundException" { + if isAWSErr(err, dynamodb.ErrCodeResourceNotFoundException, "") { log.Printf("[WARN] Dynamodb Table (%s) not found, error code (404)", d.Id()) d.SetId("") return nil @@ -711,444 +399,265 @@ func resourceAwsDynamoDbTableRead(d *schema.ResourceData, meta interface{}) erro return err } - return flattenAwsDynamoDbTableResource(d, meta, result.Table) -} - -func flattenAwsDynamoDbTableResource(d *schema.ResourceData, meta interface{}, table *dynamodb.TableDescription) error { - dynamodbconn := meta.(*AWSClient).dynamodbconn - - d.Set("write_capacity", table.ProvisionedThroughput.WriteCapacityUnits) - d.Set("read_capacity", table.ProvisionedThroughput.ReadCapacityUnits) - - attributes := []interface{}{} - for _, attrdef := range table.AttributeDefinitions { - attribute := map[string]string{ - "name": *attrdef.AttributeName, - "type": *attrdef.AttributeType, - } - attributes = append(attributes, attribute) - log.Printf("[DEBUG] Added Attribute: %s", attribute["name"]) - } - - d.Set("attribute", attributes) - d.Set("name", table.TableName) - - for _, attribute := range table.KeySchema { - if *attribute.KeyType == "HASH" { - d.Set("hash_key", attribute.AttributeName) - } - - if *attribute.KeyType == "RANGE" { - d.Set("range_key", attribute.AttributeName) - } - } - - lsiList := make([]map[string]interface{}, 0, len(table.LocalSecondaryIndexes)) - for _, lsiObject := range table.LocalSecondaryIndexes { - lsi := map[string]interface{}{ - "name": *lsiObject.IndexName, - "projection_type": *lsiObject.Projection.ProjectionType, - } - - for _, attribute := range lsiObject.KeySchema { - - if *attribute.KeyType == "RANGE" { - lsi["range_key"] = *attribute.AttributeName - } - } - nkaList := make([]string, len(lsiObject.Projection.NonKeyAttributes)) - for _, nka := range lsiObject.Projection.NonKeyAttributes { - nkaList = append(nkaList, *nka) - } - lsi["non_key_attributes"] = nkaList - - lsiList = append(lsiList, lsi) - } - - err := d.Set("local_secondary_index", lsiList) + err = flattenAwsDynamoDbTableResource(d, result.Table) if err != nil { return err } - gsiList := make([]map[string]interface{}, 0, len(table.GlobalSecondaryIndexes)) - for _, gsiObject := range table.GlobalSecondaryIndexes { - gsi := map[string]interface{}{ - "write_capacity": *gsiObject.ProvisionedThroughput.WriteCapacityUnits, - "read_capacity": *gsiObject.ProvisionedThroughput.ReadCapacityUnits, - "name": *gsiObject.IndexName, - } - - for _, attribute := range gsiObject.KeySchema { - if *attribute.KeyType == "HASH" { - gsi["hash_key"] = *attribute.AttributeName - } - - if *attribute.KeyType == "RANGE" { - gsi["range_key"] = *attribute.AttributeName - } - } - - gsi["projection_type"] = *(gsiObject.Projection.ProjectionType) - - nonKeyAttrs := make([]string, 0, len(gsiObject.Projection.NonKeyAttributes)) - for _, nonKeyAttr := range gsiObject.Projection.NonKeyAttributes { - nonKeyAttrs = append(nonKeyAttrs, *nonKeyAttr) - } - gsi["non_key_attributes"] = nonKeyAttrs - - gsiList = append(gsiList, gsi) - log.Printf("[DEBUG] Added GSI: %s - Read: %d / Write: %d", gsi["name"], gsi["read_capacity"], gsi["write_capacity"]) - } - - if table.StreamSpecification != nil { - d.Set("stream_view_type", table.StreamSpecification.StreamViewType) - d.Set("stream_enabled", table.StreamSpecification.StreamEnabled) - d.Set("stream_arn", table.LatestStreamArn) - d.Set("stream_label", table.LatestStreamLabel) - } - - err = d.Set("global_secondary_index", gsiList) - if err != nil { - return err - } - - d.Set("arn", table.TableArn) - - timeToLiveReq := &dynamodb.DescribeTimeToLiveInput{ + ttlOut, err := conn.DescribeTimeToLive(&dynamodb.DescribeTimeToLiveInput{ TableName: aws.String(d.Id()), - } - timeToLiveOutput, err := dynamodbconn.DescribeTimeToLive(timeToLiveReq) + }) if err != nil { return err } - - if timeToLiveOutput.TimeToLiveDescription != nil && timeToLiveOutput.TimeToLiveDescription.AttributeName != nil { - timeToLiveList := []interface{}{ - map[string]interface{}{ - "attribute_name": *timeToLiveOutput.TimeToLiveDescription.AttributeName, - "enabled": (*timeToLiveOutput.TimeToLiveDescription.TimeToLiveStatus == dynamodb.TimeToLiveStatusEnabled), - }, - } - err := d.Set("ttl", timeToLiveList) + if ttlOut.TimeToLiveDescription != nil { + err := d.Set("ttl", flattenDynamoDbTtl(ttlOut.TimeToLiveDescription)) if err != nil { return err } - - log.Printf("[DEBUG] Loaded TimeToLive data for DynamoDB table '%s'", d.Id()) } - tags, err := readTableTags(d, meta) + tags, err := readDynamoDbTableTags(d.Get("arn").(string), conn) if err != nil { return err } - if len(tags) != 0 { - d.Set("tags", tags) - } + d.Set("tags", tags) return nil } func resourceAwsDynamoDbTableDelete(d *schema.ResourceData, meta interface{}) error { - dynamodbconn := meta.(*AWSClient).dynamodbconn + conn := meta.(*AWSClient).dynamodbconn log.Printf("[DEBUG] DynamoDB delete table: %s", d.Id()) - err := resource.Retry(d.Timeout(schema.TimeoutDelete), func() *resource.RetryError { - _, err := dynamodbconn.DeleteTable(&dynamodb.DeleteTableInput{ - TableName: aws.String(d.Id()), - }) - if err != nil { - // Table is already deleted - if isAWSErr(err, dynamodb.ErrCodeResourceNotFoundException, "Requested resource not found: Table: ") { - return nil - } - // This logic handles multiple scenarios in the DynamoDB API: - // 1. Updating a table immediately before deletion may return: - // ResourceInUseException: Attempt to change a resource which is still in use: Table is being updated: - // 2. Removing a table from a DynamoDB global table may return: - // ResourceInUseException: Attempt to change a resource which is still in use: Table is being deleted: - if isAWSErr(err, dynamodb.ErrCodeResourceInUseException, "") { - return resource.RetryableError(err) - } - // Unknown error - return resource.NonRetryableError(err) - } - - return nil + _, err := conn.DeleteTable(&dynamodb.DeleteTableInput{ + TableName: aws.String(d.Id()), }) - - // check error from retry if err != nil { + if isAWSErr(err, dynamodb.ErrCodeResourceNotFoundException, "Requested resource not found: Table: ") { + return nil + } return err } - log.Println("[INFO] Waiting for DynamoDB Table to be destroyed") stateConf := &resource.StateChangeConf{ Pending: []string{ dynamodb.TableStatusActive, - dynamodb.TableStatusCreating, dynamodb.TableStatusDeleting, - dynamodb.TableStatusUpdating, }, - Target: []string{}, - Refresh: resourceAwsDynamoDbTableStateRefreshFunc(d, meta), - Timeout: d.Timeout(schema.TimeoutDelete), - MinTimeout: 10 * time.Second, + Target: []string{}, + Timeout: d.Timeout(schema.TimeoutDelete), + Refresh: func() (interface{}, string, error) { + out, err := conn.DescribeTable(&dynamodb.DescribeTableInput{ + TableName: aws.String(d.Id()), + }) + if err != nil { + if isAWSErr(err, dynamodb.ErrCodeResourceNotFoundException, "") { + return nil, "", nil + } + + return 42, "", err + } + table := out.Table + + return table, *table.TableStatus, nil + }, } _, err = stateConf.WaitForState() return err } -func resourceAwsDynamoDbTableRetrieve(d *schema.ResourceData, meta interface{}) (*dynamodb.TableDescription, error) { - dynamodbconn := meta.(*AWSClient).dynamodbconn +func updateDynamoDbTimeToLive(d *schema.ResourceData, conn *dynamodb.DynamoDB) error { + toBeEnabled := false + attributeName := "" - input := &dynamodb.DescribeTableInput{ - TableName: aws.String(d.Id()), + o, n := d.GetChange("ttl") + newTtl, ok := n.(*schema.Set) + blockExists := ok && newTtl.Len() > 0 + + if blockExists { + ttlList := newTtl.List() + ttlMap := ttlList[0].(map[string]interface{}) + attributeName = ttlMap["attribute_name"].(string) + toBeEnabled = ttlMap["enabled"].(bool) + + } else if !d.IsNewResource() { + oldTtlList := o.(*schema.Set).List() + ttlMap := oldTtlList[0].(map[string]interface{}) + attributeName = ttlMap["attribute_name"].(string) + toBeEnabled = false } - log.Printf("[DEBUG] Retrieving DynamoDB Table: %#v", input) - - output, err := dynamodbconn.DescribeTable(input) - if err != nil { - if isAWSErr(err, dynamodb.ErrCodeResourceNotFoundException, "") { - return nil, nil - } - return nil, fmt.Errorf("Error retrieving DynamoDB Table: %s", err) - } - - return output.Table, nil -} - -func resourceAwsDynamoDbTableStateRefreshFunc( - d *schema.ResourceData, meta interface{}) resource.StateRefreshFunc { - return func() (interface{}, string, error) { - td, err := resourceAwsDynamoDbTableRetrieve(d, meta) - + if attributeName != "" { + _, err := conn.UpdateTimeToLive(&dynamodb.UpdateTimeToLiveInput{ + TableName: aws.String(d.Id()), + TimeToLiveSpecification: &dynamodb.TimeToLiveSpecification{ + AttributeName: aws.String(attributeName), + Enabled: aws.Bool(toBeEnabled), + }, + }) if err != nil { - log.Printf("Error on retrieving DynamoDB Table when waiting: %s", err) - return nil, "", err - } - - if td == nil { - return nil, "", nil - } - - if td.TableStatus != nil { - log.Printf("[DEBUG] Status for DynamoDB Table %s: %s", d.Id(), *td.TableStatus) - } - - return td, *td.TableStatus, nil - } -} - -func createGSIFromData(data *map[string]interface{}) dynamodb.GlobalSecondaryIndex { - - projection := &dynamodb.Projection{ - ProjectionType: aws.String((*data)["projection_type"].(string)), - } - - if (*data)["projection_type"] == "INCLUDE" { - non_key_attributes := []*string{} - for _, attr := range (*data)["non_key_attributes"].([]interface{}) { - non_key_attributes = append(non_key_attributes, aws.String(attr.(string))) - } - projection.NonKeyAttributes = non_key_attributes - } - - writeCapacity := (*data)["write_capacity"].(int) - readCapacity := (*data)["read_capacity"].(int) - - key_schema := []*dynamodb.KeySchemaElement{ - { - AttributeName: aws.String((*data)["hash_key"].(string)), - KeyType: aws.String("HASH"), - }, - } - - range_key_name := (*data)["range_key"] - if range_key_name != "" { - range_key_element := &dynamodb.KeySchemaElement{ - AttributeName: aws.String(range_key_name.(string)), - KeyType: aws.String("RANGE"), - } - - key_schema = append(key_schema, range_key_element) - } - - return dynamodb.GlobalSecondaryIndex{ - IndexName: aws.String((*data)["name"].(string)), - KeySchema: key_schema, - Projection: projection, - ProvisionedThroughput: &dynamodb.ProvisionedThroughput{ - WriteCapacityUnits: aws.Int64(int64(writeCapacity)), - ReadCapacityUnits: aws.Int64(int64(readCapacity)), - }, - } -} - -func getGlobalSecondaryIndex(indexName string, indexList []*dynamodb.GlobalSecondaryIndexDescription) (*dynamodb.GlobalSecondaryIndexDescription, error) { - for _, gsi := range indexList { - if *gsi.IndexName == indexName { - return gsi, nil - } - } - - return &dynamodb.GlobalSecondaryIndexDescription{}, fmt.Errorf("Can't find a GSI by that name...") -} - -func getAttributeType(d *schema.ResourceData, attributeName string) (string, error) { - if attributedata, ok := d.GetOk("attribute"); ok { - attributeSet := attributedata.(*schema.Set) - for _, attribute := range attributeSet.List() { - attr := attribute.(map[string]interface{}) - if attr["name"] == attributeName { - return attr["type"].(string), nil + if isAWSErr(err, "ValidationException", "TimeToLive is already disabled") { + return nil } - } - } - - return "", fmt.Errorf("Unable to find an attribute named %s", attributeName) -} - -func waitForGSIToBeActive(tableName string, gsiName string, meta interface{}) error { - dynamodbconn := meta.(*AWSClient).dynamodbconn - req := &dynamodb.DescribeTableInput{ - TableName: aws.String(tableName), - } - - activeIndex := false - - for activeIndex == false { - - result, err := dynamodbconn.DescribeTable(req) - - if err != nil { return err } - table := result.Table - var targetGSI *dynamodb.GlobalSecondaryIndexDescription = nil - - for _, gsi := range table.GlobalSecondaryIndexes { - if *gsi.IndexName == gsiName { - targetGSI = gsi - } - } - - if targetGSI != nil { - activeIndex = *targetGSI.IndexStatus == "ACTIVE" - - if !activeIndex { - log.Printf("[DEBUG] Sleeping for 5 seconds for %s GSI to become active", gsiName) - time.Sleep(5 * time.Second) - } - } else { - log.Printf("[DEBUG] GSI %s did not exist, giving up", gsiName) - break + err = waitForDynamoDbTtlUpdateToBeCompleted(d.Id(), toBeEnabled, conn) + if err != nil { + return fmt.Errorf("Error waiting for DynamoDB TimeToLive to be updated: %s", err) } } return nil - } -func waitForTableToBeActive(tableName string, meta interface{}) error { - dynamodbconn := meta.(*AWSClient).dynamodbconn - req := &dynamodb.DescribeTableInput{ - TableName: aws.String(tableName), - } - - activeState := false - - for activeState == false { - result, err := dynamodbconn.DescribeTable(req) - - if err != nil { - return err - } - - activeState = *result.Table.TableStatus == "ACTIVE" - - // Wait for a few seconds - if !activeState { - log.Printf("[DEBUG] Sleeping for 5 seconds for table to become active") - time.Sleep(5 * time.Second) - } - } - - return nil - -} - -func waitForTimeToLiveUpdateToBeCompleted(tableName string, enabled bool, meta interface{}) error { - dynamodbconn := meta.(*AWSClient).dynamodbconn - req := &dynamodb.DescribeTimeToLiveInput{ - TableName: aws.String(tableName), - } - - stateMatched := false - for stateMatched == false { - result, err := dynamodbconn.DescribeTimeToLive(req) - - if err != nil { - return err - } - - if enabled { - stateMatched = *result.TimeToLiveDescription.TimeToLiveStatus == dynamodb.TimeToLiveStatusEnabled - } else { - stateMatched = *result.TimeToLiveDescription.TimeToLiveStatus == dynamodb.TimeToLiveStatusDisabled - } - - // Wait for a few seconds, this may take a long time... - if !stateMatched { - log.Printf("[DEBUG] Sleeping for 5 seconds before checking TimeToLive state again") - time.Sleep(5 * time.Second) - } - } - - log.Printf("[DEBUG] TimeToLive update complete") - - return nil - -} - -func createTableTags(d *schema.ResourceData, meta interface{}) error { - // DynamoDB Table has to be in the ACTIVE state in order to tag the resource - if err := waitForTableToBeActive(d.Id(), meta); err != nil { - return err - } - tags := d.Get("tags").(map[string]interface{}) - arn := d.Get("arn").(string) - dynamodbconn := meta.(*AWSClient).dynamodbconn - req := &dynamodb.TagResourceInput{ +func readDynamoDbTableTags(arn string, conn *dynamodb.DynamoDB) (map[string]string, error) { + output, err := conn.ListTagsOfResource(&dynamodb.ListTagsOfResourceInput{ ResourceArn: aws.String(arn), - Tags: tagsFromMapDynamoDb(tags), - } - _, err := dynamodbconn.TagResource(req) - if err != nil { - return fmt.Errorf("Error tagging dynamodb resource: %s", err) - } - return nil -} - -func readTableTags(d *schema.ResourceData, meta interface{}) (map[string]string, error) { - if err := waitForTableToBeActive(d.Id(), meta); err != nil { - return nil, err - } - arn := d.Get("arn").(string) - //result := make(map[string]string) - - dynamodbconn := meta.(*AWSClient).dynamodbconn - req := &dynamodb.ListTagsOfResourceInput{ - ResourceArn: aws.String(arn), - } - - output, err := dynamodbconn.ListTagsOfResource(req) + }) if err != nil { return nil, fmt.Errorf("Error reading tags from dynamodb resource: %s", err) } + result := tagsToMapDynamoDb(output.Tags) - // TODO Read NextToken if avail + + // TODO Read NextToken if available + return result, nil } + +// Waiters + +func waitForDynamoDbGSIToBeActive(tableName string, gsiName string, conn *dynamodb.DynamoDB) error { + stateConf := &resource.StateChangeConf{ + Pending: []string{ + dynamodb.IndexStatusCreating, + dynamodb.IndexStatusUpdating, + }, + Target: []string{dynamodb.IndexStatusActive}, + Timeout: 10 * time.Minute, + Refresh: func() (interface{}, string, error) { + result, err := conn.DescribeTable(&dynamodb.DescribeTableInput{ + TableName: aws.String(tableName), + }) + if err != nil { + return 42, "", err + } + + table := result.Table + + // Find index + var targetGSI *dynamodb.GlobalSecondaryIndexDescription + for _, gsi := range table.GlobalSecondaryIndexes { + if *gsi.IndexName == gsiName { + targetGSI = gsi + } + } + + if targetGSI != nil { + return table, *targetGSI.IndexStatus, nil + } + + return nil, "", nil + }, + } + _, err := stateConf.WaitForState() + return err +} + +func waitForDynamoDbGSIToBeDeleted(tableName string, gsiName string, conn *dynamodb.DynamoDB) error { + stateConf := &resource.StateChangeConf{ + Pending: []string{ + dynamodb.IndexStatusActive, + dynamodb.IndexStatusDeleting, + }, + Target: []string{}, + Timeout: 10 * time.Minute, + Refresh: func() (interface{}, string, error) { + result, err := conn.DescribeTable(&dynamodb.DescribeTableInput{ + TableName: aws.String(tableName), + }) + if err != nil { + return 42, "", err + } + + table := result.Table + + // Find index + var targetGSI *dynamodb.GlobalSecondaryIndexDescription + for _, gsi := range table.GlobalSecondaryIndexes { + if *gsi.IndexName == gsiName { + targetGSI = gsi + } + } + + if targetGSI == nil { + return nil, "", nil + } + + return targetGSI, *targetGSI.IndexStatus, nil + }, + } + _, err := stateConf.WaitForState() + return err +} + +func waitForDynamoDbTableToBeActive(tableName string, timeout time.Duration, conn *dynamodb.DynamoDB) error { + stateConf := &resource.StateChangeConf{ + Pending: []string{dynamodb.TableStatusCreating, dynamodb.TableStatusUpdating}, + Target: []string{dynamodb.TableStatusActive}, + Timeout: timeout, + Refresh: func() (interface{}, string, error) { + result, err := conn.DescribeTable(&dynamodb.DescribeTableInput{ + TableName: aws.String(tableName), + }) + if err != nil { + return 42, "", err + } + + return result, *result.Table.TableStatus, nil + }, + } + _, err := stateConf.WaitForState() + + return err +} + +func waitForDynamoDbTtlUpdateToBeCompleted(tableName string, toEnable bool, conn *dynamodb.DynamoDB) error { + pending := []string{ + dynamodb.TimeToLiveStatusEnabled, + dynamodb.TimeToLiveStatusDisabling, + } + target := []string{dynamodb.TimeToLiveStatusDisabled} + + if toEnable { + pending = []string{ + dynamodb.TimeToLiveStatusDisabled, + dynamodb.TimeToLiveStatusEnabling, + } + target = []string{dynamodb.TimeToLiveStatusEnabled} + } + + stateConf := &resource.StateChangeConf{ + Pending: pending, + Target: target, + Timeout: 10 * time.Second, + Refresh: func() (interface{}, string, error) { + result, err := conn.DescribeTimeToLive(&dynamodb.DescribeTimeToLiveInput{ + TableName: aws.String(tableName), + }) + if err != nil { + return 42, "", err + } + + ttlDesc := result.TimeToLiveDescription + + return result, *ttlDesc.TimeToLiveStatus, nil + }, + } + + _, err := stateConf.WaitForState() + return err +} diff --git a/vendor/github.com/terraform-providers/terraform-provider-aws/aws/resource_aws_elastic_beanstalk_application.go b/vendor/github.com/terraform-providers/terraform-provider-aws/aws/resource_aws_elastic_beanstalk_application.go index cbc589db83..fdb6c199b3 100644 --- a/vendor/github.com/terraform-providers/terraform-provider-aws/aws/resource_aws_elastic_beanstalk_application.go +++ b/vendor/github.com/terraform-providers/terraform-provider-aws/aws/resource_aws_elastic_beanstalk_application.go @@ -99,14 +99,20 @@ func resourceAwsElasticBeanstalkApplicationRead(d *schema.ResourceData, meta int } if app == nil { + err = fmt.Errorf("Elastic Beanstalk Application %q not found", d.Id()) if d.IsNewResource() { - return resource.RetryableError(fmt.Errorf("Elastic Beanstalk Application %q not found.", d.Id())) + return resource.RetryableError(err) } return resource.NonRetryableError(err) } return nil }) if err != nil { + if app == nil { + log.Printf("[WARN] %s, removing from state", err) + d.SetId("") + return nil + } return err } diff --git a/vendor/github.com/terraform-providers/terraform-provider-aws/aws/structure.go b/vendor/github.com/terraform-providers/terraform-provider-aws/aws/structure.go index bc99f8bed6..239d0bdc76 100644 --- a/vendor/github.com/terraform-providers/terraform-provider-aws/aws/structure.go +++ b/vendor/github.com/terraform-providers/terraform-provider-aws/aws/structure.go @@ -19,6 +19,7 @@ import ( "github.com/aws/aws-sdk-go/service/cognitoidentityprovider" "github.com/aws/aws-sdk-go/service/configservice" "github.com/aws/aws-sdk-go/service/directoryservice" + "github.com/aws/aws-sdk-go/service/dynamodb" "github.com/aws/aws-sdk-go/service/ec2" "github.com/aws/aws-sdk-go/service/ecs" "github.com/aws/aws-sdk-go/service/elasticache" @@ -36,6 +37,7 @@ import ( "github.com/beevik/etree" "github.com/hashicorp/terraform/helper/schema" "github.com/hashicorp/terraform/helper/structure" + "github.com/mitchellh/copystructure" "gopkg.in/yaml.v2" ) @@ -3074,3 +3076,310 @@ func flattenMqBrokerInstances(instances []*mq.BrokerInstance) []interface{} { return l } + +func diffDynamoDbGSI(oldGsi, newGsi []interface{}) (ops []*dynamodb.GlobalSecondaryIndexUpdate, e error) { + // Transform slices into maps + oldGsis := make(map[string]interface{}) + for _, gsidata := range oldGsi { + m := gsidata.(map[string]interface{}) + oldGsis[m["name"].(string)] = m + } + newGsis := make(map[string]interface{}) + for _, gsidata := range newGsi { + m := gsidata.(map[string]interface{}) + newGsis[m["name"].(string)] = m + } + + for _, data := range newGsi { + newMap := data.(map[string]interface{}) + newName := newMap["name"].(string) + + if _, exists := oldGsis[newName]; !exists { + m := data.(map[string]interface{}) + idxName := m["name"].(string) + + ops = append(ops, &dynamodb.GlobalSecondaryIndexUpdate{ + Create: &dynamodb.CreateGlobalSecondaryIndexAction{ + IndexName: aws.String(idxName), + KeySchema: expandDynamoDbKeySchema(m), + ProvisionedThroughput: expandDynamoDbProvisionedThroughput(m), + Projection: expandDynamoDbProjection(m), + }, + }) + } + } + + for _, data := range oldGsi { + oldMap := data.(map[string]interface{}) + oldName := oldMap["name"].(string) + + newData, exists := newGsis[oldName] + if exists { + newMap := newData.(map[string]interface{}) + idxName := newMap["name"].(string) + + oldWriteCapacity, oldReadCapacity := oldMap["write_capacity"].(int), oldMap["read_capacity"].(int) + newWriteCapacity, newReadCapacity := newMap["write_capacity"].(int), newMap["read_capacity"].(int) + capacityChanged := (oldWriteCapacity != newWriteCapacity || oldReadCapacity != newReadCapacity) + + oldAttributes, err := stripCapacityAttributes(oldMap) + if err != nil { + e = err + return + } + newAttributes, err := stripCapacityAttributes(newMap) + if err != nil { + e = err + return + } + otherAttributesChanged := !reflect.DeepEqual(oldAttributes, newAttributes) + + if capacityChanged && !otherAttributesChanged { + update := &dynamodb.GlobalSecondaryIndexUpdate{ + Update: &dynamodb.UpdateGlobalSecondaryIndexAction{ + IndexName: aws.String(idxName), + ProvisionedThroughput: expandDynamoDbProvisionedThroughput(newMap), + }, + } + ops = append(ops, update) + } else if otherAttributesChanged { + // Other attributes cannot be updated + ops = append(ops, &dynamodb.GlobalSecondaryIndexUpdate{ + Delete: &dynamodb.DeleteGlobalSecondaryIndexAction{ + IndexName: aws.String(idxName), + }, + }) + + ops = append(ops, &dynamodb.GlobalSecondaryIndexUpdate{ + Create: &dynamodb.CreateGlobalSecondaryIndexAction{ + IndexName: aws.String(idxName), + KeySchema: expandDynamoDbKeySchema(newMap), + ProvisionedThroughput: expandDynamoDbProvisionedThroughput(newMap), + Projection: expandDynamoDbProjection(newMap), + }, + }) + } + } else { + idxName := oldName + ops = append(ops, &dynamodb.GlobalSecondaryIndexUpdate{ + Delete: &dynamodb.DeleteGlobalSecondaryIndexAction{ + IndexName: aws.String(idxName), + }, + }) + } + } + return +} + +func stripCapacityAttributes(in map[string]interface{}) (map[string]interface{}, error) { + mapCopy, err := copystructure.Copy(in) + if err != nil { + return nil, err + } + + m := mapCopy.(map[string]interface{}) + + delete(m, "write_capacity") + delete(m, "read_capacity") + + return m, nil +} + +// Expanders + flatteners + +func flattenDynamoDbTtl(ttlDesc *dynamodb.TimeToLiveDescription) []interface{} { + m := map[string]interface{}{} + if ttlDesc.AttributeName != nil { + m["attribute_name"] = *ttlDesc.AttributeName + if ttlDesc.TimeToLiveStatus != nil { + m["enabled"] = (*ttlDesc.TimeToLiveStatus == dynamodb.TimeToLiveStatusEnabled) + } + } + if len(m) > 0 { + return []interface{}{m} + } + + return []interface{}{} +} + +func flattenAwsDynamoDbTableResource(d *schema.ResourceData, table *dynamodb.TableDescription) error { + d.Set("write_capacity", table.ProvisionedThroughput.WriteCapacityUnits) + d.Set("read_capacity", table.ProvisionedThroughput.ReadCapacityUnits) + + attributes := []interface{}{} + for _, attrdef := range table.AttributeDefinitions { + attribute := map[string]string{ + "name": *attrdef.AttributeName, + "type": *attrdef.AttributeType, + } + attributes = append(attributes, attribute) + } + + d.Set("attribute", attributes) + d.Set("name", table.TableName) + + for _, attribute := range table.KeySchema { + if *attribute.KeyType == dynamodb.KeyTypeHash { + d.Set("hash_key", attribute.AttributeName) + } + + if *attribute.KeyType == dynamodb.KeyTypeRange { + d.Set("range_key", attribute.AttributeName) + } + } + + lsiList := make([]map[string]interface{}, 0, len(table.LocalSecondaryIndexes)) + for _, lsiObject := range table.LocalSecondaryIndexes { + lsi := map[string]interface{}{ + "name": *lsiObject.IndexName, + "projection_type": *lsiObject.Projection.ProjectionType, + } + + for _, attribute := range lsiObject.KeySchema { + + if *attribute.KeyType == dynamodb.KeyTypeRange { + lsi["range_key"] = *attribute.AttributeName + } + } + nkaList := make([]string, len(lsiObject.Projection.NonKeyAttributes)) + for _, nka := range lsiObject.Projection.NonKeyAttributes { + nkaList = append(nkaList, *nka) + } + lsi["non_key_attributes"] = nkaList + + lsiList = append(lsiList, lsi) + } + + err := d.Set("local_secondary_index", lsiList) + if err != nil { + return err + } + + gsiList := make([]map[string]interface{}, 0, len(table.GlobalSecondaryIndexes)) + for _, gsiObject := range table.GlobalSecondaryIndexes { + gsi := map[string]interface{}{ + "write_capacity": *gsiObject.ProvisionedThroughput.WriteCapacityUnits, + "read_capacity": *gsiObject.ProvisionedThroughput.ReadCapacityUnits, + "name": *gsiObject.IndexName, + } + + for _, attribute := range gsiObject.KeySchema { + if *attribute.KeyType == dynamodb.KeyTypeHash { + gsi["hash_key"] = *attribute.AttributeName + } + + if *attribute.KeyType == dynamodb.KeyTypeRange { + gsi["range_key"] = *attribute.AttributeName + } + } + + gsi["projection_type"] = *(gsiObject.Projection.ProjectionType) + + nonKeyAttrs := make([]string, 0, len(gsiObject.Projection.NonKeyAttributes)) + for _, nonKeyAttr := range gsiObject.Projection.NonKeyAttributes { + nonKeyAttrs = append(nonKeyAttrs, *nonKeyAttr) + } + gsi["non_key_attributes"] = nonKeyAttrs + + gsiList = append(gsiList, gsi) + } + + if table.StreamSpecification != nil { + d.Set("stream_view_type", table.StreamSpecification.StreamViewType) + d.Set("stream_enabled", table.StreamSpecification.StreamEnabled) + d.Set("stream_arn", table.LatestStreamArn) + d.Set("stream_label", table.LatestStreamLabel) + } + + err = d.Set("global_secondary_index", gsiList) + if err != nil { + return err + } + + d.Set("arn", table.TableArn) + + return nil +} + +func expandDynamoDbAttributes(cfg []interface{}) []*dynamodb.AttributeDefinition { + attributes := make([]*dynamodb.AttributeDefinition, len(cfg), len(cfg)) + for i, attribute := range cfg { + attr := attribute.(map[string]interface{}) + attributes[i] = &dynamodb.AttributeDefinition{ + AttributeName: aws.String(attr["name"].(string)), + AttributeType: aws.String(attr["type"].(string)), + } + } + return attributes +} + +// TODO: Get rid of keySchemaM - the user should just explicitely define +// this in the config, we shouldn't magically be setting it like this. +// Removal will however require config change, hence BC. :/ +func expandDynamoDbLocalSecondaryIndexes(cfg []interface{}, keySchemaM map[string]interface{}) []*dynamodb.LocalSecondaryIndex { + indexes := make([]*dynamodb.LocalSecondaryIndex, len(cfg), len(cfg)) + for i, lsi := range cfg { + m := lsi.(map[string]interface{}) + idxName := m["name"].(string) + + // TODO: See https://github.com/terraform-providers/terraform-provider-aws/issues/3176 + if _, ok := m["hash_key"]; !ok { + m["hash_key"] = keySchemaM["hash_key"] + } + + indexes[i] = &dynamodb.LocalSecondaryIndex{ + IndexName: aws.String(idxName), + KeySchema: expandDynamoDbKeySchema(m), + Projection: expandDynamoDbProjection(m), + } + } + return indexes +} + +func expandDynamoDbGlobalSecondaryIndex(data map[string]interface{}) *dynamodb.GlobalSecondaryIndex { + return &dynamodb.GlobalSecondaryIndex{ + IndexName: aws.String(data["name"].(string)), + KeySchema: expandDynamoDbKeySchema(data), + Projection: expandDynamoDbProjection(data), + ProvisionedThroughput: expandDynamoDbProvisionedThroughput(data), + } +} + +func expandDynamoDbProvisionedThroughput(data map[string]interface{}) *dynamodb.ProvisionedThroughput { + return &dynamodb.ProvisionedThroughput{ + WriteCapacityUnits: aws.Int64(int64(data["write_capacity"].(int))), + ReadCapacityUnits: aws.Int64(int64(data["read_capacity"].(int))), + } +} + +func expandDynamoDbProjection(data map[string]interface{}) *dynamodb.Projection { + projection := &dynamodb.Projection{ + ProjectionType: aws.String(data["projection_type"].(string)), + } + + if v, ok := data["non_key_attributes"].([]interface{}); ok && len(v) > 0 { + projection.NonKeyAttributes = expandStringList(v) + } + + return projection +} + +func expandDynamoDbKeySchema(data map[string]interface{}) []*dynamodb.KeySchemaElement { + keySchema := []*dynamodb.KeySchemaElement{} + + if v, ok := data["hash_key"]; ok && v != nil && v != "" { + keySchema = append(keySchema, &dynamodb.KeySchemaElement{ + AttributeName: aws.String(v.(string)), + KeyType: aws.String(dynamodb.KeyTypeHash), + }) + } + + if v, ok := data["range_key"]; ok && v != nil && v != "" { + keySchema = append(keySchema, &dynamodb.KeySchemaElement{ + AttributeName: aws.String(v.(string)), + KeyType: aws.String(dynamodb.KeyTypeRange), + }) + } + + return keySchema +} diff --git a/vendor/github.com/terraform-providers/terraform-provider-aws/aws/tags.go b/vendor/github.com/terraform-providers/terraform-provider-aws/aws/tags.go index 46438c0fd4..7a4bfdef17 100644 --- a/vendor/github.com/terraform-providers/terraform-provider-aws/aws/tags.go +++ b/vendor/github.com/terraform-providers/terraform-provider-aws/aws/tags.go @@ -333,53 +333,49 @@ func tagsFromMapDynamoDb(m map[string]interface{}) []*dynamodb.Tag { // method from the ec2 tag resource handling. Also the `UntagResource` method // for dynamoDB only requires a list of tag keys, instead of the full map of keys. func setTagsDynamoDb(conn *dynamodb.DynamoDB, d *schema.ResourceData) error { - if d.HasChange("tags") { - arn := d.Get("arn").(string) - oraw, nraw := d.GetChange("tags") - o := oraw.(map[string]interface{}) - n := nraw.(map[string]interface{}) - create, remove := diffTagsDynamoDb(tagsFromMapDynamoDb(o), tagsFromMapDynamoDb(n)) + arn := d.Get("arn").(string) + oraw, nraw := d.GetChange("tags") + o := oraw.(map[string]interface{}) + n := nraw.(map[string]interface{}) + create, remove := diffTagsDynamoDb(tagsFromMapDynamoDb(o), tagsFromMapDynamoDb(n)) - // Set tags - if len(remove) > 0 { - err := resource.Retry(2*time.Minute, func() *resource.RetryError { - log.Printf("[DEBUG] Removing tags: %#v from %s", remove, d.Id()) - _, err := conn.UntagResource(&dynamodb.UntagResourceInput{ - ResourceArn: aws.String(arn), - TagKeys: remove, - }) - if err != nil { - ec2err, ok := err.(awserr.Error) - if ok && strings.Contains(ec2err.Code(), "ResourceNotFoundException") { - return resource.RetryableError(err) // retry - } - return resource.NonRetryableError(err) - } - return nil + // Set tags + if len(remove) > 0 { + err := resource.Retry(2*time.Minute, func() *resource.RetryError { + log.Printf("[DEBUG] Removing tags: %#v from %s", remove, d.Id()) + _, err := conn.UntagResource(&dynamodb.UntagResourceInput{ + ResourceArn: aws.String(arn), + TagKeys: remove, }) if err != nil { - return err + if isAWSErr(err, dynamodb.ErrCodeResourceNotFoundException, "") { + return resource.RetryableError(err) + } + return resource.NonRetryableError(err) } + return nil + }) + if err != nil { + return err } - if len(create) > 0 { - err := resource.Retry(2*time.Minute, func() *resource.RetryError { - log.Printf("[DEBUG] Creating tags: %s for %s", create, d.Id()) - _, err := conn.TagResource(&dynamodb.TagResourceInput{ - ResourceArn: aws.String(arn), - Tags: create, - }) - if err != nil { - ec2err, ok := err.(awserr.Error) - if ok && strings.Contains(ec2err.Code(), "ResourceNotFoundException") { - return resource.RetryableError(err) // retry - } - return resource.NonRetryableError(err) - } - return nil + } + if len(create) > 0 { + err := resource.Retry(2*time.Minute, func() *resource.RetryError { + log.Printf("[DEBUG] Creating tags: %s for %s", create, d.Id()) + _, err := conn.TagResource(&dynamodb.TagResourceInput{ + ResourceArn: aws.String(arn), + Tags: create, }) if err != nil { - return err + if isAWSErr(err, dynamodb.ErrCodeResourceNotFoundException, "") { + return resource.RetryableError(err) + } + return resource.NonRetryableError(err) } + return nil + }) + if err != nil { + return err } } diff --git a/vendor/vendor.json b/vendor/vendor.json index 9b0aea9468..2eba9d914a 100644 --- a/vendor/vendor.json +++ b/vendor/vendor.json @@ -261,756 +261,756 @@ "revisionTime": "2016-01-15T23:47:25Z" }, { - "checksumSHA1": "TkqQVOUcbByOjPqzB+PIF6YIqms=", + "checksumSHA1": "3qbWQO79tzfxr3IXc5P/l0XbVaI=", "path": "github.com/aws/aws-sdk-go/aws", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "DtuTqKH29YnLjrIJkRYX0HQtXY0=", "path": "github.com/aws/aws-sdk-go/aws/arn", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "Y9W+4GimK4Fuxq+vyIskVYFRnX4=", "path": "github.com/aws/aws-sdk-go/aws/awserr", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "yyYr41HZ1Aq0hWc3J5ijXwYEcac=", "path": "github.com/aws/aws-sdk-go/aws/awsutil", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "9nE/FjZ4pYrT883KtV2/aI+Gayo=", "path": "github.com/aws/aws-sdk-go/aws/client", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "ieAJ+Cvp/PKv1LpUEnUXpc3OI6E=", "path": "github.com/aws/aws-sdk-go/aws/client/metadata", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "7/8j/q0TWtOgXyvEcv4B2Dhl00o=", "path": "github.com/aws/aws-sdk-go/aws/corehandlers", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "Y+cPwQL0dZMyqp3wI+KJWmA9KQ8=", "path": "github.com/aws/aws-sdk-go/aws/credentials", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "u3GOAJLmdvbuNUeUEcZSEAOeL/0=", "path": "github.com/aws/aws-sdk-go/aws/credentials/ec2rolecreds", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "NUJUTWlc1sV8b7WjfiYc4JZbXl0=", "path": "github.com/aws/aws-sdk-go/aws/credentials/endpointcreds", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "JEYqmF83O5n5bHkupAzA6STm0no=", "path": "github.com/aws/aws-sdk-go/aws/credentials/stscreds", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "OnU/n7R33oYXiB4SAGd5pK7I0Bs=", "path": "github.com/aws/aws-sdk-go/aws/defaults", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "/EXbk/z2TWjWc1Hvb4QYs3Wmhb8=", "path": "github.com/aws/aws-sdk-go/aws/ec2metadata", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { - "checksumSHA1": "Mrcwi2Jpvn055JXS+sk5jfCn3CY=", + "checksumSHA1": "QzwFDjKBl8XUPtQ3Sgd7+rRestk=", "path": "github.com/aws/aws-sdk-go/aws/endpoints", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { - "checksumSHA1": "9GvAyILJ7g+VUg8Ef5DsT5GuYsg=", + "checksumSHA1": "657ICMok3uC5dm5e9bKcVF2HaxE=", "path": "github.com/aws/aws-sdk-go/aws/request", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "HcGL4e6Uep4/80eCUI5xkcWjpQ0=", "path": "github.com/aws/aws-sdk-go/aws/session", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "iU00ZjhAml/13g+1YXT21IqoXqg=", "path": "github.com/aws/aws-sdk-go/aws/signer/v4", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "04ypv4x12l4q0TksA1zEVsmgpvw=", "path": "github.com/aws/aws-sdk-go/internal/shareddefaults", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "NStHCXEvYqG72GknZyv1jaKaeH0=", "path": "github.com/aws/aws-sdk-go/private/protocol", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "1QmQ3FqV37w0Zi44qv8pA1GeR0A=", "path": "github.com/aws/aws-sdk-go/private/protocol/ec2query", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "yHfT5DTbeCLs4NE2Rgnqrhe15ls=", "path": "github.com/aws/aws-sdk-go/private/protocol/json/jsonutil", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "R00RL5jJXRYq1iiK1+PGvMfvXyM=", "path": "github.com/aws/aws-sdk-go/private/protocol/jsonrpc", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "ZqY5RWavBLWTo6j9xqdyBEaNFRk=", "path": "github.com/aws/aws-sdk-go/private/protocol/query", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "9V1PvtFQ9MObZTc3sa86WcuOtOU=", "path": "github.com/aws/aws-sdk-go/private/protocol/query/queryutil", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "pkeoOfZpHRvFG/AOZeTf0lwtsFg=", "path": "github.com/aws/aws-sdk-go/private/protocol/rest", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "Rpu8KBtHZgvhkwHxUfaky+qW+G4=", "path": "github.com/aws/aws-sdk-go/private/protocol/restjson", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "ODo+ko8D6unAxZuN1jGzMcN4QCc=", "path": "github.com/aws/aws-sdk-go/private/protocol/restxml", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "0qYPUga28aQVkxZgBR3Z86AbGUQ=", "path": "github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "F6mth+G7dXN1GI+nktaGo8Lx8aE=", "path": "github.com/aws/aws-sdk-go/private/signer/v2", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "vnYDXA1NxJ7Hu+DMfXNk1UnmkWg=", "path": "github.com/aws/aws-sdk-go/service/acm", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "DPl/OkvEUjrd+XKqX73l6nUNw3U=", "path": "github.com/aws/aws-sdk-go/service/apigateway", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "CW7pEkPsi8CNAAP4OQIblGUHgis=", "path": "github.com/aws/aws-sdk-go/service/applicationautoscaling", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "oBXDw1zQTfxcKsK3ZjtKcS7gBLI=", "path": "github.com/aws/aws-sdk-go/service/athena", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "ITAwWyJp4t9AGfUXm9M3pFWTHVA=", "path": "github.com/aws/aws-sdk-go/service/autoscaling", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "Zz8qI6RloveM1zrXAglLxJZT1ZA=", "path": "github.com/aws/aws-sdk-go/service/batch", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "6gM3CZZgiB0JvS7EK1c31Q8L09U=", "path": "github.com/aws/aws-sdk-go/service/cloudformation", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "T80IDetBz1hqJpq5Wqmx3MwCh8w=", "path": "github.com/aws/aws-sdk-go/service/cloudfront", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "bYrI9mxspB0xDFZEy3OIfWuez5g=", "path": "github.com/aws/aws-sdk-go/service/cloudtrail", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "oB+M+kOmYG28V0PuI75IF6E+/w8=", "path": "github.com/aws/aws-sdk-go/service/cloudwatch", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "Nc3vXlV7s309PprScYpRDPQWeDQ=", "path": "github.com/aws/aws-sdk-go/service/cloudwatchevents", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "bPh7NF3mLpGMV0rIakolMPHqMyw=", "path": "github.com/aws/aws-sdk-go/service/cloudwatchlogs", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { - "checksumSHA1": "P6qyaFX9X6Nnvm3avLigjmjfYds=", + "checksumSHA1": "GyuNxzdK9oSY6jMfmoqNx6tuCrk=", "path": "github.com/aws/aws-sdk-go/service/codebuild", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "7nW1Ho2X3RcUU8FaFBhJIUeuDNw=", "path": "github.com/aws/aws-sdk-go/service/codecommit", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "+petAU2sPfykSoVBAitmGxvGOlw=", "path": "github.com/aws/aws-sdk-go/service/codedeploy", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "LKw7fnNwq17Eqy0clzS/LK89vS4=", "path": "github.com/aws/aws-sdk-go/service/codepipeline", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "aXh1KIbNX+g+tH+lh3pk++9lm3k=", "path": "github.com/aws/aws-sdk-go/service/cognitoidentity", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "IWi9xZz+OncotjM/vJ87Iffg2Qk=", "path": "github.com/aws/aws-sdk-go/service/cognitoidentityprovider", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "56F6Stg8hQ1kxiAEzqB0TDctW9k=", "path": "github.com/aws/aws-sdk-go/service/configservice", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "hYCwLQdIjHj8rMHLGVyUVhecI4s=", "path": "github.com/aws/aws-sdk-go/service/databasemigrationservice", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { - "checksumSHA1": "26CWoHQP/dyL2VzE5ZNd8zNzhko=", + "checksumSHA1": "uGQnGyJS3cyOFwZA51eilwLVgtk=", "path": "github.com/aws/aws-sdk-go/service/devicefarm", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "6g94rUHAgjcqMMTtMqKUbLU37wY=", "path": "github.com/aws/aws-sdk-go/service/directconnect", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "edM36y+5lmI7Hne0/38qapLzGO4=", "path": "github.com/aws/aws-sdk-go/service/directoryservice", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "0TXXUPjrbOCHpX555B6suH36Nnk=", "path": "github.com/aws/aws-sdk-go/service/dynamodb", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "4igS6faf4hrhDj6Jj9ErVcN1qKo=", "path": "github.com/aws/aws-sdk-go/service/ec2", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "uEv9kkBsVIjg7K4+Y8TVlU0Cc8o=", "path": "github.com/aws/aws-sdk-go/service/ecr", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "3B3RtWG7IY9qhFhWGEwroeMxnPI=", "path": "github.com/aws/aws-sdk-go/service/ecs", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "eoM9nF5iVMbuGOmkY33d19aHt8Y=", "path": "github.com/aws/aws-sdk-go/service/efs", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "dU5MPXUUOYD/E9sNncpFZ/U86Cw=", "path": "github.com/aws/aws-sdk-go/service/elasticache", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "pj8mBWT3HE0Iid6HSmhw7lmyZDU=", "path": "github.com/aws/aws-sdk-go/service/elasticbeanstalk", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "VYGtTaSiajfKOVTbi9/SNmbiIac=", "path": "github.com/aws/aws-sdk-go/service/elasticsearchservice", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "SZ7yLDZ6RvMhpWe0Goyem64kgyA=", "path": "github.com/aws/aws-sdk-go/service/elastictranscoder", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "qq+fTzQmiq0tCYK/90A0s5pVurM=", "path": "github.com/aws/aws-sdk-go/service/elb", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "E9GRArYlztF98yBDHBTvdD+NIkc=", "path": "github.com/aws/aws-sdk-go/service/elbv2", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "NbkH6F+792jQ7BW4lGCb+vJVw58=", "path": "github.com/aws/aws-sdk-go/service/emr", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "5btWHj2fZrPc/zfYdJLPaOcivxI=", "path": "github.com/aws/aws-sdk-go/service/firehose", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "Rodm1XwZ9Ncah1NLHep0behQpXg=", "path": "github.com/aws/aws-sdk-go/service/gamelift", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "oDoGvSfmO2Z099ixV2HXn+SDeHE=", "path": "github.com/aws/aws-sdk-go/service/glacier", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "mJb6yp7wP+gyUQY+CFbbRkWEv1U=", "path": "github.com/aws/aws-sdk-go/service/glue", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { - "checksumSHA1": "6JlxJoy1JCArNK2qBkaJ5IV6qBc=", + "checksumSHA1": "AFJ17uATPFQ6oUrtN5qZ+DEDncw=", "path": "github.com/aws/aws-sdk-go/service/guardduty", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "oZaxMqnwl2rA+V/W0tJ3uownORI=", "path": "github.com/aws/aws-sdk-go/service/iam", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "nMdRXIfhgvEKBHnLX61Ze3EUJWU=", "path": "github.com/aws/aws-sdk-go/service/inspector", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "pZwCI4DpP5hcMa/ItKhiwo/ukd0=", "path": "github.com/aws/aws-sdk-go/service/iot", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "IoSyRZhlL0petrB28nXk5jKM9YA=", "path": "github.com/aws/aws-sdk-go/service/kinesis", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "JOfgA6YehzwZ/4Mgh+3lY/+Gz3E=", "path": "github.com/aws/aws-sdk-go/service/kms", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { - "checksumSHA1": "Po3j27sses19L37ruAvK1fSYDsc=", + "checksumSHA1": "ybcV5s7X4jsDPiBy1fj1Hlm0hrc=", "path": "github.com/aws/aws-sdk-go/service/lambda", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "wjs9YBsHx0YQH0zKBA7Ibd1UV5Y=", "path": "github.com/aws/aws-sdk-go/service/lightsail", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "QjiIL8LrlhwrQw8FboF+wMNvUF0=", "path": "github.com/aws/aws-sdk-go/service/mediastore", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "ynB7Flcudp0VOqBVKZJ+23DtLHU=", "path": "github.com/aws/aws-sdk-go/service/mq", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "fpsBu+F79ktlLRwal1GugVMUDo0=", "path": "github.com/aws/aws-sdk-go/service/opsworks", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "+crsKabDoPzW0xaccqXP9T5h41s=", "path": "github.com/aws/aws-sdk-go/service/rds", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "vP1FcccUZbuUlin7ME89w1GVJtA=", "path": "github.com/aws/aws-sdk-go/service/redshift", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "fgSXmayOZRgur/41Gp1tFvH0GGg=", "path": "github.com/aws/aws-sdk-go/service/route53", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "sCaHoPWsJXRHFbilUKwN71qFTOI=", "path": "github.com/aws/aws-sdk-go/service/s3", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "QZU8vR9cOIenYiH+Ywl4Gzfnlp0=", "path": "github.com/aws/aws-sdk-go/service/servicecatalog", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "dk6ebvA0EYgdPyc5HPKLBPEtsm4=", "path": "github.com/aws/aws-sdk-go/service/servicediscovery", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "Ex1Ma0SFGpqeNuPbeXZtsliZ3zo=", "path": "github.com/aws/aws-sdk-go/service/ses", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "maVXeR3WDAkONlzf04e4mDgCYxo=", "path": "github.com/aws/aws-sdk-go/service/sfn", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "B3CgAFSREebpsFoFOo4vrQ6u04w=", "path": "github.com/aws/aws-sdk-go/service/simpledb", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "FfY8w4DM8XIULdRnFhd3Um8Mj8c=", "path": "github.com/aws/aws-sdk-go/service/sns", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "Wx189wAbIhWChx4kVbvsyqKMF4U=", "path": "github.com/aws/aws-sdk-go/service/sqs", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "Ka9/jYIzdeR4/b8IHXigYe5LvZk=", "path": "github.com/aws/aws-sdk-go/service/ssm", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "W1oFtpaT4TWIIJrAvFcn/XdcT7g=", "path": "github.com/aws/aws-sdk-go/service/sts", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "on6d7Hydx2bM9jkFOf1JZcZZgeY=", "path": "github.com/aws/aws-sdk-go/service/waf", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "rHqjsOndIR82gX5mSKybaRWf3UY=", "path": "github.com/aws/aws-sdk-go/service/wafregional", - "revision": "decd990ddc5dcdf2f73309cbcab90d06b996ca28", - "revisionTime": "2018-01-22T22:30:27Z", - "version": "v1.12.67", - "versionExact": "v1.12.67" + "revision": "1b176c5c6b57adb03bb982c21930e708ebca5a77", + "revisionTime": "2018-01-26T22:46:47Z", + "version": "v1.12.70", + "versionExact": "v1.12.70" }, { "checksumSHA1": "usT4LCSQItkFvFOQT7cBlkCuGaE=", @@ -2160,16 +2160,20 @@ "revisionTime": "2016-09-27T10:08:44Z" }, { - "checksumSHA1": "HDmU5jfsMJvXq9ezjXD28ZWhMc4=", + "checksumSHA1": "5ZT/lsGfrt4BKyi2mLOKg4OUwnI=", "path": "github.com/terraform-providers/terraform-provider-aws", - "revision": "bf7787d6cf97cf76a262fa31bae521dc45065d2b", - "revisionTime": "2018-01-26T16:36:49Z" + "revision": "8937a3a4e9d77c8089cf147861b604e3a2d8cf7e", + "revisionTime": "2018-01-29T14:56:01Z", + "version": "v1.8.0", + "versionExact": "v1.8.0" }, { - "checksumSHA1": "JENz2/NBOXKRE54gdQSLRVUXph4=", + "checksumSHA1": "14tQONjMFJtu11KjPPHCoVwjUts=", "path": "github.com/terraform-providers/terraform-provider-aws/aws", - "revision": "bf7787d6cf97cf76a262fa31bae521dc45065d2b", - "revisionTime": "2018-01-26T16:36:49Z" + "revision": "8937a3a4e9d77c8089cf147861b604e3a2d8cf7e", + "revisionTime": "2018-01-29T14:56:01Z", + "version": "v1.8.0", + "versionExact": "v1.8.0" }, { "checksumSHA1": "7WDq0VsOJmABPUCEvfuerEp7mBg=",