You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ko...@apache.org on 2014/04/29 22:27:31 UTC
git commit: updated refs/heads/master to 94ab870
Repository: cloudstack
Updated Branches:
refs/heads/master 282c9da68 -> 94ab870d4
null pointer dereference fix
Signed-off-by: Laszlo Hornyak <la...@gmail.com>
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/94ab870d
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/94ab870d
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/94ab870d
Branch: refs/heads/master
Commit: 94ab870d423fa168773469221929281f2a21a919
Parents: 282c9da
Author: Laszlo Hornyak <la...@gmail.com>
Authored: Mon Apr 28 20:52:32 2014 +0200
Committer: Laszlo Hornyak <la...@gmail.com>
Committed: Tue Apr 29 21:46:16 2014 +0200
----------------------------------------------------------------------
.../ExternalLoadBalancerDeviceManagerImpl.java | 19 +-
...ternalLoadBalancerDeviceManagerImplTest.java | 210 +++++++++++++++++++
2 files changed, 221 insertions(+), 8 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/94ab870d/server/src/com/cloud/network/ExternalLoadBalancerDeviceManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/ExternalLoadBalancerDeviceManagerImpl.java b/server/src/com/cloud/network/ExternalLoadBalancerDeviceManagerImpl.java
index 2a22ac2..a608db8 100644
--- a/server/src/com/cloud/network/ExternalLoadBalancerDeviceManagerImpl.java
+++ b/server/src/com/cloud/network/ExternalLoadBalancerDeviceManagerImpl.java
@@ -691,7 +691,9 @@ public abstract class ExternalLoadBalancerDeviceManagerImpl extends AdapterBase
try {
answer = (DestroyLoadBalancerApplianceAnswer)_agentMgr.easySend(lbDevice.getParentHostId(), lbDeleteCmd);
if (answer == null || !answer.getResult()) {
- s_logger.warn("Failed to destoy load balancer appliance used by the network" + guestConfig.getId() + " due to " + answer.getDetails());
+ s_logger.warn("Failed to destoy load balancer appliance used by the network"
+ + guestConfig.getId() + " due to " + answer == null ? "communication error with agent"
+ : answer.getDetails());
}
} catch (Exception e) {
s_logger.warn("Failed to destroy load balancer appliance used by the network" + guestConfig.getId() + " due to " + e.getMessage());
@@ -1145,7 +1147,6 @@ public abstract class ExternalLoadBalancerDeviceManagerImpl extends AdapterBase
// Find the external load balancer in this zone
long zoneId = network.getDataCenterId();
DataCenterVO zone = _dcDao.findById(zoneId);
- HealthCheckLBConfigAnswer answer = null;
if (loadBalancingRules == null || loadBalancingRules.isEmpty()) {
return null;
@@ -1169,10 +1170,8 @@ public abstract class ExternalLoadBalancerDeviceManagerImpl extends AdapterBase
List<LoadBalancerTO> loadBalancersToApply = new ArrayList<LoadBalancerTO>();
List<MappingState> mappingStates = new ArrayList<MappingState>();
- for (int i = 0; i < loadBalancingRules.size(); i++) {
- LoadBalancingRule rule = loadBalancingRules.get(i);
-
- boolean revoked = (rule.getState().equals(FirewallRule.State.Revoke));
+ for (final LoadBalancingRule rule : loadBalancingRules) {
+ boolean revoked = (FirewallRule.State.Revoke.equals(rule.getState()));
String protocol = rule.getProtocol();
String algorithm = rule.getAlgorithm();
String uuid = rule.getUuid();
@@ -1213,12 +1212,16 @@ public abstract class ExternalLoadBalancerDeviceManagerImpl extends AdapterBase
long guestVlanTag = Integer.parseInt(BroadcastDomainType.getValue(network.getBroadcastUri()));
cmd.setAccessDetail(NetworkElementCommand.GUEST_VLAN_TAG, String.valueOf(guestVlanTag));
- answer = (HealthCheckLBConfigAnswer)_agentMgr.easySend(externalLoadBalancer.getId(), cmd);
+ HealthCheckLBConfigAnswer answer = (HealthCheckLBConfigAnswer) _agentMgr
+ .easySend(externalLoadBalancer.getId(), cmd);
+ // easySend will return null on error
+ return answer == null ? null : answer.getLoadBalancers();
}
} catch (Exception ex) {
s_logger.error("Exception Occured ", ex);
}
- return answer.getLoadBalancers();
+ //null return is handled by clients
+ return null;
}
private NicVO getPlaceholderNic(Network network) {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/94ab870d/server/test/com/cloud/network/ExternalLoadBalancerDeviceManagerImplTest.java
----------------------------------------------------------------------
diff --git a/server/test/com/cloud/network/ExternalLoadBalancerDeviceManagerImplTest.java b/server/test/com/cloud/network/ExternalLoadBalancerDeviceManagerImplTest.java
new file mode 100644
index 0000000..046bdb6
--- /dev/null
+++ b/server/test/com/cloud/network/ExternalLoadBalancerDeviceManagerImplTest.java
@@ -0,0 +1,210 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package com.cloud.network;
+
+import java.lang.reflect.Field;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.Arrays;
+import java.util.Collections;
+
+import javax.inject.Inject;
+
+import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
+import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.runners.MockitoJUnitRunner;
+
+import com.cloud.agent.AgentManager;
+import com.cloud.agent.api.Command;
+import com.cloud.agent.api.routing.HealthCheckLBConfigAnswer;
+import com.cloud.agent.api.to.LoadBalancerTO;
+import com.cloud.dc.dao.DataCenterDao;
+import com.cloud.dc.dao.HostPodDao;
+import com.cloud.dc.dao.VlanDao;
+import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.host.HostVO;
+import com.cloud.host.dao.HostDao;
+import com.cloud.host.dao.HostDetailsDao;
+import com.cloud.network.dao.ExternalFirewallDeviceDao;
+import com.cloud.network.dao.ExternalLoadBalancerDeviceDao;
+import com.cloud.network.dao.ExternalLoadBalancerDeviceVO;
+import com.cloud.network.dao.IPAddressDao;
+import com.cloud.network.dao.InlineLoadBalancerNicMapDao;
+import com.cloud.network.dao.LoadBalancerDao;
+import com.cloud.network.dao.NetworkDao;
+import com.cloud.network.dao.NetworkExternalFirewallDao;
+import com.cloud.network.dao.NetworkExternalLoadBalancerDao;
+import com.cloud.network.dao.NetworkExternalLoadBalancerVO;
+import com.cloud.network.dao.NetworkServiceMapDao;
+import com.cloud.network.dao.PhysicalNetworkDao;
+import com.cloud.network.dao.PhysicalNetworkServiceProviderDao;
+import com.cloud.network.lb.LoadBalancingRule;
+import com.cloud.network.rules.dao.PortForwardingRulesDao;
+import com.cloud.offerings.dao.NetworkOfferingDao;
+import com.cloud.resource.ResourceManager;
+import com.cloud.user.AccountManager;
+import com.cloud.user.dao.AccountDao;
+import com.cloud.user.dao.UserStatisticsDao;
+import com.cloud.utils.net.Ip;
+import com.cloud.vm.dao.DomainRouterDao;
+import com.cloud.vm.dao.NicDao;
+
+@RunWith(MockitoJUnitRunner.class)
+public class ExternalLoadBalancerDeviceManagerImplTest {
+
+ @Mock
+ NetworkExternalLoadBalancerDao _networkExternalLBDao;
+ @Mock
+ ExternalLoadBalancerDeviceDao _externalLoadBalancerDeviceDao;
+ @Mock
+ HostDao _hostDao;
+ @Mock
+ DataCenterDao _dcDao;
+ @Mock
+ NetworkModel _networkModel;
+ @Mock
+ NetworkOrchestrationService _networkMgr;
+ @Mock
+ InlineLoadBalancerNicMapDao _inlineLoadBalancerNicMapDao;
+ @Mock
+ NicDao _nicDao;
+ @Mock
+ AgentManager _agentMgr;
+ @Mock
+ ResourceManager _resourceMgr;
+ @Mock
+ IPAddressDao _ipAddressDao;
+ @Mock
+ VlanDao _vlanDao;
+ @Mock
+ NetworkOfferingDao _networkOfferingDao;
+ @Mock
+ AccountDao _accountDao;
+ @Mock
+ PhysicalNetworkDao _physicalNetworkDao;
+ @Mock
+ PhysicalNetworkServiceProviderDao _physicalNetworkServiceProviderDao;
+ @Mock
+ AccountManager _accountMgr;
+ @Mock
+ UserStatisticsDao _userStatsDao;
+ @Mock
+ NetworkDao _networkDao;
+ @Mock
+ DomainRouterDao _routerDao;
+ @Mock
+ LoadBalancerDao _loadBalancerDao;
+ @Mock
+ PortForwardingRulesDao _portForwardingRulesDao;
+ @Mock
+ ConfigurationDao _configDao;
+ @Mock
+ HostDetailsDao _hostDetailDao;
+ @Mock
+ NetworkExternalLoadBalancerDao _networkLBDao;
+ @Mock
+ NetworkServiceMapDao _ntwkSrvcProviderDao;
+ @Mock
+ NetworkExternalFirewallDao _networkExternalFirewallDao;
+ @Mock
+ ExternalFirewallDeviceDao _externalFirewallDeviceDao;
+ @Mock
+ protected HostPodDao _podDao = null;
+ @Mock
+ IpAddressManager _ipAddrMgr;
+
+ @Mock
+ Network network;
+
+ @Mock
+ LoadBalancingRule rule;
+
+ ExternalLoadBalancerDeviceManagerImpl externalLoadBalancerDeviceManager;
+
+ @Before
+ public void setup() throws IllegalArgumentException,
+ IllegalAccessException, NoSuchFieldException, SecurityException {
+ externalLoadBalancerDeviceManager = new ExternalLoadBalancerDeviceManagerImpl() {
+ };
+ for (Field fieldToInject : ExternalLoadBalancerDeviceManagerImpl.class
+ .getDeclaredFields()) {
+ if (fieldToInject.isAnnotationPresent(Inject.class)) {
+ fieldToInject.setAccessible(true);
+ fieldToInject.set(externalLoadBalancerDeviceManager, this
+ .getClass().getDeclaredField(fieldToInject.getName())
+ .get(this));
+ }
+ }
+ }
+
+ @Test
+ public void getLBHealthChecks() throws ResourceUnavailableException,
+ URISyntaxException {
+ setupLBHealthChecksMocks();
+
+ HealthCheckLBConfigAnswer answer = Mockito
+ .mock(HealthCheckLBConfigAnswer.class);
+ Mockito.when(answer.getLoadBalancers()).thenReturn(
+ Collections.<LoadBalancerTO> emptyList());
+ Mockito.when(
+ _agentMgr.easySend(Mockito.anyLong(),
+ Mockito.any(Command.class))).thenReturn(answer);
+
+ Assert.assertNotNull(externalLoadBalancerDeviceManager
+ .getLBHealthChecks(network, Arrays.asList(rule)));
+ }
+
+ @Test
+ public void getLBHealthChecksNullAnswer() throws ResourceUnavailableException,
+ URISyntaxException {
+ setupLBHealthChecksMocks();
+
+ Mockito.when(
+ _agentMgr.easySend(Mockito.anyLong(),
+ Mockito.any(Command.class))).thenReturn(null);
+
+ Assert.assertNull(externalLoadBalancerDeviceManager
+ .getLBHealthChecks(network, Arrays.asList(rule)));
+ }
+
+ private void setupLBHealthChecksMocks() throws URISyntaxException {
+ Mockito.when(network.getId()).thenReturn(42l);
+ Mockito.when(network.getBroadcastUri()).thenReturn(new URI("vlan://1"));
+ NetworkExternalLoadBalancerVO externalLb = Mockito
+ .mock(NetworkExternalLoadBalancerVO.class);
+ Mockito.when(externalLb.getExternalLBDeviceId()).thenReturn(66l);
+ Mockito.when(_networkExternalLBDao.findByNetworkId(42)).thenReturn(
+ externalLb);
+ ExternalLoadBalancerDeviceVO lbDevice = Mockito
+ .mock(ExternalLoadBalancerDeviceVO.class);
+ Mockito.when(_externalLoadBalancerDeviceDao.findById(66l)).thenReturn(
+ lbDevice);
+ Mockito.when(rule.getAlgorithm()).thenReturn("TEST");
+ Mockito.when(rule.getProtocol()).thenReturn("TEST");
+ Mockito.when(rule.getSourceIp()).thenReturn(new Ip(1l));
+ Mockito.when(lbDevice.getHostId()).thenReturn(99l);
+ HostVO hostVo = Mockito.mock(HostVO.class);
+ Mockito.when(_hostDao.findById(Mockito.anyLong())).thenReturn(hostVo);
+ }
+}