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 2542b3d8c2a7..ae0c0cd10eb5 100644 --- a/command/volume_snapshot_list.go +++ b/command/volume_snapshot_list.go @@ -21,8 +21,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. @@ -33,8 +34,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. -secrets: A set of key/value secrets to be used when listing snapshots. ` @@ -42,7 +43,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 { @@ -97,15 +98,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)) @@ -114,13 +117,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 q := &api.QueryOptions{PerPage: 30} // TODO: tune page size diff --git a/e2e/csi/ebs.go b/e2e/csi/ebs.go index f2ae4a152d65..1c5bfdd51495 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 078271db716e..ecdd2674e60b 100644 --- a/website/content/docs/commands/volume/snapshot-list.mdx +++ b/website/content/docs/commands/volume/snapshot-list.mdx @@ -30,12 +30,11 @@ Nomad. ## 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. -- `-secrets`: A list of comma separated secret key/value pairs to be passed + 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. +- `-secrets`: A list of comma separated secret key/value pairs to be passed to the CSI driver. When ACLs are enabled, this command requires a token with the @@ -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 -secrets key1=value1,key2=val2 +$ nomad volume snapshot list -plugin aws-ebs0 -secrets key1=value1,key2=val2 Snapshot ID External ID Size Creation Time Ready? snap-12345 vol-abcdef 50GiB 2021-01-03T12:15:02Z true ``` @@ -62,4 +61,4 @@ snap-12345 vol-abcdef 50GiB 2021-01-03T12:15:02Z true [csi]: https://github.com/container-storage-interface/spec [csi_plugin]: /docs/job-specification/csi_plugin [registered]: /docs/commands/volume/register -[csi_plugins_internals]: /docs/internals/plugins/csi#csi-plugins \ No newline at end of file +[csi_plugins_internals]: /docs/internals/plugins/csi#csi-plugins