Skip to content
Draft
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
e45ea95
engine-schema: upgrade path for 24.0.0
shwstppr Sep 14, 2026
c2ebb3a
Support multi-VLAN trunk NICs
Pearl1594 Sep 14, 2026
219f9cb
Merge branch 'main' of github.com:apache/cloudstack into support-mult…
Pearl1594 Sep 14, 2026
eb97acf
deliver multi-VLAN trunk nics via libvirt vlan XML and bridge fallback
Pearl1594 Sep 16, 2026
d143862
Fix nic_network_map unique constraint blocking re-association
Pearl1594 Sep 28, 2026
a7b6a8e
Deliver multi-VLAN trunk NICs on KVM via libvirt vlan XML and bridge …
Pearl1594 Sep 28, 2026
bcb89ab
Bill usage for a trunk nic's associated networks
Pearl1594 Sep 28, 2026
3d27d89
Expose trunk nic and associated-network info in NicResponse
Pearl1594 Sep 28, 2026
dd4ee2a
Add ApiConstants for NicResponse trunk fields
Pearl1594 Sep 28, 2026
c16a58d
Add multi-VLAN trunk NIC association service
Pearl1594 Sep 28, 2026
88585ed
Add EventTypes constants for the association service commit
Pearl1594 Sep 28, 2026
df74bd9
Support multi-VLAN trunk NICs at VM deploy time
Pearl1594 Sep 28, 2026
3a7519d
Fix static NAT lookup in disassociate guard
Pearl1594 Sep 28, 2026
68d7771
Fix VNF management nic trunkable via live associate API
Pearl1594 Sep 28, 2026
485ad26
Fix stale nic fields after changing its primary network
Pearl1594 Sep 28, 2026
721bae1
Clear multiNetwork flag when a nic's last trunk association is removed
Pearl1594 Sep 29, 2026
1a3ddfb
Push DHCP entries to a trunk nic's associated networks
Pearl1594 Sep 29, 2026
5088e0b
Add KVM live migration support for multi-VLAN trunk NICs (Phase 7)
Pearl1594 Oct 2, 2026
01729b9
Merge branch 'main' of github.com:apache/cloudstack into support-mult…
Pearl1594 Oct 2, 2026
c9b98ea
fix test
Pearl1594 Oct 2, 2026
5f95946
Fix CI build failures from the multi-VLAN trunk NIC changes
Pearl1594 Oct 2, 2026
b4c18d6
Fix NullPointerException in LibvirtComputingResourceTest.testMigrateC…
Pearl1594 Oct 2, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Merge branch 'main' of github.com:apache/cloudstack into support-mult…
…i-vlan-guestnet

# Conflicts:
#	engine/schema/src/main/java/com/cloud/upgrade/DatabaseUpgradeChecker.java
#	engine/schema/src/main/resources/META-INF/db/schema-42300to2400.sql
#	plugins/integrations/veeam-control-service/src/main/java/org/apache/cloudstack/veeam/api/dto/Version.java
#	utils/src/main/java/org/apache/cloudstack/utils/CloudStackVersion.java
#	utils/src/test/java/org/apache/cloudstack/utils/CloudStackVersionTest.java
  • Loading branch information
