github.com/jingruilea/kubeedge@v1.2.0-beta.0.0.20200410162146-4bb8902b3879/cloud/pkg/cloudhub/cloudhub.go (about)

     1  package cloudhub
     2  
     3  import (
     4  	"os"
     5  
     6  	"k8s.io/client-go/rest"
     7  	"k8s.io/client-go/tools/cache"
     8  	"k8s.io/client-go/tools/clientcmd"
     9  	"k8s.io/klog"
    10  
    11  	"github.com/kubeedge/beehive/pkg/core"
    12  	beehiveContext "github.com/kubeedge/beehive/pkg/core/context"
    13  	"github.com/kubeedge/kubeedge/cloud/pkg/client/clientset/versioned"
    14  	crdinformerfactory "github.com/kubeedge/kubeedge/cloud/pkg/client/informers/externalversions"
    15  	"github.com/kubeedge/kubeedge/cloud/pkg/cloudhub/channelq"
    16  	hubconfig "github.com/kubeedge/kubeedge/cloud/pkg/cloudhub/config"
    17  	"github.com/kubeedge/kubeedge/cloud/pkg/cloudhub/servers"
    18  	"github.com/kubeedge/kubeedge/cloud/pkg/cloudhub/servers/udsserver"
    19  	"github.com/kubeedge/kubeedge/pkg/apis/componentconfig/cloudcore/v1alpha1"
    20  )
    21  
    22  type cloudHub struct {
    23  	enable bool
    24  }
    25  
    26  func newCloudHub(enable bool) *cloudHub {
    27  	return &cloudHub{
    28  		enable: enable,
    29  	}
    30  }
    31  
    32  func Register(hub *v1alpha1.CloudHub, kubeAPIConfig *v1alpha1.KubeAPIConfig) {
    33  	hubconfig.InitConfigure(hub, kubeAPIConfig)
    34  	core.Register(newCloudHub(hub.Enable))
    35  }
    36  
    37  func (a *cloudHub) Name() string {
    38  	return "cloudhub"
    39  }
    40  
    41  func (a *cloudHub) Group() string {
    42  	return "cloudhub"
    43  }
    44  
    45  // Enable indicates whether enable this module
    46  func (a *cloudHub) Enable() bool {
    47  	return a.enable
    48  }
    49  
    50  func (a *cloudHub) Start() {
    51  	objectSyncController := newObjectSyncController()
    52  
    53  	if !cache.WaitForCacheSync(beehiveContext.Done(),
    54  		objectSyncController.ClusterObjectSyncSynced,
    55  		objectSyncController.ObjectSyncSynced,
    56  	) {
    57  		klog.Errorf("unable to sync caches for objectSyncController")
    58  		os.Exit(1)
    59  	}
    60  
    61  	messageq := channelq.NewChannelMessageQueue(objectSyncController)
    62  
    63  	// start dispatch message from the cloud to edge node
    64  	go messageq.DispatchMessage()
    65  
    66  	servers.StartCloudHub(messageq)
    67  
    68  	if hubconfig.Config.UnixSocket.Enable {
    69  		// The uds server is only used to communicate with csi driver from kubeedge on cloud.
    70  		// It is not used to communicate between cloud and edge.
    71  		go udsserver.StartServer(hubconfig.Config.UnixSocket.Address)
    72  	}
    73  }
    74  
    75  func newObjectSyncController() *hubconfig.ObjectSyncController {
    76  	config, err := buildConfig()
    77  	if err != nil {
    78  		klog.Errorf("Failed to build config, err: %v", err)
    79  		os.Exit(1)
    80  	}
    81  
    82  	crdClient := versioned.NewForConfigOrDie(config)
    83  	crdFactory := crdinformerfactory.NewSharedInformerFactory(crdClient, 0)
    84  
    85  	clusterObjectSyncInformer := crdFactory.Reliablesyncs().V1alpha1().ClusterObjectSyncs()
    86  	objectSyncInformer := crdFactory.Reliablesyncs().V1alpha1().ObjectSyncs()
    87  
    88  	sc := &hubconfig.ObjectSyncController{
    89  		CrdClient: crdClient,
    90  
    91  		ClusterObjectSyncInformer: clusterObjectSyncInformer,
    92  		ObjectSyncInformer:        objectSyncInformer,
    93  
    94  		ClusterObjectSyncSynced: clusterObjectSyncInformer.Informer().HasSynced,
    95  		ObjectSyncSynced:        objectSyncInformer.Informer().HasSynced,
    96  
    97  		ClusterObjectSyncLister: clusterObjectSyncInformer.Lister(),
    98  		ObjectSyncLister:        objectSyncInformer.Lister(),
    99  	}
   100  
   101  	go sc.ClusterObjectSyncInformer.Informer().Run(beehiveContext.Done())
   102  	go sc.ObjectSyncInformer.Informer().Run(beehiveContext.Done())
   103  
   104  	return sc
   105  }
   106  
   107  // build Config from flags
   108  func buildConfig() (conf *rest.Config, err error) {
   109  	kubeConfig, err := clientcmd.BuildConfigFromFlags(hubconfig.Config.KubeAPIConfig.Master,
   110  		hubconfig.Config.KubeAPIConfig.KubeConfig)
   111  	if err != nil {
   112  		return nil, err
   113  	}
   114  	kubeConfig.QPS = float32(hubconfig.Config.KubeAPIConfig.QPS)
   115  	kubeConfig.Burst = int(hubconfig.Config.KubeAPIConfig.Burst)
   116  	kubeConfig.ContentType = "application/json"
   117  
   118  	return kubeConfig, nil
   119  }