{"record":{"id":"13b241fb033de14a","repo":"kubernetes/kops","slug":"error-listing-namespaces-v","errorCode":null,"errorMessage":"error listing namespaces: %v","messagePattern":"error listing namespaces: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"channels/pkg/cmd/apply_channel.go","lineNumber":316,"sourceCode":"\tvar updates []*channels.AddonUpdate\n\tvar needUpdates []*channels.Addon\n\tfor _, addon := range menu.Addons {\n\t\tupdate, err := addon.GetRequiredUpdates(ctx, k8sClient, cmClient, channelVersions[addon.GetNamespace()+\":\"+addon.Name])\n\t\tif err != nil {\n\t\t\treturn nil, nil, fmt.Errorf(\"error checking for required update: %v\", err)\n\t\t}\n\t\tif update != nil {\n\t\t\tupdates = append(updates, update)\n\t\t\tneedUpdates = append(needUpdates, addon)\n\t\t}\n\t}\n\treturn updates, needUpdates, nil\n}\n\nfunc getChannelVersions(ctx context.Context, k8sClient kubernetes.Interface) (map[string]*channels.ChannelVersion, error) {\n\tnamespaces, err := k8sClient.CoreV1().Namespaces().List(ctx, metav1.ListOptions{})\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"error listing namespaces: %v\", err)\n\t}\n\n\tchannelVersions := make(map[string]*channels.ChannelVersion)\n\tfor i := range namespaces.Items {\n\t\tns := &namespaces.Items[i]\n\t\taddons := channels.FindChannelVersions(ns)\n\t\tfor name, version := range addons {\n\t\t\tchannelVersions[ns.Name+\":\"+name] = version\n\t\t}\n\t}\n\treturn channelVersions, nil\n}\n\nfunc buildMenu(vfsContext *vfs.VFSContext, kubernetesVersion semver.Version, channelLocation string) (*channels.AddonMenu, error) {\n\tmenu := channels.NewAddonMenu()\n\n\tlocation, err := url.Parse(channelLocation)\n\tif err != nil {","sourceCodeStart":298,"sourceCodeEnd":334,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/channels/pkg/cmd/apply_channel.go#L298-L334","documentation":"getChannelVersions lists all namespaces to collect installed channel versions. If the List call fails, 'error listing namespaces: %v' is returned (%v, not wrapped) and the apply aborts. This is a cluster API access failure.","triggerScenarios":"CoreV1().Namespaces().List errors during applyMenu or tests: unreachable API server, bad/absent kubeconfig, expired tokens, RBAC denial on namespaces.","commonSituations":"Running off-cluster without `kops export kubecfg`, VPN down, expired cloud IAM session, hardened clusters restricting namespace enumeration.","solutions":["Verify with `kubectl get namespaces` and fix kubeconfig/credentials","Grant cluster-scoped list permission on namespaces via RBAC","Restore network connectivity/VPN to the API server","Re-run the apply after access is fixed"],"exampleFix":"// before\nkops apply channel ...  # error listing namespaces\n// after\nkops export kubecfg --name mycluster\nkubectl auth can-i list namespaces  # expect yes\nkops apply channel ...","handlingStrategy":"validation","validationCode":"_, err := k8sClient.CoreV1().Namespaces().List(ctx, metav1.ListOptions{Limit: 1})\nif err != nil {\n\treturn fmt.Errorf(\"namespace list preflight failed, fix kubeconfig/RBAC: %w\", err)\n}","typeGuard":null,"tryCatchPattern":"namespaces, err := k8sClient.CoreV1().Namespaces().List(ctx, metav1.ListOptions{})\nif err != nil {\n\tif apierrors.IsForbidden(err) {\n\t\treturn fmt.Errorf(\"RBAC denied listing namespaces; grant cluster-scoped list permission\")\n\t}\n\treturn fmt.Errorf(\"transient API failure: %w\", err)\n}","preventionTips":["Run `kubectl auth can-i list namespaces` as a preflight check","Export the correct kubeconfig for the target cluster","Keep cloud auth tokens refreshed for long sessions"],"tags":["kubernetes-api","rbac","namespaces","connectivity"],"backgroundTag":"kubernetes-api-request-failed","analyzedSha":"4c8573c808a73d578c5eadc86d410646ea0b0d73","analyzedAt":"2026-09-05T04:13:19.212Z","contentChangedAt":"2026-09-05T04:13:19.212Z","schemaVersion":2},"datasetVersion":"2026-09-12T07:17:12.445Z"}