Skip to content

Commit d9edaeb

Browse files
authored
step Initializing before Provisioning (#196)
1 parent b8d756b commit d9edaeb

File tree

10 files changed

+129
-84
lines changed

10 files changed

+129
-84
lines changed
4.4 KB
Loading

e2e/tests/smoke_test.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ func waitUntilDatabaseReady(ctx context.Context, databaseName, databaseNamespace
102102

103103
return meta.IsStatusConditionPresentAndEqual(
104104
database.Status.Conditions,
105-
DatabaseTenantInitializedCondition,
105+
DatabaseInitializedCondition,
106106
metav1.ConditionTrue,
107107
) && database.Status.State == testobjects.ReadyStatus
108108
}, Timeout, Interval).Should(BeTrue())
@@ -521,7 +521,7 @@ var _ = Describe("Operator smoke test", func() {
521521
checkPodsRunningAndReady(ctx, "ydb-cluster", "kind-storage", storageSample.Spec.Nodes)
522522
})
523523

524-
It("storage.State goes Pending -> Preparing -> Provisioning -> Initializing -> Ready", func() {
524+
It("storage.State goes Pending -> Preparing -> Initializing -> Provisioning -> Ready", func() {
525525
Expect(k8sClient.Create(ctx, storageSample)).Should(Succeed())
526526
defer func() {
527527
Expect(k8sClient.Delete(ctx, storageSample)).Should(Succeed())
@@ -537,9 +537,9 @@ var _ = Describe("Operator smoke test", func() {
537537

538538
allowedChanges := map[ClusterState]ClusterState{
539539
StoragePending: StoragePreparing,
540-
StoragePreparing: StorageProvisioning,
541-
StorageProvisioning: StorageInitializing,
542-
StorageInitializing: StorageReady,
540+
StoragePreparing: StorageInitializing,
541+
StorageInitializing: StorageProvisioning,
542+
StorageProvisioning: StorageReady,
543543
}
544544

545545
re := regexp.MustCompile(`Storage moved from ([a-zA-Z]+) to ([a-zA-Z]+)`)

internal/controllers/constants/constants.go

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,17 @@ const (
1515
DatabaseNodeSetKind = "DatabaseNodeSet"
1616
RemoteDatabaseNodeSetKind = "RemoteDatabaseNodeSet"
1717

18-
StoragePausedCondition = "StoragePaused"
19-
StorageInitializedCondition = "StorageReady"
20-
StorageNodeSetReadyCondition = "StorageNodeSetReady"
21-
DatabasePausedCondition = "DatabasePaused"
22-
DatabaseTenantInitializedCondition = "TenantInitialized"
23-
DatabaseNodeSetReadyCondition = "DatabaseNodeSetReady"
24-
RemoteResourceSyncedCondition = "ResourceSynced"
18+
// For backward compatibility
19+
OldStorageInitializedCondition = "StorageReady"
20+
OldDatabaseInitializedCondition = "TenantInitialized"
21+
22+
StoragePausedCondition = "StoragePaused"
23+
StorageInitializedCondition = "StorageInitialized"
24+
StorageNodeSetReadyCondition = "StorageNodeSetReady"
25+
DatabasePausedCondition = "DatabasePaused"
26+
DatabaseInitializedCondition = "DatabaseInitialized"
27+
DatabaseNodeSetReadyCondition = "DatabaseNodeSetReady"
28+
RemoteResourceSyncedCondition = "ResourceSynced"
2529

2630
Stop = true
2731
Continue = false
@@ -30,10 +34,11 @@ const (
3034
ReasonNotRequired = "NotRequired"
3135
ReasonCompleted = "Completed"
3236

33-
DefaultRequeueDelay = 10 * time.Second
34-
StatusUpdateRequeueDelay = 1 * time.Second
35-
SelfCheckRequeueDelay = 30 * time.Second
36-
StorageInitializationRequeueDelay = 5 * time.Second
37+
DefaultRequeueDelay = 10 * time.Second
38+
StatusUpdateRequeueDelay = 1 * time.Second
39+
SelfCheckRequeueDelay = 30 * time.Second
40+
StorageInitializationRequeueDelay = 30 * time.Second
41+
DatabaseInitializationRequeueDelay = 30 * time.Second
3742

3843
DatabasePending ClusterState = "Pending"
3944
DatabasePreparing ClusterState = "Preparing"
@@ -62,7 +67,6 @@ const (
6267
ResourceSyncPending RemoteResourceState = "Pending"
6368
ResourceSyncSuccess RemoteResourceState = "Synced"
6469

65-
TenantCreationRequeueDelay = 30 * time.Second
6670
StorageAwaitRequeueDelay = 30 * time.Second
6771
SharedDatabaseAwaitRequeueDelay = 30 * time.Second
6872

internal/controllers/database/init.go

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -44,21 +44,32 @@ func (r *Reconciler) setInitialStatus(
4444
) (bool, ctrl.Result, error) {
4545
r.Log.Info("running step setInitialStatus")
4646

47+
if meta.IsStatusConditionTrue(database.Status.Conditions, OldDatabaseInitializedCondition) {
48+
meta.SetStatusCondition(&database.Status.Conditions, metav1.Condition{
49+
Type: DatabaseInitializedCondition,
50+
Status: "True",
51+
Reason: ReasonCompleted,
52+
Message: "Database initialized successfully",
53+
})
54+
database.Status.State = DatabaseReady
55+
return r.updateStatus(ctx, database)
56+
}
57+
4758
if value, ok := database.Annotations[v1alpha1.AnnotationSkipInitialization]; ok && value == v1alpha1.AnnotationValueTrue {
48-
if meta.FindStatusCondition(database.Status.Conditions, DatabaseTenantInitializedCondition) == nil ||
49-
meta.IsStatusConditionFalse(database.Status.Conditions, DatabaseTenantInitializedCondition) {
59+
if meta.FindStatusCondition(database.Status.Conditions, DatabaseInitializedCondition) == nil ||
60+
meta.IsStatusConditionFalse(database.Status.Conditions, DatabaseInitializedCondition) {
5061
return r.processSkipInitPipeline(ctx, database)
5162
}
5263
return Stop, ctrl.Result{RequeueAfter: DefaultRequeueDelay}, nil
5364
}
5465

5566
if database.Status.State == DatabasePending ||
56-
meta.FindStatusCondition(database.Status.Conditions, DatabaseTenantInitializedCondition) == nil {
67+
meta.FindStatusCondition(database.Status.Conditions, DatabaseInitializedCondition) == nil {
5768
meta.SetStatusCondition(&database.Status.Conditions, metav1.Condition{
58-
Type: DatabaseTenantInitializedCondition,
69+
Type: DatabaseInitializedCondition,
5970
Status: "False",
6071
Reason: ReasonInProgress,
61-
Message: "Tenant creation in progress",
72+
Message: "Database has not been initialized yet",
6273
})
6374
database.Status.State = DatabasePreparing
6475
return r.updateStatus(ctx, database)
@@ -73,21 +84,26 @@ func (r *Reconciler) setInitDatabaseCompleted(
7384
message string,
7485
) (bool, ctrl.Result, error) {
7586
meta.SetStatusCondition(&database.Status.Conditions, metav1.Condition{
76-
Type: DatabaseTenantInitializedCondition,
87+
Type: DatabaseInitializedCondition,
7788
Status: "True",
7889
Reason: ReasonCompleted,
7990
Message: message,
8091
})
92+
database.Status.State = DatabaseProvisioning
8193

82-
database.Status.State = DatabaseReady
8394
return r.updateStatus(ctx, database)
8495
}
8596

86-
func (r *Reconciler) handleTenantCreation(
97+
func (r *Reconciler) initializeDatabase(
8798
ctx context.Context,
8899
database *resources.DatabaseBuilder,
89100
) (bool, ctrl.Result, error) {
90-
r.Log.Info("running step handleTenantCreation")
101+
r.Log.Info("running step initializeDatabase")
102+
103+
if database.Status.State == DatabasePreparing {
104+
database.Status.State = DatabaseInitializing
105+
return r.updateStatus(ctx, database)
106+
}
91107

92108
path := database.GetDatabasePath()
93109
var storageUnits []v1alpha1.StorageUnit
@@ -197,7 +213,7 @@ func (r *Reconciler) handleTenantCreation(
197213
"InitializingFailed",
198214
fmt.Sprintf("Error creating tenant %s: %s", tenant.Path, err),
199215
)
200-
return Stop, ctrl.Result{RequeueAfter: TenantCreationRequeueDelay}, err
216+
return Stop, ctrl.Result{RequeueAfter: DatabaseInitializationRequeueDelay}, err
201217
}
202218
r.Recorder.Event(
203219
database,
@@ -213,9 +229,5 @@ func (r *Reconciler) handleTenantCreation(
213229
"Database is initialized",
214230
)
215231

216-
return r.setInitDatabaseCompleted(
217-
ctx,
218-
database,
219-
"Database initialization is completed",
220-
)
232+
return r.setInitDatabaseCompleted(ctx, database, "Database initialized successfully")
221233
}

internal/controllers/database/sync.go

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,28 @@ func (r *Reconciler) Sync(ctx context.Context, ydbCr *v1alpha1.Database) (ctrl.R
6262
return result, err
6363
}
6464

65-
if !meta.IsStatusConditionTrue(database.Status.Conditions, DatabaseTenantInitializedCondition) {
66-
return r.handleFirstStart(ctx, &database)
65+
if !meta.IsStatusConditionTrue(database.Status.Conditions, DatabaseInitializedCondition) {
66+
return r.handleTenantCreation(ctx, &database)
67+
}
68+
69+
if database.Spec.NodeSets != nil {
70+
stop, result, err = r.waitForDatabaseNodeSetsToReady(ctx, &database)
71+
if stop {
72+
return result, err
73+
}
74+
} else {
75+
stop, result, err = r.waitForStatefulSetToScale(ctx, &database)
76+
if stop {
77+
return result, err
78+
}
79+
}
80+
81+
if database.Status.State != DatabaseReady {
82+
database.Status.State = DatabaseReady
83+
stop, result, err = r.updateStatus(ctx, &database)
84+
if stop {
85+
return result, err
86+
}
6787
}
6888

6989
return ctrl.Result{}, nil
@@ -130,7 +150,7 @@ func (r *Reconciler) waitForDatabaseNodeSetsToReady(
130150
) (bool, ctrl.Result, error) {
131151
r.Log.Info("running step waitForDatabaseNodeSetToReady")
132152

133-
if database.Status.State == DatabasePreparing {
153+
if database.Status.State == DatabaseInitializing {
134154
r.Recorder.Event(
135155
database,
136156
corev1.EventTypeNormal,
@@ -552,7 +572,7 @@ func (r *Reconciler) handlePauseResume(
552572
return Continue, ctrl.Result{}, nil
553573
}
554574

555-
func (r *Reconciler) handleFirstStart(
575+
func (r *Reconciler) handleTenantCreation(
556576
ctx context.Context,
557577
database *resources.DatabaseBuilder,
558578
) (ctrl.Result, error) {
@@ -561,19 +581,7 @@ func (r *Reconciler) handleFirstStart(
561581
return result, err
562582
}
563583

564-
if database.Spec.NodeSets != nil {
565-
stop, result, err = r.waitForDatabaseNodeSetsToReady(ctx, database)
566-
if stop {
567-
return result, err
568-
}
569-
} else {
570-
stop, result, err = r.waitForStatefulSetToScale(ctx, database)
571-
if stop {
572-
return result, err
573-
}
574-
}
575-
576-
stop, result, err = r.handleTenantCreation(ctx, database)
584+
stop, result, err = r.initializeDatabase(ctx, database)
577585
if stop {
578586
return result, err
579587
}

internal/controllers/databasenodeset/controller_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ var _ = Describe("DatabaseNodeSet controller medium tests", func() {
8080
Name: storageSample.Name,
8181
Namespace: testobjects.YdbNamespace,
8282
}, &foundStorage))
83-
return foundStorage.Status.State == StorageProvisioning
83+
return foundStorage.Status.State == StorageInitializing
8484
}, test.Timeout, test.Interval).Should(BeTrue())
8585

8686
By("set status Ready to Storage...")
@@ -111,7 +111,7 @@ var _ = Describe("DatabaseNodeSet controller medium tests", func() {
111111
Name: databaseSample.Name,
112112
Namespace: testobjects.YdbNamespace,
113113
}, &foundDatabase))
114-
return foundDatabase.Status.State == DatabaseProvisioning
114+
return foundDatabase.Status.State == DatabaseInitializing
115115
}, test.Timeout, test.Interval).Should(BeTrue())
116116

117117
By("checking that DatabaseNodeSet created on local cluster...")

internal/controllers/remotedatabasenodeset/controller_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,7 @@ var _ = Describe("RemoteDatabaseNodeSet controller tests", func() {
257257
Name: storageSample.Name,
258258
Namespace: testobjects.YdbNamespace,
259259
}, &foundStorage))
260-
return foundStorage.Status.State == StorageProvisioning
260+
return foundStorage.Status.State == StorageInitializing
261261
}, test.Timeout, test.Interval).Should(BeTrue())
262262

263263
By("set status Ready to Storage...")
@@ -280,7 +280,7 @@ var _ = Describe("RemoteDatabaseNodeSet controller tests", func() {
280280
Name: databaseSample.Name,
281281
Namespace: testobjects.YdbNamespace,
282282
}, &foundDatabase))
283-
return foundDatabase.Status.State == DatabaseProvisioning
283+
return foundDatabase.Status.State == DatabaseInitializing
284284
}, test.Timeout, test.Interval).Should(BeTrue())
285285

286286
By("checking that DatabaseNodeSet created on local cluster...")

internal/controllers/remotestoragenodeset/controller_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,7 @@ var _ = Describe("RemoteStorageNodeSet controller tests", func() {
229229
Name: storageSample.Name,
230230
Namespace: testobjects.YdbNamespace,
231231
}, &foundStorage))
232-
return foundStorage.Status.State == StorageProvisioning
232+
return foundStorage.Status.State == StorageInitializing
233233
}, test.Timeout, test.Interval).Should(BeTrue())
234234

235235
By("checking that StorageNodeSet created on local cluster...")

internal/controllers/storage/init.go

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,14 @@ func (r *Reconciler) processSkipInitPipeline(
4242
"Skipping initialization due to skip annotation present, be careful!",
4343
)
4444

45-
return r.setInitStorageCompleted(
46-
ctx,
47-
storage,
48-
"Storage initialization not performed because initialization is skipped",
49-
)
45+
meta.SetStatusCondition(&storage.Status.Conditions, metav1.Condition{
46+
Type: StorageInitializedCondition,
47+
Status: "True",
48+
Reason: ReasonCompleted,
49+
Message: "Storage initialization not performed because initialization is skipped",
50+
})
51+
storage.Status.State = StorageReady
52+
return r.updateStatus(ctx, storage)
5053
}
5154

5255
func (r *Reconciler) setInitialStatus(
@@ -55,6 +58,17 @@ func (r *Reconciler) setInitialStatus(
5558
) (bool, ctrl.Result, error) {
5659
r.Log.Info("running step setInitialStatus")
5760

61+
if meta.IsStatusConditionTrue(storage.Status.Conditions, OldStorageInitializedCondition) {
62+
meta.SetStatusCondition(&storage.Status.Conditions, metav1.Condition{
63+
Type: StorageInitializedCondition,
64+
Status: "True",
65+
Reason: ReasonCompleted,
66+
Message: "Storage initialized successfully",
67+
})
68+
storage.Status.State = StorageReady
69+
return r.updateStatus(ctx, storage)
70+
}
71+
5872
// This block is special internal logic that skips all Storage initialization.
5973
// It is needed when large clusters are migrated where `waitForStatefulSetToScale`
6074
// does not make sense, since some nodes can be down for a long time (and it is okay, since
@@ -73,7 +87,7 @@ func (r *Reconciler) setInitialStatus(
7387
Type: StorageInitializedCondition,
7488
Status: "False",
7589
Reason: ReasonInProgress,
76-
Message: "Storage is not ready yet",
90+
Message: "Storage has not been initialized yet",
7791
})
7892
storage.Status.State = StoragePreparing
7993
return r.updateStatus(ctx, storage)
@@ -92,8 +106,7 @@ func (r *Reconciler) setInitStorageCompleted(
92106
Reason: ReasonCompleted,
93107
Message: message,
94108
})
95-
96-
storage.Status.State = StorageReady
109+
storage.Status.State = StorageProvisioning
97110
return r.updateStatus(ctx, storage)
98111
}
99112

@@ -103,7 +116,7 @@ func (r *Reconciler) initializeStorage(
103116
) (bool, ctrl.Result, error) {
104117
r.Log.Info("running step initializeStorage")
105118

106-
if storage.Status.State == StorageProvisioning {
119+
if storage.Status.State == StoragePreparing {
107120
storage.Status.State = StorageInitializing
108121
return r.updateStatus(ctx, storage)
109122
}

0 commit comments

Comments
 (0)