From 99fcb1f2b0472d470099442dc10d21da41a8f7e3 Mon Sep 17 00:00:00 2001 From: Wei Zhou Date: Thu, 16 Feb 2017 14:03:26 +0100 Subject: [PATCH 1/7] CLOUDSTACK-9787: Fix wrong return value in NetUtils.isNetworkAWithinNetworkB --- .../src/main/java/com/cloud/utils/net/NetUtils.java | 2 +- .../test/java/com/cloud/utils/net/NetUtilsTest.java | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/utils/src/main/java/com/cloud/utils/net/NetUtils.java b/utils/src/main/java/com/cloud/utils/net/NetUtils.java index a73813c28d8..2e93c14966c 100644 --- a/utils/src/main/java/com/cloud/utils/net/NetUtils.java +++ b/utils/src/main/java/com/cloud/utils/net/NetUtils.java @@ -875,7 +875,7 @@ public class NetUtils { Long[] cidrBLong = cidrToLong(cidrB); long shift = MAX_CIDR - cidrBLong[1]; - return cidrALong[0] >> shift == cidrBLong[0] >> shift; + return (cidrALong[0] >> shift == cidrBLong[0] >> shift) && (cidrALong[1] >= cidrBLong[1]); } static boolean areCidrsNotEmpty(String cidrA, String cidrB) { diff --git a/utils/src/test/java/com/cloud/utils/net/NetUtilsTest.java b/utils/src/test/java/com/cloud/utils/net/NetUtilsTest.java index 490d0df4eb0..01fc3a5705a 100644 --- a/utils/src/test/java/com/cloud/utils/net/NetUtilsTest.java +++ b/utils/src/test/java/com/cloud/utils/net/NetUtilsTest.java @@ -504,6 +504,19 @@ public class NetUtilsTest { assertEquals(false, NetUtils.isNetworkAWithinNetworkB("", null)); } + @Test + public void testIsNetworkAWithinNetworkB() { + assertTrue(NetUtils.isNetworkAWithinNetworkB("192.168.30.0/24", "192.168.30.0/23")); + assertTrue(NetUtils.isNetworkAWithinNetworkB("192.168.30.0/24", "192.168.30.0/22")); + assertFalse(NetUtils.isNetworkAWithinNetworkB("192.168.30.0/23", "192.168.30.0/24")); + assertFalse(NetUtils.isNetworkAWithinNetworkB("192.168.30.0/22", "192.168.30.0/24")); + assertTrue(NetUtils.isNetworkAWithinNetworkB("192.168.28.0/24", "192.168.28.0/23")); + assertTrue(NetUtils.isNetworkAWithinNetworkB("192.168.28.0/24", "192.168.28.0/22")); + assertFalse(NetUtils.isNetworkAWithinNetworkB("192.168.28.0/23", "192.168.28.0/24")); + assertFalse(NetUtils.isNetworkAWithinNetworkB("192.168.28.0/22", "192.168.28.0/24")); + assertTrue(NetUtils.isNetworkAWithinNetworkB("192.168.30.0/24", "192.168.28.0/22")); + } + @Test public void testIsNetworksOverlapWithEmptyValues() { assertEquals(false, NetUtils.isNetworksOverlap("", null)); From 9bed11d1f1195dd5442241f0698f1ef539fa7de9 Mon Sep 17 00:00:00 2001 From: Sateesh Chodapuneedi Date: Tue, 27 Dec 2016 10:03:27 +0530 Subject: [PATCH 2/7] CLOUDSTACK-3223 Exception observed while creating CPVM in VMware Setup with DVS Issue ===== Exception observed while creating CPVM in VMware Setup with DVS. Observed error "StartCommand failed due to Exception: com.vmware.vim25.AlreadyExists." This is due to concurrent attempts to create same dv portgroup on same dvSwitch by manager threads of CPVM and SSVM when both are started at same time. Fix === Synchronize api calls to create/update dvportgroup. Also maintaing local cache to avoid multiple fetch api calls to vCenter when multiple threads try to create same object. Signed-off-by: Sateesh Chodapuneedi --- .../vmware/mo/DistributedVirtualSwitchMO.java | 50 +++++++++++++++++-- 1 file changed, 47 insertions(+), 3 deletions(-) diff --git a/vmware-base/src/com/cloud/hypervisor/vmware/mo/DistributedVirtualSwitchMO.java b/vmware-base/src/com/cloud/hypervisor/vmware/mo/DistributedVirtualSwitchMO.java index 9e19d655e7a..fbb4265bcfb 100644 --- a/vmware-base/src/com/cloud/hypervisor/vmware/mo/DistributedVirtualSwitchMO.java +++ b/vmware-base/src/com/cloud/hypervisor/vmware/mo/DistributedVirtualSwitchMO.java @@ -20,6 +20,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import org.apache.log4j.Logger; @@ -36,24 +37,67 @@ import com.cloud.hypervisor.vmware.util.VmwareContext; public class DistributedVirtualSwitchMO extends BaseMO { @SuppressWarnings("unused") private static final Logger s_logger = Logger.getLogger(DistributedVirtualSwitchMO.class); + private static ConcurrentHashMap> s_dvPortGroupCacheMap = null; public DistributedVirtualSwitchMO(VmwareContext context, ManagedObjectReference morDvs) { super(context, morDvs); + s_dvPortGroupCacheMap = new ConcurrentHashMap>(); } public DistributedVirtualSwitchMO(VmwareContext context, String morType, String morValue) { super(context, morType, morValue); + s_dvPortGroupCacheMap = new ConcurrentHashMap>(); } public void createDVPortGroup(DVPortgroupConfigSpec dvPortGroupSpec) throws Exception { List dvPortGroupSpecArray = new ArrayList(); dvPortGroupSpecArray.add(dvPortGroupSpec); - _context.getService().addDVPortgroupTask(_mor, dvPortGroupSpecArray); + boolean dvPortGroupExists = false; + String dvSwitchInstance = _mor.getValue(); + String dvPortGroupName = dvPortGroupSpec.getName(); + String uniquedvPortGroupPerDvs = dvSwitchInstance + dvPortGroupName; + List dvPortGroupList = null; + synchronized (uniquedvPortGroupPerDvs.intern()) { + // Looking up local cache rather than firing another API call to see if dvPortGroup exists already. + if (s_dvPortGroupCacheMap.containsKey(dvSwitchInstance)) { + dvPortGroupList = s_dvPortGroupCacheMap.get(dvSwitchInstance); + if (dvPortGroupList != null && dvPortGroupList.contains(dvPortGroupName)) { + dvPortGroupExists = true; + } + } + if (!dvPortGroupExists) { + ManagedObjectReference task = _context.getService().addDVPortgroupTask(_mor, dvPortGroupSpecArray); + if (!_context.getVimClient().waitForTask(task)) { + throw new Exception("Failed to create dvPortGroup " + dvPortGroupSpec.getName()); + } else { + if (s_dvPortGroupCacheMap.containsKey(dvSwitchInstance)) { + dvPortGroupList = s_dvPortGroupCacheMap.get(dvSwitchInstance); + if (dvPortGroupList == null) { + dvPortGroupList = new ArrayList(); + } + dvPortGroupList.add(dvPortGroupName); //does this update map? + } else { + dvPortGroupList = new ArrayList(); + dvPortGroupList.add(dvPortGroupName); + s_dvPortGroupCacheMap.put(dvSwitchInstance, dvPortGroupList); + } + } + if (s_logger.isTraceEnabled()) { + s_logger.trace("Created dvPortGroup. dvPortGroup cache is :" + s_dvPortGroupCacheMap); + } + } else if (s_logger.isDebugEnabled()) { + s_logger.debug("Detected dvPortGroup [" + dvPortGroupName + "] already present. Not attempting to create again."); + } + } } public void updateDvPortGroup(ManagedObjectReference dvPortGroupMor, DVPortgroupConfigSpec dvPortGroupSpec) throws Exception { - // TODO(sateesh): Update numPorts - _context.getService().reconfigureDVPortgroupTask(dvPortGroupMor, dvPortGroupSpec); + synchronized (dvPortGroupMor.getValue().intern()) { + ManagedObjectReference task = _context.getService().reconfigureDVPortgroupTask(dvPortGroupMor, dvPortGroupSpec); + if (!_context.getVimClient().waitForTask(task)) { + throw new Exception("Failed to update dvPortGroup " + dvPortGroupMor.getValue()); + } + } } public void updateVMWareDVSwitch(ManagedObjectReference dvSwitchMor, VMwareDVSConfigSpec dvsSpec) throws Exception { From e303eee8e6edd8dda9f6dd25b59dbdfeaa435275 Mon Sep 17 00:00:00 2001 From: Abhinandan Prateek Date: Mon, 6 Mar 2017 10:34:16 +0530 Subject: [PATCH 3/7] CLOUDSTACK-9828: GetDomRVersionCommand fails to get the correct version as output Fix tries to return the output as a single command, instead of appending output from two commands --- .../debian/config/opt/cloud/bin/get_template_version.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/systemvm/patches/debian/config/opt/cloud/bin/get_template_version.sh b/systemvm/patches/debian/config/opt/cloud/bin/get_template_version.sh index 996e9dd5ce5..53bdde30aa7 100755 --- a/systemvm/patches/debian/config/opt/cloud/bin/get_template_version.sh +++ b/systemvm/patches/debian/config/opt/cloud/bin/get_template_version.sh @@ -42,5 +42,6 @@ then exit fi -echo -n `cat /etc/cloudstack-release`'&' -cat /var/cache/cloud/cloud-scripts-signature +release=`cat /etc/cloudstack-release` +sig=`cat /var/cache/cloud/cloud-scripts-signature` +echo "${release}&${sig}" From 02311c8bbe85210fae047ca57ff8322096fb0edf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Aur=C3=A8le=20Brothier?= Date: Wed, 5 Apr 2017 12:25:17 +0200 Subject: [PATCH 4/7] Activate NioTest following changes in CLOUDSTACK-9348 PR #1549 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The first PR #1493 re-enabled the NioTest but not the new PR #1549. Signed-off-by: Marc-Aurèle Brothier --- utils/pom.xml | 1 - utils/src/main/java/com/cloud/utils/nio/NioConnection.java | 5 ++--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/utils/pom.xml b/utils/pom.xml index ae1bf23fe3c..c8ff0fb8182 100755 --- a/utils/pom.xml +++ b/utils/pom.xml @@ -208,7 +208,6 @@ com/cloud/utils/testcase/*TestCase* com/cloud/utils/db/*Test* - com/cloud/utils/testcase/NioTest.java diff --git a/utils/src/main/java/com/cloud/utils/nio/NioConnection.java b/utils/src/main/java/com/cloud/utils/nio/NioConnection.java index 630b2ddab76..ce032462ec2 100644 --- a/utils/src/main/java/com/cloud/utils/nio/NioConnection.java +++ b/utils/src/main/java/com/cloud/utils/nio/NioConnection.java @@ -98,10 +98,9 @@ public abstract class NioConnection implements Callable { } _isStartup = true; - _threadExecutor = Executors.newSingleThreadExecutor(); - _futureTask = _threadExecutor.submit(this); - + _threadExecutor = Executors.newSingleThreadExecutor(new NamedThreadFactory(this._name + "-NioConnectionHandler")); _isRunning = true; + _futureTask = _threadExecutor.submit(this); } public void stop() { From 0db9c980a678aa250d3b1a401c1b308c15bf5ed6 Mon Sep 17 00:00:00 2001 From: Daan Hoogland Date: Thu, 20 Apr 2017 09:36:17 +0200 Subject: [PATCH 5/7] ignore bogus default gateway when a shared network is secondary the default gateway gets overwritten by a bogus one dnsmasq does the right thing and replaces it with its own default which is not good for us so check for '0.0.0.0' --- systemvm/patches/debian/config/opt/cloud/bin/cs/CsDhcp.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/systemvm/patches/debian/config/opt/cloud/bin/cs/CsDhcp.py b/systemvm/patches/debian/config/opt/cloud/bin/cs/CsDhcp.py index 23b74995364..da9e6168ee0 100755 --- a/systemvm/patches/debian/config/opt/cloud/bin/cs/CsDhcp.py +++ b/systemvm/patches/debian/config/opt/cloud/bin/cs/CsDhcp.py @@ -89,9 +89,10 @@ class CsDhcp(CsDataBag): gateway = gn.get_gateway() else: gateway = i['gateway'] - sline = "dhcp-option=tag:interface-%s-%s,3," % (device, idx) - line = "dhcp-option=tag:interface-%s-%s,3,%s" % (device, idx, gateway) - self.conf.search(sline, line) + if gateway != '0.0.0.0': + sline = "dhcp-option=tag:interface-%s-%s,3," % (device, idx) + line = "dhcp-option=tag:interface-%s-%s,3,%s" % (device, idx, gateway) + self.conf.search(sline, line) # Netmask netmask = '' if self.config.is_vpc(): From c4326b09c620b805da0312f912398cf045a93f32 Mon Sep 17 00:00:00 2001 From: Rohit Yadav Date: Thu, 27 Apr 2017 14:52:52 +0530 Subject: [PATCH 6/7] CLOUDSTACK-9904: Fix log4j to have @AGENTLOG@ replaced This fixes log4j xml to have @AGENTLOG@ replaced with values defined in build/replace.properties. Signed-off-by: Rohit Yadav --- plugins/hypervisors/hyperv/pom.xml | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/plugins/hypervisors/hyperv/pom.xml b/plugins/hypervisors/hyperv/pom.xml index bc42b7973c9..77eb73f0831 100644 --- a/plugins/hypervisors/hyperv/pom.xml +++ b/plugins/hypervisors/hyperv/pom.xml @@ -96,6 +96,35 @@ ${skipTests} + + maven-antrun-plugin + + + generate-resource + generate-resources + + run + + + + + + + + + + + + + + + + + + From 2e926d87e066011cd781d83946f8b3c44ae61b00 Mon Sep 17 00:00:00 2001 From: Wei Zhou Date: Mon, 15 May 2017 08:20:41 +0200 Subject: [PATCH 7/7] Do not set gateway to 0.0.0.0 for windows clients --- .../com/cloud/network/router/CommandSetupHelper.java | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/server/src/com/cloud/network/router/CommandSetupHelper.java b/server/src/com/cloud/network/router/CommandSetupHelper.java index 7208b256813..460a9c80fb6 100644 --- a/server/src/com/cloud/network/router/CommandSetupHelper.java +++ b/server/src/com/cloud/network/router/CommandSetupHelper.java @@ -108,8 +108,6 @@ import com.cloud.offering.NetworkOffering; import com.cloud.offerings.NetworkOfferingVO; import com.cloud.offerings.dao.NetworkOfferingDao; import com.cloud.service.dao.ServiceOfferingDao; -import com.cloud.storage.GuestOSVO; -import com.cloud.storage.dao.GuestOSDao; import com.cloud.user.Account; import com.cloud.uservm.UserVm; import com.cloud.utils.Pair; @@ -174,8 +172,6 @@ public class CommandSetupHelper { private VlanDao _vlanDao; @Inject private IPAddressDao _ipAddressDao; - @Inject - private GuestOSDao _guestOSDao; @Inject private RouterControlHelper _routerControlHelper; @@ -221,12 +217,6 @@ public class CommandSetupHelper { _networkModel.getExecuteInSeqNtwkElmtCmd()); String gatewayIp = nic.getIPv4Gateway(); - if (!nic.isDefaultNic()) { - final GuestOSVO guestOS = _guestOSDao.findById(vm.getGuestOSId()); - if (guestOS == null || !guestOS.getDisplayName().toLowerCase().contains("windows")) { - gatewayIp = "0.0.0.0"; - } - } final DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId());