@@ -21,6 +21,7 @@ package instanceset
2121
2222import (
2323 "errors"
24+ "slices"
2425
2526 appsv1 "k8s.io/api/apps/v1"
2627 corev1 "k8s.io/api/core/v1"
@@ -145,7 +146,7 @@ func (r *instanceAlignmentReconciler) Reconcile(tree *kubebuilderx.ObjectTree) (
145146 if err != nil {
146147 return kubebuilderx .Continue , err
147148 }
148- if err := tree .AddWithOption (newPod , r .joinMemberHook (tree , its , oldInstanceList , newPod )); err != nil {
149+ if err := tree .AddWithOption (newPod , r .createInstance (tree , its , oldInstanceList , newPod )); err != nil {
149150 return kubebuilderx .Continue , err
150151 }
151152 currentAlignedNameList = append (currentAlignedNameList , name )
@@ -198,7 +199,7 @@ func (r *instanceAlignmentReconciler) Reconcile(tree *kubebuilderx.ObjectTree) (
198199 its .Name ,
199200 pod .Name )
200201 }
201- if err := tree .DeleteWithOption (pod , r .leaveMemberHook (tree , its , oldInstanceList , pod )); err != nil {
202+ if err := tree .DeleteWithOption (pod , r .deleteInstance (tree , its , oldInstanceList , pod )); err != nil {
202203 return kubebuilderx .Continue , err
203204 }
204205
@@ -224,37 +225,30 @@ func (r *instanceAlignmentReconciler) Reconcile(tree *kubebuilderx.ObjectTree) (
224225 return kubebuilderx .Continue , nil
225226}
226227
227- func (r * instanceAlignmentReconciler ) joinMemberHook (tree * kubebuilderx.ObjectTree ,
228- its * workloads.InstanceSet , pods []client.Object , pod * corev1.Pod ) kubebuilderx.WithHook {
228+ func (r * instanceAlignmentReconciler ) createInstance (tree * kubebuilderx.ObjectTree ,
229+ its * workloads.InstanceSet , pods []client.Object , pod * corev1.Pod ) kubebuilderx.WithPrevHook {
229230 return func (obj client.Object ) error {
230- if its .Status .InitReplicas == nil || its .Status .ReadyInitReplicas == nil ||
231- * its .Status .InitReplicas != * its .Status .ReadyInitReplicas {
232- return nil // init replicas
233- }
234- if its .Spec .LifecycleActions == nil || its .Spec .LifecycleActions .MemberJoin == nil {
235- return nil // member join not defined
236- }
237- joined := false
238- for _ , inst := range its .Status .InstanceStatus {
239- if inst .PodName == pod .Name {
240- joined = ptr .Deref (inst .Joined , false )
231+ joinMember := func (inst workloads.InstanceStatus ) error {
232+ if its .Spec .LifecycleActions == nil || its .Spec .LifecycleActions .MemberJoin == nil {
233+ return nil
241234 }
235+ if ptr .Deref (inst .Joined , false ) {
236+ return nil
237+ }
238+ // TODO: should wait for the data to be loaded before joining the member?
239+ return r .joinMember (tree , its , pods , pod )
242240 }
243- if joined {
244- return nil
245- }
246-
247- // TODO: should wait for the data to be loaded before joining the member?
248-
249- if err := r .joinMember (tree , its , pods , pod ); err != nil {
250- return err
241+ idx := slices .IndexFunc (its .Status .InstanceStatus , func (status workloads.InstanceStatus ) bool {
242+ return status .PodName == pod .Name
243+ })
244+ var err error
245+ if idx >= 0 {
246+ err = joinMember (its .Status .InstanceStatus [idx ])
251247 }
252- for i , inst := range its .Status .InstanceStatus {
253- if inst .PodName == pod .Name {
254- its .Status .InstanceStatus [i ].Joined = ptr .To (true )
255- }
248+ if err == nil {
249+ its .Status .InstanceStatus [idx ].Joined = ptr .To (true )
256250 }
257- return nil
251+ return err
258252 }
259253}
260254
@@ -273,22 +267,29 @@ func (r *instanceAlignmentReconciler) joinMember(tree *kubebuilderx.ObjectTree,
273267 return nil
274268}
275269
276- func (r * instanceAlignmentReconciler ) leaveMemberHook (tree * kubebuilderx.ObjectTree ,
277- its * workloads.InstanceSet , pods []client.Object , pod * corev1.Pod ) kubebuilderx.WithHook {
270+ func (r * instanceAlignmentReconciler ) deleteInstance (tree * kubebuilderx.ObjectTree ,
271+ its * workloads.InstanceSet , pods []client.Object , pod * corev1.Pod ) kubebuilderx.WithPostHook {
278272 return func (obj client.Object ) error {
279- hasMemberLeaveDefined := its .Spec .LifecycleActions != nil && its .Spec .LifecycleActions .MemberLeave != nil
280- joined := func () bool {
281- for _ , inst := range its .Status .InstanceStatus {
282- if inst .PodName == pod .Name {
283- return ptr .Deref (inst .Joined , true )
284- }
273+ leaveMember := func (inst workloads.InstanceStatus ) error {
274+ if its .Spec .LifecycleActions == nil || its .Spec .LifecycleActions .MemberLeave == nil {
275+ return nil
285276 }
286- return false
287- }()
288- if ! hasMemberLeaveDefined || ! joined {
289- return nil
277+ if ! ptr .Deref (inst .Joined , false ) {
278+ return nil
279+ }
280+ return r .leaveMember (tree , its , pods , pod )
281+ }
282+ idx := slices .IndexFunc (its .Status .InstanceStatus , func (status workloads.InstanceStatus ) bool {
283+ return status .PodName == pod .Name
284+ })
285+ var err error
286+ if idx >= 0 {
287+ err = leaveMember (its .Status .InstanceStatus [idx ])
290288 }
291- return r .leaveMember (tree , its , pods , pod )
289+ if err == nil {
290+ its .Status .InstanceStatus = slices .Delete (its .Status .InstanceStatus , idx , idx + 1 )
291+ }
292+ return err
292293 }
293294}
294295
0 commit comments