clusterproviderstore_controller.go 3.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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 providerstore
  14. import (
  15. "context"
  16. "time"
  17. "github.com/go-logr/logr"
  18. corev1 "k8s.io/api/core/v1"
  19. apierrors "k8s.io/apimachinery/pkg/api/errors"
  20. "k8s.io/apimachinery/pkg/runtime"
  21. ctrl "sigs.k8s.io/controller-runtime"
  22. "sigs.k8s.io/controller-runtime/pkg/client"
  23. "sigs.k8s.io/controller-runtime/pkg/controller"
  24. "sigs.k8s.io/controller-runtime/pkg/handler"
  25. esv1alpha1 "github.com/external-secrets/external-secrets/apis/externalsecrets/v1alpha1"
  26. esv2alpha1 "github.com/external-secrets/external-secrets/apis/externalsecrets/v2alpha1"
  27. clusterprovidermetrics "github.com/external-secrets/external-secrets/pkg/controllers/clusterprovider"
  28. )
  29. // ClusterStoreReconciler reconciles ClusterProviderStore resources.
  30. type ClusterStoreReconciler struct {
  31. client.Client
  32. Log logr.Logger
  33. Scheme *runtime.Scheme
  34. RequeueInterval time.Duration
  35. }
  36. // Reconcile validates the referenced runtime and backend for a ClusterProviderStore.
  37. func (r *ClusterStoreReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
  38. start := time.Now()
  39. log := r.Log.WithValues("ClusterProviderStore", req.NamespacedName)
  40. var store esv2alpha1.ClusterProviderStore
  41. if err := r.Get(ctx, req.NamespacedName, &store); err != nil {
  42. if apierrors.IsNotFound(err) {
  43. clusterprovidermetrics.RemoveMetrics(req.Name)
  44. return ctrl.Result{}, nil
  45. }
  46. return ctrl.Result{}, err
  47. }
  48. if store.Spec.BackendRef.Namespace == "" {
  49. if err := assertRuntimeClassReady(ctx, r.Client, store.Spec.RuntimeRef); err != nil {
  50. setReadyCondition(&store, corev1.ConditionFalse, "RuntimeNotReady", err.Error())
  51. } else {
  52. setReadyCondition(&store, corev1.ConditionTrue, "RuntimeReady", "backend namespace resolved per caller namespace")
  53. }
  54. recordClusterProviderStoreCompatibilityMetrics(&store, time.Since(start))
  55. return updateStatus(ctx, r.Status(), &store, r.RequeueInterval, log)
  56. }
  57. if err := validateStore(ctx, r.Client, &store, store.Spec.BackendRef.Namespace); err != nil {
  58. setReadyCondition(&store, corev1.ConditionFalse, "ValidationFailed", err.Error())
  59. recordClusterProviderStoreCompatibilityMetrics(&store, time.Since(start))
  60. return updateStatus(ctx, r.Status(), &store, r.RequeueInterval, log)
  61. }
  62. setReadyCondition(&store, corev1.ConditionTrue, "StoreValid", "store validated")
  63. recordClusterProviderStoreCompatibilityMetrics(&store, time.Since(start))
  64. return updateStatus(ctx, r.Status(), &store, r.RequeueInterval, log)
  65. }
  66. // SetupWithManager registers the ClusterProviderStore controller and runtime-class watches.
  67. func (r *ClusterStoreReconciler) SetupWithManager(mgr ctrl.Manager, opts controller.Options) error {
  68. return ctrl.NewControllerManagedBy(mgr).
  69. WithOptions(opts).
  70. For(&esv2alpha1.ClusterProviderStore{}).
  71. Watches(
  72. &esv1alpha1.ClusterProviderClass{},
  73. handler.EnqueueRequestsFromMapFunc(func(ctx context.Context, obj client.Object) []ctrl.Request {
  74. runtimeClass, ok := obj.(*esv1alpha1.ClusterProviderClass)
  75. if !ok {
  76. return nil
  77. }
  78. return findClusterProviderStoresForRuntimeClass(ctx, r.Client, runtimeClass)
  79. }),
  80. ).
  81. Complete(r)
  82. }