Skip to content

Commit b0c697d

Browse files
authored
Merge pull request #4437 from fluxcd/hr-force-reset
Add force and reset flags to `flux reconcile hr`
2 parents 7cf0451 + 2b653f9 commit b0c697d

33 files changed

+111
-169
lines changed

cmd/flux/create_helmrelease.go

+4-3
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,12 @@ import (
2424
"strings"
2525
"time"
2626

27-
"github.com/fluxcd/flux2/v2/internal/flags"
28-
"github.com/fluxcd/flux2/v2/internal/utils"
2927
"github.com/fluxcd/pkg/apis/meta"
3028
"github.com/fluxcd/pkg/runtime/transform"
3129

30+
"github.com/fluxcd/flux2/v2/internal/flags"
31+
"github.com/fluxcd/flux2/v2/internal/utils"
32+
3233
"github.com/spf13/cobra"
3334
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
3435
"k8s.io/apimachinery/pkg/api/errors"
@@ -38,7 +39,7 @@ import (
3839
"sigs.k8s.io/controller-runtime/pkg/client"
3940
"sigs.k8s.io/yaml"
4041

41-
helmv2 "github.com/fluxcd/helm-controller/api/v2beta1"
42+
helmv2 "github.com/fluxcd/helm-controller/api/v2beta2"
4243
)
4344

4445
var createHelmReleaseCmd = &cobra.Command{

cmd/flux/create_kustomization.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import (
2929
"k8s.io/apimachinery/pkg/util/wait"
3030
"sigs.k8s.io/controller-runtime/pkg/client"
3131

32-
helmv2 "github.com/fluxcd/helm-controller/api/v2beta1"
32+
helmv2 "github.com/fluxcd/helm-controller/api/v2beta2"
3333
kustomizev1 "github.com/fluxcd/kustomize-controller/api/v1"
3434
"github.com/fluxcd/pkg/apis/meta"
3535

cmd/flux/delete_helmrelease.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ package main
1919
import (
2020
"github.com/spf13/cobra"
2121

22-
helmv2 "github.com/fluxcd/helm-controller/api/v2beta1"
22+
helmv2 "github.com/fluxcd/helm-controller/api/v2beta2"
2323
)
2424

2525
var deleteHelmReleaseCmd = &cobra.Command{

cmd/flux/events.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ import (
3939
cmdutil "k8s.io/kubectl/pkg/cmd/util"
4040
"sigs.k8s.io/controller-runtime/pkg/client"
4141

42-
helmv2 "github.com/fluxcd/helm-controller/api/v2beta1"
42+
helmv2 "github.com/fluxcd/helm-controller/api/v2beta2"
4343
autov1 "github.com/fluxcd/image-automation-controller/api/v1beta1"
4444
imagev1 "github.com/fluxcd/image-reflector-controller/api/v1beta2"
4545
kustomizev1 "github.com/fluxcd/kustomize-controller/api/v1"

cmd/flux/events_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ spec:
7878
timeout: 1m0s
7979
url: ssh://git@github.com/example/repo
8080
---
81-
apiVersion: helm.toolkit.fluxcd.io/v2beta1
81+
apiVersion: helm.toolkit.fluxcd.io/v2beta2
8282
kind: HelmRelease
8383
metadata:
8484
name: podinfo

cmd/flux/export_helmrelease.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import (
2020
"github.com/spf13/cobra"
2121
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2222

23-
helmv2 "github.com/fluxcd/helm-controller/api/v2beta1"
23+
helmv2 "github.com/fluxcd/helm-controller/api/v2beta2"
2424
)
2525

2626
var exportHelmReleaseCmd = &cobra.Command{

cmd/flux/get_all.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import (
2121

2222
"github.com/spf13/cobra"
2323

24-
helmv2 "github.com/fluxcd/helm-controller/api/v2beta1"
24+
helmv2 "github.com/fluxcd/helm-controller/api/v2beta2"
2525
kustomizev1 "github.com/fluxcd/kustomize-controller/api/v1"
2626
notificationv1 "github.com/fluxcd/notification-controller/api/v1"
2727
notificationv1b3 "github.com/fluxcd/notification-controller/api/v1beta3"

cmd/flux/get_helmrelease.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import (
2525
"golang.org/x/text/language"
2626
"k8s.io/apimachinery/pkg/runtime"
2727

28-
helmv2 "github.com/fluxcd/helm-controller/api/v2beta1"
28+
helmv2 "github.com/fluxcd/helm-controller/api/v2beta2"
2929
)
3030

3131
var getHelmReleaseCmd = &cobra.Command{

cmd/flux/helmrelease.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ package main
1919
import (
2020
"sigs.k8s.io/controller-runtime/pkg/client"
2121

22-
helmv2 "github.com/fluxcd/helm-controller/api/v2beta1"
22+
helmv2 "github.com/fluxcd/helm-controller/api/v2beta2"
2323
)
2424

2525
// helmv2.HelmRelease

cmd/flux/reconcile.go

+20-7
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import (
3131
"k8s.io/client-go/util/retry"
3232
"sigs.k8s.io/controller-runtime/pkg/client"
3333

34+
helmv2 "github.com/fluxcd/helm-controller/api/v2beta2"
3435
"github.com/fluxcd/pkg/apis/meta"
3536

3637
"github.com/fluxcd/flux2/v2/internal/utils"
@@ -166,14 +167,26 @@ func requestReconciliation(ctx context.Context, kubeClient client.Client,
166167
return err
167168
}
168169
patch := client.MergeFrom(object.DeepCopy())
169-
if ann := object.GetAnnotations(); ann == nil {
170-
object.SetAnnotations(map[string]string{
171-
meta.ReconcileRequestAnnotation: time.Now().Format(time.RFC3339Nano),
172-
})
173-
} else {
174-
ann[meta.ReconcileRequestAnnotation] = time.Now().Format(time.RFC3339Nano)
175-
object.SetAnnotations(ann)
170+
171+
// Add a timestamp annotation to trigger a reconciliation.
172+
ts := time.Now().Format(time.RFC3339Nano)
173+
annotations := object.GetAnnotations()
174+
if annotations == nil {
175+
annotations = make(map[string]string, 1)
176+
}
177+
annotations[meta.ReconcileRequestAnnotation] = ts
178+
179+
// HelmRelease specific annotations to force or reset a release.
180+
if gvk.Kind == helmv2.HelmReleaseKind {
181+
if rhrArgs.syncForce {
182+
annotations[helmv2.ForceRequestAnnotation] = ts
183+
}
184+
if rhrArgs.syncReset {
185+
annotations[helmv2.ResetRequestAnnotation] = ts
186+
}
176187
}
188+
189+
object.SetAnnotations(annotations)
177190
return kubeClient.Patch(ctx, object, patch)
178191
})
179192
}

cmd/flux/reconcile_helmrelease.go

+5-2
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import (
2222
"github.com/spf13/cobra"
2323
"k8s.io/apimachinery/pkg/types"
2424

25-
helmv2 "github.com/fluxcd/helm-controller/api/v2beta1"
25+
helmv2 "github.com/fluxcd/helm-controller/api/v2beta2"
2626
sourcev1b2 "github.com/fluxcd/source-controller/api/v1beta2"
2727
)
2828

@@ -46,13 +46,16 @@ The reconcile kustomization command triggers a reconciliation of a HelmRelease r
4646

4747
type reconcileHelmReleaseFlags struct {
4848
syncHrWithSource bool
49+
syncForce bool
50+
syncReset bool
4951
}
5052

5153
var rhrArgs reconcileHelmReleaseFlags
5254

5355
func init() {
5456
reconcileHrCmd.Flags().BoolVar(&rhrArgs.syncHrWithSource, "with-source", false, "reconcile HelmRelease source")
55-
57+
reconcileHrCmd.Flags().BoolVar(&rhrArgs.syncForce, "force", false, "force a one-off install or upgrade of the HelmRelease resource")
58+
reconcileHrCmd.Flags().BoolVar(&rhrArgs.syncReset, "reset", false, "reset the reset the failure count for this HelmRelease resource")
5659
reconcileCmd.AddCommand(reconcileHrCmd)
5760
}
5861

cmd/flux/resume_helmrelease.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import (
2121

2222
"github.com/spf13/cobra"
2323

24-
helmv2 "github.com/fluxcd/helm-controller/api/v2beta1"
24+
helmv2 "github.com/fluxcd/helm-controller/api/v2beta2"
2525
)
2626

2727
var resumeHrCmd = &cobra.Command{

cmd/flux/stats.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ import (
2727
"sigs.k8s.io/controller-runtime/pkg/client"
2828

2929
"github.com/fluxcd/cli-utils/pkg/kstatus/status"
30-
helmv2 "github.com/fluxcd/helm-controller/api/v2beta1"
30+
helmv2 "github.com/fluxcd/helm-controller/api/v2beta2"
3131
autov1 "github.com/fluxcd/image-automation-controller/api/v1beta1"
3232
imagev1 "github.com/fluxcd/image-reflector-controller/api/v1beta2"
3333
kustomizev1 "github.com/fluxcd/kustomize-controller/api/v1"

cmd/flux/suspend_helmrelease.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ package main
1919
import (
2020
"github.com/spf13/cobra"
2121

22-
helmv2 "github.com/fluxcd/helm-controller/api/v2beta1"
22+
helmv2 "github.com/fluxcd/helm-controller/api/v2beta2"
2323
)
2424

2525
var suspendHrCmd = &cobra.Command{

cmd/flux/testdata/export/helm-release.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
apiVersion: helm.toolkit.fluxcd.io/v2beta1
2+
apiVersion: helm.toolkit.fluxcd.io/v2beta2
33
kind: HelmRelease
44
metadata:
55
name: flux-system

cmd/flux/testdata/export/objects.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ spec:
124124
timeout: 1m0s
125125
url: https://stefanprodan.github.io/podinfo
126126
---
127-
apiVersion: helm.toolkit.fluxcd.io/v2beta1
127+
apiVersion: helm.toolkit.fluxcd.io/v2beta2
128128
kind: HelmRelease
129129
metadata:
130130
name: flux-system

cmd/flux/testdata/trace/deployment.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ spec:
3434
command: [ "echo hello world" ]
3535
image: busybox
3636
---
37-
apiVersion: helm.toolkit.fluxcd.io/v2beta1
37+
apiVersion: helm.toolkit.fluxcd.io/v2beta2
3838
kind: HelmRelease
3939
metadata:
4040
labels:

cmd/flux/testdata/trace/helmrelease-oci.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ kind: Namespace
99
metadata:
1010
name: {{ .ns }}
1111
---
12-
apiVersion: helm.toolkit.fluxcd.io/v2beta1
12+
apiVersion: helm.toolkit.fluxcd.io/v2beta2
1313
kind: HelmRelease
1414
metadata:
1515
labels:

cmd/flux/testdata/trace/helmrelease.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ kind: Namespace
99
metadata:
1010
name: {{ .ns }}
1111
---
12-
apiVersion: helm.toolkit.fluxcd.io/v2beta1
12+
apiVersion: helm.toolkit.fluxcd.io/v2beta2
1313
kind: HelmRelease
1414
metadata:
1515
labels:

cmd/flux/trace.go

+4-3
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,14 @@ import (
3333
"k8s.io/cli-runtime/pkg/resource"
3434
"sigs.k8s.io/controller-runtime/pkg/client"
3535

36-
"github.com/fluxcd/flux2/v2/internal/utils"
37-
helmv2 "github.com/fluxcd/helm-controller/api/v2beta1"
36+
helmv2 "github.com/fluxcd/helm-controller/api/v2beta2"
3837
kustomizev1 "github.com/fluxcd/kustomize-controller/api/v1"
3938
fluxmeta "github.com/fluxcd/pkg/apis/meta"
4039
"github.com/fluxcd/pkg/oci"
4140
sourcev1 "github.com/fluxcd/source-controller/api/v1"
4241
sourcev1b2 "github.com/fluxcd/source-controller/api/v1beta2"
42+
43+
"github.com/fluxcd/flux2/v2/internal/utils"
4344
)
4445

4546
var traceCmd = &cobra.Command{
@@ -63,7 +64,7 @@ You can also trace multiple objects with different resource kinds using <resourc
6364
6465
# API Version and Kind can also be specified explicitly
6566
# Note that either both, kind and api-version, or neither have to be specified.
66-
flux trace redis --kind=helmrelease --api-version=helm.toolkit.fluxcd.io/v2beta1 -n redis`,
67+
flux trace redis --kind=helmrelease --api-version=helm.toolkit.fluxcd.io/v2beta2 -n redis`,
6768
RunE: traceCmdRun,
6869
}
6970

cmd/flux/trace_test.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ func TestTrace(t *testing.T) {
4747
},
4848
{
4949
"HelmRelease",
50-
"trace podinfo --kind HelmRelease --api-version=helm.toolkit.fluxcd.io/v2beta1",
50+
"trace podinfo --kind HelmRelease --api-version=helm.toolkit.fluxcd.io/v2beta2",
5151
"testdata/trace/helmrelease.yaml",
5252
"testdata/trace/helmrelease.golden",
5353
map[string]string{
@@ -59,7 +59,7 @@ func TestTrace(t *testing.T) {
5959
},
6060
{
6161
"HelmRelease from OCI registry",
62-
"trace podinfo --kind HelmRelease --api-version=helm.toolkit.fluxcd.io/v2beta1",
62+
"trace podinfo --kind HelmRelease --api-version=helm.toolkit.fluxcd.io/v2beta2",
6363
"testdata/trace/helmrelease-oci.yaml",
6464
"testdata/trace/helmrelease-oci.golden",
6565
map[string]string{

cmd/flux/tree_kustomization.go

+9-23
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,11 @@ import (
3232
apierrors "k8s.io/apimachinery/pkg/api/errors"
3333
"k8s.io/apimachinery/pkg/runtime/schema"
3434
"sigs.k8s.io/controller-runtime/pkg/client"
35+
"sigs.k8s.io/controller-runtime/pkg/client/apiutil"
3536
"sigs.k8s.io/yaml"
3637

3738
"github.com/fluxcd/cli-utils/pkg/object"
38-
helmv2 "github.com/fluxcd/helm-controller/api/v2beta1"
39+
helmv2 "github.com/fluxcd/helm-controller/api/v2beta2"
3940
kustomizev1 "github.com/fluxcd/kustomize-controller/api/v1"
4041
"github.com/fluxcd/pkg/ssa"
4142

@@ -208,27 +209,16 @@ func getHelmReleaseInventory(ctx context.Context, objectKey client.ObjectKey, ku
208209
return nil, nil
209210
}
210211

211-
storageNamespace := hr.GetNamespace()
212-
if hr.Spec.StorageNamespace != "" {
213-
storageNamespace = hr.Spec.StorageNamespace
214-
}
215-
216-
storageName := hr.GetName()
217-
if hr.Spec.ReleaseName != "" {
218-
storageName = hr.Spec.ReleaseName
219-
} else if hr.Spec.TargetNamespace != "" {
220-
storageName = strings.Join([]string{hr.Spec.TargetNamespace, hr.Name}, "-")
221-
}
222-
223-
storageVersion := hr.Status.LastReleaseRevision
224-
// skip release if it failed to install
225-
if storageVersion < 1 {
212+
storageNamespace := hr.Status.StorageNamespace
213+
latest := hr.Status.History.Latest()
214+
if len(storageNamespace) == 0 || latest == nil {
215+
// Skip release if it has no current
226216
return nil, nil
227217
}
228218

229219
storageKey := client.ObjectKey{
230220
Namespace: storageNamespace,
231-
Name: fmt.Sprintf("sh.helm.release.v1.%s.v%v", storageName, storageVersion),
221+
Name: fmt.Sprintf("sh.helm.release.v1.%s.v%v", latest.Name, latest.Version),
232222
}
233223

234224
storageSecret := &corev1.Secret{}
@@ -279,12 +269,8 @@ func getHelmReleaseInventory(ctx context.Context, objectKey client.ObjectKey, ku
279269
// set the namespace on namespaced objects
280270
for _, obj := range objects {
281271
if obj.GetNamespace() == "" {
282-
if isNamespaced, _ := utils.IsAPINamespaced(obj, kubeClient.Scheme(), kubeClient.RESTMapper()); isNamespaced {
283-
if hr.Spec.TargetNamespace != "" {
284-
obj.SetNamespace(hr.Spec.TargetNamespace)
285-
} else {
286-
obj.SetNamespace(hr.GetNamespace())
287-
}
272+
if isNamespaced, _ := apiutil.IsObjectNamespaced(obj, kubeClient.Scheme(), kubeClient.RESTMapper()); isNamespaced {
273+
obj.SetNamespace(latest.Namespace)
288274
}
289275
}
290276
}

internal/flags/crds.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import (
2020
"fmt"
2121
"strings"
2222

23-
helmv2 "github.com/fluxcd/helm-controller/api/v2beta1"
23+
helmv2 "github.com/fluxcd/helm-controller/api/v2beta2"
2424

2525
"github.com/fluxcd/flux2/v2/internal/utils"
2626
)

0 commit comments

Comments
 (0)