func StartControllers(s *options.CMServer, restClientCfg *restclient.Config) error { ccClientset := federationclientset.NewForConfigOrDie(restclient.AddUserAgent(restClientCfg, "cluster-controller")) go clustercontroller.NewclusterController(ccClientset, s.ClusterMonitorPeriod.Duration).Run() dns, err := dnsprovider.InitDnsProvider(s.DnsProvider, s.DnsConfigFile) if err != nil { glog.Fatalf("Cloud provider could not be initialized: %v", err) } scClientset := federationclientset.NewForConfigOrDie(restclient.AddUserAgent(restClientCfg, servicecontroller.UserAgentName)) servicecontroller := servicecontroller.New(scClientset, dns, s.FederationName, s.ZoneName) if err := servicecontroller.Run(s.ConcurrentServiceSyncs, wait.NeverStop); err != nil { glog.Errorf("Failed to start service controller: %v", err) } nsClientset := federationclientset.NewForConfigOrDie(restclient.AddUserAgent(restClientCfg, "namespace-controller")) namespaceController := namespacecontroller.NewNamespaceController(nsClientset) namespaceController.Run(wait.NeverStop) secretcontrollerClientset := federationclientset.NewForConfigOrDie(restclient.AddUserAgent(restClientCfg, "secret-controller")) secretcontroller := secretcontroller.NewSecretController(secretcontrollerClientset) secretcontroller.Run(wait.NeverStop) replicaSetClientset := federationclientset.NewForConfigOrDie(restclient.AddUserAgent(restClientCfg, replicasetcontroller.UserAgentName)) replicaSetController := replicasetcontroller.NewReplicaSetController(replicaSetClientset) go replicaSetController.Run(s.ConcurrentReplicaSetSyncs, wait.NeverStop) select {} }
// Retruns Clientset for the given cluster. func GetClientsetForCluster(cluster *federation_v1beta1.Cluster) (*federation_release_1_4.Clientset, error) { clusterConfig, err := BuildClusterConfig(cluster) if err != nil && clusterConfig != nil { clientset := federation_release_1_4.NewForConfigOrDie(restclient.AddUserAgent(clusterConfig, userAgentName)) return clientset, nil } return nil, err }
func TestUpdateClusterStatusOK(t *testing.T) { clusterName := "foobarCluster" // create dummy httpserver testClusterServer := httptest.NewServer(createHttptestFakeHandlerForCluster(true)) defer testClusterServer.Close() federationCluster := newCluster(clusterName, testClusterServer.URL) federationClusterList := newClusterList(federationCluster) testFederationServer := httptest.NewServer(createHttptestFakeHandlerForFederation(federationClusterList, true)) defer testFederationServer.Close() restClientCfg, err := clientcmd.BuildConfigFromFlags(testFederationServer.URL, "") if err != nil { t.Errorf("Failed to build client config") } federationClientSet := federationclientset.NewForConfigOrDie(restclient.AddUserAgent(restClientCfg, "cluster-controller")) // Override KubeconfigGetterForCluster to avoid having to setup service accounts and mount files with secret tokens. originalGetter := controller_util.KubeconfigGetterForCluster controller_util.KubeconfigGetterForCluster = func(c *federation_v1beta1.Cluster) clientcmd.KubeconfigGetter { return func() (*clientcmdapi.Config, error) { return &clientcmdapi.Config{}, nil } } manager := NewclusterController(federationClientSet, 5) err = manager.UpdateClusterStatus() if err != nil { t.Errorf("Failed to Update Cluster Status: %v", err) } clusterStatus, found := manager.clusterClusterStatusMap[clusterName] if !found { t.Errorf("Failed to Update Cluster Status") } else { if (clusterStatus.Conditions[1].Status != v1.ConditionFalse) || (clusterStatus.Conditions[1].Type != federation_v1beta1.ClusterOffline) { t.Errorf("Failed to Update Cluster Status") } } // Reset KubeconfigGetterForCluster controller_util.KubeconfigGetterForCluster = originalGetter }
// Builds a FederatedInformer for the given federation client and factory. func NewFederatedInformer( federationClient federation_release_1_4.Interface, targetInformerFactory TargetInformerFactory, clusterLifecycle ClusterLifecycleHandlerFuncs) FederatedInformer { federatedInformer := &federatedInformerImpl{ targetInformerFactory: targetInformerFactory, clientFactory: func(cluster *federation_api.Cluster) (federation_release_1_4.Interface, error) { clusterConfig, err := BuildClusterConfig(cluster) if err != nil && clusterConfig != nil { clientset := federation_release_1_4.NewForConfigOrDie(restclient.AddUserAgent(clusterConfig, userAgentName)) return clientset, nil } return nil, err }, targetInformers: make(map[string]informer), } getClusterData := func(name string) []interface{} { data, err := federatedInformer.GetTargetStore().ListFromCluster(name) if err != nil { glog.Errorf("Failed to list %s content: %v", name, err) return make([]interface{}, 0) } return data } federatedInformer.clusterInformer.store, federatedInformer.clusterInformer.controller = framework.NewInformer( &cache.ListWatch{ ListFunc: func(options api.ListOptions) (pkg_runtime.Object, error) { return federationClient.Federation().Clusters().List(options) }, WatchFunc: func(options api.ListOptions) (watch.Interface, error) { return federationClient.Federation().Clusters().Watch(options) }, }, &federation_api.Cluster{}, clusterSyncPeriod, framework.ResourceEventHandlerFuncs{ DeleteFunc: func(old interface{}) { oldCluster, ok := old.(*federation_api.Cluster) if ok { var data []interface{} if clusterLifecycle.ClusterUnavailable != nil { data = getClusterData(oldCluster.Name) } federatedInformer.deleteCluster(oldCluster) if clusterLifecycle.ClusterUnavailable != nil { clusterLifecycle.ClusterUnavailable(oldCluster, data) } } }, AddFunc: func(cur interface{}) { curCluster, ok := cur.(*federation_api.Cluster) if ok && isClusterReady(curCluster) { federatedInformer.addCluster(curCluster) if clusterLifecycle.ClusterAvailable != nil { clusterLifecycle.ClusterAvailable(curCluster) } } }, UpdateFunc: func(old, cur interface{}) { oldCluster, ok := old.(*federation_api.Cluster) if !ok { return } curCluster, ok := cur.(*federation_api.Cluster) if !ok { return } if isClusterReady(oldCluster) != isClusterReady(curCluster) || !reflect.DeepEqual(oldCluster.Spec, curCluster.Spec) { var data []interface{} if clusterLifecycle.ClusterUnavailable != nil { data = getClusterData(oldCluster.Name) } federatedInformer.deleteCluster(oldCluster) if clusterLifecycle.ClusterUnavailable != nil { clusterLifecycle.ClusterUnavailable(oldCluster, data) } if isClusterReady(curCluster) { federatedInformer.addCluster(curCluster) if clusterLifecycle.ClusterAvailable != nil { clusterLifecycle.ClusterAvailable(curCluster) } } } }, }, ) return federatedInformer }