diff --git a/.changelog/12197.txt b/.changelog/12197.txt new file mode 100644 index 000000000000..bf07836e0aa9 --- /dev/null +++ b/.changelog/12197.txt @@ -0,0 +1,3 @@ +```release-note:bug +csi: Fixed a bug where `volume snapshot list` did not correctly filter by plugin IDs. The `-plugin` parameter is required. +``` diff --git a/command/volume_snapshot_list.go b/command/volume_snapshot_list.go index 02c7f7ffac72..848552118790 100644 --- a/command/volume_snapshot_list.go +++ b/command/volume_snapshot_list.go @@ -22,8 +22,9 @@ func (c *VolumeSnapshotListCommand) Help() string { helpText := ` Usage: nomad volume snapshot list [-plugin plugin_id] - Display a list of CSI volume snapshots along with their - source volume ID as known to the external storage provider. + Display a list of CSI volume snapshots for a plugin along + with their source volume ID as known to the external + storage provider. When ACLs are enabled, this command requires a token with the 'csi-list-volumes' capability for the plugin's namespace. @@ -34,8 +35,8 @@ General Options: List Options: - -plugin: Display only snapshots managed by a particular plugin. By default - this command will query all plugins for their snapshots. + -plugin: Display only snapshots managed by a particular plugin. This + parameter is required. -secret Secrets to pass to the plugin to list snapshots. Accepts multiple @@ -45,7 +46,7 @@ List Options: } func (c *VolumeSnapshotListCommand) Synopsis() string { - return "Display a list of volume snapshots" + return "Display a list of volume snapshots for plugin" } func (c *VolumeSnapshotListCommand) AutocompleteFlags() complete.Flags { @@ -100,15 +101,17 @@ func (c *VolumeSnapshotListCommand) Run(args []string) int { return 1 } - // filter by plugin if a plugin ID was passed - if pluginID != "" { - plugs, _, err := client.CSIPlugins().List(&api.QueryOptions{Prefix: pluginID}) - if err != nil { - c.Ui.Error(fmt.Sprintf("Error querying CSI plugins: %s", err)) - return 1 - } - - if len(plugs) > 1 { + plugs, _, err := client.CSIPlugins().List(&api.QueryOptions{Prefix: pluginID}) + if err != nil { + c.Ui.Error(fmt.Sprintf("Error querying CSI plugins: %s", err)) + return 1 + } + if len(plugs) == 0 { + c.Ui.Error(fmt.Sprintf("No plugins(s) with prefix or ID %q found", pluginID)) + return 1 + } + if len(plugs) > 1 { + if pluginID != plugs[0].ID { out, err := c.csiFormatPlugins(plugs) if err != nil { c.Ui.Error(fmt.Sprintf("Error formatting: %s", err)) @@ -117,13 +120,8 @@ func (c *VolumeSnapshotListCommand) Run(args []string) int { c.Ui.Error(fmt.Sprintf("Prefix matched multiple plugins\n\n%s", out)) return 1 } - if len(plugs) == 0 { - c.Ui.Error(fmt.Sprintf("No plugins(s) with prefix or ID %q found", pluginID)) - return 1 - } - - pluginID = plugs[0].ID } + pluginID = plugs[0].ID secrets := api.CSISecrets{} for _, kv := range secretsArgs { diff --git a/e2e/csi/ebs.go b/e2e/csi/ebs.go index 6935fd8b54e1..880e064f936a 100644 --- a/e2e/csi/ebs.go +++ b/e2e/csi/ebs.go @@ -176,7 +176,7 @@ func (tc *CSIControllerPluginEBSTest) TestSnapshot(f *framework.F) { f.NoError(err, fmt.Sprintf("could not parse output:\n%v", out)) f.Len(snaps, 1, fmt.Sprintf("could not parse output:\n%v", out)) - out, err = e2e.Command("nomad", "volume", "snapshot", "list") + out, err = e2e.Command("nomad", "volume", "snapshot", "list", "-plugin", ebsPluginID) requireNoErrorElseDump(f, err, "could not list volume snapshots", tc.pluginJobIDs) f.Contains(out, snaps[0]["ID"], fmt.Sprintf("volume snapshot list did not include expected snapshot:\n%v", out)) diff --git a/website/content/docs/commands/volume/snapshot-list.mdx b/website/content/docs/commands/volume/snapshot-list.mdx index 5977321b6a12..0135cf967387 100644 --- a/website/content/docs/commands/volume/snapshot-list.mdx +++ b/website/content/docs/commands/volume/snapshot-list.mdx @@ -30,11 +30,10 @@ Nomad. ## Snapshot List Options - `-plugin`: Display only snapshots managed by a particular [CSI - plugin][csi_plugin]. By default the `snapshot list` command will query all - plugins for their snapshots. This flag accepts a plugin ID or prefix. If - there is an exact match based on the provided plugin, then that specific - plugin will be queried. Otherwise, a list of matching plugins will be - displayed. + plugin][csi_plugin]. This flag is required and accepts a plugin ID + or prefix. If there is an exact match based on the provided plugin, + then that specific plugin will be queried. Otherwise, a list of + matching plugins will be displayed. - `-secret`: Secrets to pass to the plugin to list snapshots. Accepts multiple flags in the form `-secret key=value` @@ -54,7 +53,7 @@ snap-67890 vol-fedcba 50GiB 2021-01-04T15:45:00Z true List volume snapshots with two secret key/value pairs: ```shell-session -$ nomad volume snapshot list -secret key1=value1 -secret key2=val2 +$ nomad volume snapshot list -plugin aws-ebs0 -secret key1=value1 -secret key2=val2 Snapshot ID External ID Size Creation Time Ready? snap-12345 vol-abcdef 50GiB 2021-01-03T12:15:02Z true ```