sigs.k8s.io/cluster-api-provider-azure@v1.14.3/azure/services/disks/disks_test.go (about) 1 /* 2 Copyright 2020 The Kubernetes Authors. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package disks 18 19 import ( 20 "context" 21 "io" 22 "net/http" 23 "strings" 24 "testing" 25 26 "github.com/Azure/azure-sdk-for-go/sdk/azcore" 27 . "github.com/onsi/gomega" 28 "go.uber.org/mock/gomock" 29 infrav1 "sigs.k8s.io/cluster-api-provider-azure/api/v1beta1" 30 "sigs.k8s.io/cluster-api-provider-azure/azure" 31 "sigs.k8s.io/cluster-api-provider-azure/azure/services/async/mock_async" 32 "sigs.k8s.io/cluster-api-provider-azure/azure/services/disks/mock_disks" 33 gomockinternal "sigs.k8s.io/cluster-api-provider-azure/internal/test/matchers/gomock" 34 "sigs.k8s.io/cluster-api-provider-azure/util/reconciler" 35 ) 36 37 var ( 38 diskSpec1 = DiskSpec{ 39 Name: "my-disk-1", 40 ResourceGroup: "my-group", 41 } 42 43 diskSpec2 = DiskSpec{ 44 Name: "my-disk-2", 45 ResourceGroup: "my-group", 46 } 47 48 fakeDiskSpecs = []azure.ResourceSpecGetter{ 49 &diskSpec1, 50 &diskSpec2, 51 } 52 53 internalError = &azcore.ResponseError{ 54 RawResponse: &http.Response{ 55 Body: io.NopCloser(strings.NewReader("#: Internal Server Error: StatusCode=500")), 56 StatusCode: http.StatusInternalServerError, 57 }, 58 } 59 ) 60 61 func TestDeleteDisk(t *testing.T) { 62 testcases := []struct { 63 name string 64 expectedError string 65 expect func(s *mock_disks.MockDiskScopeMockRecorder, r *mock_async.MockReconcilerMockRecorder) 66 }{ 67 { 68 name: "noop if no disk specs are found", 69 expectedError: "", 70 expect: func(s *mock_disks.MockDiskScopeMockRecorder, r *mock_async.MockReconcilerMockRecorder) { 71 s.DefaultedAzureServiceReconcileTimeout().Return(reconciler.DefaultAzureServiceReconcileTimeout) 72 s.DiskSpecs().Return([]azure.ResourceSpecGetter{}) 73 }, 74 }, 75 { 76 name: "delete the disk", 77 expectedError: "", 78 expect: func(s *mock_disks.MockDiskScopeMockRecorder, r *mock_async.MockReconcilerMockRecorder) { 79 s.DiskSpecs().Return(fakeDiskSpecs) 80 gomock.InOrder( 81 s.DefaultedAzureServiceReconcileTimeout().Return(reconciler.DefaultAzureServiceReconcileTimeout), 82 r.DeleteResource(gomockinternal.AContext(), &diskSpec1, serviceName).Return(nil), 83 r.DeleteResource(gomockinternal.AContext(), &diskSpec2, serviceName).Return(nil), 84 s.UpdateDeleteStatus(infrav1.DisksReadyCondition, serviceName, nil), 85 ) 86 }, 87 }, 88 { 89 name: "disk already deleted", 90 expectedError: "", 91 expect: func(s *mock_disks.MockDiskScopeMockRecorder, r *mock_async.MockReconcilerMockRecorder) { 92 s.DiskSpecs().Return(fakeDiskSpecs) 93 gomock.InOrder( 94 s.DefaultedAzureServiceReconcileTimeout().Return(reconciler.DefaultAzureServiceReconcileTimeout), 95 r.DeleteResource(gomockinternal.AContext(), &diskSpec1, serviceName).Return(nil), 96 r.DeleteResource(gomockinternal.AContext(), &diskSpec2, serviceName).Return(nil), 97 s.UpdateDeleteStatus(infrav1.DisksReadyCondition, serviceName, nil), 98 ) 99 }, 100 }, 101 { 102 name: "error while trying to delete the disk", 103 expectedError: "#: Internal Server Error: StatusCode=500", 104 expect: func(s *mock_disks.MockDiskScopeMockRecorder, r *mock_async.MockReconcilerMockRecorder) { 105 s.DiskSpecs().Return(fakeDiskSpecs) 106 gomock.InOrder( 107 s.DefaultedAzureServiceReconcileTimeout().Return(reconciler.DefaultAzureServiceReconcileTimeout), 108 r.DeleteResource(gomockinternal.AContext(), &diskSpec1, serviceName).Return(internalError), 109 r.DeleteResource(gomockinternal.AContext(), &diskSpec2, serviceName).Return(nil), 110 s.UpdateDeleteStatus(infrav1.DisksReadyCondition, serviceName, internalError), 111 ) 112 }, 113 }, 114 } 115 116 for _, tc := range testcases { 117 tc := tc 118 t.Run(tc.name, func(t *testing.T) { 119 g := NewWithT(t) 120 121 t.Parallel() 122 mockCtrl := gomock.NewController(t) 123 defer mockCtrl.Finish() 124 scopeMock := mock_disks.NewMockDiskScope(mockCtrl) 125 asyncMock := mock_async.NewMockReconciler(mockCtrl) 126 127 tc.expect(scopeMock.EXPECT(), asyncMock.EXPECT()) 128 129 s := &Service{ 130 Scope: scopeMock, 131 Reconciler: asyncMock, 132 } 133 134 err := s.Delete(context.TODO()) 135 if tc.expectedError != "" { 136 g.Expect(err).To(HaveOccurred()) 137 g.Expect(err.Error()).To(ContainSubstring(tc.expectedError)) 138 } else { 139 g.Expect(err).NotTo(HaveOccurred()) 140 } 141 }) 142 } 143 }