{"record":{"id":"8afd79c3e6bf97a3","repo":"kubernetes/kops","slug":"error-parsing-configstore-base-q-v-8afd79","errorCode":null,"errorMessage":"error parsing ConfigStore.Base %q: %v","messagePattern":"error parsing ConfigStore\\.Base %q: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"upup/pkg/fi/cloudup/populate_cluster_spec.go","lineNumber":166,"sourceCode":"\n\t\t\t\t\t//if clusterSubnets[zone] == nil {\n\t\t\t\t\t//\treturn fmt.Errorf(\"EtcdMembers for %q is configured in zone %q, but that is not configured at the k8s-cluster level\", etcd.Name, m.Zone)\n\t\t\t\t\t//}\n\t\t\t\t\tetcdNames[m.Name] = m\n\t\t\t\t\tetcdInstanceGroups[instanceGroupName] = m\n\t\t\t\t}\n\n\t\t\t\tif (len(etcdNames) % 2) == 0 {\n\t\t\t\t\t// Not technically a requirement, but doesn't really make sense to allow\n\t\t\t\t\treturn fmt.Errorf(\"there should be an odd number of control-plane-zones, for etcd's quorum.  Hint: Use --zones and --control-plane-zones to declare worker and control plane node zones separately\")\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tconfigBase, err := clientset.VFSContext().BuildVfsPath(cluster.Spec.ConfigStore.Base)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"error parsing ConfigStore.Base %q: %v\", cluster.Spec.ConfigStore.Base, err)\n\t}\n\tif !vfs.IsClusterReadable(configBase) {\n\t\t// We could implement this approach, but it seems better to get all clouds using cluster-readable storage\n\t\treturn fmt.Errorf(\"ConfigStore.Base path is not cluster readable: %v\", cluster.Spec.ConfigStore.Base)\n\t}\n\n\tkeyStore, err := clientset.KeyStore(cluster)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif cluster.Spec.ConfigStore.Keypairs == \"\" {\n\t\thasVFSPath, ok := keyStore.(fi.HasVFSPath)\n\t\tif !ok {\n\t\t\t// We will mirror to ConfigBase\n\t\t\tbasedir := configBase.Join(\"pki\")\n\t\t\tcluster.Spec.ConfigStore.Keypairs = basedir.Path()\n\t\t} else if vfs.IsClusterReadable(hasVFSPath.VFSPath()) {","sourceCodeStart":148,"sourceCodeEnd":184,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/upup/pkg/fi/cloudup/populate_cluster_spec.go#L148-L184","documentation":"The ConfigStore.Base is the VFS path where cluster configuration is stored (e.g. s3://bucket/prefix). run() calls VFSContext().BuildVfsPath to parse it, and wraps any parse failure in this error. The path scheme is either unsupported or malformed.","triggerScenarios":"cluster.spec.configStore.base (formerly cluster.spec.configBase) is set to a string that BuildVfsPath cannot resolve — unknown scheme (e.g. typo'd \"s4://bucket\" or \"file:/missing-slash\"), or a relative path with no scheme in a context where none can be resolved.","commonSituations":"Typo in the S3/GCS/DO-spaces bucket URL scheme; copying a path between environments (memfs:// paths used outside tests); kops state store env var KOPS_STATE_STORE pointing at an invalid URI; older configs migrated to the configStore.base field with a stale value.","solutions":["Fix cluster.spec.configStore.base to a valid VFS path with a supported scheme, e.g. s3://<bucket>/<prefix> or gs://<bucket>/<prefix>.","Check KOPS_STATE_STORE is a correct, fully qualified URL (include bucket, correct scheme).","Run with --v=2 to see the underlying BuildVfsPath error in the %v suffix for the exact parse problem."],"exampleFix":"# before\nconfigStore:\n  base: s3:/my-bucket/cluster.example.com\n# after\nconfigStore:\n  base: s3://my-bucket/cluster.example.com","handlingStrategy":"validation","validationCode":"u, err := url.Parse(cluster.Spec.ConfigStore.Base)\nif err != nil || u.Scheme == \"\" {\n\treturn fmt.Errorf(\"configStore.base must be a fully qualified VFS path like s3://bucket/prefix\")\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always set KOPS_STATE_STORE to a full URL including scheme and bucket","Test the state store path with `kops get clusters` before creating a cluster","Avoid hand-editing configStore.base; let kops CLI manage it"],"tags":["vfs","configuration","state-store"],"backgroundTag":"invalid-storage-path","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"}