Skip to content

Commit

Permalink
Setting machine instance state to unknown on machine failure
Browse files Browse the repository at this point in the history
Bug 1808971: Machine status shows "running" when an instance was terminated
  • Loading branch information
Danil-Grigorev committed Apr 30, 2020
1 parent f1633f9 commit c10a93c
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 3 deletions.
14 changes: 13 additions & 1 deletion pkg/controller/machine/controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,9 @@ const (
// Machine has a deletion timestamp
phaseDeleting = "Deleting"

// Hardcoded instance state set on machine failure
unknownInstanceState = "Unknown"

skipWaitForDeleteTimeoutSeconds = 60 * 5
)

Expand Down Expand Up @@ -426,9 +429,18 @@ func (r *ReconcileMachine) setPhase(machine *machinev1.Machine, phase string, er
machine.Status.LastUpdated = &now
if phase == phaseFailed && errorMessage != "" {
machine.Status.ErrorMessage = &errorMessage
if machine.Annotations == nil {
machine.Annotations = map[string]string{}
}
machine.Annotations[MachineInstanceStateAnnotationName] = unknownInstanceState
if err := r.Client.Patch(context.Background(), machine, baseToPatch); err != nil {
klog.Errorf("Failed to update machine %q: %v", machine.GetName(), err)
return err
}
return nil
}
if err := r.Client.Status().Patch(context.Background(), machine, baseToPatch); err != nil {
klog.Errorf("Failed to update machine %q: %v", machine.GetName(), err)
klog.Errorf("Failed to update machine status %q: %v", machine.GetName(), err)
return err
}
}
Expand Down
9 changes: 7 additions & 2 deletions pkg/controller/machine/controller_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -382,7 +382,7 @@ func TestSetPhase(t *testing.T) {
t.Fatal(err)
}
if *lastUpdated != *got.Status.LastUpdated {
t.Errorf("Expected: %v, got: %v", *lastUpdated, *got.Status.LastUpdated)
t.Errorf("Expected: %v, got: %v", *lastUpdated, got.Status.LastUpdated)
}
// validate passed object
if *objectLastUpdated != *machine.Status.LastUpdated {
Expand All @@ -391,6 +391,8 @@ func TestSetPhase(t *testing.T) {

// Set phaseFailed with an errorMessage should store the message
expecterErrorMessage := "test"
// Set phaseFailed will result to force Unknown state for VM state display
expectedInstanceState := "Unknown"
if err := reconciler.setPhase(machine, phaseFailed, expecterErrorMessage); err != nil {
t.Fatal(err)
}
Expand All @@ -401,12 +403,15 @@ func TestSetPhase(t *testing.T) {
}
// validate persisted object
if expecterErrorMessage != *got.Status.ErrorMessage {
t.Errorf("Expected: %v, got: %v", expecterErrorMessage, *got.Status.ErrorMessage)
t.Errorf("Expected: %v, got: %v", expecterErrorMessage, got.Status.ErrorMessage)
}
// validate passed object
if expecterErrorMessage != *machine.Status.ErrorMessage {
t.Errorf("Expected: %v, got: %v", expecterErrorMessage, *machine.Status.ErrorMessage)
}
if got.Annotations[MachineInstanceStateAnnotationName] != expectedInstanceState {
t.Errorf("Expected VM to go into: %v state, got: %v", expectedInstanceState, got.Annotations[MachineInstanceStateAnnotationName])
}
}

func TestMachineIsProvisioned(t *testing.T) {
Expand Down

0 comments on commit c10a93c

Please sign in to comment.