{"record":{"id":"138019513d8ff158","repo":"derailed/k9s","slug":"s-s-is-deprecated","errorCode":null,"errorMessage":"%s[%s] is deprecated","messagePattern":"(.+?)\\[(.+?)\\] is deprecated","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"internal/render/crd.go","lineNumber":116,"sourceCode":"\nfunc (CustomResourceDefinition) diagnose(n string, vv []v1.CustomResourceDefinitionVersion) error {\n\tif len(vv) == 0 {\n\t\treturn fmt.Errorf(\"unable to assert CRD servers versions for %s\", n)\n\t}\n\n\tvar (\n\t\tee     []error\n\t\tserved bool\n\t)\n\tfor _, v := range vv {\n\t\tif v.Served {\n\t\t\tserved = true\n\t\t}\n\t\tif v.Deprecated {\n\t\t\tif v.DeprecationWarning != nil {\n\t\t\t\tee = append(ee, fmt.Errorf(\"%s\", *v.DeprecationWarning))\n\t\t\t} else {\n\t\t\t\tee = append(ee, fmt.Errorf(\"%s[%s] is deprecated\", n, v.Name))\n\t\t\t}\n\t\t}\n\t}\n\tif !served {\n\t\tee = append(ee, fmt.Errorf(\"CRD %s is no longer served by the api server\", n))\n\t}\n\n\tif len(ee) == 0 {\n\t\treturn nil\n\t}\n\terrs := make([]string, 0, len(ee))\n\tfor _, e := range ee {\n\t\terrs = append(errs, e.Error())\n\t}\n\n\treturn errors.New(strings.Join(errs, \" - \"))\n}\n","sourceCodeStart":98,"sourceCodeEnd":134,"githubUrl":"https://github.com/derailed/k9s/blob/2d3ccc6ba2ce98c3781bfc441bb3e884f072774f/internal/render/crd.go#L98-L134","documentation":"CRD diagnose message synthesized when a served version has deprecated: true but no deprecationWarning text was set; k9s builds '<crdName>[<version>] is deprecated' from the object so users still see that the version is on its way out.","triggerScenarios":"Listing CRDs whose versions[].deprecated is true and deprecationWarning is nil — common for CRDs written before deprecationWarning existed or authors who omitted it.","commonSituations":"Older operators flagging deprecation without guidance text; homegrown CRDs copied from templates that set deprecated but no warning.","solutions":["Migrate custom resources off the deprecated version","Set a deprecationWarning in your own CRDs so consumers get actionable text","Remove or un-serve the deprecated version once migration completes"],"exampleFix":"# before\n- name: v1beta1\n  served: true\n  storage: false\n  deprecated: true\n# after: guide users explicitly\n- name: v1beta1\n  served: true\n  storage: false\n  deprecated: true\n  deprecationWarning: \"example.com/v1beta1 is deprecated; use v1\"","handlingStrategy":"fallback","validationCode":"deprecated := slices.ContainsFunc(crd.Spec.Versions, func(v v1.CustomResourceDefinitionVersion) bool {\n\treturn v.Deprecated\n})","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Gate CR manifests on the newest served version in CI","Set deprecationWarning on deprecated versions so tooling shows actionable text","Un-serve old versions once migration completes"],"tags":["crd","deprecation","kubernetes-api"],"backgroundTag":null,"analyzedSha":"2d3ccc6ba2ce98c3781bfc441bb3e884f072774f","analyzedAt":"2026-08-15T16:09:14.432Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}