Merge pull request #746 from dddddai/get-member-workload-from-cache

Get member workload from cache instead of api server
This commit is contained in:
karmada-bot 2021-09-23 21:18:28 +08:00 committed by GitHub
commit d625a87783
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 27 additions and 32 deletions

View File

@ -116,12 +116,12 @@ func setupControllers(mgr controllerruntime.Manager, opts *options.Options, stop
objectWatcher := objectwatcher.NewObjectWatcher(mgr.GetClient(), mgr.GetRESTMapper(), util.NewClusterDynamicClientSetForAgent) objectWatcher := objectwatcher.NewObjectWatcher(mgr.GetClient(), mgr.GetRESTMapper(), util.NewClusterDynamicClientSetForAgent)
executionController := &execution.Controller{ executionController := &execution.Controller{
Client: mgr.GetClient(), Client: mgr.GetClient(),
EventRecorder: mgr.GetEventRecorderFor(execution.ControllerName), EventRecorder: mgr.GetEventRecorderFor(execution.ControllerName),
RESTMapper: mgr.GetRESTMapper(), RESTMapper: mgr.GetRESTMapper(),
ObjectWatcher: objectWatcher, ObjectWatcher: objectWatcher,
PredicateFunc: helper.NewExecutionPredicateOnAgent(), PredicateFunc: helper.NewExecutionPredicateOnAgent(),
ClusterClientSetFunc: util.NewClusterDynamicClientSetForAgent, InformerManager: informermanager.GetInstance(),
} }
if err := executionController.SetupWithManager(mgr); err != nil { if err := executionController.SetupWithManager(mgr); err != nil {
klog.Fatalf("Failed to setup execution controller: %v", err) klog.Fatalf("Failed to setup execution controller: %v", err)

View File

@ -222,12 +222,12 @@ func setupControllers(mgr controllerruntime.Manager, opts *options.Options, stop
} }
executionController := &execution.Controller{ executionController := &execution.Controller{
Client: mgr.GetClient(), Client: mgr.GetClient(),
EventRecorder: mgr.GetEventRecorderFor(execution.ControllerName), EventRecorder: mgr.GetEventRecorderFor(execution.ControllerName),
RESTMapper: mgr.GetRESTMapper(), RESTMapper: mgr.GetRESTMapper(),
ObjectWatcher: objectWatcher, ObjectWatcher: objectWatcher,
PredicateFunc: helper.NewExecutionPredicate(mgr), PredicateFunc: helper.NewExecutionPredicate(mgr),
ClusterClientSetFunc: util.NewClusterDynamicClientSet, InformerManager: informermanager.GetInstance(),
} }
if err := executionController.SetupWithManager(mgr); err != nil { if err := executionController.SetupWithManager(mgr); err != nil {
klog.Fatalf("Failed to setup execution controller: %v", err) klog.Fatalf("Failed to setup execution controller: %v", err)

View File

@ -20,9 +20,10 @@ import (
workv1alpha1 "github.com/karmada-io/karmada/pkg/apis/work/v1alpha1" workv1alpha1 "github.com/karmada-io/karmada/pkg/apis/work/v1alpha1"
"github.com/karmada-io/karmada/pkg/util" "github.com/karmada-io/karmada/pkg/util"
"github.com/karmada-io/karmada/pkg/util/helper" "github.com/karmada-io/karmada/pkg/util/helper"
"github.com/karmada-io/karmada/pkg/util/informermanager"
"github.com/karmada-io/karmada/pkg/util/informermanager/keys"
"github.com/karmada-io/karmada/pkg/util/names" "github.com/karmada-io/karmada/pkg/util/names"
"github.com/karmada-io/karmada/pkg/util/objectwatcher" "github.com/karmada-io/karmada/pkg/util/objectwatcher"
"github.com/karmada-io/karmada/pkg/util/restmapper"
) )
const ( const (
@ -32,12 +33,12 @@ const (
// Controller is to sync Work. // Controller is to sync Work.
type Controller struct { type Controller struct {
client.Client // used to operate Work resources. client.Client // used to operate Work resources.
EventRecorder record.EventRecorder EventRecorder record.EventRecorder
RESTMapper meta.RESTMapper RESTMapper meta.RESTMapper
ObjectWatcher objectwatcher.ObjectWatcher ObjectWatcher objectwatcher.ObjectWatcher
PredicateFunc predicate.Predicate PredicateFunc predicate.Predicate
ClusterClientSetFunc func(c *clusterv1alpha1.Cluster, client client.Client) (*util.DynamicClusterClient, error) InformerManager informermanager.MultiClusterInformerManager
} }
// Reconcile performs a full reconciliation for the object referred to by the Request. // Reconcile performs a full reconciliation for the object referred to by the Request.
@ -150,11 +151,6 @@ func (c *Controller) removeFinalizer(work *workv1alpha1.Work) (controllerruntime
// syncToClusters ensures that the state of the given object is synchronized to member clusters. // syncToClusters ensures that the state of the given object is synchronized to member clusters.
func (c *Controller) syncToClusters(cluster *clusterv1alpha1.Cluster, work *workv1alpha1.Work) error { func (c *Controller) syncToClusters(cluster *clusterv1alpha1.Cluster, work *workv1alpha1.Work) error {
clusterDynamicClient, err := c.ClusterClientSetFunc(cluster, c.Client)
if err != nil {
return err
}
var errs []error var errs []error
syncSucceedNum := 0 syncSucceedNum := 0
for _, manifest := range work.Spec.Workload.Manifests { for _, manifest := range work.Spec.Workload.Manifests {
@ -168,7 +164,7 @@ func (c *Controller) syncToClusters(cluster *clusterv1alpha1.Cluster, work *work
applied := helper.IsResourceApplied(&work.Status) applied := helper.IsResourceApplied(&work.Status)
if applied { if applied {
err = c.tryUpdateWorkload(cluster, workload, clusterDynamicClient) err = c.tryUpdateWorkload(cluster, workload)
if err != nil { if err != nil {
klog.Errorf("Failed to update resource(%v/%v) in the given member cluster %s, err is %v", workload.GetNamespace(), workload.GetName(), cluster.Name, err) klog.Errorf("Failed to update resource(%v/%v) in the given member cluster %s, err is %v", workload.GetNamespace(), workload.GetName(), cluster.Name, err)
errs = append(errs, err) errs = append(errs, err)
@ -188,7 +184,7 @@ func (c *Controller) syncToClusters(cluster *clusterv1alpha1.Cluster, work *work
if len(errs) > 0 { if len(errs) > 0 {
total := len(work.Spec.Workload.Manifests) total := len(work.Spec.Workload.Manifests)
message := fmt.Sprintf("Failed to apply all manifests (%v/%v): %v", syncSucceedNum, total, errors.NewAggregate(errs).Error()) message := fmt.Sprintf("Failed to apply all manifests (%v/%v): %v", syncSucceedNum, total, errors.NewAggregate(errs).Error())
err = c.updateAppliedCondition(work, metav1.ConditionFalse, "AppliedFailed", message) err := c.updateAppliedCondition(work, metav1.ConditionFalse, "AppliedFailed", message)
if err != nil { if err != nil {
klog.Errorf("Failed to update applied status for given work %v, namespace is %v, err is %v", work.Name, work.Namespace, err) klog.Errorf("Failed to update applied status for given work %v, namespace is %v, err is %v", work.Name, work.Namespace, err)
errs = append(errs, err) errs = append(errs, err)
@ -196,7 +192,7 @@ func (c *Controller) syncToClusters(cluster *clusterv1alpha1.Cluster, work *work
return errors.NewAggregate(errs) return errors.NewAggregate(errs)
} }
err = c.updateAppliedCondition(work, metav1.ConditionTrue, "AppliedSuccessful", "Manifest has been successfully applied") err := c.updateAppliedCondition(work, metav1.ConditionTrue, "AppliedSuccessful", "Manifest has been successfully applied")
if err != nil { if err != nil {
klog.Errorf("Failed to update applied status for given work %v, namespace is %v, err is %v", work.Name, work.Namespace, err) klog.Errorf("Failed to update applied status for given work %v, namespace is %v, err is %v", work.Name, work.Namespace, err)
return err return err
@ -205,15 +201,14 @@ func (c *Controller) syncToClusters(cluster *clusterv1alpha1.Cluster, work *work
return nil return nil
} }
func (c *Controller) tryUpdateWorkload(cluster *clusterv1alpha1.Cluster, workload *unstructured.Unstructured, clusterDynamicClient *util.DynamicClusterClient) error { func (c *Controller) tryUpdateWorkload(cluster *clusterv1alpha1.Cluster, workload *unstructured.Unstructured) error {
// todo: get clusterObj from cache fedKey, err := keys.FederatedKeyFunc(cluster.Name, workload)
dynamicResource, err := restmapper.GetGroupVersionResource(c.RESTMapper, workload.GroupVersionKind())
if err != nil { if err != nil {
klog.Errorf("Failed to get resource(%s/%s) as mapping GVK to GVR failed: %v", workload.GetNamespace(), workload.GetName(), err) klog.Errorf("Failed to get FederatedKey %s, error: %v", workload.GetName(), err)
return err return err
} }
clusterObj, err := clusterDynamicClient.DynamicClientSet.Resource(dynamicResource).Namespace(workload.GetNamespace()).Get(context.TODO(), workload.GetName(), metav1.GetOptions{}) clusterObj, err := helper.GetObjectFromCache(c.RESTMapper, c.InformerManager, fedKey)
if err != nil { if err != nil {
if !apierrors.IsNotFound(err) { if !apierrors.IsNotFound(err) {
klog.Errorf("Failed to get resource %v from member cluster, err is %v ", workload.GetName(), err) klog.Errorf("Failed to get resource %v from member cluster, err is %v ", workload.GetName(), err)