{"record":{"id":"9dfcc02329042eb4","repo":"kubernetes/kops","slug":"error-parsing-recommendedversion-q-from-channel","errorCode":null,"errorMessage":"error parsing RecommendedVersion %q from channel","messagePattern":"error parsing RecommendedVersion %q from channel","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/apis/kops/channel.go","lineNumber":177,"sourceCode":"\tchannel := &Channel{}\n\terr := ParseRawYaml(channelBytes, channel)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"error parsing channel %v\", err)\n\t}\n\n\treturn channel, nil\n}\n\n// FindRecommendedUpgrade returns a string with a new version, if the current version is out of date\nfunc (v *KubernetesVersionSpec) FindRecommendedUpgrade(version semver.Version) (*semver.Version, error) {\n\tif v.RecommendedVersion == \"\" {\n\t\tklog.V(2).Infof(\"VersionRecommendationSpec does not specify RecommendedVersion\")\n\t\treturn nil, nil\n\t}\n\n\trecommendedVersion, err := util.ParseKubernetesVersion(v.RecommendedVersion)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"error parsing RecommendedVersion %q from channel\", v.RecommendedVersion)\n\t}\n\tif recommendedVersion.GT(version) {\n\t\tklog.V(2).Infof(\"RecommendedVersion=%q, Have=%q.  Recommending upgrade\", recommendedVersion, version)\n\t\treturn recommendedVersion, nil\n\t}\n\tklog.V(4).Infof(\"RecommendedVersion=%q, Have=%q.  No upgrade needed.\", recommendedVersion, version)\n\treturn nil, nil\n}\n\n// FindRecommendedUpgrade returns a string with a new version, if the current version is out of date\nfunc (v *KopsVersionSpec) FindRecommendedUpgrade(version semver.Version) (*semver.Version, error) {\n\tif v.RecommendedVersion == \"\" {\n\t\tklog.V(2).Infof(\"VersionRecommendationSpec does not specify RecommendedVersion\")\n\t\treturn nil, nil\n\t}\n\n\trecommendedVersion, err := semver.ParseTolerant(v.RecommendedVersion)\n\tif err != nil {","sourceCodeStart":159,"sourceCodeEnd":195,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/pkg/apis/kops/channel.go#L159-L195","documentation":"FindRecommendedUpgrade (util.ParseKubernetesVersion variant) validates the channel's spec.kubernetesVersion.recommendedVersion string. This error means the value in the channel file is not a parseable Kubernetes version per kOps' util.ParseKubernetesVersion, so no recommendation can be computed.","triggerScenarios":"FindRecommendedUpgrade on a channel whose RecommendedVersion fails util.ParseKubernetesVersion — e.g. a value with a leading 'v', a semver build suffix, or a non-numeric component that the strict util parser rejects.","commonSituations":"Custom channel author wrote recommendedVersion: v1.28.3 or 1.28 (two components); an upstream channel typo; channel file edited by a script that mangled the version string.","solutions":["Open the channel file and set recommendedVersion to a bare three-component version like 1.28.3 (no 'v' prefix).","Check how util.ParseKubernetesVersion normalizes input in this kOps version and conform to it.","If you maintain the channel, test parsing with kops update cluster / the channel unit tests before publishing."],"exampleFix":"// before (channel.yaml)\nrecommendedVersion: v1.28.3+build\n// after\nrecommendedVersion: 1.28.3","handlingStrategy":"validation","validationCode":"rv := channel.Spec.KubernetesVersion.RecommendedVersion\nif _, err := util.ParseKubernetesVersion(rv); err != nil {\n    return fmt.Errorf(\"channel recommendedVersion %q invalid\", rv)\n}","typeGuard":"func isValidKubeVersion(v string) bool { _, err := util.ParseKubernetesVersion(v); return err == nil }","tryCatchPattern":"upgrade, err := channel.FindRecommendedUpgrade(version)\nif err != nil && strings.Contains(err.Error(), \"error parsing RecommendedVersion\") {\n    // treat as channel authoring bug: skip recommendation, log loudly\n    return nil, nil\n}","preventionTips":["Write versions as bare three-component strings: 1.28.3","Never prefix with 'v' or add build metadata in channel files","Add a channel self-consistency test that parses every version field"],"tags":["kops","channel","version-parsing"],"backgroundTag":"invalid-version-string","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"}