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:
commit
d625a87783
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue