From 5a249f35e46ca8023f486608cfd055b146cc895b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 18 Jun 2026 20:04:29 +0000 Subject: [PATCH 1/2] Initial plan From 2fb45576871a26e1b0189fb9f9d2a0d2fd9db4ab Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 18 Jun 2026 20:15:00 +0000 Subject: [PATCH 2/2] =?UTF-8?q?=F0=9F=8C=B1=20Extract=20GetConfigMaps/GetS?= =?UTF-8?q?ecrets/GetServiceAccounts=20into=20resources=5Fcore.go?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Move the three core-resource read handlers out of the catch-all resources.go (780 lines) into a focused resources_core.go, as requested in issue #19098. - No behaviour change; all shared helpers remain in place. - Build and go vet pass cleanly. - Existing TestListClusterResources tests pass. Fixes #19098 Signed-off-by: GitHub Copilot --- pkg/api/handlers/mcp/resources.go | 64 ---------------------- pkg/api/handlers/mcp/resources_core.go | 75 ++++++++++++++++++++++++++ 2 files changed, 75 insertions(+), 64 deletions(-) create mode 100644 pkg/api/handlers/mcp/resources_core.go diff --git a/pkg/api/handlers/mcp/resources.go b/pkg/api/handlers/mcp/resources.go index 7512479545..f759fdb0fe 100644 --- a/pkg/api/handlers/mcp/resources.go +++ b/pkg/api/handlers/mcp/resources.go @@ -23,70 +23,6 @@ import ( "github.com/kubestellar/console/pkg/k8s" ) -func (h *MCPHandlers) GetConfigMaps(c *fiber.Ctx) error { - cluster := c.Query("cluster") - namespace := c.Query("namespace") - - if err := mcpValidateClusterAndNamespace(cluster, namespace); err != nil { - return err - } - - return h.withDemoFallback(c, "configmaps", handlers.GetDemoConfigMaps(), func(client *k8s.MultiClusterClient) error { - items, errTracker, err := listClusterResources(c.Context(), client, cluster, func(ctx context.Context, clusterName string) ([]k8s.ConfigMap, error) { - return client.GetConfigMaps(ctx, clusterName, namespace) - }) - if err != nil { - return HandleK8sError(c, err) - } - return respondClusterResources(c, "configmaps", items, errTracker) - }) -} - -// GetSecrets returns Secrets from clusters. -// Requires editor or admin role — Secrets contain sensitive data (CWE-862, #16731). -func (h *MCPHandlers) GetSecrets(c *fiber.Ctx) error { - if err := handlers.RequireEditorOrAdmin(c, h.store); err != nil { - return err - } - - cluster := c.Query("cluster") - namespace := c.Query("namespace") - - if err := mcpValidateClusterAndNamespace(cluster, namespace); err != nil { - return err - } - - return h.withDemoFallback(c, "secrets", handlers.GetDemoSecrets(), func(client *k8s.MultiClusterClient) error { - items, errTracker, err := listClusterResources(c.Context(), client, cluster, func(ctx context.Context, clusterName string) ([]k8s.Secret, error) { - return client.GetSecrets(ctx, clusterName, namespace) - }) - if err != nil { - return HandleK8sError(c, err) - } - return respondClusterResources(c, "secrets", items, errTracker) - }) -} - -// GetServiceAccounts returns ServiceAccounts from clusters -func (h *MCPHandlers) GetServiceAccounts(c *fiber.Ctx) error { - cluster := c.Query("cluster") - namespace := c.Query("namespace") - - if err := mcpValidateClusterAndNamespace(cluster, namespace); err != nil { - return err - } - - return h.withDemoFallback(c, "serviceAccounts", handlers.GetDemoServiceAccounts(), func(client *k8s.MultiClusterClient) error { - items, errTracker, err := listClusterResources(c.Context(), client, cluster, func(ctx context.Context, clusterName string) ([]k8s.ServiceAccount, error) { - return client.GetServiceAccounts(ctx, clusterName, namespace) - }) - if err != nil { - return HandleK8sError(c, err) - } - return respondClusterResources(c, "serviceAccounts", items, errTracker) - }) -} - // GetPVCs returns PersistentVolumeClaims from clusters func (h *MCPHandlers) GetPVCs(c *fiber.Ctx) error { cluster := c.Query("cluster") diff --git a/pkg/api/handlers/mcp/resources_core.go b/pkg/api/handlers/mcp/resources_core.go new file mode 100644 index 0000000000..5029dbb424 --- /dev/null +++ b/pkg/api/handlers/mcp/resources_core.go @@ -0,0 +1,75 @@ +package mcp + +import ( + "context" + + "github.com/gofiber/fiber/v2" + + "github.com/kubestellar/console/pkg/api/handlers" + + "github.com/kubestellar/console/pkg/k8s" +) + +func (h *MCPHandlers) GetConfigMaps(c *fiber.Ctx) error { + cluster := c.Query("cluster") + namespace := c.Query("namespace") + + if err := mcpValidateClusterAndNamespace(cluster, namespace); err != nil { + return err + } + + return h.withDemoFallback(c, "configmaps", handlers.GetDemoConfigMaps(), func(client *k8s.MultiClusterClient) error { + items, errTracker, err := listClusterResources(c.Context(), client, cluster, func(ctx context.Context, clusterName string) ([]k8s.ConfigMap, error) { + return client.GetConfigMaps(ctx, clusterName, namespace) + }) + if err != nil { + return HandleK8sError(c, err) + } + return respondClusterResources(c, "configmaps", items, errTracker) + }) +} + +// GetSecrets returns Secrets from clusters. +// Requires editor or admin role — Secrets contain sensitive data (CWE-862, #16731). +func (h *MCPHandlers) GetSecrets(c *fiber.Ctx) error { + if err := handlers.RequireEditorOrAdmin(c, h.store); err != nil { + return err + } + + cluster := c.Query("cluster") + namespace := c.Query("namespace") + + if err := mcpValidateClusterAndNamespace(cluster, namespace); err != nil { + return err + } + + return h.withDemoFallback(c, "secrets", handlers.GetDemoSecrets(), func(client *k8s.MultiClusterClient) error { + items, errTracker, err := listClusterResources(c.Context(), client, cluster, func(ctx context.Context, clusterName string) ([]k8s.Secret, error) { + return client.GetSecrets(ctx, clusterName, namespace) + }) + if err != nil { + return HandleK8sError(c, err) + } + return respondClusterResources(c, "secrets", items, errTracker) + }) +} + +// GetServiceAccounts returns ServiceAccounts from clusters +func (h *MCPHandlers) GetServiceAccounts(c *fiber.Ctx) error { + cluster := c.Query("cluster") + namespace := c.Query("namespace") + + if err := mcpValidateClusterAndNamespace(cluster, namespace); err != nil { + return err + } + + return h.withDemoFallback(c, "serviceAccounts", handlers.GetDemoServiceAccounts(), func(client *k8s.MultiClusterClient) error { + items, errTracker, err := listClusterResources(c.Context(), client, cluster, func(ctx context.Context, clusterName string) ([]k8s.ServiceAccount, error) { + return client.GetServiceAccounts(ctx, clusterName, namespace) + }) + if err != nil { + return HandleK8sError(c, err) + } + return respondClusterResources(c, "serviceAccounts", items, errTracker) + }) +}