Skip to content

Commit e3b6f4a

Browse files
authored
Merge pull request #7 from bugout-dev/parameters-go-neeraj
Replaced new CLI on "parameters-go" branch with an "aws_ssm" checkenv plugin
2 parents bb0c048 + f032be3 commit e3b6f4a

12 files changed

Lines changed: 72 additions & 117 deletions

File tree

aws_ssm.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
// checkenv plugin that provides the environment variables defined in the checkenv process.
2+
3+
package main
4+
5+
import (
6+
"context"
7+
8+
"github.com/bugout-dev/checkenv/aws_ssm"
9+
)
10+
11+
func AWSSystemsManagerParameterStoreProvider(filter string) (map[string]string, error) {
12+
environment := make(map[string]string)
13+
14+
AWSSystemsManagerFlags := aws_ssm.Flags{
15+
Export: false,
16+
MaxResults: 10,
17+
Outfile: "",
18+
Update: false,
19+
}
20+
AWSSystemsManagerFlags.FilterTags = aws_ssm.ParseFilterTags(filter)
21+
22+
ctx := context.Background()
23+
api := aws_ssm.InitAWSClient(ctx)
24+
keys := aws_ssm.FetchKeysOfParameters(ctx, api, AWSSystemsManagerFlags)
25+
keyChunks := aws_ssm.GenerateChunks(keys, 10)
26+
parameters := aws_ssm.FetchParameters(ctx, api, keyChunks, AWSSystemsManagerFlags)
27+
for _, parameter := range parameters {
28+
environment[parameter.Name] = parameter.Value
29+
}
30+
31+
return environment, nil
32+
}
33+
34+
func init() {
35+
helpString := "Provides environment variables defined in AWS Systems Manager Parameter Store."
36+
RegisterPlugin("aws_ssm", helpString, noop, AWSSystemsManagerParameterStoreProvider)
37+
}
Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/*
22
Based on: https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/gov2/ssm/GetParameter/GetParameterv2.go
33
*/
4-
package parameters
4+
package aws_ssm
55

