diff --git a/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/guru/VMwareGuru.java b/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/guru/VMwareGuru.java index 8c49860c81a..85271942514 100644 --- a/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/guru/VMwareGuru.java +++ b/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/guru/VMwareGuru.java @@ -148,7 +148,7 @@ import com.vmware.vim25.VirtualDeviceBackingInfo; import com.vmware.vim25.VirtualDeviceConnectInfo; import com.vmware.vim25.VirtualDisk; import com.vmware.vim25.VirtualDiskFlatVer2BackingInfo; -import com.vmware.vim25.VirtualE1000; +import com.vmware.vim25.VirtualEthernetCard; import com.vmware.vim25.VirtualEthernetCardNetworkBackingInfo; import com.vmware.vim25.VirtualMachineConfigSummary; import com.vmware.vim25.VirtualMachineRuntimeInfo; @@ -905,7 +905,7 @@ public class VMwareGuru extends HypervisorGuruBase implements HypervisorGuru, Co /** * Get network MO from VM NIC */ - private NetworkMO getNetworkMO(VirtualE1000 nic, VmwareContext context) { + private NetworkMO getNetworkMO(VirtualEthernetCard nic, VmwareContext context) { VirtualDeviceConnectInfo connectable = nic.getConnectable(); VirtualEthernetCardNetworkBackingInfo info = (VirtualEthernetCardNetworkBackingInfo)nic.getBacking(); ManagedObjectReference networkMor = info.getNetwork(); @@ -916,7 +916,7 @@ public class VMwareGuru extends HypervisorGuruBase implements HypervisorGuru, Co } private Pair getNicMacAddressAndNetworkName(VirtualDevice nicDevice, VmwareContext context) throws Exception { - VirtualE1000 nic = (VirtualE1000)nicDevice; + VirtualEthernetCard nic = (VirtualEthernetCard)nicDevice; String macAddress = nic.getMacAddress(); NetworkMO networkMO = getNetworkMO(nic, context); String networkName = networkMO.getName(); diff --git a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/KubernetesClusterManagerImpl.java b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/KubernetesClusterManagerImpl.java index 3551144fe68..2b207b4618d 100644 --- a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/KubernetesClusterManagerImpl.java +++ b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/KubernetesClusterManagerImpl.java @@ -1485,6 +1485,8 @@ public class KubernetesClusterManagerImpl extends ManagerBase implements Kuberne if (kubernetesCluster == null) { throw new InvalidParameterValueException("Invalid Kubernetes cluster ID specified"); } + Account caller = CallContext.current().getCallingAccount(); + accountManager.checkAccess(caller, SecurityChecker.AccessType.OperateEntry, false, kubernetesCluster); KubernetesClusterConfigResponse response = new KubernetesClusterConfigResponse(); response.setId(kubernetesCluster.getUuid()); response.setName(kubernetesCluster.getName()); diff --git a/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java b/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java index 1352393be50..55eb0aacba7 100644 --- a/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java +++ b/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java @@ -991,7 +991,8 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage Account owner = _accountMgr.getAccount(addr.getAllocatedToAccountId()); if (_ipAddressDao.lockRow(addr.getId(), true) != null) { final IPAddressVO userIp = _ipAddressDao.findById(addr.getId()); - if (userIp.getState() == IpAddress.State.Allocating || addr.getState() == IpAddress.State.Free) { + if (userIp.getState() == IpAddress.State.Allocating || addr.getState() == IpAddress.State.Free || addr.getState() == IpAddress.State.Reserved) { + boolean shouldUpdateIpResourceCount = checkIfIpResourceCountShouldBeUpdated(addr); addr.setState(IpAddress.State.Allocated); if (_ipAddressDao.update(addr.getId(), addr)) { // Save usage event @@ -1004,7 +1005,7 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage addr.getAddress().toString(), addr.isSourceNat(), guestType, addr.getSystem(), usageHidden, addr.getClass().getName(), addr.getUuid()); } - if (updateIpResourceCount(addr)) { + if (shouldUpdateIpResourceCount) { _resourceLimitMgr.incrementResourceCount(owner.getId(), ResourceType.public_ip); } } @@ -1020,7 +1021,7 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage } } - private boolean isIpDedicated(IPAddressVO addr) { + protected boolean isIpDedicated(IPAddressVO addr) { List maps = _accountVlanMapDao.listAccountVlanMapsByVlan(addr.getVlanId()); if (maps != null && !maps.isEmpty()) return true; @@ -1113,7 +1114,7 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage // rule is applied. Similarly when last rule on the acquired IP is revoked, IP is not associated with any provider // but still be associated with the account. At this point just mark IP as allocated or released. for (IPAddressVO addr : userIps) { - if (addr.getState() == IpAddress.State.Allocating) { + if (addr.getState() == IpAddress.State.Allocating || addr.getState() == IpAddress.State.Reserved) { addr.setAssociatedWithNetworkId(network.getId()); markPublicIpAsAllocated(addr); } else if (addr.getState() == IpAddress.State.Releasing) { @@ -1502,7 +1503,6 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage IPAddressVO ip = _ipAddressDao.findById(ipId); //update ip address with networkId - ip.setState(State.Allocated); ip.setAssociatedWithNetworkId(networkId); ip.setSourceNat(isSourceNat); _ipAddressDao.update(ipId, ip); @@ -1515,7 +1515,7 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage } else { s_logger.warn("Failed to associate ip address " + ip.getAddress().addr() + " to network " + network); } - return ip; + return _ipAddressDao.findById(ipId); } finally { if (!success && releaseOnFailure) { if (ip != null) { @@ -1918,7 +1918,7 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage return Transaction.execute(new TransactionCallback() { @Override public IPAddressVO doInTransaction(TransactionStatus status) { - if (updateIpResourceCount(ip)) { + if (checkIfIpResourceCountShouldBeUpdated(ip)) { _resourceLimitMgr.decrementResourceCount(_ipAddressDao.findById(addrId).getAllocatedToAccountId(), ResourceType.public_ip); } @@ -1943,9 +1943,26 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage return ip; } - protected boolean updateIpResourceCount(IPAddressVO ip) { - // don't increment resource count for direct and dedicated ip addresses - return (ip.getAssociatedWithNetworkId() != null || ip.getVpcId() != null) && !isIpDedicated(ip); + protected boolean checkIfIpResourceCountShouldBeUpdated(IPAddressVO ip) { + boolean isDirectIp = ip.getAssociatedWithNetworkId() == null && ip.getVpcId() == null; + if (isDirectIp) { + s_logger.debug(String.format("IP address [%s] is direct; therefore, the resource count should not be updated.", ip)); + return false; + } + + if (isIpDedicated(ip)) { + s_logger.debug(String.format("IP address [%s] is dedicated; therefore, the resource count should not be updated.", ip)); + return false; + } + + boolean isReservedIp = ip.getState() == IpAddress.State.Reserved; + if (isReservedIp) { + s_logger.debug(String.format("IP address [%s] is reserved; therefore, the resource count should not be updated.", ip)); + return false; + } + + s_logger.debug(String.format("IP address [%s] is not direct, dedicated or reserved; therefore, the resource count should be updated.", ip)); + return true; } @Override diff --git a/server/src/test/java/com/cloud/network/IpAddressManagerTest.java b/server/src/test/java/com/cloud/network/IpAddressManagerTest.java index ef5ad8c0967..be438b4b3c0 100644 --- a/server/src/test/java/com/cloud/network/IpAddressManagerTest.java +++ b/server/src/test/java/com/cloud/network/IpAddressManagerTest.java @@ -67,6 +67,9 @@ public class IpAddressManagerTest { @Mock NetworkOfferingDao networkOfferingDao; + @Mock + IPAddressVO ipAddressVoMock; + @Spy @InjectMocks IpAddressManagerImpl ipAddressManager; @@ -242,4 +245,61 @@ public class IpAddressManagerTest { verify(requestedIp).setSourceNat(true); verify(oldIp).setSourceNat(false); } + + private void prepareForCheckIfIpResourceCountShouldBeUpdatedTests() { + Mockito.when(ipAddressVoMock.getAssociatedWithNetworkId()).thenReturn(1L); + Mockito.when(ipAddressVoMock.getVpcId()).thenReturn(1L); + doReturn(false).when(ipAddressManager).isIpDedicated(Mockito.any()); + Mockito.when(ipAddressVoMock.getState()).thenReturn(IpAddress.State.Allocating); + } + + @Test + public void checkIfIpResourceCountShouldBeUpdatedTestIpIsDirectReturnFalse() { + prepareForCheckIfIpResourceCountShouldBeUpdatedTests(); + Mockito.when(ipAddressVoMock.getAssociatedWithNetworkId()).thenReturn(null); + Mockito.when(ipAddressVoMock.getVpcId()).thenReturn(null); + + boolean result = ipAddressManager.checkIfIpResourceCountShouldBeUpdated(ipAddressVoMock); + + Assert.assertFalse(result); + } + + @Test + public void checkIfIpResourceCountShouldBeUpdatedTestIpIsDedicatedReturnFalse() { + prepareForCheckIfIpResourceCountShouldBeUpdatedTests(); + doReturn(true).when(ipAddressManager).isIpDedicated(Mockito.any()); + + boolean result = ipAddressManager.checkIfIpResourceCountShouldBeUpdated(ipAddressVoMock); + + Assert.assertFalse(result); + } + + @Test + public void checkIfIpResourceCountShouldBeUpdatedTestIpIsReservedReturnFalse() { + prepareForCheckIfIpResourceCountShouldBeUpdatedTests(); + Mockito.when(ipAddressVoMock.getState()).thenReturn(IpAddress.State.Reserved); + + boolean result = ipAddressManager.checkIfIpResourceCountShouldBeUpdated(ipAddressVoMock); + + Assert.assertFalse(result); + } + + @Test + public void checkIfIpResourceCountShouldBeUpdatedTestIpIsAssociatedToNetworkAndNotDedicatedAndNotReservedReturnTrue() { + prepareForCheckIfIpResourceCountShouldBeUpdatedTests(); + + boolean result = ipAddressManager.checkIfIpResourceCountShouldBeUpdated(ipAddressVoMock); + + Assert.assertTrue(result); + } + + @Test + public void checkIfIpResourceCountShouldBeUpdatedTestIpIsAssociatedToVpcAndNotDedicatedAndNotReservedReturnTrue() { + prepareForCheckIfIpResourceCountShouldBeUpdatedTests(); + Mockito.when(ipAddressVoMock.getAssociatedWithNetworkId()).thenReturn(null); + + boolean result = ipAddressManager.checkIfIpResourceCountShouldBeUpdated(ipAddressVoMock); + + Assert.assertTrue(result); + } } diff --git a/services/console-proxy/server/src/main/java/com/cloud/consoleproxy/ConsoleProxyNoVncClient.java b/services/console-proxy/server/src/main/java/com/cloud/consoleproxy/ConsoleProxyNoVncClient.java index 6434dd6e42e..2dfea2251fb 100644 --- a/services/console-proxy/server/src/main/java/com/cloud/consoleproxy/ConsoleProxyNoVncClient.java +++ b/services/console-proxy/server/src/main/java/com/cloud/consoleproxy/ConsoleProxyNoVncClient.java @@ -114,6 +114,11 @@ public class ConsoleProxyNoVncClient implements ConsoleProxyClient { updateFrontEndActivityTime(); } connectionAlive = client.isVncOverWebSocketConnectionAlive(); + try { + Thread.sleep(1); + } catch (Exception e) { + s_logger.warn("Error on sleep for vnc over websocket", e); + } } else if (client.isVncOverNioSocket()) { byte[] bytesArr; int nextBytes = client.getNextBytes(); diff --git a/test/integration/smoke/test_vm_life_cycle.py b/test/integration/smoke/test_vm_life_cycle.py index 5c8f5609998..a9a554e19ad 100644 --- a/test/integration/smoke/test_vm_life_cycle.py +++ b/test/integration/smoke/test_vm_life_cycle.py @@ -1556,7 +1556,7 @@ class TestKVMLiveMigration(cloudstackTestCase): self.skipTest("Requires at least two hosts for performing migration related tests") for host in self.hosts: - if host.details['Host.OS'] in ['CentOS']: + if host.details['Host.OS'] and host.details['Host.OS'].startswith('CentOS'): self.skipTest("live migration is not stabily supported on CentOS") def tearDown(self):