Skip to content

Commit a7c3703

Browse files
authored
Merge pull request #3475 from gophercloud/bp-v2-8e2cf7e
[v2] Implement update & delete traits on resource provider
2 parents f01d8d8 + 804e6c1 commit a7c3703

3 files changed

Lines changed: 83 additions & 0 deletions

File tree

openstack/placement/v1/resourceproviders/requests.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,3 +175,38 @@ func GetTraits(ctx context.Context, client *gophercloud.ServiceClient, resourceP
175175
_, r.Header, r.Err = gophercloud.ParseResponse(resp, err)
176176
return
177177
}
178+
179+
// UpdateTraitsOptsBuilder allows extensions to add additional parameters to the
180+
// UpdateTraits request.
181+
type UpdateTraitsOptsBuilder interface {
182+
ToResourceProviderUpdateTraitsMap() (map[string]any, error)
183+
}
184+
185+
// UpdateTraitsOpts represents options used to update traits of a resource provider.
186+
type UpdateTraitsOpts = ResourceProviderTraits
187+
188+
// ToResourceProviderUpdateTraitsMap constructs a request body from UpdateTraitsOpts.
189+
func (opts UpdateTraitsOpts) ToResourceProviderUpdateTraitsMap() (map[string]any, error) {
190+
return gophercloud.BuildRequestBody(opts, "")
191+
}
192+
193+
func UpdateTraits(ctx context.Context, client *gophercloud.ServiceClient, resourceProviderID string, opts UpdateTraitsOptsBuilder) (r GetTraitsResult) {
194+
b, err := opts.ToResourceProviderUpdateTraitsMap()
195+
if err != nil {
196+
r.Err = err
197+
return
198+
}
199+
resp, err := client.Put(ctx, getResourceProviderTraitsURL(client, resourceProviderID), b, &r.Body, &gophercloud.RequestOpts{
200+
OkCodes: []int{200},
201+
})
202+
_, r.Header, r.Err = gophercloud.ParseResponse(resp, err)
203+
return
204+
}
205+
206+
func DeleteTraits(ctx context.Context, client *gophercloud.ServiceClient, resourceProviderID string) (r DeleteResult) {
207+
resp, err := client.Delete(ctx, getResourceProviderTraitsURL(client, resourceProviderID), &gophercloud.RequestOpts{
208+
OkCodes: []int{204},
209+
})
210+
_, r.Header, r.Err = gophercloud.ParseResponse(resp, err)
211+
return
212+
}

openstack/placement/v1/resourceproviders/testing/fixtures_test.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -387,3 +387,29 @@ func HandleResourceProviderGetTraits(t *testing.T, fakeServer th.FakeServer) {
387387
fmt.Fprint(w, TraitsBody)
388388
})
389389
}
390+
391+
func HandleResourceProviderPutTraits(t *testing.T, fakeServer th.FakeServer) {
392+
traitsTestUrl := fmt.Sprintf("/resource_providers/%s/traits", ResourceProviderTestID)
393+
394+
fakeServer.Mux.HandleFunc(traitsTestUrl,
395+
func(w http.ResponseWriter, r *http.Request) {
396+
th.TestMethod(t, r, "PUT")
397+
th.TestHeader(t, r, "X-Auth-Token", client.TokenID)
398+
399+
w.Header().Add("Content-Type", "application/json")
400+
w.WriteHeader(http.StatusOK)
401+
402+
fmt.Fprint(w, TraitsBody)
403+
})
404+
}
405+
406+
func HandleResourceProviderDeleteTraits(t *testing.T, fakeServer th.FakeServer) {
407+
traitsTestUrl := fmt.Sprintf("/resource_providers/%s/traits", ResourceProviderTestID)
408+
409+
fakeServer.Mux.HandleFunc(traitsTestUrl,
410+
func(w http.ResponseWriter, r *http.Request) {
411+
th.TestMethod(t, r, "DELETE")
412+
th.TestHeader(t, r, "X-Auth-Token", client.TokenID)
413+
w.WriteHeader(http.StatusNoContent)
414+
})
415+
}

openstack/placement/v1/resourceproviders/testing/requests_test.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,3 +145,25 @@ func TestGetResourceProvidersTraits(t *testing.T) {
145145
th.AssertNoErr(t, err)
146146
th.AssertDeepEquals(t, ExpectedTraits, *actual)
147147
}
148+
149+
func TestUpdateResourceProvidersTraits(t *testing.T) {
150+
fakeServer := th.SetupHTTP()
151+
defer fakeServer.Teardown()
152+
153+
HandleResourceProviderPutTraits(t, fakeServer)
154+
155+
opts := resourceproviders.UpdateTraitsOpts(ExpectedTraits)
156+
actual, err := resourceproviders.UpdateTraits(context.TODO(), client.ServiceClient(fakeServer), ResourceProviderTestID, opts).Extract()
157+
th.AssertNoErr(t, err)
158+
th.AssertDeepEquals(t, ExpectedTraits, *actual)
159+
}
160+
161+
func TestDeleteResourceProvidersTraits(t *testing.T) {
162+
fakeServer := th.SetupHTTP()
163+
defer fakeServer.Teardown()
164+
165+
HandleResourceProviderDeleteTraits(t, fakeServer)
166+
167+
err := resourceproviders.DeleteTraits(context.TODO(), client.ServiceClient(fakeServer), ResourceProviderTestID).ExtractErr()
168+
th.AssertNoErr(t, err)
169+
}

0 commit comments

Comments
 (0)