package control import ( "crypto/sha256" "errors" rawclient "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/rpc/client" "git.frostfs.info/TrueCloudLab/frostfs-node/cmd/frostfs-cli/internal/commonflags" "git.frostfs.info/TrueCloudLab/frostfs-node/cmd/frostfs-cli/internal/key" commonCmd "git.frostfs.info/TrueCloudLab/frostfs-node/cmd/internal/common" "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/services/control" "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/services/control/server/ctrlmessage" cid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id" "github.com/spf13/cobra" ) const ( synchronizeTreeIDFlag = "tree-id" synchronizeTreeHeightFlag = "height" ) var synchronizeTreeCmd = &cobra.Command{ Use: "synchronize-tree", Short: "Synchronize log for the tree", Long: "Synchronize log for the tree in an object tree service.", Run: synchronizeTree, } func initControlSynchronizeTreeCmd() { initControlFlags(synchronizeTreeCmd) flags := synchronizeTreeCmd.Flags() flags.String(commonflags.CIDFlag, "", commonflags.CIDFlagUsage) flags.String(synchronizeTreeIDFlag, "", "Tree ID") flags.Uint64(synchronizeTreeHeightFlag, 0, "Starting height") } func synchronizeTree(cmd *cobra.Command, _ []string) { pk := key.Get(cmd) var cnr cid.ID cidStr, _ := cmd.Flags().GetString(commonflags.CIDFlag) commonCmd.ExitOnErr(cmd, "can't decode container ID: %w", cnr.DecodeString(cidStr)) treeID, _ := cmd.Flags().GetString("tree-id") if treeID == "" { commonCmd.ExitOnErr(cmd, "", errors.New("tree ID must not be empty")) } height, _ := cmd.Flags().GetUint64("height") rawCID := make([]byte, sha256.Size) cnr.Encode(rawCID) req := &control.SynchronizeTreeRequest{ Body: &control.SynchronizeTreeRequest_Body{ ContainerId: rawCID, TreeId: treeID, Height: height, }, } err := ctrlmessage.Sign(pk, req) commonCmd.ExitOnErr(cmd, "could not sign request: %w", err) cli := getClient(cmd, pk) var resp *control.SynchronizeTreeResponse err = cli.ExecRaw(func(client *rawclient.Client) error { resp, err = control.SynchronizeTree(client, req) return err }) commonCmd.ExitOnErr(cmd, "rpc error: %w", err) verifyResponse(cmd, resp.GetSignature(), resp.GetBody()) cmd.Println("Tree has been synchronized successfully.") }