Skip to content

Commit

Permalink
feat: adds env secret provider (#38)
Browse files Browse the repository at this point in the history
  • Loading branch information
jmgilman authored Sep 13, 2024
1 parent 343baf6 commit cb1f8cc
Show file tree
Hide file tree
Showing 4 changed files with 97 additions and 4 deletions.
9 changes: 6 additions & 3 deletions forge/cli/pkg/secrets/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
},
},
}
}
Expand Down
3 changes: 2 additions & 1 deletion forge/cli/pkg/secrets/providers.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package secrets
type Provider string

const (
ProviderLocal Provider = "local"
ProviderAWS Provider = "aws"
ProviderEnv Provider = "env"
ProviderLocal Provider = "local"
)
32 changes: 32 additions & 0 deletions forge/cli/pkg/secrets/providers/env.go
Original file line number Diff line number Diff line change
@@ -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")
}
57 changes: 57 additions & 0 deletions forge/cli/pkg/secrets/providers/env_test.go
Original file line number Diff line number Diff line change
@@ -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)
})
}
}

0 comments on commit cb1f8cc

Please sign in to comment.