Skip to content

Commit

Permalink
control: add network settings management via ir control (#3059)
Browse files Browse the repository at this point in the history
Closes #2088, #1866.
  • Loading branch information
roman-khimov authored Dec 28, 2024
2 parents 08bd8d3 + 3f32aae commit 6749956
Show file tree
Hide file tree
Showing 32 changed files with 2,749 additions and 119 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ Changelog for NeoFS Node
### Added
- Initial support for meta-on-chain for objects (#2877)
- First split-object part into the CLI output (#3064)
- `neofs-cli control notary` with `list`, `request` and `sign` commands (#3059)

### Fixed
- `neofs-cli object delete` command output (#3056)
Expand Down
20 changes: 20 additions & 0 deletions cmd/neofs-cli/modules/control/notary.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package control

import (
"github.com/spf13/cobra"
)

var notaryCmd = &cobra.Command{
Use: "notary",
Short: "Commands with notary request with alphabet key of inner ring node",
}

func initControlNotaryCmd() {
notaryCmd.AddCommand(listNotaryCmd)
notaryCmd.AddCommand(notaryRequestCmd)
notaryCmd.AddCommand(notarySignCmd)

initControlNotaryListCmd()
initControlNotaryRequestCmd()
initControlNotarySignCmd()
}
74 changes: 74 additions & 0 deletions cmd/neofs-cli/modules/control/notary_list.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
package control

import (
"fmt"

"github.com/nspcc-dev/neo-go/pkg/util"
rawclient "github.com/nspcc-dev/neofs-api-go/v2/rpc/client"
"github.com/nspcc-dev/neofs-node/cmd/neofs-cli/internal/commonflags"
"github.com/nspcc-dev/neofs-node/cmd/neofs-cli/internal/key"
ircontrol "github.com/nspcc-dev/neofs-node/pkg/services/control/ir"
ircontrolsrv "github.com/nspcc-dev/neofs-node/pkg/services/control/ir/server"
"github.com/spf13/cobra"
)

var listNotaryCmd = &cobra.Command{
Use: "list",
Short: "Get list of all notary requests in network",
Long: "Get list of all notary requests in network",
Args: cobra.NoArgs,
RunE: listNotary,
}

func initControlNotaryListCmd() {
initControlFlags(listNotaryCmd)
}

func listNotary(cmd *cobra.Command, _ []string) error {
ctx, cancel := commonflags.GetCommandContext(cmd)
defer cancel()

pk, err := key.Get(cmd)
if err != nil {
return err
}

cli, err := getClient(ctx)
if err != nil {
return err
}

req := new(ircontrol.NotaryListRequest)

req.SetBody(new(ircontrol.NotaryListRequest_Body))

err = ircontrolsrv.SignMessage(pk, req)
if err != nil {
return fmt.Errorf("could not sign request: %w", err)
}

var resp *ircontrol.NotaryListResponse
err = cli.ExecRaw(func(client *rawclient.Client) error {
resp, err = ircontrol.NotaryList(client, req)
return err
})
if err != nil {
return fmt.Errorf("rpc error: %w", err)
}

err = verifyResponse(resp.GetSignature(), resp.GetBody())
if err != nil {
return err
}

txs := resp.GetBody().GetTransactions()

for _, tx := range txs {
hash, err := util.Uint256DecodeBytesBE(tx.GetHash())
if err != nil {
return fmt.Errorf("failed to decode hash: %w", err)
}
cmd.Println(hash.String())
}
return nil
}
112 changes: 112 additions & 0 deletions cmd/neofs-cli/modules/control/notary_request.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
package control

import (
"fmt"
"strings"

"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
"github.com/nspcc-dev/neo-go/pkg/util"
rawclient "github.com/nspcc-dev/neofs-api-go/v2/rpc/client"
"github.com/nspcc-dev/neofs-node/cmd/neofs-cli/internal/commonflags"
"github.com/nspcc-dev/neofs-node/cmd/neofs-cli/internal/key"
ircontrol "github.com/nspcc-dev/neofs-node/pkg/services/control/ir"
ircontrolsrv "github.com/nspcc-dev/neofs-node/pkg/services/control/ir/server"
"github.com/spf13/cobra"
)

const notaryMethodFlag = "method"

var notaryRequestCmd = &cobra.Command{
Use: "request",
Short: "Create and send a notary request",
Long: "Create and send a notary request with one of the following methods:\n" +
"- newEpoch, transaction for creating of new NeoFS epoch event in FS chain, no args\n" +
"- setConfig, transaction to add/update global config value in the NeoFS network, 1 arg in the form key=val\n" +
"- removeNode, transaction to move nodes to the Offline state in the candidates list, 1 arg is the public key of the node",
RunE: notaryRequest,
}

func initControlNotaryRequestCmd() {
initControlFlags(notaryRequestCmd)

flags := notaryRequestCmd.Flags()
flags.String(notaryMethodFlag, "", "Requested method")
}

func notaryRequest(cmd *cobra.Command, args []string) error {
ctx, cancel := commonflags.GetCommandContext(cmd)
defer cancel()

pk, err := key.Get(cmd)
if err != nil {
return err
}

cli, err := getClient(ctx)
if err != nil {
return err
}

req := new(ircontrol.NotaryRequestRequest)
body := new(ircontrol.NotaryRequestRequest_Body)
req.SetBody(body)

method, _ := cmd.Flags().GetString(notaryMethodFlag)
body.SetMethod(method)

switch method {
case "newEpoch":
if len(args) > 0 {
cmd.Println("method 'newEpoch', but the args provided, they will be ignored")
}
case "setConfig":
if len(args) != 1 {
return fmt.Errorf("invalid number of args provided for 'setConfig', expected 1, got %d", len(args))
}

kv := strings.SplitN(args[0], "=", 2)
if len(kv) != 2 {
return fmt.Errorf("invalid parameter format: must be 'key=val', got: %s", args[0])
}

body.SetArgs([][]byte{[]byte(kv[0]), []byte(kv[1])})
case "removeNode":
if len(args) != 1 {
return fmt.Errorf("invalid number of args provided for 'removeNode', expected 1, got %d", len(args))
}
key, err := keys.NewPublicKeyFromString(args[0])
if err != nil {
return err
}

body.SetArgs([][]byte{key.Bytes()})
}

err = ircontrolsrv.SignMessage(pk, req)
if err != nil {
return fmt.Errorf("could not sign request: %w", err)
}

var resp *ircontrol.NotaryRequestResponse
err = cli.ExecRaw(func(client *rawclient.Client) error {
resp, err = ircontrol.NotaryRequest(client, req)
return err
})
if err != nil {
return fmt.Errorf("rpc error: %w", err)
}

err = verifyResponse(resp.GetSignature(), resp.GetBody())
if err != nil {
return err
}

hashB := resp.GetBody().GetHash()

hash, err := util.Uint256DecodeBytesBE(hashB)
if err != nil {
return fmt.Errorf("failed to decode hash %v: %w", hashB, err)
}
cmd.Printf("Transaction Hash: %s\n", hash.String())
return nil
}
75 changes: 75 additions & 0 deletions cmd/neofs-cli/modules/control/notary_sign.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
package control

import (
"fmt"

"github.com/nspcc-dev/neo-go/pkg/util"
rawclient "github.com/nspcc-dev/neofs-api-go/v2/rpc/client"
"github.com/nspcc-dev/neofs-node/cmd/neofs-cli/internal/commonflags"
"github.com/nspcc-dev/neofs-node/cmd/neofs-cli/internal/key"
ircontrol "github.com/nspcc-dev/neofs-node/pkg/services/control/ir"
ircontrolsrv "github.com/nspcc-dev/neofs-node/pkg/services/control/ir/server"
"github.com/spf13/cobra"
)

var notarySignHashFlag string

var notarySignCmd = &cobra.Command{
Use: "sign",
Short: "Sign notary request by its hash",
Long: "Sign notary request by its hash",
Args: cobra.NoArgs,
RunE: notarySign,
}

func initControlNotarySignCmd() {
initControlFlags(notarySignCmd)

flags := notarySignCmd.Flags()
flags.StringVar(&notarySignHashFlag, "hash", "", "hash of the notary request")
}

func notarySign(cmd *cobra.Command, _ []string) error {
ctx, cancel := commonflags.GetCommandContext(cmd)
defer cancel()

pk, err := key.Get(cmd)
if err != nil {
return err
}

cli, err := getClient(ctx)
if err != nil {
return err
}

req := new(ircontrol.NotarySignRequest)
body := new(ircontrol.NotarySignRequest_Body)
req.SetBody(body)
hash, err := util.Uint256DecodeStringBE(notarySignHashFlag)
if err != nil {
return fmt.Errorf("failed to decode hash: %w", err)
}
body.SetHash(hash.BytesBE())

err = ircontrolsrv.SignMessage(pk, req)
if err != nil {
return fmt.Errorf("could not sign request: %w", err)
}

var resp *ircontrol.NotarySignResponse
err = cli.ExecRaw(func(client *rawclient.Client) error {
resp, err = ircontrol.NotarySign(client, req)
return err
})
if err != nil {
return fmt.Errorf("rpc error: %w", err)
}

err = verifyResponse(resp.GetSignature(), resp.GetBody())
if err != nil {
return err
}

return nil
}
2 changes: 2 additions & 0 deletions cmd/neofs-cli/modules/control/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ func init() {
shardsCmd,
synchronizeTreeCmd,
objectCmd,
notaryCmd,
)

initControlHealthCheckCmd()
Expand All @@ -42,4 +43,5 @@ func init() {
initControlShardsCmd()
initControlSynchronizeTreeCmd()
initControlObjectsCmd()
initControlNotaryCmd()
}
1 change: 1 addition & 0 deletions docs/cli-commands/neofs-cli_control.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ Operations with storage node
* [neofs-cli](neofs-cli.md) - Command Line Tool to work with NeoFS
* [neofs-cli control drop-objects](neofs-cli_control_drop-objects.md) - Drop objects from the node's local storage
* [neofs-cli control healthcheck](neofs-cli_control_healthcheck.md) - Health check of the NeoFS node
* [neofs-cli control notary](neofs-cli_control_notary.md) - Commands with notary request with alphabet key of inner ring node
* [neofs-cli control object](neofs-cli_control_object.md) - Direct object operations with storage engine
* [neofs-cli control set-status](neofs-cli_control_set-status.md) - Set status of the storage node in NeoFS network map
* [neofs-cli control shards](neofs-cli_control_shards.md) - Operations with storage node's shards
Expand Down
24 changes: 24 additions & 0 deletions docs/cli-commands/neofs-cli_control_notary.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
## neofs-cli control notary

Commands with notary request with alphabet key of inner ring node

### Options

```
-h, --help help for notary
```

### Options inherited from parent commands

```
-c, --config string Config file (default is $HOME/.config/neofs-cli/config.yaml)
-v, --verbose Verbose output
```

### SEE ALSO

* [neofs-cli control](neofs-cli_control.md) - Operations with storage node
* [neofs-cli control notary list](neofs-cli_control_notary_list.md) - Get list of all notary requests in network
* [neofs-cli control notary request](neofs-cli_control_notary_request.md) - Create and send a notary request
* [neofs-cli control notary sign](neofs-cli_control_notary_sign.md) - Sign notary request by its hash

33 changes: 33 additions & 0 deletions docs/cli-commands/neofs-cli_control_notary_list.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
## neofs-cli control notary list

Get list of all notary requests in network

### Synopsis

Get list of all notary requests in network

```
neofs-cli control notary list [flags]
```

### Options

```
--address string Address of wallet account
--endpoint string Remote node control address (as 'multiaddr' or '<host>:<port>')
-h, --help help for list
-t, --timeout duration Timeout for the operation (default 15s)
-w, --wallet string Path to the wallet
```

### Options inherited from parent commands

```
-c, --config string Config file (default is $HOME/.config/neofs-cli/config.yaml)
-v, --verbose Verbose output
```

### SEE ALSO

* [neofs-cli control notary](neofs-cli_control_notary.md) - Commands with notary request with alphabet key of inner ring node

Loading

0 comments on commit 6749956

Please sign in to comment.