Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions api/core/v1alpha2/vmopcondition/condition.go
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,14 @@ const (
// ReasonTargetDiskError indicates that target disk attachment failed.
ReasonTargetDiskError ReasonCompleted = "TargetDiskError"

// ReasonTargetHandlerShutdown indicates that virt-handler on the target node
// was shut down during the live migration, breaking the migration proxy channel.
ReasonTargetHandlerShutdown ReasonCompleted = "TargetHandlerShutdown"

// ReasonSourceHandlerShutdown indicates that virt-handler on the source node
// was shut down during the live migration, breaking the migration proxy channel.
ReasonSourceHandlerShutdown ReasonCompleted = "SourceHandlerShutdown"

// ReasonTargetPreparing indicates that target pod is being prepared.
ReasonTargetPreparing ReasonCompleted = "TargetPreparing"

Expand Down
2 changes: 1 addition & 1 deletion build/components/versions.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ firmware:
libvirt: v10.9.0
edk2: stable202411
core:
3p-kubevirt: v1.6.2-v12n.35
3p-kubevirt: feat/virt-handler/handler-shutdown-migration-reason
3p-containerized-data-importer: v1.60.3-v12n.19
distribution: 2.8.3
package:
Expand Down
2 changes: 2 additions & 0 deletions images/virt-artifact/werf.inc.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
image: {{ .ModuleNamePrefix }}{{ .ImageName }}-src-artifact
final: false
fromImage: builder/src
fromCacheVersion: 21-05-6"
secrets:
- id: SOURCE_REPO
value: {{ $.SOURCE_REPO }}
Expand Down Expand Up @@ -44,6 +45,7 @@ packages:
image: {{ .ModuleNamePrefix }}{{ .ImageName }}
final: false
fromImage: {{ eq $.SVACE_ENABLED "false" | ternary "builder/golang-alt-1.25" "builder/golang-alt-svace-1.25" }}
fromCacheVersion: 21-05-6"
mount:
{{- include "mount points for golang builds" . }}
secrets:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -527,6 +527,9 @@ func (h LifecycleHandler) getFailedReason(mig *virtv1.VirtualMachineInstanceMigr
if state.AbortRequested || state.AbortStatus == virtv1.MigrationAbortSucceeded {
return vmopcondition.ReasonAborted
}
if reason := vmopcondition.ReasonCompleted(state.FailureReason); reason == vmopcondition.ReasonTargetHandlerShutdown || reason == vmopcondition.ReasonSourceHandlerShutdown {
return reason
}
if strings.Contains(strings.ToLower(state.FailureReason), "converg") || strings.Contains(strings.ToLower(state.FailureReason), "progress") {
return vmopcondition.ReasonNotConverging
}
Expand All @@ -548,7 +551,7 @@ func (h LifecycleHandler) getFailedReason(mig *virtv1.VirtualMachineInstanceMigr
func (h LifecycleHandler) getFailedMessage(reason vmopcondition.ReasonCompleted, mig *virtv1.VirtualMachineInstanceMigration) string {
base := "Migration failed"
switch reason {
case vmopcondition.ReasonAborted:
case vmopcondition.ReasonAborted, vmopcondition.ReasonTargetHandlerShutdown, vmopcondition.ReasonSourceHandlerShutdown:
base = "Migration aborted"
case vmopcondition.ReasonNotConverging:
base = "Migration did not converge"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -362,12 +362,36 @@ var _ = Describe("LifecycleHandler", func() {
&virtv1.VirtualMachineInstanceMigration{Status: virtv1.VirtualMachineInstanceMigrationStatus{Conditions: []virtv1.VirtualMachineInstanceMigrationCondition{{Type: virtv1.VirtualMachineInstanceMigrationFailed, Reason: "VolumeAttach", Message: "csi volume attach failed"}}}},
vmopcondition.ReasonTargetDiskError,
),
Entry("target virt-handler shutdown from failure reason",
&virtv1.VirtualMachineInstanceMigration{Status: virtv1.VirtualMachineInstanceMigrationStatus{MigrationState: &virtv1.VirtualMachineInstanceMigrationState{FailureReason: vmopcondition.ReasonTargetHandlerShutdown.String()}}},
vmopcondition.ReasonTargetHandlerShutdown,
),
Entry("source virt-handler shutdown from failure reason",
&virtv1.VirtualMachineInstanceMigration{Status: virtv1.VirtualMachineInstanceMigrationStatus{MigrationState: &virtv1.VirtualMachineInstanceMigrationState{FailureReason: vmopcondition.ReasonSourceHandlerShutdown.String()}}},
vmopcondition.ReasonSourceHandlerShutdown,
),
Entry("generic failed reason",
&virtv1.VirtualMachineInstanceMigration{},
vmopcondition.ReasonFailed,
),
)

DescribeTable("should render handler-shutdown failure message", func(reason vmopcondition.ReasonCompleted, mig *virtv1.VirtualMachineInstanceMigration, expected string) {
h := LifecycleHandler{}
Expect(h.getFailedMessage(reason, mig)).To(Equal(expected))
},
Entry("target shutdown",
vmopcondition.ReasonTargetHandlerShutdown,
&virtv1.VirtualMachineInstanceMigration{Status: virtv1.VirtualMachineInstanceMigrationStatus{MigrationState: &virtv1.VirtualMachineInstanceMigrationState{TargetNode: "worker-1", FailureReason: vmopcondition.ReasonTargetHandlerShutdown.String()}}},
"Migration aborted: TargetHandlerShutdown",
),
Entry("source shutdown",
vmopcondition.ReasonSourceHandlerShutdown,
&virtv1.VirtualMachineInstanceMigration{Status: virtv1.VirtualMachineInstanceMigrationStatus{MigrationState: &virtv1.VirtualMachineInstanceMigrationState{SourceNode: "master-0", FailureReason: vmopcondition.ReasonSourceHandlerShutdown.String()}}},
"Migration aborted: SourceHandlerShutdown",
),
)

DescribeTable("should build in-progress reason and message", func(
phase virtv1.VirtualMachineInstanceMigrationPhase,
state *virtv1.VirtualMachineInstanceMigrationState,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,12 +42,14 @@ var successfulTerminalReasons = map[string]struct{}{
}

var failedTerminalReasons = map[string]struct{}{
vmopcondition.ReasonOperationFailed.String(): {},
vmopcondition.ReasonFailed.String(): {},
vmopcondition.ReasonAborted.String(): {},
vmopcondition.ReasonNotConverging.String(): {},
vmopcondition.ReasonTargetUnschedulable.String(): {},
vmopcondition.ReasonTargetDiskError.String(): {},
vmopcondition.ReasonOperationFailed.String(): {},
vmopcondition.ReasonFailed.String(): {},
vmopcondition.ReasonAborted.String(): {},
vmopcondition.ReasonNotConverging.String(): {},
vmopcondition.ReasonTargetUnschedulable.String(): {},
vmopcondition.ReasonTargetDiskError.String(): {},
vmopcondition.ReasonTargetHandlerShutdown.String(): {},
vmopcondition.ReasonSourceHandlerShutdown.String(): {},
}

// DO NOT mutate VirtualMachineOperation!
Expand Down
Loading