Skip to content

Commit 16c978e

Browse files
committed
test google secrets manager; use golangci-lint linter
1 parent ade8971 commit 16c978e

File tree

8 files changed

+342
-20
lines changed

8 files changed

+342
-20
lines changed

.golangci.yaml

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
linters-settings:
2+
govet:
3+
check-shadowing: true
4+
golint:
5+
min-confidence: 0
6+
gocyclo:
7+
min-complexity: 15
8+
maligned:
9+
suggest-new: true
10+
dupl:
11+
threshold: 100
12+
goconst:
13+
min-len: 2
14+
min-occurrences: 2
15+
misspell:
16+
locale: US
17+
lll:
18+
line-length: 140
19+
goimports:
20+
local-prefixes: github.com/golangci/golangci-lint
21+
gocritic:
22+
enabled-tags:
23+
- diagnostic
24+
- experimental
25+
- opinionated
26+
- performance
27+
- style
28+
disabled-checks:
29+
- dupImport # https://github.com/go-critic/go-critic/issues/845
30+
- ifElseChain
31+
- octalLiteral
32+
- rangeValCopy
33+
- unnamedResult
34+
- whyNoLint
35+
- wrapperFunc
36+
funlen:
37+
lines: 100
38+
statements: 50
39+
40+
linters:
41+
# please, do not use `enable-all`: it's deprecated and will be removed soon.
42+
# inverted configuration with `enable-all` and `disable` is not scalable during updates of golangci-lint
43+
disable-all: true
44+
enable:
45+
# - rowserrcheck
46+
- bodyclose
47+
- deadcode
48+
- depguard
49+
- dogsled
50+
- dupl
51+
- errcheck
52+
- funlen
53+
- goconst
54+
- gocritic
55+
- gocyclo
56+
- gofmt
57+
- goimports
58+
- golint
59+
- gosec
60+
- gosimple
61+
- govet
62+
- ineffassign
63+
- interfacer
64+
- lll
65+
- misspell
66+
- nakedret
67+
- scopelint
68+
- staticcheck
69+
- structcheck
70+
- stylecheck
71+
- typecheck
72+
- unconvert
73+
- unparam
74+
- unused
75+
- varcheck
76+
- whitespace
77+
78+
# don't enable:
79+
# - gochecknoglobals
80+
# - gocognit
81+
# - godox
82+
# - maligned
83+
# - prealloc
84+
85+
issues:
86+
exclude:
87+
- Using the variable on range scope `tt` in function literal

Makefile

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ TESTPKGS = $(shell env GO111MODULE=on $(GO) list -f \
77
'{{ if or .TestGoFiles .XTestGoFiles }}{{ .ImportPath }}{{ end }}' \
88
$(PKGS))
99
BIN = $(CURDIR)/.bin
10+
GOLANGCI_LINT_CONFIG = $(CURDIR)/.golangci.yaml
11+
1012

1113
GO = go
1214
TIMEOUT = 15
@@ -35,8 +37,8 @@ $(BIN)/%: | $(BIN) ; $(info $(M) building $(PACKAGE)…)
3537
|| ret=$$?; \
3638
rm -rf $$tmp ; exit $$ret
3739

38-
GOLINT = $(BIN)/golint
39-
$(BIN)/golint: PACKAGE=golang.org/x/lint/golint
40+
GOLANGCI_LINT = $(BIN)/golangci-lint
41+
$(BIN)/golangci-lint: PACKAGE=github.com/golangci/golangci-lint/cmd/golangci-lint
4042

4143
GOCOV = $(BIN)/gocov
4244
$(BIN)/gocov: PACKAGE=github.com/axw/gocov/...
@@ -60,7 +62,7 @@ test-verbose: ARGS=-v ## Run tests in verbose mode with coverage repo
6062
test-race: ARGS=-race ## Run tests with race detector
6163
$(TEST_TARGETS): NAME=$(MAKECMDGOALS:test-%=%)
6264
$(TEST_TARGETS): test
63-
check test tests: fmt lint ; $(info $(M) running $(NAME:%=% )tests…) @ ## Run tests
65+
check test tests: fmt ; $(info $(M) running $(NAME:%=% )tests…) @ ## Run tests
6466
$Q $(GO) test -timeout $(TIMEOUT)s $(ARGS) $(TESTPKGS)
6567

