Skip to content

Commit 53afddf

Browse files
artgromovthevar1able
authored andcommitted
add conditions
1 parent 7e09f47 commit 53afddf

File tree

7 files changed

+196
-29
lines changed

7 files changed

+196
-29
lines changed

internal/configuration/templates/init_script_cms.go

+6
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,12 @@ package templates
22

33
const CMSInitScriptTemplate = `
44
set -eu
5+
6+
echo Console-Config-Root.txt
7+
cat /opt/kikimr/cfg/Console-Config-Root.txt
58
/opt/kikimr/bin/kikimr admin console execute --domain=root --retry=10 /opt/kikimr/cfg/Console-Config-Root.txt
9+
10+
echo Configure-Root.txt
11+
cat /opt/kikimr/cfg/Configure-Root.txt
612
/opt/kikimr/bin/kikimr admin console execute --domain=root --retry=10 /opt/kikimr/cfg/Configure-Root.txt
713
`

internal/configuration/templates/init_script_storage.go

+6
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,12 @@ package templates
22

33
const StorageInitScriptTemplate = `
44
set -eu
5+
6+
echo DefineBox.txt
7+
cat /opt/kikimr/cfg/DefineBox.txt
58
/opt/kikimr/bin/kikimr admin bs config invoke --proto-file /opt/kikimr/cfg/DefineBox.txt
9+
10+
echo DefineStoragePools.txt
11+
cat /opt/kikimr/cfg/DefineStoragePools.txt
612
/opt/kikimr/bin/kikimr admin bs config invoke --proto-file /opt/kikimr/cfg/DefineStoragePools.txt
713
`

