{"record":{"id":"59862094be48d208","repo":"kubernetes/kops","slug":"cannot-parse-kubernetesversion-q-w","errorCode":null,"errorMessage":"cannot parse KubernetesVersion %q: %w","messagePattern":"cannot parse KubernetesVersion %q: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"upup/pkg/fi/cloudup/new_cluster.go","lineNumber":252,"sourceCode":"\t\tObjectMeta: v1.ObjectMeta{\n\t\t\tName: opt.ClusterName,\n\t\t},\n\t}\n\n\tcluster.Spec.Channel = opt.Channel\n\tif opt.KubernetesVersion == \"\" {\n\t\tkubernetesVersion := api.RecommendedKubernetesVersion(channel, kops.Version)\n\t\tif kubernetesVersion != nil {\n\t\t\tcluster.Spec.KubernetesVersion = kubernetesVersion.String()\n\t\t}\n\t} else {\n\t\tcluster.Spec.KubernetesVersion = opt.KubernetesVersion\n\t}\n\n\t// Verify the kubernetes version early (while we can still handle the version nicely)\n\tif cluster.Spec.KubernetesVersion != \"\" {\n\t\tif _, err := util.ParseKubernetesVersion(cluster.Spec.KubernetesVersion); err != nil {\n\t\t\treturn nil, fmt.Errorf(\"cannot parse KubernetesVersion %q: %w\", cluster.Spec.KubernetesVersion, err)\n\t\t}\n\t}\n\n\tcluster.Spec.ConfigStore = api.ConfigStoreSpec{\n\t\tBase: opt.ConfigBase,\n\t}\n\tconfigBase, err := clientset.ConfigBaseFor(cluster)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"error building ConfigBase for cluster: %v\", err)\n\t}\n\tcluster.Spec.ConfigStore.Base = configBase.Path()\n\n\tcluster.Spec.Authorization = &api.AuthorizationSpec{}\n\tif strings.EqualFold(opt.Authorization, AuthorizationFlagAlwaysAllow) {\n\t\tcluster.Spec.Authorization.AlwaysAllow = &api.AlwaysAllowAuthorizationSpec{}\n\t} else if opt.Authorization == \"\" || strings.EqualFold(opt.Authorization, AuthorizationFlagRBAC) {\n\t\tcluster.Spec.Authorization.RBAC = &api.RBACAuthorizationSpec{}\n\t} else {","sourceCodeStart":234,"sourceCodeEnd":270,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/upup/pkg/fi/cloudup/new_cluster.go#L234-L270","documentation":"NewCluster eagerly parses cluster.Spec.KubernetesVersion with util.ParseKubernetesVersion so invalid versions are caught before any cloud resources are created. The wrapped error (%w) carries the underlying parse failure.","triggerScenarios":"`kops create cluster --kubernetes-version <bad>` or NewClusterOptions.KubernetesVersion set to a string that is not a valid semver (e.g. \"1\", \"v1.x\", \"latest\", \"1.29.3-beta.1+foo\" variants the parser rejects).","commonSituations":"Typos in the version flag; using channel aliases like \"latest\" where a concrete version is required; copying versions from documentation that include a leading 'v' or extra qualifiers the strict parser rejects.","solutions":["Use a valid semver, e.g. `--kubernetes-version v1.29.4` (or 1.29.4 per parser expectations)","Run `kops get instances` / check `kops version` supported versions and pick a listed release","Omit the flag to use the default version recommended by the channel"],"exampleFix":"// before\nopt.KubernetesVersion = \"latest\"\n// after\nopt.KubernetesVersion = \"v1.29.4\"","handlingStrategy":"validation","validationCode":"if opt.KubernetesVersion != \"\" {\n    if _, err := util.ParseKubernetesVersion(opt.KubernetesVersion); err != nil {\n        return fmt.Errorf(\"invalid --kubernetes-version: %v\", err)\n    }\n}","typeGuard":null,"tryCatchPattern":"if _, err := NewCluster(opt, cs); err != nil {\n    if strings.Contains(err.Error(), \"cannot parse KubernetesVersion\") {\n        // prompt user for a valid semver\n    }\n}","preventionTips":["Use exact semver like v1.29.4, not aliases like latest","Cross-check versions against kOps' supported matrix","Pre-validate user input with a semver library"],"tags":["semver","validation","kubernetes-version"],"backgroundTag":"invalid-version-string","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"}