@@ -2,7 +2,6 @@ package kubernetes
22
33import (
44 "context"
5- "fmt"
65
76 "github.com/containers/kubernetes-mcp-server/pkg/config"
87 "k8s.io/client-go/discovery/cached/memory"
@@ -12,10 +11,6 @@ import (
1211 "k8s.io/client-go/tools/clientcmd"
1312)
1413
15- const (
16- KubeConfigTargetParameterName = "context"
17- )
18-
1914type ManagerProvider interface {
2015 GetTargets (ctx context.Context ) ([]string , error )
2116 GetManagerFor (ctx context.Context , target string ) (* Manager , error )
@@ -25,158 +20,20 @@ type ManagerProvider interface {
2520 Close ()
2621}
2722
28- type kubeConfigClusterProvider struct {
29- defaultContext string
30- managers map [string ]* Manager
31- }
32-
33- var _ ManagerProvider = & kubeConfigClusterProvider {}
34-
35- type singleClusterProvider struct {
36- strategy string
37- manager * Manager
38- }
39-
40- var _ ManagerProvider = & singleClusterProvider {}
41-
4223func NewManagerProvider (cfg * config.StaticConfig ) (ManagerProvider , error ) {
4324 m , err := NewManager (cfg )
4425 if err != nil {
4526 return nil , err
4627 }
4728
4829 strategy := resolveStrategy (cfg , m )
49- switch strategy {
50- case config .ClusterProviderKubeConfig :
51- return newKubeConfigClusterProvider (m )
52- case config .ClusterProviderInCluster , config .ClusterProviderDisabled :
53- return newSingleClusterProvider (m , strategy )
54- default :
55- return nil , fmt .Errorf (
56- "invalid ClusterProviderStrategy '%s', must be 'kubeconfig', 'in-cluster', or 'disabled'" ,
57- strategy ,
58- )
59- }
60- }
61-
62- func newKubeConfigClusterProvider (m * Manager ) (* kubeConfigClusterProvider , error ) {
63- // Handle in-cluster mode
64- if m .IsInCluster () {
65- return nil , fmt .Errorf ("kubeconfig ClusterProviderStrategy is invalid for in-cluster deployments" )
66- }
67-
68- rawConfig , err := m .clientCmdConfig .RawConfig ()
69- if err != nil {
70- return nil , err
71- }
72-
73- allClusterManagers := map [string ]* Manager {
74- rawConfig .CurrentContext : m , // we already initialized a manager for the default context, let's use it
75- }
76-
77- for name := range rawConfig .Contexts {
78- if name == rawConfig .CurrentContext {
79- continue // already initialized this, don't want to set it to nil
80- }
81-
82- allClusterManagers [name ] = nil
83- }
84-
85- return & kubeConfigClusterProvider {
86- defaultContext : rawConfig .CurrentContext ,
87- managers : allClusterManagers ,
88- }, nil
89- }
90-
91- func newSingleClusterProvider (m * Manager , strategy string ) (* singleClusterProvider , error ) {
92- if strategy == config .ClusterProviderInCluster && ! m .IsInCluster () {
93- return nil , fmt .Errorf ("server must be deployed in cluster for the in-cluster ClusterProviderStrategy" )
94- }
95-
96- return & singleClusterProvider {
97- manager : m ,
98- strategy : strategy ,
99- }, nil
100- }
101-
102- func (k * kubeConfigClusterProvider ) GetTargets (ctx context.Context ) ([]string , error ) {
103- contextNames := make ([]string , 0 , len (k .managers ))
104- for cluster := range k .managers {
105- contextNames = append (contextNames , cluster )
106- }
107-
108- return contextNames , nil
109- }
110-
111- func (k * kubeConfigClusterProvider ) GetTargetParameterName () string {
112- return KubeConfigTargetParameterName
113- }
114-
115- func (k * kubeConfigClusterProvider ) GetManagerFor (ctx context.Context , context string ) (* Manager , error ) {
116- m , ok := k .managers [context ]
117- if ok && m != nil {
118- return m , nil
119- }
120-
121- baseManager := k .managers [k .defaultContext ]
122-
123- if baseManager .IsInCluster () {
124- // In cluster mode, so context switching is not applicable
125- return baseManager , nil
126- }
12730
128- m , err := baseManager . newForContext ( context )
31+ factory , err := getProviderFactory ( strategy )
12932 if err != nil {
13033 return nil , err
13134 }
13235
133- k .managers [context ] = m
134-
135- return m , nil
136- }
137-
138- func (k * kubeConfigClusterProvider ) GetDefaultTarget () string {
139- return k .defaultContext
140- }
141-
142- func (k * kubeConfigClusterProvider ) WatchTargets (onKubeConfigChanged func () error ) {
143- m := k .managers [k .defaultContext ]
144-
145- m .WatchKubeConfig (onKubeConfigChanged )
146- }
147-
148- func (k * kubeConfigClusterProvider ) Close () {
149- m := k .managers [k .defaultContext ]
150-
151- m .Close ()
152- }
153-
154- func (s * singleClusterProvider ) GetTargets (ctx context.Context ) ([]string , error ) {
155- return []string {"" }, nil
156- }
157-
158- func (s * singleClusterProvider ) GetManagerFor (ctx context.Context , target string ) (* Manager , error ) {
159- if target != "" {
160- return nil , fmt .Errorf ("unable to get manager for other context/cluster with %s strategy" , s .strategy )
161- }
162-
163- return s .manager , nil
164- }
165-
166- func (s * singleClusterProvider ) GetDefaultTarget () string {
167- return ""
168- }
169-
170- func (s * singleClusterProvider ) GetTargetParameterName () string {
171- return ""
172- }
173-
174- func (s * singleClusterProvider ) WatchTargets (watch func () error ) {
175- s .manager .WatchKubeConfig (watch )
176- }
177-
178- func (s * singleClusterProvider ) Close () {
179- s .manager .Close ()
36+ return factory (m , cfg )
18037}
18138
18239func (m * Manager ) newForContext (context string ) (* Manager , error ) {
0 commit comments