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 }