Skip to content

Commit 5d4575a

Browse files
authored
runtimevar/awsparamstore: drop the DescribeParameters call, it isn't necessary (#3146)
1 parent e0f202b commit 5d4575a

20 files changed

+293
-1769
lines changed

runtimevar/awsparamstore/awsparamstore.go

Lines changed: 12 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
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
3535
package 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.
388326
func (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

runtimevar/awsparamstore/awsparamstore_test.go

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -122,20 +122,12 @@ func (v verifyAs) SnapshotCheck(s *runtimevar.Snapshot) error {
122122
if !s.As(&getParam) {
123123
return errors.New("Snapshot.As failed for GetParameterOutput")
124124
}
125-
var descParam *ssmv2.DescribeParametersOutput
126-
if !s.As(&descParam) {
127-
return errors.New("Snapshot.As failed for DescribeParametersOutput")
128-
}
129125
return nil
130126
}
131127
var getParam *ssm.GetParameterOutput
132128
if !s.As(&getParam) {
133129
return errors.New("Snapshot.As failed for GetParameterOutput")
134130
}
135-
var descParam *ssm.DescribeParametersOutput
136-
if !s.As(&descParam) {
137-
return errors.New("Snapshot.As failed for DescribeParametersOutput")
138-
}
139131
return nil
140132
}
141133

runtimevar/awsparamstore/testdata/TestConformance/TestAs/verify_As.replay

Lines changed: 15 additions & 70 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)