Skip to content

Fork Sync: Update from parent repository - #73

Merged
kaovilai merged 1 commit into
kaovilai:oadp-1.1from
openshift:oadp-1.1
Jan 3, 2023
Merged

kaovilai merged 1 commit into
kaovilai:oadp-1.1from
openshift:oadp-1.1

Conversation

@kaovilai

@kaovilai kaovilai commented Jan 3, 2023

Copy link
Copy Markdown
Owner

No description provided.

Co-authored-by: hhpatel14 <hitpatel@redhat.com>
@kaovilai
kaovilai merged commit 8dc57b4 into kaovilai:oadp-1.1 Jan 3, 2023
kaovilai added a commit that referenced this pull request Aug 5, 2026
Adds a second temporary image override (KubeVirtDatamoverControllerImageKey ->
quay.io/tkaovila/kdm-controller:issue73-phase3) alongside the existing plugin
override, to exercise migtools/kubevirt-datamover-controller#124 (DataDownload
controller for VM restore, issue #73 phase 3) pre-merge -- directly relevant to
restore-from-CBT coverage.

Both overrides are temporary and should be removed once their respective PRs
merge.

Signed-off-by: Tiger Kaovilai <tkaovila@redhat.com>
kaovilai added a commit that referenced this pull request Aug 5, 2026
Closes the #99 "Restore from KDM CBT backup" gap, now unblocked by the
overridden kubevirt-datamover-controller image (migtools/kubevirt-datamover-
controller#124, DataDownload controller, issue #73 phase 3).

Per docs/design/kubevirt-datamover.md and the plugin's own README, restore
just needs a normal Velero Restore -- the VirtualMachine RestoreItemAction
plugin creates the DataDownload CR automatically from backup-recorded
annotations, and separately discards the restored VMB/VMBT so restore
doesn't re-trigger a backup. No manual CR driving needed, mirroring how
backup already works. Verifies success via the existing generic
lib.CreateRestoreFromBackup/IsRestoreDone/IsRestoreCompletedSuccessfully
helpers plus a new lib.GetDataDownloadForRestore (mirrors
GetDataUploadForBackup) confirming the DataDownload itself reached
status.phase=Completed -- proving the datamover path actually engaged,
not just that the restore completed some other way.

Extracted runKubevirtDMBackup (shared create+wait+verify-backup helper)
out of runSequenceBackup to avoid duplicating that logic a second time
for the restore test.

Also scaffolds two ginkgo.PIt (real, compiling, not run) for gaps
explicitly still open per kubevirt-datamover-controller#73's phased
plan: multi-disk restore (phase 4, not yet hardened -- new
cirros-test-multipvc-cbt.yaml template ready for when it lands) and
restore from an incremental (not full) backup (phase 5, not yet
e2e-validated upstream even though the chain-rebase logic may already
support it internally).

Not yet run against a real cluster.

Signed-off-by: Tiger Kaovilai <tkaovila@redhat.com>
kaovilai added a commit that referenced this pull request Aug 5, 2026
The manager ClusterRole shipped with OADP only granted access to
datauploads/datauploads.status -- there was no datadownloads,
datadownloads/status, or events permission at all. Without this, the
controller would hit RBAC-denied errors reconciling any DataDownload,
regardless of image correctness, once a real velero restore actually
tried to drive it (which migtools/kubevirt-datamover-plugin#41 now
makes possible).

Synced config/kubevirt-datamover-controller_rbac/role.yaml and the
matching block in bundle/manifests/oadp-operator.clusterserviceversion.yaml
(serviceAccountName: oadp-kubevirt-datamover-controller-manager) to
byte-match config/rbac/role.yaml from
migtools/kubevirt-datamover-controller PR #124 (issue #73 phase 3,
commit 825d176), which added these rules on the source side but were
never pulled into OADP's bundled copy -- normally done via
`make update-kubevirt-datamover-manifests KUBEVIRT_DATAMOVER_PATH=...`,
done here by hand since no local checkout of that repo is available in
this environment.

This is a real, pre-existing gap (not introduced by this branch's other
changes) that this branch's e2e work would otherwise have hit blind, so
fixing it here rather than filing it separately.

Signed-off-by: Tiger Kaovilai <tkaovila@redhat.com>
kaovilai added a commit that referenced this pull request Aug 5, 2026
Adds a second temporary image override (KubeVirtDatamoverControllerImageKey ->
quay.io/tkaovila/kdm-controller:issue73-phase3) alongside the existing plugin
override, to exercise migtools/kubevirt-datamover-controller#124 (DataDownload
controller for VM restore, issue #73 phase 3) pre-merge -- directly relevant to
restore-from-CBT coverage.

Both overrides are temporary and should be removed once their respective PRs
merge.

Signed-off-by: Tiger Kaovilai <tkaovila@redhat.com>
kaovilai added a commit that referenced this pull request Aug 5, 2026
Closes the #99 "Restore from KDM CBT backup" gap, now unblocked by the
overridden kubevirt-datamover-controller image (migtools/kubevirt-datamover-
controller#124, DataDownload controller, issue #73 phase 3).

Per docs/design/kubevirt-datamover.md and the plugin's own README, restore
just needs a normal Velero Restore -- the VirtualMachine RestoreItemAction
plugin creates the DataDownload CR automatically from backup-recorded
annotations, and separately discards the restored VMB/VMBT so restore
doesn't re-trigger a backup. No manual CR driving needed, mirroring how
backup already works. Verifies success via the existing generic
lib.CreateRestoreFromBackup/IsRestoreDone/IsRestoreCompletedSuccessfully
helpers plus a new lib.GetDataDownloadForRestore (mirrors
GetDataUploadForBackup) confirming the DataDownload itself reached
status.phase=Completed -- proving the datamover path actually engaged,
not just that the restore completed some other way.

Extracted runKubevirtDMBackup (shared create+wait+verify-backup helper)
out of runSequenceBackup to avoid duplicating that logic a second time
for the restore test.

Also scaffolds two ginkgo.PIt (real, compiling, not run) for gaps
explicitly still open per kubevirt-datamover-controller#73's phased
plan: multi-disk restore (phase 4, not yet hardened -- new
cirros-test-multipvc-cbt.yaml template ready for when it lands) and
restore from an incremental (not full) backup (phase 5, not yet
e2e-validated upstream even though the chain-rebase logic may already
support it internally).

Not yet run against a real cluster.

Signed-off-by: Tiger Kaovilai <tkaovila@redhat.com>
kaovilai added a commit that referenced this pull request Aug 5, 2026
The manager ClusterRole shipped with OADP only granted access to
datauploads/datauploads.status -- there was no datadownloads,
datadownloads/status, or events permission at all. Without this, the
controller would hit RBAC-denied errors reconciling any DataDownload,
regardless of image correctness, once a real velero restore actually
tried to drive it (which migtools/kubevirt-datamover-plugin#41 now
makes possible).

Synced config/kubevirt-datamover-controller_rbac/role.yaml and the
matching block in bundle/manifests/oadp-operator.clusterserviceversion.yaml
(serviceAccountName: oadp-kubevirt-datamover-controller-manager) to
byte-match config/rbac/role.yaml from
migtools/kubevirt-datamover-controller PR #124 (issue #73 phase 3,
commit 825d176), which added these rules on the source side but were
never pulled into OADP's bundled copy -- normally done via
`make update-kubevirt-datamover-manifests KUBEVIRT_DATAMOVER_PATH=...`,
done here by hand since no local checkout of that repo is available in
this environment.

This is a real, pre-existing gap (not introduced by this branch's other
changes) that this branch's e2e work would otherwise have hit blind, so
fixing it here rather than filing it separately.

Signed-off-by: Tiger Kaovilai <tkaovila@redhat.com>
kaovilai added a commit that referenced this pull request Aug 5, 2026
Adds a second temporary image override (KubeVirtDatamoverControllerImageKey ->
quay.io/tkaovila/kdm-controller:issue73-phase3) alongside the existing plugin
override, to exercise migtools/kubevirt-datamover-controller#124 (DataDownload
controller for VM restore, issue #73 phase 3) pre-merge -- directly relevant to
restore-from-CBT coverage.

Both overrides are temporary and should be removed once their respective PRs
merge.