66
import (
77
"context"
@@ -11,18 +11,13 @@ import (
1111
"github.com/aws/aws-sdk-go-v2/service/ssm"
1212
)
1313

14-
// SSMGetParametersAPI and SSMDescribeParametersAPI defines the interface
15-
// for the GetParameters and DescribeParameters function.
16-
// We use this interface to test the function using a mocked service
17-
type SSMGetParametersAPI interface {
14+
type AWSSystemsManagerParameterStore interface {
1815
GetParameters(
1916
ctx context.Context,
2017
params *ssm.GetParametersInput,
2118
optFns ...func(*ssm.Options),
2219
) (*ssm.GetParametersOutput, error)
23-
}
2420

25-
type SSMDescribeParametersAPI interface {
2621
DescribeParameters(
2722
ctx context.Context,
2823
params *ssm.DescribeParametersInput,
@@ -38,11 +33,11 @@ type SSMDescribeParametersAPI interface {
3833
// Output:
3934
// If success, a GetParametersOutput object containing the result of the service call and nil
4035
// Otherwise, nil and an error from the call to GetParameters
41-
func ExecGetParameters(c context.Context, api SSMGetParametersAPI, input *ssm.GetParametersInput) (*ssm.GetParametersOutput, error) {
36+
func ExecGetParameters(c context.Context, api AWSSystemsManagerParameterStore, input *ssm.GetParametersInput) (*ssm.GetParametersOutput, error) {
4237
return api.GetParameters(c, input)
4338
}
4439

45-
func ExecDescribeParameters(c context.Context, api SSMDescribeParametersAPI, input *ssm.DescribeParametersInput) (*ssm.DescribeParametersOutput, error) {
40+
func ExecDescribeParameters(c context.Context, api AWSSystemsManagerParameterStore, input *ssm.DescribeParametersInput) (*ssm.DescribeParametersOutput, error) {
4641
return api.DescribeParameters(c, input)
4742
}
4843

scripts/sources/parameters/cmd/aws_ssm_test.go renamed to aws_ssm/aws_ssm_test.go

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package parameters
1+
package aws_ssm
22

33
import (
44
"context"
@@ -13,10 +13,9 @@ import (
1313
)
1414

1515
// Fill fake output data
16-
type SSMGetParametersImpl struct{}
17-
type SSMDescribeParametersImpl struct{}
16+
type MockAWSSystemManagerParameterStore struct{}
1817

19-
func (dt SSMGetParametersImpl) GetParameters(
18+
func (dt MockAWSSystemManagerParameterStore) GetParameters(
2019
ctx context.Context,
2120
params *ssm.GetParametersInput,
2221
optFns ...func(*ssm.Options),
@@ -34,7 +33,7 @@ func (dt SSMGetParametersImpl) GetParameters(
3433

3534
return output, nil
3635
}
37-
func (dt SSMDescribeParametersImpl) DescribeParameters(
36+
func (dt MockAWSSystemManagerParameterStore) DescribeParameters(
3837
ctx context.Context,
3938
params *ssm.DescribeParametersInput,
4039
optFns ...func(*ssm.Options),
@@ -67,7 +66,7 @@ var globalData []Data
6766
var globalParameterKeys []string
6867

6968
func populateData(t *testing.T) error {
70-
content, err := ioutil.ReadFile("../data.json")
69+
content, err := ioutil.ReadFile("./data.json")
7170
if err != nil {
7271
return err
7372
}
@@ -87,7 +86,7 @@ func TestDescribeParameters(t *testing.T) {
8786
t.Fatal("Failed to populate data")
8887
}
8988

90-
api := &SSMDescribeParametersImpl{}
89+
api := &MockAWSSystemManagerParameterStore{}
9190

9291
flags := Flags{FilterTags: []FilterTag{{Name: "Product", Value: "test"}}}
9392

@@ -111,7 +110,7 @@ func TestDescribeParameters(t *testing.T) {
111110
func TestGetParameters(t *testing.T) {
112111
parameterKeyChunks := GenerateChunks(globalParameterKeys, 10)
113112

114-
api := &SSMGetParametersImpl{}
113+
api := &MockAWSSystemManagerParameterStore{}
115114

116115
flags := Flags{Export: false}
117116

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package parameters
1+
package aws_ssm
22

33
// Parameter structure for storing final result from AWS SSM
44
type Parameter struct {

scripts/sources/parameters/cmd/parameters.go renamed to aws_ssm/parameters.go

Lines changed: 4 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
1-
package parameters
1+
package aws_ssm
22

33
import (
44
"context"
5-
"flag"
65
"fmt"
76
"log"
87
"os"
9-
"os/signal"
108
"strings"
119

1210
"github.com/aws/aws-sdk-go-v2/service/ssm"
@@ -16,7 +14,7 @@ import (
1614
// Fetch values for parameters
1715
// Inputs:
1816
// chunks: list of lists with parameter key values
19-
func FetchParameters(ctx context.Context, api SSMGetParametersAPI, chunks [][]string, flags Flags) []Parameter {
17+
func FetchParameters(ctx context.Context, api AWSSystemsManagerParameterStore, chunks [][]string, flags Flags) []Parameter {
2018
var parameters []Parameter
2119

2220
for _, chunk := range chunks {
@@ -46,7 +44,7 @@ func FetchParameters(ctx context.Context, api SSMGetParametersAPI, chunks [][]st
4644
// Fetch list of parameter keys from AWS with defined filters
4745
func FetchKeysOfParameters(
4846
ctx context.Context,
49-
api SSMDescribeParametersAPI,
47+
api AWSSystemsManagerParameterStore,
5048
flags Flags,
5149
) []string {
5250
var parameters []string
@@ -79,7 +77,7 @@ func FetchKeysOfParameters(
7977
if results.NextToken == nil {
8078
break
8179
}
82-
describeInput.NextToken = *&results.NextToken
80+
describeInput.NextToken = results.NextToken
8381

8482
n++
8583
if n >= 50 {
@@ -155,59 +153,3 @@ func WriteToFile(parameters []Parameter, outfile string, update bool, export boo
155153
log.Fatalf("Unable to write to file %s, error: %s", outfile, err)
156154
}
157155
}
158-
159-
// HandleSignals process Ctrl+C and all script interruptions
160-
func HandleSignals(cancel context.CancelFunc) {
161-
sigCh := make(chan os.Signal)
162-
signal.Notify(sigCh, os.Interrupt)
163-
for {
164-
sig := <-sigCh
165-
switch sig {
166-
case os.Interrupt:
167-
cancel()
168-
return
169-
}
170-
}
171-
}
172-
173-
func Extract() {
174-
var flags Flags
175-
var filterTagsStr string
176-
flag.BoolVar(&flags.Export, "export", false, "Add prefix 'export' to each parameter")
177-
flag.IntVar(&flags.MaxResults, "max", 3, "The maximum number of items to return for call to AWS")
178-
flag.StringVar(&flags.Outfile, "outfile", "", "Output file where parameters will be saved")
179-
flag.StringVar(&filterTagsStr, "tags", "", "Product tags for filter separated by comma in format 'tagName1:tagValue1,tagName2:tagValue2'")
180-
flag.BoolVar(&flags.Update, "update", false, "Update existing file if exists (by default the file will be overwritten)")
181-
flag.Parse()
182-
183-
if filterTagsStr == "" {
184-
log.Fatalln("Please specify the tags for filter, at least Product tag")
185-
}
186-
187-
// Convert string of tags for filter to key:value structure
188-
filterTags := ParseFilterTags(filterTagsStr)
189-
flags.FilterTags = filterTags
190-
191-
ctx, cancel := context.WithCancel(context.Background())
192-
go HandleSignals(cancel)
193-
194-
client := InitAWSClient(ctx)
195-
196-
parameterKeys := FetchKeysOfParameters(ctx, client, flags)
197-
198-
// Split slice of parameter keys to chunks by 10 (max len allowed by AWS)
199-
// and fetch values for required parameters
200-
parameterKeyChunks := GenerateChunks(parameterKeys, 10)
201-
if len(parameterKeyChunks) == 0 {
202-
log.Fatalln("Nothing to generate, empty slice provided")
203-
}
204-
parameters := FetchParameters(ctx, client, parameterKeyChunks, flags)
205-
206-
if flags.Outfile != "" {
207-
WriteToFile(parameters, flags.Outfile, flags.Update, flags.Export)
208-
} else {
209-
for _, p := range parameters {
210-
fmt.Printf("%s%s=%s\n", p.Export, p.Name, p.Value)
211-
}
212-
}
213-
}

scripts/sources/parameters/cmd/parameters_test.go renamed to aws_ssm/parameters_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package parameters
1+
package aws_ssm
22

33
import (
44
"reflect"

checkenv.go

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ func main() {
6464
showFlags := flag.NewFlagSet("show", flag.ExitOnError)
6565
showHelp := showFlags.Bool("h", false, "Use this flag if you want help with this command")
6666
showFlags.BoolVar(showHelp, "help", false, "Use this flag if you want help with this command")
67+
showExport := showFlags.Bool("export", false, "Use this flag to prepend and \"export \" before every environment variable definition")
6768

6869
availableCommands := fmt.Sprintf("%s,%s", pluginsCommand, showCommand)
6970

@@ -100,21 +101,27 @@ func main() {
100101
}
101102
providedVars[providerSpec] = vars
102103
}
104+
105+
exportPrefix := ""
106+
if *showExport {
107+
exportPrefix = "export "
108+
}
109+
103110
for providerSpec := range spec.providersFull {
104-
fmt.Printf("%s - all variables:\n", providerSpec)
111+
fmt.Printf("# %s - all variables:\n", providerSpec)
105112
for k, v := range providedVars[providerSpec] {
106-
fmt.Printf("- %s=%s\n", k, v)
113+
fmt.Printf("%s%s=%s\n", exportPrefix, k, v)
107114
}
108115
}
109116
for providerSpec, queriedVars := range spec.providerVars {
110-
fmt.Printf("%s - specific variables:\n", providerSpec)
117+
fmt.Printf("# %s - specific variables:\n", providerSpec)
111118
definedVars := providedVars[providerSpec]
112119
for k := range queriedVars {
113120
v, ok := definedVars[k]
114121
if !ok {
115-
fmt.Printf("- UNDEFINED: %s\n", k)
122+
fmt.Printf("# UNDEFINED: %s\n", k)
116123
} else {
117-
fmt.Printf("- %s=%s\n", k, v)
124+
fmt.Printf("%s%s=%s\n", exportPrefix, k, v)
118125
}
119126
}
120127
}

go.mod

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
11
module github.com/bugout-dev/checkenv
22

33
go 1.16
4+
5+
require (
6+
github.com/aws/aws-sdk-go-v2 v1.11.2
7+
github.com/aws/aws-sdk-go-v2/config v1.11.0
8+
github.com/aws/aws-sdk-go-v2/service/ssm v1.17.1
9+
)

0 commit comments

Comments
 (0)