From 08de15cebe5423926ec4f7f311a2972be8a3bbb6 Mon Sep 17 00:00:00 2001 From: Madhu Rajanna Date: Tue, 28 Jun 2022 13:52:05 +0530 Subject: [PATCH] rbd: add unit test for checkHealthyPrimary Removed the code in checkHealthyPrimary which makes the ceph call, passing it as input now. Added unit test for checkHealthyPrimary function Signed-off-by: Madhu Rajanna (cherry picked from commit 8a47904e8f1a22496b8af79d22a4210a7b06aad8) --- internal/rbd/replicationcontrollerserver.go | 13 ++-- .../rbd/replicationcontrollerserver_test.go | 72 +++++++++++++++++++ 2 files changed, 79 insertions(+), 6 deletions(-) diff --git a/internal/rbd/replicationcontrollerserver.go b/internal/rbd/replicationcontrollerserver.go index a767ef44f..57c0b7bf8 100644 --- a/internal/rbd/replicationcontrollerserver.go +++ b/internal/rbd/replicationcontrollerserver.go @@ -580,7 +580,12 @@ func (rs *ReplicationServer) PromoteVolume(ctx context.Context, } } - err = checkHealthyPrimary(ctx, rbdVol) + mirrorStatus, err := rbdVol.getImageMirroringStatus() + if err != nil { + return nil, status.Error(codes.Internal, err.Error()) + } + + err = checkHealthyPrimary(ctx, rbdVol, mirrorStatus) if err != nil { return nil, status.Error(codes.Internal, err.Error()) } @@ -617,11 +622,7 @@ func (rs *ReplicationServer) PromoteVolume(ctx context.Context, // checkHealthyPrimary checks if the image is a healhty primary or not. // healthy primary image will be in up+stopped state, for states other // than this it returns an error message. -func checkHealthyPrimary(ctx context.Context, rbdVol *rbdVolume) error { - mirrorStatus, err := rbdVol.getImageMirroringStatus() - if err != nil { - return err - } +func checkHealthyPrimary(ctx context.Context, rbdVol *rbdVolume, mirrorStatus *librbd.GlobalMirrorImageStatus) error { localStatus, err := mirrorStatus.LocalStatus() if err != nil { // LocalStatus can fail if the local site status is not found in diff --git a/internal/rbd/replicationcontrollerserver_test.go b/internal/rbd/replicationcontrollerserver_test.go index 401292587..87f60a38f 100644 --- a/internal/rbd/replicationcontrollerserver_test.go +++ b/internal/rbd/replicationcontrollerserver_test.go @@ -279,3 +279,75 @@ func TestCheckVolumeResyncStatus(t *testing.T) { }) } } + +func Test_checkHealthyPrimary(t *testing.T) { + t.Parallel() + rbdVol := &rbdVolume{ + rbdImage: rbdImage{ + RbdImageName: "test", + Pool: "test-pool", + }, + } + tests := []struct { + name string + ctx context.Context + rbdVol *rbdVolume + mirrorStatus *librbd.GlobalMirrorImageStatus + wantErr bool + }{ + { + name: "when image is in up+stopped state", + ctx: context.TODO(), + rbdVol: rbdVol, + mirrorStatus: &librbd.GlobalMirrorImageStatus{ + SiteStatuses: []librbd.SiteMirrorImageStatus{ + { + MirrorUUID: "", + State: librbd.MirrorImageStatusStateStopped, + Up: true, + }, + }, + }, + wantErr: false, + }, + { + name: "when image is in up+error state", + ctx: context.TODO(), + rbdVol: rbdVol, + mirrorStatus: &librbd.GlobalMirrorImageStatus{ + SiteStatuses: []librbd.SiteMirrorImageStatus{ + { + MirrorUUID: "", + State: librbd.MirrorImageStatusStateError, + Up: false, + }, + }, + }, + wantErr: true, + }, + { + name: "when image is in up+replaying state", + ctx: context.TODO(), + rbdVol: rbdVol, + mirrorStatus: &librbd.GlobalMirrorImageStatus{ + SiteStatuses: []librbd.SiteMirrorImageStatus{ + { + MirrorUUID: "", + State: librbd.MirrorImageStatusStateReplaying, + Up: true, + }, + }, + }, + wantErr: true, + }, + } + for _, tt := range tests { + ts := tt + t.Run(ts.name, func(t *testing.T) { + t.Parallel() + if err := checkHealthyPrimary(ts.ctx, ts.rbdVol, ts.mirrorStatus); (err != nil) != ts.wantErr { + t.Errorf("checkHealthyPrimary() error = %v, wantErr %v", err, ts.wantErr) + } + }) + } +}