388 lines
10 KiB
Go
388 lines
10 KiB
Go
package http
|
|
|
|
/*
|
|
import (
|
|
"net/http"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/samber/lo"
|
|
"gitlink.org.cn/cloudream/common/consts/errorcode"
|
|
"gitlink.org.cn/cloudream/common/pkgs/logger"
|
|
"gitlink.org.cn/cloudream/jcs-pub/client/types"
|
|
)
|
|
|
|
type TempService struct {
|
|
*Server
|
|
}
|
|
|
|
func (s *Server) Temp() *TempService {
|
|
return &TempService{
|
|
Server: s,
|
|
}
|
|
}
|
|
|
|
type TempListDetailsResp struct {
|
|
Buckets []BucketDetail `json:"buckets"`
|
|
}
|
|
type BucketDetail struct {
|
|
BucketID types.BucketID `json:"bucketID"`
|
|
Name string `json:"name"`
|
|
ObjectCount int `json:"objectCount"`
|
|
}
|
|
|
|
func (s *TempService) ListDetails(ctx *gin.Context) {
|
|
log := logger.WithField("HTTP", "Bucket.ListBucketsDetails")
|
|
|
|
bkts, err := s.svc.BucketSvc().GetUserBuckets(1)
|
|
if err != nil {
|
|
log.Warnf("getting user buckets: %s", err.Error())
|
|
ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "get user buckets failed"))
|
|
return
|
|
}
|
|
|
|
details := make([]BucketDetail, len(bkts))
|
|
for i := range bkts {
|
|
details[i].BucketID = bkts[i].BucketID
|
|
details[i].Name = bkts[i].Name
|
|
objs, err := s.getBucketObjects(bkts[i].BucketID)
|
|
if err != nil {
|
|
log.Warnf("getting bucket objects: %s", err.Error())
|
|
ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "get bucket objects failed"))
|
|
return
|
|
}
|
|
details[i].ObjectCount = len(objs)
|
|
}
|
|
|
|
ctx.JSON(http.StatusOK, OK(TempListDetailsResp{
|
|
Buckets: details,
|
|
}))
|
|
}
|
|
|
|
type TempGetObjects struct {
|
|
BucketID types.BucketID `form:"bucketID"`
|
|
}
|
|
type BucketGetObjectsResp struct {
|
|
Objects []types.Object `json:"objects"`
|
|
}
|
|
|
|
func (s *TempService) GetObjects(ctx *gin.Context) {
|
|
log := logger.WithField("HTTP", "Bucket.ListBucketsDetails")
|
|
|
|
var req TempGetObjects
|
|
if err := ctx.ShouldBindQuery(&req); err != nil {
|
|
log.Warnf("binding query: %s", err.Error())
|
|
ctx.JSON(http.StatusBadRequest, Failed(errorcode.BadArgument, "missing argument or invalid argument"))
|
|
return
|
|
}
|
|
|
|
objs, err := s.getBucketObjects(req.BucketID)
|
|
if err != nil {
|
|
log.Warnf("getting bucket objects: %s", err.Error())
|
|
ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "get bucket objects failed"))
|
|
return
|
|
}
|
|
|
|
ctx.JSON(http.StatusOK, OK(BucketGetObjectsResp{
|
|
Objects: objs,
|
|
}))
|
|
}
|
|
|
|
type TempGetObjectDetail struct {
|
|
ObjectID types.ObjectID `form:"objectID"`
|
|
}
|
|
type TempGetObjectDetailResp struct {
|
|
Blocks []ObjectBlockDetail `json:"blocks"`
|
|
}
|
|
type ObjectBlockDetail struct {
|
|
ObjectID types.ObjectID `json:"objectID"`
|
|
Type string `json:"type"`
|
|
FileHash types.FileHash `json:"fileHash"`
|
|
LocationType string `json:"locationType"`
|
|
LocationName string `json:"locationName"`
|
|
}
|
|
|
|
func (s *TempService) GetObjectDetail(ctx *gin.Context) {
|
|
log := logger.WithField("HTTP", "Object.GetObjectDetail")
|
|
|
|
var req TempGetObjectDetail
|
|
if err := ctx.ShouldBindQuery(&req); err != nil {
|
|
log.Warnf("binding query: %s", err.Error())
|
|
ctx.JSON(http.StatusBadRequest, Failed(errorcode.BadArgument, "missing argument or invalid argument"))
|
|
return
|
|
}
|
|
|
|
details, err := s.svc.ObjectSvc().GetObjectDetail(req.ObjectID)
|
|
if err != nil {
|
|
log.Warnf("getting object detail: %s", err.Error())
|
|
ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "get object detail failed"))
|
|
return
|
|
}
|
|
if details == nil {
|
|
log.Warnf("object not found")
|
|
ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "object not found"))
|
|
return
|
|
}
|
|
|
|
var allSpaceIDs []types.UserSpaceID
|
|
allSpaceIDs = append(allSpaceIDs, details.PinnedAt...)
|
|
for _, b := range details.Blocks {
|
|
allSpaceIDs = append(allSpaceIDs, b.UserSpaceID)
|
|
}
|
|
|
|
allSpaceIDs = lo.Uniq(allSpaceIDs)
|
|
|
|
getStgs, err := s.svc.StorageSvc().GetDetails(allSpaceIDs)
|
|
if err != nil {
|
|
log.Warnf("getting nodes: %s", err.Error())
|
|
ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "get nodes failed"))
|
|
return
|
|
}
|
|
|
|
allStgs := make(map[types.UserSpaceID]types.UserSpace)
|
|
for _, n := range getStgs {
|
|
if n != nil {
|
|
allStgs[n.Storage.UserSpaceID] = n.UserSpace
|
|
}
|
|
}
|
|
|
|
var blocks []ObjectBlockDetail
|
|
|
|
for _, spaceID := range details.PinnedAt {
|
|
blocks = append(blocks, ObjectBlockDetail{
|
|
Type: "Rep",
|
|
FileHash: details.Object.FileHash,
|
|
LocationType: "Agent",
|
|
LocationName: allStgs[spaceID].Name,
|
|
})
|
|
}
|
|
|
|
switch details.Object.Redundancy.(type) {
|
|
case *types.NoneRedundancy:
|
|
for _, blk := range details.Blocks {
|
|
if !lo.Contains(details.PinnedAt, blk.UserSpaceID) {
|
|
blocks = append(blocks, ObjectBlockDetail{
|
|
Type: "Rep",
|
|
FileHash: blk.FileHash,
|
|
LocationType: "Agent",
|
|
LocationName: allStgs[blk.UserSpaceID].Name,
|
|
})
|
|
}
|
|
}
|
|
case *types.RepRedundancy:
|
|
for _, blk := range details.Blocks {
|
|
if !lo.Contains(details.PinnedAt, blk.UserSpaceID) {
|
|
blocks = append(blocks, ObjectBlockDetail{
|
|
Type: "Rep",
|
|
FileHash: blk.FileHash,
|
|
LocationType: "Agent",
|
|
LocationName: allStgs[blk.UserSpaceID].Name,
|
|
})
|
|
}
|
|
}
|
|
|
|
case *types.ECRedundancy:
|
|
for _, blk := range details.Blocks {
|
|
blocks = append(blocks, ObjectBlockDetail{
|
|
Type: "Block",
|
|
FileHash: blk.FileHash,
|
|
LocationType: "Agent",
|
|
LocationName: allStgs[blk.UserSpaceID].Name,
|
|
})
|
|
}
|
|
}
|
|
|
|
ctx.JSON(http.StatusOK, OK(TempGetObjectDetailResp{
|
|
Blocks: blocks,
|
|
}))
|
|
}
|
|
|
|
func (s *TempService) getBucketObjects(bktID types.BucketID) ([]types.Object, error) {
|
|
pkgs, err := s.svc.PackageSvc().GetBucketPackages(1, bktID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var allObjs []types.Object
|
|
for _, pkg := range pkgs {
|
|
objs, err := s.svc.ObjectSvc().GetPackageObjects(1, pkg.PackageID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
allObjs = append(allObjs, objs...)
|
|
}
|
|
|
|
return allObjs, nil
|
|
}
|
|
|
|
type TempGetDatabaseAll struct {
|
|
}
|
|
type TempGetDatabaseAllResp struct {
|
|
Buckets []BucketDetail `json:"buckets"`
|
|
Objects []BucketObject `json:"objects"`
|
|
Blocks []ObjectBlockDetail `json:"blocks"`
|
|
}
|
|
type BucketObject struct {
|
|
types.Object
|
|
BucketID types.BucketID `json:"bucketID"`
|
|
}
|
|
|
|
func (s *TempService) GetDatabaseAll(ctx *gin.Context) {
|
|
log := logger.WithField("HTTP", "Temp.GetDatabaseAll")
|
|
|
|
db, err := s.svc.ObjectSvc().GetDatabaseAll()
|
|
if err != nil {
|
|
log.Warnf("getting database all: %s", err.Error())
|
|
ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "get database all failed"))
|
|
return
|
|
}
|
|
|
|
var allSpaceIDs []types.UserSpaceID
|
|
for _, obj := range db.Objects {
|
|
allSpaceIDs = append(allSpaceIDs, obj.PinnedAt...)
|
|
for _, blk := range obj.Blocks {
|
|
allSpaceIDs = append(allSpaceIDs, blk.UserSpaceID)
|
|
}
|
|
}
|
|
|
|
getStgs, err := s.svc.StorageSvc().GetDetails(allSpaceIDs)
|
|
if err != nil {
|
|
log.Warnf("getting nodes: %s", err.Error())
|
|
ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "get nodes failed"))
|
|
return
|
|
}
|
|
allStgs := make(map[types.UserSpaceID]types.Storage)
|
|
for _, n := range getStgs {
|
|
if n != nil {
|
|
allStgs[n.Storage.UserSpaceID] = n.Storage
|
|
}
|
|
}
|
|
|
|
bkts := make(map[types.BucketID]*BucketDetail)
|
|
for _, bkt := range db.Buckets {
|
|
bkts[bkt.BucketID] = &BucketDetail{
|
|
BucketID: bkt.BucketID,
|
|
Name: bkt.Name,
|
|
ObjectCount: 0,
|
|
}
|
|
}
|
|
|
|
type PackageDetail struct {
|
|
Package types.Package
|
|
// Loaded []types.Node
|
|
}
|
|
pkgs := make(map[types.PackageID]*PackageDetail)
|
|
for _, pkg := range db.Packages {
|
|
p := PackageDetail{
|
|
Package: pkg,
|
|
// Loaded: make([]types.Node, 0),
|
|
}
|
|
|
|
// loaded, err := s.svc.PackageSvc().GetLoadedNodes(1, pkg.PackageID)
|
|
// if err != nil {
|
|
// log.Warnf("getting loaded nodes: %s", err.Error())
|
|
// ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "get loaded nodes failed"))
|
|
// return
|
|
// }
|
|
|
|
// for _, hubID := range loaded {
|
|
// p.Loaded = append(p.Loaded, allNodes[hubID])
|
|
// }
|
|
|
|
pkgs[pkg.PackageID] = &p
|
|
}
|
|
|
|
var objs []BucketObject
|
|
for _, obj := range db.Objects {
|
|
o := BucketObject{
|
|
Object: obj.Object,
|
|
BucketID: pkgs[obj.Object.PackageID].Package.BucketID,
|
|
}
|
|
objs = append(objs, o)
|
|
}
|
|
|
|
var blocks []ObjectBlockDetail
|
|
for _, obj := range db.Objects {
|
|
bkts[pkgs[obj.Object.PackageID].Package.BucketID].ObjectCount++
|
|
|
|
for _, hubID := range obj.PinnedAt {
|
|
blocks = append(blocks, ObjectBlockDetail{
|
|
ObjectID: obj.Object.ObjectID,
|
|
Type: "Rep",
|
|
FileHash: obj.Object.FileHash,
|
|
LocationType: "Agent",
|
|
LocationName: allStgs[hubID].Name,
|
|
})
|
|
}
|
|
|
|
switch obj.Object.Redundancy.(type) {
|
|
case *types.NoneRedundancy:
|
|
for _, blk := range obj.Blocks {
|
|
if !lo.Contains(obj.PinnedAt, blk.UserSpaceID) {
|
|
blocks = append(blocks, ObjectBlockDetail{
|
|
ObjectID: obj.Object.ObjectID,
|
|
Type: "Rep",
|
|
FileHash: blk.FileHash,
|
|
LocationType: "Agent",
|
|
LocationName: allStgs[blk.UserSpaceID].Name,
|
|
})
|
|
}
|
|
}
|
|
case *types.RepRedundancy:
|
|
for _, blk := range obj.Blocks {
|
|
if !lo.Contains(obj.PinnedAt, blk.UserSpaceID) {
|
|
blocks = append(blocks, ObjectBlockDetail{
|
|
ObjectID: obj.Object.ObjectID,
|
|
Type: "Rep",
|
|
FileHash: blk.FileHash,
|
|
LocationType: "Agent",
|
|
LocationName: allStgs[blk.UserSpaceID].Name,
|
|
})
|
|
}
|
|
}
|
|
|
|
case *types.ECRedundancy:
|
|
for _, blk := range obj.Blocks {
|
|
blocks = append(blocks, ObjectBlockDetail{
|
|
ObjectID: obj.Object.ObjectID,
|
|
Type: "Block",
|
|
FileHash: blk.FileHash,
|
|
LocationType: "Agent",
|
|
LocationName: allStgs[blk.UserSpaceID].Name,
|
|
})
|
|
}
|
|
}
|
|
|
|
// for _, node := range pkgs[obj.Object.PackageID].Loaded {
|
|
// blocks = append(blocks, ObjectBlockDetail{
|
|
// ObjectID: obj.Object.ObjectID,
|
|
// Type: "Rep",
|
|
// FileHash: obj.Object.FileHash,
|
|
// LocationType: "Storage",
|
|
// LocationName: allNodes[node.HubID].Name,
|
|
// })
|
|
// }
|
|
|
|
}
|
|
|
|
ctx.JSON(http.StatusOK, OK(TempGetDatabaseAllResp{
|
|
Buckets: lo.Map(lo.Values(bkts), func(b *BucketDetail, _ int) BucketDetail { return *b }),
|
|
Objects: objs,
|
|
Blocks: blocks,
|
|
}))
|
|
}
|
|
|
|
func initTemp(rt gin.IRoutes, s *Server) {
|
|
rt.GET("/bucket/listDetails", s.Temp().ListDetails)
|
|
rt.GET("/bucket/getObjects", s.Temp().GetObjects)
|
|
rt.GET("/object/getDetail", s.Temp().GetObjectDetail)
|
|
rt.GET("/temp/getDatabaseAll", s.Temp().GetDatabaseAll)
|
|
}
|
|
|
|
func auth(ctx *gin.Context) {
|
|
token := ctx.Request.Header.Get("X-CDS-Auth")
|
|
if token != "cloudream@123" {
|
|
ctx.AbortWithStatus(http.StatusUnauthorized)
|
|
}
|
|
}
|
|
*/
|