kubernetes/kops · error

error parsing version %q: %v

Error message

error parsing version %q: %v

What it means

ParseKubernetesVersion parses a version string using util.ParseKubernetesVersion and wraps any parse failure with the original input and underlying error. The returned KubernetesVersion object carries both the raw string and the parsed semver for later model decisions.

Source

Thrown at pkg/apis/kops/model/kubernetes_version.go:38

	"fmt"
	"strings"

	"github.com/blang/semver/v4"
	"k8s.io/kops/pkg/apis/kops/util"
)

// KubernetesVersion is a wrapper over semver functionality,
// that offers some functionality particularly useful for kubernetes version semantics.
type KubernetesVersion struct {
	versionString string
	version       semver.Version
}

// ParseKubernetesVersion parses a Kubernetes version string and returns a KubernetesVersion object.
func ParseKubernetesVersion(versionString string) (*KubernetesVersion, error) {
	parsedVersion, err := util.ParseKubernetesVersion(versionString)
	if err != nil {
		return nil, fmt.Errorf("error parsing version %q: %v", versionString, err)
	}

	return &KubernetesVersion{versionString: versionString, version: *parsedVersion}, nil
}

// MustParseKubernetesVersion parses a Kubernetes version string and panics if it fails.
func MustParseKubernetesVersion(versionString string) *KubernetesVersion {
	kubernetesVersion, err := ParseKubernetesVersion(versionString)
	if err != nil || kubernetesVersion == nil {
		panic(err)
	}
	return kubernetesVersion
}

func (v KubernetesVersion) String() string {
	return v.versionString
}

View on GitHub (pinned to 4c8573c808)

Solutions

  1. Pass a complete semver string including major.minor.patch (e.g. "1.28.2"; a leading "v" is accepted)
  2. Fix the source of the empty/malformed string (cluster spec, env var, template substitution)
  3. Prefer MustParseKubernetesVersion only for compile-time constants; use ParseKubernetesVersion and check err for user input

Example fix

// before
kv, err := ParseKubernetesVersion(cfg.KubernetesVersion) // cfg.KubernetesVersion == "latest"
// after
version := cfg.KubernetesVersion
if version == "" || version == "latest" || version == "stable" {
    version = "1.28.2"
}
kv, err := ParseKubernetesVersion(version)
if err != nil {
    return fmt.Errorf("invalid kubernetesVersion %q: %w", cfg.KubernetesVersion, err)
}
Defensive patterns

Strategy: try-catch

Validate before calling

var kubernetesVersionRe = regexp.MustCompile(`^v?\d+\.\d+\.\d+([-+][0-9A-Za-z.-]+)?$`)
func isValidKubernetesVersion(s string) bool { return kubernetesVersionRe.MatchString(s) }

Try / catch

kv, err := ParseKubernetesVersion(versionString)
if err != nil {
    return nil, fmt.Errorf("invalid kubernetes version %q: %w", versionString, err)
}

Prevention

When it happens

Trigger: Calling ParseKubernetesVersion directly, or indirectly via ForceKubernetesVersion / MustParseKubernetesVersion (which panics), with a string the util parser rejects: empty string, "1.28" (missing patch), "latest", or any non-semver text.

Common situations: Cluster kubernetesVersion field left empty or set to an alias like "stable"/"latest"; a truncated version from a script; version typo such as "1.28..0".

Related errors


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