219 lines
7.1 KiB
Go
219 lines
7.1 KiB
Go
package handler
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"net/http"
|
|
|
|
"d7y.io/dragonfly/v2/manager/apis/v2/types"
|
|
"d7y.io/dragonfly/v2/manager/store"
|
|
"d7y.io/dragonfly/v2/pkg/dfcodes"
|
|
"d7y.io/dragonfly/v2/pkg/dferrors"
|
|
"github.com/gin-gonic/gin"
|
|
"gopkg.in/errgo.v2/fmt/errors"
|
|
)
|
|
|
|
// CreateSchedulerCluster godoc
|
|
// @Summary Add scheduler cluster
|
|
// @Description add by json config
|
|
// @Tags SchedulerCluster
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Param cluster body types.SchedulerCluster true "Scheduler cluster"
|
|
// @Success 200 {object} types.SchedulerCluster
|
|
// @Failure 400 {object} HTTPError
|
|
// @Failure 404 {object} HTTPError
|
|
// @Failure 500 {object} HTTPError
|
|
// @Router /scheduler/clusters [post]
|
|
func (handler *Handler) CreateSchedulerCluster(ctx *gin.Context) {
|
|
var cluster types.SchedulerCluster
|
|
if err := ctx.ShouldBindJSON(&cluster); err != nil {
|
|
NewError(ctx, http.StatusBadRequest, err)
|
|
return
|
|
}
|
|
|
|
if err := checkSchedulerClusterValidate(&cluster); err != nil {
|
|
NewError(ctx, http.StatusBadRequest, err)
|
|
return
|
|
}
|
|
|
|
retCluster, err := handler.server.AddSchedulerCluster(context.TODO(), &cluster)
|
|
if err == nil {
|
|
ctx.JSON(http.StatusOK, retCluster)
|
|
} else if dferrors.CheckError(err, dfcodes.InvalidResourceType) {
|
|
NewError(ctx, http.StatusBadRequest, err)
|
|
} else if dferrors.CheckError(err, dfcodes.ManagerStoreError) {
|
|
NewError(ctx, http.StatusInternalServerError, err)
|
|
} else {
|
|
NewError(ctx, http.StatusNotFound, err)
|
|
}
|
|
}
|
|
|
|
// DestroySchedulerCluster godoc
|
|
// @Summary Delete scheduler cluster
|
|
// @Description Delete by clusterId
|
|
// @Tags SchedulerCluster
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Param id path string true "ClusterID"
|
|
// @Success 200 {string} string
|
|
// @Failure 400 {object} HTTPError
|
|
// @Failure 404 {object} HTTPError
|
|
// @Failure 500 {object} HTTPError
|
|
// @Router /scheduler/clusters/{id} [delete]
|
|
func (handler *Handler) DestroySchedulerCluster(ctx *gin.Context) {
|
|
var uri types.SchedulerClusterURI
|
|
if err := ctx.ShouldBindUri(&uri); err != nil {
|
|
NewError(ctx, http.StatusBadRequest, err)
|
|
return
|
|
}
|
|
|
|
retCluster, err := handler.server.DeleteSchedulerCluster(context.TODO(), uri.ClusterID)
|
|
if err == nil {
|
|
if retCluster != nil {
|
|
ctx.JSON(http.StatusOK, "success")
|
|
} else {
|
|
NewError(ctx, http.StatusNotFound, errors.Newf("scheduler cluster not found, id %s", uri.ClusterID))
|
|
}
|
|
} else if dferrors.CheckError(err, dfcodes.InvalidResourceType) {
|
|
NewError(ctx, http.StatusBadRequest, err)
|
|
} else if dferrors.CheckError(err, dfcodes.ManagerStoreError) {
|
|
NewError(ctx, http.StatusInternalServerError, err)
|
|
} else {
|
|
NewError(ctx, http.StatusNotFound, err)
|
|
}
|
|
}
|
|
|
|
// UpdateSchedulerCluster godoc
|
|
// @Summary Update scheduler cluster
|
|
// @Description Update by json scheduler cluster
|
|
// @Tags SchedulerCluster
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Param id path string true "ClusterID"
|
|
// @Param Cluster body types.SchedulerCluster true "SchedulerCluster"
|
|
// @Success 200 {string} string
|
|
// @Failure 400 {object} HTTPError
|
|
// @Failure 404 {object} HTTPError
|
|
// @Failure 500 {object} HTTPError
|
|
// @Router /scheduler/clusters/{id} [post]
|
|
func (handler *Handler) UpdateSchedulerCluster(ctx *gin.Context) {
|
|
var uri types.SchedulerClusterURI
|
|
if err := ctx.ShouldBindUri(&uri); err != nil {
|
|
NewError(ctx, http.StatusBadRequest, err)
|
|
return
|
|
}
|
|
|
|
var cluster types.SchedulerCluster
|
|
if err := ctx.ShouldBindJSON(&cluster); err != nil {
|
|
NewError(ctx, http.StatusBadRequest, err)
|
|
return
|
|
}
|
|
|
|
if err := checkSchedulerClusterValidate(&cluster); err != nil {
|
|
NewError(ctx, http.StatusBadRequest, err)
|
|
return
|
|
}
|
|
|
|
cluster.ClusterID = uri.ClusterID
|
|
_, err := handler.server.UpdateSchedulerCluster(context.TODO(), &cluster)
|
|
if err == nil {
|
|
ctx.JSON(http.StatusOK, "success")
|
|
} else if dferrors.CheckError(err, dfcodes.InvalidResourceType) {
|
|
NewError(ctx, http.StatusBadRequest, err)
|
|
} else if dferrors.CheckError(err, dfcodes.ManagerStoreNotFound) {
|
|
NewError(ctx, http.StatusNotFound, err)
|
|
} else if dferrors.CheckError(err, dfcodes.ManagerStoreError) {
|
|
NewError(ctx, http.StatusInternalServerError, err)
|
|
} else {
|
|
NewError(ctx, http.StatusNotFound, err)
|
|
}
|
|
}
|
|
|
|
// GetSchedulerCluster godoc
|
|
// @Summary Get scheduler cluster
|
|
// @Description Get scheduler cluster by ClusterID
|
|
// @Tags SchedulerCluster
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Param id path string true "ClusterID"
|
|
// @Success 200 {object} types.SchedulerCluster
|
|
// @Failure 400 {object} HTTPError
|
|
// @Failure 404 {object} HTTPError
|
|
// @Failure 500 {object} HTTPError
|
|
// @Router /scheduler/clusters/{id} [get]
|
|
func (handler *Handler) GetSchedulerCluster(ctx *gin.Context) {
|
|
var uri types.SchedulerClusterURI
|
|
if err := ctx.ShouldBindUri(&uri); err != nil {
|
|
NewError(ctx, http.StatusBadRequest, err)
|
|
return
|
|
}
|
|
|
|
retCluster, err := handler.server.GetSchedulerCluster(context.TODO(), uri.ClusterID)
|
|
if err == nil {
|
|
ctx.JSON(http.StatusOK, &retCluster)
|
|
} else if dferrors.CheckError(err, dfcodes.InvalidResourceType) {
|
|
NewError(ctx, http.StatusBadRequest, err)
|
|
} else if dferrors.CheckError(err, dfcodes.ManagerStoreNotFound) {
|
|
NewError(ctx, http.StatusNotFound, err)
|
|
} else if dferrors.CheckError(err, dfcodes.ManagerStoreError) {
|
|
NewError(ctx, http.StatusInternalServerError, err)
|
|
} else {
|
|
NewError(ctx, http.StatusNotFound, err)
|
|
}
|
|
}
|
|
|
|
// ListSchedulerClusters godoc
|
|
// @Summary List scheduler clusters
|
|
// @Description List by object
|
|
// @Tags SchedulerCluster
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Param marker query int true "begin marker of current page" default(0)
|
|
// @Param maxItemCount query int true "return max item count, default 10, max 50" default(10) minimum(10) maximum(50)
|
|
// @Success 200 {object} types.ListSchedulerClustersResponse
|
|
// @Failure 400 {object} HTTPError
|
|
// @Failure 404 {object} HTTPError
|
|
// @Failure 500 {object} HTTPError
|
|
// @Router /scheduler/clusters [get]
|
|
func (handler *Handler) ListSchedulerClusters(ctx *gin.Context) {
|
|
var query types.ListQuery
|
|
if err := ctx.ShouldBindQuery(&query); err != nil {
|
|
NewError(ctx, http.StatusBadRequest, err)
|
|
return
|
|
}
|
|
|
|
clusters, err := handler.server.ListSchedulerClusters(context.TODO(), store.WithMarker(query.Marker, query.MaxItemCount))
|
|
if err == nil {
|
|
if len(clusters) > 0 {
|
|
ctx.JSON(http.StatusOK, &types.ListSchedulerClustersResponse{Clusters: clusters})
|
|
} else {
|
|
NewError(ctx, http.StatusNotFound, errors.Newf("list scheduler clusters empty, marker %d, maxItemCount %d", query.Marker, query.MaxItemCount))
|
|
}
|
|
} else if dferrors.CheckError(err, dfcodes.InvalidResourceType) {
|
|
NewError(ctx, http.StatusBadRequest, err)
|
|
} else if dferrors.CheckError(err, dfcodes.ManagerStoreError) {
|
|
NewError(ctx, http.StatusInternalServerError, err)
|
|
} else {
|
|
NewError(ctx, http.StatusNotFound, err)
|
|
}
|
|
}
|
|
|
|
func checkSchedulerClusterValidate(cluster *types.SchedulerCluster) (err error) {
|
|
var configMap map[string]string
|
|
err = json.Unmarshal([]byte(cluster.Config), &configMap)
|
|
if err != nil {
|
|
err = errors.New("unmarshal scheduler_config error: scheduler_config must map[string]string")
|
|
return
|
|
}
|
|
|
|
var clientConfigMap map[string]string
|
|
err = json.Unmarshal([]byte(cluster.ClientConfig), &clientConfigMap)
|
|
if err != nil {
|
|
err = errors.New("unmarshal client_config error: client_config must map[string]string")
|
|
return
|
|
}
|
|
|
|
return
|
|
}
|