Skip to content

Commit f0ac847

Browse files
committed
allow master flag to take multiple values for watching configmaps
1 parent 21d1aef commit f0ac847

File tree

2 files changed

+39
-13
lines changed

2 files changed

+39
-13
lines changed

kube/configmap.go

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,36 +16,42 @@ import (
1616
)
1717

1818
type ConfigMapWatcher struct {
19-
client kubernetes.Interface
19+
clients []kubernetes.Interface
2020
namespace string
2121
selector fields.Selector
2222
configs chan provider.EgressConfig
2323
}
2424

25-
func NewConfigMapWatcher(client kubernetes.Interface, namespace, selectorStr string, configs chan provider.EgressConfig) (*ConfigMapWatcher, error) {
25+
func NewConfigMapWatcher(clients []kubernetes.Interface, namespace, selectorStr string, configs chan provider.EgressConfig) (*ConfigMapWatcher, error) {
2626
selector, err := fields.ParseSelector(selectorStr)
2727
if err != nil {
2828
return nil, err
2929
}
3030

3131
return &ConfigMapWatcher{
32-
client: client,
32+
clients: clients,
3333
namespace: namespace,
3434
selector: selector,
3535
configs: configs,
3636
}, nil
3737
}
3838

3939
func (c *ConfigMapWatcher) Run(ctx context.Context) {
40+
for _, client := range c.clients {
41+
c.runForClient(ctx, client)
42+
}
43+
}
44+
45+
func (c *ConfigMapWatcher) runForClient(ctx context.Context, client kubernetes.Interface) {
4046
informer := cache.NewSharedIndexInformer(
4147
&cache.ListWatch{
4248
ListFunc: func(options metav1.ListOptions) (runtime.Object, error) {
4349
options.LabelSelector = c.selector.String()
44-
return c.client.CoreV1().ConfigMaps(c.namespace).List(ctx, options)
50+
return client.CoreV1().ConfigMaps(c.namespace).List(ctx, options)
4551
},
4652
WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) {
4753
options.LabelSelector = c.selector.String()
48-
return c.client.CoreV1().ConfigMaps(c.namespace).Watch(ctx, options)
54+
return client.CoreV1().ConfigMaps(c.namespace).Watch(ctx, options)
4955
},
5056
},
5157
&v1.ConfigMap{},
@@ -105,11 +111,23 @@ func (c *ConfigMapWatcher) del(obj interface{}) {
105111
}
106112

107113
func (c *ConfigMapWatcher) ListConfigs(ctx context.Context) ([]provider.EgressConfig, error) {
114+
egressConfigs := []provider.EgressConfig{}
115+
for _, client := range c.clients {
116+
configs, err := c.listConfigsForClient(ctx, client)
117+
if err != nil {
118+
return nil, err
119+
}
120+
egressConfigs = append(egressConfigs, configs...)
121+
}
122+
return egressConfigs, nil
123+
}
124+
125+
func (c *ConfigMapWatcher) listConfigsForClient(ctx context.Context, client kubernetes.Interface) ([]provider.EgressConfig, error) {
108126
opts := metav1.ListOptions{
109127
LabelSelector: c.selector.String(),
110128
}
111129

112-
configMaps, err := c.client.CoreV1().ConfigMaps(c.namespace).List(ctx, opts)
130+
configMaps, err := client.CoreV1().ConfigMaps(c.namespace).List(ctx, opts)
113131
if err != nil {
114132
return nil, err
115133
}

main.go

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ var (
3636
)
3737

3838
type Config struct {
39-
Master string
39+
Masters []string
4040
KubeConfig string
4141
DryRun bool
4242
LogFormat string
@@ -62,7 +62,6 @@ type Config struct {
6262
}
6363

6464
var defaultConfig = &Config{
65-
Master: "",
6665
KubeConfig: "",
6766
VPCID: "",
6867
ClusterID: "",
@@ -122,7 +121,7 @@ Example:
122121
app.DefaultEnvars()
123122

124123
// Flags related to Kubernetes
125-
app.Flag("master", "The Kubernetes API server to connect to (default: auto-detect)").Default(defaultConfig.Master).StringVar(&cfg.Master)
124+
app.Flag("master", "The Kubernetes API server to connect to (default: auto-detect)").Default("").StringsVar(&cfg.Masters)
126125
app.Flag("kubeconfig", "Retrieve target cluster configuration from a Kubernetes configuration file (default: auto-detect)").Default(defaultConfig.KubeConfig).StringVar(&cfg.KubeConfig)
127126
app.Flag("use-platform-credentials", "Use Platform credentials (default: disabled)").BoolVar(&cfg.UsePlatformCredentials)
128127
app.Flag("credentials-dir", "Directory where the Platform credentials are stored (default: /meta/credentials)").Default(auth.DefaultCredentialsDir).Envar(auth.CredentialsDirEnvar).StringVar(&cfg.CredentialsDir)
@@ -175,7 +174,7 @@ func main() {
175174
}
176175

177176
configsChan := make(chan provider.EgressConfig)
178-
cmWatcher, err := kube.NewConfigMapWatcher(newKubeClient(cfg), cfg.Namespace, "egress=static", configsChan)
177+
cmWatcher, err := kube.NewConfigMapWatcher(newKubeClients(cfg), cfg.Namespace, "egress=static", configsChan)
179178
if err != nil {
180179
log.Fatalf("Failed to setup ConfigMap watcher: %v", err)
181180
}
@@ -193,14 +192,23 @@ func main() {
193192
controller.Run(ctx)
194193
}
195194

196-
// newKubeClient returns a new Kubernetes client with the default config.
197-
func newKubeClient(cfg *Config) kubernetes.Interface {
195+
// newKubeClients returns multiple Kubernetes clients with the given config.
196+
func newKubeClients(cfg *Config) []kubernetes.Interface {
198197
var kubeconfig string
199198
if _, err := os.Stat(clientcmd.RecommendedHomeFile); err == nil {
200199
kubeconfig = clientcmd.RecommendedHomeFile
201200
}
202201
log.Debugf("use config file %s", kubeconfig)
203-
config, err := clientcmd.BuildConfigFromFlags(cfg.Master, kubeconfig)
202+
var clients []kubernetes.Interface
203+
for _, master := range cfg.Masters {
204+
clients = append(clients, newKubeClient(cfg, master, kubeconfig))
205+
}
206+
return clients
207+
}
208+
209+
// newKubeClient returns a new Kubernetes client with the given config.
210+
func newKubeClient(cfg *Config, master, kubeconfig string) kubernetes.Interface {
211+
config, err := clientcmd.BuildConfigFromFlags(master, kubeconfig)
204212
if err != nil {
205213
log.Fatalf("build config failed: %v", err)
206214
}

0 commit comments

Comments
 (0)