77 "strings"
88
99 "k8s.io/apimachinery/pkg/runtime"
10+ "k8s.io/klog/v2"
1011
1112 "github.com/manusa/kubernetes-mcp-server/pkg/version"
1213 authv1 "k8s.io/api/authorization/v1"
@@ -30,7 +31,7 @@ type ResourceListOptions struct {
3031}
3132
3233func (k * Kubernetes ) ResourcesList (ctx context.Context , gvk * schema.GroupVersionKind , namespace string , options ResourceListOptions ) (runtime.Unstructured , error ) {
33- gvr , err := k .resourceFor (gvk )
34+ gvr , err := k .ResourceFor (gvk )
3435 if err != nil {
3536 return nil , err
3637 }
@@ -41,7 +42,7 @@ func (k *Kubernetes) ResourcesList(ctx context.Context, gvk *schema.GroupVersion
4142 namespace = k .manager .configuredNamespace ()
4243 }
4344
44- if err := k .canClientAccess (ctx , gvr , "" , namespace , "list" , "" ); err != nil {
45+ if err := k .CanClientAccess (ctx , gvr , "" , namespace , "list" , "" ); err != nil {
4546 return nil , err
4647 }
4748
@@ -52,7 +53,7 @@ func (k *Kubernetes) ResourcesList(ctx context.Context, gvk *schema.GroupVersion
5253}
5354
5455func (k * Kubernetes ) ResourcesGet (ctx context.Context , gvk * schema.GroupVersionKind , namespace , name string ) (* unstructured.Unstructured , error ) {
55- gvr , err := k .resourceFor (gvk )
56+ gvr , err := k .ResourceFor (gvk )
5657 if err != nil {
5758 return nil , err
5859 }
@@ -62,7 +63,7 @@ func (k *Kubernetes) ResourcesGet(ctx context.Context, gvk *schema.GroupVersionK
6263 namespace = k .NamespaceOrDefault (namespace )
6364 }
6465
65- if err := k .canClientAccess (ctx , gvr , name , namespace , "get" , "" ); err != nil {
66+ if err := k .CanClientAccess (ctx , gvr , name , namespace , "get" , "" ); err != nil {
6667 return nil , err
6768 }
6869
@@ -84,7 +85,7 @@ func (k *Kubernetes) ResourcesCreateOrUpdate(ctx context.Context, resource strin
8485}
8586
8687func (k * Kubernetes ) ResourcesDelete (ctx context.Context , gvk * schema.GroupVersionKind , namespace , name string ) error {
87- gvr , err := k .resourceFor (gvk )
88+ gvr , err := k .ResourceFor (gvk )
8889 if err != nil {
8990 return err
9091 }
@@ -94,7 +95,7 @@ func (k *Kubernetes) ResourcesDelete(ctx context.Context, gvk *schema.GroupVersi
9495 namespace = k .NamespaceOrDefault (namespace )
9596 }
9697
97- if err := k .canClientAccess (ctx , gvr , name , namespace , "delete" , "" ); err != nil {
98+ if err := k .CanClientAccess (ctx , gvr , name , namespace , "delete" , "" ); err != nil {
9899 return err
99100 }
100101
@@ -151,7 +152,7 @@ func (k *Kubernetes) resourcesListAsTable(ctx context.Context, gvk *schema.Group
151152func (k * Kubernetes ) resourcesCreateOrUpdate (ctx context.Context , resources []* unstructured.Unstructured ) ([]* unstructured.Unstructured , error ) {
152153 for i , obj := range resources {
153154 gvk := obj .GroupVersionKind ()
154- gvr , rErr := k .resourceFor (& gvk )
155+ gvr , rErr := k .ResourceFor (& gvk )
155156 if rErr != nil {
156157 return nil , rErr
157158 }
@@ -162,7 +163,7 @@ func (k *Kubernetes) resourcesCreateOrUpdate(ctx context.Context, resources []*u
162163 namespace = k .NamespaceOrDefault (namespace )
163164 }
164165
165- if err := k .canClientAccess (ctx , gvr , obj .GetName (), namespace , "patch" , "" ); err != nil {
166+ if err := k .CanClientAccess (ctx , gvr , obj .GetName (), namespace , "patch" , "" ); err != nil {
166167 return nil , err
167168 }
168169
@@ -180,7 +181,7 @@ func (k *Kubernetes) resourcesCreateOrUpdate(ctx context.Context, resources []*u
180181 return resources , nil
181182}
182183
183- func (k * Kubernetes ) resourceFor (gvk * schema.GroupVersionKind ) (* schema.GroupVersionResource , error ) {
184+ func (k * Kubernetes ) ResourceFor (gvk * schema.GroupVersionKind ) (* schema.GroupVersionResource , error ) {
184185 m , err := k .manager .accessControlRESTMapper .RESTMapping (schema.GroupKind {Group : gvk .Group , Kind : gvk .Kind }, gvk .Version )
185186 if err != nil {
186187 return nil , err
@@ -208,7 +209,7 @@ func (k *Kubernetes) supportsGroupVersion(groupVersion string) bool {
208209 return true
209210}
210211
211- func (k * Kubernetes ) canClientAccess (ctx context.Context , gvr * schema.GroupVersionResource , resourceName , namespace , verb , subResource string ) error {
212+ func (k * Kubernetes ) CanClientAccess (ctx context.Context , gvr * schema.GroupVersionResource , resourceName , namespace , verb , subResource string ) error {
212213 if ! k .manager .staticConfig .RequireOAuth {
213214 return nil
214215 }
@@ -223,7 +224,7 @@ func (k *Kubernetes) canClientAccess(ctx context.Context, gvr *schema.GroupVersi
223224 }
224225 groups := ctx .Value ("X-User-Groups" )
225226 if groups == nil {
226- return fmt . Errorf ( "user groups are not set" )
227+ groups = [] string {}
227228 }
228229 userGroups := strings .Split (groups .(string ), "," )
229230
@@ -254,6 +255,7 @@ func (k *Kubernetes) canClientAccess(ctx context.Context, gvr *schema.GroupVersi
254255 if ! response .Status .Allowed {
255256 return fmt .Errorf ("user %q does not have permission to %s %s" , userName , verb , resourceName )
256257 }
258+ klog .V (2 ).Infof ("User %q has permission to %s %s in namespace %s" , userName , verb , resourceName , namespace )
257259 return nil
258260}
259261
0 commit comments