From 43137d09f7304bf47b148f7836bd3f533728684a Mon Sep 17 00:00:00 2001 From: Rita Zhang Date: Thu, 21 Dec 2017 21:42:05 -0800 Subject: [PATCH] Use mux to handle req; get tail from req --- Gopkg.lock | 2 +- Gopkg.toml | 4 +++ providers/azure/aci.go | 4 +-- providers/hypersh/hypersh.go | 2 +- vkubelet/apiserver.go | 62 +++++++++++++++++++++++++----------- vkubelet/provider.go | 2 +- 6 files changed, 52 insertions(+), 24 deletions(-) diff --git a/Gopkg.lock b/Gopkg.lock index fda460468..eb98a6458 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -403,6 +403,6 @@ [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "e476a3cf3fc7c556db93b5f202d0f578cdca9cda551563756ea30261aff2bd9b" + inputs-digest = "db2f3e11453c573c43ded9e17f9e23e76111609d4936482d19a7d18930e1dcce" solver-name = "gps-cdcl" solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml index 0656f2cd6..ec25a3350 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -48,3 +48,7 @@ [[constraint]] name = "github.com/xeipuuv/gojsonschema" revision = "0c8571ac0ce161a5feb57375a9cdf148c98c0f70" + +[[constraint]] + name = "github.com/gorilla/mux" + version = "1.6.0" diff --git a/providers/azure/aci.go b/providers/azure/aci.go index 1c20ba69a..48b2376a4 100644 --- a/providers/azure/aci.go +++ b/providers/azure/aci.go @@ -198,7 +198,7 @@ func (p *ACIProvider) GetPod(namespace, name string) (*v1.Pod, error) { } // GetPodLogs returns the logs of a pod by name that is running inside ACI. -func (p *ACIProvider) GetContainerLogs(namespace, podName, containerName string) (string, error) { +func (p *ACIProvider) GetContainerLogs(namespace, podName, containerName string, tail int) (string, error) { logContent := "" cg, err := p.aciClient.GetContainerGroup(p.resourceGroup, fmt.Sprintf("%s-%s", namespace, podName)) if err != nil { @@ -215,7 +215,7 @@ func (p *ACIProvider) GetContainerLogs(namespace, podName, containerName string) // get logs from cg retry := 10 for i := 0; i < retry; i++ { - cLogs, err := p.aciClient.GetContainerLogs(p.resourceGroup, cg.Name, containerName, 10) + cLogs, err := p.aciClient.GetContainerLogs(p.resourceGroup, cg.Name, containerName, tail) if err != nil { log.Println(err) time.Sleep(5000 * time.Millisecond) diff --git a/providers/hypersh/hypersh.go b/providers/hypersh/hypersh.go index bc97122cf..a01b80fa9 100644 --- a/providers/hypersh/hypersh.go +++ b/providers/hypersh/hypersh.go @@ -140,7 +140,7 @@ func (p *HyperProvider) GetPod(namespace, name string) (*v1.Pod, error) { } // GetContainerLogs retrieves the logs of a container by name from the provider. -func (p *HyperProvider) GetContainerLogs(namespace, podName, containerName string) (string, error) { +func (p *HyperProvider) GetContainerLogs(namespace, podName, containerName string, tail int) (string, error) { return "", nil } diff --git a/vkubelet/apiserver.go b/vkubelet/apiserver.go index f3ddd0711..bbf465e5f 100644 --- a/vkubelet/apiserver.go +++ b/vkubelet/apiserver.go @@ -6,40 +6,64 @@ import ( "log" "net/http" "os" - "strings" + "strconv" + + "github.com/gorilla/mux" ) var p Provider +var r mux.Router + +func NotFound(w http.ResponseWriter, r *http.Request) { + log.Println("404 request not found") + http.Error(w, "404 request not found", http.StatusNotFound) +} func ApiserverStart(provider Provider) { p = provider - http.HandleFunc("/", ApiServerHandler) certFilePath := os.Getenv("APISERVER_CERT_LOCATION") keyFilePath := os.Getenv("APISERVER_KEY_LOCATION") port := os.Getenv("KUBELET_PORT") addr := fmt.Sprintf(":%s", port) - err := http.ListenAndServeTLS(addr, certFilePath, keyFilePath, nil) + + r := mux.NewRouter() + r.HandleFunc("/containerLogs/{namespace}/{pod}/{container}", ApiServerHandler).Methods("GET") + r.NotFoundHandler = http.HandlerFunc(NotFound) + + err := http.ListenAndServeTLS(addr, certFilePath, keyFilePath, r) if err != nil { log.Println(err) } } func ApiServerHandler(w http.ResponseWriter, req *http.Request) { - if req.Method == "GET" { - if strings.ContainsAny(req.RequestURI, "containerLogs" ) { - reqParts := strings.Split(req.RequestURI, "/") - if len(reqParts) == 5 { - namespace := reqParts[2] - pod := reqParts[3] - container := reqParts[4] - podsLogs, err := p.GetContainerLogs(namespace, pod, container) - if err != nil { - io.WriteString(w, err.Error()) - log.Println(err) - } else { - io.WriteString(w, podsLogs) - } + vars := mux.Vars(req) + + if len(vars) == 3 { + namespace := vars["namespace"] + pod := vars["pod"] + container := vars["container"] + tail := 10 + q := req.URL.Query() + queryTail := q.Get("tailLines") + if queryTail != "" { + t, err := strconv.Atoi(queryTail) + if err != nil { + log.Println(err) + io.WriteString(w, err.Error()) + } else { + tail = t } - } + log.Println(tail) + podsLogs, err := p.GetContainerLogs(namespace, pod, container, tail) + if err != nil { + log.Println(err) + io.WriteString(w, err.Error()) + } else { + io.WriteString(w, podsLogs) + } + } else { + log.Println("404 request pattern not found") + NotFound(w, req) } -} \ No newline at end of file +} diff --git a/vkubelet/provider.go b/vkubelet/provider.go index ddbf0c44a..02d927d3e 100644 --- a/vkubelet/provider.go +++ b/vkubelet/provider.go @@ -25,7 +25,7 @@ type Provider interface { GetPod(namespace, name string) (*v1.Pod, error) // GetContainerLogs retrieves the logs of a container by name from the provider. - GetContainerLogs(namespace, podName, containerName string) (string, error) + GetContainerLogs(namespace, podName, containerName string, tail int) (string, error) // GetPodStatus retrieves the status of a pod by name from the provider. GetPodStatus(namespace, name string) (*v1.PodStatus, error)