Skip to content

Commit 78d8e32

Browse files
authored
Processing remoteNodeSet objects in storage/database controllers (#175)
1 parent 2e7e7b7 commit 78d8e32

17 files changed

+407
-116
lines changed

api/v1alpha1/databasenodeset_types.go

+2-3
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,8 @@ type DatabaseNodeSetSpec struct {
1919

2020
// DatabaseNodeSetStatus defines the observed state
2121
type DatabaseNodeSetStatus struct {
22-
State constants.ClusterState `json:"state"`
23-
Conditions []metav1.Condition `json:"conditions,omitempty"`
24-
ObservedDatabaseGeneration int64 `json:"observedDatabaseGeneration,omitempty"`
22+
State constants.ClusterState `json:"state"`
23+
Conditions []metav1.Condition `json:"conditions,omitempty"`
2524
}
2625

2726
// DatabaseNodeSetSpecInline describes an group nodes object inside parent object

api/v1alpha1/storagenodeset_types.go

+2-3
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,8 @@ type StorageNodeSetSpec struct {
1919

2020
// StorageNodeSetStatus defines the observed state
2121
type StorageNodeSetStatus struct {
22-
State constants.ClusterState `json:"state"`
23-
Conditions []metav1.Condition `json:"conditions,omitempty"`
24-
ObservedStorageGeneration int64 `json:"observedStorageGeneration,omitempty"`
22+
State constants.ClusterState `json:"state"`
23+
Conditions []metav1.Condition `json:"conditions,omitempty"`
2524
}
2625

2726
// StorageNodeSetSpecInline describes an group nodes object inside parent object

deploy/ydb-operator/crds/databasenodeset.yaml

-3
Original file line numberDiff line numberDiff line change
@@ -4635,9 +4635,6 @@ spec:
46354635
- type
46364636
type: object
46374637
type: array
4638-
observedDatabaseGeneration:
4639-
format: int64
4640-
type: integer
46414638
state:
46424639
type: string
46434640
required:

deploy/ydb-operator/crds/remotedatabasenodeset.yaml

+4-3
Original file line numberDiff line numberDiff line change
@@ -2792,6 +2792,10 @@ spec:
27922792
storageEndpoint:
27932793
description: YDB Storage Node broker address
27942794
type: string
2795+
terminationGracePeriodSeconds:
2796+
description: (Optional) If specified, the pod's terminationGracePeriodSeconds.
2797+
format: int64
2798+
type: integer
27952799
tolerations:
27962800
description: (Optional) If specified, the pod's tolerations.
27972801
items:
@@ -4632,9 +4636,6 @@ spec:
46324636
- type
46334637
type: object
46344638
type: array
4635-
observedDatabaseGeneration:
4636-
format: int64
4637-
type: integer
46384639
state:
46394640
type: string
46404641
required:

deploy/ydb-operator/crds/remotestoragenodeset.yaml

+4-3
Original file line numberDiff line numberDiff line change
@@ -2785,6 +2785,10 @@ spec:
27852785
required:
27862786
- name
27872787
type: object
2788+
terminationGracePeriodSeconds:
2789+
description: (Optional) If specified, the pod's terminationGracePeriodSeconds.
2790+
format: int64
2791+
type: integer
27882792
tolerations:
27892793
description: (Optional) If specified, the pod's tolerations.
27902794
items:
@@ -4625,9 +4629,6 @@ spec:
46254629
- type
46264630
type: object
46274631
type: array
4628-
observedStorageGeneration:
4629-
format: int64
4630-
type: integer
46314632
state:
46324633
type: string
46334634
required:

deploy/ydb-operator/crds/storagenodeset.yaml

-3
Original file line numberDiff line numberDiff line change
@@ -4628,9 +4628,6 @@ spec:
46284628
- type
46294629
type: object
46304630
type: array
4631-
observedStorageGeneration:
4632-
format: int64
4633-
type: integer
46344631
state:
46354632
type: string
46364633
required:

deploy/ydb-operator/templates/rbac-operator.yaml

+6
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,9 @@ rules:
179179
- ydb.tech
180180
resources:
181181
- databasenodesets
182+
- remotedatabasenodesets
182183
- storagenodesets
184+
- remotestoragenodesets
183185
verbs:
184186
- create
185187
- delete
@@ -192,14 +194,18 @@ rules:
192194
- ydb.tech
193195
resources:
194196
- databasenodesets/finalizers
197+
- remotedatabasenodesets/finalizers
195198
- storagenodesets/finalizers
199+
- remotestoragenodesets/finalizers
196200
verbs:
197201
- update
198202
- apiGroups:
199203
- ydb.tech
200204
resources:
201205
- databasenodesets/status
206+
- remotedatabasenodesets/status
202207
- storagenodesets/status
208+
- remotestoragenodesets/status
203209
verbs:
204210
- get
205211
- patch

e2e/tests/smoke_test.go

-18
Original file line numberDiff line numberDiff line change
@@ -456,7 +456,6 @@ var _ = Describe("Operator smoke test", func() {
456456
checkPodsRunningAndReady(ctx, "ydb-cluster", "kind-database", databaseSample.Spec.Nodes)
457457

458458
database := v1alpha1.Database{}
459-
databaseNodeSetList := v1alpha1.DatabaseNodeSetList{}
460459
databasePods := corev1.PodList{}
461460
By("delete nodeSetSpec inline to check inheritance...")
462461
Eventually(func(g Gomega) error {
@@ -476,23 +475,6 @@ var _ = Describe("Operator smoke test", func() {
476475
return k8sClient.Update(ctx, &database)
477476
}, Timeout, Interval).Should(BeNil())
478477

479-
By("check that ObservedDatabaseGeneration changed...")
480-
Eventually(func(g Gomega) bool {
481-
g.Expect(k8sClient.Get(ctx, types.NamespacedName{
482-
Name: databaseSample.Name,
483-
Namespace: testobjects.YdbNamespace,
484-
}, &database)).Should(Succeed())
485-
g.Expect(k8sClient.List(ctx, &databaseNodeSetList,
486-
client.InNamespace(testobjects.YdbNamespace),
487-
)).Should(Succeed())
488-
for _, databaseNodeSet := range databaseNodeSetList.Items {
489-
if database.GetGeneration() != databaseNodeSet.Status.ObservedDatabaseGeneration {
490-
return false
491-
}
492-
}
493-
return true
494-
}, Timeout, Interval).Should(BeTrue())
495-
496478
By("expecting databaseNodeSet pods deletion...")
497479
Eventually(func(g Gomega) bool {
498480
g.Expect(k8sClient.Get(ctx, types.NamespacedName{

internal/controllers/database/controller.go

+36-7
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"k8s.io/client-go/tools/record"
1414
ctrl "sigs.k8s.io/controller-runtime"
1515
"sigs.k8s.io/controller-runtime/pkg/client"
16+
"sigs.k8s.io/controller-runtime/pkg/client/apiutil"
1617
"sigs.k8s.io/controller-runtime/pkg/event"
1718
"sigs.k8s.io/controller-runtime/pkg/log"
1819
"sigs.k8s.io/controller-runtime/pkg/predicate"
@@ -53,20 +54,21 @@ type Reconciler struct {
5354
func (r *Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
5455
r.Log = log.FromContext(ctx)
5556

56-
database := &ydbv1alpha1.Database{}
57-
err := r.Get(ctx, req.NamespacedName, database)
57+
resource := &ydbv1alpha1.Database{}
58+
err := r.Get(ctx, req.NamespacedName, resource)
5859
if err != nil {
5960
if errors.IsNotFound(err) {
60-
r.Log.Info("database resources not found")
61+
r.Log.Info("Database resource not found")
6162
return ctrl.Result{Requeue: false}, nil
6263
}
6364
r.Log.Error(err, "unexpected Get error")
6465
return ctrl.Result{RequeueAfter: DefaultRequeueDelay}, err
6566
}
66-
result, err := r.Sync(ctx, database)
67+
result, err := r.Sync(ctx, resource)
6768
if err != nil {
6869
r.Log.Error(err, "unexpected Sync error")
6970
}
71+
7072
return result, err
7173
}
7274

@@ -88,10 +90,36 @@ func ignoreDeletionPredicate() predicate.Predicate {
8890

8991
// SetupWithManager sets up the controller with the Manager.
9092
func (r *Reconciler) SetupWithManager(mgr ctrl.Manager) error {
91-
controller := ctrl.NewControllerManagedBy(mgr).For(&ydbv1alpha1.Database{})
93+
resource := &ydbv1alpha1.Database{}
94+
resourceGVK, err := apiutil.GVKForObject(resource, r.Scheme)
95+
if err != nil {
96+
r.Log.Error(err, "does not recognize GVK for resource")
97+
return err
98+
}
9299

93-
r.Recorder = mgr.GetEventRecorderFor("Database")
100+
r.Recorder = mgr.GetEventRecorderFor(resourceGVK.Kind)
101+
controller := ctrl.NewControllerManagedBy(mgr).For(resource)
102+
if err := mgr.GetFieldIndexer().IndexField(
103+
context.Background(),
104+
&ydbv1alpha1.RemoteDatabaseNodeSet{},
105+
OwnerControllerKey,
106+
func(obj client.Object) []string {
107+
// grab the RemoteDatabaseNodeSet object, extract the owner...
108+
remoteDatabaseNodeSet := obj.(*ydbv1alpha1.RemoteDatabaseNodeSet)
109+
owner := metav1.GetControllerOf(remoteDatabaseNodeSet)
110+
if owner == nil {
111+
return nil
112+
}
113+
// ...make sure it's a Database...
114+
if owner.APIVersion != ydbv1alpha1.GroupVersion.String() || owner.Kind != resourceGVK.Kind {
115+
return nil
116+
}
94117

118+
// ...and if so, return it
119+
return []string{owner.Name}
120+
}); err != nil {
121+
return err
122+
}
95123
if err := mgr.GetFieldIndexer().IndexField(
96124
context.Background(),
97125
&ydbv1alpha1.DatabaseNodeSet{},
@@ -104,7 +132,7 @@ func (r *Reconciler) SetupWithManager(mgr ctrl.Manager) error {
104132
return nil
105133
}
106134
// ...make sure it's a Database...
107-
if owner.APIVersion != ydbv1alpha1.GroupVersion.String() || owner.Kind != "Database" {
135+
if owner.APIVersion != ydbv1alpha1.GroupVersion.String() || owner.Kind != resourceGVK.Kind {
108136
return nil
109137
}
110138

@@ -115,6 +143,7 @@ func (r *Reconciler) SetupWithManager(mgr ctrl.Manager) error {
115143
}
116144

117145
return controller.
146+
Owns(&ydbv1alpha1.RemoteDatabaseNodeSet{}).
118147
Owns(&ydbv1alpha1.DatabaseNodeSet{}).
119148
Owns(&corev1.Service{}).
120149
Owns(&appsv1.StatefulSet{}).

internal/controllers/database/sync.go

+47-16
Original file line numberDiff line numberDiff line change
@@ -461,11 +461,11 @@ func (r *Reconciler) syncNodeSetSpecInline(
461461
database *resources.DatabaseBuilder,
462462
) (bool, ctrl.Result, error) {
463463
r.Log.Info("running step syncNodeSetSpecInline")
464-
465-
databaseNodeSets := &v1alpha1.DatabaseNodeSetList{}
466464
matchingFields := client.MatchingFields{
467465
OwnerControllerKey: database.Name,
468466
}
467+
468+
databaseNodeSets := &v1alpha1.DatabaseNodeSetList{}
469469
if err := r.List(ctx, databaseNodeSets,
470470
client.InNamespace(database.Namespace),
471471
matchingFields,
@@ -483,10 +483,12 @@ func (r *Reconciler) syncNodeSetSpecInline(
483483
databaseNodeSet := databaseNodeSet.DeepCopy()
484484
isFoundDatabaseNodeSetSpecInline := false
485485
for _, nodeSetSpecInline := range database.Spec.NodeSets {
486-
databaseNodeSetName := database.Name + "-" + nodeSetSpecInline.Name
487-
if databaseNodeSet.Name == databaseNodeSetName {
488-
isFoundDatabaseNodeSetSpecInline = true
489-
break
486+
if nodeSetSpecInline.Remote == nil {
487+
nodeSetName := database.Name + "-" + nodeSetSpecInline.Name
488+
if databaseNodeSet.Name == nodeSetName {
489+
isFoundDatabaseNodeSetSpecInline = true
490+
break
491+
}
490492
}
491493
}
492494
if !isFoundDatabaseNodeSetSpecInline {
@@ -509,24 +511,53 @@ func (r *Reconciler) syncNodeSetSpecInline(
509511
databaseNodeSet.Name),
510512
)
511513
}
514+
}
512515

513-
oldGeneration := databaseNodeSet.Status.ObservedDatabaseGeneration
514-
if oldGeneration != database.Generation {
515-
databaseNodeSet.Status.ObservedDatabaseGeneration = database.Generation
516-
if err := r.Status().Update(ctx, databaseNodeSet); err != nil {
516+
remoteDatabaseNodeSets := &v1alpha1.RemoteDatabaseNodeSetList{}
517+
if err := r.List(ctx, remoteDatabaseNodeSets,
518+
client.InNamespace(database.Namespace),
519+
matchingFields,
520+
); err != nil {
521+
r.Recorder.Event(
522+
database,
523+
corev1.EventTypeWarning,
524+
"ProvisioningFailed",
525+
fmt.Sprintf("Failed to list RemoteDatabaseNodeSets: %s", err),
526+
)
527+
return Stop, ctrl.Result{RequeueAfter: DefaultRequeueDelay}, err
528+
}
529+
530+
for _, remoteDatabaseNodeSet := range remoteDatabaseNodeSets.Items {
531+
remoteDatabaseNodeSet := remoteDatabaseNodeSet.DeepCopy()
532+
isFoundRemoteDatabaseNodeSetSpecInline := false
533+
for _, nodeSetSpecInline := range database.Spec.NodeSets {
534+
if nodeSetSpecInline.Remote != nil {
535+
nodeSetName := database.Name + "-" + nodeSetSpecInline.Name
536+
if remoteDatabaseNodeSet.Name == nodeSetName {
537+
isFoundRemoteDatabaseNodeSetSpecInline = true
538+
break
539+
}
540+
}
541+
}
542+
543+
if !isFoundRemoteDatabaseNodeSetSpecInline {
544+
if err := r.Delete(ctx, remoteDatabaseNodeSet); err != nil {
517545
r.Recorder.Event(
518-
databaseNodeSet,
546+
database,
519547
corev1.EventTypeWarning,
520-
"ControllerError",
521-
fmt.Sprintf("Failed setting status: %s", err),
548+
"ProvisioningFailed",
549+
fmt.Sprintf("Failed to delete RemoteDatabaseNodeSet: %s", err),
522550
)
523551
return Stop, ctrl.Result{RequeueAfter: DefaultRequeueDelay}, err
524552
}
525553
r.Recorder.Event(
526-
databaseNodeSet,
554+
database,
527555
corev1.EventTypeNormal,
528-
"StatusChanged",
529-
fmt.Sprintf("DatabaseNodeSet updated observedStorageGeneration from %d to %d", oldGeneration, database.Generation),
556+
"Syncing",
557+
fmt.Sprintf("Resource: %s, Namespace: %s, Name: %s, deleted",
558+
reflect.TypeOf(remoteDatabaseNodeSet),
559+
remoteDatabaseNodeSet.Namespace,
560+
remoteDatabaseNodeSet.Name),
530561
)
531562
}
532563
}

0 commit comments

Comments
 (0)