@@ -31,8 +31,10 @@ import (
3131 "k8s.io/api/core/v1"
3232 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3333
34+ driver "github.com/arangodb/go-driver"
3435 "github.com/arangodb/go-driver/agency"
3536 api "github.com/arangodb/kube-arangodb/pkg/apis/deployment/v1alpha"
37+ "github.com/arangodb/kube-arangodb/pkg/util/arangod"
3638 "github.com/arangodb/kube-arangodb/pkg/util/k8sutil"
3739)
3840
@@ -185,15 +187,49 @@ func (r *Resources) prepareDBServerPodTermination(ctx context.Context, log zerol
185187 return nil
186188 }
187189 // Not cleaned out yet, check member status
188- if memberStatus .Conditions .IsTrue (api .ConditionTypeTerminated ) {
190+ if memberStatus .Conditions .IsTrue (api .ConditionTypeTerminated ) || ( memberStatus . Phase == api . MemberPhaseCreated && ! k8sutil . IsPodReady ( p )) {
189191 log .Warn ().Msg ("Member is already terminated before it could be cleaned out. Not good, but removing dbserver pod because we cannot do anything further" )
190192 return nil
191193 }
192- // Ensure the cleanout is triggered
193- log .Debug ().Msg ("Server is not yet clean out. Triggering a clean out now" )
194- if err := cluster .CleanOutServer (ctx , memberStatus .ID ); err != nil {
195- log .Debug ().Err (err ).Msg ("Failed to clean out server" )
196- return maskAny (err )
194+ if memberStatus .Phase == api .MemberPhaseCreated {
195+ // No cleanout job triggered
196+ var jobID string
197+ ctx = driver .WithJobIDResponse (ctx , & jobID )
198+ // Ensure the cleanout is triggered
199+ log .Debug ().Msg ("Server is not yet clean out. Triggering a clean out now" )
200+ if err := cluster .CleanOutServer (ctx , memberStatus .ID ); err != nil {
201+ log .Debug ().Err (err ).Msg ("Failed to clean out server" )
202+ return maskAny (err )
203+ }
204+ memberStatus .CleanoutJobID = jobID
205+ memberStatus .Phase = api .MemberPhaseDrain
206+ if err := updateMember (memberStatus ); err != nil {
207+ return maskAny (err )
208+ }
209+ } else if memberStatus .Phase == api .MemberPhaseDrain {
210+ // Check the job progress
211+ agency , err := r .context .GetAgency (ctx )
212+ if err != nil {
213+ log .Debug ().Err (err ).Msg ("Failed to create agency client" )
214+ return maskAny (err )
215+ }
216+ jobStatus , err := arangod .CleanoutServerJobStatus (ctx , memberStatus .CleanoutJobID , c , agency )
217+ if err != nil {
218+ log .Debug ().Err (err ).Msg ("Failed to fetch cleanout job status" )
219+ return maskAny (err )
220+ }
221+ if jobStatus .IsFailed () {
222+ log .Warn ().Str ("reason" , jobStatus .Reason ()).Msg ("Cleanout Job failed. Aborting plan" )
223+ // Revert cleanout state
224+ memberStatus .Phase = api .MemberPhaseCreated
225+ memberStatus .CleanoutJobID = ""
226+ return maskAny (fmt .Errorf ("Clean out server job failed" ))
227+ }
228+ } else {
229+ log .Warn ().Msgf ("Unexpected MemberPhase %s, allow removal" , memberStatus .Phase )
230+ return nil
197231 }
232+
198233 return maskAny (fmt .Errorf ("Server is not yet cleaned out" ))
234+
199235}
0 commit comments