Signed-off-by: Tiger Kaovilai <tkaovila@redhat.com>
kaovilai added a commit that referenced this pull request Aug 5, 2026
Closes the #99 "Restore from KDM CBT backup" gap, now unblocked by the
overridden kubevirt-datamover-controller image (migtools/kubevirt-datamover-
controller#124, DataDownload controller, issue #73 phase 3).

Per docs/design/kubevirt-datamover.md and the plugin's own README, restore
just needs a normal Velero Restore -- the VirtualMachine RestoreItemAction
plugin creates the DataDownload CR automatically from backup-recorded
annotations, and separately discards the restored VMB/VMBT so restore
doesn't re-trigger a backup. No manual CR driving needed, mirroring how
backup already works. Verifies success via the existing generic
lib.CreateRestoreFromBackup/IsRestoreDone/IsRestoreCompletedSuccessfully
helpers plus a new lib.GetDataDownloadForRestore (mirrors
GetDataUploadForBackup) confirming the DataDownload itself reached
status.phase=Completed -- proving the datamover path actually engaged,
not just that the restore completed some other way.

Extracted runKubevirtDMBackup (shared create+wait+verify-backup helper)
out of runSequenceBackup to avoid duplicating that logic a second time
for the restore test.

Also scaffolds two ginkgo.PIt (real, compiling, not run) for gaps
explicitly still open per kubevirt-datamover-controller#73's phased
plan: multi-disk restore (phase 4, not yet hardened -- new
cirros-test-multipvc-cbt.yaml template ready for when it lands) and
restore from an incremental (not full) backup (phase 5, not yet
e2e-validated upstream even though the chain-rebase logic may already
support it internally).

Not yet run against a real cluster.

Signed-off-by: Tiger Kaovilai <tkaovila@redhat.com>
kaovilai added a commit that referenced this pull request Aug 5, 2026
The manager ClusterRole shipped with OADP only granted access to
datauploads/datauploads.status -- there was no datadownloads,
datadownloads/status, or events permission at all. Without this, the
controller would hit RBAC-denied errors reconciling any DataDownload,
regardless of image correctness, once a real velero restore actually
tried to drive it (which migtools/kubevirt-datamover-plugin#41 now
makes possible).

Synced config/kubevirt-datamover-controller_rbac/role.yaml and the
matching block in bundle/manifests/oadp-operator.clusterserviceversion.yaml
(serviceAccountName: oadp-kubevirt-datamover-controller-manager) to
byte-match config/rbac/role.yaml from
migtools/kubevirt-datamover-controller PR #124 (issue #73 phase 3,
commit 825d176), which added these rules on the source side but were
never pulled into OADP's bundled copy -- normally done via
`make update-kubevirt-datamover-manifests KUBEVIRT_DATAMOVER_PATH=...`,
done here by hand since no local checkout of that repo is available in
this environment.

This is a real, pre-existing gap (not introduced by this branch's other
changes) that this branch's e2e work would otherwise have hit blind, so
fixing it here rather than filing it separately.

Signed-off-by: Tiger Kaovilai <tkaovila@redhat.com>
kaovilai added a commit that referenced this pull request Aug 13, 2026
Both fixes are now merged upstream: migtools/kubevirt-datamover-plugin#41
and #44 (VM-eager-start race, restore RIAs), and
migtools/kubevirt-datamover-controller#124 (issue #73 phase 3
DataDownload controller). The suite now exercises the default images
per the TODO this override block left for itself.

Signed-off-by: Tiger Kaovilai <tkaovila@redhat.com>
kaovilai added a commit that referenced this pull request Aug 25, 2026
 landed

migtools/kubevirt-datamover-controller#124 fixed openshift#169 (stale-sibling
DataDownload correlation now keys off velero.io/restore-name, not just
VM identity) and openshift#186 (issue #73 Phase 4) hardened per-disk DataDownload
isolation for multi-disk restores -- both scaffolded PIt placeholders can
now run as real specs. A third PIt in the same file (CNV-85377, an
external KubeVirt/CNV bug) is unrelated and left pending.

Signed-off-by: Tiger Kaovilai <tkaovila@redhat.com>
kaovilai added a commit that referenced this pull request Aug 26, 2026
 landed

migtools/kubevirt-datamover-controller#124 fixed openshift#169 (stale-sibling
DataDownload correlation now keys off velero.io/restore-name, not just
VM identity) and openshift#186 (issue #73 Phase 4) hardened per-disk DataDownload
isolation for multi-disk restores -- both scaffolded PIt placeholders can
now run as real specs. A third PIt in the same file (CNV-85377, an
external KubeVirt/CNV bug) is unrelated and left pending.

Signed-off-by: Tiger Kaovilai <tkaovila@redhat.com>
kaovilai added a commit that referenced this pull request Aug 27, 2026
 landed

migtools/kubevirt-datamover-controller#124 fixed openshift#169 (stale-sibling
DataDownload correlation now keys off velero.io/restore-name, not just
VM identity) and openshift#186 (issue #73 Phase 4) hardened per-disk DataDownload
isolation for multi-disk restores -- both scaffolded PIt placeholders can
now run as real specs. A third PIt in the same file (CNV-85377, an
external KubeVirt/CNV bug) is unrelated and left pending.

Signed-off-by: Tiger Kaovilai <tkaovila@redhat.com>
kaovilai added a commit that referenced this pull request Aug 27, 2026
…idation

