diff --git a/cmd/kubecfg/kubecfg.go b/cmd/kubecfg/kubecfg.go index 8784ab82cd..639b2bbe60 100644 --- a/cmd/kubecfg/kubecfg.go +++ b/cmd/kubecfg/kubecfg.go @@ -22,6 +22,7 @@ import ( "io/ioutil" "net/url" "os" + "sort" "strconv" "strings" "text/template" @@ -55,10 +56,10 @@ var ( ) func usage() { - fmt.Fprint(os.Stderr, `usage: kubecfg -h [-c config/file.json] [-p :,..., :] + fmt.Fprintf(os.Stderr, `usage: kubecfg -h [-c config/file.json] [-p :,..., :] Kubernetes REST API: - kubecfg [OPTIONS] get|list|create|delete|update + kubecfg [OPTIONS] get|list|create|delete|update <%s>[/] Manage replication controllers: kubecfg [OPTIONS] stop|rm|rollingupdate @@ -66,10 +67,16 @@ func usage() { kubecfg [OPTIONS] resize Options: -`) +`, prettyWireStorage()) flag.PrintDefaults() } +func prettyWireStorage() string { + types := kubecfg.SupportedWireStorage() + sort.Strings(types) + return strings.Join(types, "|") +} + // readConfig reads and parses pod, replicationController, and service // configuration files. If any errors log and exit non-zero. func readConfig(storage string) []byte { @@ -150,32 +157,44 @@ func main() { } func executeAPIRequest(method string, s *kube_client.Client) bool { - parseStorage := func() string { - if len(flag.Args()) != 2 { - glog.Fatal("usage: kubecfg [OPTIONS] get|list|create|update|delete ") - } - return strings.Trim(flag.Arg(1), "/") + if len(flag.Args()) != 2 { + glog.Fatalf("usage: kubecfg [OPTIONS] get|list|create|update|delete <%s>[/]", prettyWireStorage()) } verb := "" + segments := strings.SplitN(flag.Arg(1), "/", 2) + storage := segments[0] + path := strings.Trim(flag.Arg(1), "/") + setBody := false switch method { case "get", "list": verb = "GET" case "delete": verb = "DELETE" + if len(segments) == 1 || segments[1] == "" { + glog.Fatalf("usage: kubecfg [OPTIONS] delete <%s>/", prettyWireStorage()) + } case "create": verb = "POST" + setBody = true + if len(segments) != 1 { + glog.Fatalf("usage: kubecfg [OPTIONS] create <%s>", prettyWireStorage()) + } case "update": verb = "PUT" + setBody = true + if len(segments) == 1 || segments[1] == "" { + glog.Fatalf("usage: kubecfg [OPTIONS] update <%s>/", prettyWireStorage()) + } default: return false } r := s.Verb(verb). - Path(parseStorage()). + Path(path). ParseSelector(*selector) - if method == "create" || method == "update" { - r.Body(readConfig(parseStorage())) + if setBody { + r.Body(readConfig(storage)) } result := r.Do() obj, err := result.Get() diff --git a/pkg/kubecfg/parse.go b/pkg/kubecfg/parse.go index df5313d209..5a104ee6d5 100644 --- a/pkg/kubecfg/parse.go +++ b/pkg/kubecfg/parse.go @@ -44,3 +44,11 @@ func ToWireFormat(data []byte, storage string) ([]byte, error) { } return api.Encode(obj) } + +func SupportedWireStorage() []string { + types := []string{} + for k, _ := range storageToType { + types = append(types, k) + } + return types +}