github.com/aavshr/aws-sdk-go@v1.41.3/service/ec2/customizations.go (about)

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