{"record":{"id":"32219c94273dc5d7","repo":"kubernetes/kops","slug":"error-reading-manifest-w","errorCode":null,"errorMessage":"error reading manifest: %w","messagePattern":"error reading manifest: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"channels/pkg/channels/addon.go","lineNumber":197,"sourceCode":"\t\tif err != nil {\n\t\t\tmerr = multierr.Append(merr, err)\n\t\t}\n\t}\n\treturn required, merr\n}\n\nfunc (a *Addon) updateAddon(ctx context.Context, k8sClient kubernetes.Interface, vfsContext *vfs.VFSContext, pruner *Pruner, applier Applier, required *AddonUpdate) error {\n\tmanifestURL, err := a.GetManifestFullUrl()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tklog.Infof(\"Applying update from %q\", manifestURL)\n\n\t// We copy the manifest to a temp file because it is likely e.g. an s3 URL, which kubectl can't read\n\tdata, err := vfsContext.ReadFile(manifestURL.String())\n\tif err != nil {\n\t\treturn fmt.Errorf(\"error reading manifest: %w\", err)\n\t}\n\n\tvar merr error\n\tvar applyError, pruneError error\n\n\tif applyError = applier.Apply(ctx, data); applyError != nil {\n\t\tmerr = multierr.Append(merr, fmt.Errorf(\"error applying update: %w\", applyError))\n\t}\n\n\tif pruneError = pruner.Prune(ctx, data, a.Spec.Prune); pruneError != nil {\n\t\tmerr = multierr.Append(merr, fmt.Errorf(\"error pruning manifest: %w\", pruneError))\n\t}\n\n\tif applyError != nil && pruneError == nil {\n\t\t// If we failed to apply, but not prune, we should try to apply again\n\t\tif err := applier.Apply(ctx, data); err != nil {\n\t\t\tmerr = multierr.Append(merr, fmt.Errorf(\"error applying update after prune: %w\", err))\n\t\t} else {","sourceCodeStart":179,"sourceCodeEnd":215,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/channels/pkg/channels/addon.go#L179-L215","documentation":"While updating an addon, updateAddon copies the manifest from its (often remote, e.g. s3://) URL via the VFS context; this error wraps a failure reading that manifest file. The manifest URL itself was resolved, but fetching its bytes failed (missing object, auth, or network).","triggerScenarios":"Thrown at channels/pkg/channels/addon.go:197 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Check that the manifest URL logged just above ('Applying update from %q') exists and is readable","Verify credentials/permissions for the VFS backend (e.g. S3 or GCS access)","Retry if the failure was transient network/storage unavailability"],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"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"}