Skip to content

Commit

Permalink
Add resource provider inventories API for placement (#1862)
Browse files Browse the repository at this point in the history
* Add resource provider create API for placement.

* update doc

* Add resource provider usages API for placement

* fix go.mod

* Add resource provider inventories API for placement

* fix go.mod;

* Change Usage to map[string]int

* use map[string]Inventory
  • Loading branch information
dkt26111 committed Feb 29, 2020
1 parent 4e6a2f1 commit b79ada0
Show file tree
Hide file tree
Showing 7 changed files with 263 additions and 0 deletions.
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
}
45 changes: 45 additions & 0 deletions openstack/placement/v1/resourceproviders/results.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,25 @@ type ResourceProvider struct {
RootProviderUUID string `json:"root_provider_uuid"`
}

type ResourceProviderUsage struct {
ResourceProviderGeneration int `json:"resource_provider_generation"`
Usages map[string]int `json:"usages"`
}

type Inventory struct {
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 ResourceProviderInventories struct {
ResourceProviderGeneration int `json:"resource_provider_generation"`
Inventories map[string]Inventory `json:"inventories"`
}

// resourceProviderResult is the resposne of a base ResourceProvider result.
type resourceProviderResult struct {
gophercloud.Result
Expand Down Expand Up @@ -71,3 +90,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: map[string]int{
"DISK_GB": 1,
"MEMORY_MB": 512,
"VCPU": 1,
},
}

var ExpectedInventories = resourceproviders.ResourceProviderInventories{
ResourceProviderGeneration: 7,
Inventories: map[string]resourceproviders.Inventory{
"DISK_GB": resourceproviders.Inventory{
AllocationRatio: 1.0,
MaxUnit: 35,
MinUnit: 1,
Reserved: 0,
StepSize: 1,
Total: 35,
},
"MEMORY_MB": 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")
}

0 comments on commit b79ada0

Please sign in to comment.