Skip to content

Commit 89b13ee

Browse files
authored
feat: add interface SetSecret in secrets provider (#1433)
1 parent f7a831f commit 89b13ee

8 files changed

Lines changed: 51 additions & 7 deletions

File tree

pkg/secrets/interfaces.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ import (
1010
type SecretStore interface {
1111
// GetSecret retrieves ref secret from various cloud secret manager.
1212
GetSecret(ctx context.Context, ref v1.ExternalSecretRef) ([]byte, error)
13+
// SetSecret sets ref secret to various cloud secret manager.
14+
SetSecret(ctx context.Context, ref v1.ExternalSecretRef, data []byte) error
1315
}
1416

1517
// SecretStoreProvider is a factory type for secret store.

pkg/secrets/providers/alicloud/secretsmanager/secretsmanager.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import (
66
"os"
77
"strings"
88

9-
"kusionstack.io/kusion/pkg/apis/api.kusion.io/v1"
9+
v1 "kusionstack.io/kusion/pkg/apis/api.kusion.io/v1"
1010
"kusionstack.io/kusion/pkg/secrets"
1111

1212
"github.com/aliyun/aliyun-secretsmanager-client-go/sdk"
@@ -19,6 +19,7 @@ const (
1919
errMissingProviderSpec = "store spec is missing provider"
2020
errMissingAlicloudProvider = "invalid provider spec. Missing Alicloud field in store provider spec"
2121
errFailedToCreateClient = "failed to create Alicloud Secrets Manager client: %w"
22+
errMethodNotImplemented = "method not implemented. secret provider: %s, method: %s"
2223
)
2324

2425
var (
@@ -91,6 +92,11 @@ func (s *smSecretStore) GetSecret(ctx context.Context, ref v1.ExternalSecretRef)
9192
return []byte(val.String()), nil
9293
}
9394

95+
// SetSecret stores ref secret value to Alicloud Secrets Manager.
96+
func (s *smSecretStore) SetSecret(ctx context.Context, ref v1.ExternalSecretRef, secretValue []byte) error {
97+
return fmt.Errorf(errMethodNotImplemented, "Alicloud Secrets Manager", "SetSecret")
98+
}
99+
94100
func (s *smSecretStore) convertSecretToGjson(secretInfo *models.SecretInfo, refProperty string) gjson.Result {
95101
var payload string
96102
if secretInfo.SecretValue != "" {

pkg/secrets/providers/aws/secretsmanager/secretsmanager.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import (
1010
"github.com/aws/aws-sdk-go-v2/service/secretsmanager/types"
1111
"github.com/tidwall/gjson"
1212

13-
"kusionstack.io/kusion/pkg/apis/api.kusion.io/v1"
13+
v1 "kusionstack.io/kusion/pkg/apis/api.kusion.io/v1"
1414
"kusionstack.io/kusion/pkg/secrets"
1515
"kusionstack.io/kusion/pkg/secrets/providers/aws/auth"
1616
)
@@ -19,6 +19,7 @@ const (
1919
errMissingProviderSpec = "store spec is missing provider"
2020
errMissingAWSProvider = "invalid provider spec. Missing AWS field in store provider spec"
2121
errFailedToCreateSession = "failed to create usable AWS session: %w"
22+
errMethodNotImplemented = "method not implemented. secret provider: %s, method: %s"
2223
)
2324

2425
// DefaultSecretStoreProvider should implement the secrets.SecretStoreProvider interface
@@ -80,6 +81,11 @@ func (s *smSecretStore) GetSecret(ctx context.Context, ref v1.ExternalSecretRef)
8081
return []byte(val.String()), nil
8182
}
8283

84+
// SetSecret sets ref secret value to AWS Secrets Manager.
85+
func (s *smSecretStore) SetSecret(ctx context.Context, ref v1.ExternalSecretRef, secretValue []byte) error {
86+
return fmt.Errorf(errMethodNotImplemented, "AWS Secret Manager", "SetSecret")
87+
}
88+
8389
// buildGetSecretValueInput constructs target GetSecretValueInput request with specific external secret ref.
8490
func (s *smSecretStore) buildGetSecretValueInput(ref v1.ExternalSecretRef) *secretsmanager.GetSecretValueInput {
8591
version := "AWSCURRENT"

pkg/secrets/providers/azure/keyvault/keyvault.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import (
1313
"github.com/Azure/go-autorest/autorest/azure/auth"
1414
"github.com/tidwall/gjson"
1515

16-
"kusionstack.io/kusion/pkg/apis/api.kusion.io/v1"
16+
v1 "kusionstack.io/kusion/pkg/apis/api.kusion.io/v1"
1717
"kusionstack.io/kusion/pkg/secrets"
1818
)
1919

@@ -27,6 +27,7 @@ const (
2727
errMissingClientIDSecret = "cannot read clientID/clientSecret from environment variables"
2828
errPropertyNotExist = "property %s does not exist in key %s"
2929
errUnknownObjectType = "unknown Azure KeyVault object Type for %s"
30+
errMethodNotImplemented = "method not implemented. secret provider: %s, method: %s"
3031
)
3132

3233
// DefaultSecretStoreProvider should implement the secrets.SecretStoreProvider interface
@@ -155,6 +156,11 @@ func (k *kvSecretStore) GetSecret(ctx context.Context, ref v1.ExternalSecretRef)
155156
return nil, fmt.Errorf(errUnknownObjectType, secretName)
156157
}
157158

159+
// SetSecret sets ref secret value to Azure KeyVault.
160+
func (k *kvSecretStore) SetSecret(ctx context.Context, ref v1.ExternalSecretRef, secretValue []byte) error {
161+
return fmt.Errorf(errMethodNotImplemented, "Azure KeyVault", "SetSecret")
162+
}
163+
158164
// Retrieves a property value if specified and the secret value if not.
159165
func getProperty(secret, property, key string) ([]byte, error) {
160166
if property == "" {

pkg/secrets/providers/fake/fake.go

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

1313
const (
14-
errMissingProviderSpec = "secret store spec is missing provider"
15-
errMissingFakeProvider = "invalid provider spec. Missing Fake field in secret store provider spec"
14+
errMissingProviderSpec = "secret store spec is missing provider"
15+
errMissingFakeProvider = "invalid provider spec. Missing Fake field in secret store provider spec"
16+
errMethodNotImplemented = "method not implemented. secret provider: %s, method: %s"
1617
)
1718

1819
type SecretData struct {
@@ -77,6 +78,11 @@ func (f *fakeSecretStore) GetSecret(_ context.Context, ref v1.ExternalSecretRef)
7778
return []byte(data.Value), nil
7879
}
7980

81+
// SetSecret sets ref secret value to backend data map.
82+
func (f *fakeSecretStore) SetSecret(ctx context.Context, ref v1.ExternalSecretRef, secretValue []byte) error {
83+
return fmt.Errorf(errMethodNotImplemented, "fake", "SetSecret")
84+
}
85+
8086
func mapKey(key, version string) string {
8187
// Add the version suffix to preserve entries with the old versions as well.
8288
return fmt.Sprintf("%v%v", key, version)

pkg/secrets/providers/hashivault/vault.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import (
1313
vault "github.com/hashicorp/vault/api"
1414
"github.com/tidwall/gjson"
1515

16-
"kusionstack.io/kusion/pkg/apis/api.kusion.io/v1"
16+
v1 "kusionstack.io/kusion/pkg/apis/api.kusion.io/v1"
1717
"kusionstack.io/kusion/pkg/secrets"
1818
)
1919

@@ -26,6 +26,7 @@ const (
2626
errDataPropertyFormat = "unexpected data format %s for property field: %s"
2727
errSecretFormat = "cannot find property %s in secret data"
2828
errBuildVaultClient = "failed to new Vault client: %w"
29+
errMethodNotImplemented = "method not implemented. secret provider: %s, method: %s"
2930
)
3031

3132
// DefaultSecretStoreProvider should implement the secrets.SecretStoreProvider interface
@@ -120,6 +121,11 @@ func (v *vaultSecretStore) GetSecret(ctx context.Context, ref v1.ExternalSecretR
120121
return []byte(val.String()), nil
121122
}
122123

124+
// SetSecret sets ref secret value to Vault server.
125+
func (v *vaultSecretStore) SetSecret(ctx context.Context, ref v1.ExternalSecretRef, value []byte) error {
126+
return fmt.Errorf(errMethodNotImplemented, "vault", "SetSecret")
127+
}
128+
123129
func (v *vaultSecretStore) readSecret(ctx context.Context, path, version string) (map[string]interface{}, error) {
124130
// build correct path according to vault docs for v1 and v2 API
125131
secretPath := v.buildPath(path)

pkg/secrets/providers/viettelcloud/secretsmanager/secretsmanager.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ const (
2222
errMissingProviderSpec = "store spec is missing provider"
2323
errMissingViettelCloudProvider = "invalid provider spec. Missing ViettelCloud field in store provider spec"
2424
errFailedToCreateClient = "failed to create ViettelCloud Secrets Manager client: %w"
25+
errMethodNotImplemented = "method not implemented. secret provider: %s, method: %s"
2526
)
2627

2728
var (
@@ -86,6 +87,7 @@ func (p *DefaultSecretStoreProvider) NewSecretStore(spec *v1.SecretStore) (secre
8687
}, nil
8788
}
8889

90+
// GetSecret retrieves a secret from the ViettelCloud secret store.
8991
func (s *smSecretStore) GetSecret(ctx context.Context, ref v1.ExternalSecretRef) ([]byte, error) {
9092
secretResponse, err := s.client.SecretManagerSecretsRetrieveWithResponse(ctx, ref.Name, &vclient.SecretManagerSecretsRetrieveParams{
9193
ProjectID: s.projectID,
@@ -115,6 +117,11 @@ func (s *smSecretStore) GetSecret(ctx context.Context, ref v1.ExternalSecretRef)
115117
return []byte(val.String()), nil
116118
}
117119

120+
// SetSecret sets a secret to the ViettelCloud secret store.
121+
func (s *smSecretStore) SetSecret(ctx context.Context, ref v1.ExternalSecretRef, secretValue []byte) error {
122+
return fmt.Errorf(errMethodNotImplemented, "ViettelCloud", "SetSecret")
123+
}
124+
118125
func (s *smSecretStore) convertSecretToGjson(secretInfo *vclient.SecretRetrieve, refProperty string) gjson.Result {
119126
var payload string
120127
if secretInfo.Secret != nil {

pkg/secrets/providers_test.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import (
66

77
"github.com/stretchr/testify/assert"
88

9-
"kusionstack.io/kusion/pkg/apis/api.kusion.io/v1"
9+
v1 "kusionstack.io/kusion/pkg/apis/api.kusion.io/v1"
1010
)
1111

1212
// FakeSecretStore is the fake implementation of SecretStore.
@@ -17,6 +17,11 @@ func (fss *FakeSecretStore) GetSecret(_ context.Context, _ v1.ExternalSecretRef)
1717
return []byte("NOOP"), nil
1818
}
1919

20+
// Fake implementation of SecretStore.SetSecret.
21+
func (fss *FakeSecretStore) SetSecret(_ context.Context, _ v1.ExternalSecretRef, _ []byte) error {
22+
return nil
23+
}
24+
2025
// FakeSecretStoreProvider is the fake implementation of SecretStoreProvider.
2126
type FakeSecretStoreProvider struct{}
2227

0 commit comments

Comments
 (0)