diff --git a/cmd/frostfs-adm/internal/modules/morph/ape/ape.go b/cmd/frostfs-adm/internal/modules/morph/ape/ape.go index fc572f5f..710595fe 100644 --- a/cmd/frostfs-adm/internal/modules/morph/ape/ape.go +++ b/cmd/frostfs-adm/internal/modules/morph/ape/ape.go @@ -82,6 +82,15 @@ var ( }, Run: getAdmin, } + + listTargetsCmd = &cobra.Command{ + Use: "list-targets", + Short: "List targets", + PreRun: func(cmd *cobra.Command, _ []string) { + _ = viper.BindPFlag(commonflags.EndpointFlag, cmd.Flags().Lookup(commonflags.EndpointFlag)) + }, + Run: listTargets, + } ) func initAddRuleChainCmd() { @@ -146,6 +155,14 @@ func initGetAdminCmd() { getAdminCmd.Flags().StringP(commonflags.EndpointFlag, commonflags.EndpointFlagShort, "", commonflags.EndpointFlagDesc) } +func initListTargetsCmd() { + Cmd.AddCommand(listTargetsCmd) + + listTargetsCmd.Flags().StringP(commonflags.EndpointFlag, commonflags.EndpointFlagShort, "", commonflags.EndpointFlagDesc) + listTargetsCmd.Flags().StringP(targetTypeFlag, "t", "", targetTypeDesc) + _ = listTargetsCmd.MarkFlagRequired(targetTypeFlag) +} + func addRuleChain(cmd *cobra.Command, _ []string) { chain := parseChain(cmd) target := parseTarget(cmd) @@ -215,6 +232,29 @@ func getAdmin(cmd *cobra.Command, _ []string) { cmd.Println(addr.StringLE()) } +func listTargets(cmd *cobra.Command, _ []string) { + typ, err := parseTargetType(cmd) + commonCmd.ExitOnErr(cmd, "parse target type error: %w", err) + pci, inv := newPolicyContractReaderInterface(cmd) + + sid, it, err := pci.ListTargetsIterator(typ) + commonCmd.ExitOnErr(cmd, "list targets error: %w", err) + items, err := inv.TraverseIterator(sid, &it, 0) + for err == nil && len(items) != 0 { + for _, item := range items { + bts, err := item.TryBytes() + commonCmd.ExitOnErr(cmd, "list targets error: %w", err) + if len(bts) == 0 { + cmd.Println("(no name)") + } else { + cmd.Println(string(bts)) + } + } + items, err = inv.TraverseIterator(sid, &it, 0) + commonCmd.ExitOnErr(cmd, "unable to list targets: %w", err) + } +} + func prettyJSONFormat(cmd *cobra.Command, chains []*apechain.Chain) { wr := bytes.NewBufferString("") data, err := json.Marshal(chains) diff --git a/cmd/frostfs-adm/internal/modules/morph/ape/ape_util.go b/cmd/frostfs-adm/internal/modules/morph/ape/ape_util.go index 253e130a..b3610e7f 100644 --- a/cmd/frostfs-adm/internal/modules/morph/ape/ape_util.go +++ b/cmd/frostfs-adm/internal/modules/morph/ape/ape_util.go @@ -36,24 +36,27 @@ var ( ) func parseTarget(cmd *cobra.Command) policyengine.Target { - var targetType policyengine.TargetType - typ, _ := cmd.Flags().GetString(targetTypeFlag) - switch typ { - case namespaceTarget: - targetType = policyengine.Namespace - case containerTarget: - targetType = policyengine.Container - default: - commonCmd.ExitOnErr(cmd, "read target type error: %w", errUnknownTargetType) - } name, _ := cmd.Flags().GetString(targetNameFlag) + typ, err := parseTargetType(cmd) + commonCmd.ExitOnErr(cmd, "read target type error: %w", err) return policyengine.Target{ Name: name, - Type: targetType, + Type: typ, } } +func parseTargetType(cmd *cobra.Command) (policyengine.TargetType, error) { + typ, _ := cmd.Flags().GetString(targetTypeFlag) + switch typ { + case namespaceTarget: + return policyengine.Namespace, nil + case containerTarget: + return policyengine.Container, nil + } + return -1, errUnknownTargetType +} + func parseChainID(cmd *cobra.Command) apechain.ID { chainID, _ := cmd.Flags().GetString(chainIDFlag) if chainID == "" { diff --git a/cmd/frostfs-adm/internal/modules/morph/ape/root.go b/cmd/frostfs-adm/internal/modules/morph/ape/root.go index 11b6894c..a4746cd2 100644 --- a/cmd/frostfs-adm/internal/modules/morph/ape/root.go +++ b/cmd/frostfs-adm/internal/modules/morph/ape/root.go @@ -13,4 +13,5 @@ func init() { initListRuleChainsCmd() initSetAdminCmd() initGetAdminCmd() + initListTargetsCmd() }