{"record":{"id":"b9c5104c46bf9737","repo":"kubernetes/kops","slug":"parsing-configstore-base-q-w-b9c510","errorCode":null,"errorMessage":"parsing configStore.base %q: %w","messagePattern":"parsing configStore\\.base %q: %w","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/model/components/etcdmanager/model.go","lineNumber":74,"sourceCode":"// not, since validation already enforces account uniformity.\n//\n// TODO: remove once etcd-manager is bumped to a release whose vendored VFS\n// understands azureblob://<account>/<container>/<key>.\nfunc resolveAzureBackupStore(configStoreBase, backupStore string) (legacyURL string, storageAccount string, err error) {\n\tif !strings.HasPrefix(backupStore, \"azureblob://\") {\n\t\treturn backupStore, \"\", nil\n\t}\n\tbp, err := vfs.Context.BuildVfsPath(backupStore)\n\tif err != nil {\n\t\treturn \"\", \"\", fmt.Errorf(\"parsing etcd backup-store %q: %w\", backupStore, err)\n\t}\n\tbpAzure, ok := bp.(*vfs.AzureBlobPath)\n\tif !ok {\n\t\treturn \"\", \"\", fmt.Errorf(\"expected azureblob:// backup-store, got %q\", backupStore)\n\t}\n\tcsp, err := vfs.Context.BuildVfsPath(configStoreBase)\n\tif err != nil {\n\t\treturn \"\", \"\", fmt.Errorf(\"parsing configStore.base %q: %w\", configStoreBase, err)\n\t}\n\tcsAzure, ok := csp.(*vfs.AzureBlobPath)\n\tif !ok {\n\t\treturn \"\", \"\", fmt.Errorf(\"backup-store %q is azureblob:// but configStore.base %q is not\", backupStore, configStoreBase)\n\t}\n\tlegacy := \"azureblob://\" + bpAzure.Container()\n\tif bpAzure.Key() != \"\" {\n\t\tlegacy += \"/\" + bpAzure.Key()\n\t}\n\treturn legacy, csAzure.Account(), nil\n}\n\n// EtcdManagerBuilder builds the manifest for the etcd-manager\ntype EtcdManagerBuilder struct {\n\t*model.KopsModelContext\n\tLifecycle    fi.Lifecycle\n\tAssetBuilder *assets.AssetBuilder\n}","sourceCodeStart":56,"sourceCodeEnd":92,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/pkg/model/components/etcdmanager/model.go#L56-L92","documentation":"After confirming the backupStore is an azureblob:// path, resolveAzureBackupStore also parses configStore.base (the etcd config store) to read the storage account name. If BuildVfsPath fails on the configStore.base string, the error is wrapped as 'parsing configStore.base'.","triggerScenarios":"Etcd cluster configStore.base on Azure that is malformed or uses a scheme BuildVfsPath cannot parse, while resolving the backup store during buildPod.","commonSituations":"Invalid or hand-edited configStore base URI; scheme not registered in VFS; typo in container/account name.","solutions":["Fix the configStore.base URI to a valid vfs path (e.g. azureblob://account/container)","Check the wrapped inner error to identify the parse failure","Ensure configStore.base and backupStore use consistent, valid Azure blob paths"],"exampleFix":"// before\nconfigStore:\n  base: \"azureblob:/wrong\"\n// after\nconfigStore:\n  base: \"azureblob://myaccount/etcd-events-config\"","handlingStrategy":"validation","validationCode":"if configStoreBase == \"\" || !strings.Contains(configStoreBase, \"://\") {\n    return fmt.Errorf(\"configStore.base must be a valid vfs path, got %q\", configStoreBase)\n}","typeGuard":"null","tryCatchPattern":"legacy, account, err := resolveAzureBackupStore(configStoreBase, backupStore)\nif err != nil {\n    if strings.Contains(err.Error(), \"parsing configStore.base\") {\n        // fix configStore.base URI and retry\n    }\n    return err\n}","preventionTips":["Keep configStore.base and backupStore formats aligned","Validate the full etcd spec with kops before apply","Avoid hand-editing base URIs; regenerate via kops"],"tags":["azure","etcd","vfs","url-parsing"],"backgroundTag":"invalid-url-syntax","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"}