From ee94ae575b7bb28d3350b049454b0026db85c7d1 Mon Sep 17 00:00:00 2001
From: Imvedansh <113465074+Imvedansh@users.noreply.github.com>
Date: Fri, 28 Mar 2025 23:29:43 +0530
Subject: [PATCH 1/4] Enhance VPC Network Tier form to auto-populate Gateway,
and Netmask (#10617)
---
ui/public/locales/en.json | 4 +--
ui/src/utils/network.js | 51 ++++++++++++++++++++++++++++
ui/src/views/network/VpcTiersTab.vue | 18 +++++++---
3 files changed, 67 insertions(+), 6 deletions(-)
create mode 100644 ui/src/utils/network.js
diff --git a/ui/public/locales/en.json b/ui/public/locales/en.json
index c1c88da62d3..ea2ab491fb5 100644
--- a/ui/public/locales/en.json
+++ b/ui/public/locales/en.json
@@ -576,9 +576,9 @@
"label.create.template": "Create Template",
"label.create.tier.aclid.description": "The ACL associated with the Network Tier.",
"label.create.tier.externalid.description": "ID of the Network in an external system.",
-"label.create.tier.gateway.description": "The Network Tier's gateway in the super CIDR range, not overlapping with the CIDR of other Network Tiers in this VPC.",
+"label.create.tier.gateway.description": "Gateway IP must be within VPC CIDR ({value})",
"label.create.tier.name.description": "A unique name for the Network Tier.",
-"label.create.tier.netmask.description": "The Network Tier's netmask. For example 255.255.255.0",
+"label.create.tier.netmask.description": "Network Tier's netmask must be more restrictive than {value}",
"label.create.tier.networkofferingid.description": "The Network offering for the Network Tier.",
"label.create.tungsten.routing.policy": "Create Tungsten-Fabric routing policy",
"label.create.user": "Create User",
diff --git a/ui/src/utils/network.js b/ui/src/utils/network.js
new file mode 100644
index 00000000000..c3054f48ff7
--- /dev/null
+++ b/ui/src/utils/network.js
@@ -0,0 +1,51 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+// Parsing CIDR into Gateway,Netmask Placeholders
+
+export function getNetmaskFromCidr (cidr) {
+ if (!cidr?.includes('/')) return undefined
+ const [, maskBits] = cidr.split('/')
+ const subnetMasks = {
+ 8: '255.0.0.0',
+ 9: '255.128.0.0',
+ 10: '255.192.0.0',
+ 11: '255.224.0.0',
+ 12: '255.240.0.0',
+ 13: '255.248.0.0',
+ 14: '255.252.0.0',
+ 15: '255.254.0.0',
+ 16: '255.255.0.0',
+ 17: '255.255.128.0',
+ 18: '255.255.192.0',
+ 19: '255.255.224.0',
+ 20: '255.255.240.0',
+ 21: '255.255.248.0',
+ 22: '255.255.252.0',
+ 23: '255.255.254.0',
+ 24: '255.255.255.0',
+ 25: '255.255.255.128',
+ 26: '255.255.255.192',
+ 27: '255.255.255.224',
+ 28: '255.255.255.240',
+ 29: '255.255.255.248',
+ 30: '255.255.255.252',
+ 31: '255.255.255.254',
+ 32: '255.255.255.255'
+ }
+ return subnetMasks[+maskBits] || '255.255.255.0'
+}
diff --git a/ui/src/views/network/VpcTiersTab.vue b/ui/src/views/network/VpcTiersTab.vue
index 73410ca1d05..ec394d83b7a 100644
--- a/ui/src/views/network/VpcTiersTab.vue
+++ b/ui/src/views/network/VpcTiersTab.vue
@@ -223,18 +223,18 @@
-
+
-
+
@@ -344,6 +344,7 @@ import { api } from '@/api'
import { mixinForm } from '@/utils/mixin'
import Status from '@/components/widgets/Status'
import TooltipLabel from '@/components/widgets/TooltipLabel'
+import { getNetmaskFromCidr } from '@/utils/network'
export default {
name: 'VpcTiersTab',
@@ -381,6 +382,8 @@ export default {
selectedNetworkOffering: {},
privateMtuMax: 1500,
errorPrivateMtu: '',
+ gatewayPlaceholder: '',
+ netmaskPlaceholder: '',
algorithms: {
Source: 'source',
'Round-robin': 'roundrobin',
@@ -617,6 +620,13 @@ export default {
this.initForm()
this.fetchNetworkAclList()
this.fetchNetworkOfferings()
+ const cidr = this.resource.cidr
+ const netmask = getNetmaskFromCidr(cidr)
+ if (netmask) {
+ this.gatewayPlaceholder = this.$t('label.create.tier.gateway.description', { value: cidr })
+ this.netmaskPlaceholder = this.$t('label.create.tier.netmask.description', { value: netmask })
+ }
+
this.showCreateNetworkModal = true
this.rules = {
name: [{ required: true, message: this.$t('label.required') }],
From d5ba39387b690bf6f778e34ab5be0e9693afb0d4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bernardo=20De=20Marco=20Gon=C3=A7alves?=
Date: Tue, 8 Apr 2025 07:16:18 -0300
Subject: [PATCH 2/4] fix projects metrics on dashboard (#10651)
---
ui/src/views/dashboard/UsageDashboard.vue | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/ui/src/views/dashboard/UsageDashboard.vue b/ui/src/views/dashboard/UsageDashboard.vue
index 9df3b38c6a9..5069968a419 100644
--- a/ui/src/views/dashboard/UsageDashboard.vue
+++ b/ui/src/views/dashboard/UsageDashboard.vue
@@ -460,9 +460,13 @@ export default {
},
listProject () {
this.loading = true
- api('listProjects', { id: store.getters.project.id }).then(json => {
+ const params = {
+ id: store.getters.project.id,
+ listall: true
+ }
+ api('listProjects', params).then(json => {
this.loading = false
- if (json && json.listprojectsresponse && json.listprojectsresponse.project) {
+ if (json?.listprojectsresponse?.project) {
this.project = json.listprojectsresponse.project[0]
}
})
From e08f88f0ae6fd10fa27fda093be33d91b8113ecf Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bernardo=20De=20Marco=20Gon=C3=A7alves?=
Date: Tue, 8 Apr 2025 08:14:29 -0300
Subject: [PATCH 3/4] define the limit of projects through the UI (#10652)
---
ui/src/components/view/ResourceLimitTab.vue | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/ui/src/components/view/ResourceLimitTab.vue b/ui/src/components/view/ResourceLimitTab.vue
index 875d2cc3b40..2717a43eb07 100644
--- a/ui/src/components/view/ResourceLimitTab.vue
+++ b/ui/src/components/view/ResourceLimitTab.vue
@@ -27,7 +27,7 @@
>
Date: Wed, 9 Apr 2025 13:03:01 +0530
Subject: [PATCH 4/4] xenserver: do not destroy halted hypervisor vm (#9175)
Signed-off-by: Abhishek Kumar
---
.../resource/CitrixResourceBase.java | 38 ++++++++++++++-----
.../xen56/XenServer56FenceCommandWrapper.java | 2 +-
.../XenServer56FP1FenceCommandWrapper.java | 2 +-
.../CitrixCreateVMSnapshotCommandWrapper.java | 9 ++---
.../CitrixDeleteVMSnapshotCommandWrapper.java | 2 +-
...itrixRevertToVMSnapshotCommandWrapper.java | 3 +-
.../xenbase/CitrixStartCommandWrapper.java | 2 +-
.../xenbase/CitrixStopCommandWrapper.java | 2 +-
8 files changed, 40 insertions(+), 20 deletions(-)
diff --git a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java
index f53a70de722..322f69c9531 100644
--- a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java
+++ b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java
@@ -51,10 +51,6 @@ import java.util.concurrent.TimeoutException;
import javax.naming.ConfigurationException;
import javax.xml.parsers.ParserConfigurationException;
-import com.trilead.ssh2.SFTPException;
-import com.trilead.ssh2.SFTPv3Client;
-import com.trilead.ssh2.SFTPv3DirectoryEntry;
-import com.trilead.ssh2.SFTPv3FileAttributes;
import org.apache.cloudstack.api.ApiConstants;
import org.apache.cloudstack.diagnostics.CopyToSecondaryStorageAnswer;
import org.apache.cloudstack.diagnostics.CopyToSecondaryStorageCommand;
@@ -72,6 +68,7 @@ import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
+import org.apache.maven.artifact.versioning.ComparableVersion;
import org.apache.xmlrpc.XmlRpcException;
import org.joda.time.Duration;
import org.w3c.dom.Document;
@@ -153,6 +150,10 @@ import com.cloud.vm.VirtualMachine;
import com.cloud.vm.VirtualMachine.PowerState;
import com.cloud.vm.VmDetailConstants;
import com.trilead.ssh2.SCPClient;
+import com.trilead.ssh2.SFTPException;
+import com.trilead.ssh2.SFTPv3Client;
+import com.trilead.ssh2.SFTPv3DirectoryEntry;
+import com.trilead.ssh2.SFTPv3FileAttributes;
import com.xensource.xenapi.Bond;
import com.xensource.xenapi.Connection;
import com.xensource.xenapi.Console;
@@ -627,7 +628,7 @@ public abstract class CitrixResourceBase extends ServerResourceBase implements S
if (VmPowerState.HALTED.equals(vmRec.powerState) && vmRec.affinity.equals(host) && !isAlienVm(vm, conn)) {
try {
- vm.destroy(conn);
+ destroyVm(vm, conn);
} catch (final Exception e) {
s_logger.warn("Catch Exception " + e.getClass().getName() + ": unable to destroy VM " + vmRec.nameLabel + " due to ", e);
success = false;
@@ -1452,7 +1453,7 @@ public abstract class CitrixResourceBase extends ServerResourceBase implements S
vm.setPVBootloader(conn, "pygrub");
vm.setPVBootloaderArgs(conn, CitrixHelper.getPVbootloaderArgs(guestOsTypeName));
} else {
- vm.destroy(conn);
+ destroyVm(vm, conn, true);
throw new CloudRuntimeException("Unable to handle boot loader type: " + vmSpec.getBootloader());
}
}
@@ -2038,7 +2039,7 @@ public abstract class CitrixResourceBase extends ServerResourceBase implements S
final Long domId = vm.getDomid(conn);
callHostPlugin(conn, "vmopspremium", "forceShutdownVM", "domId", domId.toString());
vm.powerStateReset(conn);
- vm.destroy(conn);
+ destroyVm(vm, conn);
} catch (final Exception e) {
final String msg = "forceShutdown failed due to " + e.toString();
s_logger.warn(msg, e);
@@ -3690,7 +3691,7 @@ public abstract class CitrixResourceBase extends ServerResourceBase implements S
}
if (vm.getPowerState(conn) == VmPowerState.HALTED) {
try {
- vm.destroy(conn);
+ destroyVm(vm, conn, true);
} catch (final Exception e) {
s_logger.warn("VM destroy failed due to ", e);
}
@@ -5208,7 +5209,7 @@ public abstract class CitrixResourceBase extends ServerResourceBase implements S
}
if (vm.getPowerState(conn) == VmPowerState.HALTED) {
try {
- vm.destroy(conn);
+ destroyVm(vm, conn, true);
} catch (final Exception e) {
final String msg = "VM destroy failed due to " + e.toString();
s_logger.warn(msg, e);
@@ -5875,4 +5876,23 @@ public abstract class CitrixResourceBase extends ServerResourceBase implements S
s_logger.warn(errMsg);
}
}
+
+ public boolean isDestroyHaltedVms() {
+ ComparableVersion version = new ComparableVersion(getHost().getProductVersion());
+ if (version.compareTo(new ComparableVersion("8.0")) >= 0) {
+ return false;
+ }
+ return true;
+ }
+
+ public void destroyVm(VM vm, Connection connection, boolean forced) throws XenAPIException, XmlRpcException {
+ if (!isDestroyHaltedVms() && !forced) {
+ return;
+ }
+ vm.destroy(connection);
+ }
+
+ public void destroyVm(VM vm, Connection connection) throws XenAPIException, XmlRpcException {
+ destroyVm(vm, connection, false);
+ }
}
diff --git a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xen56/XenServer56FenceCommandWrapper.java b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xen56/XenServer56FenceCommandWrapper.java
index 3cebbd9a342..713807ffaee 100644
--- a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xen56/XenServer56FenceCommandWrapper.java
+++ b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xen56/XenServer56FenceCommandWrapper.java
@@ -56,7 +56,7 @@ public final class XenServer56FenceCommandWrapper extends CommandWrapper smConfig = vdi.getSmConfig(conn);
for (final String key : smConfig.keySet()) {
diff --git a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixCreateVMSnapshotCommandWrapper.java b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixCreateVMSnapshotCommandWrapper.java
index 68c295717c3..47c08b0cebe 100644
--- a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixCreateVMSnapshotCommandWrapper.java
+++ b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixCreateVMSnapshotCommandWrapper.java
@@ -100,6 +100,7 @@ public final class CitrixCreateVMSnapshotCommandWrapper extends CommandWrapper