Skip to content

Restore VMware-to-KVM migration changes from #13656 - #14256

Open
andrijapanicsb wants to merge 6 commits into
apache:mainfrom
andrijapanicsb:restore-pr13656
Open

andrijapanicsb wants to merge 6 commits into
apache:mainfrom
andrijapanicsb:restore-pr13656

Conversation

@andrijapanicsb

@andrijapanicsb andrijapanicsb commented Sep 28, 2026 •

Copy link
Copy Markdown
Contributor

Description

This PR restores the exact content of #13656, which was merged as
0a5bf30af32bdea5a209f3f993cbd6a43301d0f9 and then reverted by
510d0ec3785efe3cce65ccd1247682b91f4492d0.

The restoration commit 44a8713671d3a8830342762e88975ad3fd3426c7 reproduced the original merge's Git tree (d3be509ec552975ff628e8f2ada6f4d46d1f109d) and stable patch ID (43eeb0cbbadf2e566bc43780ee1c5244888451d0).

A subsequent focused commit, a5578d6f53b51e2b67c7c537d3b7217c6d44eb3d, fixes the per-disk checkpoint used between warm CBT delta cycles. VMware's DiskChangeInfo does not contain a change ID; the new checkpoint is now read from the cycle snapshot's disk backing. A second focused commit, 6fa7d30b47, handles failures when the final agent command throws or the final CBT cycle cannot be recorded. The original restoration is otherwise unchanged.

A further focused commit, 2a3598ad6a, ports the upstream dummy-template import fix described below, with regression tests.

The complete feature description and implementation details remain available in
the original PR:

#13656

The original change, before these focused fixes, was approved by two independent committers:

Existing upstream importVM regression

During the new QA run, VM import without a supplied template failed with Unable to find template with id ... for virtual machine import. This is an existing upstream regression, not introduced by the VMware-to-KVM restoration in this PR.

PR #12793, merged as a01fb0be34b2774d8fb7853703b36364444398e4, added template-detail loading so imported VMs inherit settings such as guest.cpu.mode=host-passthrough. However, its additional findById(template.getId()) lookup excludes soft-deleted records. The default VM Import Default Template is deliberately stored in the removed state, so this lookup returns null and rejects an otherwise valid import.

This was already fixed on the 4.22 branch by PR #14195, using source commit 0cb24ba8967e14e9577dde7754eeb4a93e6e23e7 (merged as 273b2ea32bfa24396431b9bb0df055e0ac6c1c02). That fix is still absent from main as checked on 1 October 2026 at 1a48a87587c03472feefb081cfac71b2ebd0f407, which retains the failing lookup.

This PR ports the same production-code fix: load details on the template object already supplied to importVM, rather than look it up again. Template CPU-detail inheritance is preserved, and explicit VM CPU settings continue to override template defaults. Six regression tests cover the removed dummy template, active-template CPU inheritance, non-VO templates, explicit CPU model/mode overrides, and rejection of a genuinely missing template.

Types of changes

  • Breaking change (fix or feature that would cause existing functionality to change)
  • New feature (non-breaking change which adds functionality)
  • Bug fix (non-breaking change which fixes an issue)
  • Enhancement (improves an existing feature and functionality)
  • Cleanup (Code refactoring and cleanup, that may add test cases)
  • Build/CI
  • Test (unit or integration test code)

Feature/Enhancement Scale or Bug Severity

Feature/Enhancement Scale

  • Major
  • Minor

Bug Severity

  • BLOCKER
  • Critical
  • Major
  • Minor
  • Trivial

Screenshots (if appropriate)

The acceptance report attached to #13656 includes representative cold VDDK and
warm CBT migration screenshots:

https://github.com/user-attachments/files/32426132/PR13656-acceptance-report.pdf

How Has This Been Tested?

The original change completed its full functional acceptance run:

Blueorangutan smoke testing also passed 156/156 tests:

#13656 (comment)

