55 "fmt"
66
77 corev1 "k8s.io/api/core/v1"
8+ apierrors "k8s.io/apimachinery/pkg/api/errors"
89 "k8s.io/apimachinery/pkg/api/meta"
910 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1011 "k8s.io/apimachinery/pkg/types"
@@ -16,58 +17,94 @@ import (
1617 "github.com/ydb-platform/ydb-kubernetes-operator/internal/resources"
1718)
1819
19- func (r * Reconciler ) setInitDatabaseCompleted (
20+ func (r * Reconciler ) processSkipInitPipeline (
2021 ctx context.Context ,
2122 database * resources.DatabaseBuilder ,
22- message string ,
2323) (bool , ctrl.Result , error ) {
24- meta .SetStatusCondition (& database .Status .Conditions , metav1.Condition {
25- Type : DatabaseInitializedCondition ,
26- Status : metav1 .ConditionTrue ,
27- Reason : ReasonCompleted ,
28- Message : message ,
29- })
30- return r .updateStatus (ctx , database , StatusUpdateRequeueDelay )
24+ r .Log .Info ("running step processSkipInitPipeline" )
25+ r .Log .Info ("Database initialization disabled (with annotation), proceed with caution" )
26+
27+ r .Recorder .Event (
28+ database ,
29+ corev1 .EventTypeWarning ,
30+ "SkippingInit" ,
31+ "Skipping database creation due to skip annotation present, be careful!" ,
32+ )
33+
34+ return r .setInitDatabaseCompleted (
35+ ctx ,
36+ database ,
37+ "Database creation not performed because initialization is skipped" ,
38+ )
3139}
3240
33- func (r * Reconciler ) setInitPipelineStatus (
41+ func (r * Reconciler ) setInitialStatus (
3442 ctx context.Context ,
3543 database * resources.DatabaseBuilder ,
3644) (bool , ctrl.Result , error ) {
37- if database .Status .State == DatabasePreparing {
45+ r .Log .Info ("running step setInitialStatus" )
46+
47+ if meta .IsStatusConditionTrue (database .Status .Conditions , OldDatabaseInitializedCondition ) {
3848 meta .SetStatusCondition (& database .Status .Conditions , metav1.Condition {
3949 Type : DatabaseInitializedCondition ,
40- Status : metav1 . ConditionFalse ,
41- Reason : ReasonInProgress ,
42- Message : "Database has not been initialized yet " ,
50+ Status : "True" ,
51+ Reason : ReasonCompleted ,
52+ Message : "Database initialized successfully " ,
4353 })
44- database .Status .State = DatabaseInitializing
45- return r .updateStatus (ctx , database , StatusUpdateRequeueDelay )
54+ database .Status .State = DatabaseReady
55+ return r .updateStatus (ctx , database )
4656 }
4757
48- // This block is special internal logic that skips all Database initialization.
4958 if value , ok := database .Annotations [v1alpha1 .AnnotationSkipInitialization ]; ok && value == v1alpha1 .AnnotationValueTrue {
50- r .Log .Info ("Database initialization disabled (with annotation), proceed with caution" )
51- r .Recorder .Event (
52- database ,
53- corev1 .EventTypeWarning ,
54- "SkippingInit" ,
55- "Skipping initialization due to skip annotation present, be careful!" ,
56- )
57- return r .setInitDatabaseCompleted (ctx , database , "Database initialization not performed because initialization is skipped" )
59+ if meta .FindStatusCondition (database .Status .Conditions , DatabaseInitializedCondition ) == nil ||
60+ meta .IsStatusConditionFalse (database .Status .Conditions , DatabaseInitializedCondition ) {
61+ return r .processSkipInitPipeline (ctx , database )
62+ }
63+ return Stop , ctrl.Result {RequeueAfter : DefaultRequeueDelay }, nil
5864 }
5965
60- if meta .IsStatusConditionTrue (database .Status .Conditions , OldDatabaseInitializedCondition ) {
61- return r .setInitDatabaseCompleted (ctx , database , "Database initialized successfully" )
66+ if database .Status .State == DatabasePending ||
67+ meta .FindStatusCondition (database .Status .Conditions , DatabaseInitializedCondition ) == nil {
68+ meta .SetStatusCondition (& database .Status .Conditions , metav1.Condition {
69+ Type : DatabaseInitializedCondition ,
70+ Status : "False" ,
71+ Reason : ReasonInProgress ,
72+ Message : "Database has not been initialized yet" ,
73+ })
74+ database .Status .State = DatabasePreparing
75+ return r .updateStatus (ctx , database )
6276 }
6377
6478 return Continue , ctrl.Result {Requeue : false }, nil
6579}
6680
67- func (r * Reconciler ) initializeTenant (
81+ func (r * Reconciler ) setInitDatabaseCompleted (
82+ ctx context.Context ,
83+ database * resources.DatabaseBuilder ,
84+ message string ,
85+ ) (bool , ctrl.Result , error ) {
86+ meta .SetStatusCondition (& database .Status .Conditions , metav1.Condition {
87+ Type : DatabaseInitializedCondition ,
88+ Status : "True" ,
89+ Reason : ReasonCompleted ,
90+ Message : message ,
91+ })
92+ database .Status .State = DatabaseProvisioning
93+
94+ return r .updateStatus (ctx , database )
95+ }
96+
97+ func (r * Reconciler ) initializeDatabase (
6898 ctx context.Context ,
6999 database * resources.DatabaseBuilder ,
70100) (bool , ctrl.Result , error ) {
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+ }
107+
71108 path := database .GetDatabasePath ()
72109 var storageUnits []v1alpha1.StorageUnit
73110 var shared bool
@@ -86,27 +123,43 @@ func (r *Reconciler) initializeTenant(
86123 Namespace : database .Spec .ServerlessResources .SharedDatabaseRef .Namespace ,
87124 }, sharedDatabaseCr )
88125 if err != nil {
126+ if apierrors .IsNotFound (err ) {
127+ r .Recorder .Event (
128+ database ,
129+ corev1 .EventTypeWarning ,
130+ "Pending" ,
131+ fmt .Sprintf (
132+ "Database (%s/%s) not found." ,
133+ database .Spec .ServerlessResources .SharedDatabaseRef .Name ,
134+ database .Spec .ServerlessResources .SharedDatabaseRef .Namespace ,
135+ ),
136+ )
137+ return Stop , ctrl.Result {RequeueAfter : SharedDatabaseAwaitRequeueDelay }, nil
138+ }
89139 r .Recorder .Event (
90140 database ,
91141 corev1 .EventTypeWarning ,
92- "ControllerError " ,
142+ "Pending " ,
93143 fmt .Sprintf (
94- "Failed to get Database %s resource, error: %s" ,
144+ "Failed to get Database (%s, %s) resource, error: %s" ,
95145 database .Spec .ServerlessResources .SharedDatabaseRef .Name ,
146+ database .Spec .ServerlessResources .SharedDatabaseRef .Namespace ,
96147 err ,
97148 ),
98149 )
99150 return Stop , ctrl.Result {RequeueAfter : SharedDatabaseAwaitRequeueDelay }, err
100151 }
101152
102- if ! meta . IsStatusConditionTrue ( sharedDatabaseCr .Status .Conditions , DatabaseProvisionedCondition ) {
153+ if sharedDatabaseCr .Status .State != "Ready" {
103154 r .Recorder .Event (
104155 database ,
105156 corev1 .EventTypeWarning ,
106- "InitializingTenant " ,
157+ "Pending " ,
107158 fmt .Sprintf (
108- "Referenced shared Database %s is not Provisioned " ,
159+ "Referenced shared Database (%s, %s) in a bad state: %s != Ready " ,
109160 database .Spec .ServerlessResources .SharedDatabaseRef .Name ,
161+ database .Spec .ServerlessResources .SharedDatabaseRef .Namespace ,
162+ sharedDatabaseCr .Status .State ,
110163 ),
111164 )
112165 return Stop , ctrl.Result {RequeueAfter : SharedDatabaseAwaitRequeueDelay }, err
@@ -157,22 +210,24 @@ func (r *Reconciler) initializeTenant(
157210 r .Recorder .Event (
158211 database ,
159212 corev1 .EventTypeWarning ,
160- "InitializingTenant " ,
213+ "InitializingFailed " ,
161214 fmt .Sprintf ("Error creating tenant %s: %s" , tenant .Path , err ),
162215 )
163- meta .SetStatusCondition (& database .Status .Conditions , metav1.Condition {
164- Type : DatabaseInitializedCondition ,
165- Status : metav1 .ConditionFalse ,
166- Reason : ReasonInProgress ,
167- })
168- return r .updateStatus (ctx , database , DatabaseInitializationRequeueDelay )
216+ return Stop , ctrl.Result {RequeueAfter : DatabaseInitializationRequeueDelay }, err
169217 }
170-
171218 r .Recorder .Event (
172219 database ,
173220 corev1 .EventTypeNormal ,
174- "InitializingTenant " ,
221+ "Initialized " ,
175222 fmt .Sprintf ("Tenant %s created" , tenant .Path ),
176223 )
224+
225+ r .Recorder .Event (
226+ database ,
227+ corev1 .EventTypeNormal ,
228+ "DatabaseReady" ,
229+ "Database is initialized" ,
230+ )
231+
177232 return r .setInitDatabaseCompleted (ctx , database , "Database initialized successfully" )
178233}
0 commit comments