From 7ed3179bd168532fbfde3847bec5372ba76e4dec Mon Sep 17 00:00:00 2001 From: Abhinandan Prateek Date: Thu, 27 Jul 2017 14:47:20 +0530 Subject: [PATCH 1/4] CLOUDSTACK-9569: add router.aggregation.command.each.timeout to agent.properties (#1933) --- agent/conf/agent.properties | 4 ++++ .../resource/virtualnetwork/VirtualRoutingResource.java | 9 ++++++--- server/src/com/cloud/server/StatsCollector.java | 4 ++-- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/agent/conf/agent.properties b/agent/conf/agent.properties index daad05f3b65..8b99ee36466 100644 --- a/agent/conf/agent.properties +++ b/agent/conf/agent.properties @@ -152,3 +152,7 @@ hypervisor.type=kvm # kvmclock.disable=false # Some newer linux kernels are incapable of reliably migrating vms with kvmclock # This is a workaround for the bug, admin can set this to true per-host +# +#router.aggregation.command.each.timeout=600 +#timeout value for aggregation commands send to virtual router +# diff --git a/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java b/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java index 96dea5d1082..e424bacbdfc 100644 --- a/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java +++ b/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java @@ -283,7 +283,10 @@ public class VirtualRoutingResource { _port = NumbersUtil.parseInt(value, 3922); value = (String)params.get("router.aggregation.command.each.timeout"); - _eachTimeout = Duration.standardSeconds(NumbersUtil.parseInt(value, 10)); + _eachTimeout = Duration.standardSeconds(NumbersUtil.parseInt(value, (int)VRScripts.VR_SCRIPT_EXEC_TIMEOUT.getStandardSeconds())); + if (s_logger.isDebugEnabled()){ + s_logger.debug("The router.aggregation.command.each.timeout in seconds is set to " + _eachTimeout.getStandardSeconds()); + } if (_vrDeployer == null) { throw new ConfigurationException("Unable to find the resource for VirtualRouterDeployer!"); @@ -387,8 +390,8 @@ public class VirtualRoutingResource { ScriptConfigItem scriptConfigItem = new ScriptConfigItem(VRScripts.VR_CFG, "-c " + VRScripts.CONFIG_CACHE_LOCATION + cfgFileName); // 120s is the minimal timeout Duration timeout = _eachTimeout.withDurationAdded(_eachTimeout.getStandardSeconds(), answerCounts); - if (timeout.isShorterThan(VRScripts.VR_SCRIPT_EXEC_TIMEOUT)) { - timeout = VRScripts.VR_SCRIPT_EXEC_TIMEOUT; + if (s_logger.isDebugEnabled()){ + s_logger.debug("Aggregate action timeout in seconds is " + timeout.getStandardSeconds()); } ExecutionResult result = applyConfigToVR(cmd.getRouterAccessIp(), fileConfigItem); diff --git a/server/src/com/cloud/server/StatsCollector.java b/server/src/com/cloud/server/StatsCollector.java index b5d67c7a589..58d9d33f447 100644 --- a/server/src/com/cloud/server/StatsCollector.java +++ b/server/src/com/cloud/server/StatsCollector.java @@ -439,7 +439,7 @@ public class StatsCollector extends ManagerBase implements ComponentMethodInterc @Override protected void runInContext() { try { - s_logger.debug("HostOutOfBandManagementStatsCollector is running..."); + s_logger.trace("HostOutOfBandManagementStatsCollector is running..."); List outOfBandManagementHosts = outOfBandManagementDao.findAllByManagementServer(ManagementServerNode.getManagementServerId()); if (outOfBandManagementHosts == null) { return; @@ -469,7 +469,7 @@ public class StatsCollector extends ManagerBase implements ComponentMethodInterc @Override protected void runInContext() { try { - s_logger.debug("VmStatsCollector is running..."); + s_logger.trace("VmStatsCollector is running..."); SearchCriteria sc = _hostDao.createSearchCriteria(); sc.addAnd("status", SearchCriteria.Op.EQ, Status.Up.toString()); From 471b68698a9e64877c1f4611fa216ee8434da30f Mon Sep 17 00:00:00 2001 From: Slair1 Date: Fri, 28 Jul 2017 03:27:28 -0500 Subject: [PATCH 2/4] CLOUDSTACK-10016: VPC VR doesn't respond to DNS requests from remote access vpn clients (#2201) When enabling remote access VPN, a new interface is created upon client connecting via VPN. The DNS service (dnsmasq) is set only to listen on interfaces that are active when it starts. Thus VPN users are provided the VR's IP address for DNS resolution, but it is not actually listening for DNS requests. --- systemvm/patches/debian/config/etc/vpcdnsmasq.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/systemvm/patches/debian/config/etc/vpcdnsmasq.conf b/systemvm/patches/debian/config/etc/vpcdnsmasq.conf index d46d6236950..6cfc433cecf 100644 --- a/systemvm/patches/debian/config/etc/vpcdnsmasq.conf +++ b/systemvm/patches/debian/config/etc/vpcdnsmasq.conf @@ -90,7 +90,7 @@ except-interface=lo # want dnsmasq to really bind only the interfaces it is listening on, # uncomment this option. About the only time you may need this is when # running another nameserver on the same machine. -bind-interfaces +#bind-interfaces # If you don't want dnsmasq to read /etc/hosts, uncomment the # following line. From 28bc99565b12e0480ae2b86d8d97353696857f52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Aur=C3=A8le=20Brothier?= Date: Fri, 28 Jul 2017 10:29:30 +0200 Subject: [PATCH 3/4] CLOUDSTACK-9631: API: affinitygroupids or affinitygroupnames must be given (#1798) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Return an exception if both parameter are missing. This fixes an NPE in AffinityGroupServiceImpl.updateVMAffinityGroups() when the list was null. Signed-off-by: Marc-Aurèle Brothier --- .../UpdateVMAffinityGroupCmd.java | 12 ++++++--- .../component/test_affinity_groups.py | 27 ++++++++++++++++++- 2 files changed, 34 insertions(+), 5 deletions(-) diff --git a/api/src/org/apache/cloudstack/api/command/user/affinitygroup/UpdateVMAffinityGroupCmd.java b/api/src/org/apache/cloudstack/api/command/user/affinitygroup/UpdateVMAffinityGroupCmd.java index 703b051ef86..70850001cfc 100644 --- a/api/src/org/apache/cloudstack/api/command/user/affinitygroup/UpdateVMAffinityGroupCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/affinitygroup/UpdateVMAffinityGroupCmd.java @@ -92,10 +92,6 @@ public class UpdateVMAffinityGroupCmd extends BaseAsyncCmd { } public List getAffinityGroupIdList() { - if (affinityGroupNameList != null && affinityGroupIdList != null) { - throw new InvalidParameterValueException("affinitygroupids parameter is mutually exclusive with affinitygroupnames parameter"); - } - // transform group names to ids here if (affinityGroupNameList != null) { List affinityGroupIds = new ArrayList(); @@ -138,6 +134,14 @@ public class UpdateVMAffinityGroupCmd extends BaseAsyncCmd { @Override public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException { + if (affinityGroupNameList != null && affinityGroupIdList != null) { + throw new InvalidParameterValueException("affinitygroupids parameter is mutually exclusive with affinitygroupnames parameter"); + } + + if (affinityGroupNameList == null && affinityGroupIdList == null) { + throw new InvalidParameterValueException("affinitygroupids parameter or affinitygroupnames parameter must be given"); + } + CallContext.current().setEventDetails("VM ID: " + getId()); UserVm result = _affinityGroupService.updateVMAffinityGroups(getId(), getAffinityGroupIdList()); ArrayList dc = new ArrayList(); diff --git a/test/integration/component/test_affinity_groups.py b/test/integration/component/test_affinity_groups.py index c0c552973ae..1bf740361e6 100644 --- a/test/integration/component/test_affinity_groups.py +++ b/test/integration/component/test_affinity_groups.py @@ -1040,7 +1040,6 @@ class TestUpdateVMAffinityGroups(cloudstackTestCase): for aff_grp in aff_grps: aff_grp.delete(self.api_client) - @unittest.skip("Skip - Failing - work in progress") @attr(tags=["simulator", "basic", "advanced", "multihost", "NotRun"]) def test_04_update_aff_grp_remove_all(self): """ @@ -1087,6 +1086,32 @@ class TestUpdateVMAffinityGroups(cloudstackTestCase): for aff_grp in aff_grps: aff_grp.delete(self.api_client) + @attr(tags=["simulator", "basic", "advanced", "multihost", "NotRun"]) + def test_06_update_aff_grp_invalid_args(self): + """ + Update the list of Affinity Groups with either both args or none + """ + + self.create_aff_grp(aff_grp=self.services["host_anti_affinity"]) + self.create_aff_grp(aff_grp=self.services["host_anti_affinity"]) + vm1, hostid1 = self.create_vm_in_aff_grps([], account_name=self.account.name, domain_id=self.domain.id) + + aff_grps = [self.aff_grp[0], self.aff_grp[1]] + vm1.stop(self.api_client) + + with self.assertRaises(Exception): + vm1.update_affinity_group(self.api_client) + + with self.assertRaises(Exception): + vm1.update_affinity_group(self.api_client, affinitygroupids=[self.aff_grp[0].id], affinitygroupnames=[self.aff_grp[1].name]) + + vm1.update_affinity_group(self.api_client, affinitygroupids=[]) + + vm1.delete(self.api_client) + # Can cleanup affinity groups since none are set on the VM + for aff_grp in aff_grps: + aff_grp.delete(self.api_client) + class TestDeployVMAffinityGroups(cloudstackTestCase): @classmethod From 0ead11e8f1417f691851dc27341cdaf8b0eb4a4d Mon Sep 17 00:00:00 2001 From: Frank Maximus Date: Fri, 28 Jul 2017 10:30:43 +0200 Subject: [PATCH 4/4] CLOUDSTACK-9751: Fix public ip not applied, when added while VR is starting. (#1925) Public IP state wasn't passed to the vsp client, making it ignore the apply public ip. Reported-By: Raf Smeets --- .../guru/NuageVspGuestNetworkGuru.java | 31 ++++---- .../com/cloud/util/NuageVspEntityBuilder.java | 70 +++++++++++++------ .../cloud/util/NuageVspEntityBuilderTest.java | 2 + 3 files changed, 68 insertions(+), 35 deletions(-) diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/network/guru/NuageVspGuestNetworkGuru.java b/plugins/network-elements/nuage-vsp/src/com/cloud/network/guru/NuageVspGuestNetworkGuru.java index a6c17e3517f..d99c71dc06b 100644 --- a/plugins/network-elements/nuage-vsp/src/com/cloud/network/guru/NuageVspGuestNetworkGuru.java +++ b/plugins/network-elements/nuage-vsp/src/com/cloud/network/guru/NuageVspGuestNetworkGuru.java @@ -19,6 +19,22 @@ package com.cloud.network.guru; +import java.util.List; + +import javax.inject.Inject; + +import net.nuage.vsp.acs.client.api.model.VspNetwork; +import net.nuage.vsp.acs.client.api.model.VspNic; +import net.nuage.vsp.acs.client.api.model.VspStaticNat; +import net.nuage.vsp.acs.client.api.model.VspVm; + +import org.apache.log4j.Logger; + +import com.google.common.base.Strings; + +import org.apache.cloudstack.resourcedetail.VpcDetailVO; +import org.apache.cloudstack.resourcedetail.dao.VpcDetailsDao; + import com.cloud.agent.AgentManager; import com.cloud.agent.api.Answer; import com.cloud.agent.api.guru.DeallocateVmVspCommand; @@ -59,6 +75,7 @@ import com.cloud.offerings.dao.NetworkOfferingServiceMapDao; import com.cloud.user.Account; import com.cloud.user.AccountVO; import com.cloud.user.dao.AccountDao; +import com.cloud.util.NuageVspEntityBuilder; import com.cloud.utils.StringUtils; import com.cloud.utils.db.DB; import com.cloud.utils.exception.CloudRuntimeException; @@ -66,18 +83,6 @@ import com.cloud.vm.NicProfile; import com.cloud.vm.NicVO; import com.cloud.vm.ReservationContext; import com.cloud.vm.VirtualMachineProfile; -import com.google.common.base.Strings; -import com.cloud.util.NuageVspEntityBuilder; -import net.nuage.vsp.acs.client.api.model.VspNetwork; -import net.nuage.vsp.acs.client.api.model.VspNic; -import net.nuage.vsp.acs.client.api.model.VspStaticNat; -import net.nuage.vsp.acs.client.api.model.VspVm; -import org.apache.cloudstack.resourcedetail.VpcDetailVO; -import org.apache.cloudstack.resourcedetail.dao.VpcDetailsDao; -import org.apache.log4j.Logger; - -import javax.inject.Inject; -import java.util.List; public class NuageVspGuestNetworkGuru extends GuestNetworkGuru { public static final Logger s_logger = Logger.getLogger(NuageVspGuestNetworkGuru.class); @@ -256,7 +261,7 @@ public class NuageVspGuestNetworkGuru extends GuestNetworkGuru { VspStaticNat vspStaticNat = null; if (staticNatIp != null) { VlanVO staticNatVlan = _vlanDao.findById(staticNatIp.getVlanId()); - vspStaticNat = _nuageVspEntityBuilder.buildVspStaticNat(null, staticNatIp, staticNatVlan, null); + vspStaticNat = _nuageVspEntityBuilder.buildVspStaticNat(null, staticNatIp, staticNatVlan, vspNic); } HostVO nuageVspHost = getNuageVspHost(network.getPhysicalNetworkId()); diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/util/NuageVspEntityBuilder.java b/plugins/network-elements/nuage-vsp/src/com/cloud/util/NuageVspEntityBuilder.java index 8757ad02120..db24050cecd 100644 --- a/plugins/network-elements/nuage-vsp/src/com/cloud/util/NuageVspEntityBuilder.java +++ b/plugins/network-elements/nuage-vsp/src/com/cloud/util/NuageVspEntityBuilder.java @@ -19,6 +19,30 @@ package com.cloud.util; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Set; +import java.util.TreeSet; + +import javax.inject.Inject; + +import net.nuage.vsp.acs.client.api.model.VspAclRule; +import net.nuage.vsp.acs.client.api.model.VspDomain; +import net.nuage.vsp.acs.client.api.model.VspNetwork; +import net.nuage.vsp.acs.client.api.model.VspNic; +import net.nuage.vsp.acs.client.api.model.VspStaticNat; +import net.nuage.vsp.acs.client.api.model.VspVm; +import net.nuage.vsp.acs.client.common.model.Pair; + +import org.apache.commons.lang.StringUtils; +import org.apache.log4j.Logger; + +import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; + +import org.apache.cloudstack.framework.config.dao.ConfigurationDao; + import com.cloud.dc.VlanVO; import com.cloud.dc.dao.VlanDao; import com.cloud.domain.Domain; @@ -44,25 +68,6 @@ import com.cloud.utils.net.NetUtils; import com.cloud.vm.NicProfile; import com.cloud.vm.NicVO; import com.cloud.vm.VirtualMachine; -import com.google.common.collect.Iterables; -import com.google.common.collect.Lists; -import net.nuage.vsp.acs.client.api.model.VspAclRule; -import net.nuage.vsp.acs.client.api.model.VspDomain; -import net.nuage.vsp.acs.client.api.model.VspNetwork; -import net.nuage.vsp.acs.client.api.model.VspNic; -import net.nuage.vsp.acs.client.api.model.VspStaticNat; -import net.nuage.vsp.acs.client.api.model.VspVm; -import net.nuage.vsp.acs.client.common.model.Pair; -import org.apache.cloudstack.framework.config.dao.ConfigurationDao; -import org.apache.commons.lang.StringUtils; -import org.apache.log4j.Logger; - -import javax.inject.Inject; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Set; -import java.util.TreeSet; public class NuageVspEntityBuilder { private static final Logger s_logger = Logger.getLogger(NuageVspEntityBuilder.class); @@ -270,24 +275,29 @@ public class NuageVspEntityBuilder { return vspNicBuilder.build(); } - public VspStaticNat buildVspStaticNat(Boolean forRevoke, IPAddressVO staticNatIp, VlanVO staticNatVlan, NicVO nic) { + public VspStaticNat buildVspStaticNat(Boolean forRevoke, IPAddressVO staticNatIp, VlanVO staticNatVlan, VspNic vspNic) { VspStaticNat.Builder vspStaticNatBuilder = new VspStaticNat.Builder() .ipUuid(staticNatIp.getUuid()) .ipAddress(staticNatIp.getAddress().addr()) .revoke(forRevoke) .oneToOneNat(staticNatIp.isOneToOneNat()) + .state(getEnumValue(staticNatIp.getState(), VspStaticNat.State.class)) .vlanUuid(staticNatVlan.getUuid()) .vlanGateway(staticNatVlan.getVlanGateway()) .vlanNetmask(staticNatVlan.getVlanNetmask()); - if (nic != null) { - VspNic vspNic = buildVspNic(nic); + if (vspNic != null) { vspStaticNatBuilder.nic(vspNic); } return vspStaticNatBuilder.build(); } + public VspStaticNat buildVspStaticNat(Boolean forRevoke, IPAddressVO staticNatIp, VlanVO staticNatVlan, NicVO nic) { + VspNic vspNic = (nic != null) ?buildVspNic(nic) : null; + return buildVspStaticNat(forRevoke, staticNatIp, staticNatVlan, vspNic); + } + public VspAclRule buildVspAclRule(FirewallRule firewallRule, Network network) { VspAclRule.Builder vspAclRuleBuilder = new VspAclRule.Builder() .uuid(firewallRule.getUuid()) @@ -367,4 +377,20 @@ public class NuageVspEntityBuilder { return vspAclRuleBuilder.build(); } + + private > E getEnumValue(Enum cloudstackValue, Class target) { + try { + return Enum.valueOf(target, cloudstackValue.name()); + } catch (IllegalArgumentException e) { + return null; + } + } + + private > E getEnumValue(Enum cloudstackValue, E defaultValue) { + try { + return Enum.valueOf(defaultValue.getDeclaringClass(), cloudstackValue.name()); + } catch (IllegalArgumentException e) { + return defaultValue; + } + } } diff --git a/plugins/network-elements/nuage-vsp/test/com/cloud/util/NuageVspEntityBuilderTest.java b/plugins/network-elements/nuage-vsp/test/com/cloud/util/NuageVspEntityBuilderTest.java index 1ddc106877f..ef632208c2f 100644 --- a/plugins/network-elements/nuage-vsp/test/com/cloud/util/NuageVspEntityBuilderTest.java +++ b/plugins/network-elements/nuage-vsp/test/com/cloud/util/NuageVspEntityBuilderTest.java @@ -24,6 +24,7 @@ import com.cloud.dc.VlanVO; import com.cloud.dc.dao.VlanDao; import com.cloud.domain.DomainVO; import com.cloud.domain.dao.DomainDao; +import com.cloud.network.IpAddress; import com.cloud.network.Network; import com.cloud.network.dao.IPAddressDao; import com.cloud.network.dao.IPAddressVO; @@ -359,6 +360,7 @@ public class NuageVspEntityBuilderTest extends NuageTest { when(_mockedStaticNatIp.getAddress()).thenReturn(new Ip("10.10.10.2")); when(_mockedStaticNatIp.isOneToOneNat()).thenReturn(true); when(_mockedStaticNatIp.getVmIp()).thenReturn("192.168.0.24"); + when(_mockedStaticNatIp.getState()).thenReturn(IpAddress.State.Allocated); } private void setUpMockedStaticNatVlan() {