The original acceptance and smoke results document the restored implementation, but predate the focused fixes in a5578d6f53b51e2b67c7c537d3b7217c6d44eb3d and 6fa7d30b47. For the checkpoint fix, four targeted unit tests, the 38-module Maven package build, and Checkstyle passed. For the cutover failure handling, the 26-module server test reactor and Checkstyle passed (33 targeted CBT tests, including two new tests). Live multi-cycle CBT regression and functional cutover tests have not yet been run on the updated commits. Normal CI and smoke tests should run for this PR.

For the dummy-template port in 2a3598ad6a, all six UserVmImportTemplateTest regression tests passed, and the 26-module server test reactor completed with zero Checkstyle violations. The local command was mvn -B -pl server -am -Dtest=UserVmImportTemplateTest -Dsurefire.failIfNoSpecifiedTests=false -Dexec.skip=true test. The unrelated schema shell test was skipped via exec.skip because Windows CRLF line endings prevent that script from running locally; this is not a claim that the full test suite passed. Fresh functional acceptance testing is still in progress on the QA environment with the same production fix hot-patched into both management servers. The historical acceptance report above must not be read as a completed acceptance run for this new commit.

How did you try to break this feature and the system with this change?

The original acceptance run covered cold and warm migration to NFS, Ceph/RBD
and Linstor, cancellation, retries, invalid state transitions, ownership,
network validation, existing-volume adoption, Windows Server migration,
cleanup and backend leak checks. Full details and evidence are in #13656 and
the linked acceptance report.

Reverts 510d0ec and restores the exact content merged as 0a5bf30. No functional changes are added.

Signed-off-by: andrijapanicsb <[email protected]>
@codecov

codecov Bot commented Sep 28, 2026 •

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 40.08598% with 3345 lines in your changes missing coverage. Please review.
✅ Project coverage is 20.09%. Comparing base (510d0ec) to head (01058cd).
⚠️ Report is 2 commits behind head on main.

Files with missing lines Patch % Lines
.../wrapper/LibvirtConvertInstanceCommandWrapper.java 17.56% 404 Missing and 9 partials ⚠️
.../vmware/manager/VmwareCbtMigrationServiceImpl.java 4.92% 364 Missing and 3 partials ⚠️
...c/main/java/com/cloud/vm/VmwareCbtMigrationVO.java 9.45% 201 Missing ⚠️
.../apache/cloudstack/vm/UnmanagedVMsManagerImpl.java 58.85% 118 Missing and 47 partials ⚠️
...ervisor/kvm/resource/LibvirtComputingResource.java 8.43% 150 Missing and 2 partials ⚠️
...i/command/admin/vm/StartVmwareCbtMigrationCmd.java 0.00% 140 Missing ⚠️
...wrapper/LibvirtVmwareCbtCutoverCommandWrapper.java 77.91% 88 Missing and 39 partials ⚠️
...wrapper/LibvirtVmwareCbtPrepareCommandWrapper.java 64.50% 85 Missing and 30 partials ⚠️
...ce/wrapper/LibvirtVmwareCbtSyncCommandWrapper.java 67.06% 82 Missing and 28 partials ⚠️
.../response/VmwareCbtMigrationPreflightResponse.java 0.00% 97 Missing ⚠️
... and 64 more
Additional details and impacted files
@@             Coverage Diff              @@
##               main   #14256      +/-   ##
============================================
+ Coverage     19.91%   20.09%   +0.18%     
- Complexity    20194    20730     +536     
============================================
  Files          6373     6428      +55     
  Lines        577230   585089    +7859     
  Branches      70696    71684     +988     
