diff --git a/changelogs/unreleased/1741-prydonius b/changelogs/unreleased/1741-prydonius new file mode 100644 index 000000000..0e10fbbab --- /dev/null +++ b/changelogs/unreleased/1741-prydonius @@ -0,0 +1 @@ +sort output of resource list in `velero backup describe --details` diff --git a/pkg/backup/request.go b/pkg/backup/request.go index 5ec9bc778..a44c8f00e 100644 --- a/pkg/backup/request.go +++ b/pkg/backup/request.go @@ -18,6 +18,7 @@ package backup import ( "fmt" + "sort" velerov1api "github.com/heptio/velero/pkg/apis/velero/v1" "github.com/heptio/velero/pkg/util/collections" @@ -58,5 +59,11 @@ func (r *Request) BackupResourceList() map[string][]string { } resources[i.resource] = append(resources[i.resource], entry) } + + // sort namespace/name entries for each GVK + for _, v := range resources { + sort.Strings(v) + } + return resources } diff --git a/pkg/backup/request_test.go b/pkg/backup/request_test.go index f37434059..9b04f0b53 100644 --- a/pkg/backup/request_test.go +++ b/pkg/backup/request_test.go @@ -50,9 +50,33 @@ func TestRequest_BackupResourceList(t *testing.T) { } req := Request{BackedUpItems: backedUpItems} - assert.Equal(t, req.BackupResourceList(), map[string][]string{ + assert.Equal(t, map[string][]string{ "apps/v1/Deployment": {"default/my-deploy"}, "v1/Pod": {"ns1/pod1", "ns2/pod2"}, "v1/PersistentVolume": {"my-pv"}, - }) + }, req.BackupResourceList()) +} + +func TestRequest_BackupResourceListEntriesSorted(t *testing.T) { + items := []itemKey{ + { + resource: "v1/Pod", + name: "pod2", + namespace: "ns2", + }, + { + resource: "v1/Pod", + name: "pod1", + namespace: "ns1", + }, + } + backedUpItems := map[itemKey]struct{}{} + for _, it := range items { + backedUpItems[it] = struct{}{} + } + + req := Request{BackedUpItems: backedUpItems} + assert.Equal(t, map[string][]string{ + "v1/Pod": {"ns1/pod1", "ns2/pod2"}, + }, req.BackupResourceList()) } diff --git a/pkg/cmd/util/output/backup_describer.go b/pkg/cmd/util/output/backup_describer.go index b0a6d997c..c1fd8b1bf 100644 --- a/pkg/cmd/util/output/backup_describer.go +++ b/pkg/cmd/util/output/backup_describer.go @@ -284,8 +284,16 @@ func describeBackupResourceList(d *Describer, backup *velerov1api.Backup, velero } d.Println("Resource List:") - for gvk, items := range resourceList { - d.Printf("\t%s:\n\t\t- %s\n", gvk, strings.Join(items, "\n\t\t- ")) + + // Sort GVKs in output + gvks := make([]string, 0, len(resourceList)) + for gvk := range resourceList { + gvks = append(gvks, gvk) + } + sort.Strings(gvks) + + for _, gvk := range gvks { + d.Printf("\t%s:\n\t\t- %s\n", gvk, strings.Join(resourceList[gvk], "\n\t\t- ")) } }