From 6eb5260562cb24b32e393c80930201a9ed49233c Mon Sep 17 00:00:00 2001 From: Evgenii Stratonikov Date: Tue, 28 Jun 2022 14:18:54 +0300 Subject: [PATCH] [#1500] neofs-cli: Check if container contains LOCK objects before removal Signed-off-by: Evgenii Stratonikov --- CHANGELOG.md | 1 + cmd/neofs-cli/modules/container/delete.go | 27 +++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9d66f8730..119461d1d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ Changelog for NeoFS Node ### Changed - Require SG members to be unique (#1490) +- `neofs-cli` now doesn't remove container with LOCK objects without `--force` flag (#1500) ### Fixed diff --git a/cmd/neofs-cli/modules/container/delete.go b/cmd/neofs-cli/modules/container/delete.go index 6bb8e2942..981df9f25 100644 --- a/cmd/neofs-cli/modules/container/delete.go +++ b/cmd/neofs-cli/modules/container/delete.go @@ -1,16 +1,20 @@ package container import ( + "fmt" "time" internalclient "github.com/nspcc-dev/neofs-node/cmd/neofs-cli/internal/client" "github.com/nspcc-dev/neofs-node/cmd/neofs-cli/internal/common" "github.com/nspcc-dev/neofs-node/cmd/neofs-cli/internal/commonflags" "github.com/nspcc-dev/neofs-node/cmd/neofs-cli/internal/key" + objectSDK "github.com/nspcc-dev/neofs-sdk-go/object" "github.com/nspcc-dev/neofs-sdk-go/session" "github.com/spf13/cobra" ) +const forceFlag = "force" + var deleteContainerCmd = &cobra.Command{ Use: "delete", Short: "Delete existing container", @@ -30,6 +34,28 @@ Only owner of the container has a permission to remove container.`, pk := key.GetOrGenerate(cmd) cli := internalclient.GetSDKClientByFlag(cmd, pk, commonflags.RPC) + if force, _ := cmd.Flags().GetBool(forceFlag); !force { + fs := objectSDK.NewSearchFilters() + fs.AddTypeFilter(objectSDK.MatchStringEqual, objectSDK.TypeLock) + + var searchPrm internalclient.SearchObjectsPrm + searchPrm.SetClient(cli) + searchPrm.SetContainerID(id) + searchPrm.SetFilters(fs) + searchPrm.SetTTL(2) + + common.PrintVerbose("Searching for LOCK objects...") + + res, err := internalclient.SearchObjects(searchPrm) + common.ExitOnErr(cmd, "can't search for LOCK objects: %w", err) + + if len(res.IDList()) != 0 { + common.ExitOnErr(cmd, "", + fmt.Errorf("Container wasn't removed because LOCK objects were found.\n"+ + "Use --%s flag to remove anyway.", forceFlag)) + } + } + var delPrm internalclient.DeleteContainerPrm delPrm.SetClient(cli) delPrm.SetContainer(id) @@ -72,4 +98,5 @@ func initContainerDeleteCmd() { flags.StringVar(&containerID, "cid", "", "container ID") flags.BoolVar(&containerAwait, "await", false, "block execution until container is removed") + flags.Bool(forceFlag, false, "do not check whether container contains locks and remove immediately") }