open-nomad/command/operator_raft_logs.go
Tim Gross f2615992a4
cli: unhide advanced operator raft debugging commands (#11682)
The `nomad operator raft` and `nomad operator snapshot state`
subcommands for inspecting on-disk raft state were hidden and
undocumented. Expose and document these so that advanced operators
have support for these tools.
2021-12-16 10:32:11 -05:00

82 lines
1.8 KiB
Go

package command
import (
"encoding/json"
"fmt"
"os"
"strings"
"github.com/hashicorp/nomad/helper/raftutil"
"github.com/posener/complete"
)
type OperatorRaftLogsCommand struct {
Meta
}
func (c *OperatorRaftLogsCommand) Help() string {
helpText := `
Usage: nomad operator raft logs <path to nomad data dir>
Display the log entries persisted in the Nomad data directory in JSON
format.
This command requires file system permissions to access the data directory on
disk. The Nomad server locks access to the data directory, so this command
cannot be run on a data directory that is being used by a running Nomad server.
This is a low-level debugging tool and not subject to Nomad's usual backward
compatibility guarantees.
`
return strings.TrimSpace(helpText)
}
func (c *OperatorRaftLogsCommand) AutocompleteFlags() complete.Flags {
return complete.Flags{}
}
func (c *OperatorRaftLogsCommand) AutocompleteArgs() complete.Predictor {
return complete.PredictNothing
}
func (c *OperatorRaftLogsCommand) Synopsis() string {
return "Display raft log content"
}
func (c *OperatorRaftLogsCommand) Name() string { return "operator raft logs" }
func (c *OperatorRaftLogsCommand) Run(args []string) int {
if len(args) != 1 {
c.Ui.Error("This command takes one argument: <path>")
c.Ui.Error(commandErrorText(c))
return 1
}
raftPath, err := raftutil.FindRaftFile(args[0])
if err != nil {
c.Ui.Error(err.Error())
return 1
}
logs, warnings, err := raftutil.LogEntries(raftPath)
if err != nil {
c.Ui.Error(err.Error())
return 1
}
for _, warning := range warnings {
c.Ui.Error(warning.Error())
}
enc := json.NewEncoder(os.Stdout)
enc.SetIndent("", " ")
if err := enc.Encode(logs); err != nil {
c.Ui.Error(fmt.Sprintf("failed to encode output: %v", err))
return 1
}
return 0
}