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