118 lines
2.7 KiB
Go
118 lines
2.7 KiB
Go
|
// Copyright (c) HashiCorp, Inc.
|
||
|
// SPDX-License-Identifier: MPL-2.0
|
||
|
|
||
|
package command
|
||
|
|
||
|
import (
|
||
|
"flag"
|
||
|
"fmt"
|
||
|
"strings"
|
||
|
|
||
|
"github.com/hashicorp/vault/api"
|
||
|
"github.com/mitchellh/cli"
|
||
|
"github.com/posener/complete"
|
||
|
)
|
||
|
|
||
|
var (
|
||
|
_ cli.Command = (*OperatorRaftAutopilotStateCommand)(nil)
|
||
|
_ cli.CommandAutocomplete = (*OperatorRaftAutopilotStateCommand)(nil)
|
||
|
)
|
||
|
|
||
|
type OperatorRaftAutopilotStateCommand struct {
|
||
|
*BaseCommand
|
||
|
flagDRToken string
|
||
|
}
|
||
|
|
||
|
func (c *OperatorRaftAutopilotStateCommand) Synopsis() string {
|
||
|
return "Displays the state of the raft cluster under integrated storage as seen by autopilot"
|
||
|
}
|
||
|
|
||
|
func (c *OperatorRaftAutopilotStateCommand) Help() string {
|
||
|
helpText := `
|
||
|
Usage: vault operator raft autopilot state
|
||
|
|
||
|
Displays the state of the raft cluster under integrated storage as seen by autopilot.
|
||
|
` + c.Flags().Help()
|
||
|
|
||
|
return strings.TrimSpace(helpText)
|
||
|
}
|
||
|
|
||
|
func (c *OperatorRaftAutopilotStateCommand) Flags() *FlagSets {
|
||
|
set := c.flagSet(FlagSetHTTP | FlagSetOutputFormat)
|
||
|
|
||
|
f := set.NewFlagSet("Command Options")
|
||
|
|
||
|
f.StringVar(&StringVar{
|
||
|
Name: "dr-token",
|
||
|
Target: &c.flagDRToken,
|
||
|
Default: "",
|
||
|
EnvVar: "",
|
||
|
Completion: complete.PredictAnything,
|
||
|
Usage: "DR operation token used to authorize this request (if a DR secondary node).",
|
||
|
})
|
||
|
|
||
|
// The output of the state endpoint contains nested values and is not fit for
|
||
|
// the default "table" display format. Override the default display format to
|
||
|
// "pretty", both in the flag and in the UI.
|
||
|
set.mainSet.VisitAll(func(fl *flag.Flag) {
|
||
|
if fl.Name == "format" {
|
||
|
fl.DefValue = "pretty"
|
||
|
}
|
||
|
})
|
||
|
ui, ok := c.UI.(*VaultUI)
|
||
|
if ok && ui.format == "table" {
|
||
|
ui.format = "pretty"
|
||
|
}
|
||
|
return set
|
||
|
}
|
||
|
|
||
|
func (c *OperatorRaftAutopilotStateCommand) AutocompleteArgs() complete.Predictor {
|
||
|
return complete.PredictAnything
|
||
|
}
|
||
|
|
||
|
func (c *OperatorRaftAutopilotStateCommand) AutocompleteFlags() complete.Flags {
|
||
|
return c.Flags().Completions()
|
||
|
}
|
||
|
|
||
|
func (c *OperatorRaftAutopilotStateCommand) Run(args []string) int {
|
||
|
f := c.Flags()
|
||
|
|
||
|
if err := f.Parse(args); err != nil {
|
||
|
c.UI.Error(err.Error())
|
||
|
return 1
|
||
|
}
|
||
|
|
||
|
args = f.Args()
|
||
|
switch len(args) {
|
||
|
case 0:
|
||
|
default:
|
||
|
c.UI.Error(fmt.Sprintf("Incorrect arguments (expected 0, got %d)", len(args)))
|
||
|
return 1
|
||
|
}
|
||
|
|
||
|
client, err := c.Client()
|
||
|
if err != nil {
|
||
|
c.UI.Error(err.Error())
|
||
|
return 2
|
||
|
}
|
||
|
|
||
|
var state *api.AutopilotState
|
||
|
switch {
|
||
|
case c.flagDRToken != "":
|
||
|
state, err = client.Sys().RaftAutopilotStateWithDRToken(c.flagDRToken)
|
||
|
default:
|
||
|
state, err = client.Sys().RaftAutopilotState()
|
||
|
}
|
||
|
|
||
|
if err != nil {
|
||
|
c.UI.Error(fmt.Sprintf("Error checking autopilot state: %s", err))
|
||
|
return 2
|
||
|
}
|
||
|
|
||
|
if state == nil {
|
||
|
return 0
|
||
|
}
|
||
|
|
||
|
return OutputData(c.UI, state)
|
||
|
}
|