Skip to content

Commit

Permalink
control: add network management via ir control
Browse files Browse the repository at this point in the history
New `neofs-cli control notary` with `list`, `request` and `sign` commands.
- `list` - get list of all notary requests from notary pool.
- `request` - send a notary request with one of the following methods:
`newEpoch`, `setConfig` and `removeNode`.
- `sign` - sign the notary request using a hash.

Closes #2088, #1866.

Signed-off-by: Andrey Butusov <[email protected]>
  • Loading branch information
End-rey committed Dec 23, 2024
1 parent 373a6e0 commit 742d111
Show file tree
Hide file tree
Showing 32 changed files with 2,734 additions and 119 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ Changelog for NeoFS Node
## [Unreleased]

### Added
- `neofs-cli control notary` with `list`, `request` and `sign` commands (#3059)

### Fixed

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()

Check warning on line 19 in cmd/neofs-cli/modules/control/notary.go

View check run for this annotation

Codecov / codecov/patch

cmd/neofs-cli/modules/control/notary.go#L12-L19

Added lines #L12 - L19 were not covered by tests
}
67 changes: 67 additions & 0 deletions cmd/neofs-cli/modules/control/notary_list.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package control

import (
"fmt"

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)

Check warning on line 23 in cmd/neofs-cli/modules/control/notary_list.go

View check run for this annotation

Codecov / codecov/patch

cmd/neofs-cli/modules/control/notary_list.go#L22-L23

Added lines #L22 - L23 were not covered by tests
}

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

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

Check warning on line 33 in cmd/neofs-cli/modules/control/notary_list.go

View check run for this annotation

Codecov / codecov/patch

cmd/neofs-cli/modules/control/notary_list.go#L26-L33

Added lines #L26 - L33 were not covered by tests

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

Check warning on line 38 in cmd/neofs-cli/modules/control/notary_list.go

View check run for this annotation

Codecov / codecov/patch

cmd/neofs-cli/modules/control/notary_list.go#L35-L38

Added lines #L35 - L38 were not covered by tests

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)
}

Check warning on line 47 in cmd/neofs-cli/modules/control/notary_list.go

View check run for this annotation

Codecov / codecov/patch

cmd/neofs-cli/modules/control/notary_list.go#L40-L47

Added lines #L40 - L47 were not covered by tests

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)
}

Check warning on line 56 in cmd/neofs-cli/modules/control/notary_list.go

View check run for this annotation

Codecov / codecov/patch

cmd/neofs-cli/modules/control/notary_list.go#L49-L56

Added lines #L49 - L56 were not covered by tests

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

Check warning on line 61 in cmd/neofs-cli/modules/control/notary_list.go

View check run for this annotation

Codecov / codecov/patch

cmd/neofs-cli/modules/control/notary_list.go#L58-L61

Added lines #L58 - L61 were not covered by tests

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

cmd.Printf("Hashes: %s\n", hashes)
return nil

Check warning on line 66 in cmd/neofs-cli/modules/control/notary_list.go

View check run for this annotation

Codecov / codecov/patch

cmd/neofs-cli/modules/control/notary_list.go#L63-L66

Added lines #L63 - L66 were not covered by tests
}
118 changes: 118 additions & 0 deletions cmd/neofs-cli/modules/control/notary_request.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
package control

import (
"errors"
"fmt"
"strings"

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, args in the form key1=val1\n" +
"- removeNode, transaction to move nodes to the Offline state in the candidates list, args are the public keys of the nodes",
RunE: notaryRequest,
}

func initControlNotaryRequestCmd() {
initControlFlags(notaryRequestCmd)

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

Check warning on line 32 in cmd/neofs-cli/modules/control/notary_request.go

View check run for this annotation

Codecov / codecov/patch

cmd/neofs-cli/modules/control/notary_request.go#L28-L32

Added lines #L28 - L32 were not covered by tests
}

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
}

Check warning on line 42 in cmd/neofs-cli/modules/control/notary_request.go

View check run for this annotation

Codecov / codecov/patch

cmd/neofs-cli/modules/control/notary_request.go#L35-L42

Added lines #L35 - L42 were not covered by tests

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

Check warning on line 47 in cmd/neofs-cli/modules/control/notary_request.go

View check run for this annotation

Codecov / codecov/patch

cmd/neofs-cli/modules/control/notary_request.go#L44-L47

Added lines #L44 - L47 were not covered by tests

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) == 0 {
return fmt.Errorf("no arguments provided for 'setConfig'")
}

Check warning on line 64 in cmd/neofs-cli/modules/control/notary_request.go

View check run for this annotation

Codecov / codecov/patch

cmd/neofs-cli/modules/control/notary_request.go#L49-L64

Added lines #L49 - L64 were not covered by tests

bodyArgs := make([]string, 0, len(args)*2)
for _, arg := range args {
k, v, err := parseConfigPair(arg)
if err != nil {
return err
}

Check warning on line 71 in cmd/neofs-cli/modules/control/notary_request.go

View check run for this annotation

Codecov / codecov/patch

cmd/neofs-cli/modules/control/notary_request.go#L66-L71

Added lines #L66 - L71 were not covered by tests

bodyArgs = append(bodyArgs, k, fmt.Sprint(v))

Check warning on line 73 in cmd/neofs-cli/modules/control/notary_request.go

View check run for this annotation

Codecov / codecov/patch

cmd/neofs-cli/modules/control/notary_request.go#L73

Added line #L73 was not covered by tests
}
body.SetArgs(bodyArgs)
case "removeNode":
if len(args) == 0 {
return errors.New("method 'removeNode', at least 1 argument must be provided - the public key of the node")
}
body.SetArgs(args)

