kubernetes/kops · error

error parsing version %q: %w

Error message

error parsing version %q: %w

What it means

ParseVersion parses a package/app version string with strict semver.Parse and wraps any failure with the input string quoted. It is stricter than ParseKubernetesVersion (no tolerant mode, no URL fallback), so values like '1.23' (missing patch) fail. Called by GetPackageVersion when resolving nodeup package versions.

Source

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

	}

	// 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 {
		return nil, fmt.Errorf("error parsing version %q: %w", s, err)
	}
	return &Version{v: v}, nil
}

// String returns a string representation of the object
func (v *Version) String() string {
	return v.v.String()
}

// IsInRange checks if we are in the provided semver range
func (v *Version) IsInRange(semverRange semver.Range) bool {
	return semverRange(v.v)
}

View on GitHub (pinned to 4c8573c808)

Solutions

  1. Provide a complete three-part semver string (e.g. 1.23.0 instead of 1.23)
  2. Trim whitespace/newlines from the version string before parsing
  3. If the version may be abbreviated, append '.0' to fill the patch segment first
  4. Use semver.ParseTolerant-equivalent preprocessing or kops' tolerant parsers when available

Example fix

// before
v, err := ParseVersion("1.23")
// after
v, err := ParseVersion("1.23.0")
Defensive patterns

Strategy: validation

Validate before calling

if !strings.Contains(version, ".") || len(strings.Split(version, ".")) < 3 {
    version += ".0" // normalize '1.23' -> '1.23.0'
}
if _, err := semver.Parse(version); err != nil {
    return fmt.Errorf("not strict semver: %q", version)
}

Type guard

func isStrictSemver(s string) bool {
    _, err := semver.Parse(strings.TrimSpace(s))
    return err == nil
}

Try / catch

v, err := util.ParseVersion(raw)
if err != nil {
    if strings.Contains(err.Error(), "error parsing version") {
        return fmt.Errorf("package version %q must be full MAJOR.MINOR.PATCH", raw)
    }
    return err
}

Prevention

When it happens

Trigger: Calling ParseVersion or GetPackageVersion with a string that is not a full MAJOR.MINOR.PATCH semver, e.g. '1.23', 'v1.23.0-beta+x' with invalid prerelease/build syntax, or an empty string.

Common situations: Asset/package configuration using abbreviated versions ('1.23'); version read from a file or env var containing whitespace or a newline; pre-release/build metadata strings that violate strict semver grammar.

Related errors


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