Backport openstack/blockstorage/extensions/quotasets/
Change-Id: I4ab546714af9bfce738d3d0cfa6f86ed7f889d1d
Related-PROD: PROD-34272
diff --git a/openstack/blockstorage/extensions/quotasets/requests.go b/openstack/blockstorage/extensions/quotasets/requests.go
new file mode 100644
index 0000000..dd4a051
--- /dev/null
+++ b/openstack/blockstorage/extensions/quotasets/requests.go
@@ -0,0 +1,94 @@
+package quotasets
+
+import (
+ "fmt"
+
+ "gerrit.mcp.mirantis.net/debian/gophercloud.git"
+)
+
+// Get returns public data about a previously created QuotaSet.
+func Get(client *gophercloud.ServiceClient, projectID string) (r GetResult) {
+ _, r.Err = client.Get(getURL(client, projectID), &r.Body, nil)
+ return
+}
+
+// GetDefaults returns public data about the project's default block storage quotas.
+func GetDefaults(client *gophercloud.ServiceClient, projectID string) (r GetResult) {
+ _, r.Err = client.Get(getDefaultsURL(client, projectID), &r.Body, nil)
+ return
+}
+
+// GetUsage returns detailed public data about a previously created QuotaSet.
+func GetUsage(client *gophercloud.ServiceClient, projectID string) (r GetUsageResult) {
+ u := fmt.Sprintf("%s?usage=true", getURL(client, projectID))
+ _, r.Err = client.Get(u, &r.Body, nil)
+ return
+}
+
+// Updates the quotas for the given projectID and returns the new QuotaSet.
+func Update(client *gophercloud.ServiceClient, projectID string, opts UpdateOptsBuilder) (r UpdateResult) {
+ b, err := opts.ToBlockStorageQuotaUpdateMap()
+ if err != nil {
+ r.Err = err
+ return
+ }
+
+ _, r.Err = client.Put(updateURL(client, projectID), b, &r.Body, &gophercloud.RequestOpts{
+ OkCodes: []int{200},
+ })
+ return r
+}
+
+// UpdateOptsBuilder enables extensins to add parameters to the update request.
+type UpdateOptsBuilder interface {
+ // Extra specific name to prevent collisions with interfaces for other quotas
+ // (e.g. neutron)
+ ToBlockStorageQuotaUpdateMap() (map[string]interface{}, error)
+}
+
+// ToBlockStorageQuotaUpdateMap builds the update options into a serializable
+// format.
+func (opts UpdateOpts) ToBlockStorageQuotaUpdateMap() (map[string]interface{}, error) {
+ return gophercloud.BuildRequestBody(opts, "quota_set")
+}
+
+// Options for Updating the quotas of a Tenant.
+// All int-values are pointers so they can be nil if they are not needed.
+// You can use gopercloud.IntToPointer() for convenience
+type UpdateOpts struct {
+ // Volumes is the number of volumes that are allowed for each project.
+ Volumes *int `json:"volumes,omitempty"`
+
+ // Snapshots is the number of snapshots that are allowed for each project.
+ Snapshots *int `json:"snapshots,omitempty"`
+
+ // Gigabytes is the size (GB) of volumes and snapshots that are allowed for
+ // each project.
+ Gigabytes *int `json:"gigabytes,omitempty"`
+
+ // PerVolumeGigabytes is the size (GB) of volumes and snapshots that are
+ // allowed for each project and the specifed volume type.
+ PerVolumeGigabytes *int `json:"per_volume_gigabytes,omitempty"`
+
+ // Backups is the number of backups that are allowed for each project.
+ Backups *int `json:"backups,omitempty"`
+
+ // BackupGigabytes is the size (GB) of backups that are allowed for each
+ // project.
+ BackupGigabytes *int `json:"backup_gigabytes,omitempty"`
+
+ // Groups is the number of groups that are allowed for each project.
+ Groups *int `json:"groups,omitempty"`
+
+ // Force will update the quotaset even if the quota has already been used
+ // and the reserved quota exceeds the new quota.
+ Force bool `json:"force,omitempty"`
+}
+
+// Resets the quotas for the given tenant to their default values.
+func Delete(client *gophercloud.ServiceClient, projectID string) (r DeleteResult) {
+ _, r.Err = client.Delete(updateURL(client, projectID), &gophercloud.RequestOpts{
+ OkCodes: []int{200},
+ })
+ return
+}