3030// # As
3131//
3232// awsparamstore exposes the following types for As:
33- // - Snapshot: (V1) *ssm.GetParameterOutput, *ssm.DescribeParametersOutput, (V2) *ssmv2.GetParameterOutput, *ssmv2.DescribeParametersOutput
33+ // - Snapshot: (V1) *ssm.GetParameterOutput, (V2) *ssmv2.GetParameterOutput
3434// - Error: (V1) awserr.Error, (V2) any error type returned by the service, notably smithy.APIError
3535package awsparamstore // import "gocloud.dev/runtimevar/awsparamstore"
3636
@@ -46,7 +46,6 @@ import (
4646
4747 awsv2 "github.com/aws/aws-sdk-go-v2/aws"
4848 ssmv2 "github.com/aws/aws-sdk-go-v2/service/ssm"
49- ssmv2types "github.com/aws/aws-sdk-go-v2/service/ssm/types"
5049 "github.com/aws/aws-sdk-go/aws"
5150 "github.com/aws/aws-sdk-go/aws/awserr"
5251 "github.com/aws/aws-sdk-go/aws/client"
@@ -212,8 +211,6 @@ type state struct {
212211 val interface {}
213212 rawGetV1 * ssm.GetParameterOutput
214213 rawGetV2 * ssmv2.GetParameterOutput
215- rawDescV1 * ssm.DescribeParametersOutput
216- rawDescV2 * ssmv2.DescribeParametersOutput
217214 updateTime time.Time
218215 version int64
219216 err error
@@ -236,10 +233,6 @@ func (s *state) As(i interface{}) bool {
236233 * p = s .rawGetV1
237234 case * * ssmv2.GetParameterOutput :
238235 * p = s .rawGetV2
239- case * * ssm.DescribeParametersOutput :
240- * p = s .rawDescV1
241- case * * ssmv2.DescribeParametersOutput :
242- * p = s .rawDescV2
243236 default :
244237 return false
245238 }
@@ -300,91 +293,36 @@ type watcher struct {
300293 decoder * runtimevar.Decoder
301294}
302295
303- func getParameter (svc * ssm.SSM , name string ) (int64 , []byte , * ssm.GetParameterOutput , error ) {
296+ func getParameter (svc * ssm.SSM , name string ) (int64 , []byte , time. Time , * ssm.GetParameterOutput , error ) {
304297 getResp , err := svc .GetParameter (& ssm.GetParameterInput {
305298 Name : aws .String (name ),
306299 // Ignored if the parameter is not encrypted.
307300 WithDecryption : aws .Bool (true ),
308301 })
309302 if err != nil {
310- return 0 , nil , nil , err
303+ return 0 , nil , time. Time {}, nil , err
311304 }
312305 if getResp .Parameter == nil {
313- return 0 , nil , getResp , fmt .Errorf ("unable to get %q parameter" , name )
306+ return 0 , nil , time. Time {}, getResp , fmt .Errorf ("unable to get %q parameter" , name )
314307 }
315- return aws .Int64Value (getResp .Parameter .Version ), []byte (aws .StringValue (getResp .Parameter .Value )), getResp , nil
308+ return aws .Int64Value (getResp .Parameter .Version ), []byte (aws .StringValue (getResp .Parameter .Value )), aws . TimeValue ( getResp . Parameter . LastModifiedDate ), getResp , nil
316309}
317310
318- func getParameterV2 (ctx context.Context , client * ssmv2.Client , name string ) (int64 , []byte , * ssmv2.GetParameterOutput , error ) {
311+ func getParameterV2 (ctx context.Context , client * ssmv2.Client , name string ) (int64 , []byte , time. Time , * ssmv2.GetParameterOutput , error ) {
319312 getResp , err := client .GetParameter (ctx , & ssmv2.GetParameterInput {
320313 Name : aws .String (name ),
321314 // Ignored if the parameter is not encrypted.
322315 WithDecryption : true ,
323316 })
324317 if err != nil {
325- return 0 , nil , nil , err
318+ return 0 , nil , time. Time {}, nil , err
326319 }
327320 if getResp .Parameter == nil {
328- return 0 , nil , getResp , fmt .Errorf ("unable to get %q parameter" , name )
321+ return 0 , nil , time. Time {}, getResp , fmt .Errorf ("unable to get %q parameter" , name )
329322 }
330- return getResp .Parameter .Version , []byte (awsv2 .ToString (getResp .Parameter .Value )), getResp , nil
323+ return getResp .Parameter .Version , []byte (awsv2 .ToString (getResp .Parameter .Value )), awsv2 . ToTime ( getResp . Parameter . LastModifiedDate ), getResp , nil
331324}
332325
333- func describeParameter (svc * ssm.SSM , name string ) (time.Time , * ssm.DescribeParametersOutput , error ) {
334- query := func (nextToken * string ) (* ssm.DescribeParametersOutput , error ) {
335- return svc .DescribeParameters (& ssm.DescribeParametersInput {
336- NextToken : nextToken ,
337- Filters : []* ssm.ParametersFilter {
338- {Key : aws .String ("Name" ), Values : []* string {& name }},
339- },
340- })
341- }
342- var result []* ssm.ParameterMetadata
343- var descResp * ssm.DescribeParametersOutput
344- var err error
345- var token * string
346- for ok := true ; ok ; ok = (token != nil ) {
347- if descResp , err = query (token ); err != nil {
348- return time.Time {}, nil , err
349- } else {
350- result = append (result , descResp .Parameters ... )
351- token = descResp .NextToken
352- }
353- }
354- if len (result ) != 1 || * result [0 ].Name != name {
355- return time.Time {}, nil , fmt .Errorf ("unable to get single %q parameter" , name )
356- }
357- return aws .TimeValue (result [0 ].LastModifiedDate ), descResp , nil
358- }
359-
360- func describeParameterV2 (ctx context.Context , client * ssmv2.Client , name string ) (time.Time , * ssmv2.DescribeParametersOutput , error ) {
361- query := func (nextToken * string ) (* ssmv2.DescribeParametersOutput , error ) {
362- return client .DescribeParameters (ctx , & ssmv2.DescribeParametersInput {
363- NextToken : nextToken ,
364- Filters : []ssmv2types.ParametersFilter {
365- {Key : "Name" , Values : []string {name }},
366- },
367- })
368- }
369- result := []ssmv2types.ParameterMetadata {}
370- var descResp * ssmv2.DescribeParametersOutput
371- var err error
372- var token * string
373- for ok := true ; ok ; ok = (token != nil ) {
374- if descResp , err = query (token ); err != nil {
375- return time.Time {}, nil , err
376- } else {
377- result = append (result , descResp .Parameters ... )
378- token = descResp .NextToken
379- }
380- }
381- if len (result ) != 1 || * result [0 ].Name != name {
382- return time.Time {}, descResp , fmt .Errorf ("unable to get single %q parameter" , name )
383- }
384- return awsv2 .ToTime (descResp .Parameters [0 ].LastModifiedDate ), descResp , nil
385- }
386-
387- // WatchVariable implements driver.WatchVariable.
388326func (w * watcher ) WatchVariable (ctx context.Context , prev driver.State ) (driver.State , time.Duration ) {
389327 lastVersion := int64 (- 1 )
390328 if prev != nil {
@@ -398,13 +336,14 @@ func (w *watcher) WatchVariable(ctx context.Context, prev driver.State) (driver.
398336 // GetParameter from S3 to get the current value and version.
399337 var newVersion int64
400338 var newVal []byte
339+ var newLastModified time.Time
401340 var rawGetV1 * ssm.GetParameterOutput
402341 var rawGetV2 * ssmv2.GetParameterOutput
403342 var err error
404343 if w .useV2 {
405- newVersion , newVal , rawGetV2 , err = getParameterV2 (ctx , w .clientV2 , w .name )
344+ newVersion , newVal , newLastModified , rawGetV2 , err = getParameterV2 (ctx , w .clientV2 , w .name )
406345 } else {
407- newVersion , newVal , rawGetV1 , err = getParameter (svc , w .name )
346+ newVersion , newVal , newLastModified , rawGetV1 , err = getParameter (svc , w .name )
408347 }
409348 if err != nil {
410349 return errorState (err , prev ), w .wait
@@ -414,19 +353,6 @@ func (w *watcher) WatchVariable(ctx context.Context, prev driver.State) (driver.
414353 return nil , w .wait
415354 }
416355
417- // DescribeParameters from S3 to get the LastModified date.
418- var newLastModified time.Time
419- var rawDescV1 * ssm.DescribeParametersOutput
420- var rawDescV2 * ssmv2.DescribeParametersOutput
421- if w .useV2 {
422- newLastModified , rawDescV2 , err = describeParameterV2 (ctx , w .clientV2 , w .name )
423- } else {
424- newLastModified , rawDescV1 , err = describeParameter (svc , w .name )
425- }
426- if err != nil {
427- return errorState (err , prev ), w .wait
428- }
429-
430356 // New value (or at least, new version). Decode it.
431357 val , err := w .decoder .Decode (ctx , newVal )
432358 if err != nil {
@@ -436,8 +362,6 @@ func (w *watcher) WatchVariable(ctx context.Context, prev driver.State) (driver.
436362 val : val ,
437363 rawGetV1 : rawGetV1 ,
438364 rawGetV2 : rawGetV2 ,
439- rawDescV1 : rawDescV1 ,
440- rawDescV2 : rawDescV2 ,
441365 updateTime : newLastModified ,
442366 version : newVersion ,
443367 }, w .wait
0 commit comments