Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add resource provider inventories API for placement #1862

Merged
merged 9 commits into from
Feb 29, 2020
Merged
50 changes: 50 additions & 0 deletions acceptance/openstack/placement/v1/resourceproviders_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,3 +45,53 @@ func TestResourceProviderCreate(t *testing.T) {

tools.PrintResource(t, resourceProvider)
}

func TestResourceProviderUsages(t *testing.T) {
clients.RequireAdmin(t)

client, err := clients.NewPlacementV1Client()
th.AssertNoErr(t, err)

// first create new resource provider
name := tools.RandomString("TESTACC-", 8)
t.Logf("Attempting to create resource provider: %s", name)

createOpts := resourceproviders.CreateOpts{
Name: name,
}

client.Microversion = "1.20"
resourceProvider, err := resourceproviders.Create(client, createOpts).Extract()
th.AssertNoErr(t, err)

// now get the usages for the newly created resource provider
usage, err := resourceproviders.GetUsages(client, resourceProvider.UUID).Extract()
th.AssertNoErr(t, err)

tools.PrintResource(t, usage)
}

func TestResourceProviderInventories(t *testing.T) {
clients.RequireAdmin(t)

client, err := clients.NewPlacementV1Client()
th.AssertNoErr(t, err)

// first create new resource provider
name := tools.RandomString("TESTACC-", 8)
t.Logf("Attempting to create resource provider: %s", name)

createOpts := resourceproviders.CreateOpts{
Name: name,
}

client.Microversion = "1.20"
resourceProvider, err := resourceproviders.Create(client, createOpts).Extract()
th.AssertNoErr(t, err)

// now get the inventories for the newly created resource provider
usage, err := resourceproviders.GetInventories(client, resourceProvider.UUID).Extract()
th.AssertNoErr(t, err)

tools.PrintResource(t, usage)
}
14 changes: 14 additions & 0 deletions openstack/placement/v1/resourceproviders/doc.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,5 +29,19 @@ Example to create resource providers
panic(err)
}

Example to get resource providers usages

rp, err := resourceproviders.GetUsages(placementClient, resourceProviderID).Extract()
if err != nil {
panic(err)
}

Example to get resource providers inventories

rp, err := resourceproviders.GetInventories(placementClient, resourceProviderID).Extract()
if err != nil {
panic(err)
}

*/
package resourceproviders
10 changes: 10 additions & 0 deletions openstack/placement/v1/resourceproviders/requests.go
Original file line number Diff line number Diff line change
Expand Up @@ -102,3 +102,13 @@ func Create(client *gophercloud.ServiceClient, opts CreateOptsBuilder) (r Create

return
}

func GetUsages(client *gophercloud.ServiceClient, resourceProviderID string) (r GetUsagesResult) {
_, r.Err = client.Get(getResourceProviderUsagesURL(client, resourceProviderID), &r.Body, nil)
return
}

func GetInventories(client *gophercloud.ServiceClient, resourceProviderID string) (r GetInventoriesResult) {
_, r.Err = client.Get(getResourceProviderInventoriesURL(client, resourceProviderID), &r.Body, nil)
return
}
57 changes: 57 additions & 0 deletions openstack/placement/v1/resourceproviders/results.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,37 @@ type ResourceProvider struct {
RootProviderUUID string `json:"root_provider_uuid"`
}

type Usage struct {
DiskGB int `json:"DISK_GB"`
MemoryMB int `json:"MEMORY_MB"`
VCPU int `json:"VCPU"`
}

type ResourceProviderUsage struct {
ResourceProviderGeneration int `json:"resource_provider_generation"`
Usages Usage `json:"usages"`
}

type Inventory struct {
jtopjian marked this conversation as resolved.
Show resolved Hide resolved
AllocationRatio float32 `json:"allocation_ratio"`
MaxUnit int `json:"max_unit"`
MinUnit int `json:"min_unit"`
Reserved int `json:"reserved"`
StepSize int `json:"step_size"`
Total int `json:"total"`
}

type Inventories struct {
DiskGB Inventory `json:"DISK_GB"`
MemoryMB Inventory `json:"MEMORY_MB"`
VCPU Inventory `json:"VCPU"`
}

type ResourceProviderInventories struct {
ResourceProviderGeneration int `json:"resource_provider_generation"`
Inventories Inventories `json:"inventories"`
}

