Merge pull request #5923 from dipti-pai/drift-ignore-rules
Add DriftIgnoreRules support to flux diff kustomization
This commit is contained in:
@@ -270,3 +270,36 @@ func createObjectFromFile(objectFile string, templateValues map[string]string, t
|
|||||||
|
|
||||||
return clientObjects
|
return clientObjects
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TestDiffKustomizationDriftIgnoreRules tests `flux diff ks` with drift ignore
|
||||||
|
// rules. A service with a drifted port is pre-applied to the cluster, and the
|
||||||
|
// kustomization specifies driftIgnoreRules that ignore /spec/ports on Services.
|
||||||
|
// The diff should not show the service as drifted.
|
||||||
|
func TestDiffKustomizationDriftIgnoreRules(t *testing.T) {
|
||||||
|
tmpl := map[string]string{
|
||||||
|
"fluxns": allocateNamespace("flux-system"),
|
||||||
|
}
|
||||||
|
setupTestNamespace(tmpl["fluxns"], t)
|
||||||
|
|
||||||
|
b, _ := build.NewBuilder("podinfo", "", build.WithClientConfig(kubeconfigArgs, kubeclientOptions))
|
||||||
|
resourceManager, err := b.Manager()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pre-apply the drifted service (port 9899 instead of 9898) without Flux labels.
|
||||||
|
if _, err := resourceManager.ApplyAll(context.Background(), createObjectFromFile("./testdata/diff-kustomization/drifted-service-no-labels.yaml", tmpl, t), ssa.DefaultApplyOptions()); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
cmd := cmdTestCase{
|
||||||
|
args: "diff kustomization podinfo --path ./testdata/build-kustomization/podinfo --progress-bar=false " +
|
||||||
|
"--kustomization-file ./testdata/diff-kustomization/flux-kustomization-drift-ignore.yaml " +
|
||||||
|
"--ignore-not-found" +
|
||||||
|
" -n " + tmpl["fluxns"],
|
||||||
|
assert: assertGoldenFile("./testdata/diff-kustomization/diff-with-drift-ignore.golden"),
|
||||||
|
}
|
||||||
|
cmd.runTestCmd(t)
|
||||||
|
|
||||||
|
testEnv.DeleteObjectFile("./testdata/diff-kustomization/drifted-service-no-labels.yaml", tmpl, t)
|
||||||
|
}
|
||||||
|
|||||||
@@ -0,0 +1,14 @@
|
|||||||
|
► Deployment/default/podinfo created
|
||||||
|
► HorizontalPodAutoscaler/default/podinfo created
|
||||||
|
► Service/default/podinfo drifted
|
||||||
|
|
||||||
|
metadata
|
||||||
|
+ one map entry added:
|
||||||
|
labels:
|
||||||
|
kustomize.toolkit.fluxcd.io/name: podinfo
|
||||||
|
kustomize.toolkit.fluxcd.io/namespace:
|
||||||
|
|
||||||
|
► Secret/default/docker-secret created
|
||||||
|
► Secret/default/secret-basic-auth-stringdata created
|
||||||
|
► Secret/default/podinfo-token-77t89m9b67 created
|
||||||
|
► Secret/default/db-user-pass-bkbd782d2c created
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: podinfo
|
||||||
|
namespace: default
|
||||||
|
spec:
|
||||||
|
type: ClusterIP
|
||||||
|
selector:
|
||||||
|
app: podinfo
|
||||||
|
ports:
|
||||||
|
- name: http
|
||||||
|
port: 9899
|
||||||
|
protocol: TCP
|
||||||
|
targetPort: http
|
||||||
|
- port: 9999
|
||||||
|
targetPort: grpc
|
||||||
|
protocol: TCP
|
||||||
|
name: grpc
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
---
|
||||||
|
apiVersion: kustomize.toolkit.fluxcd.io/v1
|
||||||
|
kind: Kustomization
|
||||||
|
metadata:
|
||||||
|
name: podinfo
|
||||||
|
spec:
|
||||||
|
interval: 5m0s
|
||||||
|
path: ./kustomize
|
||||||
|
force: true
|
||||||
|
prune: true
|
||||||
|
sourceRef:
|
||||||
|
kind: GitRepository
|
||||||
|
name: podinfo
|
||||||
|
targetNamespace: default
|
||||||
|
ignore:
|
||||||
|
- paths:
|
||||||
|
- "/spec/ports"
|
||||||
|
target:
|
||||||
|
kind: Service
|
||||||
@@ -41,6 +41,7 @@ import (
|
|||||||
"github.com/fluxcd/cli-utils/pkg/object"
|
"github.com/fluxcd/cli-utils/pkg/object"
|
||||||
kustomizev1 "github.com/fluxcd/kustomize-controller/api/v1"
|
kustomizev1 "github.com/fluxcd/kustomize-controller/api/v1"
|
||||||
"github.com/fluxcd/pkg/ssa"
|
"github.com/fluxcd/pkg/ssa"
|
||||||
|
"github.com/fluxcd/pkg/ssa/jsondiff"
|
||||||
"github.com/fluxcd/pkg/ssa/normalize"
|
"github.com/fluxcd/pkg/ssa/normalize"
|
||||||
ssautil "github.com/fluxcd/pkg/ssa/utils"
|
ssautil "github.com/fluxcd/pkg/ssa/utils"
|
||||||
|
|
||||||
@@ -94,6 +95,28 @@ func (b *Builder) diff() (string, bool, error) {
|
|||||||
ctx, cancel := context.WithTimeout(context.Background(), b.timeout)
|
ctx, cancel := context.WithTimeout(context.Background(), b.timeout)
|
||||||
defer cancel()
|
defer cancel()
|
||||||
|
|
||||||
|
// Convert drift ignore rules from the Kustomization spec to jsondiff.IgnoreRule.
|
||||||
|
var driftIgnoreRules []jsondiff.IgnoreRule
|
||||||
|
if rules := b.kustomization.Spec.Ignore; len(rules) > 0 {
|
||||||
|
driftIgnoreRules = make([]jsondiff.IgnoreRule, len(rules))
|
||||||
|
for i, rule := range rules {
|
||||||
|
driftIgnoreRules[i] = jsondiff.IgnoreRule{
|
||||||
|
Paths: rule.Paths,
|
||||||
|
}
|
||||||
|
if rule.Target != nil {
|
||||||
|
driftIgnoreRules[i].Selector = &jsondiff.Selector{
|
||||||
|
Group: rule.Target.Group,
|
||||||
|
Version: rule.Target.Version,
|
||||||
|
Kind: rule.Target.Kind,
|
||||||
|
Name: rule.Target.Name,
|
||||||
|
Namespace: rule.Target.Namespace,
|
||||||
|
AnnotationSelector: rule.Target.AnnotationSelector,
|
||||||
|
LabelSelector: rule.Target.LabelSelector,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var diffErrs []error
|
var diffErrs []error
|
||||||
// create an inventory of objects to be reconciled
|
// create an inventory of objects to be reconciled
|
||||||
newInventory := newInventory()
|
newInventory := newInventory()
|
||||||
@@ -109,6 +132,7 @@ func (b *Builder) diff() (string, bool, error) {
|
|||||||
ForceSelector: map[string]string{
|
ForceSelector: map[string]string{
|
||||||
"kustomize.toolkit.fluxcd.io/force": "enabled",
|
"kustomize.toolkit.fluxcd.io/force": "enabled",
|
||||||
},
|
},
|
||||||
|
DriftIgnoreRules: driftIgnoreRules,
|
||||||
}
|
}
|
||||||
change, liveObject, mergedObject, err := resourceManager.Diff(ctx, obj, diffOptions)
|
change, liveObject, mergedObject, err := resourceManager.Diff(ctx, obj, diffOptions)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
Reference in New Issue
Block a user