Skip to content

Commit dd430cb

Browse files
authored
Translation layer for upgrade flex cluster (#2432)
1 parent 0a6ce6d commit dd430cb

File tree

5 files changed

+250
-0
lines changed

5 files changed

+250
-0
lines changed

internal/mocks/translation/atlas_deployments_service.go

Lines changed: 59 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/mocks/translation/deployment_service.go

Lines changed: 59 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/translation/deployment/conversion.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1244,3 +1244,22 @@ func flexUpdateToAtlas(flex *Flex) *admin.FlexClusterDescriptionUpdate20241113 {
12441244
TerminationProtectionEnabled: &flex.TerminationProtectionEnabled,
12451245
}
12461246
}
1247+
1248+
func flexUpgradeToAtlas(flex *Flex) *admin.AtlasTenantClusterUpgradeRequest20240805 {
1249+
cluster := flex.GetCustomResource().Spec.DeploymentSpec
1250+
return &admin.AtlasTenantClusterUpgradeRequest20240805{
1251+
ClusterType: pointer.MakePtrOrNil(cluster.ClusterType),
1252+
MongoDBMajorVersion: pointer.MakePtrOrNil(cluster.MongoDBMajorVersion),
1253+
VersionReleaseSystem: pointer.MakePtrOrNil(cluster.VersionReleaseSystem),
1254+
BackupEnabled: cluster.BackupEnabled,
1255+
BiConnector: biConnectToAtlas(cluster.BiConnector),
1256+
EncryptionAtRestProvider: pointer.MakePtrOrNil(cluster.EncryptionAtRestProvider),
1257+
Labels: labelsToAtlas(cluster.Labels),
1258+
Paused: cluster.Paused,
1259+
PitEnabled: cluster.PitEnabled,
1260+
ReplicationSpecs: replicationSpecToAtlas(cluster.ReplicationSpecs, cluster.ClusterType, cluster.DiskSizeGB),
1261+
RootCertType: pointer.MakePtrOrNil(cluster.RootCertType),
1262+
Tags: tag.ToAtlas(cluster.Tags),
1263+
TerminationProtectionEnabled: pointer.MakePtrOrNil(cluster.TerminationProtectionEnabled),
1264+
}
1265+
}

internal/translation/deployment/deployment.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ type DeploymentService interface {
4242
CreateDeployment(ctx context.Context, deployment Deployment) (Deployment, error)
4343
UpdateDeployment(ctx context.Context, deployment Deployment) (Deployment, error)
4444
DeleteDeployment(ctx context.Context, deployment Deployment) error
45+
UpgradeToDedicated(ctx context.Context, deployment Deployment) (Deployment, error)
4546
ClusterWithProcessArgs(ctx context.Context, cluster *Cluster) error
4647
UpdateProcessArgs(ctx context.Context, cluster *Cluster) error
4748
}
@@ -335,6 +336,24 @@ func (ds *ProductionAtlasDeployments) DeleteDeployment(ctx context.Context, depl
335336
return nil
336337
}
337338

