dragonfly/manager/apis/v2/handler/cdn_cluster.go

212 lines
6.6 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"
)
// CreateCDNCluster godoc
// @Summary Add cdn cluster
// @Description add by json config
// @Tags CDNCluster
// @Accept json
// @Produce json
// @Param cluster body types.CDNCluster true "Cdn cluster"
// @Success 200 {object} types.CDNCluster
// @Failure 400 {object} HTTPError
// @Failure 404 {object} HTTPError
// @Failure 500 {object} HTTPError
// @Router /cdn/clusters [post]
func (handler *Handler) CreateCDNCluster(ctx *gin.Context) {
var cluster types.CDNCluster
if err := ctx.ShouldBindJSON(&cluster); err != nil {
NewError(ctx, http.StatusBadRequest, err)
return
}
if err := checkCDNClusterValidate(&cluster); err != nil {
NewError(ctx, http.StatusBadRequest, err)
return
}
retCluster, err := handler.server.AddCDNCluster(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)
}
}
// DestroyCDNCluster godoc
// @Summary Delete cdn cluster
// @Description Delete by clusterId
// @Tags CDNCluster
// @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 /cdn/clusters/{id} [delete]
func (handler *Handler) DestroyCDNCluster(ctx *gin.Context) {
var uri types.CDNClusterURI
if err := ctx.ShouldBindUri(&uri); err != nil {
NewError(ctx, http.StatusBadRequest, err)
return
}
retCluster, err := handler.server.DeleteCDNCluster(context.TODO(), uri.ClusterID)
if err == nil {
if retCluster != nil {
ctx.JSON(http.StatusOK, "success")
} else {
NewError(ctx, http.StatusNotFound, errors.Newf("cdn 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)
}
}
// UpdateCDNCluster godoc
// @Summary Update cdn cluster
// @Description Update by json cdn cluster
// @Tags CDNCluster
// @Accept json
// @Produce json
// @Param id path string true "ClusterID"
// @Param Cluster body types.CDNCluster true "CDNCluster"
// @Success 200 {string} string
// @Failure 400 {object} HTTPError
// @Failure 404 {object} HTTPError
// @Failure 500 {object} HTTPError
// @Router /cdn/clusters/{id} [post]
func (handler *Handler) UpdateCDNCluster(ctx *gin.Context) {
var uri types.CDNClusterURI
if err := ctx.ShouldBindUri(&uri); err != nil {
NewError(ctx, http.StatusBadRequest, err)
return
}
var cluster types.CDNCluster
if err := ctx.ShouldBindJSON(&cluster); err != nil {
NewError(ctx, http.StatusBadRequest, err)
return
}
if err := checkCDNClusterValidate(&cluster); err != nil {
NewError(ctx, http.StatusBadRequest, err)
return
}
cluster.ClusterID = uri.ClusterID
_, err := handler.server.UpdateCDNCluster(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)
}
}
// GetCDNCluster godoc
// @Summary Get cdn cluster
// @Description Get cdn cluster by ClusterID
// @Tags CDNCluster
// @Accept json
// @Produce json
// @Param id path string true "ClusterID"
// @Success 200 {object} types.CDNCluster
// @Failure 400 {object} HTTPError
// @Failure 404 {object} HTTPError
// @Failure 500 {object} HTTPError
// @Router /cdn/clusters/{id} [get]
func (handler *Handler) GetCDNCluster(ctx *gin.Context) {
var uri types.CDNClusterURI
if err := ctx.ShouldBindUri(&uri); err != nil {
NewError(ctx, http.StatusBadRequest, err)
return
}
retCluster, err := handler.server.GetCDNCluster(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)
}
}
// ListCDNClusters godoc
// @Summary List cdn clusters
// @Description List by object
// @Tags CDNCluster
// @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.ListCDNClustersResponse
// @Failure 400 {object} HTTPError
// @Failure 404 {object} HTTPError
// @Failure 500 {object} HTTPError
// @Router /cdn/clusters [get]
func (handler *Handler) ListCDNClusters(ctx *gin.Context) {
var query types.ListQuery
if err := ctx.ShouldBindQuery(&query); err != nil {
NewError(ctx, http.StatusBadRequest, err)
return
}
clusters, err := handler.server.ListCDNClusters(context.TODO(), store.WithMarker(query.Marker, query.MaxItemCount))
if err == nil {
if len(clusters) > 0 {
ctx.JSON(http.StatusOK, &types.ListCDNClustersResponse{Clusters: clusters})
} else {
NewError(ctx, http.StatusNotFound, errors.Newf("list cdn 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 checkCDNClusterValidate(cluster *types.CDNCluster) (err error) {
var cdnConfigMap map[string]string
err = json.Unmarshal([]byte(cluster.Config), &cdnConfigMap)
if err != nil {
err = errors.New("unmarshal cdn_config error: cdn_config must map[string]string")
return
}
return
}