@@ -20,12 +20,10 @@ import (
20
20
"context"
21
21
"errors"
22
22
"fmt"
23
- intacl "github.com/fluxcd/helm-controller/internal/acl"
24
23
"time"
25
24
26
25
"github.com/hashicorp/go-retryablehttp"
27
26
corev1 "k8s.io/api/core/v1"
28
- "k8s.io/apimachinery/pkg/runtime"
29
27
"k8s.io/apimachinery/pkg/types"
30
28
apierrors "k8s.io/apimachinery/pkg/util/errors"
31
29
"k8s.io/cli-runtime/pkg/genericclioptions"
@@ -53,6 +51,7 @@ import (
53
51
sourcev1 "github.com/fluxcd/source-controller/api/v1beta2"
54
52
55
53
v2 "github.com/fluxcd/helm-controller/api/v2beta2"
54
+ intacl "github.com/fluxcd/helm-controller/internal/acl"
56
55
"github.com/fluxcd/helm-controller/internal/action"
57
56
"github.com/fluxcd/helm-controller/internal/chartutil"
58
57
"github.com/fluxcd/helm-controller/internal/digest"
@@ -67,11 +66,9 @@ type HelmReleaseReconciler struct {
67
66
kuberecorder.EventRecorder
68
67
helper.Metrics
69
68
70
- Config * rest.Config
71
- Scheme * runtime.Scheme
72
-
73
- ClientOpts runtimeClient.Options
74
- KubeConfigOpts runtimeClient.KubeConfigOptions
69
+ GetClusterConfig func () (* rest.Config , error )
70
+ ClientOpts runtimeClient.Options
71
+ KubeConfigOpts runtimeClient.KubeConfigOptions
75
72
76
73
PollingOpts polling.Options
77
74
StatusPoller * polling.StatusPoller
@@ -209,7 +206,7 @@ func (r *HelmReleaseReconciler) reconcileRelease(ctx context.Context, patchHelpe
209
206
if c := len (obj .Spec .DependsOn ); c > 0 {
210
207
log .Info (fmt .Sprintf ("checking %d dependencies" , c ))
211
208
212
- if err := r .checkDependencies (obj ); err != nil {
209
+ if err := r .checkDependencies (ctx , obj ); err != nil {
213
210
msg := fmt .Sprintf ("dependencies do not meet ready condition (%s): retrying in %s" ,
214
211
err .Error (), r .requeueDependency .String ())
215
212
r .Eventf (obj , obj .Status .Current .ChartVersion , corev1 .EventTypeWarning , err .Error ())
@@ -317,46 +314,40 @@ func (r *HelmReleaseReconciler) reconcileRelease(ctx context.Context, patchHelpe
317
314
// reconcileDelete deletes the v1beta2.HelmChart of the v2beta2.HelmRelease,
318
315
// and uninstalls the Helm release if the resource has not been suspended.
319
316
func (r * HelmReleaseReconciler ) reconcileDelete (ctx context.Context , obj * v2.HelmRelease ) (ctrl.Result , error ) {
320
- if obj .Status .Current != nil {
321
- // Only uninstall the Helm Release if the resource is not suspended.
322
- if ! obj .Spec .Suspend {
323
- // Build client getter.
324
- getter , err := r .buildRESTClientGetter (ctx , obj )
325
- if err != nil {
326
- conditions .MarkFalse (obj , meta .ReadyCondition , "GetterError" , err .Error ())
327
- return ctrl.Result {}, err
328
- }
329
-
330
- // Attempt to uninstall the release.
331
- err = r .reconcileUninstall (ctx , getter , obj )
332
- if err != nil && ! errors .Is (err , intreconcile .ErrNoCurrent ) {
333
- return ctrl.Result {}, err
334
- }
335
- if err == nil {
336
- ctrl .LoggerFrom (ctx ).Info ("uninstalled Helm release for deleted resource" )
337
- }
317
+ // Only uninstall the Helm Release if the resource is not suspended.
318
+ if ! obj .Spec .Suspend {
319
+ // Build client getter.
320
+ getter , err := r .buildRESTClientGetter (ctx , obj )
321
+ if err != nil {
322
+ conditions .MarkFalse (obj , meta .ReadyCondition , "GetterError" , err .Error ())
323
+ return ctrl.Result {}, err
324
+ }
338
325
339
- // Truncate the current release details in the status.
340
- obj .Status .Current = nil
341
- obj .Status .StorageNamespace = ""
342
- } else {
343
- ctrl .LoggerFrom (ctx ).Info ("skipping Helm uninstall for suspended resource" )
326
+ // Attempt to uninstall the release.
327
+ if err = r .reconcileUninstall (ctx , getter , obj ); err != nil && ! errors .Is (err , intreconcile .ErrNoCurrent ) {
328
+ return ctrl.Result {}, err
329
+ }
330
+ if err == nil {
331
+ ctrl .LoggerFrom (ctx ).Info ("uninstalled Helm release for deleted resource" )
344
332
}
345
- }
346
333
347
- // Delete the HelmChart resource.
348
- if err := r .reconcileChartTemplate (ctx , obj ); err != nil {
349
- return ctrl.Result {}, err
334
+ // Truncate the current release details in the status.
335
+ obj .Status .Current = nil
336
+ obj .Status .StorageNamespace = ""
337
+
338
+ // Delete the HelmChart resource.
339
+ if err := r .reconcileChartTemplate (ctx , obj ); err != nil {
340
+ return ctrl.Result {}, err
341
+ }
342
+ } else {
343
+ ctrl .LoggerFrom (ctx ).Info ("skipping Helm uninstall and chart removal for suspended resource" )
350
344
}
351
345
352
- if ! obj .DeletionTimestamp .IsZero () {
353
- // Remove our finalizer from the list.
354
- controllerutil .RemoveFinalizer (obj , v2 .HelmReleaseFinalizer )
346
+ // Remove our finalizer from the list.
347
+ controllerutil .RemoveFinalizer (obj , v2 .HelmReleaseFinalizer )
355
348
356
- // Stop reconciliation as the object is being deleted.
357
- return ctrl.Result {}, nil
358
- }
359
- return ctrl.Result {Requeue : true }, nil
349
+ // Stop reconciliation as the object is being deleted.
350
+ return ctrl.Result {}, nil
360
351
}
361
352
362
353
// reconcileChartTemplate reconciles the HelmChart template from the HelmRelease.
@@ -384,23 +375,23 @@ func (r *HelmReleaseReconciler) reconcileUninstall(ctx context.Context, getter g
384
375
// are Ready.
385
376
// It returns an error if a dependency can not be retrieved or is not Ready,
386
377
// otherwise nil.
387
- func (r * HelmReleaseReconciler ) checkDependencies (obj * v2.HelmRelease ) error {
378
+ func (r * HelmReleaseReconciler ) checkDependencies (ctx context. Context , obj * v2.HelmRelease ) error {
388
379
for _ , d := range obj .Spec .DependsOn {
389
- if d .Namespace == "" {
390
- d .Namespace = obj .GetNamespace ()
391
- }
392
- dName := types.NamespacedName {
380
+ ref := types.NamespacedName {
393
381
Namespace : d .Namespace ,
394
382
Name : d .Name ,
395
383
}
384
+ if ref .Namespace == "" {
385
+ ref .Namespace = obj .GetNamespace ()
386
+ }
387
+
396
388
dHr := & v2.HelmRelease {}
397
- err := r .Get (context .Background (), dName , dHr )
398
- if err != nil {
399
- return fmt .Errorf ("unable to get '%s' dependency: %w" , dName , err )
389
+ if err := r .Get (ctx , ref , dHr ); err != nil {
390
+ return fmt .Errorf ("unable to get '%s' dependency: %w" , ref , err )
400
391
}
401
392
402
- if dHr .Generation != dHr .Status .ObservedGeneration || len ( dHr . Status . Conditions ) == 0 || ! conditions .IsTrue (dHr , meta .ReadyCondition ) {
403
- return fmt .Errorf ("dependency '%s' is not ready" , dName )
393
+ if dHr .Generation != dHr .Status .ObservedGeneration || ! conditions .IsTrue (dHr , meta .ReadyCondition ) {
394
+ return fmt .Errorf ("dependency '%s' is not ready" , ref )
404
395
}
405
396
}
406
397
return nil
@@ -431,7 +422,12 @@ func (r *HelmReleaseReconciler) buildRESTClientGetter(ctx context.Context, obj *
431
422
}
432
423
return kube .NewMemoryRESTClientGetter (kubeConfig , opts ... ), nil
433
424
}
434
- return kube .NewInClusterMemoryRESTClientGetter (opts ... )
425
+
426
+ cfg , err := r .GetClusterConfig ()
427
+ if err != nil {
428
+ return nil , fmt .Errorf ("could not get in-cluster REST config: %w" , err )
429
+ }
430
+ return kube .NewMemoryRESTClientGetter (cfg , opts ... ), nil
435
431
}
436
432
437
433
// getHelmChart retrieves the v1beta2.HelmChart for the given v2beta2.HelmRelease
0 commit comments