Skip to content

Commit 05116c7

Browse files
authored
Merge pull request #689 from dklyle/create-flavor-extra-specs
Flavor Extra Specs Create
2 parents c2cafb4 + be3fd78 commit 05116c7

File tree

7 files changed

+118
-13
lines changed

7 files changed

+118
-13
lines changed

acceptance/openstack/compute/v2/flavors_test.go

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ func TestFlavorAccessCRUD(t *testing.T) {
154154
}
155155
}
156156

157-
func TestFlavorExtraSpecs(t *testing.T) {
157+
func TestFlavorExtraSpecsCRUD(t *testing.T) {
158158
client, err := clients.NewComputeV2Client()
159159
if err != nil {
160160
t.Fatalf("Unable to create a compute client: %v", err)
@@ -166,10 +166,27 @@ func TestFlavorExtraSpecs(t *testing.T) {
166166
}
167167
defer DeleteFlavor(t, client, flavor)
168168

169+
createOpts := flavors.ExtraSpecsOpts{
170+
"hw:cpu_policy": "CPU-POLICY",
171+
"hw:cpu_thread_policy": "CPU-THREAD-POLICY",
172+
}
173+
createdExtraSpecs, err := flavors.CreateExtraSpecs(client, flavor.ID, createOpts).Extract()
174+
if err != nil {
175+
t.Fatalf("Unable to create flavor extra_specs: %v", err)
176+
}
177+
tools.PrintResource(t, createdExtraSpecs)
178+
169179
allExtraSpecs, err := flavors.ListExtraSpecs(client, flavor.ID).Extract()
170180
if err != nil {
171181
t.Fatalf("Unable to get flavor extra_specs: %v", err)
172182
}
173-
174183
tools.PrintResource(t, allExtraSpecs)
184+
185+
for key, _ := range allExtraSpecs {
186+
spec, err := flavors.GetExtraSpec(client, flavor.ID, key).Extract()
187+
if err != nil {
188+
t.Fatalf("Unable to get flavor extra spec: %v", err)
189+
}
190+
tools.PrintResource(t, spec)
191+
}
175192
}

openstack/compute/v2/flavors/doc.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,23 @@ Example to Grant Access to a Flavor
7373
panic(err)
7474
}
7575
76+
Example to Create Extra Specs for a Flavor
77+
78+
flavorID := "e91758d6-a54a-4778-ad72-0c73a1cb695b"
79+
80+
createOpts := flavors.ExtraSpecsOpts{
81+
"hw:cpu_policy": "CPU-POLICY",
82+
"hw:cpu_thread_policy": "CPU-THREAD-POLICY",
83+
}
84+
createdExtraSpecs, err := flavors.CreateExtraSpecs(computeClient, flavorID, createOpts).Extract()
85+
if err != nil {
86+
panic(err)
87+
}
88+
89+
fmt.Printf("%+v", createdExtraSpecs)
90+
7691
Example to Get Extra Specs for a Flavor
92+
7793
flavorID := "e91758d6-a54a-4778-ad72-0c73a1cb695b"
7894
7995
extraSpecs, err := flavors.ListExtraSpecs(computeClient, flavorID).Extract()
@@ -82,5 +98,6 @@ Example to Get Extra Specs for a Flavor
8298
}
8399
84100
fmt.Printf("%+v", extraSpecs)
101+
85102
*/
86103
package flavors

openstack/compute/v2/flavors/requests.go

Lines changed: 39 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,45 @@ func AddAccess(client *gophercloud.ServiceClient, id string, opts AddAccessOptsB
192192
return
193193
}
194194

195+
// ExtraSpecs requests all the extra-specs for the given flavor ID.
196+
func ListExtraSpecs(client *gophercloud.ServiceClient, flavorID string) (r ListExtraSpecsResult) {
197+
_, r.Err = client.Get(extraSpecsListURL(client, flavorID), &r.Body, nil)
198+
return
199+
}
200+
201+
func GetExtraSpec(client *gophercloud.ServiceClient, flavorID string, key string) (r GetExtraSpecResult) {
202+
_, r.Err = client.Get(extraSpecsGetURL(client, flavorID, key), &r.Body, nil)
203+
return
204+
}
205+
206+
// CreateExtraSpecsOptsBuilder allows extensions to add additional parameters to the
207+
// CreateExtraSpecs requests.
208+
type CreateExtraSpecsOptsBuilder interface {
209+
ToExtraSpecsCreateMap() (map[string]interface{}, error)
210+
}
211+
212+
// ExtraSpecsOpts is a map that contains key-value pairs.
213+
type ExtraSpecsOpts map[string]string
214+
215+
// ToExtraSpecsCreateMap assembles a body for a Create request based on the
216+
// contents of a ExtraSpecsOpts
217+
func (opts ExtraSpecsOpts) ToExtraSpecsCreateMap() (map[string]interface{}, error) {
218+
return map[string]interface{}{"extra_specs": opts}, nil
219+
}
220+
221+
// CreateExtraSpecs will create or update the extra-specs key-value pairs for the specified Flavor
222+
func CreateExtraSpecs(client *gophercloud.ServiceClient, flavorID string, opts CreateExtraSpecsOptsBuilder) (r CreateExtraSpecsResult) {
223+
b, err := opts.ToExtraSpecsCreateMap()
224+
if err != nil {
225+
r.Err = err
226+
return
227+
}
228+
_, r.Err = client.Post(extraSpecsCreateURL(client, flavorID), b, &r.Body, &gophercloud.RequestOpts{
229+
OkCodes: []int{200},
230+
})
231+
return
232+
}
233+
195234
// IDFromName is a convienience function that returns a flavor's ID given its
196235
// name.
197236
func IDFromName(client *gophercloud.ServiceClient, name string) (string, error) {
@@ -230,14 +269,3 @@ func IDFromName(client *gophercloud.ServiceClient, name string) (string, error)
230269
return "", err
231270
}
232271
}
233-
234-
// ExtraSpecs requests all the extra-specs for the given flavor ID.
235-
func ListExtraSpecs(client *gophercloud.ServiceClient, flavorID string) (r ListExtraSpecsResult) {
236-
_, r.Err = client.Get(extraSpecsListURL(client, flavorID), &r.Body, nil)
237-
return
238-
}
239-
240-
func GetExtraSpec(client *gophercloud.ServiceClient, flavorID string, key string) (r GetExtraSpecResult) {
241-
_, r.Err = client.Get(extraSpecsGetURL(client, flavorID, key), &r.Body, nil)
242-
return
243-
}

openstack/compute/v2/flavors/results.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,12 @@ type ListExtraSpecsResult struct {
205205
extraSpecsResult
206206
}
207207

208+
// CreateExtraSpecResult contains the result of a Create operation. Call its
209+
// Extract method to interpret it as a map[string]interface.
210+
type CreateExtraSpecsResult struct {
211+
extraSpecsResult
212+
}
213+
208214
// extraSpecResult contains the result of a call for individual a single
209215
// key-value pair.
210216
type extraSpecResult struct {

openstack/compute/v2/flavors/testing/fixtures.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,3 +60,21 @@ func HandleExtraSpecGetSuccessfully(t *testing.T) {
6060
fmt.Fprintf(w, GetExtraSpecBody)
6161
})
6262
}
63+
64+
func HandleExtraSpecsCreateSuccessfully(t *testing.T) {
65+
th.Mux.HandleFunc("/flavors/1/os-extra_specs", func(w http.ResponseWriter, r *http.Request) {
66+
th.TestMethod(t, r, "POST")
67+
th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
68+
th.TestHeader(t, r, "Accept", "application/json")
69+
th.TestJSONRequest(t, r, `{
70+
"extra_specs": {
71+
"hw:cpu_policy": "CPU-POLICY",
72+
"hw:cpu_thread_policy": "CPU-THREAD-POLICY"
73+
}
74+
}`)
75+
76+
w.Header().Set("Content-Type", "application/json")
77+
w.WriteHeader(http.StatusOK)
78+
fmt.Fprintf(w, ExtraSpecsGetBody)
79+
})
80+
}

openstack/compute/v2/flavors/testing/requests_test.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,3 +321,18 @@ func TestFlavorExtraSpecGet(t *testing.T) {
321321
th.AssertNoErr(t, err)
322322
th.CheckDeepEquals(t, expected, actual)
323323
}
324+
325+
func TestFlavorExtraSpecsCreate(t *testing.T) {
326+
th.SetupHTTP()
327+
defer th.TeardownHTTP()
328+
HandleExtraSpecsCreateSuccessfully(t)
329+
330+
createOpts := flavors.ExtraSpecsOpts{
331+
"hw:cpu_policy": "CPU-POLICY",
332+
"hw:cpu_thread_policy": "CPU-THREAD-POLICY",
333+
}
334+
expected := ExtraSpecs
335+
actual, err := flavors.CreateExtraSpecs(fake.ServiceClient(), "1", createOpts).Extract()
336+
th.AssertNoErr(t, err)
337+
th.CheckDeepEquals(t, expected, actual)
338+
}

openstack/compute/v2/flavors/urls.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,3 +35,7 @@ func extraSpecsListURL(client *gophercloud.ServiceClient, id string) string {
3535
func extraSpecsGetURL(client *gophercloud.ServiceClient, id, key string) string {
3636
return client.ServiceURL("flavors", id, "os-extra_specs", key)
3737
}
38+
39+
func extraSpecsCreateURL(client *gophercloud.ServiceClient, id string) string {
40+
return client.ServiceURL("flavors", id, "os-extra_specs")
41+
}

0 commit comments

Comments
 (0)