Skip to content

Commit

Permalink
Refactor normalizers
Browse files Browse the repository at this point in the history
* add docs around drift detection
* move modules into subfolders to make import tree clear
* embed diffnormalize in diff package, both are small
  • Loading branch information
manno committed Jul 5, 2024
1 parent 737033f commit b14ff2c
Show file tree
Hide file tree
Showing 13 changed files with 50 additions and 58 deletions.
30 changes: 22 additions & 8 deletions internal/cmd/agent/deployer/applied/diff.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@ import (
jsonpatch "github.com/evanphx/json-patch"

"github.com/rancher/fleet/internal/cmd/agent/deployer/internal/diff"
"github.com/rancher/fleet/internal/cmd/agent/deployer/internal/diffnormalize"
argo "github.com/rancher/fleet/internal/cmd/agent/deployer/internal/normalizers"
"github.com/rancher/fleet/internal/cmd/agent/deployer/internal/resource"
fleetnorm "github.com/rancher/fleet/internal/cmd/agent/deployer/normalizers"
"github.com/rancher/fleet/internal/cmd/agent/deployer/normalizers"
fleet "github.com/rancher/fleet/pkg/apis/fleet.cattle.io/v1alpha1"

"github.com/rancher/wrangler/v3/pkg/apply"
Expand All @@ -27,7 +27,7 @@ func Diff(plan apply.Plan, bd *fleet.BundleDeployment, ns string, objs ...runtim
desired := objectset.NewObjectSet(objs...).ObjectsByGVK()
live := objectset.NewObjectSet(plan.Objects...).ObjectsByGVK()

norms, err := normalizers(live, bd)
norms, err := newNormalizers(live, bd)
if err != nil {
return plan, err
}
Expand Down Expand Up @@ -72,6 +72,7 @@ func Diff(plan apply.Plan, bd *fleet.BundleDeployment, ns string, objs ...runtim
errs = append(errs, err)
continue
}
// this will overwrite an existing entry in the Update map
plan.Update.Add(gvk, key.Namespace, key.Name, string(patch))
}
if len(errs) > 0 {
Expand All @@ -81,9 +82,18 @@ func Diff(plan apply.Plan, bd *fleet.BundleDeployment, ns string, objs ...runtim
return plan, nil
}

func normalizers(live objectset.ObjectByGVK, bd *fleet.BundleDeployment) (diff.Normalizer, error) {
// newNormalizers creates a normalizer that removes fields from resources.
// The normalizer is composed of:
//
// - StatusNormalizer
// - MutatingWebhookNormalizer
// - ValidatingWebhookNormalizer
// - normalizers.NewIgnoreNormalizer (patch.JsonPointers)
// - normalizers.NewKnownTypesNormalizer (rollout.argoproj.io)
// - patch.Operations
func newNormalizers(live objectset.ObjectByGVK, bd *fleet.BundleDeployment) (diff.Normalizer, error) {
var ignore []resource.ResourceIgnoreDifferences
jsonPatchNorm := &fleetnorm.JSONPatchNormalizer{}
jsonPatchNorm := &normalizers.JSONPatchNormalizer{}
if bd.Spec.Options.Diff != nil {
for _, patch := range bd.Spec.Options.Diff.ComparePatches {
groupVersion, err := schema.ParseGroupVersion(patch.APIVersion)
Expand Down Expand Up @@ -114,11 +124,15 @@ func normalizers(live objectset.ObjectByGVK, bd *fleet.BundleDeployment) (diff.N
}
}

ignoreNorm, err := diffnormalize.NewDiffNormalizer(ignore, nil)
ignoreNormalizer, err := argo.NewIgnoreNormalizer(ignore, nil)
if err != nil {
return nil, err
}

norm := fleetnorm.New(live, ignoreNorm, jsonPatchNorm)
return norm, nil
knownTypesNorm, err := argo.NewKnownTypesNormalizer(nil)
if err != nil {
return nil, err
}

return normalizers.New(live, ignoreNormalizer, knownTypesNorm, jsonPatchNorm), nil
}
8 changes: 4 additions & 4 deletions internal/cmd/agent/deployer/internal/diff/diff.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// copied from argoproj/gitops-engine/pkg/diff/diff.go
// +vendored argoproj/gitops-engine/pkg/diff/diff.go
/*
The package provide functions that allows to compare set of Kubernetes resources using the logic equivalent to
`kubectl diff`.
Expand All @@ -21,9 +21,9 @@ import (
"k8s.io/apimachinery/pkg/util/strategicpatch"
"k8s.io/client-go/kubernetes/scheme"

jsonutil "github.com/rancher/fleet/internal/cmd/agent/deployer/internal/json"
"github.com/rancher/fleet/internal/cmd/agent/deployer/internal/kubernetes_vendor/pkg/api/v1/endpoints"
kubescheme "github.com/rancher/fleet/internal/cmd/agent/deployer/internal/scheme"
jsonutil "github.com/rancher/fleet/internal/cmd/agent/deployer/internal/diff/json"
"github.com/rancher/fleet/internal/cmd/agent/deployer/internal/diff/kubernetes_vendor/pkg/api/v1/endpoints"
kubescheme "github.com/rancher/fleet/internal/cmd/agent/deployer/internal/diff/scheme"
)

const couldNotMarshalErrMsg = "Could not unmarshal to object of type %s: %v"
Expand Down
2 changes: 1 addition & 1 deletion internal/cmd/agent/deployer/internal/diff/diff_options.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// copied from argoproj/gitops-engine/pkg/diff/diff_options.go
// +vendored argoproj/gitops-engine/pkg/diff/diff_options.go
package diff

import (
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// copied from argoproj/gitops-engine/pkg/utils/json/json.go
// +vendored argoproj/gitops-engine/pkg/utils/json/json.go
package json

// https://github.com/ksonnet/ksonnet/blob/master/pkg/kubecfg/diff.go
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ import (
"hash"
"sort"

hashutil "github.com/rancher/fleet/internal/cmd/agent/deployer/internal/kubernetes_vendor/pkg/util/hash"
hashutil "github.com/rancher/fleet/internal/cmd/agent/deployer/internal/diff/kubernetes_vendor/pkg/util/hash"
v1 "k8s.io/api/core/v1"
)

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// copied from https://github.com/argoproj/gitops-engine/blob/master/pkg/utils/kube/scheme/scheme.go
// +vendored https://github.com/argoproj/gitops-engine/blob/master/pkg/utils/kube/scheme/scheme.go
package scheme

import (
Expand Down
37 changes: 0 additions & 37 deletions internal/cmd/agent/deployer/internal/diffnormalize/normalize.go

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
// extracted from argoproj/argo-cd/util/argo/normalizers/diff_normalizer.go
// Package normalizers contains normalizers for resources. Normalizers are used to modify resources before they are compared.
// This includes the "ignore" normalizer, which removes a matched path and the knownTypes normalizer.
//
// +vendored argoproj/argo-cd/util/argo/normalizers/diff_normalizer.go
package normalizers

import (
Expand All @@ -11,7 +14,7 @@ import (
"k8s.io/apimachinery/pkg/runtime/schema"

"github.com/rancher/fleet/internal/cmd/agent/deployer/internal/diff"
"github.com/rancher/fleet/internal/cmd/agent/deployer/internal/glob"
"github.com/rancher/fleet/internal/cmd/agent/deployer/internal/normalizers/glob"
"github.com/rancher/fleet/internal/cmd/agent/deployer/internal/resource"
)

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// copied from argoproj/argo-cd/util/glob/glob.go
// +vendored argoproj/argo-cd/util/glob/glob.go
package glob

import (
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// copied from argoproj/argo-cd/util/argo/normalizers/knowntypes_normalizer.go
// +vendored argoproj/argo-cd/util/argo/normalizers/knowntypes_normalizer.go
package normalizers

import (
Expand Down
2 changes: 1 addition & 1 deletion internal/cmd/agent/deployer/internal/resource/ignore.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// extracted from argoproj/argo-cd/pkg/apis/application/v1alpha1/types.go
// +vendored argoproj/argo-cd/pkg/apis/application/v1alpha1/types.go
package resource

import (
Expand Down
12 changes: 12 additions & 0 deletions internal/cmd/agent/deployer/monitor/updatestatus.go
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
// Package monitor provides functionality for monitoring and updating the status of a bundle deployment.
// It includes functions for determining whether the agent should be redeployed, whether the status should be updated,
// and for updating the status based on the resources and helm release history.
package monitor

import (
Expand Down Expand Up @@ -155,10 +158,15 @@ func (m *Monitor) updateFromResources(logger logr.Logger, bd *fleet.BundleDeploy
ns = m.defaultNamespace
}

// resources.Objects contains the desired state of the resources from helm history
plan, err := m.applied.DryRun(ns, applied.GetSetID(bd.Name, m.labelPrefix, m.labelSuffix), resources.Objects...)
if err != nil {
return err
}

// applied.Diff only takes plan.Update into account. plan.Update
// contains objects which have changes to existing values. Adding a new
// key to a map is not considered an update.
plan, err = applied.Diff(plan, bd, resources.DefaultNamespace, resources.Objects...)
if err != nil {
return err
Expand Down Expand Up @@ -237,6 +245,10 @@ func nonReady(logger logr.Logger, plan apply.Plan, ignoreOptions fleet.IgnoreOpt
return result
}

// modified returns a list of modified statuses based on the provided plan and previous release resources.
// The function iterates through the plan's create, delete, and update actions and constructs a modified status
// for each resource.
// If the number of modified statuses exceeds 10, the function stops and returns the current result.
func modified(plan apply.Plan, resourcesPreviousRelease *helmdeployer.Resources) (result []fleet.ModifiedStatus) {
defer func() {
sort.Slice(result, func(i, j int) bool {
Expand Down

0 comments on commit b14ff2c

Please sign in to comment.