mirror of https://github.com/linkerd/linkerd2.git
104 lines
2.7 KiB
Go
104 lines
2.7 KiB
Go
package srv
|
|
|
|
import (
|
|
"encoding/json"
|
|
"net/http"
|
|
|
|
"github.com/golang/protobuf/jsonpb"
|
|
"github.com/golang/protobuf/proto"
|
|
"github.com/julienschmidt/httprouter"
|
|
"github.com/runconduit/conduit/controller/api/util"
|
|
pb "github.com/runconduit/conduit/controller/gen/public"
|
|
log "github.com/sirupsen/logrus"
|
|
)
|
|
|
|
type (
|
|
jsonError struct {
|
|
Error string `json:"error"`
|
|
}
|
|
)
|
|
|
|
var (
|
|
defaultResourceType = "deployments"
|
|
pbMarshaler = jsonpb.Marshaler{EmitDefaults: true}
|
|
)
|
|
|
|
func renderJsonError(w http.ResponseWriter, err error, status int) {
|
|
w.Header().Set("Content-Type", "application/json")
|
|
log.Error(err.Error())
|
|
rsp, _ := json.Marshal(jsonError{Error: err.Error()})
|
|
w.WriteHeader(status)
|
|
w.Write(rsp)
|
|
}
|
|
|
|
func renderJson(w http.ResponseWriter, resp interface{}) {
|
|
w.Header().Set("Content-Type", "application/json")
|
|
jsonResp, err := json.Marshal(resp)
|
|
if err != nil {
|
|
renderJsonError(w, err, http.StatusInternalServerError)
|
|
return
|
|
}
|
|
w.Write(jsonResp)
|
|
}
|
|
|
|
func renderJsonPb(w http.ResponseWriter, msg proto.Message) {
|
|
w.Header().Set("Content-Type", "application/json")
|
|
pbMarshaler.Marshal(w, msg)
|
|
}
|
|
|
|
func (h *handler) handleApiVersion(w http.ResponseWriter, req *http.Request, p httprouter.Params) {
|
|
version, err := h.apiClient.Version(req.Context(), &pb.Empty{})
|
|
|
|
if err != nil {
|
|
renderJsonError(w, err, http.StatusInternalServerError)
|
|
return
|
|
}
|
|
resp := map[string]interface{}{
|
|
"version": version,
|
|
}
|
|
renderJson(w, resp)
|
|
}
|
|
|
|
func (h *handler) handleApiPods(w http.ResponseWriter, req *http.Request, p httprouter.Params) {
|
|
pods, err := h.apiClient.ListPods(req.Context(), &pb.Empty{})
|
|
if err != nil {
|
|
renderJsonError(w, err, http.StatusInternalServerError)
|
|
return
|
|
}
|
|
|
|
renderJsonPb(w, pods)
|
|
}
|
|
|
|
func (h *handler) handleApiStat(w http.ResponseWriter, req *http.Request, p httprouter.Params) {
|
|
requestParams := util.StatSummaryRequestParams{
|
|
TimeWindow: req.FormValue("window"),
|
|
ResourceName: req.FormValue("resource_name"),
|
|
ResourceType: req.FormValue("resource_type"),
|
|
Namespace: req.FormValue("namespace"),
|
|
ToName: req.FormValue("to_name"),
|
|
ToType: req.FormValue("to_type"),
|
|
ToNamespace: req.FormValue("to_namespace"),
|
|
FromName: req.FormValue("from_name"),
|
|
FromType: req.FormValue("from_type"),
|
|
FromNamespace: req.FormValue("from_namespace"),
|
|
}
|
|
|
|
// default to returning deployment stats
|
|
if requestParams.ResourceType == "" {
|
|
requestParams.ResourceType = defaultResourceType
|
|
}
|
|
|
|
statRequest, err := util.BuildStatSummaryRequest(requestParams)
|
|
if err != nil {
|
|
renderJsonError(w, err, http.StatusInternalServerError)
|
|
return
|
|
}
|
|
|
|
result, err := h.apiClient.StatSummary(req.Context(), statRequest)
|
|
if err != nil {
|
|
renderJsonError(w, err, http.StatusInternalServerError)
|
|
return
|
|
}
|
|
renderJsonPb(w, result)
|
|
}
|