{"record":{"id":"67b1caeceed638ac","repo":"kubernetes/kops","slug":"error-parsing-version-q-v","errorCode":null,"errorMessage":"error parsing version %q: %v","messagePattern":"error parsing version %q: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/apis/kops/model/kubernetes_version.go","lineNumber":38,"sourceCode":"\t\"fmt\"\n\t\"strings\"\n\n\t\"github.com/blang/semver/v4\"\n\t\"k8s.io/kops/pkg/apis/kops/util\"\n)\n\n// KubernetesVersion is a wrapper over semver functionality,\n// that offers some functionality particularly useful for kubernetes version semantics.\ntype KubernetesVersion struct {\n\tversionString string\n\tversion       semver.Version\n}\n\n// ParseKubernetesVersion parses a Kubernetes version string and returns a KubernetesVersion object.\nfunc ParseKubernetesVersion(versionString string) (*KubernetesVersion, error) {\n\tparsedVersion, err := util.ParseKubernetesVersion(versionString)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"error parsing version %q: %v\", versionString, err)\n\t}\n\n\treturn &KubernetesVersion{versionString: versionString, version: *parsedVersion}, nil\n}\n\n// MustParseKubernetesVersion parses a Kubernetes version string and panics if it fails.\nfunc MustParseKubernetesVersion(versionString string) *KubernetesVersion {\n\tkubernetesVersion, err := ParseKubernetesVersion(versionString)\n\tif err != nil || kubernetesVersion == nil {\n\t\tpanic(err)\n\t}\n\treturn kubernetesVersion\n}\n\nfunc (v KubernetesVersion) String() string {\n\treturn v.versionString\n}\n","sourceCodeStart":20,"sourceCodeEnd":56,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/pkg/apis/kops/model/kubernetes_version.go#L20-L56","documentation":"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.","triggerScenarios":"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.","commonSituations":"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\".","solutions":["Pass a complete semver string including major.minor.patch (e.g. \"1.28.2\"; a leading \"v\" is accepted)","Fix the source of the empty/malformed string (cluster spec, env var, template substitution)","Prefer MustParseKubernetesVersion only for compile-time constants; use ParseKubernetesVersion and check err for user input"],"exampleFix":"// before\nkv, err := ParseKubernetesVersion(cfg.KubernetesVersion) // cfg.KubernetesVersion == \"latest\"\n// after\nversion := cfg.KubernetesVersion\nif version == \"\" || version == \"latest\" || version == \"stable\" {\n    version = \"1.28.2\"\n}\nkv, err := ParseKubernetesVersion(version)\nif err != nil {\n    return fmt.Errorf(\"invalid kubernetesVersion %q: %w\", cfg.KubernetesVersion, err)\n}","handlingStrategy":"try-catch","validationCode":"var kubernetesVersionRe = regexp.MustCompile(`^v?\\d+\\.\\d+\\.\\d+([-+][0-9A-Za-z.-]+)?$`)\nfunc isValidKubernetesVersion(s string) bool { return kubernetesVersionRe.MatchString(s) }","typeGuard":null,"tryCatchPattern":"kv, err := ParseKubernetesVersion(versionString)\nif err != nil {\n    return nil, fmt.Errorf(\"invalid kubernetes version %q: %w\", versionString, err)\n}","preventionTips":["Validate user-supplied versions with a semver regex before parsing","Reject aliases like latest/stable early in config loading","Use MustParseKubernetesVersion only for hardcoded constants"],"tags":["kops","version-parsing","kubernetes-version","semver"],"backgroundTag":"invalid-kubernetes-version","analyzedSha":"4c8573c808a73d578c5eadc86d410646ea0b0d73","analyzedAt":"2026-09-05T04:13:19.212Z","contentChangedAt":"2026-09-05T04:13:19.212Z","schemaVersion":2},"datasetVersion":"2026-09-12T12:17:11.808Z"}