提交 3c17fd14 编写于 作者: L Lukasz Zajaczkowski

Add backend support for logs

上级 6e730f03
......@@ -59,6 +59,15 @@ func CreateHttpApiHandler(client *client.Client) http.Handler {
Writes(NamespacesList{}))
wsContainer.Add(namespaceListWs)
logsWs := new(restful.WebService)
logsWs.Path("/api/logs").
Produces(restful.MIME_JSON)
logsWs.Route(
logsWs.GET("/{namespace}/{podId}").
To(apiHandler.handleLogs).
Writes(Logs{}))
wsContainer.Add(logsWs)
return wsContainer
}
......@@ -122,6 +131,19 @@ func (apiHandler *ApiHandler) handleGetNamespaceList(
response.WriteHeaderAndEntity(http.StatusCreated, result)
}
// Handles log API call.
func (apiHandler *ApiHandler) handleLogs(request *restful.Request, response *restful.Response) {
namespace := request.PathParameter("namespace")
podId := request.PathParameter("podId")
result, err := GetPodLogs(apiHandler.client, namespace, podId)
if err != nil {
handleInternalError(response, err)
return
}
response.WriteHeaderAndEntity(http.StatusCreated, result)
}
// Handler that writes the given error to the response and sets appropriate HTTP status headers.
func handleInternalError(response *restful.Response, err error) {
response.AddHeader("Content-Type", "text/plain")
......
// Copyright 2015 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package main
import (
"io/ioutil"
api "k8s.io/kubernetes/pkg/api"
client "k8s.io/kubernetes/pkg/client/unversioned"
"strings"
"time"
)
// Log response structure
type Logs struct {
// Pod id
PodId string `json:"podId"`
// Specific date (RFC3339) when logs started
SinceTime string `json:"sinceTime"`
// Logs string
Logs []string `json:"logs"`
}
// Return logs for particular pod or error when occurred.
func GetPodLogs(client *client.Client, namespace string, podId string) (*Logs, error) {
pod, err := client.Pods(namespace).Get(podId)
if err != nil {
return nil, err
}
logOptions := &api.PodLogOptions{
Follow: false,
Previous: false,
Timestamps: true,
}
logString, err := getRawPodLogs(client, namespace, podId, logOptions)
if err != nil {
return nil, err
}
logs := &Logs{
PodId: podId,
SinceTime: pod.CreationTimestamp.Format(time.RFC3339),
Logs: strings.Split(logString, "\n"),
}
return logs, nil
}
// Construct a request for getting the logs for a pod and retrieves the logs.
func getRawPodLogs(client *client.Client, namespace string, podID string,
logOptions *api.PodLogOptions) (string, error) {
req := client.RESTClient.Get().
Namespace(namespace).
Name(podID).
Resource("pods").
SubResource("log").
VersionedParams(logOptions, api.Scheme)
readCloser, err := req.Stream()
if err != nil {
return "", err
}
defer readCloser.Close()
result, err := ioutil.ReadAll(readCloser)
if err != nil {
return "", err
}
return string(result), nil
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册