This is an automated email from the ASF dual-hosted git repository. dahn pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/cloudstack.git
commit b38f1364e6a38c9f59551991bd44b1ae0f8f9d38 Merge: 2a63483b4c5 33659fdf069 Author: Daan Hoogland <d...@onecht.net> AuthorDate: Thu May 23 12:34:04 2024 +0200 Merge branch '4.19' .../cloud/configuration/ConfigurationManager.java | 3 +- .../engine/orchestration/NetworkOrchestrator.java | 34 ++++++++++++++++------ .../configuration/ConfigurationManagerImpl.java | 17 +++++++---- .../main/java/com/cloud/vm/UserVmManagerImpl.java | 2 +- .../cloud/vpc/MockConfigurationManagerImpl.java | 5 ++-- test/integration/smoke/test_events_resource.py | 15 ++++++++-- ui/src/config/section/compute.js | 2 +- ui/src/views/compute/EditVM.vue | 3 +- ui/src/views/dashboard/UsageDashboard.vue | 6 ++-- 9 files changed, 62 insertions(+), 25 deletions(-) diff --cc engine/components-api/src/main/java/com/cloud/configuration/ConfigurationManager.java index ebbae0b31c2,728511ba8d5..0aff8435d9e --- a/engine/components-api/src/main/java/com/cloud/configuration/ConfigurationManager.java +++ b/engine/components-api/src/main/java/com/cloud/configuration/ConfigurationManager.java @@@ -186,10 -187,10 +187,10 @@@ public interface ConfigurationManager * * @param userId * @param vlanDbId - * @param caller TODO + * @param caller * @return success/failure */ - boolean deleteVlanAndPublicIpRange(long userId, long vlanDbId, Account caller); + VlanVO deleteVlanAndPublicIpRange(long userId, long vlanDbId, Account caller); void checkZoneAccess(Account caller, DataCenter zone); diff --cc engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java index d07fee32276,09500051df6..fded0a38dde --- a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java +++ b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java @@@ -257,8 -254,9 +257,10 @@@ import com.cloud.vm.dao.NicSecondaryIpV import com.cloud.vm.dao.UserVmDao; import com.cloud.vm.dao.VMInstanceDao; import com.googlecode.ipv6.IPv6Address; +import org.jetbrains.annotations.NotNull; + import static com.cloud.configuration.ConfigurationManager.MESSAGE_DELETE_VLAN_IP_RANGE_EVENT; + /** * NetworkManagerImpl implements NetworkManager. */ @@@ -3332,9 -3308,9 +3334,9 @@@ public class NetworkOrchestrator extend if (!guru.trash(networkFinal, _networkOfferingDao.findById(networkFinal.getNetworkOfferingId()))) { throw new CloudRuntimeException("Failed to trash network."); } - - if (!deleteVlansInNetwork(networkFinal, context.getCaller().getId(), callerAccount)) { - logger.warn("Failed to delete network {}; was unable to cleanup corresponding ip ranges", networkFinal); + Pair<Boolean, List<VlanVO>> deletedVlans = deleteVlansInNetwork(networkFinal, context.getCaller().getId(), callerAccount); + if (!deletedVlans.first()) { - s_logger.warn("Failed to delete network " + networkFinal + "; was unable to cleanup corresponding ip ranges"); ++ logger.warn("Failed to delete network " + networkFinal + "; was unable to cleanup corresponding ip ranges"); throw new CloudRuntimeException("Failed to delete network " + networkFinal + "; was unable to cleanup corresponding ip ranges"); } else { // commit transaction only when ips and vlans for the network are released successfully @@@ -3397,11 -3383,15 +3409,15 @@@ final long networkId = network.getId(); //cleanup Public vlans final List<VlanVO> publicVlans = _vlanDao.listVlansByNetworkId(networkId); + List<VlanVO> deletedPublicVlanRange = new ArrayList<>(); boolean result = true; for (final VlanVO vlan : publicVlans) { - if (!_configMgr.deleteVlanAndPublicIpRange(userId, vlan.getId(), callerAccount)) { - logger.warn("Failed to delete vlan {});", vlan.getId()); + VlanVO vlanRange = _configMgr.deleteVlanAndPublicIpRange(userId, vlan.getId(), callerAccount); + if (vlanRange == null) { - s_logger.warn("Failed to delete vlan " + vlan.getId() + ");"); ++ logger.warn("Failed to delete vlan " + vlan.getId() + ");"); result = false; + } else { + deletedPublicVlanRange.add(vlanRange); } } diff --cc server/src/main/java/com/cloud/vm/UserVmManagerImpl.java index dce8a21b478,3c172051463..a5a8f07546b --- a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java @@@ -8044,13 -7909,8 +8044,13 @@@ public class UserVmManagerImpl extends // Detach, destroy and create the usage event for the old root volume. _volsDao.detachVolume(root.getId()); - _volumeService.destroyVolume(root.getId(), caller, Volume.State.Allocated.equals(root.getState()) || expunge, false); + destroyVolumeInContext(vm, Volume.State.Allocated.equals(root.getState()) || expunge, root); + if (currentTemplate.getId() != template.getId() && VirtualMachine.Type.User.equals(vm.type) && !VirtualMachineManager.ResourceCountRunningVMsonly.value()) { + ServiceOfferingVO serviceOffering = serviceOfferingDao.findById(vm.getId(), vm.getServiceOfferingId()); + _resourceLimitMgr.updateVmResourceCountForTemplateChange(vm.getAccountId(), vm.isDisplay(), serviceOffering, currentTemplate, template); + } + // For VMware hypervisor since the old root volume is replaced by the new root volume, force expunge old root volume if it has been created in storage if (vm.getHypervisorType() == HypervisorType.VMware) { VolumeInfo volumeInStorage = volFactory.getVolume(root.getId());