Fix performance regression due to using client without cache
Signed-off-by: Matheus Pimenta <matheuscscp@gmail.com>
This commit is contained in:
parent
690c8c8a74
commit
361a28eed9
|
|
@ -48,6 +48,7 @@ import (
|
||||||
"sigs.k8s.io/controller-runtime/pkg/predicate"
|
"sigs.k8s.io/controller-runtime/pkg/predicate"
|
||||||
"sigs.k8s.io/controller-runtime/pkg/reconcile"
|
"sigs.k8s.io/controller-runtime/pkg/reconcile"
|
||||||
|
|
||||||
|
"github.com/fluxcd/cli-utils/pkg/kstatus/polling"
|
||||||
"github.com/fluxcd/cli-utils/pkg/kstatus/polling/engine"
|
"github.com/fluxcd/cli-utils/pkg/kstatus/polling/engine"
|
||||||
"github.com/fluxcd/cli-utils/pkg/object"
|
"github.com/fluxcd/cli-utils/pkg/object"
|
||||||
apiacl "github.com/fluxcd/pkg/apis/acl"
|
apiacl "github.com/fluxcd/pkg/apis/acl"
|
||||||
|
|
@ -63,6 +64,7 @@ import (
|
||||||
"github.com/fluxcd/pkg/runtime/jitter"
|
"github.com/fluxcd/pkg/runtime/jitter"
|
||||||
"github.com/fluxcd/pkg/runtime/patch"
|
"github.com/fluxcd/pkg/runtime/patch"
|
||||||
"github.com/fluxcd/pkg/runtime/predicates"
|
"github.com/fluxcd/pkg/runtime/predicates"
|
||||||
|
"github.com/fluxcd/pkg/runtime/statusreaders"
|
||||||
"github.com/fluxcd/pkg/ssa"
|
"github.com/fluxcd/pkg/ssa"
|
||||||
"github.com/fluxcd/pkg/tar"
|
"github.com/fluxcd/pkg/tar"
|
||||||
sourcev1 "github.com/fluxcd/source-controller/api/v1"
|
sourcev1 "github.com/fluxcd/source-controller/api/v1"
|
||||||
|
|
@ -384,11 +386,14 @@ func (r *KustomizationReconciler) reconcile(
|
||||||
|
|
||||||
// Configure the Kubernetes client for impersonation.
|
// Configure the Kubernetes client for impersonation.
|
||||||
var impersonatorOpts []runtimeClient.ImpersonatorOption
|
var impersonatorOpts []runtimeClient.ImpersonatorOption
|
||||||
|
var mustImpersonate bool
|
||||||
if r.DefaultServiceAccount != "" || obj.Spec.ServiceAccountName != "" {
|
if r.DefaultServiceAccount != "" || obj.Spec.ServiceAccountName != "" {
|
||||||
|
mustImpersonate = true
|
||||||
impersonatorOpts = append(impersonatorOpts,
|
impersonatorOpts = append(impersonatorOpts,
|
||||||
runtimeClient.WithServiceAccount(r.DefaultServiceAccount, obj.Spec.ServiceAccountName, obj.GetNamespace()))
|
runtimeClient.WithServiceAccount(r.DefaultServiceAccount, obj.Spec.ServiceAccountName, obj.GetNamespace()))
|
||||||
}
|
}
|
||||||
if obj.Spec.KubeConfig != nil {
|
if obj.Spec.KubeConfig != nil {
|
||||||
|
mustImpersonate = true
|
||||||
impersonatorOpts = append(impersonatorOpts,
|
impersonatorOpts = append(impersonatorOpts,
|
||||||
runtimeClient.WithKubeConfig(obj.Spec.KubeConfig, r.KubeConfigOpts, obj.GetNamespace()))
|
runtimeClient.WithKubeConfig(obj.Spec.KubeConfig, r.KubeConfigOpts, obj.GetNamespace()))
|
||||||
}
|
}
|
||||||
|
|
@ -399,7 +404,13 @@ func (r *KustomizationReconciler) reconcile(
|
||||||
impersonation := runtimeClient.NewImpersonator(r.Client, impersonatorOpts...)
|
impersonation := runtimeClient.NewImpersonator(r.Client, impersonatorOpts...)
|
||||||
|
|
||||||
// Create the Kubernetes client that runs under impersonation.
|
// Create the Kubernetes client that runs under impersonation.
|
||||||
kubeClient, statusPoller, err := impersonation.GetClient(ctx)
|
var kubeClient client.Client
|
||||||
|
var statusPoller *polling.StatusPoller
|
||||||
|
if mustImpersonate {
|
||||||
|
kubeClient, statusPoller, err = impersonation.GetClient(ctx)
|
||||||
|
} else {
|
||||||
|
kubeClient, statusPoller = r.getClientAndPoller(statusReaders)
|
||||||
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
conditions.MarkFalse(obj, meta.ReadyCondition, meta.ReconciliationFailedReason, "%s", err)
|
conditions.MarkFalse(obj, meta.ReadyCondition, meta.ReconciliationFailedReason, "%s", err)
|
||||||
return fmt.Errorf("failed to build kube client: %w", err)
|
return fmt.Errorf("failed to build kube client: %w", err)
|
||||||
|
|
@ -1018,11 +1029,14 @@ func (r *KustomizationReconciler) finalize(ctx context.Context,
|
||||||
objects, _ := inventory.List(obj.Status.Inventory)
|
objects, _ := inventory.List(obj.Status.Inventory)
|
||||||
|
|
||||||
var impersonatorOpts []runtimeClient.ImpersonatorOption
|
var impersonatorOpts []runtimeClient.ImpersonatorOption
|
||||||
|
var mustImpersonate bool
|
||||||
if r.DefaultServiceAccount != "" || obj.Spec.ServiceAccountName != "" {
|
if r.DefaultServiceAccount != "" || obj.Spec.ServiceAccountName != "" {
|
||||||
|
mustImpersonate = true
|
||||||
impersonatorOpts = append(impersonatorOpts,
|
impersonatorOpts = append(impersonatorOpts,
|
||||||
runtimeClient.WithServiceAccount(r.DefaultServiceAccount, obj.Spec.ServiceAccountName, obj.GetNamespace()))
|
runtimeClient.WithServiceAccount(r.DefaultServiceAccount, obj.Spec.ServiceAccountName, obj.GetNamespace()))
|
||||||
}
|
}
|
||||||
if obj.Spec.KubeConfig != nil {
|
if obj.Spec.KubeConfig != nil {
|
||||||
|
mustImpersonate = true
|
||||||
impersonatorOpts = append(impersonatorOpts,
|
impersonatorOpts = append(impersonatorOpts,
|
||||||
runtimeClient.WithKubeConfig(obj.Spec.KubeConfig, r.KubeConfigOpts, obj.GetNamespace()))
|
runtimeClient.WithKubeConfig(obj.Spec.KubeConfig, r.KubeConfigOpts, obj.GetNamespace()))
|
||||||
}
|
}
|
||||||
|
|
@ -1031,7 +1045,13 @@ func (r *KustomizationReconciler) finalize(ctx context.Context,
|
||||||
}
|
}
|
||||||
impersonation := runtimeClient.NewImpersonator(r.Client, impersonatorOpts...)
|
impersonation := runtimeClient.NewImpersonator(r.Client, impersonatorOpts...)
|
||||||
if impersonation.CanImpersonate(ctx) {
|
if impersonation.CanImpersonate(ctx) {
|
||||||
kubeClient, _, err := impersonation.GetClient(ctx)
|
var kubeClient client.Client
|
||||||
|
var err error
|
||||||
|
if mustImpersonate {
|
||||||
|
kubeClient, _, err = impersonation.GetClient(ctx)
|
||||||
|
} else {
|
||||||
|
kubeClient = r.Client
|
||||||
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return ctrl.Result{}, err
|
return ctrl.Result{}, err
|
||||||
}
|
}
|
||||||
|
|
@ -1160,6 +1180,29 @@ func (r *KustomizationReconciler) patch(ctx context.Context,
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// getClientAndPoller creates a status poller with the custom status readers
|
||||||
|
// from CEL expressions and the custom job status reader, and returns the
|
||||||
|
// Kubernetes client of the controller and the status poller.
|
||||||
|
// Should be used for reconciliations that are not configured to use
|
||||||
|
// ServiceAccount impersonation or kubeconfig.
|
||||||
|
func (r *KustomizationReconciler) getClientAndPoller(
|
||||||
|
readerCtors []func(apimeta.RESTMapper) engine.StatusReader,
|
||||||
|
) (client.Client, *polling.StatusPoller) {
|
||||||
|
|
||||||
|
readers := make([]engine.StatusReader, 0, 1+len(readerCtors))
|
||||||
|
readers = append(readers, statusreaders.NewCustomJobStatusReader(r.Mapper))
|
||||||
|
for _, ctor := range readerCtors {
|
||||||
|
readers = append(readers, ctor(r.Mapper))
|
||||||
|
}
|
||||||
|
|
||||||
|
poller := polling.NewStatusPoller(r.Client, r.Mapper, polling.Options{
|
||||||
|
CustomStatusReaders: readers,
|
||||||
|
ClusterReaderFactory: r.ClusterReader,
|
||||||
|
})
|
||||||
|
|
||||||
|
return r.Client, poller
|
||||||
|
}
|
||||||
|
|
||||||
// getOriginRevision returns the origin revision of the source artifact,
|
// getOriginRevision returns the origin revision of the source artifact,
|
||||||
// or the empty string if it's not present, or if the artifact itself
|
// or the empty string if it's not present, or if the artifact itself
|
||||||
// is not present.
|
// is not present.
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue