Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions api/v1/atlasdeployment_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ const (
// Only one of DeploymentSpec, AdvancedDeploymentSpec and ServerlessSpec should be defined.
// +kubebuilder:validation:XValidation:rule="(has(self.externalProjectRef) && !has(self.projectRef)) || (!has(self.externalProjectRef) && has(self.projectRef))",message="must define only one project reference through externalProjectRef or projectRef"
// +kubebuilder:validation:XValidation:rule="(has(self.externalProjectRef) && has(self.connectionSecret)) || !has(self.externalProjectRef)",message="must define a local connection secret when referencing an external project"
// +kubebuilder:validation:XValidation:rule="!has(self.serverlessSpec) || (oldSelf.hasValue() && oldSelf.value().serverlessSpec != null)",optionalOldSelf=true,message="serverlessSpec cannot be added - serverless instances are deprecated",fieldPath=.serverlessSpec
type AtlasDeploymentSpec struct {
// ProjectReference is the dual external or kubernetes reference with access credentials
ProjectDualReference `json:",inline"`
Expand Down
68 changes: 68 additions & 0 deletions api/v1/atlasdeployment_types_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,74 @@ func TestDeploymentCELChecks(t *testing.T) {
},
expectedErrors: []string{"spec.deploymentSpec.name: Invalid value: \"string\": Name cannot be modified after deployment creation"},
},
{
title: "Cannot add a serverless deployment",
old: nil,
obj: &AtlasDeployment{
Spec: AtlasDeploymentSpec{
ServerlessSpec: &ServerlessSpec{
Name: "my-serverless",
},
},
},
expectedErrors: []string{"spec.serverlessSpec: Invalid value: \"object\": serverlessSpec cannot be added - serverless instances are deprecated"},
},
{
title: "Can modify to a serverless deployment",
old: &AtlasDeployment{
Spec: AtlasDeploymentSpec{
ServerlessSpec: &ServerlessSpec{
Name: "my-serverless",
TerminationProtectionEnabled: false,
},
},
},
obj: &AtlasDeployment{
Spec: AtlasDeploymentSpec{
ServerlessSpec: &ServerlessSpec{
Name: "my-serverless",
TerminationProtectionEnabled: true,
},
},
},
},
{
title: "Existing serverless deployment can continue existing when not modified",
old: &AtlasDeployment{
Spec: AtlasDeploymentSpec{
ServerlessSpec: &ServerlessSpec{
Name: "my-serverless",
TerminationProtectionEnabled: false,
},
},
},
obj: &AtlasDeployment{
Spec: AtlasDeploymentSpec{
BackupScheduleRef: common.ResourceRefNamespaced{},
ServerlessSpec: &ServerlessSpec{
Name: "my-serverless",
TerminationProtectionEnabled: false,
},
},
},
},
{
title: "can migrate from serverless to flex cluster",
old: &AtlasDeployment{
Spec: AtlasDeploymentSpec{
ServerlessSpec: &ServerlessSpec{
Name: "my-serverless",
},
},
},
obj: &AtlasDeployment{
Spec: AtlasDeploymentSpec{
FlexSpec: &FlexSpec{
Name: "my-serverless",
},
},
},
},
} {
t.Run(tc.title, func(t *testing.T) {
// inject a project to avoid other CEL validations being hit
Expand Down
2 changes: 1 addition & 1 deletion devbox.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
"operator-sdk": "1.36.1",
"shellcheck": "latest",
"golangci-lint": "2",
"kubernetes-controller-tools": "0.17.2",
"kubernetes-controller-tools": "0.19.0",
"setup-envtest": "0.19.0",
"awscli2": "latest",
"docker-sbom": "latest",
Expand Down
24 changes: 12 additions & 12 deletions devbox.lock
Original file line number Diff line number Diff line change
Expand Up @@ -1189,51 +1189,51 @@
}
}
},
"kubernetes-controller-tools@0.17.2": {
"last_modified": "2025-03-23T05:31:05Z",
"resolved": "github:NixOS/nixpkgs/dd613136ee91f67e5dba3f3f41ac99ae89c5406b#kubernetes-controller-tools",
"kubernetes-controller-tools@0.19.0": {
"last_modified": "2025-11-23T21:50:36Z",
"resolved": "github:NixOS/nixpkgs/ee09932cedcef15aaf476f9343d1dea2cb77e261#kubernetes-controller-tools",
"source": "devbox-search",
"version": "0.17.2",
"version": "0.19.0",
"systems": {
"aarch64-darwin": {
"outputs": [
{
"name": "out",
"path": "/nix/store/x2g121jdk7fdxb7vx964rrhbiwd0g0rm-controller-tools-0.17.2",
"path": "/nix/store/brz84pzrcnll7i85bpgil58ldlkwrngp-controller-tools-0.19.0",
"default": true
}
],
"store_path": "/nix/store/x2g121jdk7fdxb7vx964rrhbiwd0g0rm-controller-tools-0.17.2"
"store_path": "/nix/store/brz84pzrcnll7i85bpgil58ldlkwrngp-controller-tools-0.19.0"
},
"aarch64-linux": {
"outputs": [
{
"name": "out",
"path": "/nix/store/jaz48mw3pinfdw9gd8fng63gn7wwzmxy-controller-tools-0.17.2",
"path": "/nix/store/anb3mpv9m3dklylhqbsjh04iv70gn8vj-controller-tools-0.19.0",
"default": true
}
],
"store_path": "/nix/store/jaz48mw3pinfdw9gd8fng63gn7wwzmxy-controller-tools-0.17.2"
"store_path": "/nix/store/anb3mpv9m3dklylhqbsjh04iv70gn8vj-controller-tools-0.19.0"
},
"x86_64-darwin": {
"outputs": [
{
"name": "out",
"path": "/nix/store/3wdf34xlpff7m01ggzr7pb9f3w3cl95f-controller-tools-0.17.2",
"path": "/nix/store/jjm90vri9j4j2zacasrfkhny98vsh10n-controller-tools-0.19.0",
"default": true
}
],
"store_path": "/nix/store/3wdf34xlpff7m01ggzr7pb9f3w3cl95f-controller-tools-0.17.2"
"store_path": "/nix/store/jjm90vri9j4j2zacasrfkhny98vsh10n-controller-tools-0.19.0"
},
"x86_64-linux": {
"outputs": [
{
"name": "out",
"path": "/nix/store/xgppkdij5f73igwfp5as058fmh21wn9p-controller-tools-0.17.2",
"path": "/nix/store/mldi6bp7a0bdq5vjyfahay8h19f0wwch-controller-tools-0.19.0",
"default": true
}
],
"store_path": "/nix/store/xgppkdij5f73igwfp5as058fmh21wn9p-controller-tools-0.17.2"
"store_path": "/nix/store/mldi6bp7a0bdq5vjyfahay8h19f0wwch-controller-tools-0.19.0"
}
}
},
Expand Down
2 changes: 1 addition & 1 deletion docs/api-docs.md
Original file line number Diff line number Diff line change
Expand Up @@ -2755,7 +2755,7 @@ AtlasDeployment is the Schema for the atlasdeployments API
AtlasDeploymentSpec defines the desired state of AtlasDeployment.
Only one of DeploymentSpec, AdvancedDeploymentSpec and ServerlessSpec should be defined.<br/>
<br/>
<i>Validations</i>:<li>(has(self.externalProjectRef) && !has(self.projectRef)) || (!has(self.externalProjectRef) && has(self.projectRef)): must define only one project reference through externalProjectRef or projectRef</li><li>(has(self.externalProjectRef) && has(self.connectionSecret)) || !has(self.externalProjectRef): must define a local connection secret when referencing an external project</li>
<i>Validations</i>:<li>(has(self.externalProjectRef) && !has(self.projectRef)) || (!has(self.externalProjectRef) && has(self.projectRef)): must define only one project reference through externalProjectRef or projectRef</li><li>(has(self.externalProjectRef) && has(self.connectionSecret)) || !has(self.externalProjectRef): must define a local connection secret when referencing an external project</li><li>!has(self.serverlessSpec) || (oldSelf.hasValue() && oldSelf.value().serverlessSpec != null): serverlessSpec cannot be added - serverless instances are deprecated</li>
</td>
<td>false</td>
</tr><tr>
Expand Down
2 changes: 1 addition & 1 deletion internal/controller/atlasdatabaseuser/databaseuser.go
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ func (r *AtlasDatabaseUserReconciler) handleDatabaseUser(ctx *workflow.Context,
return r.terminate(ctx, atlasDatabaseUser, api.DatabaseUserReadyType, workflow.AtlasAPIAccessNotConfigured, true, err)
}
dbUserService := dbuser.NewAtlasUsers(sdkClientSet.SdkClient20250312006.DatabaseUsersApi)
deploymentService := deployment.NewAtlasDeployments(sdkClientSet.SdkClient20250312006.ClustersApi, sdkClientSet.SdkClient20250312006.ServerlessInstancesApi, sdkClientSet.SdkClient20250312006.GlobalClustersApi, sdkClientSet.SdkClient20250312006.FlexClustersApi, r.AtlasProvider.IsCloudGov())
deploymentService := deployment.NewAtlasDeployments(sdkClientSet.SdkClient20250312006.ClustersApi, sdkClientSet.SdkClient20250312006.GlobalClustersApi, sdkClientSet.SdkClient20250312006.FlexClustersApi, r.AtlasProvider.IsCloudGov())
atlasProject, err := r.ResolveProject(ctx.Context, sdkClientSet.SdkClient20250312006, atlasDatabaseUser)
if err != nil {
return r.terminate(ctx, atlasDatabaseUser, api.DatabaseUserReadyType, workflow.AtlasAPIAccessNotConfigured, true, err)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,7 @@ func (r *AtlasDeploymentReconciler) Reconcile(ctx context.Context, req ctrl.Requ
}
workflowCtx.SdkClientSet = sdkClientSet
projectService := project.NewProjectAPIService(sdkClientSet.SdkClient20250312006.ProjectsApi)
deploymentService := deployment.NewAtlasDeployments(sdkClientSet.SdkClient20250312006.ClustersApi, sdkClientSet.SdkClient20250312006.ServerlessInstancesApi, sdkClientSet.SdkClient20250312006.GlobalClustersApi, sdkClientSet.SdkClient20250312006.FlexClustersApi, r.AtlasProvider.IsCloudGov())
deploymentService := deployment.NewAtlasDeployments(sdkClientSet.SdkClient20250312006.ClustersApi, sdkClientSet.SdkClient20250312006.GlobalClustersApi, sdkClientSet.SdkClient20250312006.FlexClustersApi, r.AtlasProvider.IsCloudGov())
atlasProject, err := r.ResolveProject(workflowCtx.Context, sdkClientSet.SdkClient20250312006, atlasDeployment)
if err != nil {
return r.terminate(workflowCtx, workflow.AtlasAPIAccessNotConfigured, err)
Expand Down Expand Up @@ -176,10 +176,7 @@ func (r *AtlasDeploymentReconciler) Reconcile(ctx context.Context, req ctrl.Requ
}

switch {
case atlasDeployment.IsServerless():
return r.handleServerlessInstance(workflowCtx, projectService, deploymentService, deploymentInAKO, deploymentInAtlas)

case atlasDeployment.IsFlex():
case atlasDeployment.IsServerless(), atlasDeployment.IsFlex():
return r.handleFlexInstance(workflowCtx, projectService, deploymentService, deploymentInAKO, deploymentInAtlas)

case atlasDeployment.IsAdvancedDeployment():
Expand Down
Loading
Loading