Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
K
k3s
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Jacklull
k3s
Commits
6dde087f
Commit
6dde087f
authored
Jun 03, 2016
by
mfanjie
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
change clientset of service controller to versioned one
parent
c2dbce68
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
14 changed files
with
239 additions
and
187 deletions
+239
-187
cluster_cache.go
federation/client/cache/cluster_cache.go
+6
-6
controllermanager.go
...md/federation-controller-manager/app/controllermanager.go
+8
-9
cluster_client.go
...ation/pkg/federation-controller/cluster/cluster_client.go
+3
-71
clustercontroller.go
...on/pkg/federation-controller/cluster/clustercontroller.go
+2
-3
clustercontroller_test.go
...g/federation-controller/cluster/clustercontroller_test.go
+4
-3
cluster_helper.go
...ation/pkg/federation-controller/service/cluster_helper.go
+25
-26
dns.go
federation/pkg/federation-controller/service/dns.go
+6
-0
endpoint_helper.go
...tion/pkg/federation-controller/service/endpoint_helper.go
+5
-5
endpoint_helper_test.go
...pkg/federation-controller/service/endpoint_helper_test.go
+15
-15
service_helper.go
...ation/pkg/federation-controller/service/service_helper.go
+6
-6
service_helper_test.go
.../pkg/federation-controller/service/service_helper_test.go
+31
-31
servicecontroller.go
...on/pkg/federation-controller/service/servicecontroller.go
+0
-0
servicecontroller_test.go
...g/federation-controller/service/servicecontroller_test.go
+12
-12
cluster_util.go
federation/pkg/federation-controller/util/cluster_util.go
+116
-0
No files found.
federation/client/cache/cluster_cache.go
View file @
6dde087f
...
@@ -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
{
...
...
federation/cmd/federation-controller-manager/app/controllermanager.go
View file @
6dde087f
...
@@ -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
{
federationClientS
et
:=
federationclientset
.
NewForConfigOrDie
(
restclient
.
AddUserAgent
(
restClientCfg
,
"cluster-controller"
))
ccClients
et
:=
federationclientset
.
NewForConfigOrDie
(
restclient
.
AddUserAgent
(
restClientCfg
,
"cluster-controller"
))
go
clustercontroller
.
NewclusterController
(
federationClientS
et
,
s
.
ClusterMonitorPeriod
.
Duration
)
.
Run
()
go
clustercontroller
.
NewclusterController
(
ccClients
et
,
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
)
}
}
sc
clientset
:=
internal
clientset
.
NewForConfigOrDie
(
restclient
.
AddUserAgent
(
restClientCfg
,
servicecontroller
.
UserAgentName
))
sc
Clientset
:=
federation
clientset
.
NewForConfigOrDie
(
restclient
.
AddUserAgent
(
restClientCfg
,
servicecontroller
.
UserAgentName
))
servicecontroller
:=
servicecontroller
.
New
(
sc
c
lientset
,
dns
)
servicecontroller
:=
servicecontroller
.
New
(
sc
C
lientset
,
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
)
}
}
...
...
federation/pkg/federation-controller/cluster/cluster_client.go
View file @
6dde087f
/*
/*
Copyright 201
4
The Kubernetes Authors All rights reserved.
Copyright 201
6
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
{}
...
...
federation/pkg/federation-controller/cluster/clustercontroller.go
View file @
6dde087f
/*
/*
Copyright 201
4
The Kubernetes Authors All rights reserved.
Copyright 201
6
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
,
...
...
federation/pkg/federation-controller/cluster/clustercontroller_test.go
View file @
6dde087f
...
@@ -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
}
}
federation/pkg/federation-controller/service/cluster_helper.go
View file @
6dde087f
...
@@ -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
}
}
federation/pkg/federation-controller/service/dns.go
View file @
6dde087f
...
@@ -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
}
}
...
...
federation/pkg/federation-controller/service/endpoint_helper.go
View file @
6dde087f
...
@@ -20,8 +20,8 @@ import (
...
@@ -20,8 +20,8 @@ import (
"fmt"
"fmt"
"time"
"time"
federation
clientset
"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
federation
clientset
.
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
()
...
...
federation/pkg/federation-controller/service/endpoint_helper_test.go
View file @
6dde087f
...
@@ -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
,
},
},
...
...
federation/pkg/federation-controller/service/service_helper.go
View file @
6dde087f
...
@@ -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
federation
clientset
.
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
federation
clientset
.
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
...
...
federation/pkg/federation-controller/service/service_helper_test.go
View file @
6dde087f
...
@@ -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"
,
""
}}),
...
...
federation/pkg/federation-controller/service/servicecontroller.go
View file @
6dde087f
This diff is collapsed.
Click to expand it.
federation/pkg/federation-controller/service/servicecontroller_test.go
View file @
6dde087f
...
@@ -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
},
},
},
},
},
},
},
...
...
federation/pkg/federation-controller/util/cluster_util.go
0 → 100644
View file @
6dde087f
/*
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
)
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment