Skip to content

Commit e9f526e

Browse files
committed
Merge branch '4.9' into 4.10
Signed-off-by: Rohit Yadav <rohit.yadav@shapeblue.com>
2 parents c1f30d9 + 0ead11e commit e9f526e

9 files changed

Lines changed: 121 additions & 62 deletions

File tree

agent/conf/agent.properties

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,3 +176,7 @@ hypervisor.type=kvm
176176
# vm.rng.rate.period=1000
177177
# The number of milliseconds in which the guest is allowed to obtain the bytes
178178
# specified above.
179+
180+
# router.aggregation.command.each.timeout=600
181+
# timeout value for aggregation commands send to virtual router
182+
#

api/src/org/apache/cloudstack/api/command/user/affinitygroup/UpdateVMAffinityGroupCmd.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -92,10 +92,6 @@ public Long getId() {
9292
}
9393

9494
public List<Long> getAffinityGroupIdList() {
95-
if (affinityGroupNameList != null && affinityGroupIdList != null) {
96-
throw new InvalidParameterValueException("affinitygroupids parameter is mutually exclusive with affinitygroupnames parameter");
97-
}
98-
9995
// transform group names to ids here
10096
if (affinityGroupNameList != null) {
10197
List<Long> affinityGroupIds = new ArrayList<Long>();
@@ -138,6 +134,14 @@ public long getEntityOwnerId() {
138134

139135
@Override
140136
public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException {
137+
if (affinityGroupNameList != null && affinityGroupIdList != null) {
138+
throw new InvalidParameterValueException("affinitygroupids parameter is mutually exclusive with affinitygroupnames parameter");
139+
}
140+
141+
if (affinityGroupNameList == null && affinityGroupIdList == null) {
142+
throw new InvalidParameterValueException("affinitygroupids parameter or affinitygroupnames parameter must be given");
143+
}
144+
141145
CallContext.current().setEventDetails("VM ID: " + getId());
142146
UserVm result = _affinityGroupService.updateVMAffinityGroups(getId(), getAffinityGroupIdList());
143147
ArrayList<VMDetails> dc = new ArrayList<VMDetails>();

core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,10 @@ public boolean configure(final String name, final Map<String, Object> params) th
283283
_port = NumbersUtil.parseInt(value, 3922);
284284

285285
value = (String)params.get("router.aggregation.command.each.timeout");
286-
_eachTimeout = Duration.standardSeconds(NumbersUtil.parseInt(value, 10));
286+
_eachTimeout = Duration.standardSeconds(NumbersUtil.parseInt(value, (int)VRScripts.VR_SCRIPT_EXEC_TIMEOUT.getStandardSeconds()));
287+
if (s_logger.isDebugEnabled()){
288+
s_logger.debug("The router.aggregation.command.each.timeout in seconds is set to " + _eachTimeout.getStandardSeconds());
289+
}
287290

288291
if (_vrDeployer == null) {
289292
throw new ConfigurationException("Unable to find the resource for VirtualRouterDeployer!");
@@ -387,8 +390,8 @@ private Answer execute(AggregationControlCommand cmd) {
387390
ScriptConfigItem scriptConfigItem = new ScriptConfigItem(VRScripts.VR_CFG, "-c " + VRScripts.CONFIG_CACHE_LOCATION + cfgFileName);
388391
// 120s is the minimal timeout
389392
Duration timeout = _eachTimeout.withDurationAdded(_eachTimeout.getStandardSeconds(), answerCounts);
390-
if (timeout.isShorterThan(VRScripts.VR_SCRIPT_EXEC_TIMEOUT)) {
391-
timeout = VRScripts.VR_SCRIPT_EXEC_TIMEOUT;
393+
if (s_logger.isDebugEnabled()){
394+
s_logger.debug("Aggregate action timeout in seconds is " + timeout.getStandardSeconds());
392395
}
393396

394397
ExecutionResult result = applyConfigToVR(cmd.getRouterAccessIp(), fileConfigItem, timeout);

plugins/network-elements/nuage-vsp/src/com/cloud/network/guru/NuageVspGuestNetworkGuru.java

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -25,25 +25,9 @@
2525

2626
import javax.inject.Inject;
2727

28-
import com.google.common.collect.FluentIterable;
29-
import net.nuage.vsp.acs.client.api.model.VspDhcpDomainOption;
30-
import net.nuage.vsp.acs.client.api.model.VspDhcpVMOption;
31-
import net.nuage.vsp.acs.client.api.model.VspDomain;
32-
import net.nuage.vsp.acs.client.api.model.VspNetwork;
33-
import net.nuage.vsp.acs.client.api.model.VspNic;
34-
import net.nuage.vsp.acs.client.api.model.VspStaticNat;
35-
import net.nuage.vsp.acs.client.api.model.VspVm;
36-
37-
import org.apache.log4j.Logger;
38-
39-
import com.google.common.base.Strings;
40-
import com.google.common.collect.Iterables;
41-
import com.google.common.collect.LinkedListMultimap;
42-
import com.google.common.collect.Lists;
43-
import com.google.common.collect.Maps;
44-
4528
import org.apache.cloudstack.resourcedetail.VpcDetailVO;
4629
import org.apache.cloudstack.resourcedetail.dao.VpcDetailsDao;
30+
import org.apache.log4j.Logger;
4731

4832
import com.cloud.agent.AgentManager;
4933
import com.cloud.agent.api.Answer;
@@ -98,6 +82,20 @@
9882
import com.cloud.vm.VirtualMachine;
9983
import com.cloud.vm.VirtualMachineProfile;
10084
import com.cloud.vm.dao.VMInstanceDao;
85+
import com.google.common.base.Strings;
86+
import com.google.common.collect.FluentIterable;
87+
import com.google.common.collect.Iterables;
88+
import com.google.common.collect.LinkedListMultimap;
89+
import com.google.common.collect.Lists;
90+
import com.google.common.collect.Maps;
91+
92+
import net.nuage.vsp.acs.client.api.model.VspDhcpDomainOption;
93+
import net.nuage.vsp.acs.client.api.model.VspDhcpVMOption;
94+
import net.nuage.vsp.acs.client.api.model.VspDomain;
95+
import net.nuage.vsp.acs.client.api.model.VspNetwork;
96+
import net.nuage.vsp.acs.client.api.model.VspNic;
97+
import net.nuage.vsp.acs.client.api.model.VspStaticNat;
98+
import net.nuage.vsp.acs.client.api.model.VspVm;
10199

102100
public class NuageVspGuestNetworkGuru extends GuestNetworkGuru {
103101
public static final Logger s_logger = Logger.getLogger(NuageVspGuestNetworkGuru.class);
@@ -335,7 +333,7 @@ public void reserve(NicProfile nic, Network network, VirtualMachineProfile vm, D
335333
VspStaticNat vspStaticNat = null;
336334
if (staticNatIp != null) {
337335
VlanVO staticNatVlan = _vlanDao.findById(staticNatIp.getVlanId());
338-
vspStaticNat = _nuageVspEntityBuilder.buildVspStaticNat(null, staticNatIp, staticNatVlan, null);
336+
vspStaticNat = _nuageVspEntityBuilder.buildVspStaticNat(null, staticNatIp, staticNatVlan, vspNic);
339337
}
340338

341339
boolean defaultHasDns = getDefaultHasDns(networkHasDnsCache, nicFromDb);
@@ -595,4 +593,4 @@ private Long getDefaultNetwork(long vmId) {
595593
}
596594

597595

598-
}
596+
}

plugins/network-elements/nuage-vsp/src/com/cloud/util/NuageVspEntityBuilder.java

Lines changed: 40 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,20 @@
1919

2020
package com.cloud.util;
2121

22+
import java.util.HashSet;
23+
import java.util.Iterator;
24+
import java.util.List;
25+
import java.util.Map;
26+
import java.util.Set;
27+
import java.util.TreeSet;
28+
29+
import javax.annotation.Nullable;
30+
import javax.inject.Inject;
31+
32+
import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
33+
import org.apache.commons.lang.StringUtils;
34+
import org.apache.log4j.Logger;
35+
2236
import com.cloud.dc.Vlan;
2337
import com.cloud.dc.VlanVO;
2438
import com.cloud.dc.dao.VlanDao;
@@ -57,9 +71,10 @@
5771
import com.google.common.collect.Iterables;
5872
import com.google.common.collect.Lists;
5973
import com.google.common.collect.Maps;
74+
6075
import net.nuage.vsp.acs.client.api.model.VspAclRule;
61-
import net.nuage.vsp.acs.client.api.model.VspDhcpDomainOption;
6276
import net.nuage.vsp.acs.client.api.model.VspAddressRange;
77+
import net.nuage.vsp.acs.client.api.model.VspDhcpDomainOption;
6378
import net.nuage.vsp.acs.client.api.model.VspDhcpVMOption;
6479
import net.nuage.vsp.acs.client.api.model.VspDomain;
6580
import net.nuage.vsp.acs.client.api.model.VspDomainCleanUp;
@@ -68,18 +83,6 @@
6883
import net.nuage.vsp.acs.client.api.model.VspStaticNat;
6984
import net.nuage.vsp.acs.client.api.model.VspVm;
7085
import net.nuage.vsp.acs.client.common.model.Pair;
71-
import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
72-
import org.apache.commons.lang.StringUtils;
73-
import org.apache.log4j.Logger;
74-
75-
import javax.annotation.Nullable;
76-
import javax.inject.Inject;
77-
import java.util.HashSet;
78-
import java.util.Iterator;
79-
import java.util.List;
80-
import java.util.Map;
81-
import java.util.Set;
82-
import java.util.TreeSet;
8386

8487
public class NuageVspEntityBuilder {
8588
private static final Logger s_logger = Logger.getLogger(NuageVspEntityBuilder.class);
@@ -380,25 +383,30 @@ private VspNic buildVspNic(String uuid, String macAddress, String ip, long netwo
380383
return vspNicBuilder.build();
381384
}
382385

383-
public VspStaticNat buildVspStaticNat(Boolean forRevoke, IPAddressVO staticNatIp, VlanVO staticNatVlan, NicVO nic) {
386+
public VspStaticNat buildVspStaticNat(Boolean forRevoke, IPAddressVO staticNatIp, VlanVO staticNatVlan, VspNic vspNic) {
384387
VspStaticNat.Builder vspStaticNatBuilder = new VspStaticNat.Builder()
385388
.ipUuid(staticNatIp.getUuid())
386389
.ipAddress(staticNatIp.getAddress().addr())
387390
.revoke(forRevoke)
388391
.oneToOneNat(staticNatIp.isOneToOneNat())
392+
.state(getEnumValue(staticNatIp.getState(), VspStaticNat.State.class))
389393
.vlanUuid(staticNatVlan.getUuid())
390394
.vlanGateway(staticNatVlan.getVlanGateway())
391395
.vlanNetmask(staticNatVlan.getVlanNetmask())
392396
.vlanUnderlay(NuageVspUtil.isUnderlayEnabledForVlan(_vlanDetailsDao, staticNatVlan));
393397

394-
if (nic != null) {
395-
VspNic vspNic = buildVspNic(nic);
398+
if (vspNic != null) {
396399
vspStaticNatBuilder.nic(vspNic);
397400
}
398401

399402
return vspStaticNatBuilder.build();
400403
}
401404

405+
public VspStaticNat buildVspStaticNat(Boolean forRevoke, IPAddressVO staticNatIp, VlanVO staticNatVlan, NicVO nic) {
406+
VspNic vspNic = (nic != null) ?buildVspNic(nic) : null;
407+
return buildVspStaticNat(forRevoke, staticNatIp, staticNatVlan, vspNic);
408+
}
409+
402410
public VspAclRule buildVspAclRule(FirewallRule firewallRule, Network network) {
403411
VspAclRule.Builder vspAclRuleBuilder = new VspAclRule.Builder()
404412
.uuid(firewallRule.getUuid())
@@ -506,4 +514,20 @@ public VspDhcpDomainOption buildNetworkDhcpOption(Network network, NetworkOfferi
506514

507515
return vspDhcpDomainBuilder.build();
508516
}
517+
518+
private <E extends Enum<E>> E getEnumValue(Enum cloudstackValue, Class<E> target) {
519+
try {
520+
return Enum.valueOf(target, cloudstackValue.name());
521+
} catch (IllegalArgumentException e) {
522+
return null;
523+
}
524+
}
525+
526+
private <E extends Enum<E>> E getEnumValue(Enum cloudstackValue, E defaultValue) {
527+
try {
528+
return Enum.valueOf(defaultValue.getDeclaringClass(), cloudstackValue.name());
529+
} catch (IllegalArgumentException e) {
530+
return defaultValue;
531+
}
532+
}
509533
}

plugins/network-elements/nuage-vsp/test/com/cloud/util/NuageVspEntityBuilderTest.java

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -19,26 +19,25 @@
1919

2020
package com.cloud.util;
2121

22-
import net.nuage.vsp.acs.client.api.model.Protocol;
23-
import net.nuage.vsp.acs.client.api.model.VspAclRule;
24-
import net.nuage.vsp.acs.client.api.model.VspDomain;
25-
import net.nuage.vsp.acs.client.api.model.VspNetwork;
26-
import net.nuage.vsp.acs.client.api.model.VspNic;
27-
import net.nuage.vsp.acs.client.api.model.VspStaticNat;
28-
import net.nuage.vsp.acs.client.api.model.VspVm;
22+
import static org.junit.Assert.assertEquals;
23+
import static org.junit.Assert.assertNotNull;
24+
import static org.junit.Assert.assertNull;
25+
import static org.mockito.Matchers.anyLong;
26+
import static org.mockito.Matchers.anyString;
27+
import static org.mockito.Mockito.mock;
28+
import static org.mockito.Mockito.when;
2929

3030
import org.junit.Before;
3131
import org.junit.Test;
3232

33-
import com.google.common.collect.Lists;
34-
3533
import com.cloud.NuageTest;
3634
import com.cloud.dc.VlanDetailsVO;
3735
import com.cloud.dc.VlanVO;
3836
import com.cloud.dc.dao.VlanDao;
3937
import com.cloud.dc.dao.VlanDetailsDao;
4038
import com.cloud.domain.DomainVO;
4139
import com.cloud.domain.dao.DomainDao;
40+
import com.cloud.network.IpAddress;
4241
import com.cloud.network.Network;
4342
import com.cloud.network.dao.IPAddressDao;
4443
import com.cloud.network.dao.IPAddressVO;
@@ -58,14 +57,15 @@
5857
import com.cloud.vm.NicProfile;
5958
import com.cloud.vm.NicVO;
6059
import com.cloud.vm.VirtualMachine;
60+
import com.google.common.collect.Lists;
6161

62-
import static org.junit.Assert.assertEquals;
63-
import static org.junit.Assert.assertNotNull;
64-
import static org.junit.Assert.assertNull;
65-
import static org.mockito.Matchers.anyLong;
66-
import static org.mockito.Matchers.anyString;
67-
import static org.mockito.Mockito.mock;
68-
import static org.mockito.Mockito.when;
62+
import net.nuage.vsp.acs.client.api.model.Protocol;
63+
import net.nuage.vsp.acs.client.api.model.VspAclRule;
64+
import net.nuage.vsp.acs.client.api.model.VspDomain;
65+
import net.nuage.vsp.acs.client.api.model.VspNetwork;
66+
import net.nuage.vsp.acs.client.api.model.VspNic;
67+
import net.nuage.vsp.acs.client.api.model.VspStaticNat;
68+
import net.nuage.vsp.acs.client.api.model.VspVm;
6969

7070
public class NuageVspEntityBuilderTest extends NuageTest {
7171

@@ -361,6 +361,7 @@ private void setUpMockedStaticNatIp() {
361361
when(_mockedStaticNatIp.getAddress()).thenReturn(new Ip("10.10.10.2"));
362362
when(_mockedStaticNatIp.isOneToOneNat()).thenReturn(true);
363363
when(_mockedStaticNatIp.getVmIp()).thenReturn("192.168.0.24");
364+
when(_mockedStaticNatIp.getState()).thenReturn(IpAddress.State.Allocated);
364365
}
365366

366367
private void setUpMockedStaticNatVlan() {

server/src/com/cloud/server/StatsCollector.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -439,7 +439,7 @@ class HostOutOfBandManagementStatsCollector extends ManagedContextRunnable {
439439
@Override
440440
protected void runInContext() {
441441
try {
442-
s_logger.debug("HostOutOfBandManagementStatsCollector is running...");
442+
s_logger.trace("HostOutOfBandManagementStatsCollector is running...");
443443
List<OutOfBandManagementVO> outOfBandManagementHosts = outOfBandManagementDao.findAllByManagementServer(ManagementServerNode.getManagementServerId());
444444
if (outOfBandManagementHosts == null) {
445445
return;
@@ -469,7 +469,7 @@ class VmStatsCollector extends ManagedContextRunnable {
469469
@Override
470470
protected void runInContext() {
471471
try {
472-
s_logger.debug("VmStatsCollector is running...");
472+
s_logger.trace("VmStatsCollector is running...");
473473

474474
SearchCriteria<HostVO> sc = _hostDao.createSearchCriteria();
475475
sc.addAnd("status", SearchCriteria.Op.EQ, Status.Up.toString());

systemvm/patches/debian/config/etc/vpcdnsmasq.conf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ except-interface=lo
9090
# want dnsmasq to really bind only the interfaces it is listening on,
9191
# uncomment this option. About the only time you may need this is when
9292
# running another nameserver on the same machine.
93-
bind-interfaces
93+
#bind-interfaces
9494

9595
# If you don't want dnsmasq to read /etc/hosts, uncomment the
9696
# following line.

test/integration/component/test_affinity_groups.py

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1040,7 +1040,6 @@ def test_03_update_aff_grp_for_vm_with_no_aff_grp(self):
10401040
for aff_grp in aff_grps:
10411041
aff_grp.delete(self.api_client)
10421042

1043-
@unittest.skip("Skip - Failing - work in progress")
10441043
@attr(tags=["simulator", "basic", "advanced", "multihost", "NotRun"])
10451044
def test_04_update_aff_grp_remove_all(self):
10461045
"""
@@ -1087,6 +1086,32 @@ def test_05_update_aff_grp_on_running_vm(self):
10871086
for aff_grp in aff_grps:
10881087
aff_grp.delete(self.api_client)
10891088

1089+
@attr(tags=["simulator", "basic", "advanced", "multihost", "NotRun"])
1090+
def test_06_update_aff_grp_invalid_args(self):
1091+
"""
1092+
Update the list of Affinity Groups with either both args or none
1093+
"""
1094+
1095+
self.create_aff_grp(aff_grp=self.services["host_anti_affinity"])
1096+
self.create_aff_grp(aff_grp=self.services["host_anti_affinity"])
1097+
vm1, hostid1 = self.create_vm_in_aff_grps([], account_name=self.account.name, domain_id=self.domain.id)
1098+
1099+
aff_grps = [self.aff_grp[0], self.aff_grp[1]]
1100+
vm1.stop(self.api_client)
1101+
1102+
with self.assertRaises(Exception):
1103+
vm1.update_affinity_group(self.api_client)
1104+
1105+
with self.assertRaises(Exception):
1106+
vm1.update_affinity_group(self.api_client, affinitygroupids=[self.aff_grp[0].id], affinitygroupnames=[self.aff_grp[1].name])
1107+
1108+
vm1.update_affinity_group(self.api_client, affinitygroupids=[])
1109+
1110+
vm1.delete(self.api_client)
1111+
# Can cleanup affinity groups since none are set on the VM
1112+
for aff_grp in aff_grps:
1113+
aff_grp.delete(self.api_client)
1114+
10901115
class TestDeployVMAffinityGroups(cloudstackTestCase):
10911116

10921117
@classmethod

0 commit comments

Comments
 (0)