Skip to content

Commit

Permalink
Merge pull request #1028 from openshift/revert-1021-cherry-pick-1012-…
Browse files Browse the repository at this point in the history
…to-release-4.14

OCPBUGS-27822: Revert "[release-4.14] OCPBUGS-27175: clusterOperatorBuilder: Reconcile metadata on COs"
  • Loading branch information
openshift-merge-bot[bot] committed Jan 24, 2024
2 parents 5416ceb + 3079836 commit 7f3f152
Show file tree
Hide file tree
Showing 2 changed files with 57 additions and 33 deletions.
48 changes: 48 additions & 0 deletions lib/resourcemerge/os.go
Expand Up @@ -3,11 +3,41 @@ package resourcemerge
import (
"time"

"k8s.io/apimachinery/pkg/api/equality"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

configv1 "github.com/openshift/api/config/v1"
)

func EnsureClusterOperatorStatus(modified *bool, existing *configv1.ClusterOperator, required configv1.ClusterOperator) {
EnsureObjectMeta(modified, &existing.ObjectMeta, required.ObjectMeta)
ensureClusterOperatorStatus(modified, &existing.Status, required.Status)
}

func ensureClusterOperatorStatus(modified *bool, existing *configv1.ClusterOperatorStatus, required configv1.ClusterOperatorStatus) {
if !equality.Semantic.DeepEqual(existing.Conditions, required.Conditions) {
*modified = true
existing.Conditions = required.Conditions
}

if !equality.Semantic.DeepEqual(existing.Versions, required.Versions) {
*modified = true
existing.Versions = required.Versions
}
if !equality.Semantic.DeepEqual(existing.Extension.Raw, required.Extension.Raw) {
*modified = true
existing.Extension.Raw = required.Extension.Raw
}
if !equality.Semantic.DeepEqual(existing.Extension.Object, required.Extension.Object) {
*modified = true
existing.Extension.Object = required.Extension.Object
}
if !equality.Semantic.DeepEqual(existing.RelatedObjects, required.RelatedObjects) {
*modified = true
existing.RelatedObjects = required.RelatedObjects
}
}

