github.com/opentelekomcloud/gophertelekomcloud@v0.9.3/openstack/image/v2/images/List.go (about) 1 package images 2 3 import ( 4 "net/url" 5 "strings" 6 7 "github.com/opentelekomcloud/gophertelekomcloud" 8 "github.com/opentelekomcloud/gophertelekomcloud/internal/extract" 9 "github.com/opentelekomcloud/gophertelekomcloud/openstack/ims/v2/images" 10 "github.com/opentelekomcloud/gophertelekomcloud/openstack/utils" 11 "github.com/opentelekomcloud/gophertelekomcloud/pagination" 12 ) 13 14 // List implements image list request. 15 func List(c *golangsdk.ServiceClient, opts images.ListImagesOpts) pagination.Pager { 16 url, err := golangsdk.NewURLBuilder().WithEndpoints("images").WithQueryParams(&opts).Build() 17 if err != nil { 18 return pagination.Pager{Err: err} 19 } 20 21 // GET /v2/images 22 return pagination.NewPager(c, c.ServiceURL(url.String()), func(r pagination.PageResult) pagination.Page { 23 return ImagePage{ 24 serviceURL: c.ServiceURL(), 25 LinkedPageBase: pagination.LinkedPageBase{PageResult: r}, 26 } 27 }) 28 } 29 30 // ImagePage represents the results of a List request. 31 type ImagePage struct { 32 serviceURL string 33 pagination.LinkedPageBase 34 } 35 36 // IsEmpty returns true if an ImagePage contains no Images results. 37 func (r ImagePage) IsEmpty() (bool, error) { 38 i, err := ExtractImages(r) 39 return len(i) == 0, err 40 } 41 42 // ExtractImages interprets the results of a single page from a List() call, 43 // producing a slice of Image entities. 44 func ExtractImages(r pagination.Page) ([]images.ImageInfo, error) { 45 var s struct { 46 Images []images.ImageInfo `json:"images"` 47 } 48 err := extract.Into(r.(ImagePage).BodyReader(), &s) 49 return s.Images, err 50 } 51 52 // NextPageURL uses the response's embedded link reference to navigate to 53 // the next page of results. 54 func (r ImagePage) NextPageURL() (string, error) { 55 var s struct { 56 Next string `json:"next"` 57 } 58 err := extract.Into(r.BodyReader(), &s) 59 if err != nil { 60 return "", err 61 } 62 63 if s.Next == "" { 64 return "", nil 65 } 66 67 return nextPageURL(r.serviceURL, s.Next) 68 } 69 70 func nextPageURL(serviceURL, requestedNext string) (string, error) { 71 base, err := utils.BaseEndpoint(serviceURL) 72 if err != nil { 73 return "", err 74 } 75 76 requestedNextURL, err := url.Parse(requestedNext) 77 if err != nil { 78 return "", err 79 } 80 81 base = golangsdk.NormalizeURL(base) 82 nextPath := base + strings.TrimPrefix(requestedNextURL.Path, "/") 83 84 nextURL, err := url.Parse(nextPath) 85 if err != nil { 86 return "", err 87 } 88 89 nextURL.RawQuery = requestedNextURL.RawQuery 90 91 return nextURL.String(), nil 92 }