provider.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. /*
  2. Licensed under the Apache License, Version 2.0 (the "License");
  3. you may not use this file except in compliance with the License.
  4. You may obtain a copy of the License at
  5. http://www.apache.org/licenses/LICENSE-2.0
  6. Unless required by applicable law or agreed to in writing, software
  7. distributed under the License is distributed on an "AS IS" BASIS,
  8. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  9. See the License for the specific language governing permissions and
  10. limitations under the License.
  11. */
  12. package previder
  13. import (
  14. "context"
  15. "errors"
  16. "fmt"
  17. previderclient "github.com/previder/vault-cli/pkg"
  18. corev1 "k8s.io/api/core/v1"
  19. "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/pkg/utils/resolvers"
  23. )
  24. const (
  25. errNotImplemented = "not implemented"
  26. )
  27. var _ esv1.Provider = &SecretManager{}
  28. type SecretManager struct {
  29. VaultClient previderclient.PreviderVaultClient
  30. }
  31. func init() {
  32. esv1.Register(&SecretManager{}, &esv1.SecretStoreProvider{
  33. Previder: &esv1.PreviderProvider{},
  34. }, esv1.MaintenanceStatusMaintained)
  35. }
  36. func (s *SecretManager) NewClient(ctx context.Context, store esv1.GenericStore, kube client.Client, namespace string) (esv1.SecretsClient, error) {
  37. if store == nil {
  38. return nil, fmt.Errorf("secret store not found: %v", "nil store")
  39. }
  40. storeSpec := store.GetSpec().Provider.Previder
  41. storeKind := store.GetObjectKind().GroupVersionKind().Kind
  42. accessToken, err := resolvers.SecretKeyRef(ctx, kube, storeKind, namespace, &storeSpec.Auth.SecretRef.AccessToken)
  43. if err != nil {
  44. return nil, fmt.Errorf(accessToken, err)
  45. }
  46. s.VaultClient, err = previderclient.NewVaultClient(storeSpec.BaseURI, accessToken)
  47. if err != nil {
  48. return nil, err
  49. }
  50. return s, nil
  51. }
  52. func (s *SecretManager) ValidateStore(store esv1.GenericStore) (admission.Warnings, error) {
  53. storeSpec := store.GetSpec()
  54. previderSpec := storeSpec.Provider.Previder
  55. if previderSpec == nil {
  56. return nil, errors.New("missing Previder spec")
  57. }
  58. if previderSpec.Auth.SecretRef == nil {
  59. return nil, errors.New("missing Previder Auth SecretRef")
  60. }
  61. accessToken := previderSpec.Auth.SecretRef.AccessToken
  62. if accessToken.Name == "" {
  63. return nil, errors.New("missing Previder accessToken name")
  64. }
  65. if accessToken.Key == "" {
  66. return nil, errors.New("missing Previder accessToken key")
  67. }
  68. return nil, nil
  69. }
  70. func (s *SecretManager) Capabilities() esv1.SecretStoreCapabilities {
  71. return esv1.SecretStoreReadOnly
  72. }
  73. func (s *SecretManager) GetSecret(ctx context.Context, ref esv1.ExternalSecretDataRemoteRef) ([]byte, error) {
  74. secret, err := s.VaultClient.DecryptSecret(ref.Key)
  75. if err != nil {
  76. return nil, err
  77. }
  78. return []byte(secret.Secret), nil
  79. }
  80. func (s *SecretManager) PushSecret(ctx context.Context, secret *corev1.Secret, data esv1.PushSecretData) error {
  81. return errors.New(errNotImplemented)
  82. }
  83. func (s *SecretManager) DeleteSecret(ctx context.Context, remoteRef esv1.PushSecretRemoteRef) error {
  84. return errors.New(errNotImplemented)
  85. }
  86. func (s *SecretManager) SecretExists(ctx context.Context, remoteRef esv1.PushSecretRemoteRef) (bool, error) {
  87. return false, errors.New(errNotImplemented)
  88. }
  89. func (s *SecretManager) Validate() (esv1.ValidationResult, error) {
  90. _, err := s.VaultClient.GetSecrets()
  91. if err != nil {
  92. return esv1.ValidationResultError, err
  93. }
  94. return esv1.ValidationResultReady, nil
  95. }
  96. func (s *SecretManager) GetSecretMap(ctx context.Context, ref esv1.ExternalSecretDataRemoteRef) (map[string][]byte, error) {
  97. secrets, err := s.GetSecret(ctx, ref)
  98. if err != nil {
  99. return nil, err
  100. }
  101. secretData := make(map[string][]byte)
  102. secretData[ref.Key] = secrets
  103. return secretData, nil
  104. }
  105. func (s *SecretManager) GetAllSecrets(ctx context.Context, ref esv1.ExternalSecretFind) (map[string][]byte, error) {
  106. return nil, errors.New(errNotImplemented)
  107. }
  108. func (s *SecretManager) Close(ctx context.Context) error {
  109. return nil
  110. }