func SetOperatorStatusCondition(conditions *[]configv1.ClusterOperatorStatusCondition, newCondition configv1.ClusterOperatorStatusCondition) {
if conditions == nil {
conditions = &[]configv1.ClusterOperatorStatusCondition{}
Expand Down Expand Up @@ -56,6 +86,10 @@ func IsOperatorStatusConditionTrue(conditions []configv1.ClusterOperatorStatusCo
return IsOperatorStatusConditionPresentAndEqual(conditions, conditionType, configv1.ConditionTrue)
}

func IsOperatorStatusConditionFalse(conditions []configv1.ClusterOperatorStatusCondition, conditionType configv1.ClusterStatusConditionType) bool {
return IsOperatorStatusConditionPresentAndEqual(conditions, conditionType, configv1.ConditionFalse)
}

func IsOperatorStatusConditionPresentAndEqual(conditions []configv1.ClusterOperatorStatusCondition, conditionType configv1.ClusterStatusConditionType, status configv1.ConditionStatus) bool {
for _, condition := range conditions {
if condition.Type == conditionType {
Expand All @@ -64,3 +98,17 @@ func IsOperatorStatusConditionPresentAndEqual(conditions []configv1.ClusterOpera
}
return false
}

func IsOperatorStatusConditionNotIn(conditions []configv1.ClusterOperatorStatusCondition, conditionType configv1.ClusterStatusConditionType, status ...configv1.ConditionStatus) bool {
for _, condition := range conditions {
if condition.Type == conditionType {
for _, s := range status {
if s == condition.Status {
return false
}
}
return true
}
}
return true
}
42 changes: 9 additions & 33 deletions pkg/cvo/internal/operatorstatus.go
Expand Up @@ -6,20 +6,16 @@ import (
"sort"
"strings"

"github.com/google/go-cmp/cmp"

kerrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/serializer"
"k8s.io/client-go/rest"
"k8s.io/klog/v2"

configv1 "github.com/openshift/api/config/v1"
configclientv1 "github.com/openshift/client-go/config/clientset/versioned/typed/config/v1"

"github.com/openshift/cluster-version-operator/lib/resourcebuilder"
"github.com/openshift/cluster-version-operator/lib/resourcemerge"
"github.com/openshift/cluster-version-operator/pkg/payload"
"github.com/openshift/library-go/pkg/manifest"
)
Expand All @@ -32,17 +28,17 @@ var (
)

func init() {
if err := configv1.Install(osScheme); err != nil {
if err := configv1.AddToScheme(osScheme); err != nil {
panic(err)
}

osMapper.RegisterGVK(configv1.GroupVersion.WithKind("ClusterOperator"), newClusterOperatorBuilder)
osMapper.RegisterGVK(configv1.SchemeGroupVersion.WithKind("ClusterOperator"), newClusterOperatorBuilder)
osMapper.AddToMap(resourcebuilder.Mapper)
}

// readClusterOperatorV1OrDie reads clusteroperator object from bytes. Panics on error.
func readClusterOperatorV1OrDie(objBytes []byte) *configv1.ClusterOperator {
requiredObj, err := runtime.Decode(osCodecs.UniversalDecoder(configv1.GroupVersion), objBytes)
requiredObj, err := runtime.Decode(osCodecs.UniversalDecoder(configv1.SchemeGroupVersion), objBytes)
if err != nil {
panic(err)
}
Expand Down Expand Up @@ -96,55 +92,35 @@ func (b *clusterOperatorBuilder) WithModifier(f resourcebuilder.MetaV1ObjectModi
}

func (b *clusterOperatorBuilder) Do(ctx context.Context) error {
co := readClusterOperatorV1OrDie(b.raw)
os := readClusterOperatorV1OrDie(b.raw)

// add cluster operator's start time if not already there
payload.COUpdateStartTimesEnsureName(co.Name)
payload.COUpdateStartTimesEnsureName(os.Name)

if b.modifier != nil {
b.modifier(co)
b.modifier(os)
}

// create the object, and if we successfully created, update the status
if b.mode == resourcebuilder.PrecreatingMode {
clusterOperator, err := b.createClient.Create(ctx, co, metav1.CreateOptions{})
clusterOperator, err := b.createClient.Create(ctx, os, metav1.CreateOptions{})
if err != nil {
if kerrors.IsAlreadyExists(err) {
return nil
}
return err
}
clusterOperator.Status.RelatedObjects = co.Status.DeepCopy().RelatedObjects
clusterOperator.Status.RelatedObjects = os.Status.DeepCopy().RelatedObjects
if _, err := b.createClient.UpdateStatus(ctx, clusterOperator, metav1.UpdateOptions{}); err != nil {
if kerrors.IsConflict(err) {
return nil
}
return err
}
return nil
} else if b.mode == resourcebuilder.ReconcilingMode {
existing, err := b.client.Get(ctx, co.Name)
if err != nil {
return err
}

var original configv1.ClusterOperator
existing.DeepCopyInto(&original)
var modified bool
resourcemerge.EnsureObjectMeta(&modified, &existing.ObjectMeta, co.ObjectMeta)
if modified {
if diff := cmp.Diff(&original, existing); diff != "" {
klog.V(2).Infof("Updating ClusterOperator metadata %s due to diff: %v", co.Name, diff)
} else {
klog.V(2).Infof("Updating ClusterOperator metadata %s with empty diff: possible hotloop after wrong comparison", co.Name)
}
if _, err := b.createClient.Update(ctx, existing, metav1.UpdateOptions{}); err != nil {
return err
}
}
}

return checkOperatorHealth(ctx, b.client, co, b.mode)
return checkOperatorHealth(ctx, b.client, os, b.mode)
}

func checkOperatorHealth(ctx context.Context, client ClusterOperatorsGetter, expected *configv1.ClusterOperator, mode resourcebuilder.Mode) error {
Expand Down

0 comments on commit 7f3f152

Please sign in to comment.