{"record":{"id":"a5cc12e1f20b0568","repo":"kubernetes/kops","slug":"unable-to-parse-kubernetes-version-q","errorCode":null,"errorMessage":"unable to parse kubernetes version %q","messagePattern":"unable to parse kubernetes version %q","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/apis/kops/util/versions.go","lineNumber":41,"sourceCode":"\n\t\"github.com/blang/semver/v4\"\n\t\"k8s.io/klog/v2\"\n)\n\nvar versionURLPattern = regexp.MustCompile(`/v1\\.([\\d]+)\\.`)\n\nfunc ParseKubernetesVersion(version string) (*semver.Version, error) {\n\tsv, err := semver.ParseTolerant(version)\n\tif err != nil {\n\t\tif submatch := versionURLPattern.FindStringSubmatch(version); len(submatch) >= 2 {\n\t\t\tminor, err := strconv.Atoi(submatch[1])\n\t\t\tif err != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"failed to parse kubernetes version (%s): %w\", version, err)\n\t\t\t}\n\t\t\tsv = semver.Version{Major: 1, Minor: uint64(minor)}\n\t\t} else {\n\t\t\tklog.Errorf(\"unable to parse Kubernetes version %q\", version)\n\t\t\treturn nil, fmt.Errorf(\"unable to parse kubernetes version %q\", version)\n\t\t}\n\t\tklog.V(1).Infof(\"Kubernetes version %q string matched to %v\", version, sv)\n\t}\n\n\treturn &sv, nil\n}\n\n// Deprecated: prefer using KubernetesVersion.IsGTE()\nfunc IsKubernetesGTE(version string, k8sVersion semver.Version) bool {\n\tparsedVersion, err := ParseKubernetesVersion(version)\n\tif err != nil {\n\t\tpanic(fmt.Sprintf(\"Error parsing version %s: %v\", version, err))\n\t}\n\n\t// Ignore Pre & Build fields\n\tk8sVersion.Pre = nil\n\tk8sVersion.Build = nil\n","sourceCodeStart":23,"sourceCodeEnd":59,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/pkg/apis/kops/util/versions.go#L23-L59","documentation":"ParseKubernetesVersion returns this when the input is neither a valid (tolerant) semver string nor a version-URL-like string. It logs the unparseable value and returns a descriptive error quoting the original input. This is the terminal fallback for any unrecognized Kubernetes version format.","triggerScenarios":"Passing any string to ParseKubernetesVersion (or callers IsKubernetesGTE, IsGTE, RecommendedKubernetesVersion, FindRecommendedUpgrade, IsUpgradeRequired) that does not parse as semver and does not match versionURLPattern — e.g. empty string, 'latest', '1.2x', or a URL without a minor digit.","commonSituations":"Empty or unset kubernetesVersion field; typos like '1..28'; using channel labels ('stable', 'latest') instead of versions; copying image repository names into the version field; upstream change to kops version-channel data.","solutions":["Correct the kubernetesVersion value to a valid semver string (e.g. 1.28.4 or 1.28)","Check for empty/missing configuration values feeding the version field","If using a URL form, ensure it matches the kops version URL pattern with a numeric minor","Run kops get cluster --name X -o yaml to inspect the stored kubernetesVersion and fix it via kops replace"],"exampleFix":"// before\nKubernetesVersion: \"latest\"\n// after\nKubernetesVersion: \"1.28.4\"","handlingStrategy":"validation","validationCode":"if strings.TrimSpace(v) == \"\" {\n    return errors.New(\"kubernetesVersion is empty\")\n}\nif _, err := semver.ParseTolerant(v); err != nil {\n    return fmt.Errorf(\"kubernetesVersion %q is not a valid version\", v)\n}","typeGuard":"func isWellFormedVersion(v string) bool {\n    _, err := semver.ParseTolerant(strings.TrimSpace(v))\n    return err == nil\n}","tryCatchPattern":"_, err := util.ParseKubernetesVersion(v)\nif err != nil {\n    if strings.Contains(err.Error(), \"unable to parse\") {\n        return fmt.Errorf(\"fix kubernetesVersion %q: must look like 1.28.4\", v)\n    }\n    return err\n}","preventionTips":["Never leave kubernetesVersion empty or set it to channel labels like 'latest'","Regex-check inputs (e.g. ^[0-9]+\\.[0-9]+(\\.[0-9]+)?([+|-].+)?$) before kops calls","Trim and sanitize values sourced from env vars or files","Pin versions against kops' supported-version list before applying"],"tags":["kubernetes","version-parsing","semver","kops"],"backgroundTag":"version-string-parse-failed","analyzedSha":"4c8573c808a73d578c5eadc86d410646ea0b0d73","analyzedAt":"2026-09-05T04:13:19.212Z","contentChangedAt":"2026-09-05T04:13:19.212Z","schemaVersion":2},"datasetVersion":"2026-09-12T07:17:12.445Z"}