Skip to content

Commit c7760ac

Browse files
committed
chore: add diskclient.Update interface
1 parent c0071c6 commit c7760ac

File tree

4 files changed

+128
-0
lines changed

4 files changed

+128
-0
lines changed

staging/src/k8s.io/legacy-cloud-providers/azure/clients/diskclient/azure_diskclient.go

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,74 @@ func (c *Client) createOrUpdateResponder(resp *http.Response) (*compute.Disk, *r
206206
return result, retry.GetError(resp, err)
207207
}
208208

209+
// Update creates or updates a Disk.
210+
func (c *Client) Update(ctx context.Context, resourceGroupName string, diskName string, diskParameter compute.DiskUpdate) *retry.Error {
211+
mc := metrics.NewMetricContext("disks", "update", resourceGroupName, c.subscriptionID, "")
212+
213+
// Report errors if the client is rate limited.
214+
if !c.rateLimiterWriter.TryAccept() {
215+
mc.RateLimitedCount()
216+
return retry.GetRateLimitError(true, "DiskUpdate")
217+
}
218+
219+
// Report errors if the client is throttled.
220+
if c.RetryAfterWriter.After(time.Now()) {
221+
mc.ThrottledCount()
222+
rerr := retry.GetThrottlingError("DiskUpdate", "client throttled", c.RetryAfterWriter)
223+
return rerr
224+
}
225+
226+
rerr := c.updateDisk(ctx, resourceGroupName, diskName, diskParameter)
227+
mc.Observe(rerr.Error())
228+
if rerr != nil {
229+
if rerr.IsThrottled() {
230+
// Update RetryAfterReader so that no more requests would be sent until RetryAfter expires.
231+
c.RetryAfterWriter = rerr.RetryAfter
232+
}
233+
234+
return rerr
235+
}
236+
237+
return nil
238+
}
239+
240+
// updateDisk updates a Disk.
241+
func (c *Client) updateDisk(ctx context.Context, resourceGroupName string, diskName string, diskParameter compute.DiskUpdate) *retry.Error {
242+
resourceID := armclient.GetResourceID(
243+
c.subscriptionID,
244+
resourceGroupName,
245+
"Microsoft.Compute/disks",
246+
diskName,
247+
)
248+
249+
response, rerr := c.armClient.PatchResource(ctx, resourceID, diskParameter)
250+
defer c.armClient.CloseResponse(ctx, response)
251+
if rerr != nil {
252+
klog.V(5).Infof("Received error in %s: resourceID: %s, error: %s", "disk.put.request", resourceID, rerr.Error())
253+
return rerr
254+
}
255+
256+
if response != nil && response.StatusCode != http.StatusNoContent {
257+
_, rerr = c.updateResponder(response)
258+
if rerr != nil {
259+
klog.V(5).Infof("Received error in %s: resourceID: %s, error: %s", "disk.put.respond", resourceID, rerr.Error())
260+
return rerr
261+
}
262+
}
263+
264+
return nil
265+
}
266+
267+
func (c *Client) updateResponder(resp *http.Response) (*compute.Disk, *retry.Error) {
268+
result := &compute.Disk{}
269+
err := autorest.Respond(
270+
resp,
271+
azure.WithErrorUnlessStatusCode(http.StatusOK, http.StatusCreated),
272+
autorest.ByUnmarshallingJSON(&result))
273+
result.Response = autorest.Response{Response: resp}
274+
return result, retry.GetError(resp, err)
275+
}
276+
209277
// Delete deletes a Disk by name.
210278
func (c *Client) Delete(ctx context.Context, resourceGroupName string, diskName string) *retry.Error {
211279
mc := metrics.NewMetricContext("disks", "delete", resourceGroupName, c.subscriptionID, "")

staging/src/k8s.io/legacy-cloud-providers/azure/clients/diskclient/azure_diskclient_test.go

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,49 @@ func TestCreateOrUpdate(t *testing.T) {
161161
assert.Equal(t, throttleErr, rerr)
162162
}
163163

164+
func TestUpdate(t *testing.T) {
165+
ctrl := gomock.NewController(t)
166+
defer ctrl.Finish()
167+
168+
resourceID := "/subscriptions/subscriptionID/resourceGroups/rg/providers/Microsoft.Compute/disks/disk1"
169+
diskUpdate := getTestDiskUpdate()
170+
armClient := mockarmclient.NewMockInterface(ctrl)
171+
response := &http.Response{
172+
StatusCode: http.StatusOK,
173+
Body: ioutil.NopCloser(bytes.NewReader([]byte(""))),
174+
}
175+
armClient.EXPECT().PatchResource(gomock.Any(), resourceID, diskUpdate).Return(response, nil).Times(1)
176+
armClient.EXPECT().CloseResponse(gomock.Any(), gomock.Any()).Times(1)
177+
178+
diskClient := getTestDiskClient(armClient)
179+
rerr := diskClient.Update(context.TODO(), "rg", "disk1", diskUpdate)
180+
assert.Nil(t, rerr)
181+
182+
response = &http.Response{
183+
StatusCode: http.StatusTooManyRequests,
184+
Body: ioutil.NopCloser(bytes.NewReader([]byte("{}"))),
185+
}
186+
throttleErr := &retry.Error{
187+
HTTPStatusCode: http.StatusTooManyRequests,
188+
RawError: fmt.Errorf("error"),
189+
Retriable: true,
190+
RetryAfter: time.Unix(100, 0),
191+
}
192+
193+
armClient.EXPECT().PatchResource(gomock.Any(), resourceID, diskUpdate).Return(response, throttleErr).Times(1)
194+
armClient.EXPECT().CloseResponse(gomock.Any(), gomock.Any()).Times(1)
195+
rerr = diskClient.Update(context.TODO(), "rg", "disk1", diskUpdate)
196+
assert.Equal(t, throttleErr, rerr)
197+
}
198+
199+
func getTestDiskUpdate() compute.DiskUpdate {
200+
return compute.DiskUpdate{
201+
DiskUpdateProperties: &compute.DiskUpdateProperties{
202+
DiskSizeGB: to.Int32Ptr(100),
203+
},
204+
}
205+
}
206+
164207
func TestDelete(t *testing.T) {
165208
ctrl := gomock.NewController(t)
166209
defer ctrl.Finish()

staging/src/k8s.io/legacy-cloud-providers/azure/clients/diskclient/interface.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@ type Interface interface {
4040
// CreateOrUpdate creates or updates a Disk.
4141
CreateOrUpdate(ctx context.Context, resourceGroupName string, diskName string, diskParameter compute.Disk) *retry.Error
4242

43+
// Update updates a Disk.
44+
Update(ctx context.Context, resourceGroupName string, diskName string, diskParameter compute.DiskUpdate) *retry.Error
45+
4346
// Delete deletes a Disk by name.
4447
Delete(ctx context.Context, resourceGroupName string, diskName string) *retry.Error
4548

staging/src/k8s.io/legacy-cloud-providers/azure/clients/diskclient/mockdiskclient/interface.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,20 @@ func (mr *MockInterfaceMockRecorder) CreateOrUpdate(ctx, resourceGroupName, disk
7979
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateOrUpdate", reflect.TypeOf((*MockInterface)(nil).CreateOrUpdate), ctx, resourceGroupName, diskName, diskParameter)
8080
}
8181

82+
// Update mocks base method
83+
func (m *MockInterface) Update(ctx context.Context, resourceGroupName, diskName string, diskParameter compute.DiskUpdate) *retry.Error {
84+
m.ctrl.T.Helper()
85+
ret := m.ctrl.Call(m, "Update", ctx, resourceGroupName, diskName, diskParameter)
86+
ret0, _ := ret[0].(*retry.Error)
87+
return ret0
88+
}
89+
90+
// Update indicates an expected call of Update
91+
func (mr *MockInterfaceMockRecorder) Update(ctx, resourceGroupName, diskName, diskParameter interface{}) *gomock.Call {
92+
mr.mock.ctrl.T.Helper()
93+
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Update", reflect.TypeOf((*MockInterface)(nil).Update), ctx, resourceGroupName, diskName, diskParameter)
94+
}
95+
8296
// Delete mocks base method
8397
func (m *MockInterface) Delete(ctx context.Context, resourceGroupName, diskName string) *retry.Error {
8498
m.ctrl.T.Helper()

0 commit comments

Comments
 (0)