Browse Source

将所有命令都使用cmdtrie来管理

gitlink
Sydonian 2 years ago
parent
commit
b47580647c
9 changed files with 59 additions and 190 deletions
  1. +1
    -1
      internal/cmdline/agent.go
  2. +14
    -7
      internal/cmdline/bucket.go
  3. +12
    -163
      internal/cmdline/commandline.go
  4. +23
    -12
      internal/cmdline/object.go
  5. +1
    -1
      internal/cmdline/scanner.go
  6. +5
    -3
      internal/cmdline/storage.go
  7. +1
    -1
      internal/services/bucket.go
  8. +1
    -1
      internal/services/object.go
  9. +1
    -1
      internal/services/storage.go

+ 1
- 1
internal/cmdline/agent.go View File

@@ -11,7 +11,7 @@ import (
var parseAgentEventCmdTrie cmdtrie.StaticCommandTrie[any] = cmdtrie.NewStaticCommandTrie[any]()

func AgentPostEvent(ctx CommandContext, nodeID int, args []string) error {
ret, err := parseAgentEventCmdTrie.Execute(args...)
ret, err := parseAgentEventCmdTrie.Execute(args, cmdtrie.ExecuteOption{ReplaceEmptyArrayWithNil: true})
if err != nil {
return fmt.Errorf("execute parsing event command failed, err: %w", err)
}


+ 14
- 7
internal/cmdline/bucket.go View File

@@ -4,13 +4,12 @@ import (
"fmt"

"github.com/jedib0t/go-pretty/v6/table"
"gitlink.org.cn/cloudream/client/internal/services"
)

func (c *Commandline) ListUserBuckets() error {
func BucketListUserBuckets(ctx CommandContext) error {
userID := 0

buckets, err := services.BucketSvc(c.Svc).GetUserBuckets(userID)
buckets, err := ctx.Cmdline.Svc.BucketSvc().GetUserBuckets(userID)
if err != nil {
return err
}
@@ -28,10 +27,10 @@ func (c *Commandline) ListUserBuckets() error {
return nil
}

func (c *Commandline) CreateBucket(bucketName string) error {
func BucketCreateBucket(ctx CommandContext, bucketName string) error {
userID := 0

bucketID, err := services.BucketSvc(c.Svc).CreateBucket(userID, bucketName)
bucketID, err := ctx.Cmdline.Svc.BucketSvc().CreateBucket(userID, bucketName)
if err != nil {
return err
}
@@ -40,10 +39,10 @@ func (c *Commandline) CreateBucket(bucketName string) error {
return nil
}

func (c *Commandline) DeleteBucket(bucketID int) error {
func BucketDeleteBucket(ctx CommandContext, bucketID int) error {
userID := 0

err := services.BucketSvc(c.Svc).DeleteBucket(userID, bucketID)
err := ctx.Cmdline.Svc.BucketSvc().DeleteBucket(userID, bucketID)
if err != nil {
return err
}
@@ -51,3 +50,11 @@ func (c *Commandline) DeleteBucket(bucketID int) error {
fmt.Printf("Delete bucket %d success ", bucketID)
return nil
}

func init() {
commands.MustAdd(BucketListUserBuckets, "bucket", "ls")

commands.MustAdd(BucketCreateBucket, "bucket", "new")

commands.MustAdd(BucketDeleteBucket, "bucket", "delete")
}

+ 12
- 163
internal/cmdline/commandline.go View File

@@ -3,9 +3,7 @@ package cmdline
import (
"fmt"
"os"
"strconv"

"gitlink.org.cn/cloudream/client/internal/config"
"gitlink.org.cn/cloudream/client/internal/services"
"gitlink.org.cn/cloudream/common/pkg/cmdtrie"
)
@@ -27,166 +25,17 @@ func NewCommandline(svc *services.Service) (*Commandline, error) {
}

func (c *Commandline) DispatchCommand(allArgs []string) {
cmd := allArgs[0]
args := allArgs[1:]

switch cmd {
case "read":
objectID, err := strconv.Atoi(args[1])
if err != nil {
fmt.Printf("invalid object id %s, err: %s", args[1], err.Error())
os.Exit(1)
}

if err := c.Read(args[0], objectID); err != nil {
fmt.Printf("read failed, err: %s", err.Error())
os.Exit(1)
}

case "write":
bucketID, err := strconv.Atoi(args[1])
if err != nil {
fmt.Printf("invalid bucket id %s, err: %s", args[1], err.Error())
os.Exit(1)
}
repCount, _ := strconv.Atoi(args[3])
if repCount <= 0 || repCount > config.Cfg().MaxRepCount {
fmt.Printf("replicate number should not be more than %d", config.Cfg().MaxRepCount)
os.Exit(1)
}

if err := c.RepWrite(args[0], bucketID, args[2], repCount); err != nil {
fmt.Printf("rep write failed, err: %s", err.Error())
os.Exit(1)
}
case "ecWrite":
bucketID, err := strconv.Atoi(args[1])
if err != nil {
fmt.Printf("invalid bucket id %s, err: %s", args[1], err.Error())
os.Exit(1)
}
if err := c.EcWrite(args[0], bucketID, args[2], args[3]); err != nil {
fmt.Printf("ec write failed, err: %s", err.Error())
os.Exit(1)
}

case "storage":
if len(args) == 0 {
fmt.Printf("need more arg")
os.Exit(1)
}
cmd := args[0]

switch cmd {
case "move":
objectID, err := strconv.Atoi(args[1])
if err != nil {
fmt.Printf("invalid object id %s, err: %s", args[1], err.Error())
os.Exit(1)
}
stgID, err := strconv.Atoi(args[2])
if err != nil {
fmt.Printf("invalid storage id %s, err: %s", args[2], err.Error())
os.Exit(1)
}

if err := c.MoveObjectToStorage(objectID, stgID); err != nil {
fmt.Printf("move failed, err: %s", err.Error())
os.Exit(1)
}
}

case "bucket":
if len(args) == 0 {
fmt.Printf("need more arg")
os.Exit(1)
}
cmd := args[0]

switch cmd {
case "ls":
if err := c.ListUserBuckets(); err != nil {
fmt.Printf("get user buckets failed, err: %s", err.Error())
os.Exit(1)
}

case "new":
if err := c.CreateBucket(args[1]); err != nil {
fmt.Printf("create bucket failed, err: %s", err.Error())
os.Exit(1)
}

case "delete":
bucketID, err := strconv.Atoi(args[1])
if err != nil {
fmt.Printf("invalid bucket id %s, err: %s", args[1], err.Error())
os.Exit(1)
}

if err := c.DeleteBucket(bucketID); err != nil {
fmt.Printf("delete bucket failed, err: %s", err.Error())
os.Exit(1)
}
}

case "object":
if len(args) == 0 {
fmt.Printf("need more arg")
os.Exit(1)
}

switch args[0] {
case "ls":
bucketID, err := strconv.Atoi(args[1])
if err != nil {
fmt.Printf("invalid bucket id %s, err: %s", args[1], err.Error())
os.Exit(1)
}

if err := c.ListBucketObjects(bucketID); err != nil {
fmt.Printf("get bucket objects failed, err: %s", err.Error())
os.Exit(1)
}

case "update":
objectID, err := strconv.Atoi(args[1])
if err != nil {
fmt.Printf("invalid object id %s, err: %s", args[1], err.Error())
os.Exit(1)
}

if err := c.UpdateRepObject(objectID, args[2]); err != nil {
fmt.Printf("delete object failed, err: %s", err.Error())
os.Exit(1)
}

case "delete":
objectID, err := strconv.Atoi(args[1])
if err != nil {
fmt.Printf("invalid object id %s, err: %s", args[1], err.Error())
os.Exit(1)
}

if err := c.DeleteObject(objectID); err != nil {
fmt.Printf("delete object failed, err: %s", err.Error())
os.Exit(1)
}
}

default:
// TODO 将上面的命令也用cmdTrie管理
cmdCtx := CommandContext{
Cmdline: c,
}
cmdErr, err := commands.Execute(cmdCtx, allArgs...)
if err != nil {
fmt.Printf("execute command failed, err: %s", err.Error())
os.Exit(1)
}
if cmdErr != nil {
fmt.Printf("execute command failed, err: %s", err.Error())
os.Exit(1)
}
// TODO 需要区分nil数组和空数组
cmdCtx := CommandContext{
Cmdline: c,
}
cmdErr, err := commands.Execute(cmdCtx, allArgs, cmdtrie.ExecuteOption{ReplaceEmptyArrayWithNil: true})
if err != nil {
fmt.Printf("execute command failed, err: %s", err.Error())
os.Exit(1)
}
if cmdErr != nil {
fmt.Printf("execute command failed, err: %s", cmdErr.Error())
os.Exit(1)
}

}

+ 23
- 12
internal/cmdline/object.go View File

@@ -7,13 +7,12 @@ import (
"path/filepath"

"github.com/jedib0t/go-pretty/v6/table"
"gitlink.org.cn/cloudream/client/internal/services"
)

func (c *Commandline) ListBucketObjects(bucketID int) error {
func ObjectListBucketObjects(ctx CommandContext, bucketID int) error {
userID := 0

objects, err := services.BucketSvc(c.Svc).GetBucketObjects(userID, bucketID)
objects, err := ctx.Cmdline.Svc.BucketSvc().GetBucketObjects(userID, bucketID)
if err != nil {
return err
}
@@ -31,7 +30,7 @@ func (c *Commandline) ListBucketObjects(bucketID int) error {
return nil
}

func (c *Commandline) Read(localFilePath string, objectID int) error {
func ObjectDownloadObject(ctx CommandContext, localFilePath string, objectID int) error {
// 创建本地文件
curExecPath, err := os.Executable()
if err != nil {
@@ -53,7 +52,7 @@ func (c *Commandline) Read(localFilePath string, objectID int) error {
defer outputFile.Close()

// 下载文件
reader, err := services.ObjectSvc(c.Svc).DownloadObject(0, objectID)
reader, err := ctx.Cmdline.Svc.ObjectSvc().DownloadObject(0, objectID)
if err != nil {
return fmt.Errorf("download object failed, err: %w", err)
}
@@ -68,7 +67,7 @@ func (c *Commandline) Read(localFilePath string, objectID int) error {
return nil
}

func (c *Commandline) RepWrite(localFilePath string, bucketID int, objectName string, repCount int) error {
func ObjectUploadRepObject(ctx CommandContext, localFilePath string, bucketID int, objectName string, repCount int) error {
file, err := os.Open(localFilePath)
if err != nil {
return fmt.Errorf("open file %s failed, err: %w", localFilePath, err)
@@ -81,7 +80,7 @@ func (c *Commandline) RepWrite(localFilePath string, bucketID int, objectName st
}
fileSize := fileInfo.Size()

err = services.ObjectSvc(c.Svc).UploadRepObject(0, bucketID, objectName, file, fileSize, repCount)
err = ctx.Cmdline.Svc.ObjectSvc().UploadRepObject(0, bucketID, objectName, file, fileSize, repCount)
if err != nil {
return fmt.Errorf("upload file data failed, err: %w", err)
}
@@ -89,12 +88,12 @@ func (c *Commandline) RepWrite(localFilePath string, bucketID int, objectName st
return nil
}

func (c *Commandline) EcWrite(localFilePath string, bucketID int, objectName string, ecName string) error {
func ObjectEcWrite(ctx CommandContext, localFilePath string, bucketID int, objectName string, ecName string) error {
// TODO
panic("not implement yet")
}

func (c *Commandline) UpdateRepObject(objectID int, filePath string) error {
func ObjectUpdateRepObject(ctx CommandContext, objectID int, filePath string) error {
userID := 0

file, err := os.Open(filePath)
@@ -109,7 +108,7 @@ func (c *Commandline) UpdateRepObject(objectID int, filePath string) error {
}
fileSize := fileInfo.Size()

err = services.ObjectSvc(c.Svc).UpdateRepObject(userID, objectID, file, fileSize)
err = ctx.Cmdline.Svc.ObjectSvc().UpdateRepObject(userID, objectID, file, fileSize)
if err != nil {
return fmt.Errorf("update object %d failed, err: %w", objectID, err)
}
@@ -117,11 +116,23 @@ func (c *Commandline) UpdateRepObject(objectID int, filePath string) error {
return nil
}

func (c *Commandline) DeleteObject(objectID int) error {
func ObjectDeleteObject(ctx CommandContext, objectID int) error {
userID := 0
err := services.ObjectSvc(c.Svc).DeleteObject(userID, objectID)
err := ctx.Cmdline.Svc.ObjectSvc().DeleteObject(userID, objectID)
if err != nil {
return fmt.Errorf("delete object %d failed, err: %w", objectID, err)
}
return nil
}

func init() {
commands.MustAdd(ObjectListBucketObjects, "object", "ls")

commands.MustAdd(ObjectUploadRepObject, "object", "new", "rep")

commands.MustAdd(ObjectDownloadObject, "object", "get")

commands.MustAdd(ObjectUpdateRepObject, "object", "update", "rep")

commands.MustAdd(ObjectDeleteObject, "object", "delete")
}

+ 1
- 1
internal/cmdline/scanner.go View File

@@ -11,7 +11,7 @@ import (
var parseScannerEventCmdTrie cmdtrie.StaticCommandTrie[any] = cmdtrie.NewStaticCommandTrie[any]()

func ScannerPostEvent(ctx CommandContext, args []string) error {
ret, err := parseScannerEventCmdTrie.Execute(args...)
ret, err := parseScannerEventCmdTrie.Execute(args, cmdtrie.ExecuteOption{ReplaceEmptyArrayWithNil: true})
if err != nil {
return fmt.Errorf("execute parsing event command failed, err: %w", err)
}


+ 5
- 3
internal/cmdline/storage.go View File

@@ -1,7 +1,9 @@
package cmdline

import "gitlink.org.cn/cloudream/client/internal/services"
func StorageMoveObjectToStorage(ctx CommandContext, objectID int, storageID int) error {
return ctx.Cmdline.Svc.StorageSvc().MoveObjectToStorage(0, objectID, storageID)
}

func (c *Commandline) MoveObjectToStorage(objectID int, storageID int) error {
return services.StorageSvc(c.Svc).MoveObjectToStorage(0, objectID, storageID)
func init() {
commands.MustAdd(StorageMoveObjectToStorage, "storage", "move")
}

+ 1
- 1
internal/services/bucket.go View File

@@ -11,7 +11,7 @@ type BucketService struct {
*Service
}

func BucketSvc(svc *Service) *BucketService {
func (svc *Service) BucketSvc() *BucketService {
return &BucketService{Service: svc}
}



+ 1
- 1
internal/services/object.go View File

@@ -28,7 +28,7 @@ type ObjectService struct {
*Service
}

func ObjectSvc(svc *Service) *ObjectService {
func (svc *Service) ObjectSvc() *ObjectService {
return &ObjectService{Service: svc}
}



+ 1
- 1
internal/services/storage.go View File

@@ -13,7 +13,7 @@ type StorageService struct {
*Service
}

func StorageSvc(svc *Service) *StorageService {
func (svc *Service) StorageSvc() *StorageService {
return &StorageService{Service: svc}
}



Loading…
Cancel
Save