From bf54acb74db2ff2348173e2f881eff1f47f6cbd7 Mon Sep 17 00:00:00 2001
From: yetone <yetoneful@gmail.com>
Date: Mon, 16 Oct 2023 15:52:12 +0800
Subject: [PATCH] fix: use cached secrets and configmaps (#127)

---
 controllers/bentodeployment_controller.go | 176 ++++++++++++++++------
 go.mod                                    |  16 +-
 go.sum                                    |  32 ++--
 main.go                                   |   6 +-
 4 files changed, 157 insertions(+), 73 deletions(-)

diff --git a/controllers/bentodeployment_controller.go b/controllers/bentodeployment_controller.go
index 20f59c9..0e100e3 100644
--- a/controllers/bentodeployment_controller.go
+++ b/controllers/bentodeployment_controller.go
@@ -51,10 +51,14 @@ import (
 	"k8s.io/client-go/tools/record"
 	"k8s.io/utils/pointer"
 	ctrl "sigs.k8s.io/controller-runtime"
+	"sigs.k8s.io/controller-runtime/pkg/builder"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/client/config"
+	"sigs.k8s.io/controller-runtime/pkg/handler"
 	"sigs.k8s.io/controller-runtime/pkg/log"
 	"sigs.k8s.io/controller-runtime/pkg/predicate"
+	"sigs.k8s.io/controller-runtime/pkg/reconcile"
+	"sigs.k8s.io/controller-runtime/pkg/source"
 
 	"github.com/bentoml/yatai-schemas/modelschemas"
 	"github.com/bentoml/yatai-schemas/schemasv1"
@@ -192,7 +196,7 @@ func (r *BentoDeploymentReconciler) Reconcile(ctx context.Context, req ctrl.Requ
 		}
 	}()
 
-	yataiClient, clusterName, err := getYataiClient(ctx)
+	yataiClient, clusterName, err := r.getYataiClient(ctx)
 	if err != nil {
 		err = errors.Wrap(err, "get yatai client")
 		return
@@ -286,14 +290,30 @@ func (r *BentoDeploymentReconciler) Reconcile(ctx context.Context, req ctrl.Requ
 		if err != nil {
 			return
 		}
-		bentoAvailableCondition := meta.FindStatusCondition(bentoRequest.Status.Conditions, resourcesv1alpha1.BentoRequestConditionTypeBentoAvailable)
-		if bentoAvailableCondition != nil && bentoAvailableCondition.Status == metav1.ConditionFalse {
-			err = errors.Errorf("BentoRequest %s/%s is not available: %s", bentoRequest.Namespace, bentoRequest.Name, bentoAvailableCondition.Message)
+		bentoRequestAvailableCondition := meta.FindStatusCondition(bentoRequest.Status.Conditions, resourcesv1alpha1.BentoRequestConditionTypeBentoAvailable)
+		if bentoRequestAvailableCondition != nil && bentoRequestAvailableCondition.Status == metav1.ConditionFalse {
+			err = errors.Errorf("BentoRequest %s/%s is not available: %s", bentoRequest.Namespace, bentoRequest.Name, bentoRequestAvailableCondition.Message)
+			r.Recorder.Eventf(bentoDeployment, corev1.EventTypeWarning, "GetBentoRequest", err.Error())
+			_, err_ := r.setStatusConditions(ctx, req,
+				metav1.Condition{
+					Type:    servingv2alpha1.BentoDeploymentConditionTypeBentoFound,
+					Status:  metav1.ConditionFalse,
+					Reason:  "Reconciling",
+					Message: err.Error(),
+				},
+				metav1.Condition{
+					Type:    servingv2alpha1.BentoDeploymentConditionTypeAvailable,
+					Status:  metav1.ConditionFalse,
+					Reason:  "Reconciling",
+					Message: err.Error(),
+				},
+			)
+			if err_ != nil {
+				err = err_
+				return
+			}
 			return
 		}
-		result = ctrl.Result{
-			RequeueAfter: 10 * time.Second,
-		}
 		return
 	} else {
 		if bentoFoundCondition != nil && bentoFoundCondition.Status != metav1.ConditionTrue {
@@ -614,15 +634,15 @@ func (r *BentoDeploymentReconciler) setStatusConditions(ctx context.Context, req
 	return
 }
 
-func getYataiClient(ctx context.Context) (yataiClient **yataiclient.YataiClient, clusterName *string, err error) {
-	restConfig := config.GetConfigOrDie()
-	clientset, err := kubernetes.NewForConfig(restConfig)
-	if err != nil {
-		err = errors.Wrap(err, "create kubernetes clientset")
-		return
-	}
-
-	yataiConf, err := commonconfig.GetYataiConfig(ctx, clientset, commonconsts.YataiDeploymentComponentName, false)
+func (r *BentoDeploymentReconciler) getYataiClient(ctx context.Context) (yataiClient **yataiclient.YataiClient, clusterName *string, err error) {
+	yataiConf, err := commonconfig.GetYataiConfig(ctx, func(ctx context.Context, namespace, name string) (*corev1.Secret, error) {
+		secret := &corev1.Secret{}
+		err = r.Get(ctx, types.NamespacedName{
+			Namespace: namespace,
+			Name:      name,
+		}, secret)
+		return secret, errors.Wrap(err, "get secret")
+	}, commonconsts.YataiDeploymentComponentName, false)
 	isNotFound := k8serrors.IsNotFound(err)
 	if err != nil && !isNotFound {
 		err = errors.Wrap(err, "get yatai config")
@@ -2721,7 +2741,14 @@ func (r *BentoDeploymentReconciler) generateDefaultHostname(ctx context.Context,
 		return "", errors.Wrapf(err, "create kubernetes clientset")
 	}
 
-	domainSuffix, err := system.GetDomainSuffix(ctx, clientset)
+	domainSuffix, err := system.GetDomainSuffix(ctx, func(ctx context.Context, namespace, name string) (*corev1.ConfigMap, error) {
+		configmap := &corev1.ConfigMap{}
+		err := r.Get(ctx, types.NamespacedName{
+			Namespace: namespace,
+			Name:      name,
+		}, configmap)
+		return configmap, errors.Wrap(err, "get configmap")
+	}, clientset)
 	if err != nil {
 		return "", errors.Wrapf(err, "get domain suffix")
 	}
@@ -2735,8 +2762,15 @@ type IngressConfig struct {
 	PathType    networkingv1.PathType
 }
 
-func GetIngressConfig(ctx context.Context, cliset *kubernetes.Clientset) (ingressConfig *IngressConfig, err error) {
-	configMap, err := system.GetNetworkConfigConfigMap(ctx, cliset)
+func (r *BentoDeploymentReconciler) GetIngressConfig(ctx context.Context) (ingressConfig *IngressConfig, err error) {
+	configMap, err := system.GetNetworkConfigConfigMap(ctx, func(ctx context.Context, namespace, name string) (*corev1.ConfigMap, error) {
+		configmap := &corev1.ConfigMap{}
+		err := r.Get(ctx, types.NamespacedName{
+			Namespace: namespace,
+			Name:      name,
+		}, configmap)
+		return configmap, errors.Wrap(err, "get network config configmap")
+	})
 	if err != nil {
 		err = errors.Wrapf(err, "failed to get configmap %s", commonconsts.KubeConfigMapNameNetworkConfig)
 		return
@@ -2832,14 +2866,7 @@ more_set_headers "X-Yatai-Bento: %s";
 
 	kubeNs := bentoDeployment.Namespace
 
-	restConfig := config.GetConfigOrDie()
-	clientset, err := kubernetes.NewForConfig(restConfig)
-	if err != nil {
-		err = errors.Wrapf(err, "create kubernetes clientset")
-		return
-	}
-
-	ingressConfig, err := GetIngressConfig(ctx, clientset)
+	ingressConfig, err := r.GetIngressConfig(ctx)
 	if err != nil {
 		err = errors.Wrapf(err, "get ingress config")
 		return
@@ -2927,14 +2954,14 @@ func (r *BentoDeploymentReconciler) doCleanUpAbandonedRunnerServices() error {
 	ctx, cancel := context.WithTimeout(context.TODO(), time.Minute*10)
 	defer cancel()
 
-	restConf := config.GetConfigOrDie()
-	cliset, err := kubernetes.NewForConfig(restConf)
-	if err != nil {
-		err = errors.Wrapf(err, "create kubernetes client for %s", restConf.Host)
-		return err
-	}
-
-	bentoDeploymentNamespaces, err := commonconfig.GetBentoDeploymentNamespaces(ctx, cliset)
+	bentoDeploymentNamespaces, err := commonconfig.GetBentoDeploymentNamespaces(ctx, func(ctx context.Context, namespace, name string) (*corev1.Secret, error) {
+		secret := &corev1.Secret{}
+		err := r.Get(ctx, types.NamespacedName{
+			Namespace: namespace,
+			Name:      name,
+		}, secret)
+		return secret, errors.Wrap(err, "get secret")
+	})
 	if err != nil {
 		err = errors.Wrapf(err, "get bento deployment namespaces")
 		return err
@@ -3001,7 +3028,7 @@ func (r *BentoDeploymentReconciler) doRegisterYataiComponent() (err error) {
 	defer cancel()
 
 	logs.Info("getting yatai client")
-	yataiClient, clusterName, err := getYataiClient(ctx)
+	yataiClient, clusterName, err := r.getYataiClient(ctx)
 	if err != nil {
 		err = errors.Wrap(err, "get yatai client")
 		return
@@ -3014,14 +3041,14 @@ func (r *BentoDeploymentReconciler) doRegisterYataiComponent() (err error) {
 
 	yataiClient_ := *yataiClient
 
-	restConf := config.GetConfigOrDie()
-	cliset, err := kubernetes.NewForConfig(restConf)
-	if err != nil {
-		err = errors.Wrapf(err, "create kubernetes client for %s", restConf.Host)
-		return
-	}
-
-	namespace, err := commonconfig.GetYataiDeploymentNamespace(ctx, cliset)
+	namespace, err := commonconfig.GetYataiDeploymentNamespace(ctx, func(ctx context.Context, namespace, name string) (*corev1.Secret, error) {
+		secret := &corev1.Secret{}
+		err := r.Get(ctx, types.NamespacedName{
+			Namespace: namespace,
+			Name:      name,
+		}, secret)
+		return secret, errors.Wrap(err, "get secret")
+	})
 	if err != nil {
 		err = errors.Wrap(err, "get yatai deployment namespace")
 		return
@@ -3077,19 +3104,72 @@ func (r *BentoDeploymentReconciler) SetupWithManager(mgr ctrl.Manager) error {
 		logs.Info("yatai component registration is disabled")
 	}
 
-	pred := predicate.GenerationChangedPredicate{}
 	m := ctrl.NewControllerManagedBy(mgr).
-		For(&servingv2alpha1.BentoDeployment{}).
+		For(&servingv2alpha1.BentoDeployment{}, builder.WithPredicates(predicate.GenerationChangedPredicate{})).
 		Owns(&appsv1.Deployment{}).
 		Owns(&corev1.Service{}).
-		Owns(&networkingv1.Ingress{})
+		Owns(&networkingv1.Ingress{}).
+		Watches(&source.Kind{Type: &resourcesv1alpha1.BentoRequest{}}, handler.EnqueueRequestsFromMapFunc(func(bentoRequest client.Object) []reconcile.Request {
+			reqs := make([]reconcile.Request, 0)
+			logs := log.Log.WithValues("func", "Watches", "kind", "BentoRequest", "name", bentoRequest.GetName(), "namespace", bentoRequest.GetNamespace())
+			bento := &resourcesv1alpha1.Bento{}
+			err := r.Get(context.Background(), types.NamespacedName{
+				Name:      bentoRequest.GetName(),
+				Namespace: bentoRequest.GetNamespace(),
+			}, bento)
+			bentoIsNotFound := k8serrors.IsNotFound(err)
+			if err != nil && !bentoIsNotFound {
+				logs.Info("Failed to get bento", "name", bentoRequest.GetName(), "namespace", bentoRequest.GetNamespace())
+				return reqs
+			}
+			if !bentoIsNotFound {
+				return reqs
+			}
+			bentoDeployments := &servingv2alpha1.BentoDeploymentList{}
+			err = r.List(context.Background(), bentoDeployments, &client.ListOptions{
+				Namespace: bentoRequest.GetNamespace(),
+			})
+			if err != nil {
+				logs.Info("Failed to list bentoDeployments")
+				return reqs
+			}
+			for _, bentoDeployment := range bentoDeployments.Items {
+				bentoDeployment := bentoDeployment
+				if bentoDeployment.Spec.Bento == bentoRequest.GetName() {
+					reqs = append(reqs, reconcile.Request{
+						NamespacedName: client.ObjectKeyFromObject(&bentoDeployment),
+					})
+				}
+			}
+			return reqs
+		})).
+		Watches(&source.Kind{Type: &resourcesv1alpha1.Bento{}}, handler.EnqueueRequestsFromMapFunc(func(bento client.Object) []reconcile.Request {
+			logs := log.Log.WithValues("func", "Watches", "kind", "Bento", "name", bento.GetName(), "namespace", bento.GetNamespace())
+			bentoDeployments := &servingv2alpha1.BentoDeploymentList{}
+			err := r.List(context.Background(), bentoDeployments, &client.ListOptions{
+				Namespace: bento.GetNamespace(),
+			})
+			if err != nil {
+				logs.Info("Failed to list bentoDeployments")
+			}
+			reqs := make([]reconcile.Request, 0)
+			for _, bentoDeployment := range bentoDeployments.Items {
+				bentoDeployment := bentoDeployment
+				if bentoDeployment.Spec.Bento == bento.GetName() {
+					reqs = append(reqs, reconcile.Request{
+						NamespacedName: client.ObjectKeyFromObject(&bentoDeployment),
+					})
+				}
+			}
+			return reqs
+		}))
 
 	if r.requireLegacyHPA() {
 		m.Owns(&autoscalingv2beta2.HorizontalPodAutoscaler{})
 	} else {
 		m.Owns(&autoscalingv2.HorizontalPodAutoscaler{})
 	}
-	return m.WithEventFilter(pred).Complete(r)
+	return m.Complete(r)
 }
 
 func TransformToOldHPA(hpa *servingv2alpha1.Autoscaling) (oldHpa *modelschemas.DeploymentTargetHPAConf, err error) {
diff --git a/go.mod b/go.mod
index 859eb58..0292e6a 100644
--- a/go.mod
+++ b/go.mod
@@ -5,7 +5,7 @@ go 1.19
 require (
 	github.com/aquasecurity/go-pep440-version v0.0.0-20210121094942-22b2f8951d46
 	github.com/banzaicloud/k8s-objectmatcher v1.8.0
-	github.com/bentoml/yatai-common v0.0.0-20230110044251-1eb442339c38
+	github.com/bentoml/yatai-common v0.0.0-20231016054533-fb836e058cfb
 	github.com/bentoml/yatai-image-builder v1.1.4
 	github.com/bentoml/yatai-schemas v0.0.0-20230418023541-71c74442a90f
 	github.com/huandu/xstrings v1.3.2
@@ -72,15 +72,15 @@ require (
 	go.uber.org/atomic v1.9.0 // indirect
 	go.uber.org/multierr v1.8.0 // indirect
 	go.uber.org/zap v1.21.0 // indirect
-	golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29 // indirect
-	golang.org/x/mod v0.7.0 // indirect
-	golang.org/x/net v0.7.0 // indirect
+	golang.org/x/crypto v0.14.0 // indirect
+	golang.org/x/mod v0.8.0 // indirect
+	golang.org/x/net v0.17.0 // indirect
 	golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783 // indirect
-	golang.org/x/sys v0.5.0 // indirect
-	golang.org/x/term v0.5.0 // indirect
-	golang.org/x/text v0.7.0 // indirect
+	golang.org/x/sys v0.13.0 // indirect
+	golang.org/x/term v0.13.0 // indirect
+	golang.org/x/text v0.13.0 // indirect
 	golang.org/x/time v0.0.0-20220609170525-579cf78fd858 // indirect
-	golang.org/x/tools v0.4.0 // indirect
+	golang.org/x/tools v0.6.0 // indirect
 	golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f // indirect
 	gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect
 	google.golang.org/appengine v1.6.7 // indirect
diff --git a/go.sum b/go.sum
index 279c962..d137a99 100644
--- a/go.sum
+++ b/go.sum
@@ -98,8 +98,8 @@ github.com/banzaicloud/k8s-objectmatcher v1.8.0 h1:Nugn25elKtPMTA2br+JgHNeSQ04sc
 github.com/banzaicloud/k8s-objectmatcher v1.8.0/go.mod h1:p2LSNAjlECf07fbhDyebTkPUIYnU05G+WfGgkTmgeMg=
 github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
 github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
-github.com/bentoml/yatai-common v0.0.0-20230110044251-1eb442339c38 h1:PqfM42gfwBeytS92pV9t8u8POf8czn/4WlmQ/RFGuuY=
-github.com/bentoml/yatai-common v0.0.0-20230110044251-1eb442339c38/go.mod h1:pox0XYk/bVUwKkadn0XwWHEbJmxSEeN3+HwGA4a8uOQ=
+github.com/bentoml/yatai-common v0.0.0-20231016054533-fb836e058cfb h1:i3Jg+GQWgUaUZBlzetUBqAmQrSRdFg94lEW4nbJHI/8=
+github.com/bentoml/yatai-common v0.0.0-20231016054533-fb836e058cfb/go.mod h1:d3E7762KbvNKD+6jpLEvdSc2TaWo5dyD7wU+3rBwMUg=
 github.com/bentoml/yatai-image-builder v1.1.4 h1:I3s9JApTjmvV22MNeBiDZhAtuxB169P9Tf87SE060CQ=
 github.com/bentoml/yatai-image-builder v1.1.4/go.mod h1:bq9IOzH/S5YYKhu9JQfTclibkOP0p6pdNMMPUdpyO/c=
 github.com/bentoml/yatai-schemas v0.0.0-20230418023541-71c74442a90f h1:G/yhoMaNIWrc4r9Sp3/wjAlLwAq4jWHzsNQ97pJ53KM=
@@ -460,8 +460,8 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U
 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
-golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29 h1:tkVvjkPTB7pnW3jnid7kNyAMPVWllTNOf/qKDze4p9o=
-golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
+golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc=
+golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -497,8 +497,8 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-golang.org/x/mod v0.7.0 h1:LapD9S96VoQRhi/GrNTqeBJFrUjs5UHCAtTlgwA5oZA=
-golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
+golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8=
+golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
 golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -547,8 +547,8 @@ golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su
 golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
 golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
 golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
-golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g=
-golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
+golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM=
+golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -656,12 +656,12 @@ golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBc
 golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU=
-golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE=
+golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
-golang.org/x/term v0.5.0 h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY=
-golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
+golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek=
+golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=
 golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -671,8 +671,8 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
-golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo=
-golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
+golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k=
+golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
 golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@@ -735,8 +735,8 @@ golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
 golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
 golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
 golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
-golang.org/x/tools v0.4.0 h1:7mTAgkunk3fr4GAloyyCasadO6h9zSsQZbwvcaIciV4=
-golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ=
+golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM=
+golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
diff --git a/main.go b/main.go
index 57428b7..f2665e0 100644
--- a/main.go
+++ b/main.go
@@ -27,6 +27,8 @@ import (
 	"k8s.io/client-go/kubernetes"
 	_ "k8s.io/client-go/plugin/pkg/client/auth"
 
+	corev1 "k8s.io/api/core/v1"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/runtime"
 	utilruntime "k8s.io/apimachinery/pkg/util/runtime"
 	clientgoscheme "k8s.io/client-go/kubernetes/scheme"
@@ -100,7 +102,9 @@ func main() {
 	}
 
 	if all := os.Getenv("BENTO_DEPLOYMENT_ALL_NAMESPACES"); all != "true" {
-		bentoDeploymentNamespaces, err := commonconfig.GetBentoDeploymentNamespaces(context.TODO(), cliset)
+		bentoDeploymentNamespaces, err := commonconfig.GetBentoDeploymentNamespaces(context.Background(), func(ctx context.Context, namespace, name string) (*corev1.Secret, error) {
+			return cliset.CoreV1().Secrets(namespace).Get(ctx, name, metav1.GetOptions{})
+		})
 		if err != nil {
 			err = errors.Wrapf(err, "get bento deployment namespaces")
 			setupLog.Error(err, "unable to start manager")