@@ -16,8 +16,11 @@ package databaseuser
1616
1717import (
1818 "context"
19+ "errors"
20+ "fmt"
1921
2022 v20250312sdk "go.mongodb.org/atlas-sdk/v20250312009/admin"
23+ v1 "k8s.io/api/core/v1"
2124 controllerruntime "sigs.k8s.io/controller-runtime"
2225 builder "sigs.k8s.io/controller-runtime/pkg/builder"
2326 client "sigs.k8s.io/controller-runtime/pkg/client"
@@ -49,65 +52,197 @@ func NewHandlerv20250312(kubeClient client.Client, atlasClient *v20250312sdk.API
4952
5053// HandleInitial handles the initial state for version v20250312
5154func (h * Handlerv20250312 ) HandleInitial (ctx context.Context , databaseuser * akov2generated.DatabaseUser ) (ctrlstate.Result , error ) {
52- // TODO: Implement initial state logic
53- // TODO: Use h.atlasProvider.SdkClientSet(ctx, h.globalSecretRef, h.log) to get Atlas SDK client
54- return result .NextState (state .StateUpdated , "Updated AtlasDatabaseUser." )
55+ deps , err := h .getDependencies (ctx , databaseuser )
56+ if err != nil {
57+ return result .Error (state .StateInitial , fmt .Errorf ("Failed to get dependencies: %w" , err ))
58+ }
59+
60+ body := & v20250312sdk.CloudDatabaseUser {}
61+ params := & v20250312sdk.CreateDatabaseUserApiParams {
62+ CloudDatabaseUser : body ,
63+ }
64+
65+ if err := h .translator .ToAPI (params , databaseuser , deps ... ); err != nil {
66+ return result .Error (state .StateInitial , fmt .Errorf ("failed to translate params: %w" , err ))
67+ }
68+
69+ if err := h .translator .ToAPI (body , databaseuser , deps ... ); err != nil {
70+ return result .Error (state .StateInitial , fmt .Errorf ("failed to translate body: %w" , err ))
71+ }
72+
73+ _ , _ , err = h .atlasClient .DatabaseUsersApi .CreateDatabaseUserWithParams (ctx , params ).Execute ()
74+ if err != nil {
75+ return result .Error (state .StateInitial , fmt .Errorf ("failed to create datebaseuser: %w" , err ))
76+ }
77+
78+ if err := ctrlstate .NewPatcher (databaseuser ).UpdateStateTracker (deps ... ).Patch (ctx , h .kubeClient ); err != nil {
79+ return result .Error (state .StateCreated , fmt .Errorf ("failed to update state tracker: %w" , err ))
80+ }
81+
82+ return result .NextState (state .StateCreated , "Created Database User." )
5583}
5684
5785// HandleImportRequested handles the importrequested state for version v20250312
5886func (h * Handlerv20250312 ) HandleImportRequested (ctx context.Context , databaseuser * akov2generated.DatabaseUser ) (ctrlstate.Result , error ) {
59- // TODO: Implement importrequested state logic
60- // TODO: Use h.atlasProvider.SdkClientSet(ctx, h.globalSecretRef, h.log) to get Atlas SDK client
87+ deps , err := h .getDependencies (ctx , databaseuser )
88+ if err != nil {
89+ return result .Error (state .StateInitial , fmt .Errorf ("Failed to get dependencies: %w" , err ))
90+ }
91+
92+ groupId , ok := databaseuser .GetAnnotations ()["mongodb.com/external-group-id" ]
93+ if ! ok {
94+ return result .Error (state .StateImportRequested , errors .New ("missing annotation mongodb.com/external-id" ))
95+ }
96+
97+ databaseName , ok := databaseuser .GetAnnotations ()["mongodb.com/external-database-name" ]
98+ if ! ok {
99+ return result .Error (state .StateImportRequested , errors .New ("missing annotation mongodb.com/external-database-name" ))
100+ }
101+
102+ username , ok := databaseuser .GetAnnotations ()["mongodb.com/external-username" ]
103+ if ! ok {
104+ return result .Error (state .StateImportRequested , errors .New ("missing annotation mongodb.com/external-username" ))
105+ }
106+
107+ params := & v20250312sdk.GetDatabaseUserApiParams {
108+ GroupId : groupId ,
109+ DatabaseName : databaseName ,
110+ Username : username ,
111+ }
112+ _ , _ , err = h .atlasClient .DatabaseUsersApi .GetDatabaseUserWithParams (ctx , params ).Execute ()
113+ if err != nil {
114+ return result .Error (state .StateInitial , fmt .Errorf ("failed to create datebaseuser: %w" , err ))
115+ }
116+
117+ if err := ctrlstate .NewPatcher (databaseuser ).UpdateStateTracker (deps ... ).Patch (ctx , h .kubeClient ); err != nil {
118+ return result .Error (state .StateImported , fmt .Errorf ("failed to update state tracker: %w" , err ))
119+ }
120+
61121 return result .NextState (state .StateImported , "Import completed" )
62122}
63123
64124// HandleImported handles the imported state for version v20250312
65125func (h * Handlerv20250312 ) HandleImported (ctx context.Context , databaseuser * akov2generated.DatabaseUser ) (ctrlstate.Result , error ) {
66- // TODO: Implement imported state logic
67- // TODO: Use h.atlasProvider.SdkClientSet(ctx, h.globalSecretRef, h.log) to get Atlas SDK client
68- return result .NextState (state .StateUpdated , "Ready" )
126+ return h .handleIdle (ctx , state .StateImported , databaseuser )
69127}
70128
71129// HandleCreating handles the creating state for version v20250312
72130func (h * Handlerv20250312 ) HandleCreating (ctx context.Context , databaseuser * akov2generated.DatabaseUser ) (ctrlstate.Result , error ) {
73- // TODO: Implement creating state logic
74- // TODO: Use h.atlasProvider.SdkClientSet(ctx, h.globalSecretRef, h.log) to get Atlas SDK client
75- return result .NextState (state .StateCreated , "Resource created" )
131+ panic ("unsupported state" )
76132}
77133
78134// HandleCreated handles the created state for version v20250312
79135func (h * Handlerv20250312 ) HandleCreated (ctx context.Context , databaseuser * akov2generated.DatabaseUser ) (ctrlstate.Result , error ) {
80- // TODO: Implement created state logic
81- // TODO: Use h.atlasProvider.SdkClientSet(ctx, h.globalSecretRef, h.log) to get Atlas SDK client
82- return result .NextState (state .StateUpdated , "Ready" )
136+ return h .handleIdle (ctx , state .StateCreated , databaseuser )
83137}
84138
85139// HandleUpdating handles the updating state for version v20250312
86140func (h * Handlerv20250312 ) HandleUpdating (ctx context.Context , databaseuser * akov2generated.DatabaseUser ) (ctrlstate.Result , error ) {
87- // TODO: Implement updating state logic
88- // TODO: Use h.atlasProvider.SdkClientSet(ctx, h.globalSecretRef, h.log) to get Atlas SDK client
89- return result .NextState (state .StateUpdated , "Update completed" )
141+ panic ("unsupported state" )
90142}
91143
92144// HandleUpdated handles the updated state for version v20250312
93145func (h * Handlerv20250312 ) HandleUpdated (ctx context.Context , databaseuser * akov2generated.DatabaseUser ) (ctrlstate.Result , error ) {
94- // TODO: Implement updated state logic
95- // TODO: Use h.atlasProvider.SdkClientSet(ctx, h.globalSecretRef, h.log) to get Atlas SDK client
96- return result .NextState (state .StateUpdated , "Ready" )
146+ return h .handleIdle (ctx , state .StateUpdated , databaseuser )
97147}
98148
99149// HandleDeletionRequested handles the deletionrequested state for version v20250312
100150func (h * Handlerv20250312 ) HandleDeletionRequested (ctx context.Context , databaseuser * akov2generated.DatabaseUser ) (ctrlstate.Result , error ) {
101- // TODO: Implement deletionrequested state logic
102- // TODO: Use h.atlasProvider.SdkClientSet(ctx, h.globalSecretRef, h.log) to get Atlas SDK client
103- return result .NextState (state .StateDeleting , "Deletion started" )
151+ deps , err := h .getDependencies (ctx , databaseuser )
152+ if err != nil {
153+ return result .Error (state .StateDeletionRequested , fmt .Errorf ("Failed to get dependencies: %w" , err ))
154+ }
155+
156+ params := & v20250312sdk.DeleteDatabaseUserApiParams {}
157+ if err := h .translator .ToAPI (params , databaseuser , deps ... ); err != nil {
158+ return result .Error (state .StateDeletionRequested , fmt .Errorf ("failed to translate params: %w" , err ))
159+ }
160+ _ , err = h .atlasClient .DatabaseUsersApi .DeleteDatabaseUserWithParams (ctx , params ).Execute ()
161+ if err != nil {
162+ return result .Error (state .StateDeletionRequested , fmt .Errorf ("failed to delete datebaseuser: %w" , err ))
163+ }
164+
165+ return result .NextState (state .StateDeleted , "User deleted." )
166+
104167}
105168
106169// HandleDeleting handles the deleting state for version v20250312
107170func (h * Handlerv20250312 ) HandleDeleting (ctx context.Context , databaseuser * akov2generated.DatabaseUser ) (ctrlstate.Result , error ) {
108- // TODO: Implement deleting state logic
109- // TODO: Use h.atlasProvider.SdkClientSet(ctx, h.globalSecretRef, h.log) to get Atlas SDK client
110- return result .NextState (state .StateDeleted , "Deleted" )
171+ panic ("unsupported state" )
172+ }
173+
174+ func (h * Handlerv20250312 ) handleIdle (ctx context.Context , currentState state.ResourceState , databaseuser * akov2generated.DatabaseUser ) (ctrlstate.Result , error ) {
175+ deps , err := h .getDependencies (ctx , databaseuser )
176+ if err != nil {
177+ return result .Error (currentState , fmt .Errorf ("Failed to get dependencies: %w" , err ))
178+ }
179+
180+ update , err := ctrlstate .ShouldUpdate (databaseuser , deps ... )
181+ if err != nil {
182+ return result .Error (currentState , reconcile .TerminalError (err ))
183+ }
184+
185+ if ! update {
186+ return result .NextState (currentState , "Database user up to date. No update required." )
187+ }
188+
189+ body := & v20250312sdk.CloudDatabaseUser {}
190+ params := & v20250312sdk.UpdateDatabaseUserApiParams {
191+ CloudDatabaseUser : body ,
192+ }
193+
194+ if err := h .translator .ToAPI (params , databaseuser , deps ... ); err != nil {
195+ return result .Error (currentState , fmt .Errorf ("failed to translate params: %w" , err ))
196+ }
197+
198+ if err := h .translator .ToAPI (body , databaseuser , deps ... ); err != nil {
199+ return result .Error (currentState , fmt .Errorf ("failed to translate body: %w" , err ))
200+ }
201+
202+ _ , _ , err = h .atlasClient .DatabaseUsersApi .UpdateDatabaseUserWithParams (ctx , params ).Execute ()
203+ if err != nil {
204+ return result .Error (currentState , fmt .Errorf ("failed to update datebaseuser: %w" , err ))
205+ }
206+
207+ if err := ctrlstate .NewPatcher (databaseuser ).UpdateStateTracker (deps ... ).Patch (ctx , h .kubeClient ); err != nil {
208+ return result .Error (currentState , fmt .Errorf ("failed to update state tracker: %w" , err ))
209+ }
210+
211+ return result .NextState (state .StateUpdated , "Updated Database User." )
212+ }
213+
214+ func (h * Handlerv20250312 ) getDependencies (ctx context.Context , databaseuser * akov2generated.DatabaseUser ) ([]client.Object , error ) {
215+ var deps []client.Object
216+
217+ // Check if passwordSecretRef is present
218+ if databaseuser .Spec .V20250312 != nil && databaseuser .Spec .V20250312 .Entry != nil && databaseuser .Spec .V20250312 .Entry .PasswordSecretRef != nil {
219+ secret := & v1.Secret {}
220+ err := h .kubeClient .Get (ctx , client.ObjectKey {
221+ Name : databaseuser .Spec .V20250312 .Entry .PasswordSecretRef .Name ,
222+ Namespace : databaseuser .GetNamespace (),
223+ }, secret )
224+ if err != nil {
225+ return deps , fmt .Errorf ("failed to get Secret %s/%s: %w" , databaseuser .GetNamespace (), databaseuser .Spec .V20250312 .Entry .PasswordSecretRef .Name , err )
226+ }
227+
228+ deps = append (deps , secret )
229+ }
230+
231+ // Check if groupRef is present
232+ if databaseuser .Spec .V20250312 != nil && databaseuser .Spec .V20250312 .GroupRef != nil {
233+ group := & akov2generated.Group {}
234+ err := h .kubeClient .Get (ctx , client.ObjectKey {
235+ Name : databaseuser .Spec .V20250312 .GroupRef .Name ,
236+ Namespace : databaseuser .GetNamespace (),
237+ }, group )
238+ if err != nil {
239+ return deps , fmt .Errorf ("failed to get Group %s/%s: %w" , databaseuser .GetNamespace (), databaseuser .Spec .V20250312 .GroupRef .Name , err )
240+ }
241+
242+ deps = append (deps , group )
243+ }
244+
245+ return deps , nil
111246}
112247
113248// For returns the resource and predicates for the controller
0 commit comments