provider.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. /*
  2. Copyright © The ESO Authors
  3. Licensed under the Apache License, Version 2.0 (the "License");
  4. you may not use this file except in compliance with the License.
  5. You may obtain a copy of the License at
  6. https://www.apache.org/licenses/LICENSE-2.0
  7. Unless required by applicable law or agreed to in writing, software
  8. distributed under the License is distributed on an "AS IS" BASIS,
  9. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  10. See the License for the specific language governing permissions and
  11. limitations under the License.
  12. */
  13. package volcengine
  14. import (
  15. "context"
  16. "errors"
  17. "fmt"
  18. "github.com/volcengine/volcengine-go-sdk/service/kms"
  19. kclient "sigs.k8s.io/controller-runtime/pkg/client"
  20. "sigs.k8s.io/controller-runtime/pkg/webhook/admission"
  21. esv1 "github.com/external-secrets/external-secrets/apis/externalsecrets/v1"
  22. "github.com/external-secrets/external-secrets/runtime/esutils"
  23. )
  24. var _ esv1.Provider = &Provider{}
  25. // Provider implements the actual SecretsClient interface.
  26. type Provider struct{}
  27. // NewClient implements v1.Provider.
  28. func (p *Provider) NewClient(ctx context.Context, store esv1.GenericStore, kube kclient.Client, namespace string) (esv1.SecretsClient, error) {
  29. volcengineProvider, err := getVolcengineProvider(store)
  30. if err != nil {
  31. return nil, err
  32. }
  33. sess, err := NewSession(ctx, volcengineProvider, kube, namespace)
  34. if err != nil {
  35. return nil, err
  36. }
  37. kms := kms.New(sess)
  38. return NewClient(kms), nil
  39. }
  40. // ValidateStore implements v1.Provider.
  41. func (p *Provider) ValidateStore(store esv1.GenericStore) (admission.Warnings, error) {
  42. volcengineProvider, err := getVolcengineProvider(store)
  43. if err != nil {
  44. return nil, err
  45. }
  46. if volcengineProvider.Region == "" {
  47. return nil, fmt.Errorf("region is required")
  48. }
  49. // Use IRSA as auth is not specified.
  50. if volcengineProvider.Auth == nil {
  51. return nil, nil
  52. }
  53. return nil, validateAuthSecretRef(store, volcengineProvider.Auth.SecretRef)
  54. }
  55. // Capabilities implements v1.Provider.
  56. func (p *Provider) Capabilities() esv1.SecretStoreCapabilities {
  57. return esv1.SecretStoreReadOnly
  58. }
  59. // validateAuthSecretRef validates the SecretRef for static credentials.
  60. func validateAuthSecretRef(store esv1.GenericStore, ref *esv1.VolcengineAuthSecretRef) error {
  61. if ref == nil {
  62. return errors.New("SecretRef is required when using static credentials")
  63. }
  64. if err := esutils.ValidateReferentSecretSelector(store, ref.AccessKeyID); err != nil {
  65. return fmt.Errorf("invalid AccessKeyID: %w", err)
  66. }
  67. if err := esutils.ValidateReferentSecretSelector(store, ref.SecretAccessKey); err != nil {
  68. return fmt.Errorf("invalid SecretAccessKey: %w", err)
  69. }
  70. if ref.Token != nil {
  71. if err := esutils.ValidateReferentSecretSelector(store, *ref.Token); err != nil {
  72. return fmt.Errorf("invalid Token: %w", err)
  73. }
  74. }
  75. return nil
  76. }
  77. // getVolcengineProvider gets the VolcengineProvider from the store spec.
  78. func getVolcengineProvider(store esv1.GenericStore) (*esv1.VolcengineProvider, error) {
  79. spec := store.GetSpec()
  80. if spec.Provider == nil || spec.Provider.Volcengine == nil {
  81. return nil, fmt.Errorf("volcengine provider is nil")
  82. }
  83. return spec.Provider.Volcengine, nil
  84. }
  85. // NewProvider creates a new Provider instance.
  86. func NewProvider() esv1.Provider {
  87. return &Provider{}
  88. }
  89. // ProviderSpec returns the provider specification for registration.
  90. func ProviderSpec() *esv1.SecretStoreProvider {
  91. return &esv1.SecretStoreProvider{
  92. Volcengine: &esv1.VolcengineProvider{},
  93. }
  94. }
  95. // MaintenanceStatus returns the maintenance status of the provider.
  96. func MaintenanceStatus() esv1.MaintenanceStatus {
  97. return esv1.MaintenanceStatusMaintained
  98. }