Skip to content

Commit

Permalink
temporary fixed issue #3 by sleeping
Browse files Browse the repository at this point in the history
  • Loading branch information
Mario Toffia committed Apr 30, 2020
1 parent f0100ff commit e9873fc
Show file tree
Hide file tree
Showing 5 changed files with 44 additions and 22 deletions.
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ buildforce:
@go build -a -v ./...
test:
@go test -cover ./...
testverbose:
testverbose: testclean
@go test -v -cover ./...
testclean:
@go clean -testcache
Expand Down
54 changes: 38 additions & 16 deletions internal/pms/serializer.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"context"
"reflect"
"strconv"
"time"

"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/aws/external"
Expand Down Expand Up @@ -59,19 +60,20 @@ func New(service string) (*Serializer, error) {
// Get parameters from the parameterstore and populates the node graph with values.
// Any fields that was not able to be set is reported in the FullNameField string map.
// FullNameField do not include those fields filtered out in exclusion filter.
func (p *Serializer) Get(node *reflectparser.SsmNode,
func (p *Serializer) Get(node reflectparser.SsmNode,
filter *support.FieldFilters) (map[string]support.FullNameField, error) {

m := map[string]*reflectparser.SsmNode{}
m := map[string]reflectparser.SsmNode{}
issecure := p.nodesToParameterMap(node, m, filter)
// TODO: need to split up into 10 parameters per get
paths := p.extractParameters(m)

params := &ssm.GetParametersInput{
Names: paths,
WithDecryption: aws.Bool(issecure),
}

log.Debug().Str("svc", p.service).Str("region", p.config.Region).Msgf("Fetching: %v", params)
log.Debug().Str("svc", p.service).Msgf("Fetching: %v", params)

prms, invalid, err := p.getFromAws(params)
if err != nil {
Expand All @@ -85,7 +87,7 @@ func (p *Serializer) Get(node *reflectparser.SsmNode,
}

func (p *Serializer) handleInvalidRequestParameters(invalid []string,
m map[string]*reflectparser.SsmNode) map[string]support.FullNameField {
m map[string]reflectparser.SsmNode) map[string]support.FullNameField {

im := map[string]support.FullNameField{}

Expand All @@ -100,14 +102,19 @@ func (p *Serializer) handleInvalidRequestParameters(invalid []string,
}
}

if len(im) > 0 {
for key, val := range im {
log.Debug().Msgf("not fetched: %s [%s]", key, val.RemoteName)
}
}
return im
}
func (p *Serializer) populate(node *reflectparser.SsmNode, params map[string]ssm.Parameter) error {
func (p *Serializer) populate(node reflectparser.SsmNode, params map[string]ssm.Parameter) error {
node.EnsureInstance(false)

if node.HasChildren() {
for _, n := range node.Children() {
p.populate(&n, params)
p.populate(n, params)
}
return nil
}
Expand All @@ -124,7 +131,7 @@ func (p *Serializer) populate(node *reflectparser.SsmNode, params map[string]ssm
return nil
}

func setStructValue(node *reflectparser.SsmNode, val ssm.Parameter) error {
func setStructValue(node reflectparser.SsmNode, val ssm.Parameter) error {

log.Debug().Msgf("setting: %s (%s) val: %s", node.Tag().FullName(), *val.Name, *val.Value)

Expand All @@ -140,7 +147,7 @@ func setStructValue(node *reflectparser.SsmNode, val ssm.Parameter) error {
return nil
}

func setStructIntValue(node *reflectparser.SsmNode, val ssm.Parameter) error {
func setStructIntValue(node reflectparser.SsmNode, val ssm.Parameter) error {
ival, err := strconv.ParseInt(*val.Value, 10, 64)
if err != nil {
return errors.Errorf("Config value %s = %s is not a valid integer", *val.Name, *val.Value)
Expand All @@ -149,17 +156,32 @@ func setStructIntValue(node *reflectparser.SsmNode, val ssm.Parameter) error {
return nil
}

var cnt int = 0

// Invoke get towards aws parameter store
func (p *Serializer) getFromAws(params *ssm.GetParametersInput) (map[string]ssm.Parameter, []string, error) {
client := ssm.New(p.config)
req := client.GetParametersRequest(params)

resp, err := req.Send(context.TODO())
var resp *ssm.GetParametersResponse
var err error
success := false
for i := 0; i < 3 && !success; i++ {
req := client.GetParametersRequest(params)

if err != nil {
return nil, nil, errors.Errorf("Failed fetch pms config entries %+v", params)
resp, err = req.Send(context.TODO())
if err != nil {
return nil, nil, errors.Errorf("Failed fetch pms config entries %+v", params)
}

if len(resp.Parameters) == 0 && len(resp.InvalidParameters) > 0 {
time.Sleep(400 * time.Millisecond)
} else {
success = true
}
}

log.Debug().Msg("done getfrom aws!")

m := map[string]ssm.Parameter{}
for _, p := range resp.Parameters {
key := *p.Name
Expand All @@ -171,7 +193,7 @@ func (p *Serializer) getFromAws(params *ssm.GetParametersInput) (map[string]ssm.

// Flattern the parameters in order to provide queries against
// the parameter store.
func (p *Serializer) extractParameters(paths map[string]*reflectparser.SsmNode) []string {
func (p *Serializer) extractParameters(paths map[string]reflectparser.SsmNode) []string {
arr := make([]string, 0, len(paths))
for key := range paths {
arr = append(arr, key)
Expand All @@ -185,12 +207,12 @@ func (p *Serializer) extractParameters(paths map[string]*reflectparser.SsmNode)
// it chcks for the tag SsmType = pms. The full name is
// the associated with the node itself. This is to gain
// a more accessable structure to seach for nodes.
func (p *Serializer) nodesToParameterMap(node *reflectparser.SsmNode,
paths map[string]*reflectparser.SsmNode, filter *support.FieldFilters) bool {
func (p *Serializer) nodesToParameterMap(node reflectparser.SsmNode,
paths map[string]reflectparser.SsmNode, filter *support.FieldFilters) bool {
issecure := false
if node.HasChildren() {
for _, n := range node.Children() {
if p.nodesToParameterMap(&n, paths, filter) {
if p.nodesToParameterMap(n, paths, filter) {
issecure = true
}
}
Expand Down
4 changes: 2 additions & 2 deletions internal/pms/serializer_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ func TestWihSingleStringStruct(t *testing.T) {
assert.Equal(t, nil, err)
}

_, err = pmsr.Get(&node, support.NewFilters())
_, err = pmsr.Get(node, support.NewFilters())
if err != nil {
assert.Equal(t, nil, err)
}
Expand All @@ -50,7 +50,7 @@ func TestWihSingleNestedStruct(t *testing.T) {
assert.Equal(t, nil, err)
}

_, err = pmsr.Get(&node, support.NewFilters())
_, err = pmsr.Get(node, support.NewFilters())
if err != nil {
assert.Equal(t, nil, err)
}
Expand Down
4 changes: 2 additions & 2 deletions internal/testsupport/provisionpms.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import (
func ProvisionPms(prms []ssm.PutParameterInput) error {
awscfg, err := external.LoadDefaultAWSConfig()
if err != nil {
return errors.Errorf("Failed to load AWS config %v", err)
return errors.Wrapf(err, "Failed to load AWS config")
}

delete := ssm.DeleteParametersInput{}
Expand Down Expand Up @@ -48,7 +48,7 @@ func ProvisionPms(prms []ssm.PutParameterInput) error {
func DeletePms(prms ssm.DeleteParametersInput) error {
awscfg, err := external.LoadDefaultAWSConfig()
if err != nil {
return errors.Errorf("Failed to load AWS config %v", err)
return errors.Wrapf(err, "Failed to load AWS config")
}

client := ssm.New(awscfg)
Expand Down
2 changes: 1 addition & 1 deletion serializer.go
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ func (s *Serializer) UnmarshalFilterd(v interface{},
return nil, err
}

invalid, err := pmsr.Get(&node, filter)
invalid, err := pmsr.Get(node, filter)
return invalid, err
}

Expand Down

0 comments on commit e9873fc

Please sign in to comment.