339+
func (ds *ProductionAtlasDeployments) UpgradeToDedicated(ctx context.Context, deployment Deployment) (Deployment, error) {
340+
switch d := deployment.(type) {
341+
case *Cluster:
342+
return nil, errors.New("upgrade from shared to dedicated is not supported")
343+
case *Serverless:
344+
return nil, errors.New("upgrade from serverless to dedicated is not supported")
345+
case *Flex:
346+
flex, _, err := ds.flexAPI.UpgradeFlexCluster(ctx, deployment.GetProjectID(), flexUpgradeToAtlas(d)).Execute()
347+
if err != nil {
348+
return nil, err
349+
}
350+
351+
return flexFromAtlas(flex), nil
352+
}
353+
354+
return nil, errors.New("unable to upgrade deployment: unknown type")
355+
}
356+
338357
func (ds *ProductionAtlasDeployments) ClusterWithProcessArgs(ctx context.Context, cluster *Cluster) error {
339358
config, _, err := ds.clustersAPI.GetClusterAdvancedConfiguration(ctx, cluster.GetProjectID(), cluster.GetName()).Execute()
340359
if err != nil {

internal/translation/deployment/deployment_test.go

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -970,6 +970,100 @@ func TestUpdateProcessArgs(t *testing.T) {
970970
}
971971
}
972972

973+
func TestUpgradeCluster(t *testing.T) {
974+
tests := map[string]struct {
975+
deployment Deployment
976+
apiMocker func() (admin.ClustersApi, admin.ServerlessInstancesApi, admin.FlexClustersApi)
977+
result Deployment
978+
err error
979+
}{
980+
"should fail to upgrade shared cluster in atlas": {
981+
deployment: &Cluster{},
982+
apiMocker: func() (admin.ClustersApi, admin.ServerlessInstancesApi, admin.FlexClustersApi) {
983+
clusterAPI := mockadmin.NewClustersApi(t)
984+
serverlessInstanceAPI := mockadmin.NewServerlessInstancesApi(t)
985+
flexAPI := mockadmin.NewFlexClustersApi(t)
986+
return clusterAPI, serverlessInstanceAPI, flexAPI
987+
},
988+
err: errors.New("upgrade from shared to dedicated is not supported"),
989+
},
990+
"should fail to upgrade serverless instance in atlas": {
991+
deployment: &Serverless{},
992+
apiMocker: func() (admin.ClustersApi, admin.ServerlessInstancesApi, admin.FlexClustersApi) {
993+
clusterAPI := mockadmin.NewClustersApi(t)
994+
serverlessInstanceAPI := mockadmin.NewServerlessInstancesApi(t)
995+
flexAPI := mockadmin.NewFlexClustersApi(t)
996+
return clusterAPI, serverlessInstanceAPI, flexAPI
997+
},
998+
err: errors.New("upgrade from serverless to dedicated is not supported"),
999+
},
1000+
"should fail to upgrade flex instance in atlas": {
1001+
deployment: &Flex{
1002+
ProjectID: "project-id",
1003+
customResource: &akov2.AtlasDeployment{
1004+
Spec: akov2.AtlasDeploymentSpec{
1005+
DeploymentSpec: &akov2.AdvancedDeploymentSpec{},
1006+
},
1007+
},
1008+
},
1009+
apiMocker: func() (admin.ClustersApi, admin.ServerlessInstancesApi, admin.FlexClustersApi) {
1010+
clusterAPI := mockadmin.NewClustersApi(t)
1011+
serverlessInstanceAPI := mockadmin.NewServerlessInstancesApi(t)
1012+
flexAPI := mockadmin.NewFlexClustersApi(t)
1013+
flexAPI.EXPECT().UpgradeFlexCluster(context.Background(), "project-id", mock.AnythingOfType("*admin.AtlasTenantClusterUpgradeRequest20240805")).
1014+
Return(admin.UpgradeFlexClusterApiRequest{ApiService: flexAPI})
1015+
flexAPI.EXPECT().UpgradeFlexClusterExecute(mock.AnythingOfType("admin.UpgradeFlexClusterApiRequest")).
1016+
Return(nil, &http.Response{}, errors.New("failed to upgrade flex cluster in atlas"))
1017+
return clusterAPI, serverlessInstanceAPI, flexAPI
1018+
},
1019+
err: errors.New("failed to upgrade flex cluster in atlas"),
1020+
},
1021+
"should upgrade flex instance in atlas": {
1022+
deployment: &Flex{
1023+
ProjectID: "project-id",
1024+
customResource: &akov2.AtlasDeployment{
1025+
Spec: akov2.AtlasDeploymentSpec{
1026+
DeploymentSpec: &akov2.AdvancedDeploymentSpec{},
1027+
},
1028+
},
1029+
},
1030+
apiMocker: func() (admin.ClustersApi, admin.ServerlessInstancesApi, admin.FlexClustersApi) {
1031+
clusterAPI := mockadmin.NewClustersApi(t)
1032+
serverlessInstanceAPI := mockadmin.NewServerlessInstancesApi(t)
1033+
flexAPI := mockadmin.NewFlexClustersApi(t)
1034+
flexAPI.EXPECT().UpgradeFlexCluster(context.Background(), "project-id", mock.AnythingOfType("*admin.AtlasTenantClusterUpgradeRequest20240805")).
1035+
Return(admin.UpgradeFlexClusterApiRequest{ApiService: flexAPI})
1036+
flexAPI.EXPECT().UpgradeFlexClusterExecute(mock.AnythingOfType("admin.UpgradeFlexClusterApiRequest")).
1037+
Return(
1038+
&admin.FlexClusterDescription20241113{GroupId: pointer.MakePtr("project-id")},
1039+
&http.Response{},
1040+
nil,
1041+
)
1042+
return clusterAPI, serverlessInstanceAPI, flexAPI
1043+
},
1044+
result: &Flex{
1045+
FlexSpec: &akov2.FlexSpec{
1046+
Tags: []*akov2.TagSpec{},
1047+
ProviderSettings: &akov2.FlexProviderSettings{},
1048+
},
1049+
ProjectID: "project-id",
1050+
Connection: &status.ConnectionStrings{},
1051+
},
1052+
},
1053+
}
1054+
1055+
for name, tt := range tests {
1056+
t.Run(name, func(t *testing.T) {
1057+
clusterAPI, serverlessInstanceAPI, flexAPI := tt.apiMocker()
1058+
service := NewAtlasDeployments(clusterAPI, serverlessInstanceAPI, nil, flexAPI, false)
1059+
1060+
result, err := service.UpgradeToDedicated(context.Background(), tt.deployment)
1061+
require.Equal(t, tt.err, err)
1062+
assert.Equal(t, tt.result, result)
1063+
})
1064+
}
1065+
}
1066+
9731067
func atlasAPIError(code string) *admin.GenericOpenAPIError {
9741068
err := admin.GenericOpenAPIError{}
9751069
err.SetModel(admin.ApiError{ErrorCode: code})

0 commit comments

Comments
 (0)