Add more help messages to cloudcfg utility

pull/6/head
gleamglom 2014-06-11 15:08:23 -07:00
parent 6d4e1632b3
commit dd045544b0
1 changed files with 99 additions and 58 deletions

View File

@ -49,7 +49,19 @@ var (
) )
func usage() { func usage() {
log.Fatal("Usage: cloudcfg -h <host> [-c config/file.json] [-p <hostPort>:<containerPort>,..., <hostPort-n>:<containerPort-n> <method> <path>") fmt.Fprint(os.Stderr, `usage: cloudcfg -h [-c config/file.json] [-p :,..., :] <method>
Kubernetes REST API:
cloudcfg [OPTIONS] get|list|create|delete|update <url>
Manage replication controllers:
cloudcfg [OPTIONS] stop|rm|rollingupdate <controller>
cloudcfg [OPTIONS] run <image> <replicas> <controller>
cloudcfg [OPTIONS] resize <controller> <replicas>
Options:
`)
flag.PrintDefaults()
} }
// Reads & parses config file. On error, calls log.Fatal(). // Reads & parses config file. On error, calls log.Fatal().
@ -71,6 +83,10 @@ func readConfig(storage string) []byte {
// CloudCfg command line tool. // CloudCfg command line tool.
func main() { func main() {
flag.Usage = func() {
usage()
}
flag.Parse() // Scan the arguments list flag.Parse() // Scan the arguments list
if *versionFlag { if *versionFlag {
@ -78,8 +94,9 @@ func main() {
os.Exit(0) os.Exit(0)
} }
if len(flag.Args()) < 2 { if len(flag.Args()) < 1 {
usage() usage()
os.Exit(1)
} }
method := flag.Arg(0) method := flag.Arg(0)
secure := true secure := true
@ -90,9 +107,54 @@ func main() {
if parsedUrl.Scheme != "" && parsedUrl.Scheme != "https" { if parsedUrl.Scheme != "" && parsedUrl.Scheme != "https" {
secure = false secure = false
} }
storage := strings.Trim(flag.Arg(1), "/")
url := *httpServer + path.Join("/api/v1beta1", storage) var auth *kube_client.AuthInfo
if secure {
auth, err = cloudcfg.LoadAuthInfo(*authConfig)
if err != nil {
log.Fatalf("Error loading auth: %#v", err)
}
}
matchFound := executeAPIRequest(method, auth) || executeControllerRequest(method, auth)
if matchFound == false {
log.Fatalf("Unknown command %s", method)
}
}
// Attempts to execute an API request
func executeAPIRequest(method string, auth *kube_client.AuthInfo) bool {
parseStorage := func() string {
if len(flag.Args()) != 2 {
log.Fatal("usage: cloudcfg [OPTIONS] get|list|create|update|delete <url>")
}
return strings.Trim(flag.Arg(1), "/")
}
readUrl := func(storage string) string {
return *httpServer + path.Join("/api/v1beta1", storage)
}
var request *http.Request var request *http.Request
var err error
switch method {
case "get", "list":
url := readUrl(parseStorage())
if len(*labelQuery) > 0 && method == "list" {
url = url + "?labels=" + *labelQuery
}
request, err = http.NewRequest("GET", url, nil)
case "delete":
request, err = http.NewRequest("DELETE", readUrl(parseStorage()), nil)
case "create":
storage := parseStorage()
request, err = cloudcfg.RequestWithBodyData(readConfig(storage), readUrl(storage), "POST")
case "update":
storage := parseStorage()
request, err = cloudcfg.RequestWithBodyData(readConfig(storage), readUrl(storage), "PUT")
default:
return false
}
var printer cloudcfg.ResourcePrinter var printer cloudcfg.ResourcePrinter
if *json { if *json {
@ -103,58 +165,55 @@ func main() {
printer = &cloudcfg.HumanReadablePrinter{} printer = &cloudcfg.HumanReadablePrinter{}
} }
var auth *kube_client.AuthInfo var body string
if secure { if body, err = cloudcfg.DoRequest(request, auth); err == nil {
auth, err = cloudcfg.LoadAuthInfo(*authConfig) if err = printer.Print(body, os.Stdout); err != nil {
if err != nil { log.Fatalf("Failed to print: %#v\nRaw received text:\n%v\n", err, string(body))
log.Fatalf("Error loading auth: %#v", err)
} }
fmt.Print("\n")
} else {
log.Fatalf("Error: %#v %s", err, body)
} }
switch method { return true
case "get", "list":
if len(*labelQuery) > 0 && method == "list" {
url = url + "?labels=" + *labelQuery
} }
request, err = http.NewRequest("GET", url, nil)
case "delete": // Attempts to execute a replicationController request
request, err = http.NewRequest("DELETE", url, nil) func executeControllerRequest(method string, auth *kube_client.AuthInfo) bool {
case "create": parseController := func() string {
request, err = cloudcfg.RequestWithBodyData(readConfig(storage), url, "POST") if len(flag.Args()) != 2 {
case "update": log.Fatal("usage: cloudcfg [OPTIONS] stop|rm|rollingupdate <controller>")
request, err = cloudcfg.RequestWithBodyData(readConfig(storage), url, "PUT") }
return flag.Arg(1)
}
var err error
switch method {
case "stop":
err = cloudcfg.StopController(parseController(), kube_client.Client{Host: *httpServer, Auth: auth})
case "rm":
err = cloudcfg.DeleteController(parseController(), kube_client.Client{Host: *httpServer, Auth: auth})
case "rollingupdate": case "rollingupdate":
client := &kube_client.Client{ client := &kube_client.Client{
Host: *httpServer, Host: *httpServer,
Auth: auth, Auth: auth,
} }
cloudcfg.Update(flag.Arg(1), client, *updatePeriod) err = cloudcfg.Update(parseController(), client, *updatePeriod)
case "run": case "run":
args := flag.Args() if len(flag.Args()) != 4 {
if len(args) < 4 { log.Fatal("usage: cloudcfg [OPTIONS] run <image> <replicas> <controller>")
log.Fatal("usage: cloudcfg -h <host> run <image> <replicas> <name>")
} }
image := args[1] image := flag.Arg(1)
replicas, err := strconv.Atoi(args[2]) replicas, err := strconv.Atoi(flag.Arg(2))
name := args[3] name := flag.Arg(3)
if err != nil { if err != nil {
log.Fatalf("Error parsing replicas: %#v", err) log.Fatalf("Error parsing replicas: %#v", err)
} }
err = cloudcfg.RunController(image, name, replicas, kube_client.Client{Host: *httpServer, Auth: auth}, *portSpec, *servicePort) err = cloudcfg.RunController(image, name, replicas, kube_client.Client{Host: *httpServer, Auth: auth}, *portSpec, *servicePort)
if err != nil {
log.Fatalf("Error: %#v", err)
}
return
case "stop":
err = cloudcfg.StopController(flag.Arg(1), kube_client.Client{Host: *httpServer, Auth: auth})
if err != nil {
log.Fatalf("Error: %#v", err)
}
return
case "resize": case "resize":
args := flag.Args() args := flag.Args()
if len(args) < 3 { if len(args) < 3 {
log.Fatal("usage: cloudcfg resize <name> <replicas>") log.Fatal("usage: cloudcfg resize <controller> <replicas>")
} }
name := args[1] name := args[1]
replicas, err := strconv.Atoi(args[2]) replicas, err := strconv.Atoi(args[2])
@ -162,29 +221,11 @@ func main() {
log.Fatalf("Error parsing replicas: %#v", err) log.Fatalf("Error parsing replicas: %#v", err)
} }
err = cloudcfg.ResizeController(name, replicas, kube_client.Client{Host: *httpServer, Auth: auth}) err = cloudcfg.ResizeController(name, replicas, kube_client.Client{Host: *httpServer, Auth: auth})
if err != nil {
log.Fatalf("Error: %#v", err)
}
return
case "rm":
err = cloudcfg.DeleteController(flag.Arg(1), kube_client.Client{Host: *httpServer, Auth: auth})
if err != nil {
log.Fatalf("Error: %#v", err)
}
return
default: default:
log.Fatalf("Unknown command: %s", method) return false
} }
if err != nil { if err != nil {
log.Fatalf("Error: %#v", err) log.Fatalf("Error: %#v", err)
} }
body, err := cloudcfg.DoRequest(request, auth) return true
if err != nil {
log.Fatalf("Error: %#v %s", err, body)
}
err = printer.Print(body, os.Stdout)
if err != nil {
log.Fatalf("Failed to print: %#v\nRaw received text:\n%v\n", err, string(body))
}
fmt.Print("\n")
} }