Skip to content

Commit 6148224

Browse files
committed
refactor(kubernetes): enhance AccessControlClientset and streamline Manager and Kubernetes structs
Signed-off-by: Marc Nuri <marc@marcnuri.com>
1 parent 59510a9 commit 6148224

File tree

8 files changed

+280
-121
lines changed

8 files changed

+280
-121
lines changed

pkg/kubernetes/accesscontrol_clientset.go renamed to pkg/kubernetes/accesscontrol_client_set.go

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,25 +15,29 @@ import (
1515
corev1 "k8s.io/client-go/kubernetes/typed/core/v1"
1616
"k8s.io/client-go/rest"
1717
"k8s.io/client-go/restmapper"
18+
"k8s.io/client-go/tools/clientcmd"
1819
metricsv1beta1 "k8s.io/metrics/pkg/client/clientset/versioned/typed/metrics/v1beta1"
1920
)
2021

2122
// AccessControlClientset is a limited clientset delegating interface to the standard kubernetes.Clientset
2223
// Only a limited set of functions are implemented with a single point of access to the kubernetes API where
2324
// apiVersion and kinds are checked for allowed access
2425
type AccessControlClientset struct {
25-
cfg *rest.Config
2626
kubernetes.Interface
27+
staticConfig *config.StaticConfig
28+
clientCmdConfig clientcmd.ClientConfig
29+
cfg *rest.Config
2730
restMapper meta.ResettableRESTMapper
2831
discoveryClient discovery.CachedDiscoveryInterface
2932
dynamicClient dynamic.Interface
3033
metricsV1beta1 *metricsv1beta1.MetricsV1beta1Client
3134
}
3235

