{"record":{"id":"fe47f27c5166c6d3","repo":"kubernetes/kops","slug":"failed-to-annotate-q-w","errorCode":null,"errorMessage":"failed to annotate %q: %w","messagePattern":"failed to annotate %q: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/model/components/addonmanifests/remap.go","lineNumber":56,"sourceCode":"\nfunc RemapAddonManifest(addon *addonsapi.AddonSpec, context *model.KopsModelContext, assetBuilder *assets.AssetBuilder, manifest []byte, serviceAccounts map[types.NamespacedName]iam.Subject) ([]byte, error) {\n\tname := fi.ValueOf(addon.Name)\n\n\t{\n\t\tobjects, err := kubemanifest.LoadObjectsFrom(manifest)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tif name == \"dns-controller.addons.k8s.io\" {\n\t\t\tif err := dnscontroller.Remap(context, addon, objects); err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t}\n\n\t\terr = addLabels(addon, objects)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to annotate %q: %w\", name, err)\n\t\t}\n\n\t\terr = addServiceAccountRole(context, objects, serviceAccounts)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to add service account for %q: %w\", name, err)\n\t\t}\n\n\t\tb, err := objects.ToYAML()\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tmanifest = b\n\t}\n\n\t{\n\t\tremapped, err := assetBuilder.RemapManifest(manifest)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"error remapping manifest %s: %v\", name, err)","sourceCodeStart":38,"sourceCodeEnd":74,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/pkg/model/components/addonmanifests/remap.go#L38-L74","documentation":"RemapAddonManifest wraps any failure from addLabels — which stamps kops ownership labels and verifies the addon's selector labels on every object in the manifest — with this contextual error naming the addon. It is a wrapper: the root cause is one of the addLabels failures (metadata reparse failure, conflicting selector label).","triggerScenarios":"RemapAddonManifest(addon, ...) where addLabels fails on any object: the object's metadata cannot be reparsed into metav1.ObjectMeta, or an addon.Selector key already exists on the object with a different value.","commonSituations":"A custom addon manifest whose objects already carry the addon.kops.k8s.io/name label or a selector label set to a different value; malformed YAML metadata blocks; user-modified channel manifests.","solutions":["Read the wrapped inner error to identify which object/label conflicted","Remove or correct conflicting labels so they match the addon's selector in the Addon spec","Fix malformed metadata in the manifest so it parses as metav1.ObjectMeta","Restore the stock manifest for the addon from the matching kops channel"],"exampleFix":"# before\nmetadata:\n  labels:\n    addon.kops.k8s.io/name: my-custom-dns-controller\n# after (match the addon spec selector)\nmetadata:\n  labels:\n    addon.kops.k8s.io/name: dns-controller.addons.k8s.io","handlingStrategy":"try-catch","validationCode":"// Pre-check selector labels on each object before remapping:\nmeta := &metav1.ObjectMeta{}\nif err := object.Reparse(meta, \"metadata\"); err != nil { return err }\nfor k, v := range addon.Selector {\n    if existing, ok := meta.Labels[k]; ok && existing != v {\n        return fmt.Errorf(\"pre-check: label %q=%q conflicts with selector %q\", k, existing, v)\n    }\n}","typeGuard":null,"tryCatchPattern":"if _, err := RemapAddonManifest(addon, ctx, ab, manifest, sas); err != nil {\n    var wrapped interface{ Unwrap() error }\n    if errors.As(err, &wrapped) { log.Printf(\"root cause for %s: %v\", name, errors.Unwrap(err)) }\n    return fmt.Errorf(\"addon %s: %w\", name, err)\n}","preventionTips":["Keep addon manifests unmodified from the official channel","Ensure selector labels in the Addon spec match labels already present on objects","Validate manifests with kubectl dry-run before feeding to kops"],"tags":["kops","addon","labels","selector","manifest"],"backgroundTag":"label-conflict","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"}