Skip to content

Commit ed2f7b0

Browse files
authored
Merge pull request kubernetes#88155 from feiskyer/more-clients
Add deletion interfaces for VM, VMSS and interface clients
2 parents 3b22fcc + c1383e9 commit ed2f7b0

File tree

13 files changed

+264
-0
lines changed

13 files changed

+264
-0
lines changed

staging/src/k8s.io/legacy-cloud-providers/azure/azure_fakes.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,10 @@ func (fIC *fakeAzureInterfacesClient) GetVirtualMachineScaleSetNetworkInterface(
292292
errors.New("Not such Interface"))
293293
}
294294

295+
func (fIC *fakeAzureInterfacesClient) Delete(ctx context.Context, resourceGroupName string, networkInterfaceName string) *retry.Error {
296+
return nil
297+
}
298+
295299
func (fIC *fakeAzureInterfacesClient) setFakeStore(store map[string]map[string]network.Interface) {
296300
fIC.mutex.Lock()
297301
defer fIC.mutex.Unlock()
@@ -363,6 +367,10 @@ func (fVMC *fakeAzureVirtualMachinesClient) List(ctx context.Context, resourceGr
363367
return result, nil
364368
}
365369

370+
func (fVMC *fakeAzureVirtualMachinesClient) Delete(ctx context.Context, resourceGroupName string, VMName string) *retry.Error {
371+
return nil
372+
}
373+
366374
func (fVMC *fakeAzureVirtualMachinesClient) setFakeStore(store map[string]map[string]compute.VirtualMachine) {
367375
fVMC.mutex.Lock()
368376
defer fVMC.mutex.Unlock()
@@ -661,6 +669,10 @@ func (fVMSSC *fakeVirtualMachineScaleSetsClient) UpdateInstances(ctx context.Con
661669
return nil
662670
}
663671

672+
func (fVMSSC *fakeVirtualMachineScaleSetsClient) DeleteInstances(ctx context.Context, resourceGroupName string, vmScaleSetName string, vmInstanceIDs compute.VirtualMachineScaleSetVMInstanceRequiredIDs) *retry.Error {
673+
return nil
674+
}
675+
664676
type fakeRoutesClient struct {
665677
mutex *sync.Mutex
666678
FakeStore map[string]map[string]network.Route

staging/src/k8s.io/legacy-cloud-providers/azure/clients/interfaceclient/azure_interfaceclient.go

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,3 +274,46 @@ func (c *Client) createOrUpdateResponder(resp *http.Response) (*network.Interfac
274274
result.Response = autorest.Response{Response: resp}
275275
return result, retry.GetError(resp, err)
276276
}
277+
278+
// Delete deletes a network interface by name.
279+
func (c *Client) Delete(ctx context.Context, resourceGroupName string, networkInterfaceName string) *retry.Error {
280+
mc := metrics.NewMetricContext("interfaces", "delete", resourceGroupName, c.subscriptionID, "")
281+
282+
// Report errors if the client is rate limited.
283+
if !c.rateLimiterWriter.TryAccept() {
284+
mc.RateLimitedCount()
285+
return retry.GetRateLimitError(true, "NicDelete")
286+
}
287+
288+
// Report errors if the client is throttled.
289+
if c.RetryAfterWriter.After(time.Now()) {
290+
mc.ThrottledCount()
291+
rerr := retry.GetThrottlingError("NicDelete", "client throttled", c.RetryAfterWriter)
292+
return rerr
293+
}
294+
295+
rerr := c.deleteInterface(ctx, resourceGroupName, networkInterfaceName)
296+
mc.Observe(rerr.Error())
297+
if rerr != nil {
298+
if rerr.IsThrottled() {
299+
// Update RetryAfterReader so that no more requests would be sent until RetryAfter expires.
300+
c.RetryAfterWriter = rerr.RetryAfter
301+
}
302+
303+
return rerr
304+
}
305+
306+
return nil
307+
}
308+
309+
// deleteInterface deletes a network interface by name.
310+
func (c *Client) deleteInterface(ctx context.Context, resourceGroupName string, networkInterfaceName string) *retry.Error {
311+
resourceID := armclient.GetResourceID(
312+
c.subscriptionID,
313+
resourceGroupName,
314+
"Microsoft.Network/networkInterfaces",
315+
networkInterfaceName,
316+
)
317+
318+
return c.armClient.DeleteResource(ctx, resourceID, "")
319+
}

staging/src/k8s.io/legacy-cloud-providers/azure/clients/interfaceclient/azure_interfaceclient_test.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,19 @@ func TestCreateOrUpdate(t *testing.T) {
121121
assert.Nil(t, rerr)
122122
}
123123

124+
func TestDelete(t *testing.T) {
125+
ctrl := gomock.NewController(t)
126+
defer ctrl.Finish()
127+
128+
r := getTestInterface("interface1")
129+
armClient := mockarmclient.NewMockInterface(ctrl)
130+
armClient.EXPECT().DeleteResource(gomock.Any(), to.String(r.ID), "").Return(nil).Times(1)
131+
132+
diskClient := getTestInterfaceClient(armClient)
133+
rerr := diskClient.Delete(context.TODO(), "rg", "interface1")
134+
assert.Nil(t, rerr)
135+
}
136+
124137
func getTestInterface(name string) network.Interface {
125138
resourceID := fmt.Sprintf("/subscriptions/subscriptionID/resourceGroups/rg/providers/Microsoft.Network/networkInterfaces/%s", name)
126139
return network.Interface{

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,4 +45,7 @@ type Interface interface {
4545

4646
// CreateOrUpdate creates or updates a network.Interface.
4747
CreateOrUpdate(ctx context.Context, resourceGroupName string, networkInterfaceName string, parameters network.Interface) *retry.Error
48+
49+
// Delete deletes a network interface by name.
50+
Delete(ctx context.Context, resourceGroupName string, networkInterfaceName string) *retry.Error
4851
}

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,3 +93,17 @@ func (mr *MockInterfaceMockRecorder) CreateOrUpdate(ctx, resourceGroupName, netw
9393
mr.mock.ctrl.T.Helper()
9494
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateOrUpdate", reflect.TypeOf((*MockInterface)(nil).CreateOrUpdate), ctx, resourceGroupName, networkInterfaceName, parameters)
9595
}
96+
97+
// Delete mocks base method
98+
func (m *MockInterface) Delete(ctx context.Context, resourceGroupName, networkInterfaceName string) *retry.Error {
99+
m.ctrl.T.Helper()
100+
ret := m.ctrl.Call(m, "Delete", ctx, resourceGroupName, networkInterfaceName)
101+
ret0, _ := ret[0].(*retry.Error)
102+
return ret0
103+
}
104+
105+
// Delete indicates an expected call of Delete
106+
func (mr *MockInterfaceMockRecorder) Delete(ctx, resourceGroupName, networkInterfaceName interface{}) *gomock.Call {
107+
mr.mock.ctrl.T.Helper()
108+
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockInterface)(nil).Delete), ctx, resourceGroupName, networkInterfaceName)
109+
}

staging/src/k8s.io/legacy-cloud-providers/azure/clients/vmclient/azure_vmclient.go

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -434,3 +434,46 @@ func (c *Client) createOrUpdateResponder(resp *http.Response) (*compute.VirtualM
434434
result.Response = autorest.Response{Response: resp}
435435
return result, retry.GetError(resp, err)
436436
}
437+
438+
// Delete deletes a VirtualMachine.
439+
func (c *Client) Delete(ctx context.Context, resourceGroupName string, VMName string) *retry.Error {
440+
mc := metrics.NewMetricContext("vm", "delete", resourceGroupName, c.subscriptionID, "")
441+
442+
// Report errors if the client is rate limited.
443+
if !c.rateLimiterWriter.TryAccept() {
444+
mc.RateLimitedCount()
445+
return retry.GetRateLimitError(true, "VMDelete")
446+
}
447+
448+
// Report errors if the client is throttled.
449+
if c.RetryAfterWriter.After(time.Now()) {
450+
mc.ThrottledCount()
451+
rerr := retry.GetThrottlingError("VMDelete", "client throttled", c.RetryAfterWriter)
452+
return rerr
453+
}
454+
455+
rerr := c.deleteVM(ctx, resourceGroupName, VMName)
456+
mc.Observe(rerr.Error())
457+
if rerr != nil {
458+
if rerr.IsThrottled() {
459+
// Update RetryAfterReader so that no more requests would be sent until RetryAfter expires.
460+
c.RetryAfterWriter = rerr.RetryAfter
461+
}
462+
463+
return rerr
464+
}
465+
466+
return nil
467+
}
468+
469+
// deleteVM deletes a VirtualMachine.
470+
func (c *Client) deleteVM(ctx context.Context, resourceGroupName string, VMName string) *retry.Error {
471+
resourceID := armclient.GetResourceID(
472+
c.subscriptionID,
473+
resourceGroupName,
474+
"Microsoft.Compute/virtualMachines",
475+
VMName,
476+
)
477+
478+
return c.armClient.DeleteResource(ctx, resourceID, "")
479+
}

staging/src/k8s.io/legacy-cloud-providers/azure/clients/vmclient/azure_vmclient_test.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,19 @@ func TestCreateOrUpdate(t *testing.T) {
139139
assert.Nil(t, rerr)
140140
}
141141

142+
func TestDelete(t *testing.T) {
143+
ctrl := gomock.NewController(t)
144+
defer ctrl.Finish()
145+
146+
r := getTestVM("vm1")
147+
armClient := mockarmclient.NewMockInterface(ctrl)
148+
armClient.EXPECT().DeleteResource(gomock.Any(), to.String(r.ID), "").Return(nil).Times(1)
149+
150+
client := getTestVMClient(armClient)
151+
rerr := client.Delete(context.TODO(), "rg", "vm1")
152+
assert.Nil(t, rerr)
153+
}
154+
142155
func getTestVM(vmName string) compute.VirtualMachine {
143156
resourceID := fmt.Sprintf("/subscriptions/subscriptionID/resourceGroups/rg/providers/Microsoft.Compute/virtualMachines/%s", vmName)
144157
return compute.VirtualMachine{

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,4 +45,7 @@ type Interface interface {
4545

4646
// Update updates a VirtualMachine.
4747
Update(ctx context.Context, resourceGroupName string, VMName string, parameters compute.VirtualMachineUpdate, source string) *retry.Error
48+
49+
// Delete deletes a VirtualMachine.
50+
Delete(ctx context.Context, resourceGroupName string, VMName string) *retry.Error
4851
}

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,3 +107,17 @@ func (mr *MockInterfaceMockRecorder) Update(ctx, resourceGroupName, VMName, para
107107
mr.mock.ctrl.T.Helper()
108108
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Update", reflect.TypeOf((*MockInterface)(nil).Update), ctx, resourceGroupName, VMName, parameters, source)
109109
}
110+
111+
// Delete mocks base method
112+
func (m *MockInterface) Delete(ctx context.Context, resourceGroupName, VMName string) *retry.Error {
113+
m.ctrl.T.Helper()
114+
ret := m.ctrl.Call(m, "Delete", ctx, resourceGroupName, VMName)
115+
ret0, _ := ret[0].(*retry.Error)
116+
return ret0
117+
}
118+
119+
// Delete indicates an expected call of Delete
120+
func (mr *MockInterfaceMockRecorder) Delete(ctx, resourceGroupName, VMName interface{}) *gomock.Call {
121+
mr.mock.ctrl.T.Helper()
122+
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockInterface)(nil).Delete), ctx, resourceGroupName, VMName)
123+
}

staging/src/k8s.io/legacy-cloud-providers/azure/clients/vmssclient/azure_vmssclient.go

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -359,3 +359,69 @@ func (page VirtualMachineScaleSetListResultPage) Values() []compute.VirtualMachi
359359
}
360360
return *page.vmsslr.Value
361361
}
362+
363+
// DeleteInstances deletes the instances for a VirtualMachineScaleSet.
364+
func (c *Client) DeleteInstances(ctx context.Context, resourceGroupName string, vmScaleSetName string, vmInstanceIDs compute.VirtualMachineScaleSetVMInstanceRequiredIDs) *retry.Error {
365+
mc := metrics.NewMetricContext("vmss", "delete_instances", resourceGroupName, c.subscriptionID, "")
366+
367+
// Report errors if the client is rate limited.
368+
if !c.rateLimiterWriter.TryAccept() {
369+
mc.RateLimitedCount()
370+
return retry.GetRateLimitError(true, "VMSSDeleteInstances")
371+
}
372+
373+
// Report errors if the client is throttled.
374+
if c.RetryAfterWriter.After(time.Now()) {
375+
mc.ThrottledCount()
376+
rerr := retry.GetThrottlingError("VMSSDeleteInstances", "client throttled", c.RetryAfterWriter)
377+
return rerr
378+
}
379+
380+
rerr := c.deleteVMSSInstances(ctx, resourceGroupName, vmScaleSetName, vmInstanceIDs)
381+
mc.Observe(rerr.Error())
382+
if rerr != nil {
383+
if rerr.IsThrottled() {
384+
// Update RetryAfterReader so that no more requests would be sent until RetryAfter expires.
385+
c.RetryAfterWriter = rerr.RetryAfter
386+
}
387+
388+
return rerr
389+
}
390+
391+
return nil
392+
}
393+
394+
// deleteVMSSInstances deletes the instances for a VirtualMachineScaleSet.
395+
func (c *Client) deleteVMSSInstances(ctx context.Context, resourceGroupName string, vmScaleSetName string, vmInstanceIDs compute.VirtualMachineScaleSetVMInstanceRequiredIDs) *retry.Error {
396+
resourceID := armclient.GetResourceID(
397+
c.subscriptionID,
398+
resourceGroupName,
399+
"Microsoft.Compute/virtualMachineScaleSets",
400+
vmScaleSetName,
401+
)
402+
response, rerr := c.armClient.PostResource(ctx, resourceID, "delete", vmInstanceIDs)
403+
defer c.armClient.CloseResponse(ctx, response)
404+
if rerr != nil {
405+
klog.V(5).Infof("Received error in %s: resourceID: %s, error: %s", "vmss.deletevms.request", resourceID, rerr.Error())
406+
return rerr
407+
}
408+
409+
err := autorest.Respond(response, azure.WithErrorUnlessStatusCode(http.StatusOK, http.StatusAccepted))
410+
if err != nil {
411+
klog.V(5).Infof("Received error in %s: resourceID: %s, error: %s", "vmss.deletevms.respond", resourceID, rerr.Error())
412+
return retry.GetError(response, err)
413+
}
414+
415+
future, err := azure.NewFutureFromResponse(response)
416+
if err != nil {
417+
klog.V(5).Infof("Received error in %s: resourceID: %s, error: %s", "vmss.deletevms.future", resourceID, rerr.Error())
418+
return retry.NewError(false, err)
419+
}
420+
421+
if err := c.armClient.WaitForAsyncOperationCompletion(ctx, &future, "vmssclient.DeleteInstances"); err != nil {
422+
klog.V(5).Infof("Received error in %s: resourceID: %s, error: %s", "vmss.deletevms.wait", resourceID, rerr.Error())
423+
return retry.NewError(false, err)
424+
}
425+
426+
return nil
427+
}

0 commit comments

Comments
 (0)