From cb1f8cc6110309b2906d7681b54c2a5654dfe3cd Mon Sep 17 00:00:00 2001 From: Joshua Gilman Date: Fri, 13 Sep 2024 09:05:19 -0700 Subject: [PATCH] feat: adds env secret provider (#38) --- forge/cli/pkg/secrets/client.go | 9 ++-- forge/cli/pkg/secrets/providers.go | 3 +- forge/cli/pkg/secrets/providers/env.go | 32 ++++++++++++ forge/cli/pkg/secrets/providers/env_test.go | 57 +++++++++++++++++++++ 4 files changed, 97 insertions(+), 4 deletions(-) create mode 100644 forge/cli/pkg/secrets/providers/env.go create mode 100644 forge/cli/pkg/secrets/providers/env_test.go diff --git a/forge/cli/pkg/secrets/client.go b/forge/cli/pkg/secrets/client.go index 88563639..376e0d0a 100644 --- a/forge/cli/pkg/secrets/client.go +++ b/forge/cli/pkg/secrets/client.go @@ -16,12 +16,15 @@ type SecretStore struct { func NewDefaultSecretStore() SecretStore { return SecretStore{ store: map[Provider]func(*slog.Logger) (SecretProvider, error){ - ProviderLocal: func(logger *slog.Logger) (SecretProvider, error) { - return providers.NewLocalClient(logger) - }, ProviderAWS: func(logger *slog.Logger) (SecretProvider, error) { return providers.NewDefaultAWSClient(logger) }, + ProviderEnv: func(logger *slog.Logger) (SecretProvider, error) { + return providers.NewEnvClient(logger) + }, + ProviderLocal: func(logger *slog.Logger) (SecretProvider, error) { + return providers.NewLocalClient(logger) + }, }, } } diff --git a/forge/cli/pkg/secrets/providers.go b/forge/cli/pkg/secrets/providers.go index 420e3dcd..50164f17 100644 --- a/forge/cli/pkg/secrets/providers.go +++ b/forge/cli/pkg/secrets/providers.go @@ -3,6 +3,7 @@ package secrets type Provider string const ( - ProviderLocal Provider = "local" ProviderAWS Provider = "aws" + ProviderEnv Provider = "env" + ProviderLocal Provider = "local" ) diff --git a/forge/cli/pkg/secrets/providers/env.go b/forge/cli/pkg/secrets/providers/env.go new file mode 100644 index 00000000..bb9635da --- /dev/null +++ b/forge/cli/pkg/secrets/providers/env.go @@ -0,0 +1,32 @@ +package providers + +import ( + "fmt" + "log/slog" + "os" +) + +type EnvClient struct { + logger *slog.Logger +} + +func NewEnvClient(logger *slog.Logger) (*EnvClient, error) { + return &EnvClient{ + logger: logger, + }, nil +} + +func (c *EnvClient) Get(key string) (string, error) { + c.logger.Debug("Getting secret from environment variable", "key", key) + + secret, ok := os.LookupEnv(key) + if !ok { + return "", fmt.Errorf("enviroment variable %s not found", key) + } + + return secret, nil +} + +func (c *EnvClient) Set(key, value string) (string, error) { + panic("not implemented") +} diff --git a/forge/cli/pkg/secrets/providers/env_test.go b/forge/cli/pkg/secrets/providers/env_test.go new file mode 100644 index 00000000..16f6a754 --- /dev/null +++ b/forge/cli/pkg/secrets/providers/env_test.go @@ -0,0 +1,57 @@ +package providers + +import ( + "os" + "testing" + + "github.com/input-output-hk/catalyst-forge/tools/pkg/testutils" + "github.com/stretchr/testify/assert" +) + +func TestEnvClientGet(t *testing.T) { + tests := []struct { + name string + key string + env map[string]string + expect string + expectErr bool + expectedErr string + }{ + { + name: "simple", + key: "FOO", + env: map[string]string{ + "FOO": "secret", + }, + expect: "secret", + expectErr: false, + expectedErr: "", + }, + { + name: "secret not found", + key: "BAR", + env: map[string]string{}, + expect: "", + expectErr: true, + expectedErr: "enviroment variable BAR not found", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + client := &EnvClient{ + logger: testutils.NewNoopLogger(), + } + + for k, v := range tt.env { + _ = os.Setenv(k, v) + } + + got, err := client.Get(tt.key) + if testutils.AssertError(t, err, tt.expectErr, tt.expectedErr) { + return + } + assert.Equal(t, tt.expect, got) + }) + } +}