customizations.go 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. package ec2
  2. import (
  3. "time"
  4. "github.com/aws/aws-sdk-go/aws"
  5. "github.com/aws/aws-sdk-go/aws/awsutil"
  6. "github.com/aws/aws-sdk-go/aws/client"
  7. "github.com/aws/aws-sdk-go/aws/endpoints"
  8. "github.com/aws/aws-sdk-go/aws/request"
  9. )
  10. const (
  11. // customRetryerMinRetryDelay sets min retry delay
  12. customRetryerMinRetryDelay = 1 * time.Second
  13. // customRetryerMaxRetryDelay sets max retry delay
  14. customRetryerMaxRetryDelay = 8 * time.Second
  15. )
  16. func init() {
  17. initRequest = func(r *request.Request) {
  18. if r.Operation.Name == opCopySnapshot { // fill the PresignedURL parameter
  19. r.Handlers.Build.PushFront(fillPresignedURL)
  20. }
  21. // only set the retryer on request if config doesn't have a retryer
  22. if r.Config.Retryer == nil && (r.Operation.Name == opModifyNetworkInterfaceAttribute || r.Operation.Name == opAssignPrivateIpAddresses) {
  23. r.Retryer = client.DefaultRetryer{
  24. NumMaxRetries: client.DefaultRetryerMaxNumRetries,
  25. MinRetryDelay: customRetryerMinRetryDelay,
  26. MinThrottleDelay: customRetryerMinRetryDelay,
  27. MaxRetryDelay: customRetryerMaxRetryDelay,
  28. MaxThrottleDelay: customRetryerMaxRetryDelay,
  29. }
  30. }
  31. }
  32. }
  33. func fillPresignedURL(r *request.Request) {
  34. if !r.ParamsFilled() {
  35. return
  36. }
  37. origParams := r.Params.(*CopySnapshotInput)
  38. // Stop if PresignedURL/DestinationRegion is set
  39. if origParams.PresignedUrl != nil || origParams.DestinationRegion != nil {
  40. return
  41. }
  42. origParams.DestinationRegion = r.Config.Region
  43. newParams := awsutil.CopyOf(r.Params).(*CopySnapshotInput)
  44. // Create a new request based on the existing request. We will use this to
  45. // presign the CopySnapshot request against the source region.
  46. cfg := r.Config.Copy(aws.NewConfig().
  47. WithEndpoint("").
  48. WithRegion(aws.StringValue(origParams.SourceRegion)))
  49. clientInfo := r.ClientInfo
  50. resolved, err := r.Config.EndpointResolver.EndpointFor(
  51. clientInfo.ServiceName, aws.StringValue(cfg.Region),
  52. func(opt *endpoints.Options) {
  53. opt.DisableSSL = aws.BoolValue(cfg.DisableSSL)
  54. opt.UseDualStack = aws.BoolValue(cfg.UseDualStack)
  55. },
  56. )
  57. if err != nil {
  58. r.Error = err
  59. return
  60. }
  61. clientInfo.Endpoint = resolved.URL
  62. clientInfo.SigningRegion = resolved.SigningRegion
  63. // Presign a CopySnapshot request with modified params
  64. req := request.New(*cfg, clientInfo, r.Handlers, r.Retryer, r.Operation, newParams, r.Data)
  65. url, err := req.Presign(5 * time.Minute) // 5 minutes should be enough.
  66. if err != nil { // bubble error back up to original request
  67. r.Error = err
  68. return
  69. }
  70. // We have our URL, set it on params
  71. origParams.PresignedUrl = &url
  72. }