44 "context"
55 "fmt"
66
7- "github.com/ydb-platform/ydb-go-sdk/v3"
7+ ydb "github.com/ydb-platform/ydb-go-sdk/v3"
88 corev1 "k8s.io/api/core/v1"
99 apierrors "k8s.io/apimachinery/pkg/api/errors"
1010 "k8s.io/apimachinery/pkg/api/meta"
@@ -72,62 +72,85 @@ func (r *Reconciler) setInitDatabaseCompleted(
7272 return r .updateStatus (ctx , database , StatusUpdateRequeueDelay )
7373}
7474
75- func (r * Reconciler ) checkCreateTenantOperation (
75+ func (r * Reconciler ) checkCreateDatabaseOperation (
7676 ctx context.Context ,
7777 database * resources.DatabaseBuilder ,
7878 tenant * cms.Tenant ,
7979 ydbOptions ydb.Option ,
8080) (bool , ctrl.Result , error ) {
8181 condition := meta .FindStatusCondition (database .Status .Conditions , CreateDatabaseOperationCondition )
82- if condition == nil || len (condition .Message ) == 0 {
82+ if len (condition .Message ) == 0 {
8383 // Something is wrong with the condition where we save operation id
8484 // retry create tenant
85+ message := fmt .Sprintf ("Something is wrong with the condition, retry creating tenant %s" , tenant .Path )
86+ r .Recorder .Event (
87+ database ,
88+ corev1 .EventTypeWarning ,
89+ "InitializingFailed" ,
90+ message ,
91+ )
8592 meta .SetStatusCondition (& database .Status .Conditions , metav1.Condition {
86- Type : CreateDatabaseOperationCondition ,
87- Status : metav1 .ConditionTrue ,
88- Reason : ReasonNotRequired ,
93+ Type : CreateDatabaseOperationCondition ,
94+ Status : metav1 .ConditionFalse ,
95+ Reason : ReasonFailed ,
96+ Message : message ,
8997 })
9098 return r .updateStatus (ctx , database , DatabaseInitializationRequeueDelay )
9199 }
92- operationID := condition .Message
93- finished , operationErr , err := tenant .CheckCreateOperation (ctx , operationID , ydbOptions )
100+
101+ operation := & cms.Operation {
102+ StorageEndpoint : tenant .StorageEndpoint ,
103+ Domain : tenant .Domain ,
104+ ID : condition .Message ,
105+ }
106+ response , err := operation .GetOperation (ctx , ydbOptions )
94107 if err != nil {
95108 r .Recorder .Event (
96109 database ,
97110 corev1 .EventTypeWarning ,
98111 "InitializingFailed" ,
99- fmt .Sprintf ("Error creating tenant %s: %s" , tenant . Path , err ),
112+ fmt .Sprintf ("Failed to check creation operation, operationID %s: %s" , operation . ID , err ),
100113 )
101114 return Stop , ctrl.Result {RequeueAfter : DatabaseInitializationRequeueDelay }, err
102115 }
103- if operationErr != nil {
104- // Creation operation failed - retry Create Tenant
116+
117+ finished , operationID , err := operation .CheckGetOperationResponse (ctx , response )
118+ if err != nil {
105119 r .Recorder .Event (
106120 database ,
107121 corev1 .EventTypeWarning ,
108122 "InitializingFailed" ,
109- fmt .Sprintf ("Error creating tenant %s: %s" , tenant .Path , operationErr ),
123+ fmt .Sprintf ("Error creating tenant %s: %s" , tenant .Path , err ),
110124 )
111125 meta .SetStatusCondition (& database .Status .Conditions , metav1.Condition {
112- Type : CreateDatabaseOperationCondition ,
113- Status : metav1 .ConditionTrue ,
114- Reason : ReasonNotRequired ,
126+ Type : CreateDatabaseOperationCondition ,
127+ Status : metav1 .ConditionFalse ,
128+ Reason : ReasonFailed ,
129+ Message : fmt .Sprintf ("Failed to create tenant %s" , tenant .Path ),
115130 })
116131 return r .updateStatus (ctx , database , DatabaseInitializationRequeueDelay )
117132 }
133+
118134 if ! finished {
119135 r .Recorder .Event (
120136 database ,
121137 corev1 .EventTypeWarning ,
122- "Pending" ,
138+ string ( DatabaseInitializing ) ,
123139 fmt .Sprintf ("Tenant creation operation is not completed, operationID: %s" , operationID ),
124140 )
125- return Stop , ctrl.Result {RequeueAfter : DatabaseInitializationRequeueDelay }, nil
141+ meta .SetStatusCondition (& database .Status .Conditions , metav1.Condition {
142+ Type : CreateDatabaseOperationCondition ,
143+ Status : metav1 .ConditionUnknown ,
144+ Reason : ReasonInProgress ,
145+ Message : operationID ,
146+ })
147+ return r .updateStatus (ctx , database , DatabaseInitializationRequeueDelay )
126148 }
149+
127150 r .Recorder .Event (
128151 database ,
129152 corev1 .EventTypeNormal ,
130- "Initialized" ,
153+ string ( DatabaseInitializing ) ,
131154 fmt .Sprintf ("Tenant %s created" , tenant .Path ),
132155 )
133156 return r .setInitDatabaseCompleted (ctx , database , "Database initialized successfully" )
@@ -238,10 +261,11 @@ func (r *Reconciler) initializeTenant(
238261 }
239262 ydbOpts := ydb .MergeOptions (ydb .WithCredentials (creds ), tlsOptions )
240263
241- if meta .IsStatusConditionFalse (database .Status .Conditions , CreateDatabaseOperationCondition ) {
242- return r .checkCreateTenantOperation (ctx , database , tenant , ydbOpts )
264+ if meta .IsStatusConditionPresentAndEqual (database .Status .Conditions , CreateDatabaseOperationCondition , metav1 . ConditionUnknown ) {
265+ return r .checkCreateDatabaseOperation (ctx , database , tenant , ydbOpts )
243266 }
244- operationID , err := tenant .Create (ctx , ydb .WithCredentials (creds ), tlsOptions )
267+
268+ response , err := tenant .CreateDatabase (ctx , ydbOpts )
245269 if err != nil {
246270 r .Recorder .Event (
247271 database ,
@@ -251,16 +275,28 @@ func (r *Reconciler) initializeTenant(
251275 )
252276 return Stop , ctrl.Result {RequeueAfter : DatabaseInitializationRequeueDelay }, err
253277 }
254- if len (operationID ) > 0 {
278+
279+ finished , operationID , err := tenant .CheckCreateDatabaseResponse (ctx , response )
280+ if err != nil {
281+ r .Recorder .Event (
282+ database ,
283+ corev1 .EventTypeWarning ,
284+ "InitializingFailed" ,
285+ fmt .Sprintf ("Failed %s: %s" , tenant .Path , err ),
286+ )
287+ return Stop , ctrl.Result {RequeueAfter : DatabaseInitializationRequeueDelay }, err
288+ }
289+
290+ if ! finished {
255291 r .Recorder .Event (
256292 database ,
257293 corev1 .EventTypeWarning ,
258- "Pending" ,
294+ string ( DatabaseInitializing ) ,
259295 fmt .Sprintf ("Tenant creation operation in progress, operationID: %s" , operationID ),
260296 )
261297 meta .SetStatusCondition (& database .Status .Conditions , metav1.Condition {
262298 Type : CreateDatabaseOperationCondition ,
263- Status : metav1 .ConditionFalse ,
299+ Status : metav1 .ConditionUnknown ,
264300 Reason : ReasonInProgress ,
265301 Message : operationID ,
266302 })
@@ -269,7 +305,7 @@ func (r *Reconciler) initializeTenant(
269305 r .Recorder .Event (
270306 database ,
271307 corev1 .EventTypeNormal ,
272- "Initialized" ,
308+ string ( DatabaseInitializing ) ,
273309 fmt .Sprintf ("Tenant %s created" , tenant .Path ),
274310 )
275311
0 commit comments