github.com/gophercloud/gophercloud@v1.11.0/openstack/compute/v2/extensions/usage/requests.go (about) 1 package usage 2 3 import ( 4 "net/url" 5 "time" 6 7 "github.com/gophercloud/gophercloud" 8 "github.com/gophercloud/gophercloud/pagination" 9 ) 10 11 // SingleTenantOpts are options for fetching usage of a single tenant. 12 type SingleTenantOpts struct { 13 // The ending time to calculate usage statistics on compute and storage resources. 14 End *time.Time `q:"end"` 15 16 // The beginning time to calculate usage statistics on compute and storage resources. 17 Start *time.Time `q:"start"` 18 19 // Limit limits the amount of results returned by the API. 20 // This requires the client to be set to microversion 2.40 or later. 21 Limit int `q:"limit"` 22 23 // Marker instructs the API call where to start listing from. 24 // This requires the client to be set to microversion 2.40 or later. 25 Marker string `q:"marker"` 26 } 27 28 // SingleTenantOptsBuilder allows extensions to add additional parameters to the 29 // SingleTenant request. 30 type SingleTenantOptsBuilder interface { 31 ToUsageSingleTenantQuery() (string, error) 32 } 33 34 // ToUsageSingleTenantQuery formats a SingleTenantOpts into a query string. 35 func (opts SingleTenantOpts) ToUsageSingleTenantQuery() (string, error) { 36 q, err := gophercloud.BuildQueryString(opts) 37 if err != nil { 38 return "", err 39 } 40 41 params := q.Query() 42 43 if opts.Start != nil { 44 params.Add("start", opts.Start.Format(gophercloud.RFC3339MilliNoZ)) 45 } 46 47 if opts.End != nil { 48 params.Add("end", opts.End.Format(gophercloud.RFC3339MilliNoZ)) 49 } 50 51 q = &url.URL{RawQuery: params.Encode()} 52 return q.String(), nil 53 } 54 55 // SingleTenant returns usage data about a single tenant. 56 func SingleTenant(client *gophercloud.ServiceClient, tenantID string, opts SingleTenantOptsBuilder) pagination.Pager { 57 url := getTenantURL(client, tenantID) 58 if opts != nil { 59 query, err := opts.ToUsageSingleTenantQuery() 60 if err != nil { 61 return pagination.Pager{Err: err} 62 } 63 url += query 64 } 65 return pagination.NewPager(client, url, func(r pagination.PageResult) pagination.Page { 66 return SingleTenantPage{pagination.LinkedPageBase{PageResult: r}} 67 }) 68 } 69 70 // AllTenantsOpts are options for fetching usage of all tenants. 71 type AllTenantsOpts struct { 72 // Detailed will return detailed results. 73 Detailed bool 74 75 // The ending time to calculate usage statistics on compute and storage resources. 76 End *time.Time `q:"end"` 77 78 // The beginning time to calculate usage statistics on compute and storage resources. 79 Start *time.Time `q:"start"` 80 81 // Limit limits the amount of results returned by the API. 82 // This requires the client to be set to microversion 2.40 or later. 83 Limit int `q:"limit"` 84 85 // Marker instructs the API call where to start listing from. 86 // This requires the client to be set to microversion 2.40 or later. 87 Marker string `q:"marker"` 88 } 89 90 // AllTenantsOptsBuilder allows extensions to add additional parameters to the 91 // AllTenants request. 92 type AllTenantsOptsBuilder interface { 93 ToUsageAllTenantsQuery() (string, error) 94 } 95 96 // ToUsageAllTenantsQuery formats a AllTenantsOpts into a query string. 97 func (opts AllTenantsOpts) ToUsageAllTenantsQuery() (string, error) { 98 q, err := gophercloud.BuildQueryString(opts) 99 if err != nil { 100 return "", err 101 } 102 103 params := q.Query() 104 105 if opts.Start != nil { 106 params.Add("start", opts.Start.Format(gophercloud.RFC3339MilliNoZ)) 107 } 108 109 if opts.End != nil { 110 params.Add("end", opts.End.Format(gophercloud.RFC3339MilliNoZ)) 111 } 112 113 if opts.Detailed == true { 114 params.Add("detailed", "1") 115 } 116 117 q = &url.URL{RawQuery: params.Encode()} 118 return q.String(), nil 119 } 120 121 // AllTenants returns usage data about all tenants. 122 func AllTenants(client *gophercloud.ServiceClient, opts AllTenantsOptsBuilder) pagination.Pager { 123 url := allTenantsURL(client) 124 if opts != nil { 125 query, err := opts.ToUsageAllTenantsQuery() 126 if err != nil { 127 return pagination.Pager{Err: err} 128 } 129 url += query 130 } 131 return pagination.NewPager(client, url, func(r pagination.PageResult) pagination.Page { 132 return AllTenantsPage{pagination.LinkedPageBase{PageResult: r}} 133 }) 134 }