in pkg/controllers/member/internalmembercluster/v1beta1/controller_v1beta1.go [51:105]
func (r *Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
imcKRef := klog.KRef(req.Namespace, req.Name)
startTime := time.Now()
klog.V(2).InfoS("Reconciliation starts", "internalMemberCluster", imcKRef)
defer func() {
latency := time.Since(startTime).Milliseconds()
klog.V(2).InfoS("Reconciliation ends", "internalMemberCluster", imcKRef, "latency", latency)
}()
var imc clusterv1beta1.InternalMemberCluster
if err := r.HubClient.Get(ctx, req.NamespacedName, &imc); err != nil {
if apierrors.IsNotFound(err) {
klog.V(4).InfoS("internal member cluster object is not found", "internalMemberCluster", imcKRef)
return ctrl.Result{}, nil
}
klog.ErrorS(err, "Failed to get internal member cluster object", "internalMemberCluster", imcKRef)
return ctrl.Result{}, err
}
switch imc.Spec.State {
case clusterv1beta1.ClusterStateLeave:
// The member cluster is leaving the fleet.
klog.V(2).InfoS("member cluster has left the fleet; performing cleanup", "internalMemberCluster", imcKRef)
// Clean up fleet networking related resources.
if r.AgentType == clusterv1beta1.MultiClusterServiceAgent {
if err := r.cleanupMCSRelatedResources(ctx); err != nil {
return ctrl.Result{}, err
}
}
if r.AgentType == clusterv1beta1.ServiceExportImportAgent {
if err := r.cleanupServiceExportRelatedResources(ctx); err != nil {
return ctrl.Result{}, err
}
}
// Update the agent status.
return ctrl.Result{}, r.updateAgentStatus(ctx, &imc)
case clusterv1beta1.ClusterStateJoin:
// The member cluster still has an active membership in the fleet; update the agent status.
if err := r.updateAgentStatus(ctx, &imc); err != nil {
return ctrl.Result{}, err
}
// Add jitter to the heartbeat report interval, so as to mitigate the thundering herd problem.
hbInterval := 1000 * imc.Spec.HeartbeatPeriodSeconds
jitterRange := int64(hbInterval*jitterPercent) / 100
requeueAfter := time.Millisecond * (time.Duration(hbInterval) + time.Duration(rand.Int63nRange(0, jitterRange)-jitterRange/2))
return ctrl.Result{RequeueAfter: requeueAfter}, nil
default:
klog.ErrorS(fmt.Errorf("cluster is of an invalid state"), "internalMemberCluster", imcKRef, "clusterState", imc.Spec.State)
}
return ctrl.Result{}, nil
}