============================================
+ Hits         114942   117595    +2653     
- Misses       449722   454613    +4891     
- Partials      12566    12881     +315     
Flag Coverage Δ
uitests 3.72% <ø> (+0.01%) ⬆️
unittests 21.37% <40.08%> (+0.19%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@andrijapanicsb

Copy link
Copy Markdown
Contributor Author

Packages build from the identical code:
(see comment: #13656 (comment)

Packaging results:

Result Artifact Platform
PASS RPM EL (EL8/9/10)
PASS DEB Ubuntu, Debian

Test packages are available at:

@andrijapanicsb

Copy link
Copy Markdown
Contributor Author

ShapeBlue clean/successfull packaging pass - link: #13656 (comment)

@andrijapanicsb

Copy link
Copy Markdown
Contributor Author

ShapeBlue BlueOrangutan (Marvin tests - all 156 passed with zero failures) - link: #13656 (comment)

@andrijapanicsb
andrijapanicsb requested review from harikrishna-patnala, mlsorensen, nvazquez, rp-, shwstppr and wido and removed request for rp- September 28, 2026 19:31
@andrijapanicsb

Copy link
Copy Markdown
Contributor Author

@alexandremattioli cant see you from the dropdown in "reviewers" so just pinging you this way, especially if you have any capacity for testing etc.

@andrijapanicsb

Copy link
Copy Markdown
Contributor Author

@ACSHomeBot package G

@ACSHomeBot

ACSHomeBot commented Sep 28, 2026 •

Copy link
Copy Markdown

Packaging results:

Result Artifact Platform
PASS RPM EL (EL8/9/10)
PASS DEB Ubuntu, Debian

Test packages are available at:


The packages previously published for 44a8713671d3 have been superseded by 6fa7d30b47ea. The current packages are available at https://f003.backblazeb2.com/file/andrijapanicsb-cloudstack-pr-builds/pr/14256/index.html.

@andrijapanicsb

Copy link
Copy Markdown
Contributor Author

Building (as you can see above) new packages for this one @DaanHoogland - just to have it officially/fresh

@andrijapanicsb

Copy link
Copy Markdown
Contributor Author

@blueorangutan package

1 similar comment
@andrijapanicsb

Copy link
Copy Markdown
Contributor Author

@blueorangutan package

@winterhazel
winterhazel self-requested a review September 28, 2026 21:39
@andrijapanicsb

Copy link
Copy Markdown
Contributor Author

@winterhazel thx for the review request
.

@ACSHomeBot

ACSHomeBot commented Sep 29, 2026 •

Copy link
Copy Markdown

Packaging results:

Result Artifact Platform Build Time
PASS RPM EL (EL8/9/10) 30 min
PASS DEB Ubuntu, Debian 21 min

Test packages are available at:


The packages previously published for 6fa7d30b47ea have been superseded by 2a3598ad6ae4. The current packages are available at https://packages.v2kmigrate.com/cloudstack/pr/14256/index.html.

@andrijapanicsb

Copy link
Copy Markdown
Contributor Author

@blueorangutan package

@blueorangutan

Copy link
Copy Markdown

@andrijapanicsb a [SL] Jenkins job has been kicked to build packages. It will be bundled with no SystemVM templates. I'll keep you posted as I make progress.

@blueorangutan

Copy link
Copy Markdown

Packaging result [SF]: ✔️ el8 ✔️ el9 ✔️ el10 ✔️ debian ✔️ suse15. SL-JID 19349

@alexandremattioli

Copy link
Copy Markdown
Contributor

@andrijapanicsb reviewing functionally in my labs

Port the production fix from apache/cloudstack PR apache#14195, source commit 0cb24ba (merged into 4.22 as 273b2ea).

Reuse the supplied template and load its details without a findById lookup that filters removed records. Preserve template CPU-detail inheritance and explicit VM overrides.

Add six regression tests for dummy and active templates, non-VO templates, CPU override precedence and missing templates.

Co-authored-by: Abhisar Sinha <[email protected]>
@andrijapanicsb

Copy link
Copy Markdown
Contributor Author

@ACSHomeBot package G

@ACSHomeBot

ACSHomeBot commented Oct 1, 2026 •

Copy link
Copy Markdown

Packaging results:

Result Artifact Platform Build Time
PASS RPM EL (EL8/9/10) 31 min
PASS DEB Ubuntu, Debian 21 min

Test packages are available at:

@andrijapanicsb

Copy link
Copy Markdown
Contributor Author

@blueorangutan package

@blueorangutan

Copy link
Copy Markdown

@andrijapanicsb a [SL] Jenkins job has been kicked to build packages. It will be bundled with no SystemVM templates. I'll keep you posted as I make progress.

@blueorangutan

Copy link
Copy Markdown

Packaging result [SF]: ✔️ el8 ✔️ el9 ✔️ el10 ✔️ debian ✔️ suse15. SL-JID 19364

@NuxRo

NuxRo commented Oct 1, 2026

Copy link
Copy Markdown
Contributor

@blueorangutan test

@blueorangutan

Copy link
Copy Markdown

@NuxRo a [SL] Trillian-Jenkins test job (ol8 mgmt + kvm-ol8) has been kicked to run smoke tests

@blueorangutan

Copy link
Copy Markdown

[SF] Trillian Build Failed (tid-17057)

Skip target cleanup on cancel and delete when an imported VM is recorded, including imports that completed after cancellation. Re-read the migration before cleanup to protect VM references recorded since the caller loaded it. Keep source snapshot cleanup and migration record deletion independent.

Add regression coverage for both cleanup entry points, all migration states, stale caller records, and record-only deletion with source cleanup. This guard does not resolve imports racing after the final read.

Signed-off-by: andrijapanicsb <[email protected]>
@andrijapanicsb

Copy link
Copy Markdown
Contributor Author

@ACSHomeBot package G

@ACSHomeBot

Copy link
Copy Markdown

Accepted: package kvm G for fd1673629ddb.

Planned: RPM + DEB, KVM SystemVM.

Status: Queued for worker G. Jobs ahead: 0.

@ACSHomeBot

Copy link
Copy Markdown

Package building started on worker G.

@ACSHomeBot

Copy link
Copy Markdown

Packaging results:

Result Artifact Platform Build Time
PASS RPM EL (EL8/9/10) 31 min
PASS DEB Ubuntu, Debian 21 min

Test packages are available at:

@ACSHomeBot

Copy link
Copy Markdown

Published package retention update

The packages previously published for 2a3598ad6ae4 have been superseded by fd1673629ddb. The current packages are available at https://packages.v2kmigrate.com/cloudstack/pr/14256/index.html.

@DaanHoogland DaanHoogland left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

code looks good

Comment on lines +2698 to +2700
// Import may finish after cancellation and record the VM without changing the Cancelled state.
// Its target disks now belong to that VM, so neither cancel nor delete may remove them.
// This does not prevent source snapshot cleanup or deletion of the migration record.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
// Import may finish after cancellation and record the VM without changing the Cancelled state.
// Its target disks now belong to that VM, so neither cancel nor delete may remove them.
// This does not prevent source snapshot cleanup or deletion of the migration record.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, @DaanHoogland . I’m keeping these comments. They document a non-obvious cancellation/import interaction and explain why cleanup must preserve the imported VM’s disks. If anything in that explanation is technically inaccurate, please point it out; the deletion suggestions don’t identify an error.

Given that the earlier PR was reverted over concerns about independent testing, it is rather surprising to see review time spent removing explanations instead of helping close that testing gap. With prebuilt packages available, an independent CBT migration test would be considerably more useful than making the source four comment lines shorter.

If you have time to contribute further, could you help verify that workflow and report any functional issues? That would address the concern that actually held this work back.

// This does not prevent source snapshot cleanup or deletion of the migration record.
Long importedVmId = migration.getVmId();
if (importedVmId == null) {
// Re-read before cleanup: an import may have recorded its VM since this caller loaded the migration.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
// Re-read before cleanup: an import may have recorded its VM since this caller loaded the migration.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, @DaanHoogland . I’m keeping these comments. They document a non-obvious cancellation/import interaction and explain why cleanup must preserve the imported VM’s disks. If anything in that explanation is technically inaccurate, please point it out; the deletion suggestions don’t identify an error.

Given that the earlier PR was reverted over concerns about independent testing, it is rather surprising to see review time spent removing explanations instead of helping close that testing gap. With prebuilt packages available, an independent CBT migration test would be considerably more useful than making the source four comment lines shorter.

If you have time to contribute further, could you help verify that workflow and report any functional issues? That would address the concern that actually held this work back.

@rp- rp- left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey Andrija,

sorry but I did review again the Linstor parts and found 3 issues that should be probably fixed before merging.

Comment on lines +68 to +82
// A Linstor volume is a DRBD device that only appears on this host once its resource
// is made available here (a diskless assignment); connect it before qemu-img inspects
// the device and release the diskless assignment afterwards (the replicated data on
// the storage nodes is untouched). RBD needs no such step.
boolean linstorConnected = false;
if (StoragePoolType.Linstor.equals(pool.getType())) {
linstorConnected = storagePoolMgr.connectPhysicalDisk(pool.getType(), pool.getUuid(), volumePath, null);
}
try {
return addVolumeByVolumePath(command, storagePool, volumePath);
} finally {
if (linstorConnected) {
storagePoolMgr.disconnectPhysicalDisk(pool.getType(), pool.getUuid(), volumePath);
}
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The connect step is only added for the single-path case. addAllVolumes (L162–174, not part of this diff) runs getDiskFileInfo on each disk from listPhysicalDisks. For Linstor, disk.getPath() is /dev/drbd/by-res/cs-…/0, which only exists if the resource has a replica or diskless resource on this host. For every other volume qemu-img info fails, info == null, and the continue skips it without any error. In the UI, the import-data-disk list for a Linstor pool therefore shows only the volumes that happen to be on whichever host the management server sent the command to.

The listing is also expensive on large controllers. For each resource there are 2 API calls in getPhysicalDisk (volumeDefinitionList and viewResources), 1 in getVolumeInUseNode (resourceList), and 2 qemu-img info runs.

For Linstor you should probably, don't inspect devices when listing. The format is always RAW, size and in-use state come from the controller, and backing files and qcow2 encryption can't apply to a raw DRBD device. A single viewResources call (filtered to the pool's resource group) can provide name, size and in-use state for all resources at once. Connect and inspect only in the single-path case, as now.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, René — good catch. Addressed in 01058cd.

LINSTOR import listing now uses read-only controller metadata rather than local device inspection. Resources are filtered by the pool’s resource group, replicas are deduplicated, and format, size and in-use state no longer depend on a local DRBD device being present.

The implementation uses paginated resource-definition, resource-view and node-status queries, eliminating the per-volume API/qemu-img inspection loop. Busy resources and resources whose usage cannot be established reliably are marked as locked.

Regression tests cover remote-only replicas, resource-group filtering, replica deduplication, pagination and unavailable/unknown usage states.

return checkRbdVolume(command, pool, vol);
} finally {
if (linstorConnected) {
poolMgr.disconnectPhysicalDisk(storageFilerTO.getType(), storageFilerTO.getUuid(), srcFile);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LinstorStorageAdaptor.connectPhysicalDisk returns true whenever resourceMakeAvailableOnNode succeeds, including when the resource was already on this node. linstorConnected therefore means "the call succeeded", not "we created the local resource". The disconnect then goes through tryDisconnectLinstor, which:

  • deletes the local resource if it is diskless and not a tiebreaker, even if it existed before this check (e.g. placed by an admin, or left over from another operation);
  • calls removeTwoPrimariesProps if the resource is in use on another node. If that volume is being live-migrated, this strips allow-two-primaries and protocol in the middle of the migration.

I suggest: before connecting, check whether a resource for this name already exists on the local node (one viewResources filtered to the local node and this resource), and only disconnect if this check created it. If the in-use check reports another node, skip the disconnect completely so the allow-two-primaries properties are left alone. Same pattern applies to LibvirtGetVolumesOnStorageCommandWrapper.java L72–82 (see comment there).

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks — agreed that a successful connect does not establish ownership of the local resource. Addressed in both wrappers in 01058cd.

I took a slightly different approach from tracking temporary-resource ownership: single-volume LINSTOR inspection now also uses read-only controller metadata, so neither inspection path calls connectPhysicalDisk or disconnectPhysicalDisk.

This removes the inspection-side risk of deleting an existing diskless resource or changing allow-two-primaries/protocol during live migration. Actual device connection remains the responsibility of the normal attach/start path; this metadata check does not claim to verify local device accessibility.

Regression tests verify that inspection does not call connect/disconnect or invoke qemu-img. The generic connection/disconnection implementation is unchanged.

return addVolumeByVolumePath(command, storagePool, volumePath);
} finally {
if (linstorConnected) {
storagePoolMgr.disconnectPhysicalDisk(pool.getType(), pool.getUuid(), volumePath);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same issue as in LibvirtCheckVolumeCommandWrapper L89: this disconnect can remove a local diskless resource that existed before the call, and can strip allow-two-primaries from a resource that is in use elsewhere. It should only disconnect if this call created the local resource.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please see comment/response above ^^^

Comment on lines +602 to +607
List<ResourceDefinition> rscDfns = LinstorUtil.getRDListStartingWith(api, LinstorUtil.RSC_PREFIX);
for (ResourceDefinition rscDfn : rscDfns) {
if (rscGroup != null && !rscGroup.equalsIgnoreCase(rscDfn.getResourceGroupName())) {
continue;
}
String name = rscDfn.getName().substring(LinstorUtil.RSC_PREFIX.length());

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This check keeps the listing to resources in the pool's own resource group. But importVolume path=… (GetVolumesOnStorage with a volume path) and importVm diskpath=… (CheckVolume) go straight to getPhysicalDisk(name), which accepts any cs-* resource on the controller. The duplicate checks on the management server only look within the target pool:

  • VolumeImportUnmanageManagerImpl.java:370: volumeDao.findByPoolIdAndPath(pool.getId(), volumePath)
  • UnmanagedVMsManagerImpl.java:3237: findByPoolIdAndPath(poolId, diskPath)

Resource names are unique per LINSTOR controller, and several CloudStack pools on one controller (different resource groups, e.g. SSD and HDD) is a common setup. Scenario:

  1. Pool A (resource group rg-ssd) has volume X, i.e. resource cs-X, attached to a stopped VM.
  2. An admin runs importVolume with storageid= (resource group rg-hdd, same controller) and path=X.
  3. All checks pass. The in-use check doesn't help because nothing is running.
  4. Two CloudStack volumes now point at the same DRBD resource. Deleting either one calls deleteResourceDefinition(cs-X), and the other volume's data is gone.

Suggested fix: on the management server, before sending CheckVolume or GetVolumesOnStorage for a Linstor pool, look up cs-<path> on the controller (the driver already builds the API client via LinstorUtil.getLinstorAPI(pool.getHostAddress(), …)) and reject the import if ResourceDefinition.getResourceGroupName() doesn't match the pool's resource group. That uses the controller's own data, covers resources this CloudStack database doesn't know about, and avoids comparing controller addresses across pools. It applies to both importVolume and importVm importsource=shared.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the concrete cross-pool example — the stopped-VM case makes it clear why an in-use check alone is insufficient. Addressed in 01058cd.

Both DATA-volume import and shared-storage VM/ROOT import now validate the resource definition’s group against the selected pool’s group on the management server, before agent inspection and allocation. The VM import path also revalidates against the actual deployment pool before CheckVolume. Agent-side LINSTOR inspection independently enforces the same group check.

A mismatch, missing resource or failed ownership lookup rejects the import rather than allowing it to proceed. Regression tests cover cross-group rejection in both management paths and agent-side validation.

Across these fixes, the targeted local Maven run passed 195 unit tests with Checkstyle enabled.

Package rebuild and live LINSTOR/E2E validation are still pending.

Use read-only controller metadata for listing and single-volume inspection without temporary resource placement or DRBD property changes. Validate the selected pool resource group in management-server ROOT/DATA import paths and agent inspection. Add regression coverage for remote replicas, unknown or busy resources, and cross-group imports.
@apache apache deleted a comment from ACSHomeBot Oct 5, 2026
@apache apache deleted a comment from ACSHomeBot Oct 5, 2026
@apache apache deleted a comment from ACSHomeBot Oct 5, 2026
@ACSHomeBot

Copy link
Copy Markdown

Package building started on worker G.

@ACSHomeBot

Copy link
Copy Markdown

Packaging results:

Result Artifact Platform Build Time
PASS RPM EL (EL8/9/10) 31 min
PASS DEB Ubuntu, Debian 21 min

Test packages are available at:

@apache apache deleted a comment from ACSHomeBot Oct 5, 2026

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

9 participants