{"record":{"id":"590196928ca52f1d","repo":"kubernetes/kops","slug":"unable-to-parse-argument-q-as-url","errorCode":null,"errorMessage":"unable to parse argument %q as url","messagePattern":"unable to parse argument %q as url","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"channels/pkg/cmd/apply_channel.go","lineNumber":335,"sourceCode":"\t}\n\n\tchannelVersions := make(map[string]*channels.ChannelVersion)\n\tfor i := range namespaces.Items {\n\t\tns := &namespaces.Items[i]\n\t\taddons := channels.FindChannelVersions(ns)\n\t\tfor name, version := range addons {\n\t\t\tchannelVersions[ns.Name+\":\"+name] = version\n\t\t}\n\t}\n\treturn channelVersions, nil\n}\n\nfunc buildMenu(vfsContext *vfs.VFSContext, kubernetesVersion semver.Version, channelLocation string) (*channels.AddonMenu, error) {\n\tmenu := channels.NewAddonMenu()\n\n\tlocation, err := url.Parse(channelLocation)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"unable to parse argument %q as url\", channelLocation)\n\t}\n\tif !location.IsAbs() {\n\t\texpanded := \"https://raw.githubusercontent.com/kubernetes/kops/master/addons/\" + channelLocation + \"/addon.yaml\"\n\t\t// Disallow the use of legacy addons from the \"well-known\" location starting Kubernetes 1.23:\n\t\t// https://raw.githubusercontent.com/kubernetes/kops/master/addons/<name>/addon.yaml\n\t\treturn nil, fmt.Errorf(\"legacy addons are deprecated and unmaintained, use managed addons instead of %s\", expanded)\n\t}\n\to, err := channels.LoadAddons(vfsContext, channelLocation, location)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"error loading channel %q: %v\", location, err)\n\t}\n\n\tcurrent, err := o.GetCurrent(kubernetesVersion)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"error processing latest versions in %q: %v\", location, err)\n\t}\n\tmenu.MergeAddons(current)\n\treturn menu, nil","sourceCodeStart":317,"sourceCodeEnd":353,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/channels/pkg/cmd/apply_channel.go#L317-L353","documentation":"buildMenu parses the channel location with url.Parse; if parsing fails, 'unable to parse argument %q as url' is returned. A parseable but relative URL is also rejected, but via the separate legacy-addon deprecation error (index 78).","triggerScenarios":"Passing a channel argument with characters invalid for a URL (spaces, control chars, malformed scheme) to `kops apply channel`.","commonSituations":"Typos in the URL, shell interpolation injecting spaces/newlines, quoting mistakes leaving stray characters, passing a bare addon name expecting legacy behavior.","solutions":["Quote and re-check the argument; remove invalid characters","Use a fully-qualified absolute https:// URL to the addon.yaml","For bare addon names, switch to kOps managed addons in the cluster spec","Sanity-check the URL with any standard URL parser before running"],"exampleFix":"// before\nkops apply channel \"https://example.com/addons/ my addon/addon.yaml\"\n// after\nkops apply channel \"https://example.com/addons/my-addon/addon.yaml\"","handlingStrategy":"validation","validationCode":"if _, err := url.Parse(channelLocation); err != nil {\n\treturn fmt.Errorf(\"channel location %q is not a valid URL\", channelLocation)\n}","typeGuard":"func isParseableURL(s string) bool {\n\t_, err := url.Parse(s)\n\treturn err == nil\n}","tryCatchPattern":"if _, err := url.Parse(arg); err != nil {\n\treturn fmt.Errorf(\"rejecting invalid channel argument %q: %v\", arg, err)\n}","preventionTips":["Quote all channel arguments in shell scripts","Avoid uncontrolled variable interpolation into URLs","Lint CLI arguments for spaces/control characters before invoking"],"tags":["cli","url-parsing","argument-validation"],"backgroundTag":"invalid-url-argument","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"}