namespace_sync_controller: buildWorks parallel sync namespace

Signed-off-by: helen <haitao.zhang@daocloud.io>
This commit is contained in:
helen 2022-11-29 12:43:37 +08:00
parent b43e3ea5cb
commit 2f3d6dc859
1 changed files with 47 additions and 33 deletions

View File

@ -2,12 +2,14 @@ package namespace
import ( import (
"context" "context"
"fmt"
"strings" "strings"
corev1 "k8s.io/api/core/v1" corev1 "k8s.io/api/core/v1"
apierrors "k8s.io/apimachinery/pkg/api/errors" apierrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/types"
utilerrors "k8s.io/apimachinery/pkg/util/errors"
"k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/sets"
"k8s.io/client-go/tools/record" "k8s.io/client-go/tools/record"
"k8s.io/klog/v2" "k8s.io/klog/v2"
@ -107,47 +109,59 @@ func (c *Controller) buildWorks(namespace *corev1.Namespace, clusters []clusterv
return err return err
} }
for _, cluster := range clusters { errChan := make(chan error, len(clusters))
clonedNamespaced := namespaceObj.DeepCopy() for i := range clusters {
go func(cluster *clusterv1alpha1.Cluster, ch chan<- error) {
clonedNamespaced := namespaceObj.DeepCopy()
// namespace only care about ClusterOverridePolicy // namespace only care about ClusterOverridePolicy
cops, _, err := c.OverrideManager.ApplyOverridePolicies(clonedNamespaced, cluster.Name) cops, _, err := c.OverrideManager.ApplyOverridePolicies(clonedNamespaced, cluster.Name)
if err != nil { if err != nil {
klog.Errorf("Failed to apply overrides for %s/%s/%s, err is: %v", clonedNamespaced.GetKind(), clonedNamespaced.GetNamespace(), clonedNamespaced.GetName(), err) klog.Errorf("Failed to apply overrides for %s/%s/%s, err is: %v", clonedNamespaced.GetKind(), clonedNamespaced.GetNamespace(), clonedNamespaced.GetName(), err)
return err ch <- fmt.Errorf("sync namespace(%s) to cluster(%s) failed due to: %v", clonedNamespaced.GetName(), cluster.GetName(), err)
} }
annotations, err := binding.RecordAppliedOverrides(cops, nil, nil) annotations, err := binding.RecordAppliedOverrides(cops, nil, nil)
if err != nil { if err != nil {
klog.Errorf("failed to record appliedOverrides, Error: %v", err) klog.Errorf("failed to record appliedOverrides, Error: %v", err)
return err ch <- fmt.Errorf("sync namespace(%s) to cluster(%s) failed due to: %v", clonedNamespaced.GetName(), cluster.GetName(), err)
} }
workNamespace, err := names.GenerateExecutionSpaceName(cluster.Name) workNamespace, err := names.GenerateExecutionSpaceName(cluster.Name)
if err != nil { if err != nil {
klog.Errorf("Failed to generate execution space name for member cluster %s, err is %v", cluster.Name, err) klog.Errorf("Failed to generate execution space name for member cluster %s, err is %v", cluster.Name, err)
return err ch <- fmt.Errorf("sync namespace(%s) to cluster(%s) failed due to: %v", clonedNamespaced.GetName(), cluster.GetName(), err)
} }
workName := names.GenerateWorkName(namespaceObj.GetKind(), namespaceObj.GetName(), namespaceObj.GetNamespace()) workName := names.GenerateWorkName(namespaceObj.GetKind(), namespaceObj.GetName(), namespaceObj.GetNamespace())
objectMeta := metav1.ObjectMeta{ objectMeta := metav1.ObjectMeta{
Name: workName, Name: workName,
Namespace: workNamespace, Namespace: workNamespace,
Finalizers: []string{util.ExecutionControllerFinalizer}, Finalizers: []string{util.ExecutionControllerFinalizer},
OwnerReferences: []metav1.OwnerReference{ OwnerReferences: []metav1.OwnerReference{
*metav1.NewControllerRef(namespace, namespace.GroupVersionKind()), *metav1.NewControllerRef(namespace, namespace.GroupVersionKind()),
}, },
Annotations: annotations, Annotations: annotations,
} }
util.MergeLabel(clonedNamespaced, workv1alpha1.WorkNamespaceLabel, workNamespace) util.MergeLabel(clonedNamespaced, workv1alpha1.WorkNamespaceLabel, workNamespace)
util.MergeLabel(clonedNamespaced, workv1alpha1.WorkNameLabel, workName) util.MergeLabel(clonedNamespaced, workv1alpha1.WorkNameLabel, workName)
if err = helper.CreateOrUpdateWork(c.Client, objectMeta, clonedNamespaced); err != nil { if err = helper.CreateOrUpdateWork(c.Client, objectMeta, clonedNamespaced); err != nil {
return err ch <- fmt.Errorf("sync namespace(%s) to cluster(%s) failed due to: %v", clonedNamespaced.GetName(), cluster.GetName(), err)
}
ch <- nil
}(&clusters[i], errChan)
}
errs := []error{}
for range clusters {
if err := <-errChan; err != nil {
errs = append(errs, err)
} }
} }
return nil
return utilerrors.NewAggregate(errs)
} }
// SetupWithManager creates a controller and register to controller manager. // SetupWithManager creates a controller and register to controller manager.