diff --git a/internal/cmd/agent/deployer/applied/diff.go b/internal/cmd/agent/deployer/applied/diff.go index f891ba34c6..dfe2c5df57 100644 --- a/internal/cmd/agent/deployer/applied/diff.go +++ b/internal/cmd/agent/deployer/applied/diff.go @@ -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" @@ -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 } @@ -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 { @@ -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) @@ -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 } diff --git a/internal/cmd/agent/deployer/internal/diff/diff.go b/internal/cmd/agent/deployer/internal/diff/diff.go index 8925e2b66a..975620c3b9 100644 --- a/internal/cmd/agent/deployer/internal/diff/diff.go +++ b/internal/cmd/agent/deployer/internal/diff/diff.go @@ -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`. @@ -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" diff --git a/internal/cmd/agent/deployer/internal/diff/diff_options.go b/internal/cmd/agent/deployer/internal/diff/diff_options.go index 30399d0bde..d6d6304e8a 100644 --- a/internal/cmd/agent/deployer/internal/diff/diff_options.go +++ b/internal/cmd/agent/deployer/internal/diff/diff_options.go @@ -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 ( diff --git a/internal/cmd/agent/deployer/internal/json/json.go b/internal/cmd/agent/deployer/internal/diff/json/json.go similarity index 95% rename from internal/cmd/agent/deployer/internal/json/json.go rename to internal/cmd/agent/deployer/internal/diff/json/json.go index 45cdf64c57..c94f3b85be 100644 --- a/internal/cmd/agent/deployer/internal/json/json.go +++ b/internal/cmd/agent/deployer/internal/diff/json/json.go @@ -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 diff --git a/internal/cmd/agent/deployer/internal/kubernetes_vendor/pkg/api/v1/endpoints/util.go b/internal/cmd/agent/deployer/internal/diff/kubernetes_vendor/pkg/api/v1/endpoints/util.go similarity index 98% rename from internal/cmd/agent/deployer/internal/kubernetes_vendor/pkg/api/v1/endpoints/util.go rename to internal/cmd/agent/deployer/internal/diff/kubernetes_vendor/pkg/api/v1/endpoints/util.go index c6951429eb..0892138fd5 100644 --- a/internal/cmd/agent/deployer/internal/kubernetes_vendor/pkg/api/v1/endpoints/util.go +++ b/internal/cmd/agent/deployer/internal/diff/kubernetes_vendor/pkg/api/v1/endpoints/util.go @@ -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" ) diff --git a/internal/cmd/agent/deployer/internal/kubernetes_vendor/pkg/util/hash/hash.go b/internal/cmd/agent/deployer/internal/diff/kubernetes_vendor/pkg/util/hash/hash.go similarity index 100% rename from internal/cmd/agent/deployer/internal/kubernetes_vendor/pkg/util/hash/hash.go rename to internal/cmd/agent/deployer/internal/diff/kubernetes_vendor/pkg/util/hash/hash.go diff --git a/internal/cmd/agent/deployer/internal/scheme/scheme.go b/internal/cmd/agent/deployer/internal/diff/scheme/scheme.go similarity index 91% rename from internal/cmd/agent/deployer/internal/scheme/scheme.go rename to internal/cmd/agent/deployer/internal/diff/scheme/scheme.go index e34d9c2171..91bd2a9211 100644 --- a/internal/cmd/agent/deployer/internal/scheme/scheme.go +++ b/internal/cmd/agent/deployer/internal/diff/scheme/scheme.go @@ -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 ( diff --git a/internal/cmd/agent/deployer/internal/diffnormalize/normalize.go b/internal/cmd/agent/deployer/internal/diffnormalize/normalize.go deleted file mode 100644 index 9fbc5f509a..0000000000 --- a/internal/cmd/agent/deployer/internal/diffnormalize/normalize.go +++ /dev/null @@ -1,37 +0,0 @@ -// extracted from argoproj/argo-cd/util/argo/diff/normalize.go -package diffnormalize - -import ( - "github.com/rancher/fleet/internal/cmd/agent/deployer/internal/diff" - "github.com/rancher/fleet/internal/cmd/agent/deployer/internal/normalizers" - "github.com/rancher/fleet/internal/cmd/agent/deployer/internal/resource" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" -) - -// NewDiffNormalizer creates normalizer that uses Argo CD and application settings to normalize the resource prior to diffing. -func NewDiffNormalizer(ignore []resource.ResourceIgnoreDifferences, overrides map[string]resource.ResourceOverride) (diff.Normalizer, error) { - ignoreNormalizer, err := normalizers.NewIgnoreNormalizer(ignore, overrides) - if err != nil { - return nil, err - } - knownTypesNorm, err := normalizers.NewKnownTypesNormalizer(overrides) - if err != nil { - return nil, err - } - - return &composableNormalizer{normalizers: []diff.Normalizer{ignoreNormalizer, knownTypesNorm}}, nil -} - -type composableNormalizer struct { - normalizers []diff.Normalizer -} - -// Normalize performs resource normalization. -func (n *composableNormalizer) Normalize(un *unstructured.Unstructured) error { - for i := range n.normalizers { - if err := n.normalizers[i].Normalize(un); err != nil { - return err - } - } - return nil -} diff --git a/internal/cmd/agent/deployer/internal/normalizers/diff_normalizer.go b/internal/cmd/agent/deployer/internal/normalizers/diff_normalizer.go index 3d5f234865..00a3183b8a 100644 --- a/internal/cmd/agent/deployer/internal/normalizers/diff_normalizer.go +++ b/internal/cmd/agent/deployer/internal/normalizers/diff_normalizer.go @@ -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 ( @@ -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" ) diff --git a/internal/cmd/agent/deployer/internal/glob/glob.go b/internal/cmd/agent/deployer/internal/normalizers/glob/glob.go similarity index 87% rename from internal/cmd/agent/deployer/internal/glob/glob.go rename to internal/cmd/agent/deployer/internal/normalizers/glob/glob.go index 222dfb114d..665d447c04 100644 --- a/internal/cmd/agent/deployer/internal/glob/glob.go +++ b/internal/cmd/agent/deployer/internal/normalizers/glob/glob.go @@ -1,4 +1,4 @@ -// copied from argoproj/argo-cd/util/glob/glob.go +// +vendored argoproj/argo-cd/util/glob/glob.go package glob import ( diff --git a/internal/cmd/agent/deployer/internal/normalizers/knowntypes_normalizer.go b/internal/cmd/agent/deployer/internal/normalizers/knowntypes_normalizer.go index 87fd6b952d..4e7584a758 100644 --- a/internal/cmd/agent/deployer/internal/normalizers/knowntypes_normalizer.go +++ b/internal/cmd/agent/deployer/internal/normalizers/knowntypes_normalizer.go @@ -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 ( diff --git a/internal/cmd/agent/deployer/internal/resource/ignore.go b/internal/cmd/agent/deployer/internal/resource/ignore.go index 430cfbd900..43a56928fe 100644 --- a/internal/cmd/agent/deployer/internal/resource/ignore.go +++ b/internal/cmd/agent/deployer/internal/resource/ignore.go @@ -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 ( diff --git a/internal/cmd/agent/deployer/monitor/updatestatus.go b/internal/cmd/agent/deployer/monitor/updatestatus.go index d296f8faf4..20d5290e47 100644 --- a/internal/cmd/agent/deployer/monitor/updatestatus.go +++ b/internal/cmd/agent/deployer/monitor/updatestatus.go @@ -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 ( @@ -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 @@ -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 {