5
5
"fmt"
6
6
"strconv"
7
7
8
+ "github.com/ydb-platform/ydb-go-sdk/v3"
8
9
corev1 "k8s.io/api/core/v1"
9
10
apierrors "k8s.io/apimachinery/pkg/api/errors"
10
11
"k8s.io/apimachinery/pkg/api/meta"
@@ -66,9 +67,76 @@ func (r *Reconciler) setInitDatabaseCompleted(
66
67
Reason : ReasonCompleted ,
67
68
Message : message ,
68
69
})
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
+ })
69
76
return r .updateStatus (ctx , database , StatusUpdateRequeueDelay )
70
77
}
71
78
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
+
72
140
func (r * Reconciler ) initializeTenant (
73
141
ctx context.Context ,
74
142
database * resources.DatabaseBuilder ,
@@ -143,8 +211,9 @@ func (r *Reconciler) initializeTenant(
143
211
return Stop , ctrl.Result {RequeueAfter : DefaultRequeueDelay }, ErrIncorrectDatabaseResourcesConfiguration
144
212
}
145
213
146
- tenant := cms.Tenant {
214
+ tenant := & cms.Tenant {
147
215
StorageEndpoint : database .Spec .StorageEndpoint ,
216
+ Domain : database .Spec .Domain ,
148
217
Path : path ,
149
218
StorageUnits : storageUnits ,
150
219
Shared : shared ,
@@ -171,19 +240,33 @@ func (r *Reconciler) initializeTenant(
171
240
)
172
241
return Stop , ctrl.Result {RequeueAfter : DefaultRequeueDelay }, err
173
242
}
243
+ ydbOpts := ydb .MergeOptions (ydb .WithCredentials (creds ), tlsOptions )
174
244
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 )
176
249
if err != nil {
177
250
r .Recorder .Event (
178
251
database ,
179
252
corev1 .EventTypeWarning ,
180
253
"InitializingFailed" ,
181
254
fmt .Sprintf ("Error creating tenant %s: %s" , tenant .Path , err ),
182
255
)
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
+ )
183
265
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 ,
187
270
})
188
271
return r .updateStatus (ctx , database , DatabaseInitializationRequeueDelay )
189
272
}
0 commit comments