33-
func NewAccessControlClientset(staticConfig *config.StaticConfig, restConfig *rest.Config) (*AccessControlClientset, error) {
34-
rest.CopyConfig(restConfig)
36+
func NewAccessControlClientset(staticConfig *config.StaticConfig, clientCmdConfig clientcmd.ClientConfig, restConfig *rest.Config) (*AccessControlClientset, error) {
3537
acc := &AccessControlClientset{
36-
cfg: rest.CopyConfig(restConfig),
38+
staticConfig: staticConfig,
39+
clientCmdConfig: clientCmdConfig,
40+
cfg: rest.CopyConfig(restConfig),
3741
}
3842
if acc.cfg.UserAgent == "" {
3943
acc.cfg.UserAgent = rest.DefaultKubernetesUserAgent()
@@ -111,3 +115,8 @@ func (a *AccessControlClientset) SelfSubjectAccessReviews() (authorizationv1.Sel
111115
func (a *AccessControlClientset) TokenReview() (authenticationv1.TokenReviewInterface, error) {
112116
return a.AuthenticationV1().TokenReviews(), nil
113117
}
118+
119+
// ToRawKubeConfigLoader returns the clientcmd.ClientConfig object (genericclioptions.RESTClientGetter)
120+
func (a *AccessControlClientset) ToRawKubeConfigLoader() clientcmd.ClientConfig {
121+
return a.clientCmdConfig
122+
}

pkg/kubernetes/configuration.go

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,16 @@ func IsInCluster(cfg *config.StaticConfig) bool {
3232
}
3333

3434
func (k *Kubernetes) NamespaceOrDefault(namespace string) string {
35-
return k.manager.NamespaceOrDefault(namespace)
35+
if namespace == "" {
36+
return k.configuredNamespace()
37+
}
38+
return namespace
3639
}
3740

3841
// ConfigurationContextsDefault returns the current context name
3942
// TODO: Should be moved to the Provider level ?
4043
func (k *Kubernetes) ConfigurationContextsDefault() (string, error) {
41-
cfg, err := k.manager.clientCmdConfig.RawConfig()
44+
cfg, err := k.ToRawKubeConfigLoader().RawConfig()
4245
if err != nil {
4346
return "", err
4447
}
@@ -48,7 +51,7 @@ func (k *Kubernetes) ConfigurationContextsDefault() (string, error) {
4851
// ConfigurationContextsList returns the list of available context names
4952
// TODO: Should be moved to the Provider level ?
5053
func (k *Kubernetes) ConfigurationContextsList() (map[string]string, error) {
51-
cfg, err := k.manager.clientCmdConfig.RawConfig()
54+
cfg, err := k.ToRawKubeConfigLoader().RawConfig()
5255
if err != nil {
5356
return nil, err
5457
}
@@ -71,7 +74,7 @@ func (k *Kubernetes) ConfigurationContextsList() (map[string]string, error) {
7174
func (k *Kubernetes) ConfigurationView(minify bool) (runtime.Object, error) {
7275
var cfg clientcmdapi.Config
7376
var err error
74-
if cfg, err = k.manager.clientCmdConfig.RawConfig(); err != nil {
77+
if cfg, err = k.ToRawKubeConfigLoader().RawConfig(); err != nil {
7578
return nil, err
7679
}
7780
if minify {

pkg/kubernetes/kubernetes.go

Lines changed: 37 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
package kubernetes
22

33
import (
4+
"k8s.io/apimachinery/pkg/api/meta"
45
"k8s.io/apimachinery/pkg/runtime"
6+
"k8s.io/client-go/discovery"
57
"k8s.io/client-go/kubernetes/scheme"
68
_ "k8s.io/client-go/plugin/pkg/client/auth/oidc"
9+
"k8s.io/client-go/rest"
10+
"k8s.io/client-go/tools/clientcmd"
711

812
"github.com/containers/kubernetes-mcp-server/pkg/helm"
913
"github.com/containers/kubernetes-mcp-server/pkg/kiali"
@@ -20,26 +24,52 @@ const (
2024

2125
type CloseWatchKubeConfig func() error
2226

27+
var Scheme = scheme.Scheme
28+
var ParameterCodec = runtime.NewParameterCodec(Scheme)
29+
2330
type Kubernetes struct {
24-
manager *Manager
31+
accessControlClientSet *AccessControlClientset
2532
}
2633

34+
var _ helm.Kubernetes = (*Kubernetes)(nil)
35+
2736
// AccessControlClientset returns the access-controlled clientset
2837
// This ensures that any denied resources configured in the system are properly enforced
2938
func (k *Kubernetes) AccessControlClientset() *AccessControlClientset {
30-
return k.manager.accessControlClientSet
39+
return k.accessControlClientSet
3140
}
3241

33-
var Scheme = scheme.Scheme
34-
var ParameterCodec = runtime.NewParameterCodec(Scheme)
35-
3642
func (k *Kubernetes) NewHelm() *helm.Helm {
3743
// This is a derived Kubernetes, so it already has the Helm initialized
38-
return helm.NewHelm(k.manager)
44+
return helm.NewHelm(k)
3945
}
4046

4147
// NewKiali returns a Kiali client initialized with the same StaticConfig and bearer token
4248
// as the underlying derived Kubernetes manager.
4349
func (k *Kubernetes) NewKiali() *kiali.Kiali {
44-
return kiali.NewKiali(k.manager.staticConfig, k.AccessControlClientset().cfg)
50+
return kiali.NewKiali(k.AccessControlClientset().staticConfig, k.AccessControlClientset().cfg)
51+
}
52+
53+
func (k *Kubernetes) configuredNamespace() string {
54+
if ns, _, nsErr := k.AccessControlClientset().ToRawKubeConfigLoader().Namespace(); nsErr == nil {
55+
return ns
56+
}
57+
return ""
58+
}
59+
60+
func (k *Kubernetes) ToDiscoveryClient() (discovery.CachedDiscoveryInterface, error) {
61+
return k.AccessControlClientset().DiscoveryClient(), nil
62+
}
63+
64+
func (k *Kubernetes) ToRESTMapper() (meta.RESTMapper, error) {
65+
return k.AccessControlClientset().RESTMapper(), nil
66+
}
67+
68+
// ToRESTConfig returns the rest.Config object (genericclioptions.RESTClientGetter)
69+
func (k *Kubernetes) ToRESTConfig() (*rest.Config, error) {
70+
return k.AccessControlClientset().cfg, nil
71+
}
72+
73+
func (k *Kubernetes) ToRawKubeConfigLoader() clientcmd.ClientConfig {
74+
return k.AccessControlClientset().ToRawKubeConfigLoader()
4575
}

0 commit comments

Comments
 (0)