provider.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  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. //
  6. // http://www.apache.org/licenses/LICENSE-2.0
  7. //
  8. // Unless required by applicable law or agreed to in writing, software
  9. // distributed under the License is distributed on an "AS IS" BASIS,
  10. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  11. // See the License for the specific language governing permissions and
  12. // limitations under the License.
  13. // */
  14. package github
  15. import (
  16. "context"
  17. "errors"
  18. "fmt"
  19. "sigs.k8s.io/controller-runtime/pkg/client"
  20. "sigs.k8s.io/controller-runtime/pkg/webhook/admission"
  21. esv1beta1 "github.com/external-secrets/external-secrets/apis/externalsecrets/v1beta1"
  22. )
  23. const (
  24. errUnexpectedStoreSpec = "unexpected store spec"
  25. errInvalidStoreSpec = "invalid store spec"
  26. errInvalidStoreProv = "invalid store provider"
  27. errInvalidGithubProv = "invalid github provider"
  28. errInvalidStore = "invalid store"
  29. errInvalidProvider = "invalid provider"
  30. )
  31. type Provider struct {
  32. }
  33. var _ esv1beta1.Provider = &Provider{}
  34. func init() {
  35. esv1beta1.Register(&Provider{}, &esv1beta1.SecretStoreProvider{
  36. Github: &esv1beta1.GithubProvider{},
  37. })
  38. }
  39. // Capabilities return the provider supported capabilities (ReadOnly, WriteOnly, ReadWrite).
  40. func (p *Provider) Capabilities() esv1beta1.SecretStoreCapabilities {
  41. return esv1beta1.SecretStoreWriteOnly
  42. }
  43. // NewClient constructs a new secrets client based on the provided store.
  44. func (p *Provider) NewClient(ctx context.Context, store esv1beta1.GenericStore, kube client.Client, namespace string) (esv1beta1.SecretsClient, error) {
  45. return newClient(ctx, store, kube, namespace)
  46. }
  47. func newClient(ctx context.Context, store esv1beta1.GenericStore, kube client.Client, namespace string) (esv1beta1.SecretsClient, error) {
  48. provider, err := getProvider(store)
  49. if err != nil {
  50. return nil, err
  51. }
  52. g := &Client{
  53. crClient: kube,
  54. store: store,
  55. namespace: namespace,
  56. provider: provider,
  57. storeKind: store.GetObjectKind().GroupVersionKind().Kind,
  58. }
  59. g.getSecretFn = g.orgGetSecretFn
  60. g.getPublicKeyFn = g.orgGetPublicKeyFn
  61. g.createOrUpdateFn = g.orgCreateOrUpdateSecret
  62. g.listSecretsFn = g.orgListSecretsFn
  63. g.deleteSecretFn = g.orgDeleteSecretsFn
  64. client, err := g.AuthWithPrivateKey(ctx)
  65. if err != nil {
  66. return nil, fmt.Errorf("could not get private key: %w", err)
  67. }
  68. g.baseClient = *client.Actions
  69. if provider.Repository != "" {
  70. g.getSecretFn = g.repoGetSecretFn
  71. g.getPublicKeyFn = g.repoGetPublicKeyFn
  72. g.createOrUpdateFn = g.repoCreateOrUpdateSecret
  73. g.listSecretsFn = g.repoListSecretsFn
  74. g.deleteSecretFn = g.repoDeleteSecretsFn
  75. if provider.Environment != "" {
  76. // For environment to work, we need the repository ID instead of its name.
  77. repository, _, err := client.Repositories.Get(ctx, g.provider.Organization, g.provider.Repository)
  78. if err != nil {
  79. return nil, fmt.Errorf("error fetching repository: %w", err)
  80. }
  81. g.repoID = repository.GetID()
  82. g.getSecretFn = g.envGetSecretFn
  83. g.getPublicKeyFn = g.envGetPublicKeyFn
  84. g.createOrUpdateFn = g.envCreateOrUpdateSecret
  85. g.listSecretsFn = g.envListSecretsFn
  86. g.deleteSecretFn = g.envDeleteSecretsFn
  87. }
  88. }
  89. return g, nil
  90. }
  91. func getProvider(store esv1beta1.GenericStore) (*esv1beta1.GithubProvider, error) {
  92. spc := store.GetSpec()
  93. if spc == nil || spc.Provider.Github == nil {
  94. return nil, errors.New(errUnexpectedStoreSpec)
  95. }
  96. return spc.Provider.Github, nil
  97. }
  98. func (p *Provider) ValidateStore(store esv1beta1.GenericStore) (admission.Warnings, error) {
  99. if store == nil {
  100. return nil, errors.New(errInvalidStore)
  101. }
  102. spc := store.GetSpec()
  103. if spc == nil {
  104. return nil, errors.New(errInvalidStoreSpec)
  105. }
  106. if spc.Provider == nil {
  107. return nil, errors.New(errInvalidStoreProv)
  108. }
  109. prov := spc.Provider.Github
  110. if prov == nil {
  111. return nil, errors.New(errInvalidGithubProv)
  112. }
  113. return nil, nil
  114. }