func (c *controller) Reconcile(request reconciler.Request) (reconciler.Result, error) {
	klog.V(4).Infof("reconcile node %s for cluster %s", request.Name, request.ClusterName)
	vExists := true
	vNode := &v1.Node{}
	if err := c.MultiClusterController.Get(request.ClusterName, request.Namespace, request.Name, vNode); err != nil {
		if !errors.IsNotFound(err) {
			return reconciler.Result{Requeue: true}, err
		}
		vExists = false
	}
	if vExists {
		if vNode.Labels[constants.LabelVirtualNode] != "true" {
			return reconciler.Result{}, nil
		}
		c.Lock()
		if _, exist := c.nodeNameToCluster[request.Name]; !exist {
			c.nodeNameToCluster[request.Name] = make(map[string]struct{})
		}
		c.nodeNameToCluster[request.Name][request.ClusterName] = struct{}{}
		c.Unlock()
	} else {
		c.Lock()
		if _, exists := c.nodeNameToCluster[request.Name]; exists {
			delete(c.nodeNameToCluster[request.Name], request.ClusterName)
		}
		c.Unlock()
	}
	return reconciler.Result{}, nil
}
The reconcile logic for tenant master node informer, the main purpose is to maintain
the nodeNameToCluster mapping
package node
import (
	v1 "k8s.io/api/core/v1"
	"k8s.io/apimachinery/pkg/api/errors"
	"k8s.io/klog"
	"sigs.k8s.io/cluster-api-provider-nested/virtualcluster/pkg/syncer/constants"
	"sigs.k8s.io/cluster-api-provider-nested/virtualcluster/pkg/util/reconciler"
)
func (c *controller) StartDWS(stopCh <-chan struct{}) error {
	return c.MultiClusterController.Start(stopCh)
}