diff --git a/engine/components-api/src/main/java/com/cloud/storage/StorageManager.java b/engine/components-api/src/main/java/com/cloud/storage/StorageManager.java index a87d3235489..dbaffa8b3b5 100644 --- a/engine/components-api/src/main/java/com/cloud/storage/StorageManager.java +++ b/engine/components-api/src/main/java/com/cloud/storage/StorageManager.java @@ -302,6 +302,8 @@ public interface StorageManager extends StorageService { Answer sendToPool(StoragePool pool, long[] hostIdsToTryFirst, Command cmd) throws StorageUnavailableException; + void updateStoragePoolHostVOAndBytes(StoragePool pool, long hostId, ModifyStoragePoolAnswer mspAnswer); + CapacityVO getSecondaryStorageUsedStats(Long hostId, Long zoneId); CapacityVO getStoragePoolUsedStats(Long poolId, Long clusterId, Long podId, Long zoneId); diff --git a/plugins/storage/volume/default/src/main/java/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackPrimaryDataStoreLifeCycleImpl.java b/plugins/storage/volume/default/src/main/java/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackPrimaryDataStoreLifeCycleImpl.java index a98ea8eea3c..e4eb10f51fb 100644 --- a/plugins/storage/volume/default/src/main/java/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackPrimaryDataStoreLifeCycleImpl.java +++ b/plugins/storage/volume/default/src/main/java/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackPrimaryDataStoreLifeCycleImpl.java @@ -476,8 +476,8 @@ public class CloudStackPrimaryDataStoreLifeCycleImpl extends BasePrimaryDataStor @Override public boolean cancelMaintain(DataStore store) { - storagePoolAutmation.cancelMaintain(store); dataStoreHelper.cancelMaintain(store); + storagePoolAutmation.cancelMaintain(store); return true; } diff --git a/server/src/main/java/com/cloud/storage/StorageManagerImpl.java b/server/src/main/java/com/cloud/storage/StorageManagerImpl.java index cbeec1a60b3..abaf0e3d0e5 100644 --- a/server/src/main/java/com/cloud/storage/StorageManagerImpl.java +++ b/server/src/main/java/com/cloud/storage/StorageManagerImpl.java @@ -3072,7 +3072,8 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C } - private void updateStoragePoolHostVOAndBytes(StoragePool pool, long hostId, ModifyStoragePoolAnswer mspAnswer) { + @Override + public void updateStoragePoolHostVOAndBytes(StoragePool pool, long hostId, ModifyStoragePoolAnswer mspAnswer) { StoragePoolHostVO poolHost = _storagePoolHostDao.findByPoolHost(pool.getId(), hostId); if (poolHost == null) { poolHost = new StoragePoolHostVO(pool.getId(), hostId, mspAnswer.getPoolInfo().getLocalPath().replaceAll("//", "/")); @@ -3082,8 +3083,10 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C } StoragePoolVO poolVO = _storagePoolDao.findById(pool.getId()); - poolVO.setUsedBytes(mspAnswer.getPoolInfo().getCapacityBytes() - mspAnswer.getPoolInfo().getAvailableBytes()); - poolVO.setCapacityBytes(mspAnswer.getPoolInfo().getCapacityBytes()); + if (!Storage.StoragePoolType.StorPool.equals(poolVO.getPoolType())) { + poolVO.setUsedBytes(mspAnswer.getPoolInfo().getCapacityBytes() - mspAnswer.getPoolInfo().getAvailableBytes()); + poolVO.setCapacityBytes(mspAnswer.getPoolInfo().getCapacityBytes()); + } _storagePoolDao.update(pool.getId(), poolVO); } diff --git a/server/src/main/java/com/cloud/storage/StoragePoolAutomationImpl.java b/server/src/main/java/com/cloud/storage/StoragePoolAutomationImpl.java index eea4da4879f..7407de6c963 100644 --- a/server/src/main/java/com/cloud/storage/StoragePoolAutomationImpl.java +++ b/server/src/main/java/com/cloud/storage/StoragePoolAutomationImpl.java @@ -363,6 +363,7 @@ public class StoragePoolAutomationImpl implements StoragePoolAutomation { if (logger.isDebugEnabled()) { logger.debug("ModifyStoragePool add succeeded"); } + storageManager.updateStoragePoolHostVOAndBytes(pool, host.getId(), (ModifyStoragePoolAnswer) answer); if (pool.getPoolType() == Storage.StoragePoolType.DatastoreCluster) { logger.debug("Started synchronising datastore cluster storage pool {} with vCenter", pool); storageManager.syncDatastoreClusterStoragePool(pool.getId(), ((ModifyStoragePoolAnswer) answer).getDatastoreClusterChildren(), host.getId()); diff --git a/tools/appliance/systemvmtemplate/template-base_aarch64-target_aarch64.json b/tools/appliance/systemvmtemplate/template-base_aarch64-target_aarch64.json index e87c37be61e..f15552ca5cc 100644 --- a/tools/appliance/systemvmtemplate/template-base_aarch64-target_aarch64.json +++ b/tools/appliance/systemvmtemplate/template-base_aarch64-target_aarch64.json @@ -32,8 +32,8 @@ "format": "qcow2", "headless": true, "http_directory": "http", - "iso_checksum": "sha512:892cf1185a214d16ff62a18c6b89cdcd58719647c99916f6214bfca6f9915275d727b666c0b8fbf022c425ef18647e9759974abf7fc440431c39b50c296a98d3", - "iso_url": "https://cdimage.debian.org/mirror/cdimage/archive/12.11.0/arm64/iso-cd/debian-12.11.0-arm64-netinst.iso", + "iso_checksum": "sha512:55ab206cd8b0da2898767c3eb6ab5ebef101e3925ec91b3b5f0a286136195b7072588f6ac2d059c545c6938978704ae78cd18d7d9d2a86a7380e46ce27ee4e7b", + "iso_url": "https://cdimage.debian.org/mirror/cdimage/archive/12.12.0/arm64/iso-cd/debian-12.12.0-arm64-netinst.iso", "net_device": "virtio-net", "output_directory": "../dist", "qemu_binary": "qemu-system-aarch64", diff --git a/tools/appliance/systemvmtemplate/template-base_x86_64-target_aarch64.json b/tools/appliance/systemvmtemplate/template-base_x86_64-target_aarch64.json index 4d803b25890..c16bf1fb2a2 100644 --- a/tools/appliance/systemvmtemplate/template-base_x86_64-target_aarch64.json +++ b/tools/appliance/systemvmtemplate/template-base_x86_64-target_aarch64.json @@ -31,8 +31,8 @@ "format": "qcow2", "headless": true, "http_directory": "http", - "iso_checksum": "sha512:892cf1185a214d16ff62a18c6b89cdcd58719647c99916f6214bfca6f9915275d727b666c0b8fbf022c425ef18647e9759974abf7fc440431c39b50c296a98d3", - "iso_url": "https://cdimage.debian.org/mirror/cdimage/archive/12.11.0/arm64/iso-cd/debian-12.11.0-arm64-netinst.iso", + "iso_checksum": "sha512:55ab206cd8b0da2898767c3eb6ab5ebef101e3925ec91b3b5f0a286136195b7072588f6ac2d059c545c6938978704ae78cd18d7d9d2a86a7380e46ce27ee4e7b", + "iso_url": "https://cdimage.debian.org/mirror/cdimage/archive/12.12.0/arm64/iso-cd/debian-12.12.0-arm64-netinst.iso", "net_device": "virtio-net", "output_directory": "../dist", "qemu_binary": "qemu-system-aarch64", diff --git a/tools/appliance/systemvmtemplate/template-base_x86_64-target_x86_64.json b/tools/appliance/systemvmtemplate/template-base_x86_64-target_x86_64.json index e825e98e5f1..941eea9dcd7 100644 --- a/tools/appliance/systemvmtemplate/template-base_x86_64-target_x86_64.json +++ b/tools/appliance/systemvmtemplate/template-base_x86_64-target_x86_64.json @@ -27,8 +27,8 @@ "format": "qcow2", "headless": true, "http_directory": "http", - "iso_checksum": "sha512:0921d8b297c63ac458d8a06f87cd4c353f751eb5fe30fd0d839ca09c0833d1d9934b02ee14bbd0c0ec4f8917dde793957801ae1af3c8122cdf28dde8f3c3e0da", - "iso_url": "https://cdimage.debian.org/mirror/cdimage/archive/12.11.0/amd64/iso-cd/debian-12.11.0-amd64-netinst.iso", + "iso_checksum": "sha512:c93055182057dd19a334260671c7e10880541b7721ad9c8df87be47e0a11d5bbf85018350ff224ff6a5f6a68320b07e95d539cef9dc020c93966bfaa86d4b2ce", + "iso_url": "https://cdimage.debian.org/mirror/cdimage/archive/12.12.0/amd64/iso-cd/debian-12.12.0-amd64-netinst.iso", "net_device": "virtio-net", "output_directory": "../dist", "qemuargs": [ diff --git a/ui/public/config.json b/ui/public/config.json index 582f968ec0e..1a7beda654e 100644 --- a/ui/public/config.json +++ b/ui/public/config.json @@ -104,6 +104,7 @@ "showUserCategoryForModernImageSelection": true, "showAllCategoryForModernImageSelection": false, "docHelpMappings": {}, + "notifyLatestCSVersion": true, "announcementBanner": { "enabled": false, "showIcon": false, diff --git a/ui/src/store/modules/user.js b/ui/src/store/modules/user.js index 51037164aed..2c0edf656d7 100644 --- a/ui/src/store/modules/user.js +++ b/ui/src/store/modules/user.js @@ -338,7 +338,6 @@ const user = { const result = response.listusersresponse.user[0] commit('SET_INFO', result) commit('SET_NAME', result.firstname + ' ' + result.lastname) - store.dispatch('SetCsLatestVersion', result.rolename) resolve(cachedApis) }).catch(error => { reject(error) @@ -588,6 +587,9 @@ const user = { commit('SET_DOMAIN_STORE', domainStore) }, SetCsLatestVersion ({ commit }, rolename) { + if (!vueProps.$config.notifyLatestCSVersion) { + return + } const lastFetchTs = store.getters.latestVersion?.fetchedTs ? store.getters.latestVersion.fetchedTs : 0 if (rolename === 'Root Admin' && (+new Date() - lastFetchTs) > 24 * 60 * 60 * 1000) { axios.get( diff --git a/ui/src/views/infra/zone/ZoneWizardAddResources.vue b/ui/src/views/infra/zone/ZoneWizardAddResources.vue index dc7aeabf24a..b2a273f4c88 100644 --- a/ui/src/views/infra/zone/ZoneWizardAddResources.vue +++ b/ui/src/views/infra/zone/ZoneWizardAddResources.vue @@ -396,7 +396,7 @@ export default { placeHolder: 'message.error.server', required: true, display: { - primaryStorageProtocol: ['nfs', 'iscsi', 'gluster', 'SMB', 'Linstor'] + primaryStorageProtocol: ['nfs', 'iscsi', 'gluster', 'SMB', 'Linstor', 'datastorecluster', 'vmfs'] } }, { diff --git a/ui/src/views/infra/zone/ZoneWizardLaunchZone.vue b/ui/src/views/infra/zone/ZoneWizardLaunchZone.vue index 0334b38515f..00622821329 100644 --- a/ui/src/views/infra/zone/ZoneWizardLaunchZone.vue +++ b/ui/src/views/infra/zone/ZoneWizardLaunchZone.vue @@ -1569,10 +1569,10 @@ export default { } path += '/' + this.prefillContent.primaryStorageVmfsDatastore if (protocol === 'vmfs') { - url = this.vmfsURL('dummy', path) + url = this.vmfsURL(server, path) } if (protocol === 'datastorecluster') { - url = this.datastoreclusterURL('dummy', path) + url = this.datastoreclusterURL(server, path) } } else if (protocol === 'iscsi') { let iqn = this.prefillContent?.primaryStorageTargetIQN || '' diff --git a/ui/src/views/infra/zone/ZoneWizardPhysicalNetworkSetupStep.vue b/ui/src/views/infra/zone/ZoneWizardPhysicalNetworkSetupStep.vue index 9d221bdccc3..88f681de379 100644 --- a/ui/src/views/infra/zone/ZoneWizardPhysicalNetworkSetupStep.vue +++ b/ui/src/views/infra/zone/ZoneWizardPhysicalNetworkSetupStep.vue @@ -414,7 +414,7 @@ export default { for (const index in net.traffics) { if (this.hypervisor === 'VMware') { delete this.physicalNetworks[idx].traffics[index].label - } else { + } else if (!net.traffics[index].label) { this.physicalNetworks[idx].traffics[index].label = '' } const traffic = net.traffics[index] diff --git a/utils/src/main/java/com/cloud/utils/script/Script.java b/utils/src/main/java/com/cloud/utils/script/Script.java index 0db5c4b326f..28ae3264355 100644 --- a/utils/src/main/java/com/cloud/utils/script/Script.java +++ b/utils/src/main/java/com/cloud/utils/script/Script.java @@ -28,6 +28,7 @@ import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Properties; import java.util.concurrent.Callable; @@ -157,13 +158,7 @@ public class Script implements Callable { boolean obscureParam = false; for (int i = 0; i < command.length; i++) { String cmd = command[i]; - if (StringUtils.isNotEmpty(cmd) && cmd.startsWith("vi://")) { - String[] tokens = cmd.split("@"); - if (tokens.length >= 2) { - builder.append("vi://").append("******@").append(tokens[1]).append(" "); - } else { - builder.append("vi://").append("******").append(" "); - } + if (sanitizeViCmdParameter(cmd, builder) || sanitizeRbdFileFormatCmdParameter(cmd, builder)) { continue; } if (obscureParam) { @@ -181,6 +176,41 @@ public class Script implements Callable { return builder.toString(); } + private boolean sanitizeViCmdParameter(String cmd, StringBuilder builder) { + if (StringUtils.isEmpty(cmd) || !cmd.startsWith("vi://")) { + return false; + } + + String[] tokens = cmd.split("@"); + if (tokens.length >= 2) { + builder.append("vi://").append("******@").append(tokens[1]).append(" "); + } else { + builder.append("vi://").append("******").append(" "); + } + return true; + } + + private boolean sanitizeRbdFileFormatCmdParameter(String cmd, StringBuilder builder) { + if (StringUtils.isEmpty(cmd) || !cmd.startsWith("rbd:") || !cmd.contains("key=")) { + return false; + } + + String[] tokens = cmd.split("key="); + if (tokens.length != 2) { + return false; + } + + String tokenWithKey = tokens[1]; + String[] options = tokenWithKey.split(":"); + if (options.length > 1) { + String optionsAfterKey = String.join(":", Arrays.copyOfRange(options, 1, options.length)); + builder.append(tokens[0]).append("key=").append("******").append(":").append(optionsAfterKey).append(" "); + } else { + builder.append(tokens[0]).append("key=").append("******").append(" "); + } + return true; + } + public long getTimeout() { return _timeout; }