6668
test-xml: fmt lint | $(GO2XUNIT) ; $(info $(M) running xUnit tests…) @ ## Run tests with xUnit output
@@ -87,8 +89,9 @@ test-coverage: fmt lint test-coverage-tools ; $(info $(M) running coverage tests
8789
$Q $(GOCOV) convert $(COVERAGE_PROFILE) | $(GOCOVXML) > $(COVERAGE_XML)
8890

8991
.PHONY: lint
90-
lint: | $(GOLINT) ; $(info $(M) running golint…) @ ## Run golint
91-
$Q $(GOLINT) -set_exit_status $(PKGS)
92+
lint: | $(GOLANGCI_LINT) ; $(info $(M) running golangci-lint…) @ ## Run golangci-lint
93+
$Q $(GOLANGCI_LINT) run -v -c $(GOLANGCI_LINT_CONFIG) .
94+
9295

9396
.PHONY: fmt
9497
fmt: ; $(info $(M) running gofmt…) @ ## Run gofmt on all source files
@@ -99,6 +102,7 @@ mock: | $(GOMOCK) ; $(info $(M) generating mocks…) @ ## Run mockery
99102
$Q $(GO) mod vendor -v
100103
$Q $(GOMOCK) -name SecretsManagerAPI -dir vendor/github.com/aws/aws-sdk-go/service/secretsmanager/secretsmanageriface
101104
$Q $(GOMOCK) -name SSMAPI -dir vendor/github.com/aws/aws-sdk-go/service/ssm/ssmiface
105+
$Q $(GOMOCK) -name GoogleSecretsManagerAPI -dir pkg/secrets/google
102106
$Q rm -rf vendor
103107

104108
# Misc

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ go 1.14
55
require (
66
cloud.google.com/go v0.50.0
77
github.com/aws/aws-sdk-go v1.24.1
8+
github.com/googleapis/gax-go/v2 v2.0.5
89
github.com/pkg/errors v0.9.1
910
github.com/sirupsen/logrus v1.4.2
1011
github.com/stretchr/testify v1.4.0

main.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ func mainCmd(c *cli.Context) error {
7070
if c.String("provider") == "aws" {
7171
provider, err = aws.NewAwsSecretsProvider()
7272
} else if c.String("provider") == "google" {
73-
provider, err = google.NewGoogleSecretsProvider()
73+
provider, err = google.NewGoogleSecretsProvider(ctx)
7474
}
7575
if err != nil {
7676
log.WithField("provider", c.String("provider")).WithError(err).Error("failed to initialize secrets provider")
@@ -149,10 +149,15 @@ func run(ctx context.Context, provider secrets.Provider, commandSlice []string)
149149
// Goroutine for signals forwarding
150150
go func() {
151151
for sig := range sigs {
152-
// ignore SIGCHLD signals since these are only usefull for secrets-init
152+
// ignore SIGCHLD signals since these are only useful for secrets-init
153153
if sig != syscall.SIGCHLD {
154154
// forward signal to the main process and its children
155-
syscall.Kill(-cmd.Process.Pid, sig.(syscall.Signal))
155+
e := syscall.Kill(-cmd.Process.Pid, sig.(syscall.Signal))
156+
log.WithFields(log.Fields{
157+
"pid": cmd.Process.Pid,
158+
"path": cmd.Path,
159+
"args": cmd.Args,
160+
}).WithError(e).Error("failed to kill process")
156161
}
157162
}
158163
}()

mocks/GoogleSecretsManagerAPI.go

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

pkg/secrets/google/interface.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package google
2+
3+
import (
4+
"context"
5+
6+
"github.com/googleapis/gax-go/v2"
7+
secretspb "google.golang.org/genproto/googleapis/cloud/secrets/v1beta1"
8+
)
9+
10+
type GoogleSecretsManagerAPI interface {
11+
AccessSecretVersion(ctx context.Context, req *secretspb.AccessSecretVersionRequest, opts ...gax.CallOption) (*secretspb.AccessSecretVersionResponse, error)
12+
}

pkg/secrets/google/secrets.go

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,18 @@ import (
1111
)
1212

1313
// SecretsProvider Google Cloud secrets provider
14-
type SecretsProvider struct{}
14+
type SecretsProvider struct {
15+
sm GoogleSecretsManagerAPI
16+
}
1517

1618
// NewGoogleSecretsProvider init Google Secrets Provider
17-
func NewGoogleSecretsProvider() (secrets.Provider, error) {
19+
func NewGoogleSecretsProvider(ctx context.Context) (secrets.Provider, error) {
1820
sp := SecretsProvider{}
21+
var err error
22+
sp.sm, err = secretmanager.NewClient(ctx)
23+
if err != nil {
24+
return nil, errors.Wrap(err, "failed to initialize Google Cloud SDK")
25+
}
1926
return &sp, nil
2027
}
2128

@@ -26,18 +33,10 @@ func NewGoogleSecretsProvider() (secrets.Provider, error) {
2633
// `gcp:secretmanager:projects/{PROJECT_ID}/secrets/{SECRET_NAME}/versions/{VERSION|latest}`
2734
func (sp SecretsProvider) ResolveSecrets(ctx context.Context, vars []string) ([]string, error) {
2835
var envs []string
29-
var sm *secretmanager.Client
30-
var err error
3136
for _, env := range vars {
3237
kv := strings.Split(env, "=")
3338
key, value := kv[0], kv[1]
3439
if strings.HasPrefix(value, "gcp:secretmanager:") {
35-
if sm == nil {
36-
sm, err = secretmanager.NewClient(ctx)
37-
if err != nil {
38-
return nil, errors.Wrap(err, "failed to initialize Google Cloud SDK")
39-
}
40-
}
4140
// construct valid secret name
4241
name := strings.TrimPrefix(value, "gcp:secretmanager:")
4342
// if no version specified add latest
@@ -48,9 +47,9 @@ func (sp SecretsProvider) ResolveSecrets(ctx context.Context, vars []string) ([]
4847
req := &secretspb.AccessSecretVersionRequest{
4948
Name: name,
5049
}
51-
secret, err := sm.AccessSecretVersion(ctx, req)
50+
secret, err := sp.sm.AccessSecretVersion(ctx, req)
5251
if err != nil {
53-
return nil, errors.Wrap(err, "failed to get secret from Google Secret Manager")
52+
return vars, errors.Wrap(err, "failed to get secret from Google Secret Manager")
5453
}
5554
env = key + "=" + string(secret.Payload.GetData())
5655
}

0 commit comments

Comments
 (0)