Skip to content

Commit 18843b4

Browse files
committed
feature. add validation for delete cluster
1 parent 0a8826a commit 18843b4

File tree

2 files changed

+111
-15
lines changed

2 files changed

+111
-15
lines changed

cmd/server/handlers.go

+24-6
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,7 @@ func (s *server) ScaleCluster(ctx context.Context, in *pb.ScaleClusterRequest) (
343343
func (s *server) DeleteCluster(ctx context.Context, in *pb.IDRequest) (*pb.SimpleResponse, error) {
344344
log.Info("Request 'DeleteCluster' for clusterId : ", in.GetId())
345345

346+
// Validation : check request
346347
if err := validateDeleteClusterRequest(in); err != nil {
347348
return &pb.SimpleResponse{
348349
Code: pb.Code_INVALID_ARGUMENT,
@@ -353,6 +354,8 @@ func (s *server) DeleteCluster(ctx context.Context, in *pb.IDRequest) (*pb.Simpl
353354
}
354355
clusterId := in.GetId()
355356

357+
// Validation : check cluster status
358+
// The cluster status must be RUNNING.
356359
res, err := clusterInfoClient.GetCluster(ctx, &pb.GetClusterRequest{ClusterId: clusterId})
357360
if err != nil {
358361
log.Error("Failed to get cluster info err : ", err)
@@ -363,15 +366,30 @@ func (s *server) DeleteCluster(ctx context.Context, in *pb.IDRequest) (*pb.Simpl
363366
},
364367
}, err
365368
}
366-
367-
if res.GetCluster().GetStatus() == pb.ClusterStatus_DELETING || res.GetCluster().GetStatus() == pb.ClusterStatus_DELETED {
368-
log.Error("The cluster has been already deleted. status : ", res.GetCluster().GetStatus())
369+
if res.GetCluster().GetStatus() != pb.ClusterStatus_RUNNING {
369370
return &pb.SimpleResponse{
370-
Code: pb.Code_NOT_FOUND,
371+
Code: pb.Code_INVALID_ARGUMENT,
371372
Error: &pb.Error{
372-
Msg: fmt.Sprintf("Could not find cluster with ID. %s", clusterId),
373+
Msg: fmt.Sprintf("The cluster can not be deleted. cluster status : %s", res.GetCluster().GetStatus()),
373374
},
374-
}, fmt.Errorf("Could not find cluster with ID. %s", clusterId)
375+
}, fmt.Errorf("The cluster can not be deleted. cluster status : %s", res.GetCluster().GetStatus())
376+
}
377+
378+
// Validation : check appgroup status
379+
resAppGroups, err := appInfoClient.GetAppGroupsByClusterID(ctx, &pb.IDRequest{
380+
Id: clusterId,
381+
})
382+
if err == nil && resAppGroups.Code == pb.Code_OK_UNSPECIFIED {
383+
for _, resAppGroup := range resAppGroups.GetAppGroups() {
384+
if resAppGroup.GetStatus() != pb.AppGroupStatus_APP_GROUP_DELETED {
385+
return &pb.SimpleResponse{
386+
Code: pb.Code_INVALID_ARGUMENT,
387+
Error: &pb.Error{
388+
Msg: fmt.Sprintf("Undeleted services remain. %s", resAppGroup.GetAppGroupId()),
389+
},
390+
}, fmt.Errorf("Undeleted services remain. %s", resAppGroup.GetAppGroupId())
391+
}
392+
}
375393
}
376394

377395
nameSpace := "argo"

cmd/server/handlers_test.go

+87-9
Original file line numberDiff line numberDiff line change
@@ -374,7 +374,7 @@ func TestDeleteCluster(t *testing.T) {
374374
testCases := []struct {
375375
name string
376376
in *pb.IDRequest
377-
buildStubs func(mockArgoClient *mockargo.MockClient, mockClusterInfoClient *mocktks.MockClusterInfoServiceClient)
377+
buildStubs func(mockArgoClient *mockargo.MockClient, mockClusterInfoClient *mocktks.MockClusterInfoServiceClient, mockAppInfoClient *mocktks.MockAppInfoServiceClient)
378378
checkResponse func(req *pb.IDRequest, res *pb.SimpleResponse, err error)
379379
}{
380380
{
@@ -383,13 +383,25 @@ func TestDeleteCluster(t *testing.T) {
383383
Id: createdClusterId,
384384
},
385385
buildStubs: func(mockArgoClient *mockargo.MockClient,
386-
mockClusterInfoClient *mocktks.MockClusterInfoServiceClient) {
386+
mockClusterInfoClient *mocktks.MockClusterInfoServiceClient,
387+
mockAppInfoClient *mocktks.MockAppInfoServiceClient) {
387388

388389
mockClusterInfoClient.EXPECT().GetCluster(gomock.Any(), gomock.Any()).Times(1).
389390
Return(
390391
&pb.GetClusterResponse{
391392
Code: pb.Code_OK_UNSPECIFIED,
392393
Error: nil,
394+
Cluster: &pb.Cluster{
395+
Status: pb.ClusterStatus_RUNNING,
396+
},
397+
}, nil)
398+
399+
mockAppInfoClient.EXPECT().GetAppGroupsByClusterID(gomock.Any(), gomock.Any()).Times(1).
400+
Return(
401+
&pb.GetAppGroupsResponse{
402+
Code: pb.Code_OK_UNSPECIFIED,
403+
Error: nil,
404+
AppGroups: []*pb.AppGroup{},
393405
}, nil)
394406

395407
mockClusterInfoClient.EXPECT().UpdateClusterStatus(gomock.Any(), gomock.Any()).Times(1).
@@ -412,7 +424,7 @@ func TestDeleteCluster(t *testing.T) {
412424
in: &pb.IDRequest{
413425
Id: "THIS_IS_NOT_UUID",
414426
},
415-
buildStubs: func(mockArgoClient *mockargo.MockClient, mockClusterInfoClient *mocktks.MockClusterInfoServiceClient) {
427+
buildStubs: func(mockArgoClient *mockargo.MockClient, mockClusterInfoClient *mocktks.MockClusterInfoServiceClient, mockAppInfoClient *mocktks.MockAppInfoServiceClient) {
416428
},
417429
checkResponse: func(req *pb.IDRequest, res *pb.SimpleResponse, err error) {
418430
require.Error(t, err)
@@ -424,7 +436,7 @@ func TestDeleteCluster(t *testing.T) {
424436
in: &pb.IDRequest{
425437
Id: uuid.New().String(),
426438
},
427-
buildStubs: func(mockArgoClient *mockargo.MockClient, mockClusterInfoClient *mocktks.MockClusterInfoServiceClient) {
439+
buildStubs: func(mockArgoClient *mockargo.MockClient, mockClusterInfoClient *mocktks.MockClusterInfoServiceClient, mockAppInfoClient *mocktks.MockAppInfoServiceClient) {
428440
mockClusterInfoClient.EXPECT().GetCluster(gomock.Any(), gomock.Any()).Times(1).
429441
Return(
430442
&pb.GetClusterResponse{
@@ -442,7 +454,7 @@ func TestDeleteCluster(t *testing.T) {
442454
in: &pb.IDRequest{
443455
Id: uuid.New().String(),
444456
},
445-
buildStubs: func(mockArgoClient *mockargo.MockClient, mockClusterInfoClient *mocktks.MockClusterInfoServiceClient) {
457+
buildStubs: func(mockArgoClient *mockargo.MockClient, mockClusterInfoClient *mocktks.MockClusterInfoServiceClient, mockAppInfoClient *mocktks.MockAppInfoServiceClient) {
446458
mockClusterInfoClient.EXPECT().GetCluster(gomock.Any(), gomock.Any()).Times(1).
447459
Return(
448460
&pb.GetClusterResponse{
@@ -455,20 +467,30 @@ func TestDeleteCluster(t *testing.T) {
455467
},
456468
checkResponse: func(req *pb.IDRequest, res *pb.SimpleResponse, err error) {
457469
require.Error(t, err)
458-
require.Equal(t, res.Code, pb.Code_NOT_FOUND)
470+
require.Equal(t, res.Code, pb.Code_INVALID_ARGUMENT)
459471
},
460472
},
461473
{
462474
name: "FAILED_TO_CALL_WORKFLOW",
463475
in: &pb.IDRequest{
464476
Id: uuid.New().String(),
465477
},
466-
buildStubs: func(mockArgoClient *mockargo.MockClient, mockClusterInfoClient *mocktks.MockClusterInfoServiceClient) {
478+
buildStubs: func(mockArgoClient *mockargo.MockClient, mockClusterInfoClient *mocktks.MockClusterInfoServiceClient, mockAppInfoClient *mocktks.MockAppInfoServiceClient) {
467479
mockClusterInfoClient.EXPECT().GetCluster(gomock.Any(), gomock.Any()).Times(1).
468480
Return(
469481
&pb.GetClusterResponse{
470482
Code: pb.Code_OK_UNSPECIFIED,
471483
Error: nil,
484+
Cluster: &pb.Cluster{
485+
Status: pb.ClusterStatus_RUNNING,
486+
},
487+
}, nil)
488+
mockAppInfoClient.EXPECT().GetAppGroupsByClusterID(gomock.Any(), gomock.Any()).Times(1).
489+
Return(
490+
&pb.GetAppGroupsResponse{
491+
Code: pb.Code_OK_UNSPECIFIED,
492+
Error: nil,
493+
AppGroups: []*pb.AppGroup{},
472494
}, nil)
473495
mockArgoClient.EXPECT().SumbitWorkflowFromWftpl(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Times(1).
474496
Return(randomString("workflowName"), errors.New("FAILED_TO_CALL_WORKFLOW"))
@@ -478,6 +500,60 @@ func TestDeleteCluster(t *testing.T) {
478500
require.Equal(t, res.Code, pb.Code_INTERNAL)
479501
},
480502
},
503+
{
504+
name: "CLUSTER_STATUS_IS_NOT_RUNNING",
505+
in: &pb.IDRequest{
506+
Id: uuid.New().String(),
507+
},
508+
buildStubs: func(mockArgoClient *mockargo.MockClient, mockClusterInfoClient *mocktks.MockClusterInfoServiceClient, mockAppInfoClient *mocktks.MockAppInfoServiceClient) {
509+
mockClusterInfoClient.EXPECT().GetCluster(gomock.Any(), gomock.Any()).Times(1).
510+
Return(
511+
&pb.GetClusterResponse{
512+
Code: pb.Code_OK_UNSPECIFIED,
513+
Error: nil,
514+
Cluster: &pb.Cluster{
515+
Status: pb.ClusterStatus_INSTALLING,
516+
},
517+
}, nil)
518+
},
519+
checkResponse: func(req *pb.IDRequest, res *pb.SimpleResponse, err error) {
520+
require.Error(t, err)
521+
require.Equal(t, res.Code, pb.Code_INVALID_ARGUMENT)
522+
},
523+
},
524+
{
525+
name: "APPGROUP_STATUS_IS_NOT_DELETED",
526+
in: &pb.IDRequest{
527+
Id: uuid.New().String(),
528+
},
529+
buildStubs: func(mockArgoClient *mockargo.MockClient, mockClusterInfoClient *mocktks.MockClusterInfoServiceClient, mockAppInfoClient *mocktks.MockAppInfoServiceClient) {
530+
mockClusterInfoClient.EXPECT().GetCluster(gomock.Any(), gomock.Any()).Times(1).
531+
Return(
532+
&pb.GetClusterResponse{
533+
Code: pb.Code_OK_UNSPECIFIED,
534+
Error: nil,
535+
Cluster: &pb.Cluster{
536+
Status: pb.ClusterStatus_RUNNING,
537+
},
538+
}, nil)
539+
540+
mockAppInfoClient.EXPECT().GetAppGroupsByClusterID(gomock.Any(), gomock.Any()).Times(1).
541+
Return(
542+
&pb.GetAppGroupsResponse{
543+
Code: pb.Code_OK_UNSPECIFIED,
544+
Error: nil,
545+
AppGroups: []*pb.AppGroup{
546+
{
547+
Status: pb.AppGroupStatus_APP_GROUP_DELETING,
548+
},
549+
},
550+
}, nil)
551+
},
552+
checkResponse: func(req *pb.IDRequest, res *pb.SimpleResponse, err error) {
553+
require.Error(t, err)
554+
require.Equal(t, res.Code, pb.Code_INVALID_ARGUMENT)
555+
},
556+
},
481557
}
482558

483559
for i := range testCases {
@@ -496,8 +572,10 @@ func TestDeleteCluster(t *testing.T) {
496572

497573
mockClusterInfoClient := mocktks.NewMockClusterInfoServiceClient(ctrl)
498574
clusterInfoClient = mockClusterInfoClient
575+
mockAppInfoClient := mocktks.NewMockAppInfoServiceClient(ctrl)
576+
appInfoClient = mockAppInfoClient
499577

500-
tc.buildStubs(mockArgoClient, mockClusterInfoClient)
578+
tc.buildStubs(mockArgoClient, mockClusterInfoClient, mockAppInfoClient)
501579

502580
s := server{}
503581
res, err := s.DeleteCluster(ctx, tc.in)
@@ -965,7 +1043,7 @@ func randomInstallAppGroupsRequest() *pb.InstallAppGroupsRequest {
9651043
AppGroupName: randomString("APPGROUP"),
9661044
Type: pb.AppGroupType_LMA,
9671045
ClusterId: uuid.New().String(),
968-
Status: pb.AppGroupStatus_APP_GROUP_UNSPECIFIED,
1046+
Status: pb.AppGroupStatus_APP_GROUP_RUNNING,
9691047
ExternalLabel: randomString("EXTERNAL_LABEL"),
9701048
},
9711049
},

0 commit comments

Comments
 (0)