vault/command/plugin_runtime_list.go
Christopher Swenson 6ed8b88f5f
Switch from mitchellh/cli to hashicorp/cli (#24239)
@mitchellh suggested we fork `cli` and switch to that.

Since we primarily use the interfaces in `cli`, and the new
fork has not changed those, this is (mostly) a drop-in replacement.

A small fix will be necessary for Vault Enterprise, I believe.
2023-12-04 11:05:02 -08:00

132 lines
3.1 KiB
Go

// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: BUSL-1.1
package command
import (
"context"
"fmt"
"strings"
"github.com/hashicorp/cli"
"github.com/hashicorp/vault/api"
"github.com/posener/complete"
)
var (
_ cli.Command = (*PluginRuntimeListCommand)(nil)
_ cli.CommandAutocomplete = (*PluginRuntimeListCommand)(nil)
)
type PluginRuntimeListCommand struct {
*BaseCommand
flagType string
}
func (c *PluginRuntimeListCommand) Synopsis() string {
return "Lists available plugin runtimes"
}
func (c *PluginRuntimeListCommand) Help() string {
helpText := `
Usage: vault plugin runtime list [options]
Lists available plugin runtimes registered in the catalog. This does not list whether
plugin runtimes are in use, but rather just their availability.
List all available plugin runtimes in the catalog:
$ vault plugin runtime list
List all available container plugin runtimes in the catalog:
$ vault plugin runtime list -type=container
` + c.Flags().Help()
return strings.TrimSpace(helpText)
}
func (c *PluginRuntimeListCommand) Flags() *FlagSets {
set := c.flagSet(FlagSetHTTP | FlagSetOutputFormat)
f := set.NewFlagSet("Command Options")
f.StringVar(&StringVar{
Name: "type",
Target: &c.flagType,
Completion: complete.PredictAnything,
Usage: "Plugin runtime type. Vault currently only supports \"container\" runtime type.",
})
return set
}
func (c *PluginRuntimeListCommand) AutocompleteArgs() complete.Predictor {
return nil
}
func (c *PluginRuntimeListCommand) AutocompleteFlags() complete.Flags {
return c.Flags().Completions()
}
func (c *PluginRuntimeListCommand) Run(args []string) int {
f := c.Flags()
if err := f.Parse(args); err != nil {
c.UI.Error(err.Error())
return 1
}
if len(f.Args()) > 0 {
c.UI.Error(fmt.Sprintf("Too many arguments (expected 0, got %d)", len(args)))
return 1
}
var input *api.ListPluginRuntimesInput
runtimeTyeRaw := strings.TrimSpace(c.flagType)
if len(runtimeTyeRaw) > 0 {
runtimeType, err := api.ParsePluginRuntimeType(runtimeTyeRaw)
if err != nil {
c.UI.Error(err.Error())
return 2
}
input = &api.ListPluginRuntimesInput{Type: runtimeType}
}
client, err := c.Client()
if err != nil {
c.UI.Error(err.Error())
return 2
}
resp, err := client.Sys().ListPluginRuntimes(context.Background(), input)
if err != nil {
c.UI.Error(fmt.Sprintf("Error listing available plugin runtimes: %s", err))
return 2
}
if resp == nil {
c.UI.Error("No tableResponse from server when listing plugin runtimes")
return 2
}
switch Format(c.UI) {
case "table":
c.UI.Output(tableOutput(c.tableResponse(resp), nil))
return 0
default:
return OutputData(c.UI, resp.Runtimes)
}
}
func (c *PluginRuntimeListCommand) tableResponse(response *api.ListPluginRuntimesResponse) []string {
out := []string{"Name | Type | OCI Runtime | Parent Cgroup | CPU Nanos | Memory Bytes"}
for _, runtime := range response.Runtimes {
out = append(out, fmt.Sprintf("%s | %s | %s | %s | %d | %d",
runtime.Name, runtime.Type, runtime.OCIRuntime, runtime.CgroupParent, runtime.CPU, runtime.Memory))
}
return out
}