{"record":{"id":"1992fdd2232a12f0","repo":"kubernetes/kops","slug":"error-parsing-configstore-base-q-v-1992fd","errorCode":null,"errorMessage":"error parsing configStore.base %q: %v","messagePattern":"error parsing configStore\\.base %q: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/nodemodel/nodeupconfigbuilder.go","lineNumber":55,"sourceCode":"\t\"k8s.io/kops/upup/pkg/fi\"\n\t\"k8s.io/kops/util/pkg/architectures\"\n\t\"k8s.io/kops/util/pkg/vfs\"\n)\n\ntype nodeUpConfigBuilder struct {\n\tassetBuilder               *assets.AssetBuilder\n\tchannelsManifest           string\n\tconfigBase                 vfs.Path\n\tcluster                    *kops.Cluster\n\tetcdManifests              map[string][]string\n\timages                     map[kops.InstanceGroupRole]map[architectures.Architecture][]*nodeup.Image\n\tencryptionConfigSecretHash string\n}\n\nfunc NewNodeUpConfigBuilder(cluster *kops.Cluster, assetBuilder *assets.AssetBuilder, encryptionConfigSecretHash string) (model.NodeUpConfigBuilder, error) {\n\tconfigBase, err := vfs.Context.BuildVfsPath(cluster.Spec.ConfigStore.Base)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"error parsing configStore.base %q: %v\", cluster.Spec.ConfigStore.Base, err)\n\t}\n\n\t// Must match channelsManifestPath in pkg/model/components/channels/model.go.\n\tchannelsManifest := configBase.Join(\"manifests/channels/kops-channels.yaml\").Path()\n\n\tetcdManifests := map[string][]string{}\n\timages := map[kops.InstanceGroupRole]map[architectures.Architecture][]*nodeup.Image{}\n\n\tfor _, role := range kops.AllInstanceGroupRoles {\n\t\tisMaster := role.HasControlPlane()\n\t\tisAPIServer := role.HasAPIServer()\n\n\t\timages[role] = make(map[architectures.Architecture][]*nodeup.Image)\n\t\tif kopsmodel.IsBaseURL(cluster.Spec.KubernetesVersion) {\n\t\t\t// When using a custom version, we want to preload the images over http\n\t\t\tcomponents := []string{\"kube-proxy\"}\n\t\t\tif isMaster {\n\t\t\t\tcomponents = append(components, \"kube-apiserver\", \"kube-controller-manager\", \"kube-scheduler\")","sourceCodeStart":37,"sourceCodeEnd":73,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/pkg/nodemodel/nodeupconfigbuilder.go#L37-L73","documentation":"NewNodeUpConfigBuilder resolves cluster.Spec.ConfigStore.Base into a VFS path. If the base URI cannot be parsed into a valid vfs location (bad scheme, malformed path), this error is returned. NodeUp config generation cannot proceed without a valid config store.","triggerScenarios":"Cluster spec has a configStore.base that vfs.Context.BuildVfsPath cannot parse (e.g. missing scheme, unknown scheme, invalid S3/GS/OSS URI).","commonSituations":"Typo in the state store URI (s3:// misspelled, empty string); migrating clusters between state stores; hand-edited cluster spec; environment where the object-store scheme is unavailable.","solutions":["Fix cluster.Spec.ConfigStore.Base to a valid URI like 's3://<bucket>/prefix' matching --state on other kOps commands","Check for typos/empty values in the state store configuration (KOPS_STATE_STORE)","Run 'kops get clusters' with the same state store to verify the URI works before creating nodeup config"],"exampleFix":"// before\nspec:\n  configStore:\n    base: \"my-bucket/cluster\" // missing scheme\n// after\nspec:\n  configStore:\n    base: \"s3://my-bucket/cluster\"","handlingStrategy":"validation","validationCode":"base := cluster.Spec.ConfigStore.Base\nif base == \"\" {\n    return fmt.Errorf(\"configStore.base is empty\")\n}\nif !strings.Contains(base, \"://\") {\n    return fmt.Errorf(\"configStore.base %q missing scheme (e.g. s3://)\", base)\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Set KOPS_STATE_STORE consistently and derive configStore.base from it","Include a URI scheme in every state store value","Smoke-test the URI with 'kops get clusters' before nodeup runs"],"tags":["vfs","configstore","configuration"],"backgroundTag":"invalid-state-store-uri","analyzedSha":"4c8573c808a73d578c5eadc86d410646ea0b0d73","analyzedAt":"2026-09-05T04:13:19.212Z","contentChangedAt":"2026-09-05T04:13:19.212Z","schemaVersion":2},"datasetVersion":"2026-09-12T12:17:11.808Z"}