Repository navigation
Conversation
Adds a 4.23.0 to 24.0.0 upgrade path (squashed from sb/upgradepath-424: engine-schema: upgrade path for 24.0.0, fix CS version, fix upgrade unit tests for cutover, fix imports).
|
This pull request has merge conflicts. Dear author, please fix the conflicts and sync your branch with the base branch. |
711eb46 to
219f9cb
Compare
Codecov Report❌ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## main #14166 +/- ##
============================================
Coverage 20.66% 20.67%
+ Complexity 21723 20716 -1007
============================================
Files 6492 6049 -443
Lines 590728 547505 -43223
Branches 72448 73132 +684
============================================
- Hits 122054 113174 -8880
+ Misses 455404 421071 -34333
+ Partials 13270 13260 -10
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
🔴 Test Coverage Grade:
|
| Metric | Value |
|---|---|
| Line coverage | 25.55% |
| Branch coverage | 20.71% |
Grade Scale
| Grade | Line Coverage | Meaning |
|---|---|---|
| 🟢 A | ≥ 80% | Excellent - this code sleeps well at night 😴 |
| 🟡 B | 60-79% | Good - almost there, don't stop now 😉 |
| 🟠 C | 40-59% | Acceptable - your code is wearing a seatbelt, but no airbags 😬 |
| 🔴 D | 20-39% | Marginal - boldly shipping where no test has gone before 🖖 |
| ⛔ F | < 20% | Failing - tests? what tests? 🔥 |
Branch coverage is shown as a secondary signal. Grade is determined by line coverage.
View full Actions run
|
This pull request has merge conflicts. Dear author, please fix the conflicts and sync your branch with the base branch. |
The (nic_id, network_id) unique key rejected re-associating a network after a prior disassociate, since the old row's uniqueness survives as a soft-deleted (removed) row. Switch to a plain index so re-association after disassociation works, relying on application-level checks (not the DB) to reject a true duplicate live association.
…fallback Trunk NIC VLAN membership is delivered by reusing the existing guest bridge with vlan_filtering=1: the primary VLAN gets native/untagged membership, associated VLANs get tagged-only membership, via libvirt's <vlan trunk='yes'> element where supported, or manual `bridge vlan add` on older libvirt. Adds a live membership update path (UpdateNicVlanMembershipCommand/Answer + its KVM wrapper) so an association change on a running VM is pushed to the host without a restart, and a non-blocking diagnostic warning when the physical uplink is missing a VLAN a trunk NIC needs (CloudStack no longer manages the uplink's own VLAN membership - that is the operator's responsibility).
- New UsageEventUtils.publishNicNetworkOfferingUsageEvents() emits one usage event per network a nic bills against (primary + any trunk associations), replacing the old single-event publishUsageEvent at every NIC-billing call site - Ordinary non-trunk nics still produce exactly one event, unchanged - New nullable usage_network_offering.network_id column disambiguates rows when a trunk nic's networks share one network offering - Backfills network_id on a nic's own still-open usage row(s) the moment it first converts to a trunk nic; historic rows otherwise left alone
- New NicNetworkMapResponse + trunked/associatednetworks fields on NicResponse - Populated in listNics, listVirtualMachines, and the associate/disassociate/change-primary command responses - Trunk status derived from nic_network_map rows rather than a new column on the wide UserVmJoinVO view
- ASSOCIATED_NETWORKS/TRUNKED, needed by the previous commit's NicResponse fields
Core capability: - New associateNetworkToNic/disassociateNetworkFromNic/changeNicPrimaryNetwork admin APIs and associateNetworksToNic (programmatic, used by deploy) - A nic keeps one primary network plus any number of additional associated networks (nic_network_map), delivered as a VLAN trunk - changeNicPrimaryNetwork only allowed while the Instance is stopped - Rejects associating a network already reachable via another of the VM's nics, or with an overlapping CIDR to an existing association - Disassociating a network is blocked while an active PF/Static NAT/LB rule targets its allocated IP PF/Static NAT/LB support for associated networks: - NetworkModel.getNicAndIpInNetwork resolves a nic/guest-ip pair via the nic's primary match or a trunk association, reused by RulesManagerImpl and LoadBalancingRulesManagerImpl so these rules can target a trunk nic's associated networks, not just its primary Deployment planning: - Hosts without VLAN filtering enabled are excluded up front for any VM with a multi-VLAN trunk nic, with a reactive fallback exclusion during start as a backstop - Removing a nic cleans up any trunk associations it held as primary; deleting a network is blocked while still associated as a secondary Metadata: - A trunk nic's associated-network VLAN tags are exposed to the guest via the metadata service (nic-vlan-mapping file), gated by a new account-scoped config key, off by default
- EVENT_NIC_NETWORK_ASSOCIATE/DISASSOCIATE/PRIMARY_NETWORK_CHANGE, needed by the previous commit's @actionevent annotations
- New nicnetworkslist deploy param (nicnetworkslist[N].networkids, first id primary) lets a VM be deployed with trunk nics directly, mutually exclusive with networkids/iptonetworklist/vApp nicnetworklist - Also carries per-entry ip4address/ip6address for the primary and ip4addresses/ip6addresses (comma-separated) for its associated networks - a network with no requested IP auto-allocates - VNF: rejects a management-device nic from being requested as a trunk, both at deploy time and via the live associate API
- checkNoActiveRulesOnAssociation used findByIpAndNetworkId, which matches on a public IP's own address - the association's IP is a guest IP, so this never matched and the guard silently let disassociation through even with an active static NAT rule - Use findByAssociatedVmIdAndVmIp instead, which matches the actual static NAT target mapping
- validateVnfApplianceTrunkNics only ran at deploy time (nicnetworkslist) - the live associateNetworkToNic/associateNetworksToNic path had no equivalent check, so a VNF's management nic could be trunked after deploy - New single-nic validateVnfApplianceTrunkNic, called from associateNetworksInternal so both entry points are covered - No-op for any non-VNF template
- changeNicPrimaryNetwork updated networkId and the IPv4/IPv6 address but left gateway, netmask, broadcast/isolation uri, and IPv6 gateway/cidr pointing at the old primary network - wrong indefinitely, since nothing else ever recomputes them - New applyNetworkAddressingToNic refreshes them from the new primary network, mirroring the field derivation used when a nic is first created
- disassociateNetworkFromNic now clears nics.multi_network once nic_network_map has no remaining rows for that nic - Without this, listNics/listVirtualMachines kept reporting trunked=true and the deployment planner kept restricting the VM to VLAN-filtering- capable hosts even after all associations were removed
- New CommandSetupHelper.createDhcpEntryCommand overload takes addressing explicitly instead of reading it off a NicVO, since a nic's own DB row only ever carries its primary network's IP/gateway - NetworkServiceImpl sends the entry directly to the associated network's router(s) on live associate/disassociate, bypassing the DhcpServiceProvider pipeline (which re-resolves the nic from the DB and so can never see anything but the primary IP) - UserVmManagerImpl.finalizeStart converges a nic's associated-network DHCP entries with its current nic_network_map rows on every VM start, covering associations made while the VM was stopped and cleaning up entries for associations removed while stopped - New NicNetworkMapDao.listRemovedByNicId to support that cleanup
|
@blueorangutan package |
|
@Pearl1594 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. |
|
Packaging result [SF]: ✖️ el8 ✖️ el9 ✔️ debian ✔️ suse15. SL-JID 19856 |
|
@blueorangutan package |
|
@Pearl1594 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. |
|
Packaging result [SF]: ✔️ el8 ✔️ el9 ✔️ el10 ✔️ debian ✔️ suse15. SL-JID 19858 |
|
[SF] Trillian test result (tid-17333)
|
…VLAN 1 nics as needing a legacy host, including in host planning
|
@blueorangutan package |
|
@RosiKyu 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. |
|
|
Packaging result [SF]: ✔️ el8 ✔️ el9 ✔️ el10 ✔️ debian ✔️ suse15. SL-JID 19861 |
|
@blueorangutan test |
|
@Pearl1594 a [SL] Trillian-Jenkins test job (ol8 mgmt + kvm-ol8) has been kicked to run smoke tests |
|
[SF] Trillian test result (tid-17353)
|
|
@blueorangutan test |
|
@Pearl1594 a [SL] Trillian-Jenkins test job (ol8 mgmt + kvm-ol8) has been kicked to run smoke tests |
|
[SF] Trillian test result (tid-17369)
|
There was a problem hiding this comment.
LGTM, based on manual QA of the head of this PR (d644d6e).
Test environment
- KVM hosts in all three host profiles the feature supports:
- Legacy: no VLAN filtering.
- VLAN filtering with libvirt older than 11: Oracle Linux 9 with libvirt 9.0 and 10.10.
- VLAN filtering with libvirt 11: Oracle Linux 9 with libvirt 11.10, and Debian 13 with libvirt 11.3.
- An Advanced zone and a Security Group zone. Isolated, Shared, L2, VPC tier and untagged networks. Two management servers for the cross-server cases.
- Every round was redone on each new head; the last full round was on d644d6e.
Results
- The full test plan of 196 test cases was run, plus additional exploratory, failure injection and regression scenarios.
- Issues found during testing were addressed in this PR and re-verified on the final build.
Areas tested
- Host profile detection and conversion: VLAN filtering, STP and libvirt version detection, and host details, including readiness taken from the Guest traffic label when it differs from guest.network.device. Converting a Legacy host to VLAN filtering, including with VMs running, and a libvirt 9 to 11 upgrade done through maintenance.
- Associate, disassociate and changeNicPrimaryNetwork: on running and stopped VMs, on Isolated, Shared, VPC tier and dual-stack networks, and up to 50 associations and VLAN 4094.
- Checked after each change: IP allocation and release, router DHCP entries, the nic-vlan-mapping file, events and usage.
- Rollback when a later network in a multi-network call fails, including the host side on libvirt older than 11.
- Associating a network that was never implemented starts its router.
- Two trunk NICs on one VPC tier router keep both DHCP entries.
- With the association network's router stopped, or destroyed and recreated, the DHCP entries are rebuilt.
- Redundant routers: entries reach both routers and survive failover.
- Access checks: run against the VM owner, and an access error comes before "already associated".
- listNics and listVirtualMachines on an association network: scoping, filters and paging.
- Deploy with nicnetworkslist and assignVirtualMachine: Validation and negative paths: invalid combinations, other accounts' networks, domain admin limits, gateway and duplicate IPs, and the same network twice in one call. A rejected call leaves nothing behind.
- On the wire: tap VLAN membership on each host profile, native and manual paths. No VLAN 1 leak, untagged frames, and VLAN hopping attempts with double tags and VLAN 1.
- Guest side: DHCP and metadata on associated VLANs, and port forwarding, static NAT, load balancing and egress rules on associated addresses.
- Network lifecycle guards: delete, network GC, CIDR change, offering change, migrateNetwork and migrateVpc.
- Live migration across profiles:
- Legacy, manual and native in each direction: the supported directions work and the others are refused with a clear message.
- findHostsForMigration reasons and the UI tooltip.
- HA, host maintenance, host reboot, and agent and libvirtd restarts.
- VLAN 1 networks on converted hosts:
- Trunk NIC plus VLAN 1 refused on every path.
- Plain VLAN 1 VMs placed on Legacy hosts, and router, SSVM and CPVM Public NICs on VLAN 1.
- Maintenance with and without a Legacy host available.
- SSVM and CPVM with Management and Storage NICs on VLAN 1, run on converted hosts:
- The Storage NIC on VLAN 1, carried on the guest uplink, gets its own VLAN 1 bridge. Secondary storage NFS mounts through it.
- Its frames leave the host tagged VLAN 1, with nothing untagged and nothing on the guest bridge.
- The SSVM live migrates between native, manual and Legacy hosts with storage working after each move.
- The Management NIC is plugged untagged into the management bridge, as on stock KVM, and the agents connect.
- Concurrency: parallel associate calls, associate against network delete, and calls spread across two management servers.
- VM operations on trunk VMs: VM snapshots with and without memory, NIC link down and up, suspend and resume, scale, restore, destroy and recover, unmanage (refused), and projects.
- Feature switched off in the zone: existing trunk VMs keep working and new trunk operations are refused.
- Security Group zone: trunk NICs are refused where security groups apply.
- UI: the association dialogs, NIC listings, address pickers for rules, and the migration wizard.
- Regression: ordinary VMs, routers, redundant VPC failover and system VMs on Legacy and converted hosts, and usage jobs.
Not tested
- The out of scope items from the documentation: backup and restore, VXLAN, and two untagged networks on one host.
Minor, left as is
- A deploy or start with the hostid of a host that cannot take the VM gives the generic "No destination found". The same happens for a trunk VM with the hostid of a Legacy host.
- The assignVirtualMachine refusal for a trunk NIC plus a VLAN 1 network shows a generic message. The reason is in the management server log.
Unrelated issues seen during testing
- A VM start fails with an NPE in deployInVmLastHost when the VM's last host has been removed. This is on main since #12711, and stock 4.22.1.1 starts the same VM.
- The router's dnsmasq 2.90 crashes (SIGSEGV) on reload after a DHCP entry change. This also happens on routers without associations and on stock 4.22.1.1, and it is fixed upstream in dnsmasq 2.91.
- deleteManagementNetworkIpRange fails with an NPE ("Cannot invoke "String.equals(Object)" because "vlan" is null") when vlan is given as
1oruntagged. It works withvlan://1. This PR does not change that code.
Code coverage (Codecov at d644d6e)
- Patch coverage is 58.60% (936 changed lines not covered by unit tests). Project coverage is 20.67%.
- Coverage of the main changed files:
- NetworkServiceImpl: 73.26%
- BridgeVifDriver: 67.45%
- BaseDeployVMCmd: 66.96%
- UserVmManagerImpl: 60.79%
- NetworkOrchestrator: 40.17%
- VirtualMachineManagerImpl: 28.57%
- NicNetworkMapDaoImpl: 24.44%
- LibvirtComputingResource: 14.28%
- The associate, disassociate, deploy, migration and host profile paths in these files were all exercised by the manual tests above.
Latest smoke test run
- The last smoke run had 3 failures:
- test_router_dhcphosts
- test_01_RVR_Network_FW_PF_SSH_default_routes_egress_true
- test_02_isolate_network_FW_PF_default_routes_egress_false
- All three fail on traffic from a guest to the internet:
- Two get 2 of 3 replies to
ping -c 3 8.8.8.8, and the tests require 0% loss. - One runs
curl -m 1right after the egress rule was applied on the router, and it timed out.
- Two get 2 of 3 replies to
- The hosts in that run report
vlan.filtering.enabledfalse, so the new VLAN filtering paths were not in use. - The same flows were rerun by hand on the PR build:
- Add the egress rule for TCP 80, then run
curl -m 1at once from guests on a native and a manual host, with the router on a Legacy host: 20 of 20 got200 OK. - The router's dhcphosts file lists both VMs with the right MAC and IP.
ping -c 3 8.8.8.8, 15 times per guest: one guest had two runs with 2 of 3 replies. The bare hosts, with no VM or router in the path, lost a reply at the same rate.
- Add the egress rule for TCP 80, then run
- So the failures match packet loss on the path to the internet. The flow was not run on a stock build. The log is attached.
|
@blueorangutan test |
|
@Pearl1594 a [SL] Trillian-Jenkins test job (ol8 mgmt + kvm-ol8) has been kicked to run smoke tests |
|
[SF] Trillian Build Failed (tid-17472) |
There was a problem hiding this comment.
🟡 Changes recommended
Host-wide readiness checks can select the shared-bridge path for NICs whose actual bridge lacks VLAN filtering, compromising network isolation.
5 open issues
VLAN filtering readiness is not checked per NIC bridge · New Readiness is tracked for only the last guest bridge · New Associated networks inherit the primary NIC's default status · New VPC filtering excludes associated-network matches · New Readiness summary counts only the first page of hosts · New
What changed in this PR
Adds multi-VLAN trunk NIC support for KVM, allowing a single VM NIC to connect to multiple guest networks through native libvirt VLAN XML or manual bridge VLAN configuration.
Changes:
- Adds NIC-network association persistence, administrative APIs, host capability reporting, and placement checks.
- Extends DHCP, address resolution, usage events, migration, and VM lifecycle handling for trunk NICs.
- Updates deployment and network-rule interfaces, readiness indicators, and regression tests.
This pull request requires changes. Two critical findings concern per-bridge readiness and VLAN isolation. Seven moderate findings cover usage default flags, NIC attachment rollback, cross-VPC filtering, physical-network migration, VNF validation and address serialization, and paginated readiness summaries.
| File | Description |
|---|---|
ui/src/views/network/PortForwarding.vue |
Adds network-aware trunk NIC IP selection. |
ui/src/views/network/NicsTable.vue |
Displays trunk associations and management actions. |
ui/src/views/network/LoadBalancing.vue |
Adds grouped IP targets and network resolution. |
ui/src/views/network/InternalLBAssignVmForm.vue |
Supports associated-network backend addresses. |
ui/src/views/network/EnableStaticNat.vue |
Submits the selected address’s network. |
ui/src/views/infra/Resources.vue |
Adds host-readiness summaries. |
ui/src/views/compute/wizard/NetworkSelection.vue |
Preserves network selections across pages. |
ui/src/views/compute/MigrateWizard.vue |
Shows migration cautions and unsuitability reasons. |
ui/src/views/compute/DeployVnfAppliance.vue |
Builds trunk NIC deployment parameters. |
ui/src/utils/multiNetworkNic.js |
Adds shared capability and IP-option helpers. |
ui/src/config/section/infra/hosts.js |
Exposes VLAN capabilities in host details. |
ui/src/components/view/ListView.vue |
Adds VLAN-filtering readiness badges. |
systemvm/debian/opt/cloud/bin/cs_dhcp.py |
Preserves DHCP entries sharing a trunk MAC. |
server/src/test/java/org/apache/cloudstack/storage/template/VnfTemplateManagerImplTest.java |
Tests management-interface trunk restrictions. |
server/src/test/java/com/cloud/vpc/MockNetworkModelImpl.java |
Implements the new NIC/address lookup contract. |
server/src/test/java/com/cloud/vpc/MockNetworkManagerImpl.java |
Adds networking lifecycle mock methods. |
server/src/test/java/com/cloud/server/ManagementServerImplTest.java |
Tests migration host-readiness checks. |
server/src/test/java/com/cloud/network/NetworkModelImplTest.java |
Tests primary and associated address lookup. |
server/src/test/java/com/cloud/network/NetworkMigrationManagerImplTest.java |
Tests association transfer during NIC migration. |
server/src/test/java/com/cloud/network/MockNetworkModelImpl.java |
Implements the new lookup contract. |
server/src/test/java/com/cloud/network/lb/LoadBalancingRulesManagerImplTest.java |
Updates NIC/address lookup expectations. |
server/src/test/java/com/cloud/network/lb/AssignLoadBalancerTest.java |
Adds network-specific lookup fixtures. |
server/src/test/java/com/cloud/network/Ipv6AddressManagerTest.java |
Tests IPv6 association-address conflicts. |
server/src/test/java/com/cloud/api/query/QueryManagerImplTest.java |
Tests association-aware NIC search construction. |
server/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImpl.java |
Uses association-aware import usage events. |
server/src/main/java/org/apache/cloudstack/storage/template/VnfTemplateManagerImpl.java |
Validates VNF management NIC restrictions. |
server/src/main/java/com/cloud/vm/UserVmStateListener.java |
Emits removal usage events for all NIC networks. |
server/src/main/java/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java |
Reapplies VLAN membership after memory reverts. |
server/src/main/java/com/cloud/server/ManagementServerImpl.java |
Registers APIs and adds migration diagnostics. |
server/src/main/java/com/cloud/network/rules/RulesManagerImpl.java |
Resolves trunk addresses for NAT and forwarding. |
server/src/main/java/com/cloud/network/NetworkModelImpl.java |
Adds association lookup and allocated-IP tracking. |
server/src/main/java/com/cloud/network/NetworkMigrationManagerImpl.java |
Transfers associations and refreshes migrated networks. |
server/src/main/java/com/cloud/network/Ipv6AddressManagerImpl.java |
Checks association-held IPv6 addresses. |
server/src/main/java/com/cloud/hypervisor/HypervisorGuruBase.java |
Includes trunk networks in NIC transfer objects. |
server/src/main/java/com/cloud/deploy/DeploymentPlanningManagerImpl.java |
Excludes hosts lacking required VLAN capabilities. |
server/src/main/java/com/cloud/api/query/QueryManagerImpl.java |
Includes associated NICs in network-filtered searches. |
server/src/main/java/com/cloud/api/query/dao/UserVmJoinDaoImpl.java |
Populates trunk associations in VM responses. |
server/src/main/java/com/cloud/api/query/dao/HostJoinDaoImpl.java |
Populates host VLAN capability fields. |
server/src/main/java/com/cloud/api/ApiResponseHelper.java |
Adds network-filtered NIC association responses. |
server/src/main/java/com/cloud/api/ApiDBUtils.java |
Builds associated-network response details. |
pom.xml |
Excludes VO and command/answer classes from coverage. |
plugins/storage/volume/storpool/src/main/java/org/apache/cloudstack/storage/motion/StorPoolDataMotionStrategy.java |
Adds VLAN migration preparation and restoration. |
plugins/storage/volume/linstor/src/test/java/org/apache/cloudstack/storage/motion/LinstorDataMotionStrategyTest.java |
Adds capability and NIC DAO mocks. |
plugins/storage/volume/linstor/src/main/java/org/apache/cloudstack/storage/motion/LinstorDataMotionStrategy.java |
Integrates VLAN handling with storage migration. |
plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtUpdateNicVlanMembershipCommandWrapperTest.java |
Tests live membership updates and failures. |
plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtPrepareForMigrationCommandWrapperTest.java |
Tests destination bridge mapping responses. |
plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtPostMigrationCommandWrapperTest.java |
Tests post-migration VLAN membership application. |
plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtCheckNetworkCommandWrapperTest.java |
Tests guest traffic-label tracking. |
plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/LibvirtVMDefTest.java |
Tests single-VLAN and trunk XML generation. |
plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/LibvirtDomainXMLParserTest.java |
Tests VLAN XML parsing and preservation. |
plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResourceTest.java |
Tests effective guest bridge resolution. |
plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtUpdateNicVlanMembershipCommandWrapper.java |
Handles live VLAN membership commands. |
plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtStartCommandWrapper.java |
Applies manual membership after VM startup. |
plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtReadyCommandWrapper.java |
Reports bridge and libvirt capabilities. |
plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtPrepareForMigrationCommandWrapper.java |
Reports destination bridge names per NIC. |
plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtPostMigrationCommandWrapper.java |
Restores manual membership after migration. |
plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtPlugNicCommandWrapper.java |
Applies membership after NIC attachment. |
plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtCheckNetworkCommandWrapper.java |
Retains the discovered guest traffic label. |
plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/VifDriver.java |
Adds membership lifecycle extension points. |
plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java |
Represents and serializes trunk VLAN tags. |
plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtDomainXMLParser.java |
Parses interface VLAN configuration. |
plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java |
Detects VLAN filtering, STP, and XML support. |
engine/storage/datamotion/src/main/java/org/apache/cloudstack/storage/motion/StorageSystemDataMotionStrategy.java |
Adds VLAN handling to storage-motion migration. |
engine/schema/src/main/resources/META-INF/db/schema-42300to2400.sql |
Adds associations, trunk flags, and usage network IDs. |
engine/schema/src/main/resources/META-INF/cloudstack/core/spring-engine-schema-core-daos-context.xml |
Registers the association DAO. |
engine/schema/src/main/java/com/cloud/vm/NicVO.java |
Persists the multi-network flag. |
engine/schema/src/main/java/com/cloud/vm/dao/NicNetworkMapVO.java |
Models NIC-network associations and addresses. |
engine/schema/src/main/java/com/cloud/vm/dao/NicNetworkMapDaoImpl.java |
Implements association queries. |
engine/schema/src/main/java/com/cloud/vm/dao/NicNetworkMapDao.java |
Defines association persistence operations. |
engine/schema/src/main/java/com/cloud/usage/UsageNetworkOfferingVO.java |
Stores the billed network ID. |
engine/schema/src/main/java/com/cloud/usage/dao/UsageNetworkOfferingDaoImpl.java |
Updates individual usage rows and supports backfill. |
engine/schema/src/main/java/com/cloud/usage/dao/UsageNetworkOfferingDao.java |
Adds network-ID backfill operations. |
engine/schema/src/main/java/com/cloud/host/dao/HostDetailsDaoImpl.java |
Finds VLAN-filtering-enabled hosts. |
engine/schema/src/main/java/com/cloud/host/dao/HostDetailsDao.java |
Adds filtering-capability lookup. |
engine/schema/src/main/java/com/cloud/event/UsageEventVO.java |
Adds network IDs to usage-event details. |
engine/orchestration/src/main/java/com/cloud/agent/manager/AgentManagerImpl.java |
Synchronizes reported VLAN capabilities. |
engine/components-api/src/main/java/com/cloud/event/UsageEventUtils.java |
Publishes usage events per NIC network. |
engine/components-api/src/main/java/com/cloud/deploy/DeploymentPlanningManager.java |
Exposes host-readiness exclusion logic. |
engine/api/src/main/java/org/apache/cloudstack/engine/orchestration/service/NetworkOrchestrationService.java |
Adds feature configuration and association lifecycle hooks. |
engine/api/src/main/java/com/cloud/vm/VirtualMachineManager.java |
Adds VLAN-mapping metadata configuration. |
core/src/main/java/com/cloud/agent/resource/virtualnetwork/model/VmDhcpConfig.java |
Marks associated-network DHCP entries. |
core/src/main/java/com/cloud/agent/resource/virtualnetwork/facade/DhcpEntryConfigItem.java |
Passes association status into DHCP configuration. |
core/src/main/java/com/cloud/agent/api/UpdateNicVlanMembershipCommand.java |
Carries desired live VLAN membership. |
core/src/main/java/com/cloud/agent/api/UpdateNicVlanMembershipAnswer.java |
Reports membership-update results. |
core/src/main/java/com/cloud/agent/api/routing/DhcpEntryCommand.java |
Carries the DHCP association marker. |
core/src/main/java/com/cloud/agent/api/PrepareForMigrationAnswer.java |
Returns destination NIC bridge mappings. |
core/src/main/java/com/cloud/agent/api/MigrateCommand.java |
Carries destination capabilities and bridge mappings. |
api/src/test/java/org/apache/cloudstack/api/command/admin/network/NicNetworkMapCmdTestFixtures.java |
Shares NIC ownership test fixtures. |
api/src/test/java/org/apache/cloudstack/api/command/admin/network/DisassociateNetworkFromNicCmdTest.java |
Tests disassociation command behavior. |
api/src/test/java/org/apache/cloudstack/api/command/admin/network/ChangeNicPrimaryNetworkCmdTest.java |
Tests primary-network change command behavior. |
api/src/main/java/org/apache/cloudstack/storage/template/VnfTemplateManager.java |
Defines VNF trunk validation contracts. |
api/src/main/java/org/apache/cloudstack/api/ResponseGenerator.java |
Adds network-filtered NIC response generation. |
api/src/main/java/org/apache/cloudstack/api/response/NicResponse.java |
Exposes trunk status and associations. |
api/src/main/java/org/apache/cloudstack/api/response/NicNetworkMapResponse.java |
Defines associated-network response fields. |
api/src/main/java/org/apache/cloudstack/api/response/HostResponse.java |
Exposes host VLAN capabilities. |
api/src/main/java/org/apache/cloudstack/api/response/HostForMigrationResponse.java |
Adds migration reasons and cautions. |
api/src/main/java/org/apache/cloudstack/api/command/user/vm/ListNicsCmd.java |
Applies network filtering to association responses. |
api/src/main/java/org/apache/cloudstack/api/command/admin/vm/AssignVMCmd.java |
Accepts trunk groupings during account reassignment. |
api/src/main/java/org/apache/cloudstack/api/command/admin/network/DisassociateNetworkFromNicCmd.java |
Defines the admin disassociation API. |
api/src/main/java/org/apache/cloudstack/api/command/admin/network/ChangeNicPrimaryNetworkCmd.java |
Defines the primary-network change API. |
api/src/main/java/org/apache/cloudstack/api/command/admin/host/FindHostsForMigrationCmd.java |
Populates migration diagnostics. |
api/src/main/java/org/apache/cloudstack/api/ApiConstants.java |
Adds trunk and capability parameter names. |
api/src/main/java/com/cloud/vm/Nic.java |
Exposes the multi-network flag. |
api/src/main/java/com/cloud/server/ManagementService.java |
Defines migration diagnostic methods. |
api/src/main/java/com/cloud/network/NetworkService.java |
Defines association and membership lifecycle operations. |
api/src/main/java/com/cloud/network/NetworkModel.java |
Adds metadata naming and NIC/address lookup. |
api/src/main/java/com/cloud/host/Host.java |
Defines VLAN and STP capability keys. |
api/src/main/java/com/cloud/event/EventTypes.java |
Adds association, primary-change, and backfill events. |
api/src/main/java/com/cloud/agent/api/to/NicTO.java |
Carries trunk status and associated networks. |
Review effort: Balanced
| public boolean hostSupportsVlanFiltering() { | ||
| return isBridgeVlanFilteringEnabled(getEffectiveGuestBridgeName()); |
| if (StringUtils.isNotBlank(nic.getGuestNetworkName())) { | ||
| guestNetworkLabel = nic.getGuestNetworkName(); |
| for (NicNetworkMapVO association : s_nicNetworkMapDao.listByNicId(nic.getId())) { | ||
| NetworkVO associatedNetwork = s_networkDao.findById(association.getNetworkId()); | ||
| if (associatedNetwork != null) { | ||
| publishNicNetworkOfferingUsageEvent(usageType, accountId, zoneId, vmId, entityType, entityUUID, nic.getId(), associatedNetwork, isDefault, |
| SearchBuilder<NetworkVO> networkSearch = networkDao.createSearchBuilder(); | ||
| networkSearch.and("vpcId", networkSearch.entity().getVpcId(), Op.EQ); | ||
| nicSearch.join("vpc", networkSearch, networkSearch.entity().getId(), nicSearch.entity().getNetworkId(), JoinBuilder.JoinType.INNER); |
| this.fetchHostReadiness(entity, params[entity]) | ||
| }, | ||
| fetchHostReadiness (entity, entityId) { | ||
| const params = { type: 'Routing' } |
|
@blueorangutan test |
|
@Pearl1594 a [SL] Trillian-Jenkins test job (ol8 mgmt + kvm-ol8) has been kicked to run smoke tests |






Description
This PR adds support for multi-vlan trunk NICs
doc PR: apache/cloudstack-documentation#689
https://cwiki.apache.org/confluence/spaces/CLOUDSTACK/pages/451972290/Multi+VLAN+trunk+NICs+support+in+KVM
Types of changes
Feature/Enhancement Scale or Bug Severity
Feature/Enhancement Scale
Screenshots (if appropriate):
How Has This Been Tested?
Core trunk mechanism (KVM delivery)
Association lifecycle
Cross-VPC trunk associations
VM deploy and VNF
Network type coverage
DHCP correctness
Usage and billing
Migration
AssignVirtualMachine to another account
UI
How did you try to break this feature and the system with this change?