99 lines
2.7 KiB
Go
99 lines
2.7 KiB
Go
package v1alpha2
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/emicklei/go-restful"
|
|
"k8s.io/klog"
|
|
|
|
"strconv"
|
|
"time"
|
|
|
|
"kubesphere.io/kubesphere/pkg/api"
|
|
meteringv1alpha1 "kubesphere.io/kubesphere/pkg/api/metering/v1alpha1"
|
|
"kubesphere.io/kubesphere/pkg/apiserver/request"
|
|
monitoringv1alpha3 "kubesphere.io/kubesphere/pkg/kapis/monitoring/v1alpha3"
|
|
"kubesphere.io/kubesphere/pkg/models/metering"
|
|
monitoringclient "kubesphere.io/kubesphere/pkg/simple/client/monitoring"
|
|
)
|
|
|
|
func (h *tenantHandler) QueryMetering(req *restful.Request, resp *restful.Response) {
|
|
|
|
u, ok := request.UserFrom(req.Request.Context())
|
|
if !ok {
|
|
err := fmt.Errorf("cannot obtain user info")
|
|
klog.Errorln(err)
|
|
api.HandleForbidden(resp, req, err)
|
|
return
|
|
}
|
|
|
|
q := meteringv1alpha1.ParseQueryParameter(req)
|
|
|
|
res, err := h.tenant.Metering(u, q, h.meteringOptions.Billing.PriceInfo)
|
|
if err != nil {
|
|
api.HandleBadRequest(resp, nil, err)
|
|
return
|
|
}
|
|
|
|
if q.Operation == monitoringv1alpha3.OperationExport {
|
|
|
|
start, err := strconv.ParseInt(q.Start, 10, 64)
|
|
if err != nil {
|
|
api.HandleBadRequest(resp, nil, err)
|
|
return
|
|
}
|
|
end, err := strconv.ParseInt(q.End, 10, 64)
|
|
if err != nil {
|
|
api.HandleBadRequest(resp, nil, err)
|
|
return
|
|
}
|
|
|
|
startTime := time.Unix(start, 0)
|
|
endTime := time.Unix(end, 0)
|
|
|
|
monitoringv1alpha3.ExportMetrics(resp, res, startTime, endTime)
|
|
return
|
|
}
|
|
|
|
resp.WriteAsJson(res)
|
|
}
|
|
|
|
func (h *tenantHandler) QueryMeteringHierarchy(req *restful.Request, resp *restful.Response) {
|
|
u, ok := request.UserFrom(req.Request.Context())
|
|
if !ok {
|
|
err := fmt.Errorf("cannot obtain user info")
|
|
klog.Errorln(err)
|
|
api.HandleForbidden(resp, req, err)
|
|
return
|
|
}
|
|
|
|
q := meteringv1alpha1.ParseQueryParameter(req)
|
|
q.Level = monitoringclient.LevelPod
|
|
|
|
resourceStats, err := h.tenant.MeteringHierarchy(u, q, h.meteringOptions.Billing.PriceInfo)
|
|
if err != nil {
|
|
api.HandleBadRequest(resp, nil, err)
|
|
return
|
|
}
|
|
|
|
resp.WriteAsJson(resourceStats)
|
|
}
|
|
|
|
func (h *tenantHandler) HandlePriceInfoQuery(req *restful.Request, resp *restful.Response) {
|
|
|
|
var priceResponse metering.PriceResponse
|
|
|
|
priceInfo := h.meteringOptions.Billing.PriceInfo
|
|
priceResponse.RetentionDay = h.meteringOptions.RetentionDay
|
|
priceResponse.Currency = priceInfo.CurrencyUnit
|
|
priceResponse.CpuPerCorePerHour = priceInfo.CpuPerCorePerHour
|
|
priceResponse.MemPerGigabytesPerHour = priceInfo.MemPerGigabytesPerHour
|
|
priceResponse.IngressNetworkTrafficPerMegabytesPerHour = priceInfo.IngressNetworkTrafficPerMegabytesPerHour
|
|
priceResponse.EgressNetworkTrafficPerMegabytesPerHour = priceInfo.EgressNetworkTrafficPerMegabytesPerHour
|
|
priceResponse.PvcPerGigabytesPerHour = priceInfo.PvcPerGigabytesPerHour
|
|
|
|
resp.WriteAsJson(priceResponse)
|
|
|
|
return
|
|
}
|