diff --git a/cmd/frostfs-cli/modules/container/policy_playground.go b/cmd/frostfs-cli/modules/container/policy_playground.go index 97e30a3c..7e9d72a0 100644 --- a/cmd/frostfs-cli/modules/container/policy_playground.go +++ b/cmd/frostfs-cli/modules/container/policy_playground.go @@ -3,6 +3,7 @@ package container import ( "bufio" "encoding/hex" + "encoding/json" "fmt" "io" "os" @@ -39,7 +40,7 @@ func (repl *policyPlaygroundREPL) handleLs(args []string) error { for id, node := range repl.nodes { var attrs []string node.IterateAttributes(func(k, v string) { - attrs = append(attrs, fmt.Sprintf("%s:%s", k, v)) + attrs = append(attrs, fmt.Sprintf("%s:%q", k, v)) }) fmt.Printf("\t%2d: id=%s attrs={%v}\n", i, id, strings.Join(attrs, " ")) i++ @@ -69,6 +70,40 @@ func (repl *policyPlaygroundREPL) handleAdd(args []string) error { return nil } +func (repl *policyPlaygroundREPL) handleLoad(args []string) error { + if len(args) != 1 { + return fmt.Errorf("too few arguments for command 'add': got %d, want 1", len(args)) + } + + jsonNetmap := map[string]map[string]string{} + + b, err := os.ReadFile(args[0]) + if err != nil { + return fmt.Errorf("reading netmap file %q: %v", args[0], err) + } + + if err := json.Unmarshal(b, &jsonNetmap); err != nil { + return fmt.Errorf("decoding json netmap: %v", err) + } + + repl.nodes = make(map[string]netmap.NodeInfo) + for id, attrs := range jsonNetmap { + key, err := hex.DecodeString(id) + if err != nil { + return fmt.Errorf("node id must be a hex string: got %q: %v", id, err) + } + + node := repl.nodes[id] + node.SetPublicKey(key) + for k, v := range attrs { + node.SetAttribute(k, v) + } + repl.nodes[id] = node + } + + return nil +} + func (repl *policyPlaygroundREPL) handleRemove(args []string) error { if len(args) == 0 { return fmt.Errorf("too few arguments for command 'remove': got %d, want >0", len(args)) @@ -150,6 +185,7 @@ func (repl *policyPlaygroundREPL) run() error { cmdHandlers := map[string]func([]string) error{ "ls": repl.handleLs, "add": repl.handleAdd, + "load": repl.handleLoad, "remove": repl.handleRemove, "eval": repl.handleEval, }