Skip to content

Commit

Permalink
added yaml unmarshal
Browse files Browse the repository at this point in the history
  • Loading branch information
Mads Schou-Andreasen committed Mar 23, 2021
1 parent a740974 commit 8a01803
Show file tree
Hide file tree
Showing 3 changed files with 78 additions and 5 deletions.
43 changes: 38 additions & 5 deletions fetch.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,23 +7,24 @@ import (
"github.com/panjf2000/ants/v2"
"github.com/pkg/errors"
secretmanagerpb "google.golang.org/genproto/googleapis/cloud/secretmanager/v1"
"gopkg.in/yaml.v2"
"log"
"os"
"reflect"
"sync"
)

func (svc *secretClient) accessSecretVersion(name string) (string, error) {
func (svc *secretClient) accessSecretVersion(name string) ([]byte, error) {
req := &secretmanagerpb.AccessSecretVersionRequest{
Name: fmt.Sprintf("projects/%s/secrets/%s/versions/latest", svc.project, name),
}

secret, err := svc.client.AccessSecretVersion(svc.ctx, req)
if err != nil {
return "", err
return nil, err
}
s := string(secret.Payload.Data)
return s, nil

return secret.Payload.Data, nil
}

type params struct {
Expand All @@ -37,6 +38,38 @@ type params struct {
// then dispatching calls to get the secret payloads from GCP for the corresponding secrets.
// The function must be passed a pointer to an arbitrary config struct, and
// the config struct must only have string fields.
func InitializeConfigYaml(cfg interface{}, project string, secret string) error {

grabber, err := newClient(project)
if err != nil {
return err
}
defer grabber.client.Close()

t := reflect.TypeOf(cfg)

if t.Kind() != reflect.Ptr {
return errors.New("cfg argument must be a pointer to a struct")
}

s := reflect.ValueOf(cfg).Elem()
if s.Kind() != reflect.Struct {
return errors.New("cfg argument must be a pointer to a struct")
}

bytes, err := grabber.accessSecretVersion(secret)
if err != nil {
return err
}

err = yaml.Unmarshal(bytes, cfg)
if err != nil {
return err
}

return nil
}

func InitializeConfig(cfg interface{}, project string, envFileAction EnvFileAction) error {

grabber, err := newClient(project)
Expand Down Expand Up @@ -138,7 +171,7 @@ func (svc *secretClient) setValueFromGcp(p params) error {
return err
}

p.v.SetString(secretString)
p.v.SetString(string(secretString))
return nil
}

Expand Down
39 changes: 39 additions & 0 deletions fetch_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@ package gcpsecretfetch
import (
"fmt"
"github.com/stretchr/testify/assert"
"reflect"
"testing"
"time"
)

const GCP_PROJECT = "ob-playground"
Expand Down Expand Up @@ -125,3 +127,40 @@ func TestStructWithNonStringField(t *testing.T) {
assert.Error(t, err)

}

func TestStructYaml(t *testing.T) {

type config struct {
MyvaL int
Key struct {
Nested string
}
}

var cfg config
err := InitializeConfigYaml(&cfg, GCP_PROJECT, "yaml-example")
assert.NoError(t, err)

}

func isEmptyValue(v reflect.Value) bool {
switch v.Kind() {
case reflect.Array, reflect.Map, reflect.Slice, reflect.String:
return v.Len() == 0
case reflect.Bool:
return !v.Bool()
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
return v.Int() == 0
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
return v.Uint() == 0
case reflect.Float32, reflect.Float64:
return v.Float() == 0
case reflect.Interface, reflect.Ptr:
return v.IsNil()
case reflect.Struct:
if t, ok := v.Interface().(time.Time); ok {
return t.IsZero()
}
}
return false
}
1 change: 1 addition & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,5 @@ require (
github.com/stretchr/testify v1.4.0
golang.org/x/net v0.0.0-20201026091529-146b70c837a4 // indirect
google.golang.org/genproto v0.0.0-20201026171402-d4b8fe4fd877
gopkg.in/yaml.v2 v2.2.7
)

0 comments on commit 8a01803

Please sign in to comment.