package controller
import (
"context"
"encoding/json"
"net/http"
"os"
"strconv"
"strings"
httputil "github.com/goodrain/rainbond/util/http"
"github.com/go-chi/chi"
"github.com/sirupsen/logrus"
"github.com/goodrain/rainbond/api/handler"
api_model "github.com/goodrain/rainbond/api/model"
"github.com/goodrain/rainbond/api/proxy"
ctxutil "github.com/goodrain/rainbond/api/util/ctx"
)
type EventLogStruct struct {
EventlogServerProxy proxy.Proxy
}
func (e *EventLogStruct) HistoryLogs(w http.ResponseWriter, r *http.Request) {
serviceID := r.Context().Value(ctxutil.ContextKey("service_id")).(string)
serviceAlias := r.Context().Value(ctxutil.ContextKey("service_alias")).(string)
name, _ := handler.GetEventHandler().GetLogInstance(serviceID)
if name != "" {
r.URL.Query().Add("host_id", name)
r = r.WithContext(context.WithValue(r.Context(), proxy.ContextKey("host_id"), name))
}
r.URL.Path = strings.Replace(r.URL.Path, serviceAlias, serviceID, 1)
r.URL.Path = strings.Replace(r.URL.Path, "/v2/", "/", 1)
e.EventlogServerProxy.Proxy(w, r)
}
func (e *EventLogStruct) HistoryRbdLogs(w http.ResponseWriter, r *http.Request) {
r.URL.Path = strings.Replace(r.URL.Path, "/v2/cluster/", "/", 1)
e.EventlogServerProxy.Proxy(w, r)
}
func (e *EventLogStruct) LogList(w http.ResponseWriter, r *http.Request) {
rbdName := r.URL.Query().Get("rbd_name")
var serviceID string
if rbdName != "" {
serviceID = rbdName
} else {
serviceID = r.Context().Value(ctxutil.ContextKey("service_id")).(string)
}
fileList, err := handler.GetEventHandler().GetLogList(GetServiceAliasID(serviceID))
if err != nil {
if os.IsNotExist(err) {
httputil.ReturnError(r, w, 404, err.Error())
return
}
httputil.ReturnError(r, w, 500, err.Error())
return
}
httputil.ReturnSuccess(r, w, fileList)
return
}
func (e *EventLogStruct) LogFile(w http.ResponseWriter, r *http.Request) {
fileName := chi.URLParam(r, "file_name")
serviceID := r.Context().Value(ctxutil.ContextKey("service_id")).(string)
logPath, _, err := handler.GetEventHandler().GetLogFile(GetServiceAliasID(serviceID), fileName)
if err != nil {
if os.IsNotExist(err) {
httputil.ReturnError(r, w, 404, err.Error())
return
}
httputil.ReturnError(r, w, 500, err.Error())
return
}
http.StripPrefix(fileName, http.FileServer(http.Dir(logPath)))
}
func (e *EventLogStruct) LogSocket(w http.ResponseWriter, r *http.Request) {
serviceID := r.Context().Value(ctxutil.ContextKey("service_id")).(string)
value, err := handler.GetEventHandler().GetLogInstance(serviceID)
if err != nil {
if strings.Contains(err.Error(), "Key not found") {
httputil.ReturnError(r, w, 404, err.Error())
return
}
logrus.Errorf("get docker log instance error. %s", err.Error())
httputil.ReturnError(r, w, 500, err.Error())
return
}
rc := make(map[string]string)
rc["host_id"] = value
httputil.ReturnSuccess(r, w, rc)
return
}
func (e *EventLogStruct) LogByAction(w http.ResponseWriter, r *http.Request) {
var elog api_model.LogByLevelStruct
ok := httputil.ValidatorRequestStructAndErrorResponse(r, w, &elog.Body, nil)
if !ok {
return
}
dl, err := handler.GetEventHandler().GetLevelLog(elog.Body.EventID, elog.Body.Level)
if err != nil {
logrus.Errorf("get event log error, %v", err)
httputil.ReturnError(r, w, 500, err.Error())
return
}
httputil.ReturnSuccess(r, w, dl.Data)
return
}
func (e *EventLogStruct) TenantLogByAction(w http.ResponseWriter, r *http.Request) {
var elog api_model.TenantLogByLevelStruct
ok := httputil.ValidatorRequestStructAndErrorResponse(r, w, &elog.Body, nil)
if !ok {
return
}
logrus.Info(elog.Body.Level)
dl, err := handler.GetEventHandler().GetLevelLog(elog.Body.EventID, elog.Body.Level)
if err != nil {
logrus.Errorf("get tenant event log error, %v", err)
httputil.ReturnError(r, w, 200, "success")
return
}
httputil.ReturnSuccess(r, w, dl.Data)
return
}
func (e *EventLogStruct) Events(w http.ResponseWriter, r *http.Request) {
target := r.FormValue("target")
targetID := r.FormValue("target-id")
var page, size int
var err error
if page, err = strconv.Atoi(r.FormValue("page")); err != nil || page <= 0 {
page = 1
}
if size, err = strconv.Atoi(r.FormValue("size")); err != nil || size <= 0 {
size = 10
}
logrus.Debugf("get event page param[target:%s id:%s page:%d, page_size:%d]", target, targetID, page, size)
list, total, err := handler.GetEventHandler().GetEvents(target, targetID, page, size)
if err != nil {
logrus.Errorf("get event log error, %v", err)
httputil.ReturnError(r, w, 500, "get log error")
return
}
for i := range list {
if list[i].EndTime != "" && len(list[i].EndTime) > 20 {
list[i].EndTime = strings.Replace(list[i].EndTime[0:19]+"+08:00", " ", "T", 1)
}
}
httputil.ReturnList(r, w, total, page, list)
}
func (e *EventLogStruct) EventLog(w http.ResponseWriter, r *http.Request) {
eventID := chi.URLParam(r, "eventID")
if strings.TrimSpace(eventID) == "" {
httputil.ReturnError(r, w, 400, "eventID is request")
return
}
dl, err := handler.GetEventHandler().GetLevelLog(eventID, "debug")
if err != nil {
logrus.Errorf("get event log error, %v", err)
httputil.ReturnError(r, w, 500, "read event log error: "+err.Error())
return
}
httputil.ReturnSuccess(r, w, dl.Data)
return
}
func (e *EventLogStruct) MyTeamsEvents(w http.ResponseWriter, r *http.Request) {
tenant := r.FormValue("tenant")
tenantIDs := r.FormValue("tenant_ids")
var MyTeamsEventsReq *api_model.MyTeamsEventsReq
var err error
err = json.Unmarshal([]byte(tenantIDs), &MyTeamsEventsReq)
if err != nil {
logrus.Error("MyTeamsEventsReq json unmarshal error", err)
return
}
var page, size int
if page, err = strconv.Atoi(r.FormValue("page")); err != nil || page <= 0 {
page = 1
}
if size, err = strconv.Atoi(r.FormValue("size")); err != nil || size <= 0 {
size = 10
}
logrus.Debugf("get my teams events page param[target:%s id:%s page:%d, page_size:%d]", tenant, MyTeamsEventsReq.TenantIDs, page, size)
res, err := handler.GetEventHandler().GetMyTeamsEvents(tenant, MyTeamsEventsReq.TenantIDs, page, size)
if err != nil {
logrus.Errorf("get my teams events log error, %v", err)
httputil.ReturnError(r, w, 500, "get log error")
return
}
httputil.ReturnList(r, w, size, page, res)
}