Repository: cloudstack
Updated Branches:
  refs/heads/master 282c9da68 -> 94ab870d4


null pointer dereference fix

Signed-off-by: Laszlo Hornyak <laszlo.horn...@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 <laszlo.horn...@gmail.com>
Authored: Mon Apr 28 20:52:32 2014 +0200
Committer: Laszlo Hornyak <laszlo.horn...@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);
+    }
+}

Reply via email to