internal/controllers/database/controller.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,10 @@ func (r *DatabaseReconciler) Reconcile(ctx context.Context, req ctrl.Request) (c
4747
err := r.Get(ctx, req.NamespacedName, database)
4848
if err != nil {
4949
if errors.IsNotFound(err) {
50-
r.Log.Info("failed to retrieve Database resource; resource deleted?")
50+
r.Log.Info("database resources not found")
5151
return controllers.Ok()
52+
} else {
53+
r.Log.Error(err, "unexpected error")
5254
}
5355
return controllers.NoRequeue(err)
5456
}

internal/controllers/database/sync.go

+26-8
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,9 @@ const (
2929
TenantCreationRequeueDelay = 30 * time.Second
3030
StorageAwaitRequeueDelay = 60 * time.Second
3131

32-
ConditionTenantInitialized = "TenantInitialized"
32+
TenantInitializedCondition = "TenantInitialized"
33+
TenantInitializedReasonInProgress = "InProgres"
34+
TenantInitializedReasonCompleted = "Completed"
3335
)
3436

3537
type ClusterState string
@@ -57,7 +59,11 @@ func (r *DatabaseReconciler) Sync(ctx context.Context, ydbCr *ydbv1alpha1.Databa
5759
return result, err
5860
}
5961

60-
if !meta.IsStatusConditionTrue(database.Status.Conditions, ConditionTenantInitialized) {
62+
if !meta.IsStatusConditionTrue(database.Status.Conditions, TenantInitializedCondition) {
63+
result, err = r.setInitialStatus(ctx, &database)
64+
if err != nil || !result.IsZero() {
65+
return result, err
66+
}
6167
result, err = r.handleTenantCreation(ctx, &database)
6268
if err != nil || !result.IsZero() {
6369
return result, err
@@ -138,7 +144,7 @@ func (r *DatabaseReconciler) waitForStatefulSetToScale(ctx context.Context, data
138144
return controllers.RequeueAfter(DefaultRequeueDelay, nil)
139145
}
140146

141-
if database.Status.State != string(Ready) && meta.IsStatusConditionTrue(database.Status.Conditions, ConditionTenantInitialized) {
147+
if database.Status.State != string(Ready) && meta.IsStatusConditionTrue(database.Status.Conditions, TenantInitializedCondition) {
142148
database.Status.State = string(Ready)
143149
if _, err = r.setState(ctx, database); err != nil {
144150
return controllers.NoRequeue(err)
@@ -206,6 +212,19 @@ func (r *DatabaseReconciler) handleResourcesSync(ctx context.Context, database *
206212
return controllers.Ok()
207213
}
208214

215+
func (r *DatabaseReconciler) setInitialStatus(ctx context.Context, database *resources.DatabaseBuilder) (ctrl.Result, error) {
216+
meta.SetStatusCondition(&database.Status.Conditions, metav1.Condition{
217+
Type: TenantInitializedCondition,
218+
Status: "False",
219+
Reason: TenantInitializedReasonInProgress,
220+
Message: "Tenant creation in progress",
221+
})
222+
if _, err := r.setState(ctx, database); err != nil {
223+
return controllers.NoRequeue(err)
224+
}
225+
return controllers.Ok()
226+
}
227+
209228
func (r *DatabaseReconciler) handleTenantCreation(ctx context.Context, database *resources.DatabaseBuilder) (ctrl.Result, error) {
210229
database.Status.State = string(Initializing)
211230
if _, err := r.setState(ctx, database); err != nil {
@@ -220,13 +239,12 @@ func (r *DatabaseReconciler) handleTenantCreation(ctx context.Context, database
220239
}
221240
r.Recorder.Event(database, corev1.EventTypeNormal, "Initialized", fmt.Sprintf("Tenant %s created", tenant.Name))
222241

223-
resourcesProvided := metav1.Condition{
224-
Type: ConditionTenantInitialized,
242+
meta.SetStatusCondition(&database.Status.Conditions, metav1.Condition{
243+
Type: TenantInitializedCondition,
225244
Status: "True",
226-
Reason: "TenantInitialized",
245+
Reason: TenantInitializedReasonCompleted,
227246
Message: "Tenant creation is complete",
228-
}
229-
meta.SetStatusCondition(&database.Status.Conditions, resourcesProvided)
247+
})
230248
if _, err := r.setState(ctx, database); err != nil {
231249
return controllers.NoRequeue(err)
232250
}

internal/controllers/storage/controller.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,10 @@ func (r *StorageReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct
5454
err := r.Get(ctx, req.NamespacedName, storage)
5555
if err != nil {
5656
if errors.IsNotFound(err) {
57-
r.Log.Info("Storage resources not found")
57+
r.Log.Info("storage resources not found")
5858
return controllers.Ok()
59+
} else {
60+
r.Log.Error(err, "unexpected error")
5961
}
6062
return controllers.NoRequeue(err)
6163
}

internal/controllers/storage/sync.go

+147-17
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,22 @@ const (
2727
HealthcheckRequeueDelay = 30 * time.Second
2828
StorageInitializationRequeueDelay = 30 * time.Second
2929

30-
StorageInitializedCondition = "StorageInitialized"
30+
StorageInitializedCondition = "StorageInitialized"
31+
StorageInitializedReasonInProgress = "InProgres"
32+
StorageInitializedReasonCompleted = "Completed"
33+
34+
InitStorageStepCondition = "InitStorageStep"
35+
InitStorageStepReasonInProgress = "InProgres"
36+
InitStorageStepReasonCompleted = "Completed"
37+
38+
InitRootStorageStepCondition = "InitRootStorageStep"
39+
InitRootStorageStepReasonInProgress = "InProgres"
40+
InitRootStorageStepReasonNotRequired = "NotRequired"
41+
InitRootStorageStepReasonCompleted = "Completed"
42+
43+
InitCMSStepCondition = "InitCMSStep"
44+
InitCMSStepReasonInProgress = "InProgres"
45+
InitCMSStepReasonCompleted = "Completed"
3146
)
3247

3348
func (r *StorageReconciler) Sync(ctx context.Context, cr *ydbv1alpha1.Storage) (ctrl.Result, error) {
@@ -53,6 +68,10 @@ func (r *StorageReconciler) Sync(ctx context.Context, cr *ydbv1alpha1.Storage) (
5368
}
5469

5570
if !meta.IsStatusConditionTrue(storage.Status.Conditions, StorageInitializedCondition) {
71+
result, err = r.setInitialStatus(ctx, &storage)
72+
if err != nil || !result.IsZero() {
73+
return result, err
74+
}
5675
result, err = r.runInitScripts(ctx, &storage)
5776
if err != nil || !result.IsZero() {
5877
return result, err
@@ -65,31 +84,63 @@ func (r *StorageReconciler) Sync(ctx context.Context, cr *ydbv1alpha1.Storage) (
6584
func (r *StorageReconciler) runInitScripts(ctx context.Context, storage *resources.StorageClusterBuilder) (ctrl.Result, error) {
6685
podName := fmt.Sprintf("%s-0", storage.Name)
6786

68-
cmd := []string{"/bin/bash", "/opt/kikimr/cfg/init_storage.bash"}
69-
_, _, err := exec.ExecInPod(r.Scheme, r.Config, storage.Namespace, podName, "ydb-storage", cmd)
70-
if err != nil {
71-
return controllers.RequeueAfter(StorageInitializationRequeueDelay, err)
87+
if !meta.IsStatusConditionTrue(storage.Status.Conditions, InitStorageStepCondition) {
88+
cmd := []string{"/bin/bash", "/opt/kikimr/cfg/init_storage.bash"}
89+
_, _, err := exec.ExecInPod(r.Scheme, r.Config, storage.Namespace, podName, "ydb-storage", cmd)
90+
if err != nil {
91+
return controllers.RequeueAfter(StorageInitializationRequeueDelay, err)
92+
}
93+
meta.SetStatusCondition(&storage.Status.Conditions, metav1.Condition{
94+
Type: InitStorageStepCondition,
95+
Status: "True",
96+
Reason: InitStorageStepReasonCompleted,
97+
Message: "InitStorageStep completed successfully",
98+
})
99+
if _, err := r.setState(ctx, storage); err != nil {
100+
return controllers.NoRequeue(err)
101+
}
72102
}
73103

74-
cmd = []string{"/bin/bash", "-c", "test -s /opt/kikimr/cfg/init_root_storage.bash && source /opt/kikimr/cfg/init_root_storage.bash"}
75-
_, _, err = exec.ExecInPod(r.Scheme, r.Config, storage.Namespace, podName, "ydb-storage", cmd)
76-
if err != nil {
77-
return controllers.RequeueAfter(StorageInitializationRequeueDelay, err)
104+
if !meta.IsStatusConditionTrue(storage.Status.Conditions, InitRootStorageStepCondition) {
105+
cmd := []string{"/bin/bash", "/opt/kikimr/cfg/init_root_storage.bash"}
106+
_, _, err := exec.ExecInPod(r.Scheme, r.Config, storage.Namespace, podName, "ydb-storage", cmd)
107+
if err != nil {
108+
return controllers.RequeueAfter(StorageInitializationRequeueDelay, err)
109+
}
110+
meta.SetStatusCondition(&storage.Status.Conditions, metav1.Condition{
111+
Type: InitRootStorageStepCondition,
112+
Status: "True",
113+
Reason: InitRootStorageStepReasonCompleted,
114+
Message: "InitRootStorageStep completed successfully",
115+
})
116+
if _, err := r.setState(ctx, storage); err != nil {
117+
return controllers.NoRequeue(err)
118+
}
78119
}
79120

80-
cmd = []string{"/bin/bash", "/opt/kikimr/cfg/init_cms.bash"}
81-
_, _, err = exec.ExecInPod(r.Scheme, r.Config, storage.Namespace, podName, "ydb-storage", cmd)
82-
if err != nil {
83-
return controllers.RequeueAfter(StorageInitializationRequeueDelay, err)
121+
if !meta.IsStatusConditionTrue(storage.Status.Conditions, InitCMSStepCondition) {
122+
cmd := []string{"/bin/bash", "/opt/kikimr/cfg/init_cms.bash"}
123+
_, _, err := exec.ExecInPod(r.Scheme, r.Config, storage.Namespace, podName, "ydb-storage", cmd)
124+
if err != nil {
125+
return controllers.RequeueAfter(StorageInitializationRequeueDelay, err)
126+
}
127+
meta.SetStatusCondition(&storage.Status.Conditions, metav1.Condition{
128+
Type: InitCMSStepCondition,
129+
Status: "True",
130+
Reason: InitCMSStepReasonCompleted,
131+
Message: "InitCMSStep completed successfully",
132+
})
133+
if _, err := r.setState(ctx, storage); err != nil {
134+
return controllers.NoRequeue(err)
135+
}
84136
}
85137

86-
resourcesProvided := metav1.Condition{
138+
meta.SetStatusCondition(&storage.Status.Conditions, metav1.Condition{
87139
Type: StorageInitializedCondition,
88140
Status: "True",
89-
Reason: "StorageInitialized",
141+
Reason: StorageInitializedReasonCompleted,
90142
Message: "Storage initialized successfully",
91-
}
92-
meta.SetStatusCondition(&storage.Status.Conditions, resourcesProvided)
143+
})
93144
if _, err := r.setState(ctx, storage); err != nil {
94145
return controllers.NoRequeue(err)
95146
}
@@ -173,6 +224,85 @@ func (r *StorageReconciler) waitForStatefulSetToScale(ctx context.Context, stora
173224
return controllers.Ok()
174225
}
175226

227+
func (r *StorageReconciler) setInitialStatus(ctx context.Context, storage *resources.StorageClusterBuilder) (ctrl.Result, error) {
228+
meta.SetStatusCondition(&storage.Status.Conditions, metav1.Condition{
229+
Type: StorageInitializedCondition,
230+
Status: "False",
231+
Reason: StorageInitializedReasonInProgress,
232+
Message: "Storage is not initialized",
233+
})
234+
if _, err := r.setState(ctx, storage); err != nil {
235+
return controllers.NoRequeue(err)
236+
}
237+
238+
configMapName := storage.Name
239+
if storage.Spec.ClusterConfig != "" {
240+
configMapName = storage.Spec.ClusterConfig
241+
}
242+
243+
configMap := &corev1.ConfigMap{}
244+
err := r.Get(ctx, types.NamespacedName{
245+
Name: configMapName,
246+
Namespace: storage.Namespace,
247+
}, configMap)
248+
249+
if err != nil && errors.IsNotFound(err) {
250+
return controllers.Ok()
251+
} else if err != nil {
252+
r.Recorder.Event(
253+
storage,
254+
corev1.EventTypeNormal,
255+
"Syncing",
256+
fmt.Sprintf("Failed to get ConfigMap: %s", err),
257+
)
258+
return controllers.NoRequeue(err)
259+
}
260+
261+
meta.SetStatusCondition(&storage.Status.Conditions, metav1.Condition{
262+
Type: InitStorageStepCondition,
263+
Status: "False",
264+
Reason: InitStorageStepReasonInProgress,
265+
Message: "InitStorageStep is required",
266+
})
267+
if _, err := r.setState(ctx, storage); err != nil {
268+
return controllers.NoRequeue(err)
269+
}
270+
271+
if _, ok := configMap.Data["init_root_storage.bash"]; ok {
272+
meta.SetStatusCondition(&storage.Status.Conditions, metav1.Condition{
273+
Type: InitRootStorageStepCondition,
274+
Status: "False",
275+
Reason: InitRootStorageStepReasonInProgress,
276+
Message: fmt.Sprintf("InitRootStorageStep (init_root_storage.bash script) is specified in ConfigMap: %s", configMapName),
277+
})
278+
if _, err := r.setState(ctx, storage); err != nil {
279+
return controllers.NoRequeue(err)
280+
}
281+
} else {
282+
meta.SetStatusCondition(&storage.Status.Conditions, metav1.Condition{
283+
Type: InitRootStorageStepCondition,
284+
Status: "True",
285+
Reason: InitRootStorageStepReasonNotRequired,
286+
Message: "InitRootStorageStep is not required",
287+
})
288+
if _, err := r.setState(ctx, storage); err != nil {
289+
return controllers.NoRequeue(err)
290+
}
291+
}
292+
293+
meta.SetStatusCondition(&storage.Status.Conditions, metav1.Condition{
294+
Type: InitCMSStepCondition,
295+
Status: "False",
296+
Reason: InitCMSStepReasonInProgress,
297+
Message: "InitCMSStep is required",
298+
})
299+
if _, err := r.setState(ctx, storage); err != nil {
300+
return controllers.NoRequeue(err)
301+
}
302+
303+
return controllers.Ok()
304+
}
305+
176306
func (r *StorageReconciler) waitForHealthCheck(ctx context.Context, storage *resources.StorageClusterBuilder) (ctrl.Result, error) {
177307
err := healthcheck.CheckBootstrapHealth(ctx, storage)
178308

internal/exec/exec.go

+5-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package exec
22

33
import (
44
"bytes"
5-
5+
"fmt"
66
"github.com/pkg/errors"
77
corev1 "k8s.io/api/core/v1"
88
"k8s.io/apimachinery/pkg/runtime"
@@ -46,7 +46,10 @@ func ExecInPod(scheme *runtime.Scheme, config *rest.Config, namespace string, na
4646
Tty: false,
4747
})
4848
if err != nil {
49-
return "", stderr.String(), errors.Wrapf(err, "failed to stream execution results back")
49+
return stdout.String(), stderr.String(), errors.Wrapf(
50+
err,
51+
fmt.Sprintf("failed to stream execution results back, stdout:\n\"%s\"stderr:\n\"%s\"", stdout.String(), stderr.String()),
52+
)
5053
}
5154

5255
return stdout.String(), stderr.String(), nil

0 commit comments

Comments
 (0)