// resourceProviderResult is the resposne of a base ResourceProvider result.
type resourceProviderResult struct {
gophercloud.Result
Expand Down Expand Up @@ -71,3 +102,29 @@ func ExtractResourceProviders(r pagination.Page) ([]ResourceProvider, error) {
err := (r.(ResourceProvidersPage)).ExtractInto(&s)
return s.ResourceProviders, err
}

// GetUsagesResult is the response of a Get usage operations. Call its Extract method
// to interpret it as a ResourceProviderUsage.
type GetUsagesResult struct {
gophercloud.Result
}

// Extract interprets a GetUsagesResult as a ResourceProviderUsage.
func (r GetUsagesResult) Extract() (*ResourceProviderUsage, error) {
var s ResourceProviderUsage
err := r.ExtractInto(&s)
return &s, err
}

// GetInventoriesResult is the response of a Get usage operations. Call its Extract method
// to interpret it as a ResourceProviderInventories.
type GetInventoriesResult struct {
gophercloud.Result
}

// Extract interprets a GetInventoriesResult as a ResourceProviderInventories.
func (r GetInventoriesResult) Extract() (*ResourceProviderInventories, error) {
var s ResourceProviderInventories
err := r.ExtractInto(&s)
return &s, err
}
114 changes: 114 additions & 0 deletions openstack/placement/v1/resourceproviders/testing/fixtures.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ import (
fake "github.com/gophercloud/gophercloud/testhelper/client"
)

const ResourceProviderTestID = "99c09379-6e52-4ef8-9a95-b9ce6f68452e"

const ResourceProvidersBody = `
{
"resource_providers": [
Expand Down Expand Up @@ -60,6 +62,49 @@ const ResourceProviderCreateBody = `
}
`

const UsagesBody = `
{
"resource_provider_generation": 1,
"usages": {
"DISK_GB": 1,
"MEMORY_MB": 512,
"VCPU": 1
}
}
`

const InventoriesBody = `
{
"inventories": {
"DISK_GB": {
"allocation_ratio": 1.0,
"max_unit": 35,
"min_unit": 1,
"reserved": 0,
"step_size": 1,
"total": 35
},
"MEMORY_MB": {
"allocation_ratio": 1.5,
"max_unit": 5825,
"min_unit": 1,
"reserved": 512,
"step_size": 1,
"total": 5825
},
"VCPU": {
"allocation_ratio": 16.0,
"max_unit": 4,
"min_unit": 1,
"reserved": 0,
"step_size": 1,
"total": 4
}
},
"resource_provider_generation": 7
}
`

var ExpectedResourceProvider1 = resourceproviders.ResourceProvider{
Generation: 1,
UUID: "99c09379-6e52-4ef8-9a95-b9ce6f68452e",
Expand Down Expand Up @@ -93,6 +138,45 @@ var ExpectedResourceProviders = []resourceproviders.ResourceProvider{
ExpectedResourceProvider2,
}

var ExpectedUsages = resourceproviders.ResourceProviderUsage{
ResourceProviderGeneration: 1,
Usages: resourceproviders.Usage{
DiskGB: 1,
MemoryMB: 512,
VCPU: 1,
},
}

var ExpectedInventories = resourceproviders.ResourceProviderInventories{
ResourceProviderGeneration: 7,
Inventories: resourceproviders.Inventories{
DiskGB: resourceproviders.Inventory{
AllocationRatio: 1.0,
MaxUnit: 35,
MinUnit: 1,
Reserved: 0,
StepSize: 1,
Total: 35,
},
MemoryMB: resourceproviders.Inventory{
AllocationRatio: 1.5,
MaxUnit: 5825,
MinUnit: 1,
Reserved: 512,
StepSize: 1,
Total: 5825,
},
VCPU: resourceproviders.Inventory{
AllocationRatio: 16.0,
MaxUnit: 4,
MinUnit: 1,
Reserved: 0,
StepSize: 1,
Total: 4,
},
},
}

func HandleResourceProviderList(t *testing.T) {
th.Mux.HandleFunc("/resource_providers",
func(w http.ResponseWriter, r *http.Request) {
Expand All @@ -117,3 +201,33 @@ func HandleResourceProviderCreate(t *testing.T) {
fmt.Fprintf(w, ResourceProviderCreateBody)
})
}

func HandleResourceProviderGetUsages(t *testing.T) {
usageTestUrl := fmt.Sprintf("/resource_providers/%s/usages", ResourceProviderTestID)

th.Mux.HandleFunc(usageTestUrl,
func(w http.ResponseWriter, r *http.Request) {
th.TestMethod(t, r, "GET")
th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)

w.Header().Add("Content-Type", "application/json")
w.WriteHeader(http.StatusOK)

fmt.Fprintf(w, UsagesBody)
})
}

func HandleResourceProviderGetInventories(t *testing.T) {
inventoriesTestUrl := fmt.Sprintf("/resource_providers/%s/inventories", ResourceProviderTestID)

th.Mux.HandleFunc(inventoriesTestUrl,
func(w http.ResponseWriter, r *http.Request) {
th.TestMethod(t, r, "GET")
th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)

w.Header().Add("Content-Type", "application/json")
w.WriteHeader(http.StatusOK)

fmt.Fprintf(w, InventoriesBody)
})
}
22 changes: 22 additions & 0 deletions openstack/placement/v1/resourceproviders/testing/requests_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,3 +55,25 @@ func TestCreateResourceProvider(t *testing.T) {

th.AssertDeepEquals(t, &expected, actual)
}

func TestGetResourceProvidersUsages(t *testing.T) {
th.SetupHTTP()
defer th.TeardownHTTP()

HandleResourceProviderGetUsages(t)

actual, err := resourceproviders.GetUsages(fake.ServiceClient(), ResourceProviderTestID).Extract()
th.AssertNoErr(t, err)
th.AssertDeepEquals(t, ExpectedUsages, *actual)
}

func TestGetResourceProvidersInventories(t *testing.T) {
th.SetupHTTP()
defer th.TeardownHTTP()

HandleResourceProviderGetInventories(t)

actual, err := resourceproviders.GetInventories(fake.ServiceClient(), ResourceProviderTestID).Extract()
th.AssertNoErr(t, err)
th.AssertDeepEquals(t, ExpectedInventories, *actual)
}
8 changes: 8 additions & 0 deletions openstack/placement/v1/resourceproviders/urls.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,11 @@ const (
func resourceProvidersListURL(client *gophercloud.ServiceClient) string {
return client.ServiceURL(apiName)
}

func getResourceProviderUsagesURL(client *gophercloud.ServiceClient, resourceProviderID string) string {
return client.ServiceURL(apiName, resourceProviderID, "usages")
}

func getResourceProviderInventoriesURL(client *gophercloud.ServiceClient, resourceProviderID string) string {
return client.ServiceURL(apiName, resourceProviderID, "inventories")
}