github.com/opentelekomcloud/gophertelekomcloud@v0.9.3/openstack/cbr/v3/backups/list.go (about) 1 package backups 2 3 import ( 4 "reflect" 5 6 golangsdk "github.com/opentelekomcloud/gophertelekomcloud" 7 "github.com/opentelekomcloud/gophertelekomcloud/pagination" 8 ) 9 10 // ListOpts allows the filtering and sorting of paginated collections through 11 // the API. Filtering is achieved by passing in struct field values that map to 12 // the flavor attributes you want to see returned. 13 type ListOpts struct { 14 ID string 15 CheckpointID string `q:"checkpoint_id"` 16 ImageType string `q:"image_type"` 17 Limit string `q:"limit"` 18 Marker string `q:"marker"` 19 Name string `q:"name"` 20 Offset string `q:"offset"` 21 ParentID string `q:"parent_id"` 22 ResourceAZ string `q:"resource_az"` 23 ResourceID string `q:"resource_id"` 24 ResourceName string `q:"resource_name"` 25 ResourceType string `q:"resource_type"` 26 Sort string `q:"sort"` 27 Status string `q:"status"` 28 VaultID string `q:"vault_id"` 29 } 30 31 func List(client *golangsdk.ServiceClient, opts ListOpts) ([]Backup, error) { 32 url, err := golangsdk.NewURLBuilder().WithEndpoints("backups").WithQueryParams(&opts).Build() 33 if err != nil { 34 return nil, err 35 } 36 37 pages, err := pagination.NewPager(client, client.ServiceURL(url.String()), 38 func(r pagination.PageResult) pagination.Page { 39 return BackupPage{pagination.LinkedPageBase{PageResult: r}} 40 }).AllPages() 41 if err != nil { 42 return nil, err 43 } 44 45 allBackups, err := ExtractBackups(pages) 46 if err != nil { 47 return nil, err 48 } 49 50 return filterBackups(allBackups, opts) 51 } 52 53 func filterBackups(backups []Backup, opts ListOpts) ([]Backup, error) { 54 var refinedBackups []Backup 55 var matched bool 56 m := map[string]interface{}{} 57 if opts.ID != "" { 58 m["ID"] = opts.ID 59 } 60 61 if len(m) > 0 && len(backups) > 0 { 62 for _, backup := range backups { 63 matched = true 64 65 for key, value := range m { 66 if sVal := getStructField(&backup, key); !(sVal == value) { 67 matched = false 68 } 69 } 70 71 if matched { 72 refinedBackups = append(refinedBackups, backup) 73 } 74 } 75 76 } else { 77 refinedBackups = backups 78 } 79 80 return refinedBackups, nil 81 } 82 83 func getStructField(v *Backup, field string) string { 84 r := reflect.ValueOf(v) 85 f := reflect.Indirect(r).FieldByName(field) 86 return f.String() 87 }