forked from TrueCloudLab/frostfs-node
60e9de8d63
In previous implementation turning to maintenance mode using NeoFS CLI required NeoFS API endpoint. This was not convenient from the user perspective. It's worth to move networks settings' check to the server side. Add `force_maintenance` field to `SetNetmapStatusRequest.Body` message of Control API. Add `force` flag to `neofs-cli control set-status` command which sets corresponding field in the requests body if status is `maintenance`. Force flag is ignored for any other status. Signed-off-by: Leonard Lyubich <ctulhurider@gmail.com>
94 lines
2.6 KiB
Go
94 lines
2.6 KiB
Go
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/common"
|
|
"github.com/nspcc-dev/neofs-node/cmd/neofs-cli/internal/commonflags"
|
|
"github.com/nspcc-dev/neofs-node/cmd/neofs-cli/internal/key"
|
|
"github.com/nspcc-dev/neofs-node/pkg/services/control"
|
|
"github.com/spf13/cobra"
|
|
)
|
|
|
|
const (
|
|
netmapStatusFlag = "status"
|
|
|
|
netmapStatusOnline = "online"
|
|
netmapStatusOffline = "offline"
|
|
netmapStatusMaintenance = "maintenance"
|
|
)
|
|
|
|
var setNetmapStatusCmd = &cobra.Command{
|
|
Use: "set-status",
|
|
Short: "Set status of the storage node in NeoFS network map",
|
|
Long: "Set status of the storage node in NeoFS network map",
|
|
Run: setNetmapStatus,
|
|
}
|
|
|
|
func initControlSetNetmapStatusCmd() {
|
|
initControlFlags(setNetmapStatusCmd)
|
|
|
|
flags := setNetmapStatusCmd.Flags()
|
|
flags.String(netmapStatusFlag, "",
|
|
fmt.Sprintf("New netmap status keyword ('%s', '%s', '%s')",
|
|
netmapStatusOnline,
|
|
netmapStatusOffline,
|
|
netmapStatusMaintenance,
|
|
),
|
|
)
|
|
|
|
_ = setNetmapStatusCmd.MarkFlagRequired(netmapStatusFlag)
|
|
|
|
flags.BoolP(commonflags.ForceFlag, commonflags.ForceFlagShorthand, false,
|
|
"Force turning to local maintenance")
|
|
}
|
|
|
|
func setNetmapStatus(cmd *cobra.Command, _ []string) {
|
|
pk := key.Get(cmd)
|
|
body := new(control.SetNetmapStatusRequest_Body)
|
|
force, _ := cmd.Flags().GetBool(commonflags.ForceFlag)
|
|
|
|
printIgnoreForce := func(st control.NetmapStatus) {
|
|
if force {
|
|
common.PrintVerbose("Ignore --%s flag for %s state.", commonflags.ForceFlag, st)
|
|
}
|
|
}
|
|
|
|
switch st, _ := cmd.Flags().GetString(netmapStatusFlag); st {
|
|
default:
|
|
common.ExitOnErr(cmd, "", fmt.Errorf("unsupported status %s", st))
|
|
case netmapStatusOnline:
|
|
body.SetStatus(control.NetmapStatus_ONLINE)
|
|
printIgnoreForce(control.NetmapStatus_ONLINE)
|
|
case netmapStatusOffline:
|
|
body.SetStatus(control.NetmapStatus_OFFLINE)
|
|
printIgnoreForce(control.NetmapStatus_OFFLINE)
|
|
case netmapStatusMaintenance:
|
|
body.SetStatus(control.NetmapStatus_MAINTENANCE)
|
|
|
|
if force {
|
|
body.SetForceMaintenance()
|
|
common.PrintVerbose("Local maintenance will be forced.")
|
|
}
|
|
}
|
|
|
|
req := new(control.SetNetmapStatusRequest)
|
|
req.SetBody(body)
|
|
|
|
signRequest(cmd, pk, req)
|
|
|
|
cli := getClient(cmd, pk)
|
|
|
|
var resp *control.SetNetmapStatusResponse
|
|
var err error
|
|
err = cli.ExecRaw(func(client *rawclient.Client) error {
|
|
resp, err = control.SetNetmapStatus(client, req)
|
|
return err
|
|
})
|
|
common.ExitOnErr(cmd, "rpc error: %w", err)
|
|
|
|
verifyResponse(cmd, resp.GetSignature(), resp.GetBody())
|
|
|
|
cmd.Println("Network status update request successfully sent.")
|
|
}
|