{"record":{"id":"9c7e9860fd944762","repo":"kubernetes/kops","slug":"error-reading-addon-q-manifest-v","errorCode":null,"errorMessage":"error reading addon %q manifest: %v","messagePattern":"error reading addon %q manifest: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"upup/pkg/fi/cloudup/bootstrapchannelbuilder/addonmanifest.go","lineNumber":86,"sourceCode":"\t\tif isAddonTask(task) {\n\t\t\tcontinue\n\t\t}\n\t\tdependencies = append(dependencies, task)\n\t}\n\treturn dependencies\n}\n\nfunc (a *AddonManifest) Normalize(c *fi.CloudupContext) error {\n\tif a.addonSpec == nil {\n\t\treturn fmt.Errorf(\"addon spec is not configured for %q\", fi.ValueOf(a.Name))\n\t}\n\tif a.source == nil {\n\t\treturn fmt.Errorf(\"addon source is not configured for %q\", fi.ValueOf(a.Name))\n\t}\n\n\tmanifestBytes, err := fi.ResourceAsBytes(a.source)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"error reading addon %q manifest: %v\", fi.ValueOf(a.Name), err)\n\t}\n\n\tif !a.skipRender && a.addonRenderer != nil {\n\t\tmanifestBytes, err = a.addonRenderer.RenderTemplate(fi.ValueOf(a.Location), manifestBytes, tasksVisibleToAddons(c.AllTasks()))\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"error rendering addon %q template: %w\", fi.ValueOf(a.Name), err)\n\t\t}\n\t}\n\n\tif !a.skipRemap {\n\t\tmanifestBytes, err = addonmanifests.RemapAddonManifest(a.addonSpec, a.modelContext, a.assetBuilder, manifestBytes, a.serviceAccounts)\n\t\tif err != nil {\n\t\t\tklog.Infof(\"invalid manifest: %s\", string(manifestBytes))\n\t\t\treturn fmt.Errorf(\"error remapping manifest %s: %v\", fi.ValueOf(a.Location), err)\n\t\t}\n\t}\n\n\tmanifestBytes = []byte(strings.TrimSpace(string(manifestBytes)))","sourceCodeStart":68,"sourceCodeEnd":104,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/upup/pkg/fi/cloudup/bootstrapchannelbuilder/addonmanifest.go#L68-L104","documentation":"AddonManifest.Normalize reads the addon's manifest resource into bytes using fi.ResourceAsBytes; this error wraps any failure from that read. It means kOps could not obtain the manifest content (whether embedded bytes, a file, or a fetched URL) for the named addon and cannot proceed to render/remap/hash it.","triggerScenarios":"Normalize runs with addonSpec and source set, but fi.ResourceAsBytes(a.source) returns an error — e.g. a URL resource that fails to download, a file resource whose path does not exist, or a reader-based resource that errors — and the error is wrapped via fmt.Errorf with the addon name.","commonSituations":"The addon manifest URL in the channel is unreachable (offline build, bad network, deleted upstream release tag); a custom channel points at a typo'd or 404 path; an image-bundle/file path changed after a kOps version bump; the manifest file was moved in the repo.","solutions":["Read the wrapped inner error (%v) in the message to see the underlying cause (404, file not found, connection error)","If the source is a URL, verify it is reachable (curl it) and that the channel addon's manifest/version path is correct","If it is a local file path, confirm the file exists in your kOps checkout / image-bundle and the path matches the repo layout","If offline, pre-populate the manifest in your image bundle or vendor the file before running kOps","Retry after fixing network issues if the cause was transient connectivity"],"exampleFix":"// before (bad channel entry)\nmanifest: https://example.invalid/addons/coredns/v1.2.3.yaml\n// after\nmanifest: https://storage.googleapis.com/kubernetes-addons/manifests/coredns/v1.2.3.yaml","handlingStrategy":"try-catch","validationCode":"if src, ok := a.source.(fi.HasContents); ok {\n    if _, err := src.Contents(); err != nil {\n        return fmt.Errorf(\"addon source unavailable: %w\", err)\n    }\n}","typeGuard":null,"tryCatchPattern":"err := task.Normalize(ctx)\nif err != nil && strings.Contains(err.Error(), \"error reading addon\") {\n    // check network / channel URL, then retry or fix the manifest path\n    log.Printf(\"addon manifest unreadable: %v\", err)\n}","preventionTips":["Verify every channel addon manifest URL is reachable before running kops update (curl --head)","For air-gapped installs, pre-populate image-bundle/vendor paths for all addon manifests","Pin addon versions to tags that exist upstream; avoid moving/latest URLs"],"tags":["addons","bootstrap-channel","io"],"backgroundTag":"manifest-read-failed","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"}