From b9864cb1e1c879e7ff98f71f7dd4a473bed1513f Mon Sep 17 00:00:00 2001 From: Wei Zhou Date: Wed, 6 Aug 2025 05:14:40 +0200 Subject: [PATCH 01/49] server: fix vm deployment without networkid in a zone with shared networks (#11242) --- server/src/main/java/com/cloud/network/NetworkModelImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/main/java/com/cloud/network/NetworkModelImpl.java b/server/src/main/java/com/cloud/network/NetworkModelImpl.java index 2f904a3275f..f2fc95a0998 100644 --- a/server/src/main/java/com/cloud/network/NetworkModelImpl.java +++ b/server/src/main/java/com/cloud/network/NetworkModelImpl.java @@ -797,7 +797,7 @@ public class NetworkModelImpl extends ManagerBase implements NetworkModel, Confi NetworkVO ret_network = null; for (NetworkVO nw : networks) { try { - checkAccountNetworkPermissions(account, nw); + checkNetworkPermissions(account, nw); } catch (PermissionDeniedException e) { continue; } From fe8f3c8eeb573da3e95843ea459ebfd58f6f562a Mon Sep 17 00:00:00 2001 From: dahn Date: Thu, 7 Aug 2025 14:45:16 +0200 Subject: [PATCH 02/49] get forward header for proxies and apply it in Jetty (#11386) * get forward header and apply it fro proxies Co-authored-by: Daan Hoogland --- .../org/apache/cloudstack/ServerDaemon.java | 19 +++++++++++++++++++ .../main/java/com/cloud/api/ApiServer.java | 4 ++-- .../cloud/utils/ConstantTimeComparator.java | 5 +---- 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/client/src/main/java/org/apache/cloudstack/ServerDaemon.java b/client/src/main/java/org/apache/cloudstack/ServerDaemon.java index 259a99330df..e5ad3d43b2f 100644 --- a/client/src/main/java/org/apache/cloudstack/ServerDaemon.java +++ b/client/src/main/java/org/apache/cloudstack/ServerDaemon.java @@ -24,12 +24,15 @@ import java.io.IOException; import java.io.InputStream; import java.lang.management.ManagementFactory; import java.net.URL; +import java.util.Arrays; import java.util.Properties; +import com.cloud.api.ApiServer; import org.apache.commons.daemon.Daemon; import org.apache.commons.daemon.DaemonContext; import org.apache.commons.lang3.StringUtils; import org.eclipse.jetty.jmx.MBeanContainer; +import org.eclipse.jetty.server.ForwardedRequestCustomizer; import org.eclipse.jetty.server.HttpConfiguration; import org.eclipse.jetty.server.HttpConnectionFactory; import org.eclipse.jetty.server.RequestLog; @@ -184,6 +187,7 @@ public class ServerDaemon implements Daemon { httpConfig.setResponseHeaderSize(8192); httpConfig.setSendServerVersion(false); httpConfig.setSendDateHeader(false); + addForwardingCustomiser(httpConfig); // HTTP Connector createHttpConnector(httpConfig); @@ -206,6 +210,21 @@ public class ServerDaemon implements Daemon { server.join(); } + /** + * Adds a ForwardedRequestCustomizer to the HTTP configuration to handle forwarded headers. + * The header used for forwarding is determined by the ApiServer.listOfForwardHeaders property. + * Only non empty headers are considered and only the first of the comma-separated list is used. + * @param httpConfig the HTTP configuration to which the customizer will be added + */ + private static void addForwardingCustomiser(HttpConfiguration httpConfig) { + ForwardedRequestCustomizer customiser = new ForwardedRequestCustomizer(); + String header = Arrays.stream(ApiServer.listOfForwardHeaders.value().split(",")).findFirst().orElse(null); + if (com.cloud.utils.StringUtils.isNotEmpty(header)) { + customiser.setForwardedForHeader(header); + } + httpConfig.addCustomizer(customiser); + } + @Override public void stop() throws Exception { server.stop(); diff --git a/server/src/main/java/com/cloud/api/ApiServer.java b/server/src/main/java/com/cloud/api/ApiServer.java index e0737a6891d..c78ac05102f 100644 --- a/server/src/main/java/com/cloud/api/ApiServer.java +++ b/server/src/main/java/com/cloud/api/ApiServer.java @@ -315,14 +315,14 @@ public class ApiServer extends ManagerBase implements HttpRequestHandler, ApiSer , "enables/disables checking of ipaddresses from a proxy set header. See \"proxy.header.names\" for the headers to allow." , true , ConfigKey.Scope.Global); - static final ConfigKey listOfForwardHeaders = new ConfigKey<>(ConfigKey.CATEGORY_NETWORK + public static final ConfigKey listOfForwardHeaders = new ConfigKey<>(ConfigKey.CATEGORY_NETWORK , String.class , "proxy.header.names" , "X-Forwarded-For,HTTP_CLIENT_IP,HTTP_X_FORWARDED_FOR" , "a list of names to check for allowed ipaddresses from a proxy set header. See \"proxy.cidr\" for the proxies allowed to set these headers." , true , ConfigKey.Scope.Global); - static final ConfigKey proxyForwardList = new ConfigKey<>(ConfigKey.CATEGORY_NETWORK + public static final ConfigKey proxyForwardList = new ConfigKey<>(ConfigKey.CATEGORY_NETWORK , String.class , "proxy.cidr" , "" diff --git a/utils/src/main/java/com/cloud/utils/ConstantTimeComparator.java b/utils/src/main/java/com/cloud/utils/ConstantTimeComparator.java index baf2bc2738f..48925097f70 100644 --- a/utils/src/main/java/com/cloud/utils/ConstantTimeComparator.java +++ b/utils/src/main/java/com/cloud/utils/ConstantTimeComparator.java @@ -19,8 +19,6 @@ package com.cloud.utils; -import java.nio.charset.Charset; - public class ConstantTimeComparator { public static boolean compareBytes(byte[] b1, byte[] b2) { @@ -36,7 +34,6 @@ public class ConstantTimeComparator { } public static boolean compareStrings(String s1, String s2) { - final Charset encoding = Charset.forName("UTF-8"); - return compareBytes(s1.getBytes(encoding), s2.getBytes(encoding)); + return compareBytes(s1.getBytes(StringUtils.getPreferredCharset()), s2.getBytes(StringUtils.getPreferredCharset())); } } From dc5e475bd2d3e92787b097e23aaea22b69d63e4a Mon Sep 17 00:00:00 2001 From: slavkap <51903378+slavkap@users.noreply.github.com> Date: Thu, 7 Aug 2025 15:47:57 +0300 Subject: [PATCH 03/49] Fix of deployment VM from a copied snapshot in another zone (#11351) * Fix of deploy VM with a snapshot that is copied to another zone * Fix of creating StorPool volume from a snapshot if the size in the offering is bigger than the snapshot size --- .../StorPoolDownloadTemplateCommandWrapper.java | 3 ++- .../main/java/com/cloud/vm/UserVmManagerImpl.java | 12 +----------- 2 files changed, 3 insertions(+), 12 deletions(-) diff --git a/plugins/storage/volume/storpool/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/StorPoolDownloadTemplateCommandWrapper.java b/plugins/storage/volume/storpool/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/StorPoolDownloadTemplateCommandWrapper.java index 3e7118ab81d..da67812cbbe 100644 --- a/plugins/storage/volume/storpool/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/StorPoolDownloadTemplateCommandWrapper.java +++ b/plugins/storage/volume/storpool/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/StorPoolDownloadTemplateCommandWrapper.java @@ -103,9 +103,10 @@ public final class StorPoolDownloadTemplateCommandWrapper extends CommandWrapper final QemuImgFile srcFile = new QemuImgFile(srcDisk.getPath(), srcDisk.getFormat()); final QemuImg qemu = new QemuImg(cmd.getWaitInMillSeconds()); - StorPoolStorageAdaptor.resize( Long.toString(srcDisk.getVirtualSize()), dst.getPath()); if (dst instanceof TemplateObjectTO) { + StorPoolStorageAdaptor.resize(Long.toString(srcDisk.getVirtualSize()), dst.getPath()); + ((TemplateObjectTO) dst).setSize(srcDisk.getVirtualSize()); } diff --git a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java index 6cdcba7e3b6..cd7d198eb61 100644 --- a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java @@ -4195,15 +4195,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir } DiskOfferingVO rootDiskOffering = _diskOfferingDao.findById(rootDiskOfferingId); - long volumesSize = 0; - if (volume != null) { - volumesSize = volume.getSize(); - } else if (snapshot != null) { - VolumeVO volumeVO = _volsDao.findById(snapshot.getVolumeId()); - volumesSize = volumeVO != null ? volumeVO.getSize() : 0; - } else { - volumesSize = configureCustomRootDiskSize(customParameters, template, hypervisorType, rootDiskOffering); - } + long volumesSize = configureCustomRootDiskSize(customParameters, template, hypervisorType, rootDiskOffering); if (rootDiskOffering.getEncrypt() && hypervisorType != HypervisorType.KVM) { throw new InvalidParameterValueException("Root volume encryption is not supported for hypervisor type " + hypervisorType); @@ -6292,7 +6284,6 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir } _accountMgr.checkAccess(caller, null, true, volume); templateId = volume.getTemplateId(); - overrideDiskOfferingId = volume.getDiskOfferingId(); } else if (cmd.getSnapshotId() != null) { snapshot = _snapshotDao.findById(cmd.getSnapshotId()); if (snapshot == null) { @@ -6301,7 +6292,6 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir _accountMgr.checkAccess(caller, null, true, snapshot); VolumeInfo volumeOfSnapshot = getVolume(snapshot.getVolumeId(), templateId, true); templateId = volumeOfSnapshot.getTemplateId(); - overrideDiskOfferingId = volumeOfSnapshot.getDiskOfferingId(); } VirtualMachineTemplate template = null; From 7d59bfe2b59eb06a71c68262dfb08de8ee422ad4 Mon Sep 17 00:00:00 2001 From: Nicolas Vazquez Date: Thu, 7 Aug 2025 09:48:39 -0300 Subject: [PATCH 04/49] [UI] Fix zone creation wizard stuck on configuring public traffic (#11404) * [UI] Fix zone wizard creation stuck on configuring public traffic --- .../views/infra/zone/ZoneWizardLaunchZone.vue | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/ui/src/views/infra/zone/ZoneWizardLaunchZone.vue b/ui/src/views/infra/zone/ZoneWizardLaunchZone.vue index 79ee68c9124..3655ace799d 100644 --- a/ui/src/views/infra/zone/ZoneWizardLaunchZone.vue +++ b/ui/src/views/infra/zone/ZoneWizardLaunchZone.vue @@ -903,6 +903,17 @@ export default { this.setStepStatus(STATUS_FAILED) } }, + async stepNetworkingProviderOrStorageTraffic () { + if (this.stepData.isTungstenZone) { + await this.stepCreateTungstenFabricPublicNetwork() + } else if (this.stepData.isNsxZone) { + await this.stepAddNsxController() + } else if (this.stepData.isNetrisZone) { + await this.stepAddNetrisProvider() + } else { + await this.stepConfigureStorageTraffic() + } + }, async stepConfigurePublicTraffic (message, trafficType, idx) { if ( (this.isBasicZone && @@ -997,17 +1008,11 @@ export default { await this.stepConfigurePublicTraffic('message.configuring.nsx.public.traffic', 'nsxPublicTraffic', 1) } else if (isolationMethods.includes('netris')) { await this.stepConfigurePublicTraffic('message.configuring.netris.public.traffic', 'netrisPublicTraffic', 1) + } else { + await this.stepNetworkingProviderOrStorageTraffic() } } else { - if (this.stepData.isTungstenZone) { - await this.stepCreateTungstenFabricPublicNetwork() - } else if (this.stepData.isNsxZone) { - await this.stepAddNsxController() - } else if (this.stepData.isNetrisZone) { - await this.stepAddNetrisProvider() - } else { - await this.stepConfigureStorageTraffic() - } + await this.stepNetworkingProviderOrStorageTraffic() } } else if (this.isAdvancedZone && this.sgEnabled) { if (this.stepData.isTungstenZone) { From 78e146278b332bf1ac11d3b2324e0e65debc1e18 Mon Sep 17 00:00:00 2001 From: Wei Zhou Date: Fri, 8 Aug 2025 12:36:18 +0200 Subject: [PATCH 05/49] api: fix scale or upgrade systemvm (#11062) --- .../cloudstack/api/command/admin/systemvm/ScaleSystemVMCmd.java | 2 +- .../api/command/admin/systemvm/UpgradeSystemVMCmd.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/systemvm/ScaleSystemVMCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/systemvm/ScaleSystemVMCmd.java index f694988efa0..264806f0350 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/systemvm/ScaleSystemVMCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/systemvm/ScaleSystemVMCmd.java @@ -76,7 +76,7 @@ public class ScaleSystemVMCmd extends BaseAsyncCmd { } public Map getDetails() { - return details; + return convertDetailsToMap(details); } ///////////////////////////////////////////////////// diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/systemvm/UpgradeSystemVMCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/systemvm/UpgradeSystemVMCmd.java index 12f80f32b06..95d9ab562bf 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/systemvm/UpgradeSystemVMCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/systemvm/UpgradeSystemVMCmd.java @@ -70,7 +70,7 @@ public class UpgradeSystemVMCmd extends BaseCmd { } public Map getDetails() { - return details; + return convertDetailsToMap(details); } ///////////////////////////////////////////////////// From 26218b093ea0760e6285ac3e83ce597371ec7c43 Mon Sep 17 00:00:00 2001 From: Vishesh Date: Mon, 11 Aug 2025 16:23:59 +0530 Subject: [PATCH 06/49] Fix edit of compute offering in UI (#11417) --- ui/src/config/section/offering.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/src/config/section/offering.js b/ui/src/config/section/offering.js index 7bdd992039c..e8016cae0df 100644 --- a/ui/src/config/section/offering.js +++ b/ui/src/config/section/offering.js @@ -96,7 +96,7 @@ export default { label: 'label.edit', docHelp: 'adminguide/service_offerings.html#modifying-or-deleting-a-service-offering', dataView: true, - args: ['name', 'displaytext', 'storageatags', 'hosttags', 'externaldetails'], + args: ['name', 'displaytext', 'storagetags', 'hosttags', 'externaldetails'], mapping: { externaldetails: { transformedvalue: (record) => { return getFilteredExternalDetails(record.serviceofferingdetails) } From 53b026487fba94a016387e9a7b6e68e2725663f5 Mon Sep 17 00:00:00 2001 From: Nicolas Vazquez Date: Mon, 11 Aug 2025 08:10:44 -0300 Subject: [PATCH 07/49] UI: Fix duplicate edit zone button on Basic zones (#11427) --- ui/src/config/section/infra/zones.js | 1 + 1 file changed, 1 insertion(+) diff --git a/ui/src/config/section/infra/zones.js b/ui/src/config/section/infra/zones.js index c957f885469..61aef1706c0 100644 --- a/ui/src/config/section/infra/zones.js +++ b/ui/src/config/section/infra/zones.js @@ -119,6 +119,7 @@ export default { label: 'label.action.edit.zone', dataView: true, popup: true, + show: (record) => { return record.networktype === 'Advanced' }, component: shallowRef(defineAsyncComponent(() => import('@/views/infra/ZoneUpdate.vue'))) }, { From 1994511f0c9de1324d4ca7a9f0a945cd53c808f7 Mon Sep 17 00:00:00 2001 From: Vishesh Date: Mon, 11 Aug 2025 17:59:26 +0530 Subject: [PATCH 08/49] noVNC: Show a dot cursor when the cursor is not visible (#11418) --- .../cloudstack/consoleproxy/ConsoleAccessManagerImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/main/java/org/apache/cloudstack/consoleproxy/ConsoleAccessManagerImpl.java b/server/src/main/java/org/apache/cloudstack/consoleproxy/ConsoleAccessManagerImpl.java index 306023a2263..2edb6bab001 100644 --- a/server/src/main/java/org/apache/cloudstack/consoleproxy/ConsoleAccessManagerImpl.java +++ b/server/src/main/java/org/apache/cloudstack/consoleproxy/ConsoleAccessManagerImpl.java @@ -516,7 +516,7 @@ public class ConsoleAccessManagerImpl extends ManagerBase implements ConsoleAcce sb.append("/ajax?token=" + token); } else { sb.append("/resource/noVNC/vnc.html") - .append("?autoconnect=true") + .append("?autoconnect=true&show_dot=true") .append("&port=" + vncPort) .append("&token=" + token); if (requiresVncOverWebSocketConnection(vm, hostVo) && details != null && details.getValue() != null) { From e57e8cf4189b60bb0d031e149648452689031bab Mon Sep 17 00:00:00 2001 From: Ruben Bosch <8641284+Rubueno@users.noreply.github.com> Date: Mon, 11 Aug 2025 16:41:36 +0200 Subject: [PATCH 09/49] Network rate must be multiplied by 125 not 128 (#10645) * Network rate must be multiplied by 125 not 128 In a libvirt domain xml when nw_rate=5000 the kilobytes per second configured in the interface is 640000 which is 5.12 Gbit/s. Which is more than the configured network rate of 5Gbit/s. So instead multiply by 125. * Apply suggestions from code review Co-authored-by: Suresh Kumar Anaparti --- .../cloud/hypervisor/kvm/resource/BridgeVifDriver.java | 2 +- .../cloud/hypervisor/kvm/resource/DirectVifDriver.java | 4 ++-- .../com/cloud/hypervisor/kvm/resource/IvsVifDriver.java | 2 +- .../com/cloud/hypervisor/kvm/resource/OvsVifDriver.java | 4 ++-- .../com/cloud/hypervisor/kvm/resource/VifDriverBase.java | 9 +++++++++ 5 files changed, 15 insertions(+), 6 deletions(-) diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/BridgeVifDriver.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/BridgeVifDriver.java index 10012fba658..98107c8609e 100644 --- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/BridgeVifDriver.java +++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/BridgeVifDriver.java @@ -211,7 +211,7 @@ public class BridgeVifDriver extends VifDriverBase { String trafficLabel = nic.getName(); Integer networkRateKBps = 0; if (libvirtVersion > ((10 * 1000 + 10))) { - networkRateKBps = (nic.getNetworkRateMbps() != null && nic.getNetworkRateMbps().intValue() != -1) ? nic.getNetworkRateMbps().intValue() * 128 : 0; + networkRateKBps = getNetworkRateKbps(nic); } if (nic.getType() == Networks.TrafficType.Guest) { diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/DirectVifDriver.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/DirectVifDriver.java index 71afc940932..580621b39a7 100644 --- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/DirectVifDriver.java +++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/DirectVifDriver.java @@ -30,7 +30,6 @@ import java.util.Map; public class DirectVifDriver extends VifDriverBase { - /** * Experimental driver to configure direct networking in libvirt. This should only * be used on an LXC cluster that does not run any system VMs. @@ -42,13 +41,14 @@ public class DirectVifDriver extends VifDriverBase { * @throws InternalErrorException * @throws LibvirtException */ + @Override public LibvirtVMDef.InterfaceDef plug(NicTO nic, String guestOsType, String nicAdapter, Map extraConfig) throws InternalErrorException, LibvirtException { LibvirtVMDef.InterfaceDef intf = new LibvirtVMDef.InterfaceDef(); if (Sets.newHashSet(Networks.TrafficType.Guest, Networks.TrafficType.Public).contains(nic.getType())) { - Integer networkRateKBps = (nic.getNetworkRateMbps() != null && nic.getNetworkRateMbps().intValue() != -1) ? nic.getNetworkRateMbps().intValue() * 128 : 0; + Integer networkRateKBps = getNetworkRateKbps(nic); intf.defDirectNet(_libvirtComputingResource.getNetworkDirectDevice(), null, nic.getMac(), getGuestNicModel(guestOsType, nicAdapter), _libvirtComputingResource.getNetworkDirectSourceMode(), networkRateKBps); } diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/IvsVifDriver.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/IvsVifDriver.java index 2386e7d2d59..bbe87aa1373 100644 --- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/IvsVifDriver.java +++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/IvsVifDriver.java @@ -93,7 +93,7 @@ public class IvsVifDriver extends VifDriverBase { vlanId = NetUtils.getPrimaryPvlanFromUri(nic.getBroadcastUri()); } String trafficLabel = nic.getName(); - Integer networkRateKBps = (nic.getNetworkRateMbps() != null && nic.getNetworkRateMbps().intValue() != -1) ? nic.getNetworkRateMbps().intValue() * 128 : 0; + Integer networkRateKBps = getNetworkRateKbps(nic); if (nic.getType() == Networks.TrafficType.Guest) { if ((nic.getBroadcastType() == Networks.BroadcastDomainType.Vlan || nic.getBroadcastType() == Networks.BroadcastDomainType.Pvlan) && !vlanId.equalsIgnoreCase("untagged")) { diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/OvsVifDriver.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/OvsVifDriver.java index e3ce9f4b8a6..4c0482c5384 100644 --- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/OvsVifDriver.java +++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/OvsVifDriver.java @@ -130,7 +130,7 @@ public class OvsVifDriver extends VifDriverBase { } String trafficLabel = nic.getName(); if (nic.getType() == Networks.TrafficType.Guest) { - Integer networkRateKBps = (nic.getNetworkRateMbps() != null && nic.getNetworkRateMbps().intValue() != -1) ? nic.getNetworkRateMbps().intValue() * 128 : 0; + Integer networkRateKBps = getNetworkRateKbps(nic); if ((nic.getBroadcastType() == Networks.BroadcastDomainType.Vlan || nic.getBroadcastType() == Networks.BroadcastDomainType.Pvlan) && !vlanId.equalsIgnoreCase("untagged")) { if (trafficLabel != null && !trafficLabel.isEmpty()) { @@ -162,7 +162,7 @@ public class OvsVifDriver extends VifDriverBase { createControlNetwork(_bridges.get("linklocal")); intf.defBridgeNet(_bridges.get("linklocal"), null, nic.getMac(), getGuestNicModel(guestOsType, nicAdapter)); } else if (nic.getType() == Networks.TrafficType.Public) { - Integer networkRateKBps = (nic.getNetworkRateMbps() != null && nic.getNetworkRateMbps().intValue() != -1) ? nic.getNetworkRateMbps().intValue() * 128 : 0; + Integer networkRateKBps = getNetworkRateKbps(nic); if (nic.getBroadcastType() == Networks.BroadcastDomainType.Vlan && !vlanId.equalsIgnoreCase("untagged")) { if (trafficLabel != null && !trafficLabel.isEmpty()) { logger.debug("creating a vlan dev and bridge for public traffic per traffic label " + trafficLabel); diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/VifDriverBase.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/VifDriverBase.java index c227ca69453..2ad2b8a6d4c 100644 --- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/VifDriverBase.java +++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/VifDriverBase.java @@ -40,6 +40,8 @@ public abstract class VifDriverBase implements VifDriver { protected Map _pifs; protected Map _bridges; + protected static final int bitsPerMbpsToKbps = 125; + @Override public void configure(Map params) throws ConfigurationException { _libvirtComputingResource = (LibvirtComputingResource)params.get("libvirt.computing.resource"); @@ -78,4 +80,11 @@ public abstract class VifDriverBase implements VifDriver { public boolean isExistingBridge(String bridgeName) { return false; } + + protected static int getNetworkRateKbps(NicTO nic) { + if (nic.getNetworkRateMbps() != null && nic.getNetworkRateMbps().intValue() != -1) { + return nic.getNetworkRateMbps().intValue() * bitsPerMbpsToKbps; + } + return 0; + } } From f5b4858012b41993f97b3a762397b5b7e6e0de3e Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Mon, 11 Aug 2025 20:41:57 +0530 Subject: [PATCH 10/49] ui: make vpc cidr required when not showing cidrsize (#11393) Fixes #11391 Signed-off-by: Abhishek Kumar --- ui/src/views/network/CreateVpc.vue | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/ui/src/views/network/CreateVpc.vue b/ui/src/views/network/CreateVpc.vue index d239d04e143..272d989124e 100644 --- a/ui/src/views/network/CreateVpc.vue +++ b/ui/src/views/network/CreateVpc.vue @@ -72,7 +72,7 @@ :placeholder="apiParams.cidr.description"/>