kubernetes/kops · error

Error parsing version %s: %v

Error message

Error parsing version %s: %v

What it means

The deprecated IsKubernetesGTE(version, k8sVersion) helper panics when the version string argument fails ParseKubernetesVersion. Like its successor KubernetesVersion.IsGTE, the library treats an invalid version argument as an unrecoverable programming error. The function is deprecated precisely because this panic-based contract is unsafe.

Source

Thrown at pkg/apis/kops/util/versions.go:53

			if err != nil {
				return nil, fmt.Errorf("failed to parse kubernetes version (%s): %w", version, err)
			}
			sv = semver.Version{Major: 1, Minor: uint64(minor)}
		} else {
			klog.Errorf("unable to parse Kubernetes version %q", version)
			return nil, fmt.Errorf("unable to parse kubernetes version %q", version)
		}
		klog.V(1).Infof("Kubernetes version %q string matched to %v", version, sv)
	}

	return &sv, nil
}

// Deprecated: prefer using KubernetesVersion.IsGTE()
func IsKubernetesGTE(version string, k8sVersion semver.Version) bool {
	parsedVersion, err := ParseKubernetesVersion(version)
	if err != nil {
		panic(fmt.Sprintf("Error parsing version %s: %v", version, err))
	}

	// Ignore Pre & Build fields
	k8sVersion.Pre = nil
	k8sVersion.Build = nil

	return k8sVersion.GTE(*parsedVersion)
}

// Version is our helper type for semver versions.
type Version struct {
	v semver.Version
}

// ParseVersion parses the semver version string into a Version.
func ParseVersion(s string) (*Version, error) {
	v, err := semver.Parse(s)
	if err != nil {

View on GitHub (pinned to 4c8573c808)

Solutions

  1. Stop using the deprecated IsKubernetesGTE; switch to a KubernetesVersion built via util.ParseKubernetesVersion so parse errors are returned, not panicked.
  2. Fix the version literal to full semver with all three components (e.g. "1.21.0").
  3. Pre-validate with ParseKubernetesVersion and handle err before calling.
  4. Replace panic-prone comparisons in validation code with explicit error returns.

Example fix

// before
if kops.IsKubernetesGTE("1.24", ver) { ... } // panics on bad input
// after
parsed, err := util.ParseKubernetesVersion("1.24.0")
if err != nil { return err }
_ = parsed
// or: kv.IsGTE("1.24.0") on a parsed KubernetesVersion
Defensive patterns

Strategy: validation

Validate before calling

if _, err := kops.ParseKubernetesVersion(version); err != nil {
    return fmt.Errorf("invalid version %q: %w", version, err)
}
// safe to call IsKubernetesGTE(version, k8sVersion) now

Try / catch

// Go panics: guard with recover when touching deprecated APIs
func safeGTE(version string, v semver.Version) (ok bool) {
    defer func() {
        if r := recover(); r != nil {
            ok = false
        }
    }()
    return kops.IsKubernetesGTE(version, v)
}

Prevention

When it happens

Trigger: Calling IsKubernetesGTE with a malformed string such as "1.21" (no patch), "", "latest", or any non-semver text; the same string is used by tests Test_IsKubernetesGTE* and by validateKubernetesVersion paths.

Common situations: Legacy code still calling the deprecated function after upgrading kOps, version strings read from cluster config or user input, hardcoded constants with missing patch components.

Related errors


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