This is an automated email from the ASF dual-hosted git repository. weizhou pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/cloudstack.git
commit 842b2f8c2433f44ae743cba3480ccf69d9e1b02c Merge: b17808bfba1 5444261902a Author: Wei Zhou <weiz...@apache.org> AuthorDate: Mon May 19 21:25:37 2025 +0200 Merge remote-tracking branch 'apache/4.20' .../api/response/UnmanagedInstanceResponse.java | 24 ++ .../apache/cloudstack/vm/UnmanagedInstanceTO.java | 19 ++ .../agent/manager/ClusteredAgentManagerImpl.java | 50 ++-- .../com/cloud/vm/VirtualMachineManagerImpl.java | 13 + .../manager/ClusteredAgentManagerImplTest.java | 150 +++++++++++ .../storage/endpoint/DefaultEndPointSelector.java | 2 +- .../storage/volume/VolumeServiceImpl.java | 24 +- .../cloudstack/backup/NASBackupProvider.java | 2 + .../LibvirtRestoreBackupCommandWrapper.java | 2 +- .../vmware/manager/VmwareManagerImpl.java | 91 +++++-- .../hypervisor/vmware/resource/VmwareResource.java | 132 +++++---- .../resource/VmwareStorageLayoutHelper.java | 40 ++- .../storage/resource/VmwareStorageProcessor.java | 30 ++- .../api/command/admin/zone/ListVmwareDcVmsCmd.java | 19 ++ .../CloudStackPrimaryDataStoreDriverImpl.java | 11 +- .../datastore/provider/LinstorHostListener.java | 4 +- .../main/java/com/cloud/api/ApiResponseHelper.java | 2 + .../configuration/ConfigurationManagerImpl.java | 106 +++++--- .../storage/snapshot/SnapshotManagerImpl.java | 2 +- .../java/com/cloud/usage/UsageServiceImpl.java | 17 +- .../main/java/com/cloud/vm/UserVmManagerImpl.java | 2 +- .../configuration/ConfigurationManagerTest.java | 6 + .../SecondaryStorageManagerImpl.java | 8 +- test/integration/smoke/test_restore_vm.py | 10 +- test/integration/smoke/test_ssvm.py | 6 + tools/marvin/marvin/config/test_data.py | 6 +- ui/.env.qa | 1 + ui/public/locales/en.json | 1 + ui/src/components/header/ProjectMenu.vue | 117 +++----- ui/src/components/widgets/InfiniteScrollSelect.vue | 298 +++++++++++++++++++++ ui/src/views/AutogenView.vue | 2 +- ui/src/views/compute/EditVM.vue | 8 +- ui/src/views/network/CreateNetworkPermission.vue | 124 +++------ ui/src/views/tools/ManageInstances.vue | 28 ++ ui/src/views/tools/SelectVmwareVcenter.vue | 7 + .../main/java/com/cloud/utils/script/Script.java | 27 +- .../com/cloud/hypervisor/vmware/mo/BaseMO.java | 107 ++++++++ .../cloud/hypervisor/vmware/mo/DatacenterMO.java | 44 +-- .../hypervisor/vmware/mo/VirtualMachineMO.java | 29 +- .../cloud/hypervisor/vmware/util/VmwareHelper.java | 13 + 40 files changed, 1171 insertions(+), 413 deletions(-) diff --cc engine/orchestration/src/main/java/com/cloud/agent/manager/ClusteredAgentManagerImpl.java index 40899c7d8f4,724b824942b..8795c8d428f --- a/engine/orchestration/src/main/java/com/cloud/agent/manager/ClusteredAgentManagerImpl.java +++ b/engine/orchestration/src/main/java/com/cloud/agent/manager/ClusteredAgentManagerImpl.java @@@ -951,10 -940,10 +961,10 @@@ public class ClusteredAgentManagerImpl try { logger.trace("Clustered agent transfer scan check, management server id: {}", _nodeId); synchronized (_agentToTransferIds) { - if (_agentToTransferIds.size() > 0) { + if (!_agentToTransferIds.isEmpty()) { logger.debug("Found {} agents to transfer", _agentToTransferIds.size()); // for (Long hostId : _agentToTransferIds) { - for (final Iterator<Long> iterator = _agentToTransferIds.iterator(); iterator.hasNext();) { + for (final Iterator<Long> iterator = _agentToTransferIds.iterator(); iterator.hasNext(); ) { final Long hostId = iterator.next(); final AgentAttache attache = findAttache(hostId); @@@ -1253,10 -1242,10 +1263,10 @@@ } if (cmds.length == 1 && cmds[0] instanceof ChangeAgentCommand) { // intercepted - final ChangeAgentCommand cmd = (ChangeAgentCommand)cmds[0]; + final ChangeAgentCommand cmd = (ChangeAgentCommand) cmds[0]; logger.debug("Intercepting command for agent change: agent {} event: {}", cmd.getAgentId(), cmd.getEvent()); - boolean result = false; + boolean result; try { result = executeAgentUserRequest(cmd.getAgentId(), cmd.getEvent()); logger.debug("Result is {}", result); @@@ -1270,12 -1259,12 +1280,12 @@@ answers[0] = new ChangeAgentAnswer(cmd, result); return _gson.toJson(answers); } else if (cmds.length == 1 && cmds[0] instanceof TransferAgentCommand) { - final TransferAgentCommand cmd = (TransferAgentCommand)cmds[0]; + final TransferAgentCommand cmd = (TransferAgentCommand) cmds[0]; - logger.debug("Intercepting command for agent rebalancing: agent {} event: {}", cmd.getAgentId(), cmd.getEvent()); - boolean result = false; + logger.debug("Intercepting command for agent rebalancing: agent: {}, event: {}, connection transfer: {}", cmd.getAgentId(), cmd.getEvent(), cmd.isConnectionTransfer()); + boolean result; try { - result = rebalanceAgent(cmd.getAgentId(), cmd.getEvent(), cmd.getCurrentOwner(), cmd.getFutureOwner()); + result = rebalanceAgent(cmd.getAgentId(), cmd.getEvent(), cmd.getCurrentOwner(), cmd.getFutureOwner(), cmd.isConnectionTransfer()); logger.debug("Result is {}", result); } catch (final AgentUnavailableException e) { @@@ -1339,48 -1328,30 +1349,48 @@@ } private String handleShutdownManagementServerHostCommand(BaseShutdownManagementServerHostCommand cmd) { + if (cmd instanceof PrepareForMaintenanceManagementServerHostCommand) { + logger.debug("Received PrepareForMaintenanceManagementServerHostCommand - preparing for maintenance"); + try { + managementServerMaintenanceManager.prepareForMaintenance(((PrepareForMaintenanceManagementServerHostCommand) cmd).getLbAlgorithm()); + return "Successfully prepared for maintenance"; + } catch(CloudRuntimeException e) { + return e.getMessage(); + } + } + if (cmd instanceof CancelMaintenanceManagementServerHostCommand) { + logger.debug("Received CancelMaintenanceManagementServerHostCommand - cancelling maintenance"); + try { + managementServerMaintenanceManager.cancelMaintenance(); + return "Successfully cancelled maintenance"; + } catch(CloudRuntimeException e) { + return e.getMessage(); + } + } if (cmd instanceof PrepareForShutdownManagementServerHostCommand) { - logger.debug("Received BaseShutdownManagementServerHostCommand - preparing to shut down"); + logger.debug("Received PrepareForShutdownManagementServerHostCommand - preparing to shut down"); try { - shutdownManager.prepareForShutdown(); + managementServerMaintenanceManager.prepareForShutdown(); return "Successfully prepared for shutdown"; - } catch(CloudRuntimeException e) { + } catch (CloudRuntimeException e) { return e.getMessage(); } } if (cmd instanceof TriggerShutdownManagementServerHostCommand) { logger.debug("Received TriggerShutdownManagementServerHostCommand - triggering a shut down"); try { - shutdownManager.triggerShutdown(); + managementServerMaintenanceManager.triggerShutdown(); return "Successfully triggered shutdown"; - } catch(CloudRuntimeException e) { + } catch (CloudRuntimeException e) { return e.getMessage(); } } if (cmd instanceof CancelShutdownManagementServerHostCommand) { logger.debug("Received CancelShutdownManagementServerHostCommand - cancelling shut down"); try { - shutdownManager.cancelShutdown(); - return "Successfully prepared for shutdown"; + managementServerMaintenanceManager.cancelShutdown(); + return "Successfully cancelled shutdown"; - } catch(CloudRuntimeException e) { + } catch (CloudRuntimeException e) { return e.getMessage(); } } diff --cc engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java index e2e6f3c6f9d,47740b5b672..13475579f77 --- a/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java +++ b/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java @@@ -61,9 -61,12 +61,13 @@@ import org.apache.cloudstack.ca.CAManag import org.apache.cloudstack.context.CallContext; import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService; import org.apache.cloudstack.engine.orchestration.service.VolumeOrchestrationService; + import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreDriver; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager; + import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreProvider; + import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreProviderManager; + import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreDriver; import org.apache.cloudstack.engine.subsystem.api.storage.StoragePoolAllocator; +import org.apache.cloudstack.engine.subsystem.api.storage.VolumeDataFactory; import org.apache.cloudstack.framework.ca.Certificate; import org.apache.cloudstack.framework.config.ConfigKey; import org.apache.cloudstack.framework.config.Configurable; diff --cc utils/src/main/java/com/cloud/utils/script/Script.java index 71d50853c5c,fce4cf8e467..a1104b37c27 --- a/utils/src/main/java/com/cloud/utils/script/Script.java +++ b/utils/src/main/java/com/cloud/utils/script/Script.java @@@ -47,9 -47,9 +47,10 @@@ import org.apache.logging.log4j.LogMana import org.apache.logging.log4j.Logger; import org.joda.time.Duration; +import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.Pair; import com.cloud.utils.PropertiesUtil; + import com.cloud.utils.StringUtils; import com.cloud.utils.concurrency.NamedThreadFactory; import com.cloud.utils.script.OutputInterpreter.TimedOutLogger;