Upstream blockers (kubevirt-datamover-controller#169, #73 phase 4) have
landed, so this un-pends 'restore run-state flip is not blocked by a
stale sibling DataDownload from a different restore attempt' and
'restore a multi-PVC VM from a kubevirt-datamover CBT backup'.

Live validation against real AWS/GCP/Azure clusters surfaced and fixed
several bugs along the way:
- the decoy DataDownload used in the run-state-flip test correlated by
  restore-uid instead of restore-name (the actual key the real fix
  uses), and used Status().Update() against a CRD version with no
  status subresource, which unconditionally 404s
- GetDataUploadForBackup could return before kubevirt_dataupload_controller
  had stamped the expected-backup-type annotation, racing the caller
- virt-controller's VirtualMachineBackup status can permanently stop
  advancing after successfully attaching the backup target PVC (its
  attach branch returns without writing a status condition or
  requeuing, see kubevirt/kubevirt pkg/storage/cbt/backup.go
  startBackup()), tracked as CNV-85377/CNV-89684 and reported upstream
  with a fix at kubevirt/kubevirt#18949. Until that merges,
  runKubevirtDMBackup polls manually and nudges the VMI (a harmless
  annotation patch forcing a fresh watch event) whenever
  kdm-controller's logs show the frozen pattern, giving the stuck
  reconcile a real chance to recover instead of waiting out or
  retrying the whole timeout. Confirmed working across dozens of live
  hits on both GCP and Azure. If the nudge doesn't unstick it before
  the timeout, the spec marks pending (no ginkgo-level retry) rather
  than failing on a known, tracked upstream bug.
- EnsureCommunityHcoCatalog/GetVirtOperator derived the OLM channel by
  guessing from the HCO index tag's numeric shape, which breaks for a
  moving tag like 'nightly' (channel has no relationship to the tag
  string). Channel is now discovered from the live PackageManifest
  instead, so hco_index_tag=nightly works through the existing
  community-HCO path -- letting future runs pick up kubevirt/kubevirt
  fixes (like #18949) as soon as they land in a nightly build, without
  pinning to a numbered release.

Signed-off-by: Tiger Kaovilai <tkaovila@redhat.com>
kaovilai added a commit that referenced this pull request Aug 27, 2026
…idation

Upstream blockers (kubevirt-datamover-controller#169, #73 phase 4) have
landed, so this un-pends 'restore run-state flip is not blocked by a
stale sibling DataDownload from a different restore attempt' and
'restore a multi-PVC VM from a kubevirt-datamover CBT backup'.

Live validation against real AWS/GCP/Azure clusters surfaced and fixed
several bugs along the way:
- the decoy DataDownload used in the run-state-flip test correlated by
  restore-uid instead of restore-name (the actual key the real fix
  uses), and used Status().Update() against a CRD version with no
  status subresource, which unconditionally 404s
- GetDataUploadForBackup could return before kubevirt_dataupload_controller
  had stamped the expected-backup-type annotation, racing the caller
- virt-controller's VirtualMachineBackup status can permanently stop
  advancing after successfully attaching the backup target PVC (its
  attach branch returns without writing a status condition or
  requeuing, see kubevirt/kubevirt pkg/storage/cbt/backup.go
  startBackup()), tracked as CNV-85377/CNV-89684 and reported upstream
  with a fix at kubevirt/kubevirt#18949. Until that merges,
  runKubevirtDMBackup polls manually and nudges the VMI (a harmless
  annotation patch forcing a fresh watch event) whenever
  kdm-controller's logs show the frozen pattern, giving the stuck
  reconcile a real chance to recover instead of waiting out or
  retrying the whole timeout. Confirmed working across dozens of live
  hits on both GCP and Azure. If the nudge doesn't unstick it before
  the timeout, the spec marks pending (no ginkgo-level retry) rather
  than failing on a known, tracked upstream bug.
- EnsureCommunityHcoCatalog/GetVirtOperator derived the OLM channel by
  guessing from the HCO index tag's numeric shape, which breaks for a
  moving tag like 'nightly' (channel has no relationship to the tag
  string). Channel is now discovered from the live PackageManifest
  instead (filtered by its catalog= label, since more than one
  CatalogSource can publish a manifest under the same package name --
  getCsvFromPackageManifest's own separate, unfiltered lookup had the
  exact same bug, fixed the same way), so hco_index_tag=nightly works
  through the existing community-HCO path.
- HCO_INDEX_TAG's Makefile default is now "nightly" instead of a pinned
  "1.18.0", so every virt/kdm e2e run (local and CI) picks up
  kubevirt/kubevirt fixes like #18949 automatically as soon as they
  land in a nightly build, with no version bump needed on our side.
  Override to a pinned release for a reproducible/stable run instead.

Signed-off-by: Tiger Kaovilai <tkaovila@redhat.com>
kaovilai added a commit that referenced this pull request Aug 27, 2026
…idation

Upstream blockers (kubevirt-datamover-controller#169, #73 phase 4) have
landed, so this un-pends 'restore run-state flip is not blocked by a
stale sibling DataDownload from a different restore attempt' and
'restore a multi-PVC VM from a kubevirt-datamover CBT backup'.

Live validation against real AWS/GCP/Azure clusters surfaced and fixed
several bugs along the way:
- the decoy DataDownload used in the run-state-flip test correlated by
  restore-uid instead of restore-name (the actual key the real fix
  uses), and used Status().Update() against a CRD version with no
  status subresource, which unconditionally 404s
- GetDataUploadForBackup could return before kubevirt_dataupload_controller
  had stamped the expected-backup-type annotation, racing the caller
- virt-controller's VirtualMachineBackup status can permanently stop
  advancing after successfully attaching the backup target PVC (its
  attach branch returns without writing a status condition or
  requeuing, see kubevirt/kubevirt pkg/storage/cbt/backup.go
  startBackup()), tracked as CNV-85377/CNV-89684 and reported upstream
  with a fix at kubevirt/kubevirt#18949. Until that merges,
  runKubevirtDMBackup polls manually and nudges the VMI (a harmless
  annotation patch forcing a fresh watch event) whenever
  kdm-controller's logs show the frozen pattern, giving the stuck
  reconcile a real chance to recover instead of waiting out or
  retrying the whole timeout. Confirmed working across dozens of live
  hits on both GCP and Azure. If the nudge doesn't unstick it before
  the timeout, the spec marks pending (no ginkgo-level retry) rather
  than failing on a known, tracked upstream bug.
- a second, distinct upstream bug found testing against kubevirt
  nightly: reconcileStart() (same file) can mark an
  already-successfully-completed VirtualMachineBackup Failed with
  reason SourceLost -- vmi.Status.ChangedBlockTracking.BackupStatus
  being nil is treated unconditionally as "status lost mid-flight",
  but virt-handler also clears that same field as part of normal
  post-completion cleanup. Introduced by kubevirt's June 2026
  "observation-driven dispatch" restructure; distinct from the
  attach-freeze bug above. This only ever surfaces as a Kubernetes
  Event (never in any pod's log), so runKubevirtDMBackup's poll now
  also checks the VM namespace's own events, not just kdm-controller's
  log, for known-flake patterns.
- EnsureCommunityHcoCatalog/GetVirtOperator derived the OLM channel by
  guessing from the HCO index tag's numeric shape, which breaks for a
  moving tag like 'nightly' (channel has no relationship to the tag
  string). Channel is now discovered from the live PackageManifest
  instead (filtered by its catalog= label, since more than one
  CatalogSource can publish a manifest under the same package name --
  getCsvFromPackageManifest's own separate, unfiltered lookup had the
  exact same bug, fixed the same way), so hco_index_tag=nightly works
  through the existing community-HCO path.
- HCO_INDEX_TAG's Makefile default is now "nightly" instead of a pinned
  "1.18.0", so every virt/kdm e2e run (local and CI) picks up
  kubevirt/kubevirt fixes like #18949 automatically as soon as they
  land in a nightly build, with no version bump needed on our side.
  Override to a pinned release for a reproducible/stable run instead.

Signed-off-by: Tiger Kaovilai <tkaovila@redhat.com>
kaovilai added a commit that referenced this pull request Aug 27, 2026
…idation

Upstream blockers (kubevirt-datamover-controller#169, #73 phase 4) have
landed, so this un-pends 'restore run-state flip is not blocked by a
stale sibling DataDownload from a different restore attempt' and
'restore a multi-PVC VM from a kubevirt-datamover CBT backup'.

Live validation against real AWS/GCP/Azure clusters surfaced and fixed
several bugs along the way:
- the decoy DataDownload used in the run-state-flip test correlated by
  restore-uid instead of restore-name (the actual key the real fix
  uses), and used Status().Update() against a CRD version with no
  status subresource, which unconditionally 404s
- GetDataUploadForBackup could return before kubevirt_dataupload_controller
  had stamped the expected-backup-type annotation, racing the caller
- virt-controller's VirtualMachineBackup status can permanently stop
  advancing after successfully attaching the backup target PVC (its
  attach branch returns without writing a status condition or
  requeuing, see kubevirt/kubevirt pkg/storage/cbt/backup.go
  startBackup()), tracked as CNV-85377/CNV-89684 and reported upstream
  with a fix at kubevirt/kubevirt#18949. Until that merges,
  runKubevirtDMBackup polls manually and nudges the VMI (a harmless
  annotation patch forcing a fresh watch event) whenever
  kdm-controller's logs show the frozen pattern, giving the stuck
  reconcile a real chance to recover instead of waiting out or
  retrying the whole timeout. Confirmed working across dozens of live
  hits on both GCP and Azure. If the nudge doesn't unstick it before
  the timeout, the spec marks pending (no ginkgo-level retry) rather
  than failing on a known, tracked upstream bug.
- a second, distinct upstream bug found testing against kubevirt
  nightly: reconcileStart() (same file) can mark an
  already-successfully-completed VirtualMachineBackup Failed with
  reason SourceLost -- vmi.Status.ChangedBlockTracking.BackupStatus
  being nil is treated unconditionally as "status lost mid-flight",
  but virt-handler also clears that same field as part of normal
  post-completion cleanup. Introduced by kubevirt's June 2026
  "observation-driven dispatch" restructure; distinct from the
  attach-freeze bug above. This only ever surfaces as a Kubernetes
  Event (never in any pod's log), so runKubevirtDMBackup's poll now
  also checks the VM namespace's own events, not just kdm-controller's
  log, for known-flake patterns.
- EnsureCommunityHcoCatalog/GetVirtOperator derived the OLM channel by
  guessing from the HCO index tag's numeric shape, which breaks for a
  moving tag like 'nightly' (channel has no relationship to the tag
  string). Channel is now discovered from the live PackageManifest
  instead (filtered by its catalog= label, since more than one
  CatalogSource can publish a manifest under the same package name --
  getCsvFromPackageManifest's own separate, unfiltered lookup had the
  exact same bug, fixed the same way), so hco_index_tag=nightly works
  through the existing community-HCO path.
- HCO_INDEX_TAG's Makefile default is now "nightly" instead of a pinned
  "1.18.0", so every virt/kdm e2e run (local and CI) picks up
  kubevirt/kubevirt fixes like #18949 automatically as soon as they
  land in a nightly build, with no version bump needed on our side.
  Override to a pinned release for a reproducible/stable run instead.

Signed-off-by: Tiger Kaovilai <tkaovila@redhat.com>
kaovilai added a commit that referenced this pull request Aug 27, 2026
…idation

Upstream blockers (kubevirt-datamover-controller#169, #73 phase 4) have
landed, so this un-pends 'restore run-state flip is not blocked by a
stale sibling DataDownload from a different restore attempt' and
'restore a multi-PVC VM from a kubevirt-datamover CBT backup'.

Live validation against real AWS/GCP/Azure clusters surfaced and fixed
several bugs along the way:
- the decoy DataDownload used in the run-state-flip test correlated by
  restore-uid instead of restore-name (the actual key the real fix
  uses), and used Status().Update() against a CRD version with no
  status subresource, which unconditionally 404s
- GetDataUploadForBackup could return before kubevirt_dataupload_controller
  had stamped the expected-backup-type annotation, racing the caller
- virt-controller's VirtualMachineBackup status can permanently stop
  advancing after successfully attaching the backup target PVC (its
  attach branch returns without writing a status condition or
  requeuing, see kubevirt/kubevirt pkg/storage/cbt/backup.go
  startBackup()), tracked as CNV-85377/CNV-89684 and reported upstream
  with a fix at kubevirt/kubevirt#18949. Until that merges,
  runKubevirtDMBackup polls manually and nudges the VMI (a harmless
  annotation patch forcing a fresh watch event) whenever
  kdm-controller's logs show the frozen pattern, giving the stuck
  reconcile a real chance to recover instead of waiting out or
  retrying the whole timeout. Confirmed working across dozens of live
  hits on both GCP and Azure. If the nudge doesn't unstick it before
  the timeout, the spec marks pending (no ginkgo-level retry) rather
  than failing on a known, tracked upstream bug.
- a second, distinct upstream bug found testing against kubevirt
  nightly: reconcileStart() (same file) can mark an
  already-successfully-completed VirtualMachineBackup Failed with
  reason SourceLost -- vmi.Status.ChangedBlockTracking.BackupStatus
  being nil is treated unconditionally as "status lost mid-flight",
  but virt-handler also clears that same field as part of normal
  post-completion cleanup. Introduced by kubevirt's June 2026
  "observation-driven dispatch" restructure; distinct from the
  attach-freeze bug above. This only ever surfaces as a Kubernetes
  Event (never in any pod's log), so runKubevirtDMBackup's poll now
  also checks the VM namespace's own events, not just kdm-controller's
  log, for known-flake patterns.
- EnsureCommunityHcoCatalog/GetVirtOperator derived the OLM channel by
  guessing from the HCO index tag's numeric shape, which breaks for a
  moving tag like 'nightly' (channel has no relationship to the tag
  string). Channel is now discovered from the live PackageManifest
  instead (filtered by its catalog= label, since more than one
  CatalogSource can publish a manifest under the same package name --
  getCsvFromPackageManifest's own separate, unfiltered lookup had the
  exact same bug, fixed the same way), so hco_index_tag=nightly works
  through the existing community-HCO path.
- HCO_INDEX_TAG's Makefile default is now "nightly" instead of a pinned
  "1.18.0", so every virt/kdm e2e run (local and CI) picks up
  kubevirt/kubevirt fixes like #18949 automatically as soon as they
  land in a nightly build, with no version bump needed on our side.
  Override to a pinned release for a reproducible/stable run instead.

Signed-off-by: Tiger Kaovilai <tkaovila@redhat.com>
kaovilai added a commit that referenced this pull request Aug 27, 2026
…idation

Upstream blockers (kubevirt-datamover-controller#169, #73 phase 4) have
landed, so this un-pends 'restore run-state flip is not blocked by a
stale sibling DataDownload from a different restore attempt' and
'restore a multi-PVC VM from a kubevirt-datamover CBT backup'.

Live validation against real AWS/GCP/Azure clusters surfaced and fixed
several bugs along the way:
- the decoy DataDownload used in the run-state-flip test correlated by
  restore-uid instead of restore-name (the actual key the real fix
  uses), and used Status().Update() against a CRD version with no
  status subresource, which unconditionally 404s
- GetDataUploadForBackup could return before kubevirt_dataupload_controller
  had stamped the expected-backup-type annotation, racing the caller
- virt-controller's VirtualMachineBackup status can permanently stop
  advancing after successfully attaching the backup target PVC (its
  attach branch returns without writing a status condition or
  requeuing, see kubevirt/kubevirt pkg/storage/cbt/backup.go
  startBackup()), tracked as CNV-85377/CNV-89684 and reported upstream
  with a fix at kubevirt/kubevirt#18949. Until that merges,
  runKubevirtDMBackup polls manually and nudges the VMI (a harmless
  annotation patch forcing a fresh watch event) whenever
  kdm-controller's logs show the frozen pattern, giving the stuck
  reconcile a real chance to recover instead of waiting out or
  retrying the whole timeout. Confirmed working across dozens of live
  hits on both GCP and Azure. If the nudge doesn't unstick it before
  the timeout, the spec marks pending (no ginkgo-level retry) rather
  than failing on a known, tracked upstream bug.
- a second, distinct upstream bug found testing against kubevirt
  nightly: reconcileStart() (same file) can mark an
  already-successfully-completed VirtualMachineBackup Failed with
  reason SourceLost -- vmi.Status.ChangedBlockTracking.BackupStatus
  being nil is treated unconditionally as "status lost mid-flight",
  but virt-handler also clears that same field as part of normal
  post-completion cleanup. Introduced by kubevirt's June 2026
  "observation-driven dispatch" restructure; distinct from the
  attach-freeze bug above. This only ever surfaces as a Kubernetes
  Event (never in any pod's log), so runKubevirtDMBackup's poll now
  also checks the VM namespace's own events, not just kdm-controller's
  log, for known-flake patterns.
- EnsureCommunityHcoCatalog/GetVirtOperator derived the OLM channel by
  guessing from the HCO index tag's numeric shape, which breaks for a
  moving tag like 'nightly' (channel has no relationship to the tag
  string). Channel is now discovered from the live PackageManifest
  instead (filtered by its catalog= label, since more than one
  CatalogSource can publish a manifest under the same package name --
  getCsvFromPackageManifest's own separate, unfiltered lookup had the
  exact same bug, fixed the same way), so hco_index_tag=nightly works
  through the existing community-HCO path.
- HCO_INDEX_TAG's Makefile default is now "nightly" instead of a pinned
  "1.18.0", so every virt/kdm e2e run (local and CI) picks up
  kubevirt/kubevirt fixes like #18949 automatically as soon as they
  land in a nightly build, with no version bump needed on our side.
  Override to a pinned release for a reproducible/stable run instead.

Signed-off-by: Tiger Kaovilai <tkaovila@redhat.com>
kaovilai added a commit that referenced this pull request Aug 27, 2026
…idation

Upstream blockers (kubevirt-datamover-controller#169, #73 phase 4) have
landed, so this un-pends 'restore run-state flip is not blocked by a
stale sibling DataDownload from a different restore attempt' and
'restore a multi-PVC VM from a kubevirt-datamover CBT backup'.

Live validation against real AWS/GCP/Azure clusters surfaced and fixed
several bugs along the way:
- the decoy DataDownload used in the run-state-flip test correlated by
  restore-uid instead of restore-name (the actual key the real fix
  uses), and used Status().Update() against a CRD version with no
  status subresource, which unconditionally 404s
- GetDataUploadForBackup could return before kubevirt_dataupload_controller
  had stamped the expected-backup-type annotation, racing the caller
- virt-controller's VirtualMachineBackup status can permanently stop
  advancing after successfully attaching the backup target PVC (its
  attach branch returns without writing a status condition or
  requeuing, see kubevirt/kubevirt pkg/storage/cbt/backup.go
  startBackup()), tracked as CNV-85377/CNV-89684 and reported upstream
  with a fix at kubevirt/kubevirt#18949. Until that merges,
  runKubevirtDMBackup polls manually and nudges the VMI (a harmless
  annotation patch forcing a fresh watch event) whenever
  kdm-controller's logs show the frozen pattern, giving the stuck
  reconcile a real chance to recover instead of waiting out or
  retrying the whole timeout. Confirmed working across dozens of live
  hits on both GCP and Azure. If the nudge doesn't unstick it before
  the timeout, the spec marks pending (no ginkgo-level retry) rather
  than failing on a known, tracked upstream bug.
- a second, distinct upstream bug found testing against kubevirt
  nightly: reconcileStart() (same file) can mark an
  already-successfully-completed VirtualMachineBackup Failed with
  reason SourceLost -- vmi.Status.ChangedBlockTracking.BackupStatus
  being nil is treated unconditionally as "status lost mid-flight",
  but virt-handler also clears that same field as part of normal
  post-completion cleanup. Introduced by kubevirt's June 2026
  "observation-driven dispatch" restructure; distinct from the
  attach-freeze bug above. This only ever surfaces as a Kubernetes
  Event (never in any pod's log), so runKubevirtDMBackup's poll now
  also checks the VM namespace's own events, not just kdm-controller's
  log, for known-flake patterns.
- EnsureCommunityHcoCatalog/GetVirtOperator derived the OLM channel by
  guessing from the HCO index tag's numeric shape, which breaks for a
  moving tag like 'nightly' (channel has no relationship to the tag
  string). Channel is now discovered from the live PackageManifest
  instead (filtered by its catalog= label, since more than one
  CatalogSource can publish a manifest under the same package name --
  getCsvFromPackageManifest's own separate, unfiltered lookup had the
  exact same bug, fixed the same way), so hco_index_tag=nightly works
  through the existing community-HCO path.
- HCO_INDEX_TAG's Makefile default is now "nightly" instead of a pinned
  "1.18.0", so every virt/kdm e2e run (local and CI) picks up
  kubevirt/kubevirt fixes like #18949 automatically as soon as they
  land in a nightly build, with no version bump needed on our side.
  Override to a pinned release for a reproducible/stable run instead.

Signed-off-by: Tiger Kaovilai <tkaovila@redhat.com>
kaovilai added a commit that referenced this pull request Aug 27, 2026
…idation

Upstream blockers (kubevirt-datamover-controller#169, #73 phase 4) have
landed, so this un-pends 'restore run-state flip is not blocked by a
stale sibling DataDownload from a different restore attempt' and
'restore a multi-PVC VM from a kubevirt-datamover CBT backup'.

Live validation against real AWS/GCP/Azure clusters surfaced and fixed
several bugs along the way:
- the decoy DataDownload used in the run-state-flip test correlated by
  restore-uid instead of restore-name (the actual key the real fix
  uses), and used Status().Update() against a CRD version with no
  status subresource, which unconditionally 404s
- GetDataUploadForBackup could return before kubevirt_dataupload_controller
  had stamped the expected-backup-type annotation, racing the caller
- virt-controller's VirtualMachineBackup status can permanently stop
  advancing after successfully attaching the backup target PVC (its
  attach branch returns without writing a status condition or
  requeuing, see kubevirt/kubevirt pkg/storage/cbt/backup.go
  startBackup()), tracked as CNV-85377/CNV-89684 and reported upstream
  with a fix at kubevirt/kubevirt#18949. Until that merges,
  runKubevirtDMBackup polls manually and nudges the VMI (a harmless
  annotation patch forcing a fresh watch event) whenever
  kdm-controller's logs show the frozen pattern, giving the stuck
  reconcile a real chance to recover instead of waiting out or
  retrying the whole timeout. Confirmed working across dozens of live
  hits on both GCP and Azure. If the nudge doesn't unstick it before
  the timeout, the spec marks pending (no ginkgo-level retry) rather
  than failing on a known, tracked upstream bug.
- a second, distinct upstream bug found testing against kubevirt
  nightly: reconcileStart() (same file) can mark an
  already-successfully-completed VirtualMachineBackup Failed with
  reason SourceLost -- vmi.Status.ChangedBlockTracking.BackupStatus
  being nil is treated unconditionally as "status lost mid-flight",
  but virt-handler also clears that same field as part of normal
  post-completion cleanup. Introduced by kubevirt's June 2026
  "observation-driven dispatch" restructure; distinct from the
  attach-freeze bug above. This only ever surfaces as a Kubernetes
  Event (never in any pod's log), so runKubevirtDMBackup's poll now
  also checks the VM namespace's own events, not just kdm-controller's
  log, for known-flake patterns.
- EnsureCommunityHcoCatalog/GetVirtOperator derived the OLM channel by
  guessing from the HCO index tag's numeric shape, which breaks for a
  moving tag like 'nightly' (channel has no relationship to the tag
  string). Channel is now discovered from the live PackageManifest
  instead (filtered by its catalog= label, since more than one
  CatalogSource can publish a manifest under the same package name --
  getCsvFromPackageManifest's own separate, unfiltered lookup had the
  exact same bug, fixed the same way), so hco_index_tag=nightly works
  through the existing community-HCO path.
- HCO_INDEX_TAG's Makefile default is now "nightly" instead of a pinned
  "1.18.0", so every virt/kdm e2e run (local and CI) picks up
  kubevirt/kubevirt fixes like #18949 automatically as soon as they
  land in a nightly build, with no version bump needed on our side.
  Override to a pinned release for a reproducible/stable run instead.

Signed-off-by: Tiger Kaovilai <tkaovila@redhat.com>
kaovilai added a commit that referenced this pull request Aug 27, 2026
…idation

Upstream blockers (kubevirt-datamover-controller#169, #73 phase 4) have
landed, so this un-pends 'restore run-state flip is not blocked by a
stale sibling DataDownload from a different restore attempt' and
'restore a multi-PVC VM from a kubevirt-datamover CBT backup'.

Live validation against real AWS/GCP/Azure clusters surfaced and fixed
several bugs along the way:
- the decoy DataDownload used in the run-state-flip test correlated by
  restore-uid instead of restore-name (the actual key the real fix
  uses), and used Status().Update() against a CRD version with no
  status subresource, which unconditionally 404s
- GetDataUploadForBackup could return before kubevirt_dataupload_controller
  had stamped the expected-backup-type annotation, racing the caller
- virt-controller's VirtualMachineBackup status can permanently stop
  advancing after successfully attaching the backup target PVC (its
  attach branch returns without writing a status condition or
  requeuing, see kubevirt/kubevirt pkg/storage/cbt/backup.go
  startBackup()), tracked as CNV-85377/CNV-89684 and reported upstream
  with a fix at kubevirt/kubevirt#18949. Until that merges,
  runKubevirtDMBackup polls manually and nudges the VMI (a harmless
  annotation patch forcing a fresh watch event) whenever
  kdm-controller's logs show the frozen pattern, giving the stuck
  reconcile a real chance to recover instead of waiting out or
  retrying the whole timeout. Confirmed working across dozens of live
  hits on both GCP and Azure. If the nudge doesn't unstick it before
  the timeout, the spec marks pending (no ginkgo-level retry) rather
  than failing on a known, tracked upstream bug.
- a second, distinct upstream bug found testing against kubevirt
  nightly: reconcileStart() (same file) can mark an
  already-successfully-completed VirtualMachineBackup Failed with
  reason SourceLost -- vmi.Status.ChangedBlockTracking.BackupStatus
  being nil is treated unconditionally as "status lost mid-flight",
  but virt-handler also clears that same field as part of normal
  post-completion cleanup. Introduced by kubevirt's June 2026
  "observation-driven dispatch" restructure; distinct from the
  attach-freeze bug above. This only ever surfaces as a Kubernetes
  Event (never in any pod's log), so runKubevirtDMBackup's poll now
  also checks the VM namespace's own events, not just kdm-controller's
  log, for known-flake patterns.
- EnsureCommunityHcoCatalog/GetVirtOperator derived the OLM channel by
  guessing from the HCO index tag's numeric shape, which breaks for a
  moving tag like 'nightly' (channel has no relationship to the tag
  string). Channel is now discovered from the live PackageManifest
  instead (filtered by its catalog= label, since more than one
  CatalogSource can publish a manifest under the same package name --
  getCsvFromPackageManifest's own separate, unfiltered lookup had the
  exact same bug, fixed the same way), so hco_index_tag=nightly works
  through the existing community-HCO path.
- HCO_INDEX_TAG's Makefile default is now "nightly" instead of a pinned
  "1.18.0", so every virt/kdm e2e run (local and CI) picks up
  kubevirt/kubevirt fixes like #18949 automatically as soon as they
  land in a nightly build, with no version bump needed on our side.
  Override to a pinned release for a reproducible/stable run instead.

Signed-off-by: Tiger Kaovilai <tkaovila@redhat.com>
kaovilai added a commit that referenced this pull request Aug 27, 2026
…idation

Upstream blockers (kubevirt-datamover-controller#169, #73 phase 4) have
landed, so this un-pends 'restore run-state flip is not blocked by a
stale sibling DataDownload from a different restore attempt' and
'restore a multi-PVC VM from a kubevirt-datamover CBT backup'.

Live validation against real AWS/GCP/Azure clusters surfaced and fixed
several bugs along the way:
- the decoy DataDownload used in the run-state-flip test correlated by
  restore-uid instead of restore-name (the actual key the real fix
  uses), and used Status().Update() against a CRD version with no
  status subresource, which unconditionally 404s
- GetDataUploadForBackup could return before kubevirt_dataupload_controller
  had stamped the expected-backup-type annotation, racing the caller
- virt-controller's VirtualMachineBackup status can permanently stop
  advancing after successfully attaching the backup target PVC (its
  attach branch returns without writing a status condition or
  requeuing, see kubevirt/kubevirt pkg/storage/cbt/backup.go
  startBackup()), tracked as CNV-85377/CNV-89684 and reported upstream
  with a fix at kubevirt/kubevirt#18949. Until that merges,
  runKubevirtDMBackup polls manually and nudges the VMI (a harmless
  annotation patch forcing a fresh watch event) whenever
  kdm-controller's logs show the frozen pattern, giving the stuck
  reconcile a real chance to recover instead of waiting out or
  retrying the whole timeout. Confirmed working across dozens of live
  hits on both GCP and Azure. If the nudge doesn't unstick it before
  the timeout, the spec marks pending (no ginkgo-level retry) rather
  than failing on a known, tracked upstream bug.
- a second, distinct upstream bug found testing against kubevirt
  nightly: reconcileStart() (same file) can mark an
  already-successfully-completed VirtualMachineBackup Failed with
  reason SourceLost -- vmi.Status.ChangedBlockTracking.BackupStatus
  being nil is treated unconditionally as "status lost mid-flight",
  but virt-handler also clears that same field as part of normal
  post-completion cleanup. Introduced by kubevirt's June 2026
  "observation-driven dispatch" restructure; distinct from the
  attach-freeze bug above. This only ever surfaces as a Kubernetes
  Event (never in any pod's log), so runKubevirtDMBackup's poll now
  also checks the VM namespace's own events, not just kdm-controller's
  log, for known-flake patterns.
- EnsureCommunityHcoCatalog/GetVirtOperator derived the OLM channel by
  guessing from the HCO index tag's numeric shape, which breaks for a
  moving tag like 'nightly' (channel has no relationship to the tag
  string). Channel is now discovered from the live PackageManifest
  instead (filtered by its catalog= label, since more than one
  CatalogSource can publish a manifest under the same package name --
  getCsvFromPackageManifest's own separate, unfiltered lookup had the
  exact same bug, fixed the same way), so hco_index_tag=nightly works
  through the existing community-HCO path.
- HCO_INDEX_TAG's Makefile default is now "nightly" instead of a pinned
  "1.18.0", so every virt/kdm e2e run (local and CI) picks up
  kubevirt/kubevirt fixes like #18949 automatically as soon as they
  land in a nightly build, with no version bump needed on our side.
  Override to a pinned release for a reproducible/stable run instead.

Signed-off-by: Tiger Kaovilai <tkaovila@redhat.com>
kaovilai added a commit that referenced this pull request Aug 28, 2026
…idation

Upstream blockers (kubevirt-datamover-controller#169, #73 phase 4) have
landed, so this un-pends 'restore run-state flip is not blocked by a
stale sibling DataDownload from a different restore attempt' and
'restore a multi-PVC VM from a kubevirt-datamover CBT backup'.

Live validation against real AWS/GCP/Azure clusters surfaced and fixed
several bugs along the way:
- the decoy DataDownload used in the run-state-flip test correlated by
  restore-uid instead of restore-name (the actual key the real fix
  uses), and used Status().Update() against a CRD version with no
  status subresource, which unconditionally 404s
- GetDataUploadForBackup could return before kubevirt_dataupload_controller
  had stamped the expected-backup-type annotation, racing the caller
- virt-controller's VirtualMachineBackup status can permanently stop
  advancing after successfully attaching the backup target PVC (its
  attach branch returns without writing a status condition or
  requeuing, see kubevirt/kubevirt pkg/storage/cbt/backup.go
  startBackup()), tracked as CNV-85377/CNV-89684 and reported upstream
  with a fix at kubevirt/kubevirt#18949. Until that merges,
  runKubevirtDMBackup polls manually and nudges the VMI (a harmless
  annotation patch forcing a fresh watch event) whenever
  kdm-controller's logs show the frozen pattern, giving the stuck
  reconcile a real chance to recover instead of waiting out or
  retrying the whole timeout. Confirmed working across dozens of live
  hits on both GCP and Azure. If the nudge doesn't unstick it before
  the timeout, the spec marks pending (no ginkgo-level retry) rather
  than failing on a known, tracked upstream bug.
- a second, distinct upstream bug found testing against kubevirt
  nightly: reconcileStart() (same file) can mark an
  already-successfully-completed VirtualMachineBackup Failed with
  reason SourceLost -- vmi.Status.ChangedBlockTracking.BackupStatus
  being nil is treated unconditionally as "status lost mid-flight",
  but virt-handler also clears that same field as part of normal
  post-completion cleanup. Introduced by kubevirt's June 2026
  "observation-driven dispatch" restructure; distinct from the
  attach-freeze bug above. This only ever surfaces as a Kubernetes
  Event (never in any pod's log), so runKubevirtDMBackup's poll now
  also checks the VM namespace's own events, not just kdm-controller's
  log, for known-flake patterns.
- EnsureCommunityHcoCatalog/GetVirtOperator derived the OLM channel by
  guessing from the HCO index tag's numeric shape, which breaks for a
  moving tag like 'nightly' (channel has no relationship to the tag
  string). Channel is now discovered from the live PackageManifest
  instead (filtered by its catalog= label, since more than one
  CatalogSource can publish a manifest under the same package name --
  getCsvFromPackageManifest's own separate, unfiltered lookup had the
  exact same bug, fixed the same way), so hco_index_tag=nightly works
  through the existing community-HCO path.
- HCO_INDEX_TAG's Makefile default is now "nightly" instead of a pinned
  "1.18.0", so every virt/kdm e2e run (local and CI) picks up
  kubevirt/kubevirt fixes like #18949 automatically as soon as they
  land in a nightly build, with no version bump needed on our side.
  Override to a pinned release for a reproducible/stable run instead.

Signed-off-by: Tiger Kaovilai <tkaovila@redhat.com>
kaovilai added a commit that referenced this pull request Aug 28, 2026
…idation

Upstream blockers (kubevirt-datamover-controller#169, #73 phase 4) have
landed, so this un-pends 'restore run-state flip is not blocked by a
stale sibling DataDownload from a different restore attempt' and
'restore a multi-PVC VM from a kubevirt-datamover CBT backup'.

Live validation against real AWS/GCP/Azure clusters surfaced and fixed
several bugs along the way:
- the decoy DataDownload used in the run-state-flip test correlated by
  restore-uid instead of restore-name (the actual key the real fix
  uses), and used Status().Update() against a CRD version with no
  status subresource, which unconditionally 404s
- GetDataUploadForBackup could return before kubevirt_dataupload_controller
  had stamped the expected-backup-type annotation, racing the caller
- virt-controller's VirtualMachineBackup status can permanently stop
  advancing after successfully attaching the backup target PVC (its
  attach branch returns without writing a status condition or
  requeuing, see kubevirt/kubevirt pkg/storage/cbt/backup.go
  startBackup()), tracked as CNV-85377/CNV-89684 and reported upstream
  with a fix at kubevirt/kubevirt#18949. Until that merges,
  runKubevirtDMBackup polls manually and nudges the VMI (a harmless
  annotation patch forcing a fresh watch event) whenever
  kdm-controller's logs show the frozen pattern, giving the stuck
  reconcile a real chance to recover instead of waiting out or
  retrying the whole timeout. Confirmed working across dozens of live
  hits on both GCP and Azure. If the nudge doesn't unstick it before
  the timeout, the spec marks pending (no ginkgo-level retry) rather
  than failing on a known, tracked upstream bug.
- a second, distinct upstream bug found testing against kubevirt
  nightly: reconcileStart() (same file) can mark an
  already-successfully-completed VirtualMachineBackup Failed with
  reason SourceLost -- vmi.Status.ChangedBlockTracking.BackupStatus
  being nil is treated unconditionally as "status lost mid-flight",
  but virt-handler also clears that same field as part of normal
  post-completion cleanup. Introduced by kubevirt's June 2026
  "observation-driven dispatch" restructure; distinct from the
  attach-freeze bug above. This only ever surfaces as a Kubernetes
  Event (never in any pod's log), so runKubevirtDMBackup's poll now
  also checks the VM namespace's own events, not just kdm-controller's
  log, for known-flake patterns.
- EnsureCommunityHcoCatalog/GetVirtOperator derived the OLM channel by
  guessing from the HCO index tag's numeric shape, which breaks for a
  moving tag like 'nightly' (channel has no relationship to the tag
  string). Channel is now discovered from the live PackageManifest
  instead (filtered by its catalog= label, since more than one
  CatalogSource can publish a manifest under the same package name --
  getCsvFromPackageManifest's own separate, unfiltered lookup had the
  exact same bug, fixed the same way), so hco_index_tag=nightly works
  through the existing community-HCO path.
- HCO_INDEX_TAG's Makefile default is now "nightly" instead of a pinned
  "1.18.0", so every virt/kdm e2e run (local and CI) picks up
  kubevirt/kubevirt fixes like #18949 automatically as soon as they
  land in a nightly build, with no version bump needed on our side.
  Override to a pinned release for a reproducible/stable run instead.

Signed-off-by: Tiger Kaovilai <tkaovila@redhat.com>
kaovilai added a commit that referenced this pull request Aug 28, 2026
…idation

Upstream blockers (kubevirt-datamover-controller#169, #73 phase 4) have
landed, so this un-pends 'restore run-state flip is not blocked by a
stale sibling DataDownload from a different restore attempt' and
'restore a multi-PVC VM from a kubevirt-datamover CBT backup'.

Live validation against real AWS/GCP/Azure clusters surfaced and fixed
several bugs along the way:
- the decoy DataDownload used in the run-state-flip test correlated by
  restore-uid instead of restore-name (the actual key the real fix
  uses), and used Status().Update() against a CRD version with no
  status subresource, which unconditionally 404s
- GetDataUploadForBackup could return before kubevirt_dataupload_controller
  had stamped the expected-backup-type annotation, racing the caller
- virt-controller's VirtualMachineBackup status can permanently stop
  advancing after successfully attaching the backup target PVC (its
  attach branch returns without writing a status condition or
  requeuing, see kubevirt/kubevirt pkg/storage/cbt/backup.go
  startBackup()), tracked as CNV-85377/CNV-89684 and reported upstream
  with a fix at kubevirt/kubevirt#18949. Until that merges,
  runKubevirtDMBackup polls manually and nudges the VMI (a harmless
  annotation patch forcing a fresh watch event) whenever
  kdm-controller's logs show the frozen pattern, giving the stuck
  reconcile a real chance to recover instead of waiting out or
  retrying the whole timeout. Confirmed working across dozens of live
  hits on both GCP and Azure. If the nudge doesn't unstick it before
  the timeout, the spec marks pending (no ginkgo-level retry) rather
  than failing on a known, tracked upstream bug.
- a second, distinct upstream bug found testing against kubevirt
  nightly: reconcileStart() (same file) can mark an
  already-successfully-completed VirtualMachineBackup Failed with
  reason SourceLost -- vmi.Status.ChangedBlockTracking.BackupStatus
  being nil is treated unconditionally as "status lost mid-flight",
  but virt-handler also clears that same field as part of normal
  post-completion cleanup. Introduced by kubevirt's June 2026
  "observation-driven dispatch" restructure; distinct from the
  attach-freeze bug above. This only ever surfaces as a Kubernetes
  Event (never in any pod's log), so runKubevirtDMBackup's poll now
  also checks the VM namespace's own events, not just kdm-controller's
  log, for known-flake patterns.
- EnsureCommunityHcoCatalog/GetVirtOperator derived the OLM channel by
  guessing from the HCO index tag's numeric shape, which breaks for a
  moving tag like 'nightly' (channel has no relationship to the tag
  string). Channel is now discovered from the live PackageManifest
  instead (filtered by its catalog= label, since more than one
  CatalogSource can publish a manifest under the same package name --
  getCsvFromPackageManifest's own separate, unfiltered lookup had the
  exact same bug, fixed the same way), so hco_index_tag=nightly works
  through the existing community-HCO path.
- HCO_INDEX_TAG's Makefile default is now "nightly" instead of a pinned
  "1.18.0", so every virt/kdm e2e run (local and CI) picks up
  kubevirt/kubevirt fixes like #18949 automatically as soon as they
  land in a nightly build, with no version bump needed on our side.
  Override to a pinned release for a reproducible/stable run instead.

Signed-off-by: Tiger Kaovilai <tkaovila@redhat.com>
kaovilai added a commit that referenced this pull request Aug 28, 2026
…idation

Upstream blockers (kubevirt-datamover-controller#169, #73 phase 4) have
landed, so this un-pends 'restore run-state flip is not blocked by a
stale sibling DataDownload from a different restore attempt' and
'restore a multi-PVC VM from a kubevirt-datamover CBT backup'.

Live validation against real AWS/GCP/Azure clusters surfaced and fixed
several bugs along the way:
- the decoy DataDownload used in the run-state-flip test correlated by
  restore-uid instead of restore-name (the actual key the real fix
  uses), and used Status().Update() against a CRD version with no
  status subresource, which unconditionally 404s
- GetDataUploadForBackup could return before kubevirt_dataupload_controller
  had stamped the expected-backup-type annotation, racing the caller
- virt-controller's VirtualMachineBackup status can permanently stop
  advancing after successfully attaching the backup target PVC (its
  attach branch returns without writing a status condition or
  requeuing, see kubevirt/kubevirt pkg/storage/cbt/backup.go
  startBackup()), tracked as CNV-85377/CNV-89684 and reported upstream
  with a fix at kubevirt/kubevirt#18949. Until that merges,
  runKubevirtDMBackup polls manually and nudges the VMI (a harmless
  annotation patch forcing a fresh watch event) whenever
  kdm-controller's logs show the frozen pattern, giving the stuck
  reconcile a real chance to recover instead of waiting out or
  retrying the whole timeout. Confirmed working across dozens of live
  hits on both GCP and Azure. If the nudge doesn't unstick it before
  the timeout, the spec marks pending (no ginkgo-level retry) rather
  than failing on a known, tracked upstream bug.
- a second, distinct upstream bug found testing against kubevirt
  nightly: reconcileStart() (same file) can mark an
  already-successfully-completed VirtualMachineBackup Failed with
  reason SourceLost -- vmi.Status.ChangedBlockTracking.BackupStatus
  being nil is treated unconditionally as "status lost mid-flight",
  but virt-handler also clears that same field as part of normal
  post-completion cleanup. Introduced by kubevirt's June 2026
  "observation-driven dispatch" restructure; distinct from the
  attach-freeze bug above. This only ever surfaces as a Kubernetes
  Event (never in any pod's log), so runKubevirtDMBackup's poll now
  also checks the VM namespace's own events, not just kdm-controller's
  log, for known-flake patterns.
- EnsureCommunityHcoCatalog/GetVirtOperator derived the OLM channel by
  guessing from the HCO index tag's numeric shape, which breaks for a
  moving tag like 'nightly' (channel has no relationship to the tag
  string). Channel is now discovered from the live PackageManifest
  instead (filtered by its catalog= label, since more than one
  CatalogSource can publish a manifest under the same package name --
  getCsvFromPackageManifest's own separate, unfiltered lookup had the
  exact same bug, fixed the same way), so hco_index_tag=nightly works
  through the existing community-HCO path.
- HCO_INDEX_TAG's Makefile default is now "nightly" instead of a pinned
  "1.18.0", so every virt/kdm e2e run (local and CI) picks up
  kubevirt/kubevirt fixes like #18949 automatically as soon as they
  land in a nightly build, with no version bump needed on our side.
  Override to a pinned release for a reproducible/stable run instead.

Signed-off-by: Tiger Kaovilai <tkaovila@redhat.com>
kaovilai added a commit that referenced this pull request Aug 28, 2026
…idation

Upstream blockers (kubevirt-datamover-controller#169, #73 phase 4) have
landed, so this un-pends 'restore run-state flip is not blocked by a
stale sibling DataDownload from a different restore attempt' and
'restore a multi-PVC VM from a kubevirt-datamover CBT backup'.

Live validation against real AWS/GCP/Azure clusters surfaced and fixed
several bugs along the way:
- the decoy DataDownload used in the run-state-flip test correlated by
  restore-uid instead of restore-name (the actual key the real fix
  uses), and used Status().Update() against a CRD version with no
  status subresource, which unconditionally 404s
- GetDataUploadForBackup could return before kubevirt_dataupload_controller
  had stamped the expected-backup-type annotation, racing the caller
- virt-controller's VirtualMachineBackup status can permanently stop
  advancing after successfully attaching the backup target PVC (its
  attach branch returns without writing a status condition or
  requeuing, see kubevirt/kubevirt pkg/storage/cbt/backup.go
  startBackup()), tracked as CNV-85377/CNV-89684 and reported upstream
  with a fix at kubevirt/kubevirt#18949. Until that merges,
  runKubevirtDMBackup polls manually and nudges the VMI (a harmless
  annotation patch forcing a fresh watch event) whenever
  kdm-controller's logs show the frozen pattern, giving the stuck
  reconcile a real chance to recover instead of waiting out or
  retrying the whole timeout. Confirmed working across dozens of live
  hits on both GCP and Azure. If the nudge doesn't unstick it before
  the timeout, the spec marks pending (no ginkgo-level retry) rather
  than failing on a known, tracked upstream bug.
- a second, distinct upstream bug found testing against kubevirt
  nightly: reconcileStart() (same file) can mark an
  already-successfully-completed VirtualMachineBackup Failed with
  reason SourceLost -- vmi.Status.ChangedBlockTracking.BackupStatus
  being nil is treated unconditionally as "status lost mid-flight",
  but virt-handler also clears that same field as part of normal
  post-completion cleanup. Introduced by kubevirt's June 2026
  "observation-driven dispatch" restructure; distinct from the
  attach-freeze bug above. This only ever surfaces as a Kubernetes
  Event (never in any pod's log), so runKubevirtDMBackup's poll now
  also checks the VM namespace's own events, not just kdm-controller's
  log, for known-flake patterns.
- EnsureCommunityHcoCatalog/GetVirtOperator derived the OLM channel by
  guessing from the HCO index tag's numeric shape, which breaks for a
  moving tag like 'nightly' (channel has no relationship to the tag
  string). Channel is now discovered from the live PackageManifest
  instead (filtered by its catalog= label, since more than one
  CatalogSource can publish a manifest under the same package name --
  getCsvFromPackageManifest's own separate, unfiltered lookup had the
  exact same bug, fixed the same way), so hco_index_tag=nightly works
  through the existing community-HCO path.
- HCO_INDEX_TAG's Makefile default is now "nightly" instead of a pinned
  "1.18.0", so every virt/kdm e2e run (local and CI) picks up
  kubevirt/kubevirt fixes like #18949 automatically as soon as they
  land in a nightly build, with no version bump needed on our side.
  Override to a pinned release for a reproducible/stable run instead.

Signed-off-by: Tiger Kaovilai <tkaovila@redhat.com>
kaovilai added a commit that referenced this pull request Aug 29, 2026
…idation

Upstream blockers (kubevirt-datamover-controller#169, #73 phase 4) have
landed, so this un-pends 'restore run-state flip is not blocked by a
stale sibling DataDownload from a different restore attempt' and
'restore a multi-PVC VM from a kubevirt-datamover CBT backup'.

Live validation against real AWS/GCP/Azure clusters surfaced and fixed
several bugs along the way:
- the decoy DataDownload used in the run-state-flip test correlated by
  restore-uid instead of restore-name (the actual key the real fix
  uses), and used Status().Update() against a CRD version with no
  status subresource, which unconditionally 404s
- GetDataUploadForBackup could return before kubevirt_dataupload_controller
  had stamped the expected-backup-type annotation, racing the caller
- virt-controller's VirtualMachineBackup status can permanently stop
  advancing after successfully attaching the backup target PVC (its
  attach branch returns without writing a status condition or
  requeuing, see kubevirt/kubevirt pkg/storage/cbt/backup.go
  startBackup()), tracked as CNV-85377/CNV-89684 and reported upstream
  with a fix at kubevirt/kubevirt#18949. Until that merges,
  runKubevirtDMBackup polls manually and nudges the VMI (a harmless
  annotation patch forcing a fresh watch event) whenever
  kdm-controller's logs show the frozen pattern, giving the stuck
  reconcile a real chance to recover instead of waiting out or
  retrying the whole timeout. Confirmed working across dozens of live
  hits on both GCP and Azure. If the nudge doesn't unstick it before
  the timeout, the spec marks pending (no ginkgo-level retry) rather
  than failing on a known, tracked upstream bug.
- a second, distinct upstream bug found testing against kubevirt
  nightly: reconcileStart() (same file) can mark an
  already-successfully-completed VirtualMachineBackup Failed with
  reason SourceLost -- vmi.Status.ChangedBlockTracking.BackupStatus
  being nil is treated unconditionally as "status lost mid-flight",
  but virt-handler also clears that same field as part of normal
  post-completion cleanup. Introduced by kubevirt's June 2026
  "observation-driven dispatch" restructure; distinct from the
  attach-freeze bug above. This only ever surfaces as a Kubernetes
  Event (never in any pod's log), so runKubevirtDMBackup's poll now
  also checks the VM namespace's own events, not just kdm-controller's
  log, for known-flake patterns.
- EnsureCommunityHcoCatalog/GetVirtOperator derived the OLM channel by
  guessing from the HCO index tag's numeric shape, which breaks for a
  moving tag like 'nightly' (channel has no relationship to the tag
  string). Channel is now discovered from the live PackageManifest
  instead (filtered by its catalog= label, since more than one
  CatalogSource can publish a manifest under the same package name --
  getCsvFromPackageManifest's own separate, unfiltered lookup had the
  exact same bug, fixed the same way), so hco_index_tag=nightly works
  through the existing community-HCO path.
- HCO_INDEX_TAG's Makefile default is now "nightly" instead of a pinned
  "1.18.0", so every virt/kdm e2e run (local and CI) picks up
  kubevirt/kubevirt fixes like #18949 automatically as soon as they
  land in a nightly build, with no version bump needed on our side.
  Override to a pinned release for a reproducible/stable run instead.

Signed-off-by: Tiger Kaovilai <tkaovila@redhat.com>
kaovilai added a commit that referenced this pull request Aug 29, 2026
…idation

Upstream blockers (kubevirt-datamover-controller#169, #73 phase 4) have
landed, so this un-pends 'restore run-state flip is not blocked by a
stale sibling DataDownload from a different restore attempt' and
'restore a multi-PVC VM from a kubevirt-datamover CBT backup'.

Live validation against real AWS/GCP/Azure clusters surfaced and fixed
several bugs along the way:
- the decoy DataDownload used in the run-state-flip test correlated by
  restore-uid instead of restore-name (the actual key the real fix
  uses), and used Status().Update() against a CRD version with no
  status subresource, which unconditionally 404s
- GetDataUploadForBackup could return before kubevirt_dataupload_controller
  had stamped the expected-backup-type annotation, racing the caller
- virt-controller's VirtualMachineBackup status can permanently stop
  advancing after successfully attaching the backup target PVC (its
  attach branch returns without writing a status condition or
  requeuing, see kubevirt/kubevirt pkg/storage/cbt/backup.go
  startBackup()), tracked as CNV-85377/CNV-89684 and reported upstream
  with a fix at kubevirt/kubevirt#18949. Until that merges,
  runKubevirtDMBackup polls manually and nudges the VMI (a harmless
  annotation patch forcing a fresh watch event) whenever
  kdm-controller's logs show the frozen pattern, giving the stuck
  reconcile a real chance to recover instead of waiting out or
  retrying the whole timeout. Confirmed working across dozens of live
  hits on both GCP and Azure. If the nudge doesn't unstick it before
  the timeout, the spec marks pending (no ginkgo-level retry) rather
  than failing on a known, tracked upstream bug.
- a second, distinct upstream bug found testing against kubevirt
  nightly: reconcileStart() (same file) can mark an
  already-successfully-completed VirtualMachineBackup Failed with
  reason SourceLost -- vmi.Status.ChangedBlockTracking.BackupStatus
  being nil is treated unconditionally as "status lost mid-flight",
  but virt-handler also clears that same field as part of normal
  post-completion cleanup. Introduced by kubevirt's June 2026
  "observation-driven dispatch" restructure; distinct from the
  attach-freeze bug above. This only ever surfaces as a Kubernetes
  Event (never in any pod's log), so runKubevirtDMBackup's poll now
  also checks the VM namespace's own events, not just kdm-controller's
  log, for known-flake patterns.
- EnsureCommunityHcoCatalog/GetVirtOperator derived the OLM channel by
  guessing from the HCO index tag's numeric shape, which breaks for a
  moving tag like 'nightly' (channel has no relationship to the tag
  string). Channel is now discovered from the live PackageManifest
  instead (filtered by its catalog= label, since more than one
  CatalogSource can publish a manifest under the same package name --
  getCsvFromPackageManifest's own separate, unfiltered lookup had the
  exact same bug, fixed the same way), so hco_index_tag=nightly works
  through the existing community-HCO path.
- HCO_INDEX_TAG's Makefile default is now "nightly" instead of a pinned
  "1.18.0", so every virt/kdm e2e run (local and CI) picks up
  kubevirt/kubevirt fixes like #18949 automatically as soon as they
  land in a nightly build, with no version bump needed on our side.
  Override to a pinned release for a reproducible/stable run instead.

Signed-off-by: Tiger Kaovilai <tkaovila@redhat.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants