{"record":{"id":"fb3b219ac9a93cc2","repo":"kubernetes/kops","slug":"unable-to-determine-kubernetes-version-from-q-w","errorCode":null,"errorMessage":"unable to determine kubernetes version from %q: %w","messagePattern":"unable to determine kubernetes version from %q: %w","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/model/components/context.go","lineNumber":64,"sourceCode":"\tnodeKubernetesVersion         kopsmodel.KubernetesVersion\n\tcontrolPlaneKubernetesVersion kopsmodel.KubernetesVersion\n}\n\nfunc NewOptionsContext(cluster *kops.Cluster, assetBuilder *assets.AssetBuilder, maxKubeletSupportedVersion string) (*OptionsContext, error) {\n\toptionsContext := &OptionsContext{\n\t\tClusterName:  cluster.ObjectMeta.Name,\n\t\tAssetBuilder: assetBuilder,\n\t}\n\n\tsv, err := util.ParseKubernetesVersion(cluster.Spec.KubernetesVersion)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"unable to determine kubernetes version from %q\", cluster.Spec.KubernetesVersion)\n\t}\n\toptionsContext.KubernetesVersion = *sv\n\n\tcontrolPlaneKubernetesVersion, err := kopsmodel.ParseKubernetesVersion(cluster.Spec.KubernetesVersion)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"unable to determine kubernetes version from %q: %w\", cluster.Spec.KubernetesVersion, err)\n\t}\n\tnodeKubernetesVersion := controlPlaneKubernetesVersion\n\tif maxKubeletSupportedVersion != \"\" {\n\t\tnodeKubernetesVersion, err = kopsmodel.ParseKubernetesVersion(maxKubeletSupportedVersion)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"unable to determine kubernetes version from %q: %w\", maxKubeletSupportedVersion, err)\n\t\t}\n\t}\n\n\toptionsContext.nodeKubernetesVersion = *nodeKubernetesVersion\n\toptionsContext.controlPlaneKubernetesVersion = *controlPlaneKubernetesVersion\n\n\treturn optionsContext, nil\n}\n\nfunc (c *OptionsContext) NodeKubernetesVersion() kopsmodel.KubernetesVersion {\n\treturn c.nodeKubernetesVersion\n}","sourceCodeStart":46,"sourceCodeEnd":82,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/pkg/model/components/context.go#L46-L82","documentation":"After the general version parse, NewOptionsContext parses the same KubernetesVersion with kopsmodel.ParseKubernetesVersion to compute control-plane-specific version gates. Failure here wraps the underlying parse error and aborts options-context creation; it indicates the version string is not a valid semver per the stricter kops model parser.","triggerScenarios":"cluster.Spec.KubernetesVersion passes the lenient util parse but fails kopsmodel.ParseKubernetesVersion — e.g. missing patch version ('v1.30'), non-numeric pre-release tags, or leading/trailing whitespace.","commonSituations":"Using 'v1.30' style two-part versions; versions with suffixes like '-custom+build' unsupported by the parser; CI injecting branch names as versions.","solutions":["Use full semver: major.minor.patch, e.g. v1.30.4","Strip unsupported suffixes/whitespace from the version string","Verify with `kops version`-compatible version formatting and re-run"],"exampleFix":"# before\nkubernetesVersion: v1.30\n# after\nkubernetesVersion: v1.30.4","handlingStrategy":"validation","validationCode":"if _, err := kopsmodel.ParseKubernetesVersion(cluster.Spec.KubernetesVersion); err != nil {\n\treturn fmt.Errorf(\"kubernetesVersion %q is not full semver (use vMAJOR.MINOR.PATCH)\", cluster.Spec.KubernetesVersion)\n}","typeGuard":"func isFullSemver(v string) bool {\n\t_, err := kopsmodel.ParseKubernetesVersion(v)\n\treturn err == nil && strings.Count(strings.TrimPrefix(v, \"v\"), \".\") >= 2\n}","tryCatchPattern":"if err := newOptionsContext(...); err != nil {\n\tif strings.Contains(err.Error(), \"unable to determine kubernetes version\") {\n\t\t// normalize to semver and retry\n\t}\n\treturn err\n}","preventionTips":["Use three-part versions (v1.30.4), never two-part (v1.30)","Trim whitespace and strip unsupported build suffixes before storing kubernetesVersion","Copy versions only from official release tags"],"tags":["version-parsing","semver","control-plane"],"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-12T07:17:12.445Z"}