From 8760ae697e12f26ebc55134d5369f5629e13f2ba Mon Sep 17 00:00:00 2001 From: PingWang Date: Wed, 3 Aug 2016 17:41:09 +0800 Subject: [PATCH] implement restful for InstallLogsSupport Signed-off-by: PingWang add ws.doc Signed-off-by: PingWang run hack/update-swagger-spec.sh Signed-off-by: PingWang update update-swagger-spec.sh Signed-off-by: PingWang update apiserver_test.go Signed-off-by: PingWang update comment Signed-off-by: PingWang --- api/swagger-spec/logs.json | 33 ++++++++++++++++++++++++ api/swagger-spec/resourceListing.json | 4 +++ hack/update-swagger-spec.sh | 1 + pkg/apiserver/apiserver.go | 25 +++++++++++++++--- pkg/apiserver/apiserver_test.go | 23 +++++++++++++++++ pkg/genericapiserver/genericapiserver.go | 2 +- 6 files changed, 83 insertions(+), 5 deletions(-) create mode 100644 api/swagger-spec/logs.json diff --git a/api/swagger-spec/logs.json b/api/swagger-spec/logs.json new file mode 100644 index 0000000000..d74c43bf61 --- /dev/null +++ b/api/swagger-spec/logs.json @@ -0,0 +1,33 @@ +{ + "swaggerVersion": "1.2", + "apiVersion": "", + "basePath": "https://10.10.10.10:6443", + "resourcePath": "/logs", + "apis": [ + { + "path": "/logs/{logpath}", + "description": "get log files", + "operations": [ + { + "type": "void", + "method": "GET", + "nickname": "logFileHandler", + "parameters": [] + } + ] + }, + { + "path": "/logs", + "description": "get log files", + "operations": [ + { + "type": "void", + "method": "GET", + "nickname": "logFileListHandler", + "parameters": [] + } + ] + } + ], + "models": {} + } diff --git a/api/swagger-spec/resourceListing.json b/api/swagger-spec/resourceListing.json index 98cd355d00..d5997c803e 100644 --- a/api/swagger-spec/resourceListing.json +++ b/api/swagger-spec/resourceListing.json @@ -1,6 +1,10 @@ { "swaggerVersion": "1.2", "apis": [ + { + "path": "/logs", + "description": "get log files" + }, { "path": "/version", "description": "git code version from which this is built" diff --git a/hack/update-swagger-spec.sh b/hack/update-swagger-spec.sh index d309b1b833..66724189e2 100755 --- a/hack/update-swagger-spec.sh +++ b/hack/update-swagger-spec.sh @@ -104,6 +104,7 @@ curl -w "\n" -fs "${SWAGGER_API_PATH}" > "${SWAGGER_ROOT_DIR}/resourceListing.js curl -w "\n" -fs "${SWAGGER_API_PATH}version" > "${SWAGGER_ROOT_DIR}/version.json" curl -w "\n" -fs "${SWAGGER_API_PATH}api" > "${SWAGGER_ROOT_DIR}/api.json" curl -w "\n" -fs "${SWAGGER_API_PATH}apis" > "${SWAGGER_ROOT_DIR}/apis.json" +curl -w "\n" -fs "${SWAGGER_API_PATH}logs" > "${SWAGGER_ROOT_DIR}/logs.json" kube::log::status "SUCCESS" # ex: ts=2 sw=2 et filetype=sh diff --git a/pkg/apiserver/apiserver.go b/pkg/apiserver/apiserver.go index 533cce0c4a..1c4a0fcd3f 100644 --- a/pkg/apiserver/apiserver.go +++ b/pkg/apiserver/apiserver.go @@ -208,11 +208,28 @@ func InstallVersionHandler(mux Mux, container *restful.Container) { container.Add(versionWS) } -// InstallLogsSupport registers the APIServer log support function into a mux. -func InstallLogsSupport(mux Mux) { - // TODO: use restful: ws.Route(ws.GET("/logs/{logpath:*}").To(fileHandler)) +// InstallLogsSupport registers the APIServer's `/logs` into a mux. +func InstallLogsSupport(mux Mux, container *restful.Container) { + // use restful: ws.Route(ws.GET("/logs/{logpath:*}").To(fileHandler)) // See github.com/emicklei/go-restful/blob/master/examples/restful-serve-static.go - mux.Handle("/logs/", http.StripPrefix("/logs/", http.FileServer(http.Dir("/var/log/")))) + ws := new(restful.WebService) + ws.Path("/logs") + ws.Doc("get log files") + ws.Route(ws.GET("/{logpath:*}").To(logFileHandler)) + ws.Route(ws.GET("/").To(logFileListHandler)) + + container.Add(ws) +} + +func logFileHandler(req *restful.Request, resp *restful.Response) { + logdir := "/var/log" + actual := path.Join(logdir, req.PathParameter("logpath")) + http.ServeFile(resp.ResponseWriter, req.Request, actual) +} + +func logFileListHandler(req *restful.Request, resp *restful.Response) { + logdir := "/var/log" + http.ServeFile(resp.ResponseWriter, req.Request, logdir) } // TODO: needs to perform response type negotiation, this is probably the wrong way to recover panics diff --git a/pkg/apiserver/apiserver_test.go b/pkg/apiserver/apiserver_test.go index 84fa532f98..9441cfd677 100644 --- a/pkg/apiserver/apiserver_test.go +++ b/pkg/apiserver/apiserver_test.go @@ -1100,6 +1100,29 @@ func TestList(t *testing.T) { } } +func TestLogs(t *testing.T) { + handler := handle(map[string]rest.Storage{}) + server := httptest.NewServer(handler) + defer server.Close() + client := http.Client{} + + request, err := http.NewRequest("GET", server.URL+"/logs", nil) + if err != nil { + t.Errorf("unexpected error: %v", err) + } + + response, err := client.Do(request) + if err != nil { + t.Errorf("unexpected error: %v", err) + } + + body, err := ioutil.ReadAll(response.Body) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + t.Logf("Data: %s", string(body)) +} + func TestErrorList(t *testing.T) { storage := map[string]rest.Storage{} simpleStorage := SimpleRESTStorage{ diff --git a/pkg/genericapiserver/genericapiserver.go b/pkg/genericapiserver/genericapiserver.go index 2948c0dbe1..b1c269a9f0 100644 --- a/pkg/genericapiserver/genericapiserver.go +++ b/pkg/genericapiserver/genericapiserver.go @@ -449,7 +449,7 @@ func (s *GenericAPIServer) init(c *Config) { } if c.EnableLogsSupport { - apiserver.InstallLogsSupport(s.MuxHelper) + apiserver.InstallLogsSupport(s.MuxHelper, s.HandlerContainer) } if c.EnableUISupport { ui.InstallSupport(s.MuxHelper, s.enableSwaggerSupport && s.enableSwaggerUI)