Commit 6dde087f authored by mfanjie's avatar mfanjie

change clientset of service controller to versioned one

parent c2dbce68
...@@ -18,7 +18,7 @@ package cache ...@@ -18,7 +18,7 @@ package cache
import ( import (
"github.com/golang/glog" "github.com/golang/glog"
"k8s.io/kubernetes/federation/apis/federation" "k8s.io/kubernetes/federation/apis/federation/v1alpha1"
kubeCache "k8s.io/kubernetes/pkg/client/cache" kubeCache "k8s.io/kubernetes/pkg/client/cache"
) )
...@@ -28,16 +28,16 @@ type StoreToClusterLister struct { ...@@ -28,16 +28,16 @@ type StoreToClusterLister struct {
kubeCache.Store kubeCache.Store
} }
func (s *StoreToClusterLister) List() (clusters federation.ClusterList, err error) { func (s *StoreToClusterLister) List() (clusters v1alpha1.ClusterList, err error) {
for _, m := range s.Store.List() { for _, m := range s.Store.List() {
clusters.Items = append(clusters.Items, *(m.(*federation.Cluster))) clusters.Items = append(clusters.Items, *(m.(*v1alpha1.Cluster)))
} }
return clusters, nil return clusters, nil
} }
// ClusterConditionPredicate is a function that indicates whether the given cluster's conditions meet // ClusterConditionPredicate is a function that indicates whether the given cluster's conditions meet
// some set of criteria defined by the function. // some set of criteria defined by the function.
type ClusterConditionPredicate func(cluster federation.Cluster) bool type ClusterConditionPredicate func(cluster v1alpha1.Cluster) bool
// storeToClusterConditionLister filters and returns nodes matching the given type and status from the store. // storeToClusterConditionLister filters and returns nodes matching the given type and status from the store.
type storeToClusterConditionLister struct { type storeToClusterConditionLister struct {
...@@ -51,9 +51,9 @@ func (s *StoreToClusterLister) ClusterCondition(predicate ClusterConditionPredic ...@@ -51,9 +51,9 @@ func (s *StoreToClusterLister) ClusterCondition(predicate ClusterConditionPredic
} }
// List returns a list of clusters that match the conditions defined by the predicate functions in the storeToClusterConditionLister. // List returns a list of clusters that match the conditions defined by the predicate functions in the storeToClusterConditionLister.
func (s storeToClusterConditionLister) List() (clusters federation.ClusterList, err error) { func (s storeToClusterConditionLister) List() (clusters v1alpha1.ClusterList, err error) {
for _, m := range s.store.List() { for _, m := range s.store.List() {
cluster := *m.(*federation.Cluster) cluster := *m.(*v1alpha1.Cluster)
if s.predicate(cluster) { if s.predicate(cluster) {
clusters.Items = append(clusters.Items, cluster) clusters.Items = append(clusters.Items, cluster)
} else { } else {
......
...@@ -25,14 +25,13 @@ import ( ...@@ -25,14 +25,13 @@ import (
"net/http/pprof" "net/http/pprof"
"strconv" "strconv"
"k8s.io/kubernetes/federation/cmd/federation-controller-manager/app/options"
"k8s.io/kubernetes/pkg/client/restclient"
internalclientset "k8s.io/kubernetes/federation/client/clientset_generated/federation_internalclientset"
federationclientset "k8s.io/kubernetes/federation/client/clientset_generated/federation_release_1_3" federationclientset "k8s.io/kubernetes/federation/client/clientset_generated/federation_release_1_3"
"k8s.io/kubernetes/federation/cmd/federation-controller-manager/app/options"
"k8s.io/kubernetes/federation/pkg/dnsprovider" "k8s.io/kubernetes/federation/pkg/dnsprovider"
clustercontroller "k8s.io/kubernetes/federation/pkg/federation-controller/cluster" clustercontroller "k8s.io/kubernetes/federation/pkg/federation-controller/cluster"
servicecontroller "k8s.io/kubernetes/federation/pkg/federation-controller/service" servicecontroller "k8s.io/kubernetes/federation/pkg/federation-controller/service"
"k8s.io/kubernetes/federation/pkg/federation-controller/util"
"k8s.io/kubernetes/pkg/client/restclient"
"k8s.io/kubernetes/pkg/client/unversioned/clientcmd" "k8s.io/kubernetes/pkg/client/unversioned/clientcmd"
"k8s.io/kubernetes/pkg/healthz" "k8s.io/kubernetes/pkg/healthz"
"k8s.io/kubernetes/pkg/util/configz" "k8s.io/kubernetes/pkg/util/configz"
...@@ -77,7 +76,7 @@ func Run(s *options.CMServer) error { ...@@ -77,7 +76,7 @@ func Run(s *options.CMServer) error {
glog.Errorf("unable to register configz: %s", err) glog.Errorf("unable to register configz: %s", err)
} }
// Create the config to talk to federation-apiserver. // Create the config to talk to federation-apiserver.
kubeconfigGetter := clustercontroller.KubeconfigGetterForSecret(FederationAPIServerSecretName) kubeconfigGetter := util.KubeconfigGetterForSecret(FederationAPIServerSecretName)
restClientCfg, err := clientcmd.BuildConfigFromKubeconfigGetter(s.Master, kubeconfigGetter) restClientCfg, err := clientcmd.BuildConfigFromKubeconfigGetter(s.Master, kubeconfigGetter)
if err != nil { if err != nil {
return err return err
...@@ -115,14 +114,14 @@ func Run(s *options.CMServer) error { ...@@ -115,14 +114,14 @@ func Run(s *options.CMServer) error {
func StartControllers(s *options.CMServer, restClientCfg *restclient.Config) error { func StartControllers(s *options.CMServer, restClientCfg *restclient.Config) error {
federationClientSet := federationclientset.NewForConfigOrDie(restclient.AddUserAgent(restClientCfg, "cluster-controller")) ccClientset := federationclientset.NewForConfigOrDie(restclient.AddUserAgent(restClientCfg, "cluster-controller"))
go clustercontroller.NewclusterController(federationClientSet, s.ClusterMonitorPeriod.Duration).Run() go clustercontroller.NewclusterController(ccClientset, s.ClusterMonitorPeriod.Duration).Run()
dns, err := dnsprovider.InitDnsProvider(s.DnsProvider, s.DnsConfigFile) dns, err := dnsprovider.InitDnsProvider(s.DnsProvider, s.DnsConfigFile)
if err != nil { if err != nil {
glog.Fatalf("Cloud provider could not be initialized: %v", err) glog.Fatalf("Cloud provider could not be initialized: %v", err)
} }
scclientset := internalclientset.NewForConfigOrDie(restclient.AddUserAgent(restClientCfg, servicecontroller.UserAgentName)) scClientset := federationclientset.NewForConfigOrDie(restclient.AddUserAgent(restClientCfg, servicecontroller.UserAgentName))
servicecontroller := servicecontroller.New(scclientset, dns) servicecontroller := servicecontroller.New(scClientset, dns)
if err := servicecontroller.Run(s.ConcurrentServiceSyncs, wait.NeverStop); err != nil { if err := servicecontroller.Run(s.ConcurrentServiceSyncs, wait.NeverStop); err != nil {
glog.Errorf("Failed to start service controller: %v", err) glog.Errorf("Failed to start service controller: %v", err)
} }
......
/* /*
Copyright 2014 The Kubernetes Authors All rights reserved. Copyright 2016 The Kubernetes Authors All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.
...@@ -18,22 +18,17 @@ package cluster ...@@ -18,22 +18,17 @@ package cluster
import ( import (
"fmt" "fmt"
"net"
"os"
"strings" "strings"
"github.com/golang/glog" "github.com/golang/glog"
federation_v1alpha1 "k8s.io/kubernetes/federation/apis/federation/v1alpha1" federation_v1alpha1 "k8s.io/kubernetes/federation/apis/federation/v1alpha1"
"k8s.io/kubernetes/federation/pkg/federation-controller/util"
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/api/v1" "k8s.io/kubernetes/pkg/api/v1"
clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
"k8s.io/kubernetes/pkg/client/restclient" "k8s.io/kubernetes/pkg/client/restclient"
"k8s.io/kubernetes/pkg/client/typed/discovery" "k8s.io/kubernetes/pkg/client/typed/discovery"
client "k8s.io/kubernetes/pkg/client/unversioned"
"k8s.io/kubernetes/pkg/client/unversioned/clientcmd"
clientcmdapi "k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api"
utilnet "k8s.io/kubernetes/pkg/util/net"
"k8s.io/kubernetes/pkg/util/sets" "k8s.io/kubernetes/pkg/util/sets"
) )
...@@ -44,40 +39,13 @@ const ( ...@@ -44,40 +39,13 @@ const (
KubeconfigSecretDataKey = "kubeconfig" KubeconfigSecretDataKey = "kubeconfig"
) )
// This is to inject a different kubeconfigGetter in tests.
// We dont use the standard one which calls NewInCluster in tests to avoid having to setup service accounts and mount files with secret tokens.
var KubeconfigGetterForCluster = func(c *federation_v1alpha1.Cluster) clientcmd.KubeconfigGetter {
return func() (*clientcmdapi.Config, error) {
// Get the namespace this is running in from the env variable.
namespace := os.Getenv("POD_NAMESPACE")
if namespace == "" {
return nil, fmt.Errorf("unexpected: POD_NAMESPACE env var returned empty string")
}
// Get a client to talk to the k8s apiserver, to fetch secrets from it.
client, err := client.NewInCluster()
if err != nil {
return nil, fmt.Errorf("error in creating in-cluster client: %s", err)
}
secret, err := client.Secrets(namespace).Get(c.Spec.SecretRef.Name)
if err != nil {
return nil, fmt.Errorf("error in fetching secret: %s", err)
}
ok := false
data, ok := secret.Data[KubeconfigSecretDataKey]
if !ok {
return nil, fmt.Errorf("secret does not have data with key: %s", KubeconfigSecretDataKey)
}
return clientcmd.Load(data)
}
}
type ClusterClient struct { type ClusterClient struct {
discoveryClient *discovery.DiscoveryClient discoveryClient *discovery.DiscoveryClient
kubeClient *clientset.Clientset kubeClient *clientset.Clientset
} }
func NewClusterClientSet(c *federation_v1alpha1.Cluster) (*ClusterClient, error) { func NewClusterClientSet(c *federation_v1alpha1.Cluster) (*ClusterClient, error) {
clusterConfig, err := BuildClusterConfig(c) clusterConfig, err := util.BuildClusterConfig(c)
if err != nil { if err != nil {
return nil, err return nil, err
} }
...@@ -95,42 +63,6 @@ func NewClusterClientSet(c *federation_v1alpha1.Cluster) (*ClusterClient, error) ...@@ -95,42 +63,6 @@ func NewClusterClientSet(c *federation_v1alpha1.Cluster) (*ClusterClient, error)
return &clusterClientSet, err return &clusterClientSet, err
} }
func BuildClusterConfig(c *federation_v1alpha1.Cluster) (*restclient.Config, error) {
var serverAddress string
var clusterConfig *restclient.Config
hostIP, err := utilnet.ChooseHostInterface()
if err != nil {
return nil, err
}
for _, item := range c.Spec.ServerAddressByClientCIDRs {
_, cidrnet, err := net.ParseCIDR(item.ClientCIDR)
if err != nil {
return nil, err
}
myaddr := net.ParseIP(hostIP.String())
if cidrnet.Contains(myaddr) == true {
serverAddress = item.ServerAddress
break
}
}
if serverAddress != "" {
if c.Spec.SecretRef == nil {
glog.Infof("didnt find secretRef for cluster %s. Trying insecure access", c.Name)
clusterConfig, err = clientcmd.BuildConfigFromFlags(serverAddress, "")
} else {
kubeconfigGetter := KubeconfigGetterForCluster(c)
clusterConfig, err = clientcmd.BuildConfigFromKubeconfigGetter(serverAddress, kubeconfigGetter)
}
if err != nil {
return nil, err
}
clusterConfig.QPS = KubeAPIQPS
clusterConfig.Burst = KubeAPIBurst
}
return clusterConfig, nil
}
// GetClusterHealthStatus gets the kubernetes cluster health status by requesting "/healthz" // GetClusterHealthStatus gets the kubernetes cluster health status by requesting "/healthz"
func (self *ClusterClient) GetClusterHealthStatus() *federation_v1alpha1.ClusterStatus { func (self *ClusterClient) GetClusterHealthStatus() *federation_v1alpha1.ClusterStatus {
clusterStatus := federation_v1alpha1.ClusterStatus{} clusterStatus := federation_v1alpha1.ClusterStatus{}
......
/* /*
Copyright 2014 The Kubernetes Authors All rights reserved. Copyright 2016 The Kubernetes Authors All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.
...@@ -21,7 +21,6 @@ import ( ...@@ -21,7 +21,6 @@ import (
"time" "time"
"github.com/golang/glog" "github.com/golang/glog"
"k8s.io/kubernetes/federation/apis/federation"
federation_v1alpha1 "k8s.io/kubernetes/federation/apis/federation/v1alpha1" federation_v1alpha1 "k8s.io/kubernetes/federation/apis/federation/v1alpha1"
cluster_cache "k8s.io/kubernetes/federation/client/cache" cluster_cache "k8s.io/kubernetes/federation/client/cache"
federationclientset "k8s.io/kubernetes/federation/client/clientset_generated/federation_release_1_3" federationclientset "k8s.io/kubernetes/federation/client/clientset_generated/federation_release_1_3"
...@@ -73,7 +72,7 @@ func NewclusterController(federationClient federationclientset.Interface, cluste ...@@ -73,7 +72,7 @@ func NewclusterController(federationClient federationclientset.Interface, cluste
return cc.federationClient.Federation().Clusters().Watch(options) return cc.federationClient.Federation().Clusters().Watch(options)
}, },
}, },
&federation.Cluster{}, &federation_v1alpha1.Cluster{},
controller.NoResyncPeriodFunc(), controller.NoResyncPeriodFunc(),
framework.ResourceEventHandlerFuncs{ framework.ResourceEventHandlerFuncs{
DeleteFunc: cc.delFromClusterSet, DeleteFunc: cc.delFromClusterSet,
......
...@@ -25,6 +25,7 @@ import ( ...@@ -25,6 +25,7 @@ import (
federation_v1alpha1 "k8s.io/kubernetes/federation/apis/federation/v1alpha1" federation_v1alpha1 "k8s.io/kubernetes/federation/apis/federation/v1alpha1"
federationclientset "k8s.io/kubernetes/federation/client/clientset_generated/federation_release_1_3" federationclientset "k8s.io/kubernetes/federation/client/clientset_generated/federation_release_1_3"
controller_util "k8s.io/kubernetes/federation/pkg/federation-controller/util"
"k8s.io/kubernetes/pkg/api/testapi" "k8s.io/kubernetes/pkg/api/testapi"
"k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/api/v1" "k8s.io/kubernetes/pkg/api/v1"
...@@ -124,8 +125,8 @@ func TestUpdateClusterStatusOK(t *testing.T) { ...@@ -124,8 +125,8 @@ func TestUpdateClusterStatusOK(t *testing.T) {
federationClientSet := federationclientset.NewForConfigOrDie(restclient.AddUserAgent(restClientCfg, "cluster-controller")) federationClientSet := federationclientset.NewForConfigOrDie(restclient.AddUserAgent(restClientCfg, "cluster-controller"))
// Override KubeconfigGetterForCluster to avoid having to setup service accounts and mount files with secret tokens. // Override KubeconfigGetterForCluster to avoid having to setup service accounts and mount files with secret tokens.
originalGetter := KubeconfigGetterForCluster originalGetter := controller_util.KubeconfigGetterForCluster
KubeconfigGetterForCluster = func(c *federation_v1alpha1.Cluster) clientcmd.KubeconfigGetter { controller_util.KubeconfigGetterForCluster = func(c *federation_v1alpha1.Cluster) clientcmd.KubeconfigGetter {
return func() (*clientcmdapi.Config, error) { return func() (*clientcmdapi.Config, error) {
return &clientcmdapi.Config{}, nil return &clientcmdapi.Config{}, nil
} }
...@@ -146,5 +147,5 @@ func TestUpdateClusterStatusOK(t *testing.T) { ...@@ -146,5 +147,5 @@ func TestUpdateClusterStatusOK(t *testing.T) {
} }
// Reset KubeconfigGetterForCluster // Reset KubeconfigGetterForCluster
KubeconfigGetterForCluster = originalGetter controller_util.KubeconfigGetterForCluster = originalGetter
} }
...@@ -19,12 +19,12 @@ package service ...@@ -19,12 +19,12 @@ package service
import ( import (
"sync" "sync"
"k8s.io/kubernetes/federation/apis/federation" v1alpha1 "k8s.io/kubernetes/federation/apis/federation/v1alpha1"
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
v1 "k8s.io/kubernetes/pkg/api/v1"
cache "k8s.io/kubernetes/pkg/client/cache" cache "k8s.io/kubernetes/pkg/client/cache"
clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" release_1_3 "k8s.io/kubernetes/pkg/client/clientset_generated/release_1_3"
"k8s.io/kubernetes/pkg/client/restclient" "k8s.io/kubernetes/pkg/client/restclient"
"k8s.io/kubernetes/pkg/client/unversioned/clientcmd"
"k8s.io/kubernetes/pkg/controller/framework" "k8s.io/kubernetes/pkg/controller/framework"
pkg_runtime "k8s.io/kubernetes/pkg/runtime" pkg_runtime "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/util/wait" "k8s.io/kubernetes/pkg/util/wait"
...@@ -32,12 +32,13 @@ import ( ...@@ -32,12 +32,13 @@ import (
"k8s.io/kubernetes/pkg/watch" "k8s.io/kubernetes/pkg/watch"
"github.com/golang/glog" "github.com/golang/glog"
"k8s.io/kubernetes/federation/pkg/federation-controller/util"
"reflect" "reflect"
) )
type clusterCache struct { type clusterCache struct {
clientset *clientset.Clientset clientset *release_1_3.Clientset
cluster *federation.Cluster cluster *v1alpha1.Cluster
// A store of services, populated by the serviceController // A store of services, populated by the serviceController
serviceStore cache.StoreToServiceLister serviceStore cache.StoreToServiceLister
// Watches changes to all services // Watches changes to all services
...@@ -57,7 +58,7 @@ type clusterClientCache struct { ...@@ -57,7 +58,7 @@ type clusterClientCache struct {
clientMap map[string]*clusterCache clientMap map[string]*clusterCache
} }
func (cc *clusterClientCache) startClusterLW(cluster *federation.Cluster, clusterName string) { func (cc *clusterClientCache) startClusterLW(cluster *v1alpha1.Cluster, clusterName string) {
cachedClusterClient, ok := cc.clientMap[clusterName] cachedClusterClient, ok := cc.clientMap[clusterName]
// only create when no existing cachedClusterClient // only create when no existing cachedClusterClient
if ok { if ok {
...@@ -92,13 +93,13 @@ func (cc *clusterClientCache) startClusterLW(cluster *federation.Cluster, cluste ...@@ -92,13 +93,13 @@ func (cc *clusterClientCache) startClusterLW(cluster *federation.Cluster, cluste
cachedClusterClient.endpointStore.Store, cachedClusterClient.endpointController = framework.NewInformer( cachedClusterClient.endpointStore.Store, cachedClusterClient.endpointController = framework.NewInformer(
&cache.ListWatch{ &cache.ListWatch{
ListFunc: func(options api.ListOptions) (pkg_runtime.Object, error) { ListFunc: func(options api.ListOptions) (pkg_runtime.Object, error) {
return clientset.Core().Endpoints(api.NamespaceAll).List(options) return clientset.Core().Endpoints(v1.NamespaceAll).List(options)
}, },
WatchFunc: func(options api.ListOptions) (watch.Interface, error) { WatchFunc: func(options api.ListOptions) (watch.Interface, error) {
return clientset.Core().Endpoints(api.NamespaceAll).Watch(options) return clientset.Core().Endpoints(v1.NamespaceAll).Watch(options)
}, },
}, },
&api.Endpoints{}, &v1.Endpoints{},
serviceSyncPeriod, serviceSyncPeriod,
framework.ResourceEventHandlerFuncs{ framework.ResourceEventHandlerFuncs{
AddFunc: func(obj interface{}) { AddFunc: func(obj interface{}) {
...@@ -116,25 +117,25 @@ func (cc *clusterClientCache) startClusterLW(cluster *federation.Cluster, cluste ...@@ -116,25 +117,25 @@ func (cc *clusterClientCache) startClusterLW(cluster *federation.Cluster, cluste
cachedClusterClient.serviceStore.Store, cachedClusterClient.serviceController = framework.NewInformer( cachedClusterClient.serviceStore.Store, cachedClusterClient.serviceController = framework.NewInformer(
&cache.ListWatch{ &cache.ListWatch{
ListFunc: func(options api.ListOptions) (pkg_runtime.Object, error) { ListFunc: func(options api.ListOptions) (pkg_runtime.Object, error) {
return clientset.Core().Services(api.NamespaceAll).List(options) return clientset.Core().Services(v1.NamespaceAll).List(options)
}, },
WatchFunc: func(options api.ListOptions) (watch.Interface, error) { WatchFunc: func(options api.ListOptions) (watch.Interface, error) {
return clientset.Core().Services(api.NamespaceAll).Watch(options) return clientset.Core().Services(v1.NamespaceAll).Watch(options)
}, },
}, },
&api.Service{}, &v1.Service{},
serviceSyncPeriod, serviceSyncPeriod,
framework.ResourceEventHandlerFuncs{ framework.ResourceEventHandlerFuncs{
AddFunc: func(obj interface{}) { AddFunc: func(obj interface{}) {
cc.enqueueService(obj, clusterName) cc.enqueueService(obj, clusterName)
}, },
UpdateFunc: func(old, cur interface{}) { UpdateFunc: func(old, cur interface{}) {
oldService, ok := old.(*api.Service) oldService, ok := old.(*v1.Service)
if !ok { if !ok {
return return
} }
curService, ok := cur.(*api.Service) curService, ok := cur.(*v1.Service)
if !ok { if !ok {
return return
} }
...@@ -143,7 +144,7 @@ func (cc *clusterClientCache) startClusterLW(cluster *federation.Cluster, cluste ...@@ -143,7 +144,7 @@ func (cc *clusterClientCache) startClusterLW(cluster *federation.Cluster, cluste
} }
}, },
DeleteFunc: func(obj interface{}) { DeleteFunc: func(obj interface{}) {
service, _ := obj.(*api.Service) service, _ := obj.(*v1.Service)
cc.enqueueService(obj, clusterName) cc.enqueueService(obj, clusterName)
glog.V(2).Infof("Service %s/%s deletion found and enque to service store %s", service.Namespace, service.Name, clusterName) glog.V(2).Infof("Service %s/%s deletion found and enque to service store %s", service.Namespace, service.Name, clusterName)
}, },
...@@ -161,7 +162,7 @@ func (cc *clusterClientCache) startClusterLW(cluster *federation.Cluster, cluste ...@@ -161,7 +162,7 @@ func (cc *clusterClientCache) startClusterLW(cluster *federation.Cluster, cluste
// delFromClusterSet delete a cluster from clusterSet and // delFromClusterSet delete a cluster from clusterSet and
// delete the corresponding restclient from the map clusterKubeClientMap // delete the corresponding restclient from the map clusterKubeClientMap
func (cc *clusterClientCache) delFromClusterSet(obj interface{}) { func (cc *clusterClientCache) delFromClusterSet(obj interface{}) {
cluster, ok := obj.(*federation.Cluster) cluster, ok := obj.(*v1alpha1.Cluster)
cc.rwlock.Lock() cc.rwlock.Lock()
defer cc.rwlock.Unlock() defer cc.rwlock.Unlock()
if ok { if ok {
...@@ -180,10 +181,10 @@ func (cc *clusterClientCache) delFromClusterSet(obj interface{}) { ...@@ -180,10 +181,10 @@ func (cc *clusterClientCache) delFromClusterSet(obj interface{}) {
// addToClusterSet inserts the new cluster to clusterSet and creates a corresponding // addToClusterSet inserts the new cluster to clusterSet and creates a corresponding
// restclient to map clusterKubeClientMap // restclient to map clusterKubeClientMap
func (cc *clusterClientCache) addToClientMap(obj interface{}) { func (cc *clusterClientCache) addToClientMap(obj interface{}) {
cluster := obj.(*federation.Cluster) cluster := obj.(*v1alpha1.Cluster)
cc.rwlock.Lock() cc.rwlock.Lock()
defer cc.rwlock.Unlock() defer cc.rwlock.Unlock()
cluster, ok := obj.(*federation.Cluster) cluster, ok := obj.(*v1alpha1.Cluster)
if !ok { if !ok {
return return
} }
...@@ -195,13 +196,11 @@ func (cc *clusterClientCache) addToClientMap(obj interface{}) { ...@@ -195,13 +196,11 @@ func (cc *clusterClientCache) addToClientMap(obj interface{}) {
} }
} }
func newClusterClientset(c *federation.Cluster) (*clientset.Clientset, error) { func newClusterClientset(c *v1alpha1.Cluster) (*release_1_3.Clientset, error) {
clusterConfig, err := clientcmd.BuildConfigFromFlags(c.Spec.ServerAddressByClientCIDRs[0].ServerAddress, "") clusterConfig, err := util.BuildClusterConfig(c)
if err != nil { if clusterConfig != nil {
return nil, err clientset := release_1_3.NewForConfigOrDie(restclient.AddUserAgent(clusterConfig, UserAgentName))
return clientset, nil
} }
clusterConfig.QPS = KubeAPIQPS return nil, err
clusterConfig.Burst = KubeAPIBurst
clientset := clientset.NewForConfigOrDie(restclient.AddUserAgent(clusterConfig, UserAgentName))
return clientset, nil
} }
...@@ -254,6 +254,9 @@ func (s *ServiceController) ensureDnsRecords(clusterName string, cachedService * ...@@ -254,6 +254,9 @@ func (s *ServiceController) ensureDnsRecords(clusterName string, cachedService *
// the state of the service when we last successfully sync'd it's DNS records. // the state of the service when we last successfully sync'd it's DNS records.
// So this time around we only need to patch that (add new records, remove deleted records, and update changed records. // So this time around we only need to patch that (add new records, remove deleted records, and update changed records.
// //
if s.dns == nil {
return nil
}
if s == nil { if s == nil {
return fmt.Errorf("nil ServiceController passed to ServiceController.ensureDnsRecords(clusterName: %s, cachedService: %v)", clusterName, cachedService) return fmt.Errorf("nil ServiceController passed to ServiceController.ensureDnsRecords(clusterName: %s, cachedService: %v)", clusterName, cachedService)
} }
...@@ -263,6 +266,9 @@ func (s *ServiceController) ensureDnsRecords(clusterName string, cachedService * ...@@ -263,6 +266,9 @@ func (s *ServiceController) ensureDnsRecords(clusterName string, cachedService *
serviceName := cachedService.lastState.Name serviceName := cachedService.lastState.Name
namespaceName := cachedService.lastState.Namespace namespaceName := cachedService.lastState.Namespace
zoneNames, regionName, err := s.getClusterZoneNames(clusterName) zoneNames, regionName, err := s.getClusterZoneNames(clusterName)
if zoneNames == nil {
return fmt.Errorf("fail to get cluster zone names")
}
if err != nil { if err != nil {
return err return err
} }
......
...@@ -20,8 +20,8 @@ import ( ...@@ -20,8 +20,8 @@ import (
"fmt" "fmt"
"time" "time"
federationclientset "k8s.io/kubernetes/federation/client/clientset_generated/federation_internalclientset" federation_release_1_3 "k8s.io/kubernetes/federation/client/clientset_generated/federation_release_1_3"
"k8s.io/kubernetes/pkg/api" v1 "k8s.io/kubernetes/pkg/api/v1"
cache "k8s.io/kubernetes/pkg/client/cache" cache "k8s.io/kubernetes/pkg/client/cache"
"k8s.io/kubernetes/pkg/controller" "k8s.io/kubernetes/pkg/controller"
...@@ -54,7 +54,7 @@ func (sc *ServiceController) clusterEndpointWorker() { ...@@ -54,7 +54,7 @@ func (sc *ServiceController) clusterEndpointWorker() {
// Whenever there is change on endpoint, the federation service should be updated // Whenever there is change on endpoint, the federation service should be updated
// key is the namespaced name of endpoint // key is the namespaced name of endpoint
func (cc *clusterClientCache) syncEndpoint(key, clusterName string, clusterCache *clusterCache, serviceCache *serviceCache, fedClient federationclientset.Interface, serviceController *ServiceController) error { func (cc *clusterClientCache) syncEndpoint(key, clusterName string, clusterCache *clusterCache, serviceCache *serviceCache, fedClient federation_release_1_3.Interface, serviceController *ServiceController) error {
cachedService, ok := serviceCache.get(key) cachedService, ok := serviceCache.get(key)
if !ok { if !ok {
// here we filtered all non-federation services // here we filtered all non-federation services
...@@ -67,7 +67,7 @@ func (cc *clusterClientCache) syncEndpoint(key, clusterName string, clusterCache ...@@ -67,7 +67,7 @@ func (cc *clusterClientCache) syncEndpoint(key, clusterName string, clusterCache
return err return err
} }
if exists { if exists {
endpoint, ok := endpointInterface.(*api.Endpoints) endpoint, ok := endpointInterface.(*v1.Endpoints)
if ok { if ok {
glog.V(4).Infof("Found endpoint for federation service %s/%s from cluster %s", endpoint.Namespace, endpoint.Name, clusterName) glog.V(4).Infof("Found endpoint for federation service %s/%s from cluster %s", endpoint.Namespace, endpoint.Name, clusterName)
err = cc.processEndpointUpdate(cachedService, endpoint, clusterName, serviceController) err = cc.processEndpointUpdate(cachedService, endpoint, clusterName, serviceController)
...@@ -117,7 +117,7 @@ func (cc *clusterClientCache) processEndpointDeletion(cachedService *cachedServi ...@@ -117,7 +117,7 @@ func (cc *clusterClientCache) processEndpointDeletion(cachedService *cachedServi
// Update dns info when endpoint update event received // Update dns info when endpoint update event received
// We do not care about the endpoint info, what we need to make sure here is len(endpoints.subsets)>0 // We do not care about the endpoint info, what we need to make sure here is len(endpoints.subsets)>0
func (cc *clusterClientCache) processEndpointUpdate(cachedService *cachedService, endpoint *api.Endpoints, clusterName string, serviceController *ServiceController) error { func (cc *clusterClientCache) processEndpointUpdate(cachedService *cachedService, endpoint *v1.Endpoints, clusterName string, serviceController *ServiceController) error {
glog.V(4).Infof("Processing endpoint update for %s/%s, cluster %s", endpoint.Namespace, endpoint.Name, clusterName) glog.V(4).Infof("Processing endpoint update for %s/%s, cluster %s", endpoint.Namespace, endpoint.Name, clusterName)
cachedService.rwlock.Lock() cachedService.rwlock.Lock()
defer cachedService.rwlock.Unlock() defer cachedService.rwlock.Unlock()
......
...@@ -19,9 +19,9 @@ package service ...@@ -19,9 +19,9 @@ package service
import ( import (
"testing" "testing"
"k8s.io/kubernetes/federation/apis/federation" "k8s.io/kubernetes/federation/apis/federation/v1alpha1"
"k8s.io/kubernetes/federation/pkg/dnsprovider/providers/google/clouddns" // Only for unit testing purposes. "k8s.io/kubernetes/federation/pkg/dnsprovider/providers/google/clouddns" // Only for unit testing purposes.
"k8s.io/kubernetes/pkg/api" v1 "k8s.io/kubernetes/pkg/api/v1"
"k8s.io/kubernetes/pkg/util/sets" "k8s.io/kubernetes/pkg/util/sets"
) )
...@@ -38,14 +38,14 @@ var fakeServiceController = ServiceController{ ...@@ -38,14 +38,14 @@ var fakeServiceController = ServiceController{
knownClusterSet: make(sets.String), knownClusterSet: make(sets.String),
} }
func buildEndpoint(subsets [][]string) *api.Endpoints { func buildEndpoint(subsets [][]string) *v1.Endpoints {
endpoint := &api.Endpoints{ endpoint := &v1.Endpoints{
Subsets: []api.EndpointSubset{ Subsets: []v1.EndpointSubset{
{Addresses: []api.EndpointAddress{}}, {Addresses: []v1.EndpointAddress{}},
}, },
} }
for _, element := range subsets { for _, element := range subsets {
address := api.EndpointAddress{IP: element[0], Hostname: element[1], TargetRef: nil} address := v1.EndpointAddress{IP: element[0], Hostname: element[1], TargetRef: nil}
endpoint.Subsets[0].Addresses = append(endpoint.Subsets[0].Addresses, address) endpoint.Subsets[0].Addresses = append(endpoint.Subsets[0].Addresses, address)
} }
return endpoint return endpoint
...@@ -58,14 +58,14 @@ func TestProcessEndpointUpdate(t *testing.T) { ...@@ -58,14 +58,14 @@ func TestProcessEndpointUpdate(t *testing.T) {
tests := []struct { tests := []struct {
name string name string
cachedService *cachedService cachedService *cachedService
endpoint *api.Endpoints endpoint *v1.Endpoints
clusterName string clusterName string
expectResult int expectResult int
}{ }{
{ {
"no-cache", "no-cache",
&cachedService{ &cachedService{
lastState: &api.Service{}, lastState: &v1.Service{},
endpointMap: make(map[string]int), endpointMap: make(map[string]int),
}, },
buildEndpoint([][]string{{"ip1", ""}}), buildEndpoint([][]string{{"ip1", ""}}),
...@@ -75,7 +75,7 @@ func TestProcessEndpointUpdate(t *testing.T) { ...@@ -75,7 +75,7 @@ func TestProcessEndpointUpdate(t *testing.T) {
{ {
"has-cache", "has-cache",
&cachedService{ &cachedService{
lastState: &api.Service{}, lastState: &v1.Service{},
endpointMap: map[string]int{ endpointMap: map[string]int{
"foo": 1, "foo": 1,
}, },
...@@ -99,8 +99,8 @@ func TestProcessEndpointDeletion(t *testing.T) { ...@@ -99,8 +99,8 @@ func TestProcessEndpointDeletion(t *testing.T) {
cc := clusterClientCache{ cc := clusterClientCache{
clientMap: map[string]*clusterCache{ clientMap: map[string]*clusterCache{
clusterName: { clusterName: {
cluster: &federation.Cluster{ cluster: &v1alpha1.Cluster{
Status: federation.ClusterStatus{ Status: v1alpha1.ClusterStatus{
Zones: []string{"foozone"}, Zones: []string{"foozone"},
Region: "fooregion", Region: "fooregion",
}, },
...@@ -111,14 +111,14 @@ func TestProcessEndpointDeletion(t *testing.T) { ...@@ -111,14 +111,14 @@ func TestProcessEndpointDeletion(t *testing.T) {
tests := []struct { tests := []struct {
name string name string
cachedService *cachedService cachedService *cachedService
endpoint *api.Endpoints endpoint *v1.Endpoints
clusterName string clusterName string
expectResult int expectResult int
}{ }{
{ {
"no-cache", "no-cache",
&cachedService{ &cachedService{
lastState: &api.Service{}, lastState: &v1.Service{},
endpointMap: make(map[string]int), endpointMap: make(map[string]int),
}, },
buildEndpoint([][]string{{"ip1", ""}}), buildEndpoint([][]string{{"ip1", ""}}),
...@@ -128,7 +128,7 @@ func TestProcessEndpointDeletion(t *testing.T) { ...@@ -128,7 +128,7 @@ func TestProcessEndpointDeletion(t *testing.T) {
{ {
"has-cache", "has-cache",
&cachedService{ &cachedService{
lastState: &api.Service{}, lastState: &v1.Service{},
endpointMap: map[string]int{ endpointMap: map[string]int{
clusterName: 1, clusterName: 1,
}, },
......
...@@ -20,9 +20,9 @@ import ( ...@@ -20,9 +20,9 @@ import (
"fmt" "fmt"
"time" "time"
federationclientset "k8s.io/kubernetes/federation/client/clientset_generated/federation_internalclientset" federation_release_1_3 "k8s.io/kubernetes/federation/client/clientset_generated/federation_release_1_3"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/errors" "k8s.io/kubernetes/pkg/api/errors"
v1 "k8s.io/kubernetes/pkg/api/v1"
cache "k8s.io/kubernetes/pkg/client/cache" cache "k8s.io/kubernetes/pkg/client/cache"
"k8s.io/kubernetes/pkg/controller" "k8s.io/kubernetes/pkg/controller"
...@@ -55,7 +55,7 @@ func (sc *ServiceController) clusterServiceWorker() { ...@@ -55,7 +55,7 @@ func (sc *ServiceController) clusterServiceWorker() {
} }
// Whenever there is change on service, the federation service should be updated // Whenever there is change on service, the federation service should be updated
func (cc *clusterClientCache) syncService(key, clusterName string, clusterCache *clusterCache, serviceCache *serviceCache, fedClient federationclientset.Interface) error { func (cc *clusterClientCache) syncService(key, clusterName string, clusterCache *clusterCache, serviceCache *serviceCache, fedClient federation_release_1_3.Interface) error {
// obj holds the latest service info from apiserver, return if there is no federation cache for the service // obj holds the latest service info from apiserver, return if there is no federation cache for the service
cachedService, ok := serviceCache.get(key) cachedService, ok := serviceCache.get(key)
if !ok { if !ok {
...@@ -70,7 +70,7 @@ func (cc *clusterClientCache) syncService(key, clusterName string, clusterCache ...@@ -70,7 +70,7 @@ func (cc *clusterClientCache) syncService(key, clusterName string, clusterCache
} }
var needUpdate bool var needUpdate bool
if exists { if exists {
service, ok := serviceInterface.(*api.Service) service, ok := serviceInterface.(*v1.Service)
if ok { if ok {
glog.V(4).Infof("Found service for federation service %s/%s from cluster %s", service.Namespace, service.Name, clusterName) glog.V(4).Infof("Found service for federation service %s/%s from cluster %s", service.Namespace, service.Name, clusterName)
needUpdate = cc.processServiceUpdate(cachedService, service, clusterName) needUpdate = cc.processServiceUpdate(cachedService, service, clusterName)
...@@ -140,7 +140,7 @@ func (cc *clusterClientCache) processServiceDeletion(cachedService *cachedServic ...@@ -140,7 +140,7 @@ func (cc *clusterClientCache) processServiceDeletion(cachedService *cachedServic
// processServiceUpdate Update ingress info when service updated // processServiceUpdate Update ingress info when service updated
// the function returns a bool to indicate if actual update happend on federation service cache // the function returns a bool to indicate if actual update happend on federation service cache
// and if the federation service cache is updated, the updated info should be post to federation apiserver // and if the federation service cache is updated, the updated info should be post to federation apiserver
func (cc *clusterClientCache) processServiceUpdate(cachedService *cachedService, service *api.Service, clusterName string) bool { func (cc *clusterClientCache) processServiceUpdate(cachedService *cachedService, service *v1.Service, clusterName string) bool {
glog.V(4).Infof("Processing service update for %s/%s, cluster %s", service.Namespace, service.Name, clusterName) glog.V(4).Infof("Processing service update for %s/%s, cluster %s", service.Namespace, service.Name, clusterName)
cachedService.rwlock.Lock() cachedService.rwlock.Lock()
defer cachedService.rwlock.Unlock() defer cachedService.rwlock.Unlock()
...@@ -214,7 +214,7 @@ func (cc *clusterClientCache) processServiceUpdate(cachedService *cachedService, ...@@ -214,7 +214,7 @@ func (cc *clusterClientCache) processServiceUpdate(cachedService *cachedService,
return needUpdate return needUpdate
} }
func (cc *clusterClientCache) persistFedServiceUpdate(cachedService *cachedService, fedClient federationclientset.Interface) error { func (cc *clusterClientCache) persistFedServiceUpdate(cachedService *cachedService, fedClient federation_release_1_3.Interface) error {
service := cachedService.lastState service := cachedService.lastState
glog.V(5).Infof("Persist federation service status %s/%s", service.Namespace, service.Name) glog.V(5).Infof("Persist federation service status %s/%s", service.Namespace, service.Name)
var err error var err error
......
...@@ -20,15 +20,15 @@ import ( ...@@ -20,15 +20,15 @@ import (
"reflect" "reflect"
"testing" "testing"
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/v1"
) )
func buildServiceStatus(ingresses [][]string) api.LoadBalancerStatus { func buildServiceStatus(ingresses [][]string) v1.LoadBalancerStatus {
status := api.LoadBalancerStatus{ status := v1.LoadBalancerStatus{
Ingress: []api.LoadBalancerIngress{}, Ingress: []v1.LoadBalancerIngress{},
} }
for _, element := range ingresses { for _, element := range ingresses {
ingress := api.LoadBalancerIngress{IP: element[0], Hostname: element[1]} ingress := v1.LoadBalancerIngress{IP: element[0], Hostname: element[1]}
status.Ingress = append(status.Ingress, ingress) status.Ingress = append(status.Ingress, ingress)
} }
return status return status
...@@ -41,18 +41,18 @@ func TestProcessServiceUpdate(t *testing.T) { ...@@ -41,18 +41,18 @@ func TestProcessServiceUpdate(t *testing.T) {
tests := []struct { tests := []struct {
name string name string
cachedService *cachedService cachedService *cachedService
service *api.Service service *v1.Service
clusterName string clusterName string
expectNeedUpdate bool expectNeedUpdate bool
expectStatus api.LoadBalancerStatus expectStatus v1.LoadBalancerStatus
}{ }{
{ {
"no-cache", "no-cache",
&cachedService{ &cachedService{
lastState: &api.Service{}, lastState: &v1.Service{},
serviceStatusMap: make(map[string]api.LoadBalancerStatus), serviceStatusMap: make(map[string]v1.LoadBalancerStatus),
}, },
&api.Service{Status: api.ServiceStatus{LoadBalancer: buildServiceStatus([][]string{{"ip1", ""}})}}, &v1.Service{Status: v1.ServiceStatus{LoadBalancer: buildServiceStatus([][]string{{"ip1", ""}})}},
"foo", "foo",
true, true,
buildServiceStatus([][]string{{"ip1", ""}}), buildServiceStatus([][]string{{"ip1", ""}}),
...@@ -60,12 +60,12 @@ func TestProcessServiceUpdate(t *testing.T) { ...@@ -60,12 +60,12 @@ func TestProcessServiceUpdate(t *testing.T) {
{ {
"same-ingress", "same-ingress",
&cachedService{ &cachedService{
lastState: &api.Service{Status: api.ServiceStatus{LoadBalancer: buildServiceStatus([][]string{{"ip1", ""}})}}, lastState: &v1.Service{Status: v1.ServiceStatus{LoadBalancer: buildServiceStatus([][]string{{"ip1", ""}})}},
serviceStatusMap: map[string]api.LoadBalancerStatus{ serviceStatusMap: map[string]v1.LoadBalancerStatus{
"foo1": {Ingress: []api.LoadBalancerIngress{{"ip1", ""}}}, "foo1": {Ingress: []v1.LoadBalancerIngress{{"ip1", ""}}},
}, },
}, },
&api.Service{Status: api.ServiceStatus{LoadBalancer: buildServiceStatus([][]string{{"ip1", ""}})}}, &v1.Service{Status: v1.ServiceStatus{LoadBalancer: buildServiceStatus([][]string{{"ip1", ""}})}},
"foo1", "foo1",
false, false,
buildServiceStatus([][]string{{"ip1", ""}}), buildServiceStatus([][]string{{"ip1", ""}}),
...@@ -73,14 +73,14 @@ func TestProcessServiceUpdate(t *testing.T) { ...@@ -73,14 +73,14 @@ func TestProcessServiceUpdate(t *testing.T) {
{ {
"diff-cluster", "diff-cluster",
&cachedService{ &cachedService{
lastState: &api.Service{ lastState: &v1.Service{
ObjectMeta: api.ObjectMeta{Name: "bar1"}, ObjectMeta: v1.ObjectMeta{Name: "bar1"},
}, },
serviceStatusMap: map[string]api.LoadBalancerStatus{ serviceStatusMap: map[string]v1.LoadBalancerStatus{
"foo2": {Ingress: []api.LoadBalancerIngress{{"ip1", ""}}}, "foo2": {Ingress: []v1.LoadBalancerIngress{{"ip1", ""}}},
}, },
}, },
&api.Service{Status: api.ServiceStatus{LoadBalancer: buildServiceStatus([][]string{{"ip1", ""}})}}, &v1.Service{Status: v1.ServiceStatus{LoadBalancer: buildServiceStatus([][]string{{"ip1", ""}})}},
"foo1", "foo1",
true, true,
buildServiceStatus([][]string{{"ip1", ""}}), buildServiceStatus([][]string{{"ip1", ""}}),
...@@ -88,12 +88,12 @@ func TestProcessServiceUpdate(t *testing.T) { ...@@ -88,12 +88,12 @@ func TestProcessServiceUpdate(t *testing.T) {
{ {
"diff-ingress", "diff-ingress",
&cachedService{ &cachedService{
lastState: &api.Service{Status: api.ServiceStatus{LoadBalancer: buildServiceStatus([][]string{{"ip4", ""}, {"ip1", ""}, {"ip2", ""}})}}, lastState: &v1.Service{Status: v1.ServiceStatus{LoadBalancer: buildServiceStatus([][]string{{"ip4", ""}, {"ip1", ""}, {"ip2", ""}})}},
serviceStatusMap: map[string]api.LoadBalancerStatus{ serviceStatusMap: map[string]v1.LoadBalancerStatus{
"foo1": buildServiceStatus([][]string{{"ip4", ""}, {"ip1", ""}, {"ip2", ""}}), "foo1": buildServiceStatus([][]string{{"ip4", ""}, {"ip1", ""}, {"ip2", ""}}),
}, },
}, },
&api.Service{Status: api.ServiceStatus{LoadBalancer: buildServiceStatus([][]string{{"ip2", ""}, {"ip3", ""}, {"ip5", ""}})}}, &v1.Service{Status: v1.ServiceStatus{LoadBalancer: buildServiceStatus([][]string{{"ip2", ""}, {"ip3", ""}, {"ip5", ""}})}},
"foo1", "foo1",
true, true,
buildServiceStatus([][]string{{"ip2", ""}, {"ip3", ""}, {"ip5", ""}}), buildServiceStatus([][]string{{"ip2", ""}, {"ip3", ""}, {"ip5", ""}}),
...@@ -117,20 +117,20 @@ func TestProcessServiceDeletion(t *testing.T) { ...@@ -117,20 +117,20 @@ func TestProcessServiceDeletion(t *testing.T) {
tests := []struct { tests := []struct {
name string name string
cachedService *cachedService cachedService *cachedService
service *api.Service service *v1.Service
clusterName string clusterName string
expectNeedUpdate bool expectNeedUpdate bool
expectStatus api.LoadBalancerStatus expectStatus v1.LoadBalancerStatus
}{ }{
{ {
"same-ingress", "same-ingress",
&cachedService{ &cachedService{
lastState: &api.Service{Status: api.ServiceStatus{LoadBalancer: buildServiceStatus([][]string{{"ip1", ""}})}}, lastState: &v1.Service{Status: v1.ServiceStatus{LoadBalancer: buildServiceStatus([][]string{{"ip1", ""}})}},
serviceStatusMap: map[string]api.LoadBalancerStatus{ serviceStatusMap: map[string]v1.LoadBalancerStatus{
"foo1": {Ingress: []api.LoadBalancerIngress{{"ip1", ""}}}, "foo1": {Ingress: []v1.LoadBalancerIngress{{"ip1", ""}}},
}, },
}, },
&api.Service{Status: api.ServiceStatus{LoadBalancer: buildServiceStatus([][]string{{"ip1", ""}})}}, &v1.Service{Status: v1.ServiceStatus{LoadBalancer: buildServiceStatus([][]string{{"ip1", ""}})}},
"foo1", "foo1",
true, true,
buildServiceStatus([][]string{}), buildServiceStatus([][]string{}),
...@@ -138,13 +138,13 @@ func TestProcessServiceDeletion(t *testing.T) { ...@@ -138,13 +138,13 @@ func TestProcessServiceDeletion(t *testing.T) {
{ {
"diff-ingress", "diff-ingress",
&cachedService{ &cachedService{
lastState: &api.Service{Status: api.ServiceStatus{LoadBalancer: buildServiceStatus([][]string{{"ip4", ""}, {"ip1", ""}, {"ip2", ""}, {"ip3", ""}, {"ip5", ""}, {"ip6", ""}, {"ip8", ""}})}}, lastState: &v1.Service{Status: v1.ServiceStatus{LoadBalancer: buildServiceStatus([][]string{{"ip4", ""}, {"ip1", ""}, {"ip2", ""}, {"ip3", ""}, {"ip5", ""}, {"ip6", ""}, {"ip8", ""}})}},
serviceStatusMap: map[string]api.LoadBalancerStatus{ serviceStatusMap: map[string]v1.LoadBalancerStatus{
"foo1": buildServiceStatus([][]string{{"ip1", ""}, {"ip2", ""}, {"ip3", ""}}), "foo1": buildServiceStatus([][]string{{"ip1", ""}, {"ip2", ""}, {"ip3", ""}}),
"foo2": buildServiceStatus([][]string{{"ip5", ""}, {"ip6", ""}, {"ip8", ""}}), "foo2": buildServiceStatus([][]string{{"ip5", ""}, {"ip6", ""}, {"ip8", ""}}),
}, },
}, },
&api.Service{Status: api.ServiceStatus{LoadBalancer: buildServiceStatus([][]string{{"ip1", ""}, {"ip2", ""}, {"ip3", ""}})}}, &v1.Service{Status: v1.ServiceStatus{LoadBalancer: buildServiceStatus([][]string{{"ip1", ""}, {"ip2", ""}, {"ip3", ""}})}},
"foo1", "foo1",
true, true,
buildServiceStatus([][]string{{"ip4", ""}, {"ip5", ""}, {"ip6", ""}, {"ip8", ""}}), buildServiceStatus([][]string{{"ip4", ""}, {"ip5", ""}, {"ip6", ""}, {"ip8", ""}}),
......
...@@ -20,9 +20,9 @@ import ( ...@@ -20,9 +20,9 @@ import (
"sync" "sync"
"testing" "testing"
"k8s.io/kubernetes/federation/apis/federation" "k8s.io/kubernetes/federation/apis/federation/v1alpha1"
"k8s.io/kubernetes/federation/pkg/dnsprovider/providers/google/clouddns" // Only for unit testing purposes. "k8s.io/kubernetes/federation/pkg/dnsprovider/providers/google/clouddns" // Only for unit testing purposes.
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/v1"
"k8s.io/kubernetes/pkg/util/sets" "k8s.io/kubernetes/pkg/util/sets"
) )
...@@ -39,22 +39,22 @@ func TestGetClusterConditionPredicate(t *testing.T) { ...@@ -39,22 +39,22 @@ func TestGetClusterConditionPredicate(t *testing.T) {
} }
tests := []struct { tests := []struct {
cluster federation.Cluster cluster v1alpha1.Cluster
expectAccept bool expectAccept bool
name string name string
serviceController *ServiceController serviceController *ServiceController
}{ }{
{ {
cluster: federation.Cluster{}, cluster: v1alpha1.Cluster{},
expectAccept: false, expectAccept: false,
name: "empty", name: "empty",
serviceController: &serviceController, serviceController: &serviceController,
}, },
{ {
cluster: federation.Cluster{ cluster: v1alpha1.Cluster{
Status: federation.ClusterStatus{ Status: v1alpha1.ClusterStatus{
Conditions: []federation.ClusterCondition{ Conditions: []v1alpha1.ClusterCondition{
{Type: federation.ClusterReady, Status: api.ConditionTrue}, {Type: v1alpha1.ClusterReady, Status: v1.ConditionTrue},
}, },
}, },
}, },
...@@ -63,10 +63,10 @@ func TestGetClusterConditionPredicate(t *testing.T) { ...@@ -63,10 +63,10 @@ func TestGetClusterConditionPredicate(t *testing.T) {
serviceController: &serviceController, serviceController: &serviceController,
}, },
{ {
cluster: federation.Cluster{ cluster: v1alpha1.Cluster{
Status: federation.ClusterStatus{ Status: v1alpha1.ClusterStatus{
Conditions: []federation.ClusterCondition{ Conditions: []v1alpha1.ClusterCondition{
{Type: federation.ClusterReady, Status: api.ConditionFalse}, {Type: v1alpha1.ClusterReady, Status: v1.ConditionFalse},
}, },
}, },
}, },
......
/*
Copyright 2016 The Kubernetes Authors All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package util
import (
"fmt"
"github.com/golang/glog"
federation_v1alpha1 "k8s.io/kubernetes/federation/apis/federation/v1alpha1"
"k8s.io/kubernetes/pkg/client/restclient"
client "k8s.io/kubernetes/pkg/client/unversioned"
"k8s.io/kubernetes/pkg/client/unversioned/clientcmd"
clientcmdapi "k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api"
utilnet "k8s.io/kubernetes/pkg/util/net"
"net"
"os"
)
const (
KubeAPIQPS = 20.0
KubeAPIBurst = 30
KubeconfigSecretDataKey = "kubeconfig"
)
func BuildClusterConfig(c *federation_v1alpha1.Cluster) (*restclient.Config, error) {
var serverAddress string
var clusterConfig *restclient.Config
hostIP, err := utilnet.ChooseHostInterface()
if err != nil {
return nil, err
}
for _, item := range c.Spec.ServerAddressByClientCIDRs {
_, cidrnet, err := net.ParseCIDR(item.ClientCIDR)
if err != nil {
return nil, err
}
myaddr := net.ParseIP(hostIP.String())
if cidrnet.Contains(myaddr) == true {
serverAddress = item.ServerAddress
break
}
}
if serverAddress != "" {
if c.Spec.SecretRef == nil {
glog.Infof("didnt find secretRef for cluster %s. Trying insecure access", c.Name)
clusterConfig, err = clientcmd.BuildConfigFromFlags(serverAddress, "")
} else {
kubeconfigGetter := KubeconfigGetterForCluster(c)
clusterConfig, err = clientcmd.BuildConfigFromKubeconfigGetter(serverAddress, kubeconfigGetter)
}
if err != nil {
return nil, err
}
clusterConfig.QPS = KubeAPIQPS
clusterConfig.Burst = KubeAPIBurst
}
return clusterConfig, nil
}
// This is to inject a different kubeconfigGetter in tests.
// We dont use the standard one which calls NewInCluster in tests to avoid having to setup service accounts and mount files with secret tokens.
var KubeconfigGetterForCluster = func(c *federation_v1alpha1.Cluster) clientcmd.KubeconfigGetter {
return func() (*clientcmdapi.Config, error) {
secretRefName := ""
if c.Spec.SecretRef != nil {
secretRefName = c.Spec.SecretRef.Name
} else {
glog.Infof("didnt find secretRef for cluster %s. Trying insecure access", c.Name)
}
return KubeconfigGetterForSecret(secretRefName)()
}
}
// KubeconfigGettterForSecret is used to get the kubeconfig from the given secret.
var KubeconfigGetterForSecret = func(secretName string) clientcmd.KubeconfigGetter {
return func() (*clientcmdapi.Config, error) {
var data []byte
if secretName != "" {
// Get the namespace this is running in from the env variable.
namespace := os.Getenv("POD_NAMESPACE")
if namespace == "" {
return nil, fmt.Errorf("unexpected: POD_NAMESPACE env var returned empty string")
}
// Get a client to talk to the k8s apiserver, to fetch secrets from it.
client, err := client.NewInCluster()
if err != nil {
return nil, fmt.Errorf("error in creating in-cluster client: %s", err)
}
data = []byte{}
secret, err := client.Secrets(namespace).Get(secretName)
if err != nil {
return nil, fmt.Errorf("error in fetching secret: %s", err)
}
ok := false
data, ok = secret.Data[KubeconfigSecretDataKey]
if !ok {
return nil, fmt.Errorf("secret does not have data with key: %s", KubeconfigSecretDataKey)
}
}
return clientcmd.Load(data)
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment