55 "fmt"
66 "strconv"
77
8+ "github.com/ydb-platform/ydb-go-sdk/v3"
89 corev1 "k8s.io/api/core/v1"
910 apierrors "k8s.io/apimachinery/pkg/api/errors"
1011 "k8s.io/apimachinery/pkg/api/meta"
@@ -66,9 +67,76 @@ func (r *Reconciler) setInitDatabaseCompleted(
6667 Reason : ReasonCompleted ,
6768 Message : message ,
6869 })
70+ meta .SetStatusCondition (& database .Status .Conditions , metav1.Condition {
71+ Type : CreateDatabaseOperationCondition ,
72+ Status : metav1 .ConditionTrue ,
73+ Reason : ReasonCompleted ,
74+ Message : "Tenant creation operation is completed" ,
75+ })
6976 return r .updateStatus (ctx , database , StatusUpdateRequeueDelay )
7077}
7178
79+ func (r * Reconciler ) checkCreateTenantOperation (
80+ ctx context.Context ,
81+ database * resources.DatabaseBuilder ,
82+ tenant * cms.Tenant ,
83+ ydbOptions ydb.Option ,
84+ ) (bool , ctrl.Result , error ) {
85+ condition := meta .FindStatusCondition (database .Status .Conditions , CreateDatabaseOperationCondition )
86+ if condition == nil || len (condition .Message ) == 0 {
87+ // Something is wrong with the condition where we save operation id
88+ // retry create tenant
89+ meta .SetStatusCondition (& database .Status .Conditions , metav1.Condition {
90+ Type : CreateDatabaseOperationCondition ,
91+ Status : metav1 .ConditionTrue ,
92+ Reason : ReasonNotRequired ,
93+ })
94+ return r .updateStatus (ctx , database , DatabaseInitializationRequeueDelay )
95+ }
96+ operationID := condition .Message
97+ finished , operationErr , err := tenant .CheckCreateOperation (ctx , operationID , ydbOptions )
98+ if err != nil {
99+ r .Recorder .Event (
100+ database ,
101+ corev1 .EventTypeWarning ,
102+ "InitializingFailed" ,
103+ fmt .Sprintf ("Error creating tenant %s: %s" , tenant .Path , err ),
104+ )
105+ return Stop , ctrl.Result {RequeueAfter : DatabaseInitializationRequeueDelay }, err
106+ }
107+ if operationErr != nil {
108+ // Creation operation failed - retry Create Tenant
109+ r .Recorder .Event (
110+ database ,
111+ corev1 .EventTypeWarning ,
112+ "InitializingFailed" ,
113+ fmt .Sprintf ("Error creating tenant %s: %s" , tenant .Path , operationErr ),
114+ )
115+ meta .SetStatusCondition (& database .Status .Conditions , metav1.Condition {
116+ Type : CreateDatabaseOperationCondition ,
117+ Status : metav1 .ConditionTrue ,
118+ Reason : ReasonNotRequired ,
119+ })
120+ return r .updateStatus (ctx , database , DatabaseInitializationRequeueDelay )
121+ }
122+ if ! finished {
123+ r .Recorder .Event (
124+ database ,
125+ corev1 .EventTypeWarning ,
126+ "Pending" ,
127+ fmt .Sprintf ("Tenant creation operation is not completed, operationID: %s" , operationID ),
128+ )
129+ return Stop , ctrl.Result {RequeueAfter : DatabaseInitializationRequeueDelay }, nil
130+ }
131+ r .Recorder .Event (
132+ database ,
133+ corev1 .EventTypeNormal ,
134+ "Initialized" ,
135+ fmt .Sprintf ("Tenant %s created" , tenant .Path ),
136+ )
137+ return r .setInitDatabaseCompleted (ctx , database , "Database initialized successfully" )
138+ }
139+
72140func (r * Reconciler ) initializeTenant (
73141 ctx context.Context ,
74142 database * resources.DatabaseBuilder ,
@@ -143,8 +211,9 @@ func (r *Reconciler) initializeTenant(
143211 return Stop , ctrl.Result {RequeueAfter : DefaultRequeueDelay }, ErrIncorrectDatabaseResourcesConfiguration
144212 }
145213
146- tenant := cms.Tenant {
214+ tenant := & cms.Tenant {
147215 StorageEndpoint : database .Spec .StorageEndpoint ,
216+ Domain : database .Spec .Domain ,
148217 Path : path ,
149218 StorageUnits : storageUnits ,
150219 Shared : shared ,
@@ -171,19 +240,33 @@ func (r *Reconciler) initializeTenant(
171240 )
172241 return Stop , ctrl.Result {RequeueAfter : DefaultRequeueDelay }, err
173242 }
243+ ydbOpts := ydb .MergeOptions (ydb .WithCredentials (creds ), tlsOptions )
174244
175- err = tenant .Create (ctx , database , creds , tlsOptions )
245+ if meta .IsStatusConditionFalse (database .Status .Conditions , CreateDatabaseOperationCondition ) {
246+ return r .checkCreateTenantOperation (ctx , database , tenant , ydbOpts )
247+ }
248+ operationID , err := tenant .Create (ctx , ydb .WithCredentials (creds ), tlsOptions )
176249 if err != nil {
177250 r .Recorder .Event (
178251 database ,
179252 corev1 .EventTypeWarning ,
180253 "InitializingFailed" ,
181254 fmt .Sprintf ("Error creating tenant %s: %s" , tenant .Path , err ),
182255 )
256+ return Stop , ctrl.Result {RequeueAfter : DatabaseInitializationRequeueDelay }, err
257+ }
258+ if len (operationID ) > 0 {
259+ r .Recorder .Event (
260+ database ,
261+ corev1 .EventTypeWarning ,
262+ "Pending" ,
263+ fmt .Sprintf ("Tenant creation operation in progress, operationID: %s" , operationID ),
264+ )
183265 meta .SetStatusCondition (& database .Status .Conditions , metav1.Condition {
184- Type : DatabaseInitializedCondition ,
185- Status : metav1 .ConditionFalse ,
186- Reason : ReasonInProgress ,
266+ Type : CreateDatabaseOperationCondition ,
267+ Status : metav1 .ConditionFalse ,
268+ Reason : ReasonInProgress ,
269+ Message : operationID ,
187270 })
188271 return r .updateStatus (ctx , database , DatabaseInitializationRequeueDelay )
189272 }
0 commit comments