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  }