From f80bc07b505c7cb7565d98d1dc9ae2c7af27986a Mon Sep 17 00:00:00 2001 From: huweiwen Date: Mon, 4 Sep 2023 14:23:14 +0800 Subject: [PATCH 1/2] add MOCK for ECS DeleteDisk --- pkg/disk/cloud.go | 2 +- pkg/disk/ecsinterface.go | 1 + pkg/disk/ecsmock.go | 15 +++++++++++++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/pkg/disk/cloud.go b/pkg/disk/cloud.go index 1e4b397ab..10c8bc2fe 100644 --- a/pkg/disk/cloud.go +++ b/pkg/disk/cloud.go @@ -1050,7 +1050,7 @@ func IsDiskCreatedByCsi(disk ecs.Disk) bool { return false } -func deleteDisk(ecsClient *ecs.Client, diskId string) (*ecs.DeleteDiskResponse, error) { +func deleteDisk(ecsClient ECSInterface, diskId string) (*ecs.DeleteDiskResponse, error) { deleteDiskRequest := ecs.CreateDeleteDiskRequest() deleteDiskRequest.DiskId = diskId diff --git a/pkg/disk/ecsinterface.go b/pkg/disk/ecsinterface.go index 348a50224..8f9764630 100644 --- a/pkg/disk/ecsinterface.go +++ b/pkg/disk/ecsinterface.go @@ -4,4 +4,5 @@ import "github.com/aliyun/alibaba-cloud-sdk-go/services/ecs" type ECSInterface interface { DescribeAvailableResource(request *ecs.DescribeAvailableResourceRequest) (response *ecs.DescribeAvailableResourceResponse, err error) + DeleteDisk(request *ecs.DeleteDiskRequest) (response *ecs.DeleteDiskResponse, err error) } diff --git a/pkg/disk/ecsmock.go b/pkg/disk/ecsmock.go index 09f8d71fd..ac52e1238 100644 --- a/pkg/disk/ecsmock.go +++ b/pkg/disk/ecsmock.go @@ -34,6 +34,21 @@ func (m *MockECSInterface) EXPECT() *MockECSInterfaceMockRecorder { return m.recorder } +// DeleteDisk mocks base method. +func (m *MockECSInterface) DeleteDisk(request *ecs.DeleteDiskRequest) (*ecs.DeleteDiskResponse, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DeleteDisk", request) + ret0, _ := ret[0].(*ecs.DeleteDiskResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// DeleteDisk indicates an expected call of DeleteDisk. +func (mr *MockECSInterfaceMockRecorder) DeleteDisk(request interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteDisk", reflect.TypeOf((*MockECSInterface)(nil).DeleteDisk), request) +} + // DescribeAvailableResource mocks base method. func (m *MockECSInterface) DescribeAvailableResource(request *ecs.DescribeAvailableResourceRequest) (*ecs.DescribeAvailableResourceResponse, error) { m.ctrl.T.Helper() From 5b93807df9189f771e8256699187ea61dc3ade35 Mon Sep 17 00:00:00 2001 From: huweiwen Date: Mon, 4 Sep 2023 14:57:07 +0800 Subject: [PATCH 2/2] add unit test for deleteDisk --- pkg/disk/cloud_test.go | 55 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 pkg/disk/cloud_test.go diff --git a/pkg/disk/cloud_test.go b/pkg/disk/cloud_test.go new file mode 100644 index 000000000..413e68af0 --- /dev/null +++ b/pkg/disk/cloud_test.go @@ -0,0 +1,55 @@ +package disk + +import ( + "testing" + + alicloudErr "github.com/aliyun/alibaba-cloud-sdk-go/sdk/errors" + "github.com/aliyun/alibaba-cloud-sdk-go/services/ecs" + gomock "github.com/golang/mock/gomock" + csilog "github.com/kubernetes-sigs/alibaba-cloud-csi-driver/pkg/log" + "github.com/sirupsen/logrus" + "github.com/stretchr/testify/assert" +) + +var deleteDiskResponse = ecs.CreateDeleteDiskResponse() + +func init() { + unmarshalAcsResponse([]byte(`{ + "RequestId": "B6B6D6B6-6B6B-6B6B-6B6B-6B6B6B6B6B6", +}`), deleteDiskResponse) + + csilog.Log = logrus.New() +} + +func TestDeleteDisk(t *testing.T) { + ctrl := gomock.NewController(t) + c := NewMockECSInterface(ctrl) + + c.EXPECT().DeleteDisk(gomock.Any()).Return(deleteDiskResponse, nil) + + _, err := deleteDisk(c, "test-disk") + assert.Nil(t, err) +} + +func TestDeleteDiskRetryOnInitError(t *testing.T) { + ctrl := gomock.NewController(t) + c := NewMockECSInterface(ctrl) + + initErr := alicloudErr.NewServerError(400, `{"Code": "IncorrectDiskStatus.Initializing"}`, "") + c.EXPECT().DeleteDisk(gomock.Any()).Return(nil, initErr) + c.EXPECT().DeleteDisk(gomock.Any()).Return(deleteDiskResponse, nil) + + _, err := deleteDisk(c, "test-disk") + assert.Nil(t, err) +} + +func TestDeleteDiskPassthroughError(t *testing.T) { + ctrl := gomock.NewController(t) + c := NewMockECSInterface(ctrl) + + serverErr := alicloudErr.NewServerError(400, `{"Code": "AnyOtherErrors"}`, "") + c.EXPECT().DeleteDisk(gomock.Any()).Return(nil, serverErr) + + _, err := deleteDisk(c, "test-disk") + assert.Equal(t, serverErr, err) +}