mirror of
https://github.com/optim-enterprises-bv/vault.git
synced 2025-11-02 19:47:54 +00:00
Add "operator" subcommand
This commit is contained in:
47
command/operator.go
Normal file
47
command/operator.go
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
package command
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/mitchellh/cli"
|
||||||
|
)
|
||||||
|
|
||||||
|
var _ cli.Command = (*OperatorCommand)(nil)
|
||||||
|
|
||||||
|
type OperatorCommand struct {
|
||||||
|
*BaseCommand
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *OperatorCommand) Synopsis() string {
|
||||||
|
return "Perform operator-specific tasks"
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *OperatorCommand) Help() string {
|
||||||
|
helpText := `
|
||||||
|
Usage: vault operator <subcommand> [options] [args]
|
||||||
|
|
||||||
|
This command groups subcommands for operators interacting with Vault. Most
|
||||||
|
users will not need to interact with these commands. Here are a few examples
|
||||||
|
of the operator commands:
|
||||||
|
|
||||||
|
Initialize a new Vault cluster:
|
||||||
|
|
||||||
|
$ vault operator init
|
||||||
|
|
||||||
|
Force a Vault to resign leadership in a cluster:
|
||||||
|
|
||||||
|
$ vault operator step-down
|
||||||
|
|
||||||
|
Rotate Vault's underlying encryption key:
|
||||||
|
|
||||||
|
$ vault operator rotate
|
||||||
|
|
||||||
|
Please see the individual subcommand help for detailed usage information.
|
||||||
|
`
|
||||||
|
|
||||||
|
return strings.TrimSpace(helpText)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *OperatorCommand) Run(args []string) int {
|
||||||
|
return cli.RunResultHelp
|
||||||
|
}
|
||||||
@@ -18,12 +18,10 @@ import (
|
|||||||
"github.com/posener/complete"
|
"github.com/posener/complete"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Ensure we are implementing the right interfaces.
|
var _ cli.Command = (*OperatorGenerateRootCommand)(nil)
|
||||||
var _ cli.Command = (*GenerateRootCommand)(nil)
|
var _ cli.CommandAutocomplete = (*OperatorGenerateRootCommand)(nil)
|
||||||
var _ cli.CommandAutocomplete = (*GenerateRootCommand)(nil)
|
|
||||||
|
|
||||||
// GenerateRootCommand is a Command that generates a new root token.
|
type OperatorGenerateRootCommand struct {
|
||||||
type GenerateRootCommand struct {
|
|
||||||
*BaseCommand
|
*BaseCommand
|
||||||
|
|
||||||
flagInit bool
|
flagInit bool
|
||||||
@@ -36,26 +34,26 @@ type GenerateRootCommand struct {
|
|||||||
flagGenerateOTP bool
|
flagGenerateOTP bool
|
||||||
|
|
||||||
// Deprecation
|
// Deprecation
|
||||||
// TODO: remove in 0.9.9
|
// TODO: remove in 0.9.0
|
||||||
flagGenOTP bool
|
flagGenOTP bool
|
||||||
|
|
||||||
testStdin io.Reader // for tests
|
testStdin io.Reader // for tests
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *GenerateRootCommand) Synopsis() string {
|
func (c *OperatorGenerateRootCommand) Synopsis() string {
|
||||||
return "Generates a new root token"
|
return "Generates a new root token"
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *GenerateRootCommand) Help() string {
|
func (c *OperatorGenerateRootCommand) Help() string {
|
||||||
helpText := `
|
helpText := `
|
||||||
Usage: vault generate-root [options] [KEY]
|
Usage: vault operator generate-root [options] [KEY]
|
||||||
|
|
||||||
Generates a new root token by combining a quorum of share holders. One of
|
Generates a new root token by combining a quorum of share holders. One of
|
||||||
the following must be provided to start the root token generation:
|
the following must be provided to start the root token generation:
|
||||||
|
|
||||||
- A base64-encoded one-time-password (OTP) provided via the "-otp" flag.
|
- A base64-encoded one-time-password (OTP) provided via the "-otp" flag.
|
||||||
Use the "-generate-otp" flag to generate a usable value. The resulting
|
Use the "-generate-otp" flag to generate a usable value. The resulting
|
||||||
token is XORed with this value when it is returend. Use the "-decode"
|
token is XORed with this value when it is returned. Use the "-decode"
|
||||||
flag to output the final value.
|
flag to output the final value.
|
||||||
|
|
||||||
- A file containing a PGP key or a keybase username in the "-pgp-key"
|
- A file containing a PGP key or a keybase username in the "-pgp-key"
|
||||||
@@ -67,24 +65,22 @@ Usage: vault generate-root [options] [KEY]
|
|||||||
|
|
||||||
Generate an OTP code for the final token:
|
Generate an OTP code for the final token:
|
||||||
|
|
||||||
$ vault generate-root -generate-otp
|
$ vault operator generate-root -generate-otp
|
||||||
|
|
||||||
Start a root token generation:
|
Start a root token generation:
|
||||||
|
|
||||||
$ vault generate-root -init -otp="..."
|
$ vault operator generate-root -init -otp="..."
|
||||||
$ vault generate-root -init -pgp-key="..."
|
$ vault operator generate-root -init -pgp-key="..."
|
||||||
|
|
||||||
Enter an unseal key to progress root token generation:
|
Enter an unseal key to progress root token generation:
|
||||||
|
|
||||||
$ vault generate-root -otp="..."
|
$ vault operator generate-root -otp="..."
|
||||||
|
|
||||||
For a full list of examples, please see the documentation.
|
|
||||||
|
|
||||||
` + c.Flags().Help()
|
` + c.Flags().Help()
|
||||||
return strings.TrimSpace(helpText)
|
return strings.TrimSpace(helpText)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *GenerateRootCommand) Flags() *FlagSets {
|
func (c *OperatorGenerateRootCommand) Flags() *FlagSets {
|
||||||
set := c.flagSet(FlagSetHTTP)
|
set := c.flagSet(FlagSetHTTP)
|
||||||
|
|
||||||
f := set.NewFlagSet("Command Options")
|
f := set.NewFlagSet("Command Options")
|
||||||
@@ -115,7 +111,7 @@ func (c *GenerateRootCommand) Flags() *FlagSets {
|
|||||||
Default: false,
|
Default: false,
|
||||||
EnvVar: "",
|
EnvVar: "",
|
||||||
Completion: complete.PredictNothing,
|
Completion: complete.PredictNothing,
|
||||||
Usage: "Print the status of the current attempt without provding an " +
|
Usage: "Print the status of the current attempt without providing an " +
|
||||||
"unseal key.",
|
"unseal key.",
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -183,15 +179,15 @@ func (c *GenerateRootCommand) Flags() *FlagSets {
|
|||||||
return set
|
return set
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *GenerateRootCommand) AutocompleteArgs() complete.Predictor {
|
func (c *OperatorGenerateRootCommand) AutocompleteArgs() complete.Predictor {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *GenerateRootCommand) AutocompleteFlags() complete.Flags {
|
func (c *OperatorGenerateRootCommand) AutocompleteFlags() complete.Flags {
|
||||||
return c.Flags().Completions()
|
return c.Flags().Completions()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *GenerateRootCommand) Run(args []string) int {
|
func (c *OperatorGenerateRootCommand) Run(args []string) int {
|
||||||
f := c.Flags()
|
f := c.Flags()
|
||||||
|
|
||||||
if err := f.Parse(args); err != nil {
|
if err := f.Parse(args); err != nil {
|
||||||
@@ -243,7 +239,7 @@ func (c *GenerateRootCommand) Run(args []string) int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// verifyOTP verifies the given OTP code is exactly 16 bytes.
|
// verifyOTP verifies the given OTP code is exactly 16 bytes.
|
||||||
func (c *GenerateRootCommand) verifyOTP(otp string) error {
|
func (c *OperatorGenerateRootCommand) verifyOTP(otp string) error {
|
||||||
if len(otp) == 0 {
|
if len(otp) == 0 {
|
||||||
return fmt.Errorf("No OTP passed in")
|
return fmt.Errorf("No OTP passed in")
|
||||||
}
|
}
|
||||||
@@ -259,7 +255,7 @@ func (c *GenerateRootCommand) verifyOTP(otp string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// generateOTP generates a suitable OTP code for generating a root token.
|
// generateOTP generates a suitable OTP code for generating a root token.
|
||||||
func (c *GenerateRootCommand) generateOTP() int {
|
func (c *OperatorGenerateRootCommand) generateOTP() int {
|
||||||
buf := make([]byte, 16)
|
buf := make([]byte, 16)
|
||||||
readLen, err := rand.Read(buf)
|
readLen, err := rand.Read(buf)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -276,7 +272,7 @@ func (c *GenerateRootCommand) generateOTP() int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// decode decodes the given value using the otp.
|
// decode decodes the given value using the otp.
|
||||||
func (c *GenerateRootCommand) decode(encoded, otp string) int {
|
func (c *OperatorGenerateRootCommand) decode(encoded, otp string) int {
|
||||||
if encoded == "" {
|
if encoded == "" {
|
||||||
c.UI.Error("Missing encoded value: use -decode=<string> to supply it")
|
c.UI.Error("Missing encoded value: use -decode=<string> to supply it")
|
||||||
return 1
|
return 1
|
||||||
@@ -302,7 +298,7 @@ func (c *GenerateRootCommand) decode(encoded, otp string) int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// init is used to start the generation process
|
// init is used to start the generation process
|
||||||
func (c *GenerateRootCommand) init(client *api.Client, otp string, pgpKey string) int {
|
func (c *OperatorGenerateRootCommand) init(client *api.Client, otp string, pgpKey string) int {
|
||||||
// Validate incoming fields. Either OTP OR PGP keys must be supplied.
|
// Validate incoming fields. Either OTP OR PGP keys must be supplied.
|
||||||
switch {
|
switch {
|
||||||
case otp == "" && pgpKey == "":
|
case otp == "" && pgpKey == "":
|
||||||
@@ -331,7 +327,7 @@ func (c *GenerateRootCommand) init(client *api.Client, otp string, pgpKey string
|
|||||||
|
|
||||||
// provide prompts the user for the seal key and posts it to the update root
|
// provide prompts the user for the seal key and posts it to the update root
|
||||||
// endpoint. If this is the last unseal, this function outputs it.
|
// endpoint. If this is the last unseal, this function outputs it.
|
||||||
func (c *GenerateRootCommand) provide(client *api.Client, key string) int {
|
func (c *OperatorGenerateRootCommand) provide(client *api.Client, key string) int {
|
||||||
status, err := client.Sys().GenerateRootStatus()
|
status, err := client.Sys().GenerateRootStatus()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.UI.Error(fmt.Sprintf("Error getting root generation status: %s", err))
|
c.UI.Error(fmt.Sprintf("Error getting root generation status: %s", err))
|
||||||
@@ -413,7 +409,7 @@ func (c *GenerateRootCommand) provide(client *api.Client, key string) int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// cancel cancels the root token generation
|
// cancel cancels the root token generation
|
||||||
func (c *GenerateRootCommand) cancel(client *api.Client) int {
|
func (c *OperatorGenerateRootCommand) cancel(client *api.Client) int {
|
||||||
if err := client.Sys().GenerateRootCancel(); err != nil {
|
if err := client.Sys().GenerateRootCancel(); err != nil {
|
||||||
c.UI.Error(fmt.Sprintf("Error canceling root token generation: %s", err))
|
c.UI.Error(fmt.Sprintf("Error canceling root token generation: %s", err))
|
||||||
return 2
|
return 2
|
||||||
@@ -423,7 +419,7 @@ func (c *GenerateRootCommand) cancel(client *api.Client) int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// status is used just to fetch and dump the status
|
// status is used just to fetch and dump the status
|
||||||
func (c *GenerateRootCommand) status(client *api.Client) int {
|
func (c *OperatorGenerateRootCommand) status(client *api.Client) int {
|
||||||
status, err := client.Sys().GenerateRootStatus()
|
status, err := client.Sys().GenerateRootStatus()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.UI.Error(fmt.Sprintf("Error getting root generation status: %s", err))
|
c.UI.Error(fmt.Sprintf("Error getting root generation status: %s", err))
|
||||||
@@ -433,7 +429,7 @@ func (c *GenerateRootCommand) status(client *api.Client) int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// printStatus dumps the status to output
|
// printStatus dumps the status to output
|
||||||
func (c *GenerateRootCommand) printStatus(status *api.GenerateRootStatusResponse) int {
|
func (c *OperatorGenerateRootCommand) printStatus(status *api.GenerateRootStatusResponse) int {
|
||||||
out := []string{}
|
out := []string{}
|
||||||
out = append(out, fmt.Sprintf("Nonce | %s", status.Nonce))
|
out = append(out, fmt.Sprintf("Nonce | %s", status.Nonce))
|
||||||
out = append(out, fmt.Sprintf("Started | %t", status.Started))
|
out = append(out, fmt.Sprintf("Started | %t", status.Started))
|
||||||
@@ -446,7 +442,7 @@ func (c *GenerateRootCommand) printStatus(status *api.GenerateRootStatusResponse
|
|||||||
out = append(out, fmt.Sprintf("Root Token | %s", status.EncodedRootToken))
|
out = append(out, fmt.Sprintf("Root Token | %s", status.EncodedRootToken))
|
||||||
}
|
}
|
||||||
|
|
||||||
output := columnOutput(out)
|
output := columnOutput(out, nil)
|
||||||
c.UI.Output(output)
|
c.UI.Output(output)
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
@@ -11,18 +11,18 @@ import (
|
|||||||
"github.com/mitchellh/cli"
|
"github.com/mitchellh/cli"
|
||||||
)
|
)
|
||||||
|
|
||||||
func testGenerateRootCommand(tb testing.TB) (*cli.MockUi, *GenerateRootCommand) {
|
func testOperatorGenerateRootCommand(tb testing.TB) (*cli.MockUi, *OperatorGenerateRootCommand) {
|
||||||
tb.Helper()
|
tb.Helper()
|
||||||
|
|
||||||
ui := cli.NewMockUi()
|
ui := cli.NewMockUi()
|
||||||
return ui, &GenerateRootCommand{
|
return ui, &OperatorGenerateRootCommand{
|
||||||
BaseCommand: &BaseCommand{
|
BaseCommand: &BaseCommand{
|
||||||
UI: ui,
|
UI: ui,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestGenerateRootCommand_Run(t *testing.T) {
|
func TestOperatorGenerateRootCommand_Run(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
cases := []struct {
|
cases := []struct {
|
||||||
@@ -88,7 +88,7 @@ func TestGenerateRootCommand_Run(t *testing.T) {
|
|||||||
t.Run(tc.name, func(t *testing.T) {
|
t.Run(tc.name, func(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
ui, cmd := testGenerateRootCommand(t)
|
ui, cmd := testOperatorGenerateRootCommand(t)
|
||||||
|
|
||||||
code := cmd.Run(tc.args)
|
code := cmd.Run(tc.args)
|
||||||
if code != tc.code {
|
if code != tc.code {
|
||||||
@@ -106,7 +106,7 @@ func TestGenerateRootCommand_Run(t *testing.T) {
|
|||||||
t.Run("generate_otp", func(t *testing.T) {
|
t.Run("generate_otp", func(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
ui, cmd := testGenerateRootCommand(t)
|
ui, cmd := testOperatorGenerateRootCommand(t)
|
||||||
|
|
||||||
code := cmd.Run([]string{
|
code := cmd.Run([]string{
|
||||||
"-generate-otp",
|
"-generate-otp",
|
||||||
@@ -127,7 +127,7 @@ func TestGenerateRootCommand_Run(t *testing.T) {
|
|||||||
encoded := "L9MaZ/4mQanpOV6QeWd84g=="
|
encoded := "L9MaZ/4mQanpOV6QeWd84g=="
|
||||||
otp := "dIeeezkjpDUv3fy7MYPOLQ=="
|
otp := "dIeeezkjpDUv3fy7MYPOLQ=="
|
||||||
|
|
||||||
ui, cmd := testGenerateRootCommand(t)
|
ui, cmd := testOperatorGenerateRootCommand(t)
|
||||||
|
|
||||||
code := cmd.Run([]string{
|
code := cmd.Run([]string{
|
||||||
"-decode", encoded,
|
"-decode", encoded,
|
||||||
@@ -157,7 +157,7 @@ func TestGenerateRootCommand_Run(t *testing.T) {
|
|||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
ui, cmd := testGenerateRootCommand(t)
|
ui, cmd := testOperatorGenerateRootCommand(t)
|
||||||
cmd.client = client
|
cmd.client = client
|
||||||
|
|
||||||
code := cmd.Run([]string{
|
code := cmd.Run([]string{
|
||||||
@@ -191,7 +191,7 @@ func TestGenerateRootCommand_Run(t *testing.T) {
|
|||||||
client, closer := testVaultServer(t)
|
client, closer := testVaultServer(t)
|
||||||
defer closer()
|
defer closer()
|
||||||
|
|
||||||
ui, cmd := testGenerateRootCommand(t)
|
ui, cmd := testOperatorGenerateRootCommand(t)
|
||||||
cmd.client = client
|
cmd.client = client
|
||||||
|
|
||||||
code := cmd.Run([]string{
|
code := cmd.Run([]string{
|
||||||
@@ -227,7 +227,7 @@ func TestGenerateRootCommand_Run(t *testing.T) {
|
|||||||
client, closer := testVaultServer(t)
|
client, closer := testVaultServer(t)
|
||||||
defer closer()
|
defer closer()
|
||||||
|
|
||||||
ui, cmd := testGenerateRootCommand(t)
|
ui, cmd := testOperatorGenerateRootCommand(t)
|
||||||
cmd.client = client
|
cmd.client = client
|
||||||
|
|
||||||
code := cmd.Run([]string{
|
code := cmd.Run([]string{
|
||||||
@@ -263,7 +263,7 @@ func TestGenerateRootCommand_Run(t *testing.T) {
|
|||||||
client, closer := testVaultServer(t)
|
client, closer := testVaultServer(t)
|
||||||
defer closer()
|
defer closer()
|
||||||
|
|
||||||
ui, cmd := testGenerateRootCommand(t)
|
ui, cmd := testOperatorGenerateRootCommand(t)
|
||||||
cmd.client = client
|
cmd.client = client
|
||||||
|
|
||||||
code := cmd.Run([]string{
|
code := cmd.Run([]string{
|
||||||
@@ -297,7 +297,7 @@ func TestGenerateRootCommand_Run(t *testing.T) {
|
|||||||
|
|
||||||
// Supply the first n-1 unseal keys
|
// Supply the first n-1 unseal keys
|
||||||
for _, key := range keys[:len(keys)-1] {
|
for _, key := range keys[:len(keys)-1] {
|
||||||
_, cmd := testGenerateRootCommand(t)
|
_, cmd := testOperatorGenerateRootCommand(t)
|
||||||
cmd.client = client
|
cmd.client = client
|
||||||
|
|
||||||
code := cmd.Run([]string{
|
code := cmd.Run([]string{
|
||||||
@@ -309,7 +309,7 @@ func TestGenerateRootCommand_Run(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ui, cmd := testGenerateRootCommand(t)
|
ui, cmd := testOperatorGenerateRootCommand(t)
|
||||||
cmd.client = client
|
cmd.client = client
|
||||||
|
|
||||||
code := cmd.Run([]string{
|
code := cmd.Run([]string{
|
||||||
@@ -364,7 +364,7 @@ func TestGenerateRootCommand_Run(t *testing.T) {
|
|||||||
stdinW.Close()
|
stdinW.Close()
|
||||||
}()
|
}()
|
||||||
|
|
||||||
_, cmd := testGenerateRootCommand(t)
|
_, cmd := testOperatorGenerateRootCommand(t)
|
||||||
cmd.client = client
|
cmd.client = client
|
||||||
cmd.testStdin = stdinR
|
cmd.testStdin = stdinR
|
||||||
|
|
||||||
@@ -383,7 +383,7 @@ func TestGenerateRootCommand_Run(t *testing.T) {
|
|||||||
stdinW.Close()
|
stdinW.Close()
|
||||||
}()
|
}()
|
||||||
|
|
||||||
ui, cmd := testGenerateRootCommand(t)
|
ui, cmd := testOperatorGenerateRootCommand(t)
|
||||||
cmd.client = client
|
cmd.client = client
|
||||||
cmd.testStdin = stdinR
|
cmd.testStdin = stdinR
|
||||||
|
|
||||||
@@ -422,7 +422,7 @@ func TestGenerateRootCommand_Run(t *testing.T) {
|
|||||||
client, closer := testVaultServerBad(t)
|
client, closer := testVaultServerBad(t)
|
||||||
defer closer()
|
defer closer()
|
||||||
|
|
||||||
ui, cmd := testGenerateRootCommand(t)
|
ui, cmd := testOperatorGenerateRootCommand(t)
|
||||||
cmd.client = client
|
cmd.client = client
|
||||||
|
|
||||||
code := cmd.Run([]string{
|
code := cmd.Run([]string{
|
||||||
@@ -442,7 +442,7 @@ func TestGenerateRootCommand_Run(t *testing.T) {
|
|||||||
t.Run("no_tabs", func(t *testing.T) {
|
t.Run("no_tabs", func(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
_, cmd := testGenerateRootCommand(t)
|
_, cmd := testOperatorGenerateRootCommand(t)
|
||||||
assertNoTabs(t, cmd)
|
assertNoTabs(t, cmd)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -16,12 +16,10 @@ import (
|
|||||||
consulapi "github.com/hashicorp/consul/api"
|
consulapi "github.com/hashicorp/consul/api"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Ensure we are implementing the right interfaces.
|
var _ cli.Command = (*OperatorInitCommand)(nil)
|
||||||
var _ cli.Command = (*InitCommand)(nil)
|
var _ cli.CommandAutocomplete = (*OperatorInitCommand)(nil)
|
||||||
var _ cli.CommandAutocomplete = (*InitCommand)(nil)
|
|
||||||
|
|
||||||
// InitCommand is a Command that initializes a new Vault server.
|
type OperatorInitCommand struct {
|
||||||
type InitCommand struct {
|
|
||||||
*BaseCommand
|
*BaseCommand
|
||||||
|
|
||||||
flagStatus bool
|
flagStatus bool
|
||||||
@@ -46,13 +44,13 @@ type InitCommand struct {
|
|||||||
flagCheck bool
|
flagCheck bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *InitCommand) Synopsis() string {
|
func (c *OperatorInitCommand) Synopsis() string {
|
||||||
return "Initializes a server"
|
return "Initializes a server"
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *InitCommand) Help() string {
|
func (c *OperatorInitCommand) Help() string {
|
||||||
helpText := `
|
helpText := `
|
||||||
Usage: vault init [options]
|
Usage: vault operator init [options]
|
||||||
|
|
||||||
Initializes a Vault server. Initialization is the process by which Vault's
|
Initializes a Vault server. Initialization is the process by which Vault's
|
||||||
storage backend is prepared to receive data. Since Vault server's share the
|
storage backend is prepared to receive data. Since Vault server's share the
|
||||||
@@ -69,26 +67,24 @@ Usage: vault init [options]
|
|||||||
|
|
||||||
Start initialization with the default options:
|
Start initialization with the default options:
|
||||||
|
|
||||||
$ vault init
|
$ vault operator init
|
||||||
|
|
||||||
Initialize, but encrypt the unseal keys with pgp keys:
|
Initialize, but encrypt the unseal keys with pgp keys:
|
||||||
|
|
||||||
$ vault init \
|
$ vault operator init \
|
||||||
-key-shares=3 \
|
-key-shares=3 \
|
||||||
-key-threshold=2 \
|
-key-threshold=2 \
|
||||||
-pgp-keys="keybase:hashicorp,keybase:jefferai,keybase:sethvargo"
|
-pgp-keys="keybase:hashicorp,keybase:jefferai,keybase:sethvargo"
|
||||||
|
|
||||||
Encrypt the initial root token using a pgp key:
|
Encrypt the initial root token using a pgp key:
|
||||||
|
|
||||||
$ vault init -root-token-pgp-key="keybase:hashicorp"
|
$ vault operator init -root-token-pgp-key="keybase:hashicorp"
|
||||||
|
|
||||||
For a complete list of examples, please see the documentation.
|
|
||||||
|
|
||||||
` + c.Flags().Help()
|
` + c.Flags().Help()
|
||||||
return strings.TrimSpace(helpText)
|
return strings.TrimSpace(helpText)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *InitCommand) Flags() *FlagSets {
|
func (c *OperatorInitCommand) Flags() *FlagSets {
|
||||||
set := c.flagSet(FlagSetHTTP | FlagSetOutputFormat)
|
set := c.flagSet(FlagSetHTTP | FlagSetOutputFormat)
|
||||||
|
|
||||||
// Common Options
|
// Common Options
|
||||||
@@ -231,15 +227,15 @@ func (c *InitCommand) Flags() *FlagSets {
|
|||||||
return set
|
return set
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *InitCommand) AutocompleteArgs() complete.Predictor {
|
func (c *OperatorInitCommand) AutocompleteArgs() complete.Predictor {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *InitCommand) AutocompleteFlags() complete.Flags {
|
func (c *OperatorInitCommand) AutocompleteFlags() complete.Flags {
|
||||||
return c.Flags().Completions()
|
return c.Flags().Completions()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *InitCommand) Run(args []string) int {
|
func (c *OperatorInitCommand) Run(args []string) int {
|
||||||
f := c.Flags()
|
f := c.Flags()
|
||||||
|
|
||||||
if err := f.Parse(args); err != nil {
|
if err := f.Parse(args); err != nil {
|
||||||
@@ -293,7 +289,7 @@ func (c *InitCommand) Run(args []string) int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// consulAuto enables auto-joining via Consul.
|
// consulAuto enables auto-joining via Consul.
|
||||||
func (c *InitCommand) consulAuto(client *api.Client, req *api.InitRequest) int {
|
func (c *OperatorInitCommand) consulAuto(client *api.Client, req *api.InitRequest) int {
|
||||||
// Capture the client original address and reset it
|
// Capture the client original address and reset it
|
||||||
originalAddr := client.Address()
|
originalAddr := client.Address()
|
||||||
defer client.SetAddress(originalAddr)
|
defer client.SetAddress(originalAddr)
|
||||||
@@ -432,7 +428,7 @@ func (c *InitCommand) consulAuto(client *api.Client, req *api.InitRequest) int {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *InitCommand) init(client *api.Client, req *api.InitRequest) int {
|
func (c *OperatorInitCommand) init(client *api.Client, req *api.InitRequest) int {
|
||||||
resp, err := client.Sys().Init(req)
|
resp, err := client.Sys().Init(req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.UI.Error(fmt.Sprintf("Error initializing: %s", err))
|
c.UI.Error(fmt.Sprintf("Error initializing: %s", err))
|
||||||
@@ -509,7 +505,7 @@ func (c *InitCommand) init(client *api.Client, req *api.InitRequest) int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// initOutputYAML outputs the init output as YAML.
|
// initOutputYAML outputs the init output as YAML.
|
||||||
func (c *InitCommand) initOutputYAML(req *api.InitRequest, resp *api.InitResponse) int {
|
func (c *OperatorInitCommand) initOutputYAML(req *api.InitRequest, resp *api.InitResponse) int {
|
||||||
b, err := yaml.Marshal(newMachineInit(req, resp))
|
b, err := yaml.Marshal(newMachineInit(req, resp))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.UI.Error(fmt.Sprintf("Error marshaling YAML: %s", err))
|
c.UI.Error(fmt.Sprintf("Error marshaling YAML: %s", err))
|
||||||
@@ -519,7 +515,7 @@ func (c *InitCommand) initOutputYAML(req *api.InitRequest, resp *api.InitRespons
|
|||||||
}
|
}
|
||||||
|
|
||||||
// initOutputJSON outputs the init output as JSON.
|
// initOutputJSON outputs the init output as JSON.
|
||||||
func (c *InitCommand) initOutputJSON(req *api.InitRequest, resp *api.InitResponse) int {
|
func (c *OperatorInitCommand) initOutputJSON(req *api.InitRequest, resp *api.InitResponse) int {
|
||||||
b, err := json.Marshal(newMachineInit(req, resp))
|
b, err := json.Marshal(newMachineInit(req, resp))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.UI.Error(fmt.Sprintf("Error marshaling JSON: %s", err))
|
c.UI.Error(fmt.Sprintf("Error marshaling JSON: %s", err))
|
||||||
@@ -530,7 +526,7 @@ func (c *InitCommand) initOutputJSON(req *api.InitRequest, resp *api.InitRespons
|
|||||||
|
|
||||||
// status inspects the init status of vault and returns an appropriate error
|
// status inspects the init status of vault and returns an appropriate error
|
||||||
// code and message.
|
// code and message.
|
||||||
func (c *InitCommand) status(client *api.Client) int {
|
func (c *OperatorInitCommand) status(client *api.Client) int {
|
||||||
inited, err := client.Sys().InitStatus()
|
inited, err := client.Sys().InitStatus()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.UI.Error(fmt.Sprintf("Error checking init status: %s", err))
|
c.UI.Error(fmt.Sprintf("Error checking init status: %s", err))
|
||||||
@@ -13,18 +13,18 @@ import (
|
|||||||
"github.com/mitchellh/cli"
|
"github.com/mitchellh/cli"
|
||||||
)
|
)
|
||||||
|
|
||||||
func testInitCommand(tb testing.TB) (*cli.MockUi, *InitCommand) {
|
func testOperatorInitCommand(tb testing.TB) (*cli.MockUi, *OperatorInitCommand) {
|
||||||
tb.Helper()
|
tb.Helper()
|
||||||
|
|
||||||
ui := cli.NewMockUi()
|
ui := cli.NewMockUi()
|
||||||
return ui, &InitCommand{
|
return ui, &OperatorInitCommand{
|
||||||
BaseCommand: &BaseCommand{
|
BaseCommand: &BaseCommand{
|
||||||
UI: ui,
|
UI: ui,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestInitCommand_Run(t *testing.T) {
|
func TestOperatorInitCommand_Run(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
cases := []struct {
|
cases := []struct {
|
||||||
@@ -100,7 +100,7 @@ func TestInitCommand_Run(t *testing.T) {
|
|||||||
client, closer := testVaultServer(t)
|
client, closer := testVaultServer(t)
|
||||||
defer closer()
|
defer closer()
|
||||||
|
|
||||||
ui, cmd := testInitCommand(t)
|
ui, cmd := testOperatorInitCommand(t)
|
||||||
cmd.client = client
|
cmd.client = client
|
||||||
|
|
||||||
code := cmd.Run(tc.args)
|
code := cmd.Run(tc.args)
|
||||||
@@ -122,7 +122,7 @@ func TestInitCommand_Run(t *testing.T) {
|
|||||||
client, closer := testVaultServerUninit(t)
|
client, closer := testVaultServerUninit(t)
|
||||||
defer closer()
|
defer closer()
|
||||||
|
|
||||||
ui, cmd := testInitCommand(t)
|
ui, cmd := testOperatorInitCommand(t)
|
||||||
cmd.client = client
|
cmd.client = client
|
||||||
|
|
||||||
// Verify the non-init response code
|
// Verify the non-init response code
|
||||||
@@ -142,7 +142,7 @@ func TestInitCommand_Run(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Verify the init response code
|
// Verify the init response code
|
||||||
ui, cmd = testInitCommand(t)
|
ui, cmd = testOperatorInitCommand(t)
|
||||||
cmd.client = client
|
cmd.client = client
|
||||||
code = cmd.Run([]string{
|
code = cmd.Run([]string{
|
||||||
"-status",
|
"-status",
|
||||||
@@ -158,7 +158,7 @@ func TestInitCommand_Run(t *testing.T) {
|
|||||||
client, closer := testVaultServerUninit(t)
|
client, closer := testVaultServerUninit(t)
|
||||||
defer closer()
|
defer closer()
|
||||||
|
|
||||||
ui, cmd := testInitCommand(t)
|
ui, cmd := testOperatorInitCommand(t)
|
||||||
cmd.client = client
|
cmd.client = client
|
||||||
|
|
||||||
code := cmd.Run([]string{})
|
code := cmd.Run([]string{})
|
||||||
@@ -217,7 +217,7 @@ func TestInitCommand_Run(t *testing.T) {
|
|||||||
client, closer := testVaultServerUninit(t)
|
client, closer := testVaultServerUninit(t)
|
||||||
defer closer()
|
defer closer()
|
||||||
|
|
||||||
ui, cmd := testInitCommand(t)
|
ui, cmd := testOperatorInitCommand(t)
|
||||||
cmd.client = client
|
cmd.client = client
|
||||||
|
|
||||||
code := cmd.Run([]string{
|
code := cmd.Run([]string{
|
||||||
@@ -283,7 +283,7 @@ func TestInitCommand_Run(t *testing.T) {
|
|||||||
client, closer := testVaultServerUninit(t)
|
client, closer := testVaultServerUninit(t)
|
||||||
defer closer()
|
defer closer()
|
||||||
|
|
||||||
ui, cmd := testInitCommand(t)
|
ui, cmd := testOperatorInitCommand(t)
|
||||||
cmd.client = client
|
cmd.client = client
|
||||||
|
|
||||||
code := cmd.Run([]string{
|
code := cmd.Run([]string{
|
||||||
@@ -335,7 +335,7 @@ func TestInitCommand_Run(t *testing.T) {
|
|||||||
client, closer := testVaultServerBad(t)
|
client, closer := testVaultServerBad(t)
|
||||||
defer closer()
|
defer closer()
|
||||||
|
|
||||||
ui, cmd := testInitCommand(t)
|
ui, cmd := testOperatorInitCommand(t)
|
||||||
cmd.client = client
|
cmd.client = client
|
||||||
|
|
||||||
code := cmd.Run([]string{
|
code := cmd.Run([]string{
|
||||||
@@ -355,7 +355,7 @@ func TestInitCommand_Run(t *testing.T) {
|
|||||||
t.Run("no_tabs", func(t *testing.T) {
|
t.Run("no_tabs", func(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
_, cmd := testInitCommand(t)
|
_, cmd := testOperatorInitCommand(t)
|
||||||
assertNoTabs(t, cmd)
|
assertNoTabs(t, cmd)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -8,22 +8,20 @@ import (
|
|||||||
"github.com/posener/complete"
|
"github.com/posener/complete"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Ensure we are implementing the right interfaces.
|
var _ cli.Command = (*OperatorKeyStatusCommand)(nil)
|
||||||
var _ cli.Command = (*KeyStatusCommand)(nil)
|
var _ cli.CommandAutocomplete = (*OperatorKeyStatusCommand)(nil)
|
||||||
var _ cli.CommandAutocomplete = (*KeyStatusCommand)(nil)
|
|
||||||
|
|
||||||
// KeyStatusCommand is a Command that provides information about the key status
|
type OperatorKeyStatusCommand struct {
|
||||||
type KeyStatusCommand struct {
|
|
||||||
*BaseCommand
|
*BaseCommand
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *KeyStatusCommand) Synopsis() string {
|
func (c *OperatorKeyStatusCommand) Synopsis() string {
|
||||||
return "Provides information about the active encryption key"
|
return "Provides information about the active encryption key"
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *KeyStatusCommand) Help() string {
|
func (c *OperatorKeyStatusCommand) Help() string {
|
||||||
helpText := `
|
helpText := `
|
||||||
Usage: vault key-status [options]
|
Usage: vault operator key-status [options]
|
||||||
|
|
||||||
Provides information about the active encryption key. Specifically,
|
Provides information about the active encryption key. Specifically,
|
||||||
the current key term and the key installation time.
|
the current key term and the key installation time.
|
||||||
@@ -33,19 +31,19 @@ Usage: vault key-status [options]
|
|||||||
return strings.TrimSpace(helpText)
|
return strings.TrimSpace(helpText)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *KeyStatusCommand) Flags() *FlagSets {
|
func (c *OperatorKeyStatusCommand) Flags() *FlagSets {
|
||||||
return c.flagSet(FlagSetHTTP)
|
return c.flagSet(FlagSetHTTP)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *KeyStatusCommand) AutocompleteArgs() complete.Predictor {
|
func (c *OperatorKeyStatusCommand) AutocompleteArgs() complete.Predictor {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *KeyStatusCommand) AutocompleteFlags() complete.Flags {
|
func (c *OperatorKeyStatusCommand) AutocompleteFlags() complete.Flags {
|
||||||
return c.Flags().Completions()
|
return c.Flags().Completions()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *KeyStatusCommand) Run(args []string) int {
|
func (c *OperatorKeyStatusCommand) Run(args []string) int {
|
||||||
f := c.Flags()
|
f := c.Flags()
|
||||||
|
|
||||||
if err := f.Parse(args); err != nil {
|
if err := f.Parse(args); err != nil {
|
||||||
@@ -7,18 +7,18 @@ import (
|
|||||||
"github.com/mitchellh/cli"
|
"github.com/mitchellh/cli"
|
||||||
)
|
)
|
||||||
|
|
||||||
func testKeyStatusCommand(tb testing.TB) (*cli.MockUi, *KeyStatusCommand) {
|
func testOperatorKeyStatusCommand(tb testing.TB) (*cli.MockUi, *OperatorKeyStatusCommand) {
|
||||||
tb.Helper()
|
tb.Helper()
|
||||||
|
|
||||||
ui := cli.NewMockUi()
|
ui := cli.NewMockUi()
|
||||||
return ui, &KeyStatusCommand{
|
return ui, &OperatorKeyStatusCommand{
|
||||||
BaseCommand: &BaseCommand{
|
BaseCommand: &BaseCommand{
|
||||||
UI: ui,
|
UI: ui,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestKeyStatusCommand_Run(t *testing.T) {
|
func TestOperatorKeyStatusCommand_Run(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
cases := []struct {
|
cases := []struct {
|
||||||
@@ -44,7 +44,7 @@ func TestKeyStatusCommand_Run(t *testing.T) {
|
|||||||
t.Run(tc.name, func(t *testing.T) {
|
t.Run(tc.name, func(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
ui, cmd := testKeyStatusCommand(t)
|
ui, cmd := testOperatorKeyStatusCommand(t)
|
||||||
|
|
||||||
code := cmd.Run(tc.args)
|
code := cmd.Run(tc.args)
|
||||||
if code != tc.code {
|
if code != tc.code {
|
||||||
@@ -65,7 +65,7 @@ func TestKeyStatusCommand_Run(t *testing.T) {
|
|||||||
client, closer := testVaultServer(t)
|
client, closer := testVaultServer(t)
|
||||||
defer closer()
|
defer closer()
|
||||||
|
|
||||||
ui, cmd := testKeyStatusCommand(t)
|
ui, cmd := testOperatorKeyStatusCommand(t)
|
||||||
cmd.client = client
|
cmd.client = client
|
||||||
|
|
||||||
code := cmd.Run([]string{})
|
code := cmd.Run([]string{})
|
||||||
@@ -86,7 +86,7 @@ func TestKeyStatusCommand_Run(t *testing.T) {
|
|||||||
client, closer := testVaultServerBad(t)
|
client, closer := testVaultServerBad(t)
|
||||||
defer closer()
|
defer closer()
|
||||||
|
|
||||||
ui, cmd := testKeyStatusCommand(t)
|
ui, cmd := testOperatorKeyStatusCommand(t)
|
||||||
cmd.client = client
|
cmd.client = client
|
||||||
|
|
||||||
code := cmd.Run([]string{})
|
code := cmd.Run([]string{})
|
||||||
@@ -104,7 +104,7 @@ func TestKeyStatusCommand_Run(t *testing.T) {
|
|||||||
t.Run("no_tabs", func(t *testing.T) {
|
t.Run("no_tabs", func(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
_, cmd := testKeyStatusCommand(t)
|
_, cmd := testOperatorKeyStatusCommand(t)
|
||||||
assertNoTabs(t, cmd)
|
assertNoTabs(t, cmd)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -15,24 +15,12 @@ import (
|
|||||||
"github.com/posener/complete"
|
"github.com/posener/complete"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Ensure we are implementing the right interfaces.
|
var _ cli.Command = (*OperatorRekeyCommand)(nil)
|
||||||
var _ cli.Command = (*RekeyCommand)(nil)
|
var _ cli.CommandAutocomplete = (*OperatorRekeyCommand)(nil)
|
||||||
var _ cli.CommandAutocomplete = (*RekeyCommand)(nil)
|
|
||||||
|
|
||||||
// RekeyCommand is a Command that rekeys the vault.
|
type OperatorRekeyCommand struct {
|
||||||
type RekeyCommand struct {
|
|
||||||
*BaseCommand
|
*BaseCommand
|
||||||
|
|
||||||
// Key can be used to pre-seed the key. If it is set, it will not
|
|
||||||
// be asked with the `password` helper.
|
|
||||||
Key string
|
|
||||||
|
|
||||||
// The nonce for the rekey request to send along
|
|
||||||
Nonce string
|
|
||||||
|
|
||||||
// Whether to use the recovery key instead of barrier key, if available
|
|
||||||
RecoveryKey bool
|
|
||||||
|
|
||||||
flagCancel bool
|
flagCancel bool
|
||||||
flagInit bool
|
flagInit bool
|
||||||
flagKeyShares int
|
flagKeyShares int
|
||||||
@@ -56,11 +44,11 @@ type RekeyCommand struct {
|
|||||||
testStdin io.Reader // for tests
|
testStdin io.Reader // for tests
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *RekeyCommand) Synopsis() string {
|
func (c *OperatorRekeyCommand) Synopsis() string {
|
||||||
return "Generates new unseal keys"
|
return "Generates new unseal keys"
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *RekeyCommand) Help() string {
|
func (c *OperatorRekeyCommand) Help() string {
|
||||||
helpText := `
|
helpText := `
|
||||||
Usage: vault rekey [options] [KEY]
|
Usage: vault rekey [options] [KEY]
|
||||||
|
|
||||||
@@ -75,14 +63,14 @@ Usage: vault rekey [options] [KEY]
|
|||||||
|
|
||||||
Initialize a rekey:
|
Initialize a rekey:
|
||||||
|
|
||||||
$ vault rekey \
|
$ vault operator rekey \
|
||||||
-init \
|
-init \
|
||||||
-key-shares=15 \
|
-key-shares=15 \
|
||||||
-key-threshold=9
|
-key-threshold=9
|
||||||
|
|
||||||
Rekey and encrypt the resulting unseal keys with PGP:
|
Rekey and encrypt the resulting unseal keys with PGP:
|
||||||
|
|
||||||
$ vault rekey \
|
$ vault operator rekey \
|
||||||
-init \
|
-init \
|
||||||
-key-shares=3 \
|
-key-shares=3 \
|
||||||
-key-threshold=2 \
|
-key-threshold=2 \
|
||||||
@@ -90,29 +78,27 @@ Usage: vault rekey [options] [KEY]
|
|||||||
|
|
||||||
Store encrypted PGP keys in Vault's core:
|
Store encrypted PGP keys in Vault's core:
|
||||||
|
|
||||||
$ vault rekey \
|
$ vault operator rekey \
|
||||||
-init \
|
-init \
|
||||||
-pgp-keys="..." \
|
-pgp-keys="..." \
|
||||||
-backup
|
-backup
|
||||||
|
|
||||||
Retrieve backed-up unseal keys:
|
Retrieve backed-up unseal keys:
|
||||||
|
|
||||||
$ vault rekey -backup-retrieve
|
$ vault operator rekey -backup-retrieve
|
||||||
|
|
||||||
Delete backed-up unseal keys:
|
Delete backed-up unseal keys:
|
||||||
|
|
||||||
$ vault rekey -backup-delete
|
$ vault operator rekey -backup-delete
|
||||||
|
|
||||||
For a full list of examples, please see the documentation.
|
|
||||||
|
|
||||||
` + c.Flags().Help()
|
` + c.Flags().Help()
|
||||||
return strings.TrimSpace(helpText)
|
return strings.TrimSpace(helpText)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *RekeyCommand) Flags() *FlagSets {
|
func (c *OperatorRekeyCommand) Flags() *FlagSets {
|
||||||
set := c.flagSet(FlagSetHTTP)
|
set := c.flagSet(FlagSetHTTP)
|
||||||
|
|
||||||
f := set.NewFlagSet("Command Options")
|
f := set.NewFlagSet("Common Options")
|
||||||
|
|
||||||
f.BoolVar(&BoolVar{
|
f.BoolVar(&BoolVar{
|
||||||
Name: "init",
|
Name: "init",
|
||||||
@@ -136,7 +122,7 @@ func (c *RekeyCommand) Flags() *FlagSets {
|
|||||||
Name: "status",
|
Name: "status",
|
||||||
Target: &c.flagStatus,
|
Target: &c.flagStatus,
|
||||||
Default: false,
|
Default: false,
|
||||||
Usage: "Print the status of the current attempt without provding an " +
|
Usage: "Print the status of the current attempt without providing an " +
|
||||||
"unseal key.",
|
"unseal key.",
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -188,8 +174,7 @@ func (c *RekeyCommand) Flags() *FlagSets {
|
|||||||
"public GPG keys OR a comma-separated list of Keybase usernames using " +
|
"public GPG keys OR a comma-separated list of Keybase usernames using " +
|
||||||
"the format \"keybase:<username>\". When supplied, the generated " +
|
"the format \"keybase:<username>\". When supplied, the generated " +
|
||||||
"unseal keys will be encrypted and base64-encoded in the order " +
|
"unseal keys will be encrypted and base64-encoded in the order " +
|
||||||
"specified in this list. The number of entires must match -key-shares, " +
|
"specified in this list.",
|
||||||
"unless -store-shares are used.",
|
|
||||||
})
|
})
|
||||||
|
|
||||||
f = set.NewFlagSet("Backup Options")
|
f = set.NewFlagSet("Backup Options")
|
||||||
@@ -216,7 +201,7 @@ func (c *RekeyCommand) Flags() *FlagSets {
|
|||||||
Name: "backup-retrieve",
|
Name: "backup-retrieve",
|
||||||
Target: &c.flagBackupRetrieve,
|
Target: &c.flagBackupRetrieve,
|
||||||
Default: false,
|
Default: false,
|
||||||
Usage: "Retrieve the backed-up unseal keys. This option is only avaiable " +
|
Usage: "Retrieve the backed-up unseal keys. This option is only available " +
|
||||||
"if the PGP keys were provided and the backup has not been deleted.",
|
"if the PGP keys were provided and the backup has not been deleted.",
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -249,15 +234,15 @@ func (c *RekeyCommand) Flags() *FlagSets {
|
|||||||
return set
|
return set
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *RekeyCommand) AutocompleteArgs() complete.Predictor {
|
func (c *OperatorRekeyCommand) AutocompleteArgs() complete.Predictor {
|
||||||
return complete.PredictAnything
|
return complete.PredictAnything
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *RekeyCommand) AutocompleteFlags() complete.Flags {
|
func (c *OperatorRekeyCommand) AutocompleteFlags() complete.Flags {
|
||||||
return c.Flags().Completions()
|
return c.Flags().Completions()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *RekeyCommand) Run(args []string) int {
|
func (c *OperatorRekeyCommand) Run(args []string) int {
|
||||||
f := c.Flags()
|
f := c.Flags()
|
||||||
|
|
||||||
if err := f.Parse(args); err != nil {
|
if err := f.Parse(args); err != nil {
|
||||||
@@ -324,7 +309,7 @@ func (c *RekeyCommand) Run(args []string) int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// init starts the rekey process.
|
// init starts the rekey process.
|
||||||
func (c *RekeyCommand) init(client *api.Client) int {
|
func (c *OperatorRekeyCommand) init(client *api.Client) int {
|
||||||
// Handle the different API requests
|
// Handle the different API requests
|
||||||
var fn func(*api.RekeyInitRequest) (*api.RekeyStatusResponse, error)
|
var fn func(*api.RekeyInitRequest) (*api.RekeyStatusResponse, error)
|
||||||
switch strings.ToLower(strings.TrimSpace(c.flagTarget)) {
|
switch strings.ToLower(strings.TrimSpace(c.flagTarget)) {
|
||||||
@@ -377,7 +362,7 @@ func (c *RekeyCommand) init(client *api.Client) int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// cancel is used to abort the rekey process.
|
// cancel is used to abort the rekey process.
|
||||||
func (c *RekeyCommand) cancel(client *api.Client) int {
|
func (c *OperatorRekeyCommand) cancel(client *api.Client) int {
|
||||||
// Handle the different API requests
|
// Handle the different API requests
|
||||||
var fn func() error
|
var fn func() error
|
||||||
switch strings.ToLower(strings.TrimSpace(c.flagTarget)) {
|
switch strings.ToLower(strings.TrimSpace(c.flagTarget)) {
|
||||||
@@ -402,7 +387,7 @@ func (c *RekeyCommand) cancel(client *api.Client) int {
|
|||||||
|
|
||||||
// provide prompts the user for the seal key and posts it to the update root
|
// provide prompts the user for the seal key and posts it to the update root
|
||||||
// endpoint. If this is the last unseal, this function outputs it.
|
// endpoint. If this is the last unseal, this function outputs it.
|
||||||
func (c *RekeyCommand) provide(client *api.Client, key string) int {
|
func (c *OperatorRekeyCommand) provide(client *api.Client, key string) int {
|
||||||
var statusFn func() (*api.RekeyStatusResponse, error)
|
var statusFn func() (*api.RekeyStatusResponse, error)
|
||||||
var updateFn func(string, string) (*api.RekeyUpdateResponse, error)
|
var updateFn func(string, string) (*api.RekeyUpdateResponse, error)
|
||||||
|
|
||||||
@@ -504,7 +489,7 @@ func (c *RekeyCommand) provide(client *api.Client, key string) int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// status is used just to fetch and dump the status.
|
// status is used just to fetch and dump the status.
|
||||||
func (c *RekeyCommand) status(client *api.Client) int {
|
func (c *OperatorRekeyCommand) status(client *api.Client) int {
|
||||||
// Handle the different API requests
|
// Handle the different API requests
|
||||||
var fn func() (*api.RekeyStatusResponse, error)
|
var fn func() (*api.RekeyStatusResponse, error)
|
||||||
switch strings.ToLower(strings.TrimSpace(c.flagTarget)) {
|
switch strings.ToLower(strings.TrimSpace(c.flagTarget)) {
|
||||||
@@ -528,7 +513,7 @@ func (c *RekeyCommand) status(client *api.Client) int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// backupRetrieve retrieves the stored backup keys.
|
// backupRetrieve retrieves the stored backup keys.
|
||||||
func (c *RekeyCommand) backupRetrieve(client *api.Client) int {
|
func (c *OperatorRekeyCommand) backupRetrieve(client *api.Client) int {
|
||||||
// Handle the different API requests
|
// Handle the different API requests
|
||||||
var fn func() (*api.RekeyRetrieveResponse, error)
|
var fn func() (*api.RekeyRetrieveResponse, error)
|
||||||
switch strings.ToLower(strings.TrimSpace(c.flagTarget)) {
|
switch strings.ToLower(strings.TrimSpace(c.flagTarget)) {
|
||||||
@@ -556,7 +541,7 @@ func (c *RekeyCommand) backupRetrieve(client *api.Client) int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// backupDelete deletes the stored backup keys.
|
// backupDelete deletes the stored backup keys.
|
||||||
func (c *RekeyCommand) backupDelete(client *api.Client) int {
|
func (c *OperatorRekeyCommand) backupDelete(client *api.Client) int {
|
||||||
// Handle the different API requests
|
// Handle the different API requests
|
||||||
var fn func() error
|
var fn func() error
|
||||||
switch strings.ToLower(strings.TrimSpace(c.flagTarget)) {
|
switch strings.ToLower(strings.TrimSpace(c.flagTarget)) {
|
||||||
@@ -580,7 +565,7 @@ func (c *RekeyCommand) backupDelete(client *api.Client) int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// printStatus dumps the status to output
|
// printStatus dumps the status to output
|
||||||
func (c *RekeyCommand) printStatus(status *api.RekeyStatusResponse) int {
|
func (c *OperatorRekeyCommand) printStatus(status *api.RekeyStatusResponse) int {
|
||||||
out := []string{}
|
out := []string{}
|
||||||
out = append(out, fmt.Sprintf("Nonce | %s", status.Nonce))
|
out = append(out, fmt.Sprintf("Nonce | %s", status.Nonce))
|
||||||
out = append(out, fmt.Sprintf("Started | %t", status.Started))
|
out = append(out, fmt.Sprintf("Started | %t", status.Started))
|
||||||
@@ -596,12 +581,12 @@ func (c *RekeyCommand) printStatus(status *api.RekeyStatusResponse) int {
|
|||||||
out = append(out, fmt.Sprintf("Backup | %t", status.Backup))
|
out = append(out, fmt.Sprintf("Backup | %t", status.Backup))
|
||||||
}
|
}
|
||||||
|
|
||||||
output := columnOutput(out)
|
output := columnOutput(out, nil)
|
||||||
c.UI.Output(output)
|
c.UI.Output(output)
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *RekeyCommand) printUnsealKeys(status *api.RekeyStatusResponse, resp *api.RekeyUpdateResponse) int {
|
func (c *OperatorRekeyCommand) printUnsealKeys(status *api.RekeyStatusResponse, resp *api.RekeyUpdateResponse) int {
|
||||||
// Space between the key prompt, if any, and the output
|
// Space between the key prompt, if any, and the output
|
||||||
c.UI.Output("")
|
c.UI.Output("")
|
||||||
|
|
||||||
@@ -633,7 +618,7 @@ func (c *RekeyCommand) printUnsealKeys(status *api.RekeyStatusResponse, resp *ap
|
|||||||
c.UI.Output("")
|
c.UI.Output("")
|
||||||
c.UI.Output(wrapAtLength(fmt.Sprintf(
|
c.UI.Output(wrapAtLength(fmt.Sprintf(
|
||||||
"The encrypted unseal keys are backed up to \"core/unseal-keys-backup\"" +
|
"The encrypted unseal keys are backed up to \"core/unseal-keys-backup\"" +
|
||||||
"in the physical backend. Remove these keys at any time using " +
|
"in the storage backend. Remove these keys at any time using " +
|
||||||
"\"vault rekey -delete-backup\". Vault does not automatically remove " +
|
"\"vault rekey -delete-backup\". Vault does not automatically remove " +
|
||||||
"these keys.",
|
"these keys.",
|
||||||
)))
|
)))
|
||||||
@@ -11,18 +11,18 @@ import (
|
|||||||
"github.com/mitchellh/cli"
|
"github.com/mitchellh/cli"
|
||||||
)
|
)
|
||||||
|
|
||||||
func testRekeyCommand(tb testing.TB) (*cli.MockUi, *RekeyCommand) {
|
func testOperatorRekeyCommand(tb testing.TB) (*cli.MockUi, *OperatorRekeyCommand) {
|
||||||
tb.Helper()
|
tb.Helper()
|
||||||
|
|
||||||
ui := cli.NewMockUi()
|
ui := cli.NewMockUi()
|
||||||
return ui, &RekeyCommand{
|
return ui, &OperatorRekeyCommand{
|
||||||
BaseCommand: &BaseCommand{
|
BaseCommand: &BaseCommand{
|
||||||
UI: ui,
|
UI: ui,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestRekeyCommand_Run(t *testing.T) {
|
func TestOperatorRekeyCommand_Run(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
cases := []struct {
|
cases := []struct {
|
||||||
@@ -75,7 +75,7 @@ func TestRekeyCommand_Run(t *testing.T) {
|
|||||||
client, closer := testVaultServer(t)
|
client, closer := testVaultServer(t)
|
||||||
defer closer()
|
defer closer()
|
||||||
|
|
||||||
ui, cmd := testRekeyCommand(t)
|
ui, cmd := testOperatorRekeyCommand(t)
|
||||||
cmd.client = client
|
cmd.client = client
|
||||||
|
|
||||||
code := cmd.Run(tc.args)
|
code := cmd.Run(tc.args)
|
||||||
@@ -97,7 +97,7 @@ func TestRekeyCommand_Run(t *testing.T) {
|
|||||||
client, closer := testVaultServer(t)
|
client, closer := testVaultServer(t)
|
||||||
defer closer()
|
defer closer()
|
||||||
|
|
||||||
ui, cmd := testRekeyCommand(t)
|
ui, cmd := testOperatorRekeyCommand(t)
|
||||||
cmd.client = client
|
cmd.client = client
|
||||||
|
|
||||||
// Verify the non-init response
|
// Verify the non-init response
|
||||||
@@ -123,7 +123,7 @@ func TestRekeyCommand_Run(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Verify the init response
|
// Verify the init response
|
||||||
ui, cmd = testRekeyCommand(t)
|
ui, cmd = testOperatorRekeyCommand(t)
|
||||||
cmd.client = client
|
cmd.client = client
|
||||||
code = cmd.Run([]string{
|
code = cmd.Run([]string{
|
||||||
"-status",
|
"-status",
|
||||||
@@ -153,7 +153,7 @@ func TestRekeyCommand_Run(t *testing.T) {
|
|||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
ui, cmd := testRekeyCommand(t)
|
ui, cmd := testOperatorRekeyCommand(t)
|
||||||
cmd.client = client
|
cmd.client = client
|
||||||
|
|
||||||
code := cmd.Run([]string{
|
code := cmd.Run([]string{
|
||||||
@@ -185,7 +185,7 @@ func TestRekeyCommand_Run(t *testing.T) {
|
|||||||
client, closer := testVaultServer(t)
|
client, closer := testVaultServer(t)
|
||||||
defer closer()
|
defer closer()
|
||||||
|
|
||||||
ui, cmd := testRekeyCommand(t)
|
ui, cmd := testOperatorRekeyCommand(t)
|
||||||
cmd.client = client
|
cmd.client = client
|
||||||
|
|
||||||
code := cmd.Run([]string{
|
code := cmd.Run([]string{
|
||||||
@@ -221,7 +221,7 @@ func TestRekeyCommand_Run(t *testing.T) {
|
|||||||
client, closer := testVaultServer(t)
|
client, closer := testVaultServer(t)
|
||||||
defer closer()
|
defer closer()
|
||||||
|
|
||||||
ui, cmd := testRekeyCommand(t)
|
ui, cmd := testOperatorRekeyCommand(t)
|
||||||
cmd.client = client
|
cmd.client = client
|
||||||
|
|
||||||
code := cmd.Run([]string{
|
code := cmd.Run([]string{
|
||||||
@@ -270,7 +270,7 @@ func TestRekeyCommand_Run(t *testing.T) {
|
|||||||
|
|
||||||
// Supply the first n-1 unseal keys
|
// Supply the first n-1 unseal keys
|
||||||
for _, key := range keys[:len(keys)-1] {
|
for _, key := range keys[:len(keys)-1] {
|
||||||
ui, cmd := testRekeyCommand(t)
|
ui, cmd := testOperatorRekeyCommand(t)
|
||||||
cmd.client = client
|
cmd.client = client
|
||||||
|
|
||||||
code := cmd.Run([]string{
|
code := cmd.Run([]string{
|
||||||
@@ -282,7 +282,7 @@ func TestRekeyCommand_Run(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ui, cmd := testRekeyCommand(t)
|
ui, cmd := testOperatorRekeyCommand(t)
|
||||||
cmd.client = client
|
cmd.client = client
|
||||||
|
|
||||||
code := cmd.Run([]string{
|
code := cmd.Run([]string{
|
||||||
@@ -338,7 +338,7 @@ func TestRekeyCommand_Run(t *testing.T) {
|
|||||||
stdinW.Close()
|
stdinW.Close()
|
||||||
}()
|
}()
|
||||||
|
|
||||||
ui, cmd := testRekeyCommand(t)
|
ui, cmd := testOperatorRekeyCommand(t)
|
||||||
cmd.client = client
|
cmd.client = client
|
||||||
cmd.testStdin = stdinR
|
cmd.testStdin = stdinR
|
||||||
|
|
||||||
@@ -357,7 +357,7 @@ func TestRekeyCommand_Run(t *testing.T) {
|
|||||||
stdinW.Close()
|
stdinW.Close()
|
||||||
}()
|
}()
|
||||||
|
|
||||||
ui, cmd := testRekeyCommand(t)
|
ui, cmd := testOperatorRekeyCommand(t)
|
||||||
cmd.client = client
|
cmd.client = client
|
||||||
cmd.testStdin = stdinR
|
cmd.testStdin = stdinR
|
||||||
|
|
||||||
@@ -399,7 +399,7 @@ func TestRekeyCommand_Run(t *testing.T) {
|
|||||||
client, keys, closer := testVaultServerUnseal(t)
|
client, keys, closer := testVaultServerUnseal(t)
|
||||||
defer closer()
|
defer closer()
|
||||||
|
|
||||||
ui, cmd := testRekeyCommand(t)
|
ui, cmd := testOperatorRekeyCommand(t)
|
||||||
cmd.client = client
|
cmd.client = client
|
||||||
|
|
||||||
code := cmd.Run([]string{
|
code := cmd.Run([]string{
|
||||||
@@ -423,7 +423,7 @@ func TestRekeyCommand_Run(t *testing.T) {
|
|||||||
var combined string
|
var combined string
|
||||||
// Supply the unseal keys
|
// Supply the unseal keys
|
||||||
for _, key := range keys {
|
for _, key := range keys {
|
||||||
ui, cmd := testRekeyCommand(t)
|
ui, cmd := testOperatorRekeyCommand(t)
|
||||||
cmd.client = client
|
cmd.client = client
|
||||||
|
|
||||||
code := cmd.Run([]string{
|
code := cmd.Run([]string{
|
||||||
@@ -448,7 +448,7 @@ func TestRekeyCommand_Run(t *testing.T) {
|
|||||||
fingerprint, encryptedKey := match[0][1], match[0][2]
|
fingerprint, encryptedKey := match[0][1], match[0][2]
|
||||||
|
|
||||||
// Get the backup
|
// Get the backup
|
||||||
ui, cmd = testRekeyCommand(t)
|
ui, cmd = testOperatorRekeyCommand(t)
|
||||||
cmd.client = client
|
cmd.client = client
|
||||||
|
|
||||||
code = cmd.Run([]string{
|
code = cmd.Run([]string{
|
||||||
@@ -467,7 +467,7 @@ func TestRekeyCommand_Run(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Delete the backup
|
// Delete the backup
|
||||||
ui, cmd = testRekeyCommand(t)
|
ui, cmd = testOperatorRekeyCommand(t)
|
||||||
cmd.client = client
|
cmd.client = client
|
||||||
|
|
||||||
code = cmd.Run([]string{
|
code = cmd.Run([]string{
|
||||||
@@ -489,7 +489,7 @@ func TestRekeyCommand_Run(t *testing.T) {
|
|||||||
client, closer := testVaultServerBad(t)
|
client, closer := testVaultServerBad(t)
|
||||||
defer closer()
|
defer closer()
|
||||||
|
|
||||||
ui, cmd := testRekeyCommand(t)
|
ui, cmd := testOperatorRekeyCommand(t)
|
||||||
cmd.client = client
|
cmd.client = client
|
||||||
|
|
||||||
code := cmd.Run([]string{
|
code := cmd.Run([]string{
|
||||||
@@ -509,7 +509,7 @@ func TestRekeyCommand_Run(t *testing.T) {
|
|||||||
t.Run("no_tabs", func(t *testing.T) {
|
t.Run("no_tabs", func(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
_, cmd := testRekeyCommand(t)
|
_, cmd := testOperatorRekeyCommand(t)
|
||||||
assertNoTabs(t, cmd)
|
assertNoTabs(t, cmd)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -8,20 +8,18 @@ import (
|
|||||||
"github.com/posener/complete"
|
"github.com/posener/complete"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Ensure we are implementing the right interfaces.
|
var _ cli.Command = (*OperatorSealCommand)(nil)
|
||||||
var _ cli.Command = (*SealCommand)(nil)
|
var _ cli.CommandAutocomplete = (*OperatorSealCommand)(nil)
|
||||||
var _ cli.CommandAutocomplete = (*SealCommand)(nil)
|
|
||||||
|
|
||||||
// SealCommand is a Command that seals the vault.
|
type OperatorSealCommand struct {
|
||||||
type SealCommand struct {
|
|
||||||
*BaseCommand
|
*BaseCommand
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *SealCommand) Synopsis() string {
|
func (c *OperatorSealCommand) Synopsis() string {
|
||||||
return "Seals the Vault server"
|
return "Seals the Vault server"
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *SealCommand) Help() string {
|
func (c *OperatorSealCommand) Help() string {
|
||||||
helpText := `
|
helpText := `
|
||||||
Usage: vault seal [options]
|
Usage: vault seal [options]
|
||||||
|
|
||||||
@@ -37,29 +35,26 @@ Usage: vault seal [options]
|
|||||||
|
|
||||||
Seal the Vault server:
|
Seal the Vault server:
|
||||||
|
|
||||||
$ vault seal
|
$ vault operator seal
|
||||||
|
|
||||||
For a full list of examples and why you might want to seal the Vault, please
|
|
||||||
see the documentation.
|
|
||||||
|
|
||||||
` + c.Flags().Help()
|
` + c.Flags().Help()
|
||||||
|
|
||||||
return strings.TrimSpace(helpText)
|
return strings.TrimSpace(helpText)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *SealCommand) Flags() *FlagSets {
|
func (c *OperatorSealCommand) Flags() *FlagSets {
|
||||||
return c.flagSet(FlagSetHTTP)
|
return c.flagSet(FlagSetHTTP)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *SealCommand) AutocompleteArgs() complete.Predictor {
|
func (c *OperatorSealCommand) AutocompleteArgs() complete.Predictor {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *SealCommand) AutocompleteFlags() complete.Flags {
|
func (c *OperatorSealCommand) AutocompleteFlags() complete.Flags {
|
||||||
return c.Flags().Completions()
|
return c.Flags().Completions()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *SealCommand) Run(args []string) int {
|
func (c *OperatorSealCommand) Run(args []string) int {
|
||||||
f := c.Flags()
|
f := c.Flags()
|
||||||
|
|
||||||
if err := f.Parse(args); err != nil {
|
if err := f.Parse(args); err != nil {
|
||||||
@@ -7,18 +7,18 @@ import (
|
|||||||
"github.com/mitchellh/cli"
|
"github.com/mitchellh/cli"
|
||||||
)
|
)
|
||||||
|
|
||||||
func testSealCommand(tb testing.TB) (*cli.MockUi, *SealCommand) {
|
func testOperatorSealCommand(tb testing.TB) (*cli.MockUi, *OperatorSealCommand) {
|
||||||
tb.Helper()
|
tb.Helper()
|
||||||
|
|
||||||
ui := cli.NewMockUi()
|
ui := cli.NewMockUi()
|
||||||
return ui, &SealCommand{
|
return ui, &OperatorSealCommand{
|
||||||
BaseCommand: &BaseCommand{
|
BaseCommand: &BaseCommand{
|
||||||
UI: ui,
|
UI: ui,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestSealCommand_Run(t *testing.T) {
|
func TestOperatorSealCommand_Run(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
cases := []struct {
|
cases := []struct {
|
||||||
@@ -47,7 +47,7 @@ func TestSealCommand_Run(t *testing.T) {
|
|||||||
client, closer := testVaultServer(t)
|
client, closer := testVaultServer(t)
|
||||||
defer closer()
|
defer closer()
|
||||||
|
|
||||||
ui, cmd := testSealCommand(t)
|
ui, cmd := testOperatorSealCommand(t)
|
||||||
cmd.client = client
|
cmd.client = client
|
||||||
|
|
||||||
code := cmd.Run(tc.args)
|
code := cmd.Run(tc.args)
|
||||||
@@ -69,7 +69,7 @@ func TestSealCommand_Run(t *testing.T) {
|
|||||||
client, closer := testVaultServer(t)
|
client, closer := testVaultServer(t)
|
||||||
defer closer()
|
defer closer()
|
||||||
|
|
||||||
ui, cmd := testSealCommand(t)
|
ui, cmd := testOperatorSealCommand(t)
|
||||||
cmd.client = client
|
cmd.client = client
|
||||||
|
|
||||||
code := cmd.Run([]string{})
|
code := cmd.Run([]string{})
|
||||||
@@ -98,7 +98,7 @@ func TestSealCommand_Run(t *testing.T) {
|
|||||||
client, closer := testVaultServerBad(t)
|
client, closer := testVaultServerBad(t)
|
||||||
defer closer()
|
defer closer()
|
||||||
|
|
||||||
ui, cmd := testSealCommand(t)
|
ui, cmd := testOperatorSealCommand(t)
|
||||||
cmd.client = client
|
cmd.client = client
|
||||||
|
|
||||||
code := cmd.Run([]string{})
|
code := cmd.Run([]string{})
|
||||||
@@ -116,7 +116,7 @@ func TestSealCommand_Run(t *testing.T) {
|
|||||||
t.Run("no_tabs", func(t *testing.T) {
|
t.Run("no_tabs", func(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
_, cmd := testSealCommand(t)
|
_, cmd := testOperatorSealCommand(t)
|
||||||
assertNoTabs(t, cmd)
|
assertNoTabs(t, cmd)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -8,23 +8,20 @@ import (
|
|||||||
"github.com/posener/complete"
|
"github.com/posener/complete"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Ensure we are implementing the right interfaces.
|
var _ cli.Command = (*OperatorStepDownCommand)(nil)
|
||||||
var _ cli.Command = (*StepDownCommand)(nil)
|
var _ cli.CommandAutocomplete = (*OperatorStepDownCommand)(nil)
|
||||||
var _ cli.CommandAutocomplete = (*StepDownCommand)(nil)
|
|
||||||
|
|
||||||
// StepDownCommand is a Command that tells the Vault server to give up its
|
type OperatorStepDownCommand struct {
|
||||||
// leadership
|
|
||||||
type StepDownCommand struct {
|
|
||||||
*BaseCommand
|
*BaseCommand
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *StepDownCommand) Synopsis() string {
|
func (c *OperatorStepDownCommand) Synopsis() string {
|
||||||
return "Forces Vault to resign active duty"
|
return "Forces Vault to resign active duty"
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *StepDownCommand) Help() string {
|
func (c *OperatorStepDownCommand) Help() string {
|
||||||
helpText := `
|
helpText := `
|
||||||
Usage: vault step-down [options]
|
Usage: vault operator step-down [options]
|
||||||
|
|
||||||
Forces the Vault server at the given address to step down from active duty.
|
Forces the Vault server at the given address to step down from active duty.
|
||||||
While the affected node will have a delay before attempting to acquire the
|
While the affected node will have a delay before attempting to acquire the
|
||||||
@@ -34,28 +31,26 @@ Usage: vault step-down [options]
|
|||||||
|
|
||||||
Force Vault to step down as the leader:
|
Force Vault to step down as the leader:
|
||||||
|
|
||||||
$ vault step-down
|
$ vault operator step-down
|
||||||
|
|
||||||
For a full list of examples, please see the documentation.
|
|
||||||
|
|
||||||
` + c.Flags().Help()
|
` + c.Flags().Help()
|
||||||
|
|
||||||
return strings.TrimSpace(helpText)
|
return strings.TrimSpace(helpText)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *StepDownCommand) Flags() *FlagSets {
|
func (c *OperatorStepDownCommand) Flags() *FlagSets {
|
||||||
return c.flagSet(FlagSetHTTP)
|
return c.flagSet(FlagSetHTTP)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *StepDownCommand) AutocompleteArgs() complete.Predictor {
|
func (c *OperatorStepDownCommand) AutocompleteArgs() complete.Predictor {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *StepDownCommand) AutocompleteFlags() complete.Flags {
|
func (c *OperatorStepDownCommand) AutocompleteFlags() complete.Flags {
|
||||||
return c.Flags().Completions()
|
return c.Flags().Completions()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *StepDownCommand) Run(args []string) int {
|
func (c *OperatorStepDownCommand) Run(args []string) int {
|
||||||
f := c.Flags()
|
f := c.Flags()
|
||||||
|
|
||||||
if err := f.Parse(args); err != nil {
|
if err := f.Parse(args); err != nil {
|
||||||
@@ -7,18 +7,18 @@ import (
|
|||||||
"github.com/mitchellh/cli"
|
"github.com/mitchellh/cli"
|
||||||
)
|
)
|
||||||
|
|
||||||
func testStepDownCommand(tb testing.TB) (*cli.MockUi, *StepDownCommand) {
|
func testOperatorStepDownCommand(tb testing.TB) (*cli.MockUi, *OperatorStepDownCommand) {
|
||||||
tb.Helper()
|
tb.Helper()
|
||||||
|
|
||||||
ui := cli.NewMockUi()
|
ui := cli.NewMockUi()
|
||||||
return ui, &StepDownCommand{
|
return ui, &OperatorStepDownCommand{
|
||||||
BaseCommand: &BaseCommand{
|
BaseCommand: &BaseCommand{
|
||||||
UI: ui,
|
UI: ui,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestStepDownCommand_Run(t *testing.T) {
|
func TestOperatorStepDownCommand_Run(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
cases := []struct {
|
cases := []struct {
|
||||||
@@ -53,7 +53,7 @@ func TestStepDownCommand_Run(t *testing.T) {
|
|||||||
client, closer := testVaultServer(t)
|
client, closer := testVaultServer(t)
|
||||||
defer closer()
|
defer closer()
|
||||||
|
|
||||||
ui, cmd := testStepDownCommand(t)
|
ui, cmd := testOperatorStepDownCommand(t)
|
||||||
cmd.client = client
|
cmd.client = client
|
||||||
|
|
||||||
code := cmd.Run(tc.args)
|
code := cmd.Run(tc.args)
|
||||||
@@ -75,7 +75,7 @@ func TestStepDownCommand_Run(t *testing.T) {
|
|||||||
client, closer := testVaultServerBad(t)
|
client, closer := testVaultServerBad(t)
|
||||||
defer closer()
|
defer closer()
|
||||||
|
|
||||||
ui, cmd := testStepDownCommand(t)
|
ui, cmd := testOperatorStepDownCommand(t)
|
||||||
cmd.client = client
|
cmd.client = client
|
||||||
|
|
||||||
code := cmd.Run([]string{})
|
code := cmd.Run([]string{})
|
||||||
@@ -93,7 +93,7 @@ func TestStepDownCommand_Run(t *testing.T) {
|
|||||||
t.Run("no_tabs", func(t *testing.T) {
|
t.Run("no_tabs", func(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
_, cmd := testStepDownCommand(t)
|
_, cmd := testOperatorStepDownCommand(t)
|
||||||
assertNoTabs(t, cmd)
|
assertNoTabs(t, cmd)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -12,12 +12,10 @@ import (
|
|||||||
"github.com/posener/complete"
|
"github.com/posener/complete"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Ensure we are implementing the right interfaces.
|
var _ cli.Command = (*OperatorUnsealCommand)(nil)
|
||||||
var _ cli.Command = (*UnsealCommand)(nil)
|
var _ cli.CommandAutocomplete = (*OperatorUnsealCommand)(nil)
|
||||||
var _ cli.CommandAutocomplete = (*UnsealCommand)(nil)
|
|
||||||
|
|
||||||
// UnsealCommand is a Command that unseals the vault.
|
type OperatorUnsealCommand struct {
|
||||||
type UnsealCommand struct {
|
|
||||||
*BaseCommand
|
*BaseCommand
|
||||||
|
|
||||||
flagReset bool
|
flagReset bool
|
||||||
@@ -25,13 +23,13 @@ type UnsealCommand struct {
|
|||||||
testOutput io.Writer // for tests
|
testOutput io.Writer // for tests
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *UnsealCommand) Synopsis() string {
|
func (c *OperatorUnsealCommand) Synopsis() string {
|
||||||
return "Unseals the Vault server"
|
return "Unseals the Vault server"
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *UnsealCommand) Help() string {
|
func (c *OperatorUnsealCommand) Help() string {
|
||||||
helpText := `
|
helpText := `
|
||||||
Usage: vault unseal [options] [KEY]
|
Usage: vault operator unseal [options] [KEY]
|
||||||
|
|
||||||
Provide a portion of the master key to unseal a Vault server. Vault starts
|
Provide a portion of the master key to unseal a Vault server. Vault starts
|
||||||
in a sealed state. It cannot perform operations until it is unsealed. This
|
in a sealed state. It cannot perform operations until it is unsealed. This
|
||||||
@@ -40,21 +38,19 @@ Usage: vault unseal [options] [KEY]
|
|||||||
The unseal key can be supplied as an argument to the command, but this is
|
The unseal key can be supplied as an argument to the command, but this is
|
||||||
not recommended as the unseal key will be available in your history:
|
not recommended as the unseal key will be available in your history:
|
||||||
|
|
||||||
$ vault unseal IXyR0OJnSFobekZMMCKCoVEpT7wI6l+USMzE3IcyDyo=
|
$ vault operator unseal IXyR0OJnSFobekZMMCKCoVEpT7wI6l+USMzE3IcyDyo=
|
||||||
|
|
||||||
Instead, run the command with no arguments and it will prompt for the key:
|
Instead, run the command with no arguments and it will prompt for the key:
|
||||||
|
|
||||||
$ vault unseal
|
$ vault operator unseal
|
||||||
Key (will be hidden): IXyR0OJnSFobekZMMCKCoVEpT7wI6l+USMzE3IcyDyo=
|
Key (will be hidden): IXyR0OJnSFobekZMMCKCoVEpT7wI6l+USMzE3IcyDyo=
|
||||||
|
|
||||||
For a full list of examples, please see the documentation.
|
|
||||||
|
|
||||||
` + c.Flags().Help()
|
` + c.Flags().Help()
|
||||||
|
|
||||||
return strings.TrimSpace(helpText)
|
return strings.TrimSpace(helpText)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *UnsealCommand) Flags() *FlagSets {
|
func (c *OperatorUnsealCommand) Flags() *FlagSets {
|
||||||
set := c.flagSet(FlagSetHTTP)
|
set := c.flagSet(FlagSetHTTP)
|
||||||
|
|
||||||
f := set.NewFlagSet("Command Options")
|
f := set.NewFlagSet("Command Options")
|
||||||
@@ -72,15 +68,15 @@ func (c *UnsealCommand) Flags() *FlagSets {
|
|||||||
return set
|
return set
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *UnsealCommand) AutocompleteArgs() complete.Predictor {
|
func (c *OperatorUnsealCommand) AutocompleteArgs() complete.Predictor {
|
||||||
return c.PredictVaultFiles()
|
return c.PredictVaultFiles()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *UnsealCommand) AutocompleteFlags() complete.Flags {
|
func (c *OperatorUnsealCommand) AutocompleteFlags() complete.Flags {
|
||||||
return c.Flags().Completions()
|
return c.Flags().Completions()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *UnsealCommand) Run(args []string) int {
|
func (c *OperatorUnsealCommand) Run(args []string) int {
|
||||||
f := c.Flags()
|
f := c.Flags()
|
||||||
|
|
||||||
if err := f.Parse(args); err != nil {
|
if err := f.Parse(args); err != nil {
|
||||||
@@ -151,7 +147,7 @@ func (c *UnsealCommand) Run(args []string) int {
|
|||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *UnsealCommand) prettySealStatus(status *api.SealStatusResponse) {
|
func (c *OperatorUnsealCommand) prettySealStatus(status *api.SealStatusResponse) {
|
||||||
c.UI.Output(fmt.Sprintf("Sealed: %t", status.Sealed))
|
c.UI.Output(fmt.Sprintf("Sealed: %t", status.Sealed))
|
||||||
c.UI.Output(fmt.Sprintf("Key Shares: %d", status.N))
|
c.UI.Output(fmt.Sprintf("Key Shares: %d", status.N))
|
||||||
c.UI.Output(fmt.Sprintf("Key Threshold: %d", status.T))
|
c.UI.Output(fmt.Sprintf("Key Threshold: %d", status.T))
|
||||||
@@ -9,24 +9,24 @@ import (
|
|||||||
"github.com/mitchellh/cli"
|
"github.com/mitchellh/cli"
|
||||||
)
|
)
|
||||||
|
|
||||||
func testUnsealCommand(tb testing.TB) (*cli.MockUi, *UnsealCommand) {
|
func testOperatorUnsealCommand(tb testing.TB) (*cli.MockUi, *OperatorUnsealCommand) {
|
||||||
tb.Helper()
|
tb.Helper()
|
||||||
|
|
||||||
ui := cli.NewMockUi()
|
ui := cli.NewMockUi()
|
||||||
return ui, &UnsealCommand{
|
return ui, &OperatorUnsealCommand{
|
||||||
BaseCommand: &BaseCommand{
|
BaseCommand: &BaseCommand{
|
||||||
UI: ui,
|
UI: ui,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestUnsealCommand_Run(t *testing.T) {
|
func TestOperatorUnsealCommand_Run(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
t.Run("error_non_terminal", func(t *testing.T) {
|
t.Run("error_non_terminal", func(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
ui, cmd := testUnsealCommand(t)
|
ui, cmd := testOperatorUnsealCommand(t)
|
||||||
cmd.testOutput = ioutil.Discard
|
cmd.testOutput = ioutil.Discard
|
||||||
|
|
||||||
code := cmd.Run(nil)
|
code := cmd.Run(nil)
|
||||||
@@ -57,7 +57,7 @@ func TestUnsealCommand_Run(t *testing.T) {
|
|||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
ui, cmd := testUnsealCommand(t)
|
ui, cmd := testOperatorUnsealCommand(t)
|
||||||
cmd.client = client
|
cmd.client = client
|
||||||
cmd.testOutput = ioutil.Discard
|
cmd.testOutput = ioutil.Discard
|
||||||
|
|
||||||
@@ -87,7 +87,7 @@ func TestUnsealCommand_Run(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for i, key := range keys {
|
for i, key := range keys {
|
||||||
ui, cmd := testUnsealCommand(t)
|
ui, cmd := testOperatorUnsealCommand(t)
|
||||||
cmd.client = client
|
cmd.client = client
|
||||||
cmd.testOutput = ioutil.Discard
|
cmd.testOutput = ioutil.Discard
|
||||||
|
|
||||||
@@ -112,7 +112,7 @@ func TestUnsealCommand_Run(t *testing.T) {
|
|||||||
client, closer := testVaultServerBad(t)
|
client, closer := testVaultServerBad(t)
|
||||||
defer closer()
|
defer closer()
|
||||||
|
|
||||||
ui, cmd := testUnsealCommand(t)
|
ui, cmd := testOperatorUnsealCommand(t)
|
||||||
cmd.client = client
|
cmd.client = client
|
||||||
|
|
||||||
code := cmd.Run([]string{
|
code := cmd.Run([]string{
|
||||||
@@ -132,7 +132,7 @@ func TestUnsealCommand_Run(t *testing.T) {
|
|||||||
t.Run("no_tabs", func(t *testing.T) {
|
t.Run("no_tabs", func(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
_, cmd := testUnsealCommand(t)
|
_, cmd := testOperatorUnsealCommand(t)
|
||||||
assertNoTabs(t, cmd)
|
assertNoTabs(t, cmd)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -8,20 +8,18 @@ import (
|
|||||||
"github.com/posener/complete"
|
"github.com/posener/complete"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Ensure we are implementing the right interfaces.
|
var _ cli.Command = (*OperatorRotateCommand)(nil)
|
||||||
var _ cli.Command = (*RotateCommand)(nil)
|
var _ cli.CommandAutocomplete = (*OperatorRotateCommand)(nil)
|
||||||
var _ cli.CommandAutocomplete = (*RotateCommand)(nil)
|
|
||||||
|
|
||||||
// RotateCommand is a Command that rotates the encryption key being used
|
type OperatorRotateCommand struct {
|
||||||
type RotateCommand struct {
|
|
||||||
*BaseCommand
|
*BaseCommand
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *RotateCommand) Synopsis() string {
|
func (c *OperatorRotateCommand) Synopsis() string {
|
||||||
return "Rotates the underlying encryption key"
|
return "Rotates the underlying encryption key"
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *RotateCommand) Help() string {
|
func (c *OperatorRotateCommand) Help() string {
|
||||||
helpText := `
|
helpText := `
|
||||||
Usage: vault rotate [options]
|
Usage: vault rotate [options]
|
||||||
|
|
||||||
@@ -31,8 +29,8 @@ Usage: vault rotate [options]
|
|||||||
decrypt older data.
|
decrypt older data.
|
||||||
|
|
||||||
This is an online operation and does not cause downtime. This command is run
|
This is an online operation and does not cause downtime. This command is run
|
||||||
per-cluser (not per-server), since Vault servers in HA mode share the same
|
per-cluster (not per-server), since Vault servers in HA mode share the same
|
||||||
storeage backend.
|
storage backend.
|
||||||
|
|
||||||
Rotate Vault's encryption key:
|
Rotate Vault's encryption key:
|
||||||
|
|
||||||
@@ -45,19 +43,19 @@ Usage: vault rotate [options]
|
|||||||
return strings.TrimSpace(helpText)
|
return strings.TrimSpace(helpText)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *RotateCommand) Flags() *FlagSets {
|
func (c *OperatorRotateCommand) Flags() *FlagSets {
|
||||||
return c.flagSet(FlagSetHTTP)
|
return c.flagSet(FlagSetHTTP)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *RotateCommand) AutocompleteArgs() complete.Predictor {
|
func (c *OperatorRotateCommand) AutocompleteArgs() complete.Predictor {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *RotateCommand) AutocompleteFlags() complete.Flags {
|
func (c *OperatorRotateCommand) AutocompleteFlags() complete.Flags {
|
||||||
return c.Flags().Completions()
|
return c.Flags().Completions()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *RotateCommand) Run(args []string) int {
|
func (c *OperatorRotateCommand) Run(args []string) int {
|
||||||
f := c.Flags()
|
f := c.Flags()
|
||||||
|
|
||||||
if err := f.Parse(args); err != nil {
|
if err := f.Parse(args); err != nil {
|
||||||
|
|||||||
@@ -7,18 +7,18 @@ import (
|
|||||||
"github.com/mitchellh/cli"
|
"github.com/mitchellh/cli"
|
||||||
)
|
)
|
||||||
|
|
||||||
func testRotateCommand(tb testing.TB) (*cli.MockUi, *RotateCommand) {
|
func testOperatorRotateCommand(tb testing.TB) (*cli.MockUi, *OperatorRotateCommand) {
|
||||||
tb.Helper()
|
tb.Helper()
|
||||||
|
|
||||||
ui := cli.NewMockUi()
|
ui := cli.NewMockUi()
|
||||||
return ui, &RotateCommand{
|
return ui, &OperatorRotateCommand{
|
||||||
BaseCommand: &BaseCommand{
|
BaseCommand: &BaseCommand{
|
||||||
UI: ui,
|
UI: ui,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestRotateCommand_Run(t *testing.T) {
|
func TestOperatorRotateCommand_Run(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
cases := []struct {
|
cases := []struct {
|
||||||
@@ -44,7 +44,7 @@ func TestRotateCommand_Run(t *testing.T) {
|
|||||||
t.Run(tc.name, func(t *testing.T) {
|
t.Run(tc.name, func(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
ui, cmd := testRotateCommand(t)
|
ui, cmd := testOperatorRotateCommand(t)
|
||||||
|
|
||||||
code := cmd.Run(tc.args)
|
code := cmd.Run(tc.args)
|
||||||
if code != tc.code {
|
if code != tc.code {
|
||||||
@@ -65,7 +65,7 @@ func TestRotateCommand_Run(t *testing.T) {
|
|||||||
client, closer := testVaultServer(t)
|
client, closer := testVaultServer(t)
|
||||||
defer closer()
|
defer closer()
|
||||||
|
|
||||||
ui, cmd := testRotateCommand(t)
|
ui, cmd := testOperatorRotateCommand(t)
|
||||||
cmd.client = client
|
cmd.client = client
|
||||||
|
|
||||||
code := cmd.Run([]string{})
|
code := cmd.Run([]string{})
|
||||||
@@ -94,7 +94,7 @@ func TestRotateCommand_Run(t *testing.T) {
|
|||||||
client, closer := testVaultServerBad(t)
|
client, closer := testVaultServerBad(t)
|
||||||
defer closer()
|
defer closer()
|
||||||
|
|
||||||
ui, cmd := testRotateCommand(t)
|
ui, cmd := testOperatorRotateCommand(t)
|
||||||
cmd.client = client
|
cmd.client = client
|
||||||
|
|
||||||
code := cmd.Run([]string{})
|
code := cmd.Run([]string{})
|
||||||
@@ -112,7 +112,7 @@ func TestRotateCommand_Run(t *testing.T) {
|
|||||||
t.Run("no_tabs", func(t *testing.T) {
|
t.Run("no_tabs", func(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
_, cmd := testRotateCommand(t)
|
_, cmd := testOperatorRotateCommand(t)
|
||||||
assertNoTabs(t, cmd)
|
assertNoTabs(t, cmd)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user