From 8b2aae73c61fd1466ae7fbdf30009fa663aff38f Mon Sep 17 00:00:00 2001 From: Evgenii Stratonikov Date: Tue, 25 Apr 2023 09:06:40 +0300 Subject: [PATCH] [#248] cli: Remove storagegroup commands Signed-off-by: Evgenii Stratonikov --- cmd/frostfs-cli/docs/storage-node-xheaders.md | 1 - cmd/frostfs-cli/modules/root.go | 2 - .../modules/storagegroup/delete.go | 53 ------- cmd/frostfs-cli/modules/storagegroup/get.go | 82 ---------- cmd/frostfs-cli/modules/storagegroup/list.go | 52 ------- cmd/frostfs-cli/modules/storagegroup/put.go | 145 ------------------ cmd/frostfs-cli/modules/storagegroup/root.go | 46 ------ cmd/frostfs-cli/modules/storagegroup/util.go | 45 ------ 8 files changed, 426 deletions(-) delete mode 100644 cmd/frostfs-cli/modules/storagegroup/delete.go delete mode 100644 cmd/frostfs-cli/modules/storagegroup/get.go delete mode 100644 cmd/frostfs-cli/modules/storagegroup/list.go delete mode 100644 cmd/frostfs-cli/modules/storagegroup/put.go delete mode 100644 cmd/frostfs-cli/modules/storagegroup/root.go delete mode 100644 cmd/frostfs-cli/modules/storagegroup/util.go diff --git a/cmd/frostfs-cli/docs/storage-node-xheaders.md b/cmd/frostfs-cli/docs/storage-node-xheaders.md index 15bce457..f86b97ec 100644 --- a/cmd/frostfs-cli/docs/storage-node-xheaders.md +++ b/cmd/frostfs-cli/docs/storage-node-xheaders.md @@ -26,7 +26,6 @@ If set to '0' or not set, only the current epoch is used. List of commands with support of extended headers: * `container list-objects` * `object delete/get/hash/head/lock/put/range/search` -* `storagegroup delete/get/list/put` Example: ```shell diff --git a/cmd/frostfs-cli/modules/root.go b/cmd/frostfs-cli/modules/root.go index cf6d1d40..93513479 100644 --- a/cmd/frostfs-cli/modules/root.go +++ b/cmd/frostfs-cli/modules/root.go @@ -14,7 +14,6 @@ import ( netmapCli "git.frostfs.info/TrueCloudLab/frostfs-node/cmd/frostfs-cli/modules/netmap" objectCli "git.frostfs.info/TrueCloudLab/frostfs-node/cmd/frostfs-cli/modules/object" sessionCli "git.frostfs.info/TrueCloudLab/frostfs-node/cmd/frostfs-cli/modules/session" - sgCli "git.frostfs.info/TrueCloudLab/frostfs-node/cmd/frostfs-cli/modules/storagegroup" "git.frostfs.info/TrueCloudLab/frostfs-node/cmd/frostfs-cli/modules/tree" utilCli "git.frostfs.info/TrueCloudLab/frostfs-node/cmd/frostfs-cli/modules/util" commonCmd "git.frostfs.info/TrueCloudLab/frostfs-node/cmd/internal/common" @@ -84,7 +83,6 @@ func init() { rootCmd.AddCommand(utilCli.Cmd) rootCmd.AddCommand(netmapCli.Cmd) rootCmd.AddCommand(objectCli.Cmd) - rootCmd.AddCommand(sgCli.Cmd) rootCmd.AddCommand(containerCli.Cmd) rootCmd.AddCommand(tree.Cmd) rootCmd.AddCommand(gendoc.Command(rootCmd)) diff --git a/cmd/frostfs-cli/modules/storagegroup/delete.go b/cmd/frostfs-cli/modules/storagegroup/delete.go deleted file mode 100644 index 83751de7..00000000 --- a/cmd/frostfs-cli/modules/storagegroup/delete.go +++ /dev/null @@ -1,53 +0,0 @@ -package storagegroup - -import ( - internalclient "git.frostfs.info/TrueCloudLab/frostfs-node/cmd/frostfs-cli/internal/client" - "git.frostfs.info/TrueCloudLab/frostfs-node/cmd/frostfs-cli/internal/commonflags" - "git.frostfs.info/TrueCloudLab/frostfs-node/cmd/frostfs-cli/internal/key" - objectCli "git.frostfs.info/TrueCloudLab/frostfs-node/cmd/frostfs-cli/modules/object" - commonCmd "git.frostfs.info/TrueCloudLab/frostfs-node/cmd/internal/common" - cid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id" - oid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/id" - "github.com/spf13/cobra" -) - -var sgDelCmd = &cobra.Command{ - Use: "delete", - Short: "Delete storage group from FrostFS", - Long: "Delete storage group from FrostFS", - Run: delSG, -} - -func initSGDeleteCmd() { - commonflags.Init(sgDelCmd) - - flags := sgDelCmd.Flags() - - flags.String(commonflags.CIDFlag, "", commonflags.CIDFlagUsage) - _ = sgDelCmd.MarkFlagRequired(commonflags.CIDFlag) - - flags.StringVarP(&sgID, sgIDFlag, "", "", "Storage group identifier") - _ = sgDelCmd.MarkFlagRequired(sgIDFlag) -} - -func delSG(cmd *cobra.Command, _ []string) { - pk := key.GetOrGenerate(cmd) - - var cnr cid.ID - var obj oid.ID - - addr := readObjectAddress(cmd, &cnr, &obj) - - var prm internalclient.DeleteObjectPrm - objectCli.OpenSession(cmd, &prm, pk, cnr, &obj) - objectCli.Prepare(cmd, &prm) - prm.SetAddress(addr) - - res, err := internalclient.DeleteObject(prm) - commonCmd.ExitOnErr(cmd, "rpc error: %w", err) - - tombstone := res.Tombstone() - - cmd.Println("Storage group removed successfully.") - cmd.Printf(" Tombstone: %s\n", tombstone) -} diff --git a/cmd/frostfs-cli/modules/storagegroup/get.go b/cmd/frostfs-cli/modules/storagegroup/get.go deleted file mode 100644 index c59d3c51..00000000 --- a/cmd/frostfs-cli/modules/storagegroup/get.go +++ /dev/null @@ -1,82 +0,0 @@ -package storagegroup - -import ( - "bytes" - - internalclient "git.frostfs.info/TrueCloudLab/frostfs-node/cmd/frostfs-cli/internal/client" - "git.frostfs.info/TrueCloudLab/frostfs-node/cmd/frostfs-cli/internal/common" - "git.frostfs.info/TrueCloudLab/frostfs-node/cmd/frostfs-cli/internal/commonflags" - "git.frostfs.info/TrueCloudLab/frostfs-node/cmd/frostfs-cli/internal/key" - objectCli "git.frostfs.info/TrueCloudLab/frostfs-node/cmd/frostfs-cli/modules/object" - commonCmd "git.frostfs.info/TrueCloudLab/frostfs-node/cmd/internal/common" - cid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id" - oid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/id" - storagegroupSDK "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/storagegroup" - "github.com/spf13/cobra" -) - -var sgID string - -var sgGetCmd = &cobra.Command{ - Use: "get", - Short: "Get storage group from FrostFS", - Long: "Get storage group from FrostFS", - Run: getSG, -} - -func initSGGetCmd() { - commonflags.Init(sgGetCmd) - - flags := sgGetCmd.Flags() - - flags.String(commonflags.CIDFlag, "", commonflags.CIDFlagUsage) - _ = sgGetCmd.MarkFlagRequired(commonflags.CIDFlag) - - flags.StringVarP(&sgID, sgIDFlag, "", "", "Storage group identifier") - _ = sgGetCmd.MarkFlagRequired(sgIDFlag) - - flags.Bool(sgRawFlag, false, "Set raw request option") -} - -func getSG(cmd *cobra.Command, _ []string) { - var cnr cid.ID - var obj oid.ID - - addr := readObjectAddress(cmd, &cnr, &obj) - pk := key.GetOrGenerate(cmd) - buf := bytes.NewBuffer(nil) - - cli := internalclient.GetSDKClientByFlag(cmd, pk, commonflags.RPC) - - var prm internalclient.GetObjectPrm - objectCli.Prepare(cmd, &prm) - prm.SetClient(cli) - - raw, _ := cmd.Flags().GetBool(sgRawFlag) - prm.SetRawFlag(raw) - prm.SetAddress(addr) - prm.SetPayloadWriter(buf) - - res, err := internalclient.GetObject(prm) - commonCmd.ExitOnErr(cmd, "rpc error: %w", err) - - rawObj := res.Header() - rawObj.SetPayload(buf.Bytes()) - - var sg storagegroupSDK.StorageGroup - - err = storagegroupSDK.ReadFromObject(&sg, *rawObj) - commonCmd.ExitOnErr(cmd, "could not read storage group from the obj: %w", err) - - cmd.Printf("The last active epoch: %d\n", sg.ExpirationEpoch()) - cmd.Printf("Group size: %d\n", sg.ValidationDataSize()) - common.PrintChecksum(cmd, "Group hash", sg.ValidationDataHash) - - if members := sg.Members(); len(members) > 0 { - cmd.Println("Members:") - - for i := range members { - cmd.Printf("\t%s\n", members[i].String()) - } - } -} diff --git a/cmd/frostfs-cli/modules/storagegroup/list.go b/cmd/frostfs-cli/modules/storagegroup/list.go deleted file mode 100644 index 4c12453d..00000000 --- a/cmd/frostfs-cli/modules/storagegroup/list.go +++ /dev/null @@ -1,52 +0,0 @@ -package storagegroup - -import ( - internalclient "git.frostfs.info/TrueCloudLab/frostfs-node/cmd/frostfs-cli/internal/client" - "git.frostfs.info/TrueCloudLab/frostfs-node/cmd/frostfs-cli/internal/commonflags" - "git.frostfs.info/TrueCloudLab/frostfs-node/cmd/frostfs-cli/internal/key" - objectCli "git.frostfs.info/TrueCloudLab/frostfs-node/cmd/frostfs-cli/modules/object" - commonCmd "git.frostfs.info/TrueCloudLab/frostfs-node/cmd/internal/common" - "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/services/object_manager/storagegroup" - cid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id" - "github.com/spf13/cobra" -) - -var sgListCmd = &cobra.Command{ - Use: "list", - Short: "List storage groups in FrostFS container", - Long: "List storage groups in FrostFS container", - Run: listSG, -} - -func initSGListCmd() { - commonflags.Init(sgListCmd) - - sgListCmd.Flags().String(commonflags.CIDFlag, "", commonflags.CIDFlagUsage) - _ = sgListCmd.MarkFlagRequired(commonflags.CIDFlag) -} - -func listSG(cmd *cobra.Command, _ []string) { - var cnr cid.ID - readCID(cmd, &cnr) - - pk := key.GetOrGenerate(cmd) - - cli := internalclient.GetSDKClientByFlag(cmd, pk, commonflags.RPC) - - var prm internalclient.SearchObjectsPrm - objectCli.Prepare(cmd, &prm) - prm.SetClient(cli) - prm.SetContainerID(cnr) - prm.SetFilters(storagegroup.SearchQuery()) - - res, err := internalclient.SearchObjects(prm) - commonCmd.ExitOnErr(cmd, "rpc error: %w", err) - - ids := res.IDList() - - cmd.Printf("Found %d storage groups.\n", len(ids)) - - for i := range ids { - cmd.Println(ids[i].String()) - } -} diff --git a/cmd/frostfs-cli/modules/storagegroup/put.go b/cmd/frostfs-cli/modules/storagegroup/put.go deleted file mode 100644 index f4024a83..00000000 --- a/cmd/frostfs-cli/modules/storagegroup/put.go +++ /dev/null @@ -1,145 +0,0 @@ -package storagegroup - -import ( - "crypto/ecdsa" - "errors" - "fmt" - - internalclient "git.frostfs.info/TrueCloudLab/frostfs-node/cmd/frostfs-cli/internal/client" - "git.frostfs.info/TrueCloudLab/frostfs-node/cmd/frostfs-cli/internal/commonflags" - "git.frostfs.info/TrueCloudLab/frostfs-node/cmd/frostfs-cli/internal/key" - objectCli "git.frostfs.info/TrueCloudLab/frostfs-node/cmd/frostfs-cli/modules/object" - commonCmd "git.frostfs.info/TrueCloudLab/frostfs-node/cmd/internal/common" - "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/services/object_manager/storagegroup" - "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container" - cid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id" - "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object" - oid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/id" - storagegroupSDK "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/storagegroup" - "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/user" - "github.com/spf13/cobra" -) - -const sgMembersFlag = "members" - -var sgMembers []string - -var sgPutCmd = &cobra.Command{ - Use: "put", - Short: "Put storage group to FrostFS", - Long: "Put storage group to FrostFS", - Run: putSG, -} - -func initSGPutCmd() { - commonflags.Init(sgPutCmd) - - flags := sgPutCmd.Flags() - - flags.String(commonflags.CIDFlag, "", commonflags.CIDFlagUsage) - _ = sgPutCmd.MarkFlagRequired(commonflags.CIDFlag) - - flags.StringSliceVarP(&sgMembers, sgMembersFlag, "m", nil, "ID list of storage group members") - _ = sgPutCmd.MarkFlagRequired(sgMembersFlag) - - flags.Uint64(commonflags.Lifetime, 0, "Storage group lifetime in epochs") - _ = sgPutCmd.MarkFlagRequired(commonflags.Lifetime) -} - -func putSG(cmd *cobra.Command, _ []string) { - pk := key.GetOrGenerate(cmd) - - var ownerID user.ID - user.IDFromKey(&ownerID, pk.PublicKey) - - var cnr cid.ID - readCID(cmd, &cnr) - - members := make([]oid.ID, len(sgMembers)) - uniqueFilter := make(map[oid.ID]struct{}, len(sgMembers)) - - for i := range sgMembers { - err := members[i].DecodeString(sgMembers[i]) - commonCmd.ExitOnErr(cmd, "could not parse object ID: %w", err) - - if _, alreadyExists := uniqueFilter[members[i]]; alreadyExists { - commonCmd.ExitOnErr(cmd, "", fmt.Errorf("%s member in not unique", members[i])) - } - - uniqueFilter[members[i]] = struct{}{} - } - - var ( - headPrm internalclient.HeadObjectPrm - putPrm internalclient.PutObjectPrm - getCnrPrm internalclient.GetContainerPrm - ) - - cli := internalclient.GetSDKClientByFlag(cmd, pk, commonflags.RPC) - getCnrPrm.SetClient(cli) - getCnrPrm.SetContainer(cnr) - - resGetCnr, err := internalclient.GetContainer(getCnrPrm) - commonCmd.ExitOnErr(cmd, "get container RPC call: %w", err) - - objectCli.OpenSessionViaClient(cmd, &putPrm, cli, pk, cnr, nil) - objectCli.Prepare(cmd, &headPrm, &putPrm) - - headPrm.SetRawFlag(true) - headPrm.SetClient(cli) - - sg, err := storagegroup.CollectMembers(sgHeadReceiver{ - cmd: cmd, - key: pk, - ownerID: &ownerID, - prm: headPrm, - }, cnr, members, !container.IsHomomorphicHashingDisabled(resGetCnr.Container())) - commonCmd.ExitOnErr(cmd, "could not collect storage group members: %w", err) - - var netInfoPrm internalclient.NetworkInfoPrm - netInfoPrm.SetClient(cli) - - ni, err := internalclient.NetworkInfo(netInfoPrm) - commonCmd.ExitOnErr(cmd, "can't fetch network info: %w", err) - - lifetime, _ := cmd.Flags().GetUint64(commonflags.Lifetime) - sg.SetExpirationEpoch(ni.NetworkInfo().CurrentEpoch() + lifetime) - - obj := object.New() - obj.SetContainerID(cnr) - obj.SetOwnerID(&ownerID) - - storagegroupSDK.WriteToObject(*sg, obj) - - putPrm.SetHeader(obj) - - res, err := internalclient.PutObject(putPrm) - commonCmd.ExitOnErr(cmd, "rpc error: %w", err) - - cmd.Println("Storage group successfully stored") - cmd.Printf(" ID: %s\n CID: %s\n", res.ID(), cnr) -} - -type sgHeadReceiver struct { - cmd *cobra.Command - key *ecdsa.PrivateKey - ownerID *user.ID - prm internalclient.HeadObjectPrm -} - -func (c sgHeadReceiver) Head(addr oid.Address) (any, error) { - c.prm.SetAddress(addr) - - res, err := internalclient.HeadObject(c.prm) - - var errSplitInfo *object.SplitInfoError - - switch { - default: - return nil, err - case err == nil: - return res.Header(), nil - case errors.As(err, &errSplitInfo): - return errSplitInfo.SplitInfo(), nil - } -} diff --git a/cmd/frostfs-cli/modules/storagegroup/root.go b/cmd/frostfs-cli/modules/storagegroup/root.go deleted file mode 100644 index 41331042..00000000 --- a/cmd/frostfs-cli/modules/storagegroup/root.go +++ /dev/null @@ -1,46 +0,0 @@ -package storagegroup - -import ( - "git.frostfs.info/TrueCloudLab/frostfs-node/cmd/frostfs-cli/internal/commonflags" - objectCli "git.frostfs.info/TrueCloudLab/frostfs-node/cmd/frostfs-cli/modules/object" - "github.com/spf13/cobra" -) - -// Cmd represents the storagegroup command. -var Cmd = &cobra.Command{ - Use: "storagegroup", - Short: "Operations with Storage Groups", - Long: `Operations with Storage Groups`, - PersistentPreRun: func(cmd *cobra.Command, args []string) { - // bind exactly that cmd's flags to - // the viper before execution - commonflags.Bind(cmd) - commonflags.BindAPI(cmd) - }, -} - -const ( - sgIDFlag = "id" - sgRawFlag = "raw" -) - -func init() { - storageGroupChildCommands := []*cobra.Command{ - sgPutCmd, - sgGetCmd, - sgListCmd, - sgDelCmd, - } - - Cmd.AddCommand(storageGroupChildCommands...) - - for _, sgCommand := range storageGroupChildCommands { - objectCli.InitBearer(sgCommand) - commonflags.InitAPI(sgCommand) - } - - initSGPutCmd() - initSGGetCmd() - initSGListCmd() - initSGDeleteCmd() -} diff --git a/cmd/frostfs-cli/modules/storagegroup/util.go b/cmd/frostfs-cli/modules/storagegroup/util.go deleted file mode 100644 index 5ca61a58..00000000 --- a/cmd/frostfs-cli/modules/storagegroup/util.go +++ /dev/null @@ -1,45 +0,0 @@ -package storagegroup - -import ( - "fmt" - - "git.frostfs.info/TrueCloudLab/frostfs-node/cmd/frostfs-cli/internal/commonflags" - commonCmd "git.frostfs.info/TrueCloudLab/frostfs-node/cmd/internal/common" - cid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id" - oid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/id" - "github.com/spf13/cobra" -) - -func readObjectAddress(cmd *cobra.Command, cnr *cid.ID, obj *oid.ID) oid.Address { - readCID(cmd, cnr) - readSGID(cmd, obj) - - var addr oid.Address - addr.SetContainer(*cnr) - addr.SetObject(*obj) - return addr -} - -func readCID(cmd *cobra.Command, id *cid.ID) { - f := cmd.Flag(commonflags.CIDFlag) - if f == nil { - commonCmd.ExitOnErr(cmd, "", fmt.Errorf("missing container flag (%s)", commonflags.CIDFlag)) - return - } - - err := id.DecodeString(f.Value.String()) - commonCmd.ExitOnErr(cmd, "decode container ID string: %w", err) -} - -func readSGID(cmd *cobra.Command, id *oid.ID) { - const flag = "id" - - f := cmd.Flag(flag) - if f == nil { - commonCmd.ExitOnErr(cmd, "", fmt.Errorf("missing storage group flag (%s)", flag)) - return - } - - err := id.DecodeString(f.Value.String()) - commonCmd.ExitOnErr(cmd, "decode storage group ID string: %w", err) -}