Skip to content

Commit

Permalink
inject preservedLabelState to the failover to clusters
Browse files Browse the repository at this point in the history
Signed-off-by: changzhen <[email protected]>
  • Loading branch information
XiShanYongYe-Chang committed Nov 28, 2024
1 parent 6f4d69c commit 358628a
Showing 1 changed file with 37 additions and 26 deletions.
63 changes: 37 additions & 26 deletions pkg/controllers/binding/common.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import (
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/util/sets"
"k8s.io/klog/v2"
"k8s.io/utils/ptr"
"sigs.k8s.io/controller-runtime/pkg/client"
Expand All @@ -43,34 +44,18 @@ func ensureWork(
overrideManager overridemanager.OverrideManager, binding metav1.Object, scope apiextensionsv1.ResourceScope,
) error {
var targetClusters []workv1alpha2.TargetCluster
var placement *policyv1alpha1.Placement
var requiredByBindingSnapshot []workv1alpha2.BindingSnapshot
var replicas int32
var conflictResolutionInBinding policyv1alpha1.ConflictResolution
var suspension *policyv1alpha1.Suspension
var preserveResourcesOnDeletion *bool
var bindingSpec workv1alpha2.ResourceBindingSpec
switch scope {
case apiextensionsv1.NamespaceScoped:
bindingObj := binding.(*workv1alpha2.ResourceBinding)
targetClusters = bindingObj.Spec.Clusters
requiredByBindingSnapshot = bindingObj.Spec.RequiredBy
placement = bindingObj.Spec.Placement
replicas = bindingObj.Spec.Replicas
conflictResolutionInBinding = bindingObj.Spec.ConflictResolution
suspension = bindingObj.Spec.Suspension
preserveResourcesOnDeletion = bindingObj.Spec.PreserveResourcesOnDeletion
bindingSpec = bindingObj.Spec
case apiextensionsv1.ClusterScoped:
bindingObj := binding.(*workv1alpha2.ClusterResourceBinding)
targetClusters = bindingObj.Spec.Clusters
requiredByBindingSnapshot = bindingObj.Spec.RequiredBy
placement = bindingObj.Spec.Placement
replicas = bindingObj.Spec.Replicas
conflictResolutionInBinding = bindingObj.Spec.ConflictResolution
suspension = bindingObj.Spec.Suspension
preserveResourcesOnDeletion = bindingObj.Spec.PreserveResourcesOnDeletion
bindingSpec = bindingObj.Spec
}

targetClusters = mergeTargetClusters(targetClusters, requiredByBindingSnapshot)
targetClusters = bindingSpec.Clusters
targetClusters = mergeTargetClusters(targetClusters, bindingSpec.RequiredBy)

var jobCompletions []workv1alpha2.TargetCluster
var err error
Expand All @@ -89,7 +74,7 @@ func ensureWork(

// If and only if the resource template has replicas, and the replica scheduling policy is divided,
// we need to revise replicas.
if needReviseReplicas(replicas, placement) {
if needReviseReplicas(bindingSpec.Replicas, bindingSpec.Placement) {
if resourceInterpreter.HookEnabled(clonedWorkload.GroupVersionKind(), configv1alpha1.InterpreterOperationReviseReplica) {
clonedWorkload, err = resourceInterpreter.ReviseReplica(clonedWorkload, int64(targetCluster.Replicas))
if err != nil {
Expand Down Expand Up @@ -121,13 +106,17 @@ func ensureWork(
workLabel := mergeLabel(clonedWorkload, binding, scope)

annotations := mergeAnnotations(clonedWorkload, binding, scope)
annotations = mergeConflictResolution(clonedWorkload, conflictResolutionInBinding, annotations)
annotations = mergeConflictResolution(clonedWorkload, bindingSpec.ConflictResolution, annotations)
annotations, err = RecordAppliedOverrides(cops, ops, annotations)
if err != nil {
klog.Errorf("Failed to record appliedOverrides, Error: %v", err)
return err
}

// we need to figure out if the targetCluster is in the cluster we are going to migrate application to.
// If yes, we have to inject the preserved label state to clonedWorkload with the label.
clonedWorkload = injectReservedLabelState(bindingSpec, targetCluster, clonedWorkload)

workMeta := metav1.ObjectMeta{
Name: names.GenerateWorkName(clonedWorkload.GetKind(), clonedWorkload.GetName(), clonedWorkload.GetNamespace()),
Namespace: workNamespace,
Expand All @@ -141,21 +130,43 @@ func ensureWork(
c,
workMeta,
clonedWorkload,
helper.WithSuspendDispatching(shouldSuspendDispatching(suspension, targetCluster)),
helper.WithPreserveResourcesOnDeletion(ptr.Deref(preserveResourcesOnDeletion, false)),
helper.WithSuspendDispatching(shouldSuspendDispatching(bindingSpec.Suspension, targetCluster)),
helper.WithPreserveResourcesOnDeletion(ptr.Deref(bindingSpec.PreserveResourcesOnDeletion, false)),
); err != nil {
return err
}
}
return nil
}

func injectReservedLabelState(bindingSpec workv1alpha2.ResourceBindingSpec, targetCluster workv1alpha2.TargetCluster, workload *unstructured.Unstructured) *unstructured.Unstructured {
for _, evictionTask := range bindingSpec.GracefulEvictionTasks {
if len(evictionTask.PreservedLabelState) == 0 {
continue
}

clustersBeforeFailover := sets.NewString(evictionTask.ClustersBeforeFailover...)
if clustersBeforeFailover.Has(targetCluster.Name) {
continue
}

if evictionTask.Replicas == nil || targetCluster.Replicas != *evictionTask.Replicas {
continue
}

for key, value := range evictionTask.PreservedLabelState {
util.MergeLabel(workload, key, value)
}
}
return workload
}

func mergeTargetClusters(targetClusters []workv1alpha2.TargetCluster, requiredByBindingSnapshot []workv1alpha2.BindingSnapshot) []workv1alpha2.TargetCluster {
if len(requiredByBindingSnapshot) == 0 {
return targetClusters
}

scheduledClusterNames := util.ConvertToClusterNames(targetClusters)
scheduledClusterNames := util.ConvertTargetClustersToClusterNameSet(targetClusters)

Check failure on line 169 in pkg/controllers/binding/common.go

View workflow job for this annotation

GitHub Actions / init (v1.29.0)

undefined: util.ConvertTargetClustersToClusterNameSet

Check failure on line 169 in pkg/controllers/binding/common.go

View workflow job for this annotation

GitHub Actions / Test on Kubernetes (v1.29.0)

undefined: util.ConvertTargetClustersToClusterNameSet

Check failure on line 169 in pkg/controllers/binding/common.go

View workflow job for this annotation

GitHub Actions / init (v1.30.0)

undefined: util.ConvertTargetClustersToClusterNameSet

Check failure on line 169 in pkg/controllers/binding/common.go

View workflow job for this annotation

GitHub Actions / lint

undefined: util.ConvertTargetClustersToClusterNameSet) (typecheck)

Check failure on line 169 in pkg/controllers/binding/common.go

View workflow job for this annotation

GitHub Actions / lint

undefined: util.ConvertTargetClustersToClusterNameSet (typecheck)

Check failure on line 169 in pkg/controllers/binding/common.go

View workflow job for this annotation

GitHub Actions / lint

undefined: util.ConvertTargetClustersToClusterNameSet) (typecheck)

Check failure on line 169 in pkg/controllers/binding/common.go

View workflow job for this annotation

GitHub Actions / Test on Kubernetes (v1.30.0)

undefined: util.ConvertTargetClustersToClusterNameSet

Check failure on line 169 in pkg/controllers/binding/common.go

View workflow job for this annotation

GitHub Actions / init with config file (v1.29.0)

undefined: util.ConvertTargetClustersToClusterNameSet

Check failure on line 169 in pkg/controllers/binding/common.go

View workflow job for this annotation

GitHub Actions / Test on Kubernetes (v1.31.0)

undefined: util.ConvertTargetClustersToClusterNameSet

Check failure on line 169 in pkg/controllers/binding/common.go

View workflow job for this annotation

GitHub Actions / init (v1.31.0)

undefined: util.ConvertTargetClustersToClusterNameSet

Check failure on line 169 in pkg/controllers/binding/common.go

View workflow job for this annotation

GitHub Actions / init with config file (v1.30.0)

undefined: util.ConvertTargetClustersToClusterNameSet

Check failure on line 169 in pkg/controllers/binding/common.go

View workflow job for this annotation

GitHub Actions / init with config file (v1.31.0)

undefined: util.ConvertTargetClustersToClusterNameSet

Check failure on line 169 in pkg/controllers/binding/common.go

View workflow job for this annotation

GitHub Actions / compile

undefined: util.ConvertTargetClustersToClusterNameSet

for _, requiredByBinding := range requiredByBindingSnapshot {
for _, targetCluster := range requiredByBinding.Clusters {
Expand Down

0 comments on commit 358628a

Please sign in to comment.