Pearl1594 committed Oct 2, 2026
commit 01729b9903d8ccf72003853ee2b5e6fbe8b6e71a
Original file line number Diff line number Diff line change
Expand Up @@ -515,13 +515,7 @@ protected void doUpgrades(GlobalLock lock) {
String csVersion = parseSystemVmMetadata();
final CloudStackVersion sysVmVersion = CloudStackVersion.parse(csVersion);
final CloudStackVersion currentVersion = CloudStackVersion.parse(currentVersionValue);
if (sysVmVersion.usesNewVersioning()) {
SystemVmTemplateRegistration.CS_MAJOR_VERSION = String.valueOf(sysVmVersion.getMajorRelease());
SystemVmTemplateRegistration.CS_TINY_VERSION = String.valueOf(sysVmVersion.getMajorRelease());
} else {
SystemVmTemplateRegistration.CS_MAJOR_VERSION = String.format("%d.%d", sysVmVersion.getMajorRelease(), sysVmVersion.getMinorRelease());
SystemVmTemplateRegistration.CS_TINY_VERSION = String.valueOf(sysVmVersion.getPatchRelease());
}
updateSystemVmTemplateVersion(sysVmVersion);

LOGGER.info("DB version = {} Code Version = {}", dbVersion, currentVersion);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,10 +87,8 @@ public static Version fromPackageAndCSVersion(boolean complete) {
}
version.setMajor(String.valueOf(csVersion.getMajorRelease()));
version.setMinor(String.valueOf(csVersion.getMinorRelease()));
if (csVersion.usesNewVersioning()) {
version.setBuild(String.valueOf(csVersion.getSecurityRelease()));
} else {
version.setBuild(String.valueOf(csVersion.getPatchRelease()));
version.setBuild(String.valueOf(csVersion.getTinyRelease()));
if (!csVersion.usesNewVersioning()) {
version.setRevision(String.valueOf(csVersion.getSecurityRelease()));
}
return version;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,11 +41,14 @@ public final class CloudStackVersion implements Comparable<CloudStackVersion> {

private final static Pattern NUMBER_VERSION_FORMAT = Pattern.compile("\\d+\\.\\d+\\.\\d+(?:\\.\\d+)?");
private final static Pattern FULL_VERSION_FORMAT = Pattern.compile("\\d+\\.\\d+\\.\\d+(?:\\.\\d+)?(?:-[a-zA-Z]+)?(?:-\\d+)?(?:-SNAPSHOT)?");
// Kept in sync with the same constant in engine/schema/templateConfig.sh and
// scripts/installer/export-templates.sh, which independently generate/consume
// system VM template metadata using this same versioning cutover rule.
private final static int NEW_VERSIONING_CUTOVER_MAJOR_VERSION = 24;

private final int majorRelease;
private final int minorRelease;
private final Integer patchRelease;
private final int patchRelease;
private final Integer securityRelease;
// Whether this instance was parsed via parse(value, true) — a version scheme other than
// CloudStack's own. Deliberately excluded from equals()/hashCode(): two instances with the same
Expand All @@ -55,13 +58,13 @@ public final class CloudStackVersion implements Comparable<CloudStackVersion> {
// release numbering.
private final boolean external;

private CloudStackVersion(final int majorRelease, final int minorRelease, final Integer patchRelease, final Integer securityRelease) {
private CloudStackVersion(final int majorRelease, final int minorRelease, final int patchRelease, final Integer securityRelease, final boolean external) {

super();

checkArgument(majorRelease >= 0, CloudStackVersion.class.getName() + "(int, int, int, Integer) requires a majorRelease greater than 0.");
checkArgument(minorRelease >= 0, CloudStackVersion.class.getName() + "(int, int, int, Integer) requires a minorRelease greater than 0.");
checkArgument(patchRelease == null || patchRelease >= 0, CloudStackVersion.class.getName() + "(int, int, int, Integer) requires a patchRelease greater than 0.");
checkArgument(patchRelease >= 0, CloudStackVersion.class.getName() + "(int, int, int, Integer) requires a patchRelease greater than 0.");
checkArgument(securityRelease == null || securityRelease >= 0,
CloudStackVersion.class.getName() + "(int, int, int, Integer) requires a null securityRelease or a non-null value greater than 0.");

Expand All @@ -83,7 +86,9 @@ private CloudStackVersion(final int majorRelease, final int minorRelease, final
* <li><code>&lt;major&gt;.&lt;minor&gt;.&lt;security release&gt;</code> (for versions &gt;= 24.0.0)</li>
* </ul>
*
* Legacy patch-based formats remain supported for backward compatibility.
* Legacy patch-based formats remain supported for backward compatibility, e.g. <code>4.23.0.1-SNAPSHOT</code>,
* but only below major version 24: a 4-position value whose major release is at or above 24, e.g.
* <code>24.0.0.1</code>, is rejected.
*
* If the string contains a suffix that begins with a "-" character, then the "-" and all characters following it
* will be dropped.
Expand Down Expand Up @@ -136,25 +141,6 @@ public static CloudStackVersion parse(final String value, final boolean external
final int patchRelease;
final Integer securityRelease;

if (components.length == 4) {
checkArgument(isLegacyVersioning(majorRelease), CloudStackVersion.class.getName() + ".parse(String) passed " + value +
", but major versions at or above 24 do not support legacy int.int.int.int format");
// Deprecated legacy format: major.minor.patch.security
patchRelease = thirdComponent;
securityRelease = Integer.valueOf(components[3]);
} else if (isNewVersioning(majorRelease)) {
// New format: major.minor.securityRelease (patch dropped)
patchRelease = 0;
securityRelease = thirdComponent;
} else {
// Deprecated legacy format: major.minor.patch
patchRelease = thirdComponent;
securityRelease = null;
}

final int patchRelease;
final Integer securityRelease;

if (components.length == 4) {
checkArgument(external || isLegacyVersioning(majorRelease), CloudStackVersion.class.getName() + ".parse(String) passed " + value +
", but major versions at or above 24 do not support legacy int.int.int.int format");
Expand Down Expand Up @@ -357,7 +343,18 @@ public Integer getSecurityRelease() {
}

public boolean usesNewVersioning() {
return isNewVersioning(majorRelease);
return !external && isNewVersioning(majorRelease);
}

/**
* The release component that identifies this version's "tiny"/build release: the security
* release for a new-versioning (post-cutover) CloudStack version, or the patch release otherwise.
* Consolidates a mapping that callers (e.g. system VM template version resolution, the Veeam
* integration's version reporting) would otherwise have to re-derive from
* {@link #usesNewVersioning()} themselves.
*/
public int getTinyRelease() {
return usesNewVersioning() ? securityRelease : patchRelease;
}

@Override
Expand Down Expand Up @@ -387,7 +384,7 @@ public int hashCode() {
@Override
public String toString() {
// Canonicalize cutover-and-later versions to major.minor.securityRelease.
if (securityRelease != null && patchRelease == 0 && isNewVersioning(majorRelease)) {
if (securityRelease != null && patchRelease == 0 && usesNewVersioning()) {
return Joiner.on(".").join(ImmutableList.of(majorRelease, minorRelease, securityRelease));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -317,6 +317,11 @@ public void testGetParentVersion() {
verifyGetVMwareParentVersion("8.0.0", "8.0");
verifyGetVMwareParentVersion("8.0.0.2", "8.0");
verifyGetVMwareParentVersion("8.0.1.0", "8.0.1");
verifyGetVMwareParentVersion("24.1.1", "24.1");
// A hypervisor version whose major happens to match CloudStack's own new-versioning cutover (24)
// must still be treated as an ordinary major.minor.patch VMware version, not as a CloudStack
// major.minor.security value: the patch component ("1") must not be dropped.
verifyGetVMwareParentVersion("24.1.0", "24.1");
verifyGetVMwareParentVersion("24.1.1", "24.1.1");
verifyGetVMwareParentVersion("24.1.1.2", "24.1.1");
}
}
Loading
You are viewing a condensed version of this merge commit. You can view the full changes here.