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  }