Check warning on line 80 in cmd/neofs-cli/modules/control/notary_request.go

View check run for this annotation

Codecov / codecov/patch

cmd/neofs-cli/modules/control/notary_request.go#L75-L80

Added lines #L75 - L80 were not covered by tests
}

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

Check warning on line 86 in cmd/neofs-cli/modules/control/notary_request.go

View check run for this annotation

Codecov / codecov/patch

cmd/neofs-cli/modules/control/notary_request.go#L83-L86

Added lines #L83 - L86 were not covered by tests

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)
}

Check warning on line 95 in cmd/neofs-cli/modules/control/notary_request.go

View check run for this annotation

Codecov / codecov/patch

cmd/neofs-cli/modules/control/notary_request.go#L88-L95

Added lines #L88 - L95 were not covered by tests

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

Check warning on line 100 in cmd/neofs-cli/modules/control/notary_request.go

View check run for this annotation

Codecov / codecov/patch

cmd/neofs-cli/modules/control/notary_request.go#L97-L100

Added lines #L97 - L100 were not covered by tests

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

cmd.Printf("Tx Hash: %s\n", hashes)
return nil

Check warning on line 105 in cmd/neofs-cli/modules/control/notary_request.go

View check run for this annotation

Codecov / codecov/patch

cmd/neofs-cli/modules/control/notary_request.go#L102-L105

Added lines #L102 - L105 were not covered by tests
}

func parseConfigPair(kvStr string) (key string, val string, err error) {
kv := strings.SplitN(kvStr, "=", 2)
if len(kv) != 2 {
return "", "", fmt.Errorf("invalid parameter format: must be 'key=val', got: %s", kvStr)
}

Check warning on line 112 in cmd/neofs-cli/modules/control/notary_request.go

View check run for this annotation

Codecov / codecov/patch

cmd/neofs-cli/modules/control/notary_request.go#L108-L112

Added lines #L108 - L112 were not covered by tests

key = kv[0]
val = kv[1]

return

Check warning on line 117 in cmd/neofs-cli/modules/control/notary_request.go

View check run for this annotation

Codecov / codecov/patch

cmd/neofs-cli/modules/control/notary_request.go#L114-L117

Added lines #L114 - L117 were not covered by tests
}
70 changes: 70 additions & 0 deletions cmd/neofs-cli/modules/control/notary_sign.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
package control

import (
"fmt"

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")

Check warning on line 28 in cmd/neofs-cli/modules/control/notary_sign.go

View check run for this annotation

Codecov / codecov/patch

cmd/neofs-cli/modules/control/notary_sign.go#L24-L28

Added lines #L24 - L28 were not covered by tests
}

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

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

Check warning on line 38 in cmd/neofs-cli/modules/control/notary_sign.go

View check run for this annotation

Codecov / codecov/patch

cmd/neofs-cli/modules/control/notary_sign.go#L31-L38

Added lines #L31 - L38 were not covered by tests

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

Check warning on line 43 in cmd/neofs-cli/modules/control/notary_sign.go

View check run for this annotation

Codecov / codecov/patch

cmd/neofs-cli/modules/control/notary_sign.go#L40-L43

Added lines #L40 - L43 were not covered by tests

req := new(ircontrol.NotarySignRequest)
body := new(ircontrol.NotarySignRequest_Body)
req.SetBody(body)
body.SetHash([]byte(notarySignHashFlag))

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

Check warning on line 53 in cmd/neofs-cli/modules/control/notary_sign.go

View check run for this annotation

Codecov / codecov/patch

cmd/neofs-cli/modules/control/notary_sign.go#L45-L53

Added lines #L45 - L53 were not covered by tests

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)
}

Check warning on line 62 in cmd/neofs-cli/modules/control/notary_sign.go

View check run for this annotation

Codecov / codecov/patch

cmd/neofs-cli/modules/control/notary_sign.go#L55-L62

Added lines #L55 - L62 were not covered by tests

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

Check warning on line 67 in cmd/neofs-cli/modules/control/notary_sign.go

View check run for this annotation

Codecov / codecov/patch

cmd/neofs-cli/modules/control/notary_sign.go#L64-L67

Added lines #L64 - L67 were not covered by tests

return nil

Check warning on line 69 in cmd/neofs-cli/modules/control/notary_sign.go

View check run for this annotation

Codecov / codecov/patch

cmd/neofs-cli/modules/control/notary_sign.go#L69

Added line #L69 was not covered by tests
}
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,

Check warning on line 37 in cmd/neofs-cli/modules/control/root.go

View check run for this annotation

Codecov / codecov/patch

cmd/neofs-cli/modules/control/root.go#L37

Added line #L37 was not covered by tests
)

initControlHealthCheckCmd()
Expand All @@ -42,4 +43,5 @@ func init() {
initControlShardsCmd()
initControlSynchronizeTreeCmd()
initControlObjectsCmd()
initControlNotaryCmd()

Check warning on line 46 in cmd/neofs-cli/modules/control/root.go

View check run for this annotation

Codecov / codecov/patch

cmd/neofs-cli/modules/control/root.go#L46

Added line #L46 was not covered by tests
}
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 742d111

Please sign in to comment.