diff --git a/lib/resourceapply/apiext.go b/lib/resourceapply/apiext.go index 696b78fc5..bce881f42 100644 --- a/lib/resourceapply/apiext.go +++ b/lib/resourceapply/apiext.go @@ -10,6 +10,7 @@ import ( apiextclientv1beta1 "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/diff" "k8s.io/klog/v2" "k8s.io/utils/pointer" ) @@ -17,6 +18,7 @@ import ( func ApplyCustomResourceDefinitionv1beta1(ctx context.Context, client apiextclientv1beta1.CustomResourceDefinitionsGetter, required *apiextv1beta1.CustomResourceDefinition) (*apiextv1beta1.CustomResourceDefinition, bool, error) { existing, err := client.CustomResourceDefinitions().Get(ctx, required.Name, metav1.GetOptions{}) if apierrors.IsNotFound(err) { + klog.V(2).Infof("CRD %s not found, creating", required.Name) actual, err := client.CustomResourceDefinitions().Create(ctx, required, metav1.CreateOptions{}) return actual, true, err } @@ -34,7 +36,7 @@ func ApplyCustomResourceDefinitionv1beta1(ctx context.Context, client apiextclie return existing, false, nil } - klog.V(2).Infof("Updating CRD %s", required.Name) + klog.V(2).Infof("Updating CRD %s due to diff: %v", required.Name, diff.ObjectDiff(existing, required)) actual, err := client.CustomResourceDefinitions().Update(ctx, existing, metav1.UpdateOptions{}) return actual, true, err @@ -43,6 +45,7 @@ func ApplyCustomResourceDefinitionv1beta1(ctx context.Context, client apiextclie func ApplyCustomResourceDefinitionv1(ctx context.Context, client apiextclientv1.CustomResourceDefinitionsGetter, required *apiextv1.CustomResourceDefinition) (*apiextv1.CustomResourceDefinition, bool, error) { existing, err := client.CustomResourceDefinitions().Get(ctx, required.Name, metav1.GetOptions{}) if apierrors.IsNotFound(err) { + klog.V(2).Infof("CRD %s not found, creating", required.Name) actual, err := client.CustomResourceDefinitions().Create(ctx, required, metav1.CreateOptions{}) return actual, true, err } @@ -60,7 +63,7 @@ func ApplyCustomResourceDefinitionv1(ctx context.Context, client apiextclientv1. return existing, false, nil } - klog.V(2).Infof("Updating CRD %s", required.Name) + klog.V(2).Infof("Updating CRD %s due to diff: %v", required.Name, diff.ObjectDiff(existing, required)) actual, err := client.CustomResourceDefinitions().Update(ctx, existing, metav1.UpdateOptions{}) return actual, true, err diff --git a/lib/resourceapply/apireg.go b/lib/resourceapply/apireg.go index c36bdff9d..440d0f822 100644 --- a/lib/resourceapply/apireg.go +++ b/lib/resourceapply/apireg.go @@ -6,6 +6,8 @@ import ( "github.com/openshift/cluster-version-operator/lib/resourcemerge" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/diff" + "k8s.io/klog/v2" apiregv1 "k8s.io/kube-aggregator/pkg/apis/apiregistration/v1" apiregclientv1 "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/typed/apiregistration/v1" "k8s.io/utils/pointer" @@ -14,6 +16,7 @@ import ( func ApplyAPIServicev1(ctx context.Context, client apiregclientv1.APIServicesGetter, required *apiregv1.APIService) (*apiregv1.APIService, bool, error) { existing, err := client.APIServices().Get(ctx, required.Name, metav1.GetOptions{}) if apierrors.IsNotFound(err) { + klog.V(2).Infof("APIService %s not found, creating", required.Name) actual, err := client.APIServices().Create(ctx, required, metav1.CreateOptions{}) return actual, true, err } @@ -30,6 +33,7 @@ func ApplyAPIServicev1(ctx context.Context, client apiregclientv1.APIServicesGet if !*modified { return existing, false, nil } + klog.V(2).Infof("Updating APIService %s due to diff: %v", required.Name, diff.ObjectDiff(existing, required)) actual, err := client.APIServices().Update(ctx, existing, metav1.UpdateOptions{}) return actual, true, err diff --git a/lib/resourceapply/apps.go b/lib/resourceapply/apps.go index e9492241c..b337f463b 100644 --- a/lib/resourceapply/apps.go +++ b/lib/resourceapply/apps.go @@ -7,8 +7,10 @@ import ( appsv1 "k8s.io/api/apps/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/diff" appsclientv1 "k8s.io/client-go/kubernetes/typed/apps/v1" appslisterv1 "k8s.io/client-go/listers/apps/v1" + "k8s.io/klog/v2" "k8s.io/utils/pointer" ) @@ -16,6 +18,7 @@ import ( func ApplyDeploymentv1(ctx context.Context, client appsclientv1.DeploymentsGetter, required *appsv1.Deployment) (*appsv1.Deployment, bool, error) { existing, err := client.Deployments(required.Namespace).Get(ctx, required.Name, metav1.GetOptions{}) if apierrors.IsNotFound(err) { + klog.V(2).Infof("Deployment %s/%s not found, creating", required.Namespace, required.Name) actual, err := client.Deployments(required.Namespace).Create(ctx, required, metav1.CreateOptions{}) return actual, true, err } @@ -32,6 +35,7 @@ func ApplyDeploymentv1(ctx context.Context, client appsclientv1.DeploymentsGette if !*modified { return existing, false, nil } + klog.V(2).Infof("Updating Deployment %s/%s due to diff: %v", required.Namespace, required.Name, diff.ObjectDiff(existing, required)) actual, err := client.Deployments(required.Namespace).Update(ctx, existing, metav1.UpdateOptions{}) return actual, true, err @@ -41,6 +45,7 @@ func ApplyDeploymentv1(ctx context.Context, client appsclientv1.DeploymentsGette func ApplyDeploymentFromCache(ctx context.Context, lister appslisterv1.DeploymentLister, client appsclientv1.DeploymentsGetter, required *appsv1.Deployment) (*appsv1.Deployment, bool, error) { existing, err := lister.Deployments(required.Namespace).Get(required.Name) if apierrors.IsNotFound(err) { + klog.V(2).Infof("Deployment %s/%s not found, creating", required.Namespace, required.Name) actual, err := client.Deployments(required.Namespace).Create(ctx, required, metav1.CreateOptions{}) return actual, true, err } @@ -58,6 +63,7 @@ func ApplyDeploymentFromCache(ctx context.Context, lister appslisterv1.Deploymen if !*modified { return existing, false, nil } + klog.V(2).Infof("Updating Deployment %s/%s due to diff: %v", required.Namespace, required.Name, diff.ObjectDiff(existing, required)) actual, err := client.Deployments(required.Namespace).Update(ctx, existing, metav1.UpdateOptions{}) return actual, true, err @@ -67,6 +73,7 @@ func ApplyDeploymentFromCache(ctx context.Context, lister appslisterv1.Deploymen func ApplyDaemonSetv1(ctx context.Context, client appsclientv1.DaemonSetsGetter, required *appsv1.DaemonSet) (*appsv1.DaemonSet, bool, error) { existing, err := client.DaemonSets(required.Namespace).Get(ctx, required.Name, metav1.GetOptions{}) if apierrors.IsNotFound(err) { + klog.V(2).Infof("DaemonSet %s/%s not found, creating", required.Namespace, required.Name) actual, err := client.DaemonSets(required.Namespace).Create(ctx, required, metav1.CreateOptions{}) return actual, true, err } @@ -84,6 +91,8 @@ func ApplyDaemonSetv1(ctx context.Context, client appsclientv1.DaemonSetsGetter, return existing, false, nil } + klog.V(2).Infof("Updating DaemonSet %s/%s due to diff: %v", required.Namespace, required.Name, diff.ObjectDiff(existing, required)) + actual, err := client.DaemonSets(required.Namespace).Update(ctx, existing, metav1.UpdateOptions{}) return actual, true, err } @@ -92,6 +101,7 @@ func ApplyDaemonSetv1(ctx context.Context, client appsclientv1.DaemonSetsGetter, func ApplyDaemonSetFromCache(ctx context.Context, lister appslisterv1.DaemonSetLister, client appsclientv1.DaemonSetsGetter, required *appsv1.DaemonSet) (*appsv1.DaemonSet, bool, error) { existing, err := lister.DaemonSets(required.Namespace).Get(required.Name) if apierrors.IsNotFound(err) { + klog.V(2).Infof("DaemonSet %s/%s not found, creating", required.Namespace, required.Name) actual, err := client.DaemonSets(required.Namespace).Create(ctx, required, metav1.CreateOptions{}) return actual, true, err } @@ -110,6 +120,8 @@ func ApplyDaemonSetFromCache(ctx context.Context, lister appslisterv1.DaemonSetL return existing, false, nil } + klog.V(2).Infof("Updating DaemonSet %s/%s due to diff: %v", required.Namespace, required.Name, diff.ObjectDiff(existing, required)) + actual, err := client.DaemonSets(required.Namespace).Update(ctx, existing, metav1.UpdateOptions{}) return actual, true, err } diff --git a/lib/resourceapply/batch.go b/lib/resourceapply/batch.go index 35d176ac3..964e34968 100644 --- a/lib/resourceapply/batch.go +++ b/lib/resourceapply/batch.go @@ -7,7 +7,9 @@ import ( batchv1 "k8s.io/api/batch/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/diff" batchclientv1 "k8s.io/client-go/kubernetes/typed/batch/v1" + "k8s.io/klog/v2" "k8s.io/utils/pointer" ) @@ -15,6 +17,7 @@ import ( func ApplyJobv1(ctx context.Context, client batchclientv1.JobsGetter, required *batchv1.Job) (*batchv1.Job, bool, error) { existing, err := client.Jobs(required.Namespace).Get(ctx, required.Name, metav1.GetOptions{}) if apierrors.IsNotFound(err) { + klog.V(2).Infof("Job %s/%s not found, creating", required.Namespace, required.Name) actual, err := client.Jobs(required.Namespace).Create(ctx, required, metav1.CreateOptions{}) return actual, true, err } @@ -32,6 +35,8 @@ func ApplyJobv1(ctx context.Context, client batchclientv1.JobsGetter, required * return existing, false, nil } + klog.V(2).Infof("Updating Job %s/%s due to diff: %v", required.Namespace, required.Name, diff.ObjectDiff(existing, required)) + actual, err := client.Jobs(required.Namespace).Update(ctx, existing, metav1.UpdateOptions{}) return actual, true, err } diff --git a/lib/resourceapply/core.go b/lib/resourceapply/core.go index c33d34e71..dc772e8b0 100644 --- a/lib/resourceapply/core.go +++ b/lib/resourceapply/core.go @@ -3,10 +3,13 @@ package resourceapply import ( "context" + "k8s.io/klog/v2" + corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/equality" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/diff" coreclientv1 "k8s.io/client-go/kubernetes/typed/core/v1" "k8s.io/utils/pointer" @@ -17,6 +20,7 @@ import ( func ApplyNamespacev1(ctx context.Context, client coreclientv1.NamespacesGetter, required *corev1.Namespace) (*corev1.Namespace, bool, error) { existing, err := client.Namespaces().Get(ctx, required.Name, metav1.GetOptions{}) if apierrors.IsNotFound(err) { + klog.V(2).Infof("Namespace %s not found, creating", required.Name) actual, err := client.Namespaces().Create(ctx, required, metav1.CreateOptions{}) return actual, true, err } @@ -33,6 +37,7 @@ func ApplyNamespacev1(ctx context.Context, client coreclientv1.NamespacesGetter, if !*modified { return existing, false, nil } + klog.V(2).Infof("Updating Namespace %s due to diff: %v", required.Name, diff.ObjectDiff(existing, required)) actual, err := client.Namespaces().Update(ctx, existing, metav1.UpdateOptions{}) return actual, true, err @@ -44,6 +49,7 @@ func ApplyNamespacev1(ctx context.Context, client coreclientv1.NamespacesGetter, func ApplyServicev1(ctx context.Context, client coreclientv1.ServicesGetter, required *corev1.Service) (*corev1.Service, bool, error) { existing, err := client.Services(required.Namespace).Get(ctx, required.Name, metav1.GetOptions{}) if apierrors.IsNotFound(err) { + klog.V(2).Infof("Service %s/%s not found, creating", required.Namespace, required.Name) actual, err := client.Services(required.Namespace).Create(ctx, required, metav1.CreateOptions{}) return actual, true, err } @@ -66,6 +72,8 @@ func ApplyServicev1(ctx context.Context, client coreclientv1.ServicesGetter, req } existing.Spec.Selector = required.Spec.Selector + klog.V(2).Infof("Updating Service %s/%s due to diff: %v", required.Namespace, required.Name, diff.ObjectDiff(existing, required)) + actual, err := client.Services(required.Namespace).Update(ctx, existing, metav1.UpdateOptions{}) return actual, true, err } @@ -74,6 +82,7 @@ func ApplyServicev1(ctx context.Context, client coreclientv1.ServicesGetter, req func ApplyServiceAccountv1(ctx context.Context, client coreclientv1.ServiceAccountsGetter, required *corev1.ServiceAccount) (*corev1.ServiceAccount, bool, error) { existing, err := client.ServiceAccounts(required.Namespace).Get(ctx, required.Name, metav1.GetOptions{}) if apierrors.IsNotFound(err) { + klog.V(2).Infof("ServiceAccount %s/%s not found, creating", required.Namespace, required.Name) actual, err := client.ServiceAccounts(required.Namespace).Create(ctx, required, metav1.CreateOptions{}) return actual, true, err } @@ -91,6 +100,8 @@ func ApplyServiceAccountv1(ctx context.Context, client coreclientv1.ServiceAccou return existing, false, nil } + klog.V(2).Infof("Updating ServiceAccount %s/%s due to diff: %v", required.Namespace, required.Name, diff.ObjectDiff(existing, required)) + actual, err := client.ServiceAccounts(required.Namespace).Update(ctx, existing, metav1.UpdateOptions{}) return actual, true, err } @@ -99,6 +110,7 @@ func ApplyServiceAccountv1(ctx context.Context, client coreclientv1.ServiceAccou func ApplyConfigMapv1(ctx context.Context, client coreclientv1.ConfigMapsGetter, required *corev1.ConfigMap) (*corev1.ConfigMap, bool, error) { existing, err := client.ConfigMaps(required.Namespace).Get(ctx, required.Name, metav1.GetOptions{}) if apierrors.IsNotFound(err) { + klog.V(2).Infof("ConfigMap %s/%s not found, creating", required.Namespace, required.Name) actual, err := client.ConfigMaps(required.Namespace).Create(ctx, required, metav1.CreateOptions{}) return actual, true, err } @@ -116,6 +128,8 @@ func ApplyConfigMapv1(ctx context.Context, client coreclientv1.ConfigMapsGetter, return existing, false, nil } + klog.V(2).Infof("Updating ConfigMap %s/%s due to diff: %v", required.Namespace, required.Name, diff.ObjectDiff(existing, required)) + actual, err := client.ConfigMaps(required.Namespace).Update(ctx, existing, metav1.UpdateOptions{}) return actual, true, err } diff --git a/lib/resourceapply/cv.go b/lib/resourceapply/cv.go index 3b2b108a6..357d67e3f 100644 --- a/lib/resourceapply/cv.go +++ b/lib/resourceapply/cv.go @@ -9,6 +9,8 @@ import ( "github.com/openshift/cluster-version-operator/lib/resourcemerge" "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/diff" + "k8s.io/klog/v2" "k8s.io/utils/pointer" ) @@ -32,6 +34,8 @@ func ApplyClusterVersionv1(ctx context.Context, client configclientv1.ClusterVer return existing, false, nil } + klog.V(2).Infof("Updating ClusterVersion %s due to diff: %v", required.Name, diff.ObjectDiff(existing, required)) + actual, err := client.ClusterVersions().Update(ctx, existing, metav1.UpdateOptions{}) return actual, true, err } @@ -58,6 +62,8 @@ func ApplyClusterVersionFromCache(ctx context.Context, lister configlistersv1.Cl return existing, false, nil } + klog.V(2).Infof("Updating ClusterVersion %s due to diff: %v", required.Name, diff.ObjectDiff(existing, required)) + actual, err := client.ClusterVersions().Update(ctx, existing, metav1.UpdateOptions{}) return actual, true, err } diff --git a/lib/resourceapply/rbac.go b/lib/resourceapply/rbac.go index 632ded71f..efc270d32 100644 --- a/lib/resourceapply/rbac.go +++ b/lib/resourceapply/rbac.go @@ -7,7 +7,9 @@ import ( rbacv1 "k8s.io/api/rbac/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/diff" rbacclientv1 "k8s.io/client-go/kubernetes/typed/rbac/v1" + "k8s.io/klog/v2" "k8s.io/utils/pointer" ) @@ -15,6 +17,7 @@ import ( func ApplyClusterRoleBindingv1(ctx context.Context, client rbacclientv1.ClusterRoleBindingsGetter, required *rbacv1.ClusterRoleBinding) (*rbacv1.ClusterRoleBinding, bool, error) { existing, err := client.ClusterRoleBindings().Get(ctx, required.Name, metav1.GetOptions{}) if apierrors.IsNotFound(err) { + klog.V(2).Infof("ClusterRoleBinding %s not found, creating", required.Name) actual, err := client.ClusterRoleBindings().Create(ctx, required, metav1.CreateOptions{}) return actual, true, err } @@ -31,6 +34,7 @@ func ApplyClusterRoleBindingv1(ctx context.Context, client rbacclientv1.ClusterR if !*modified { return existing, false, nil } + klog.V(2).Infof("Updating ClusterRoleBinding %s due to diff: %v", required.Name, diff.ObjectDiff(existing, required)) actual, err := client.ClusterRoleBindings().Update(ctx, existing, metav1.UpdateOptions{}) return actual, true, err @@ -40,6 +44,7 @@ func ApplyClusterRoleBindingv1(ctx context.Context, client rbacclientv1.ClusterR func ApplyClusterRolev1(ctx context.Context, client rbacclientv1.ClusterRolesGetter, required *rbacv1.ClusterRole) (*rbacv1.ClusterRole, bool, error) { existing, err := client.ClusterRoles().Get(ctx, required.Name, metav1.GetOptions{}) if apierrors.IsNotFound(err) { + klog.V(2).Infof("ClusterRole %s not found, creating", required.Name) actual, err := client.ClusterRoles().Create(ctx, required, metav1.CreateOptions{}) return actual, true, err } @@ -56,6 +61,7 @@ func ApplyClusterRolev1(ctx context.Context, client rbacclientv1.ClusterRolesGet if !*modified { return existing, false, nil } + klog.V(2).Infof("Updating ClusterRole %s/%s due to diff: %v", required.Name, diff.ObjectDiff(existing, required)) actual, err := client.ClusterRoles().Update(ctx, existing, metav1.UpdateOptions{}) return actual, true, err @@ -65,6 +71,7 @@ func ApplyClusterRolev1(ctx context.Context, client rbacclientv1.ClusterRolesGet func ApplyRoleBindingv1(ctx context.Context, client rbacclientv1.RoleBindingsGetter, required *rbacv1.RoleBinding) (*rbacv1.RoleBinding, bool, error) { existing, err := client.RoleBindings(required.Namespace).Get(ctx, required.Name, metav1.GetOptions{}) if apierrors.IsNotFound(err) { + klog.V(2).Infof("RoleBinding %s/%s not found, creating", required.Namespace, required.Name) actual, err := client.RoleBindings(required.Namespace).Create(ctx, required, metav1.CreateOptions{}) return actual, true, err } @@ -81,6 +88,7 @@ func ApplyRoleBindingv1(ctx context.Context, client rbacclientv1.RoleBindingsGet if !*modified { return existing, false, nil } + klog.V(2).Infof("Updating RoleBinding %s/%s due to diff: %v", required.Namespace, required.Name, diff.ObjectDiff(existing, required)) actual, err := client.RoleBindings(required.Namespace).Update(ctx, existing, metav1.UpdateOptions{}) return actual, true, err @@ -90,6 +98,7 @@ func ApplyRoleBindingv1(ctx context.Context, client rbacclientv1.RoleBindingsGet func ApplyRolev1(ctx context.Context, client rbacclientv1.RolesGetter, required *rbacv1.Role) (*rbacv1.Role, bool, error) { existing, err := client.Roles(required.Namespace).Get(ctx, required.Name, metav1.GetOptions{}) if apierrors.IsNotFound(err) { + klog.V(2).Infof("Role %s/%s not found, creating", required.Namespace, required.Name) actual, err := client.Roles(required.Namespace).Create(ctx, required, metav1.CreateOptions{}) return actual, true, err } @@ -106,6 +115,7 @@ func ApplyRolev1(ctx context.Context, client rbacclientv1.RolesGetter, required if !*modified { return existing, false, nil } + klog.V(2).Infof("Updating Role %s/%s due to diff: %v", required.Namespace, required.Name, diff.ObjectDiff(existing, required)) actual, err := client.Roles(required.Namespace).Update(ctx, existing, metav1.UpdateOptions{}) return actual, true, err diff --git a/lib/resourceapply/security.go b/lib/resourceapply/security.go index 1424c4e06..1ab9c44ac 100644 --- a/lib/resourceapply/security.go +++ b/lib/resourceapply/security.go @@ -8,6 +8,8 @@ import ( "github.com/openshift/cluster-version-operator/lib/resourcemerge" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/diff" + "k8s.io/klog/v2" "k8s.io/utils/pointer" ) @@ -15,6 +17,7 @@ import ( func ApplySecurityContextConstraintsv1(ctx context.Context, client securityclientv1.SecurityContextConstraintsGetter, required *securityv1.SecurityContextConstraints) (*securityv1.SecurityContextConstraints, bool, error) { existing, err := client.SecurityContextConstraints().Get(ctx, required.Name, metav1.GetOptions{}) if apierrors.IsNotFound(err) { + klog.V(2).Infof("SCC %s not found, creating", required.Name) actual, err := client.SecurityContextConstraints().Create(ctx, required, metav1.CreateOptions{}) return actual, true, err } @@ -32,6 +35,8 @@ func ApplySecurityContextConstraintsv1(ctx context.Context, client securityclien return existing, false, nil } + klog.V(2).Infof("Updating SCC %s due to diff: %v", required.Name, diff.ObjectDiff(existing, required)) + actual, err := client.SecurityContextConstraints().Update(ctx, existing, metav1.UpdateOptions{}) return actual, true, err } diff --git a/pkg/cvo/internal/generic.go b/pkg/cvo/internal/generic.go index ec6005c11..bcf95b6ec 100644 --- a/pkg/cvo/internal/generic.go +++ b/pkg/cvo/internal/generic.go @@ -11,9 +11,11 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/util/diff" "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/strategicpatch" "k8s.io/client-go/dynamic" + "k8s.io/klog/v2" "github.com/openshift/client-go/config/clientset/versioned/scheme" "github.com/openshift/cluster-version-operator/lib/resourcebuilder" @@ -35,6 +37,7 @@ func applyUnstructured(ctx context.Context, client dynamic.ResourceInterface, re } existing, err := client.Get(ctx, required.GetName(), metav1.GetOptions{}) if apierrors.IsNotFound(err) { + klog.V(2).Infof("%s %s/%s not found, creating", required.GetKind(), required.GetNamespace(), required.GetName()) actual, err := client.Create(ctx, required, metav1.CreateOptions{}) return actual, true, err } @@ -46,10 +49,24 @@ func applyUnstructured(ctx context.Context, client dynamic.ResourceInterface, re return nil, false, nil } - existing.SetAnnotations(required.GetAnnotations()) - existing.SetLabels(required.GetLabels()) - existing.SetOwnerReferences(required.GetOwnerReferences()) skipKeys := sets.NewString("apiVersion", "kind", "metadata", "status") + + // create a copy of required, but copy skipKeys from existing + // this would copy skipKeys data into expected from existing + expected := required.DeepCopy() + for k, v := range existing.Object { + if skipKeys.Has(k) { + expected.Object[k] = v + } + } + + objDiff := diff.ObjectDiff(expected, existing) + if objDiff == "" { + // Skip update, as no changes found + return existing, false, nil + } + + // copy all keys from required in existing except skipKeys for k, v := range required.Object { if skipKeys.Has(k) { continue @@ -57,6 +74,12 @@ func applyUnstructured(ctx context.Context, client dynamic.ResourceInterface, re existing.Object[k] = v } + existing.SetAnnotations(required.GetAnnotations()) + existing.SetLabels(required.GetLabels()) + existing.SetOwnerReferences(required.GetOwnerReferences()) + + klog.V(2).Infof("Updating %s %s/%s due to diff: %v", required.GetKind(), required.GetNamespace(), required.GetName(), objDiff) + actual, err := client.Update(ctx, existing, metav1.UpdateOptions{}) if err != nil { return nil, false, err