kubernetes/kops · error

error parsing RecommendedVersion %q from channel

Error message

error parsing RecommendedVersion %q from channel

What it means

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.

Source

Thrown at pkg/apis/kops/channel.go:177

	channel := &Channel{}
	err := ParseRawYaml(channelBytes, channel)
	if err != nil {
		return nil, fmt.Errorf("error parsing channel %v", err)
	}

	return channel, nil
}

// FindRecommendedUpgrade returns a string with a new version, if the current version is out of date
func (v *KubernetesVersionSpec) FindRecommendedUpgrade(version semver.Version) (*semver.Version, error) {
	if v.RecommendedVersion == "" {
		klog.V(2).Infof("VersionRecommendationSpec does not specify RecommendedVersion")
		return nil, nil
	}

	recommendedVersion, err := util.ParseKubernetesVersion(v.RecommendedVersion)
	if err != nil {
		return nil, fmt.Errorf("error parsing RecommendedVersion %q from channel", v.RecommendedVersion)
	}
	if recommendedVersion.GT(version) {
		klog.V(2).Infof("RecommendedVersion=%q, Have=%q.  Recommending upgrade", recommendedVersion, version)
		return recommendedVersion, nil
	}
	klog.V(4).Infof("RecommendedVersion=%q, Have=%q.  No upgrade needed.", recommendedVersion, version)
	return nil, nil
}

// FindRecommendedUpgrade returns a string with a new version, if the current version is out of date
func (v *KopsVersionSpec) FindRecommendedUpgrade(version semver.Version) (*semver.Version, error) {
	if v.RecommendedVersion == "" {
		klog.V(2).Infof("VersionRecommendationSpec does not specify RecommendedVersion")
		return nil, nil
	}

	recommendedVersion, err := semver.ParseTolerant(v.RecommendedVersion)
	if err != nil {

View on GitHub (pinned to 4c8573c808)

Solutions

  1. Open the channel file and set recommendedVersion to a bare three-component version like 1.28.3 (no 'v' prefix).
  2. Check how util.ParseKubernetesVersion normalizes input in this kOps version and conform to it.
  3. If you maintain the channel, test parsing with kops update cluster / the channel unit tests before publishing.

Example fix

// before (channel.yaml)
recommendedVersion: v1.28.3+build
// after
recommendedVersion: 1.28.3
Defensive patterns

Strategy: validation

Validate before calling

rv := channel.Spec.KubernetesVersion.RecommendedVersion
if _, err := util.ParseKubernetesVersion(rv); err != nil {
    return fmt.Errorf("channel recommendedVersion %q invalid", rv)
}

Type guard

func isValidKubeVersion(v string) bool { _, err := util.ParseKubernetesVersion(v); return err == nil }

Try / catch

upgrade, err := channel.FindRecommendedUpgrade(version)
if err != nil && strings.Contains(err.Error(), "error parsing RecommendedVersion") {
    // treat as channel authoring bug: skip recommendation, log loudly
    return nil, nil
}

Prevention

When it happens

Trigger: 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.

Common situations: 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.

Related errors


AI-assisted analysis of kubernetes/kops@4c8573c808 (2026-09-05). Data as JSON: /api/errors/9dfcc02329042eb4. Report an issue: GitHub.