{"record":{"id":"fed2e092050d677f","repo":"kubernetes/kops","slug":"error-parsing-path-for-etcd-manifest-s-v","errorCode":null,"errorMessage":"error parsing path for etcd manifest %s: %v","messagePattern":"error parsing path for etcd manifest (.+?): (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"nodeup/pkg/model/manifests.go","lineNumber":45,"sourceCode":")\n\n// ManifestsBuilder copies manifests from the store (e.g. etcdmanager)\ntype ManifestsBuilder struct {\n\t*NodeupModelContext\n}\n\nvar _ fi.NodeupModelBuilder = &ManifestsBuilder{}\n\n// Build creates tasks for copying the manifests\nfunc (b *ManifestsBuilder) Build(c *fi.NodeupModelBuilderContext) error {\n\tctx := c.Context()\n\n\t// Write etcd manifests (currently etcd <=> master)\n\tif b.IsMaster {\n\t\tfor _, manifest := range b.NodeupConfig.EtcdManifests {\n\t\t\tp, err := vfs.Context.BuildVfsPath(manifest)\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Errorf(\"error parsing path for etcd manifest %s: %v\", manifest, err)\n\t\t\t}\n\t\t\tdata, err := p.ReadFile(ctx)\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Errorf(\"error reading etcd manifest %s: %v\", manifest, err)\n\t\t\t}\n\n\t\t\tname := p.Base()\n\t\t\tname = strings.TrimSuffix(name, filepath.Ext(name))\n\n\t\t\tkey := \"etcd-\" + name\n\n\t\t\tmanifestPath := \"/etc/kubernetes/manifests/\" + key + \".manifest\"\n\n\t\t\tc.AddTask(&nodetasks.File{\n\t\t\t\tContents: fi.NewBytesResource(data),\n\t\t\t\tMode:     s(\"0440\"),\n\t\t\t\tPath:     manifestPath,\n\t\t\t\tType:     nodetasks.FileType_File,","sourceCodeStart":27,"sourceCodeEnd":63,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/nodeup/pkg/model/manifests.go#L27-L63","documentation":"manifests.go's Build writes etcd manifests on masters; each entry in NodeupConfig.EtcdManifests is turned into a VFS path via vfs.Context.BuildVfsPath. If the manifest string is not a valid VFS path/URL, the error is wrapped with the manifest name. This is a configuration/URL parsing problem, not a network read problem.","triggerScenarios":"An entry in EtcdManifests uses an unsupported or malformed scheme (e.g. typo in s3://, unknown scheme, malformed URL) so vfs.Context.BuildVfsPath(manifest) fails during nodeup Build on a master.","commonSituations":"Typos in the etcd manifest URL in the cluster spec; unsupported storage backends; hand-edited kops cluster config or nodeup config with a bad manifest path.","solutions":["Correct the EtcdManifests URL in the cluster/nodeup config (valid schemes: s3://, gs://, file://, etc.)","Run kops update/replace so nodeup receives a regenerated NodeupConfig with valid manifest paths","Test the exact URL with the same VFS scheme kops supports; check for stray characters/spaces","Verify the kops version supports the manifest's storage scheme"],"exampleFix":"// before\netcdManifests:\n- s3:/my-bucket/etcd.yaml   # malformed: single slash\n// after\netcdManifests:\n- s3://my-bucket/etcd.yaml","handlingStrategy":"validation","validationCode":"func validVfsPath(u string) error {\n    parsed, err := url.Parse(u)\n    if err != nil {\n        return err\n    }\n    switch parsed.Scheme {\n    case \"s3\", \"gs\", \"file\", \"memfs\", \"\":\n        return nil\n    default:\n        return fmt.Errorf(\"unsupported VFS scheme %q in %q\", parsed.Scheme, u)\n    }\n}\n// run over every EtcdManifests entry before kops update cluster --yes","typeGuard":null,"tryCatchPattern":"p, err := vfs.Context.BuildVfsPath(manifest)\nif err != nil {\n    klog.Errorf(\"etcd manifest path %q invalid: %v\", manifest, err)\n    return fmt.Errorf(\"error parsing path for etcd manifest %s: %v\", manifest, err)\n}","preventionTips":["Never hand-edit manifest URLs; let kops generate NodeupConfig","Lint cluster specs for common URL typos (s3:/ vs s3://)","Pin kops versions and confirm the storage scheme is supported"],"tags":["nodeup","etcd","vfs","manifest","config"],"backgroundTag":"invalid-vfs-path","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"}