Skip to content

Commit 77fb2c9

Browse files
Subhash YedugundlaRohit Yadav
authored andcommitted
CLOUDSTACK-9592 Empty responses from site to site connection status are not handled propertly
(cherry picked from commit ddf8fd5) Signed-off-by: Rohit Yadav <rohit.yadav@shapeblue.com>
1 parent 30bb558 commit 77fb2c9

3 files changed

Lines changed: 142 additions & 25 deletions

File tree

core/src/com/cloud/agent/api/CheckS2SVpnConnectionsAnswer.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,4 +76,14 @@ public String getDetail(String ip) {
7676
}
7777
return null;
7878
}
79+
80+
public boolean isIPPresent(String ip) {
81+
if (this.getResult()) {
82+
Boolean status = ipToConnected.get(ip);
83+
if (status != null) {
84+
return true;
85+
}
86+
}
87+
return false;
88+
}
7989
}

server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -898,18 +898,22 @@ protected void updateSite2SiteVpnConnectionState(final List<DomainRouterVO> rout
898898
}
899899
final Site2SiteVpnConnection.State oldState = conn.getState();
900900
final Site2SiteCustomerGateway gw = _s2sCustomerGatewayDao.findById(conn.getCustomerGatewayId());
901-
if (answer.isConnected(gw.getGatewayIp())) {
902-
conn.setState(Site2SiteVpnConnection.State.Connected);
903-
} else {
904-
conn.setState(Site2SiteVpnConnection.State.Disconnected);
905-
}
906-
_s2sVpnConnectionDao.persist(conn);
907-
if (oldState != conn.getState()) {
908-
final String title = "Site-to-site Vpn Connection to " + gw.getName() + " just switch from " + oldState + " to " + conn.getState();
909-
final String context = "Site-to-site Vpn Connection to " + gw.getName() + " on router " + router.getHostName() + "(id: " + router.getId() + ") "
910-
+ " just switch from " + oldState + " to " + conn.getState();
911-
s_logger.info(context);
912-
_alertMgr.sendAlert(AlertManager.AlertType.ALERT_TYPE_DOMAIN_ROUTER, router.getDataCenterId(), router.getPodIdToDeployIn(), title, context);
901+
902+
if (answer.isIPPresent(gw.getGatewayIp())) {
903+
if (answer.isConnected(gw.getGatewayIp())) {
904+
conn.setState(Site2SiteVpnConnection.State.Connected);
905+
} else {
906+
conn.setState(Site2SiteVpnConnection.State.Disconnected);
907+
}
908+
_s2sVpnConnectionDao.persist(conn);
909+
if (oldState != conn.getState()) {
910+
final String title = "Site-to-site Vpn Connection to " + gw.getName() + " just switched from " + oldState + " to " + conn.getState();
911+
final String context =
912+
"Site-to-site Vpn Connection to " + gw.getName() + " on router " + router.getHostName() + "(id: " + router.getId() + ") " +
913+
" just switched from " + oldState + " to " + conn.getState();
914+
s_logger.info(context);
915+
_alertMgr.sendAlert(AlertManager.AlertType.ALERT_TYPE_DOMAIN_ROUTER, router.getDataCenterId(), router.getPodIdToDeployIn(), title, context);
916+
}
913917
}
914918
} finally {
915919
_s2sVpnConnectionDao.releaseFromLockTable(lock.getId());

server/test/com/cloud/network/router/VirtualNetworkApplianceManagerImplTest.java

Lines changed: 116 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,17 @@
1616
// under the License.
1717
package com.cloud.network.router;
1818

19-
import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
20-
import org.junit.Test;
21-
import org.junit.runner.RunWith;
22-
import org.mockito.Mock;
23-
import org.mockito.runners.MockitoJUnitRunner;
24-
25-
import com.cloud.cluster.dao.ManagementServerHostDao;
26-
import com.cloud.dc.dao.ClusterDao;
27-
import com.cloud.dc.dao.DataCenterDao;
28-
import com.cloud.dc.dao.HostPodDao;
29-
import com.cloud.dc.dao.VlanDao;
30-
import com.cloud.host.dao.HostDao;
19+
import com.cloud.agent.AgentManager;
20+
import com.cloud.agent.api.CheckS2SVpnConnectionsAnswer;
21+
import com.cloud.agent.api.CheckS2SVpnConnectionsCommand;
22+
import com.cloud.alert.AlertManager;
23+
import com.cloud.host.Host;
24+
import com.cloud.host.HostVO;
25+
import com.cloud.host.Status;
26+
import com.cloud.hypervisor.Hypervisor;
27+
import com.cloud.network.Site2SiteVpnConnection;
28+
import com.cloud.network.dao.Site2SiteVpnConnectionVO;
29+
import com.cloud.network.dao.Site2SiteCustomerGatewayDao;
3130
import com.cloud.network.dao.FirewallRulesDao;
3231
import com.cloud.network.dao.IPAddressDao;
3332
import com.cloud.network.dao.LoadBalancerDao;
@@ -37,12 +36,30 @@
3736
import com.cloud.network.dao.OpRouterMonitorServiceDao;
3837
import com.cloud.network.dao.PhysicalNetworkServiceProviderDao;
3938
import com.cloud.network.dao.RemoteAccessVpnDao;
40-
import com.cloud.network.dao.Site2SiteCustomerGatewayDao;
39+
import com.cloud.network.dao.Site2SiteCustomerGatewayVO;
4140
import com.cloud.network.dao.Site2SiteVpnConnectionDao;
4241
import com.cloud.network.dao.Site2SiteVpnGatewayDao;
4342
import com.cloud.network.dao.UserIpv6AddressDao;
4443
import com.cloud.network.dao.VirtualRouterProviderDao;
4544
import com.cloud.network.dao.VpnUserDao;
45+
import com.cloud.network.vpn.Site2SiteVpnManager;
46+
import com.cloud.storage.Storage;
47+
import com.cloud.vm.DomainRouterVO;
48+
import com.cloud.vm.VirtualMachine;
49+
import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
50+
import org.apache.cloudstack.utils.identity.ManagementServerNode;
51+
import org.junit.Test;
52+
import org.junit.runner.RunWith;
53+
import org.mockito.InjectMocks;
54+
import org.mockito.Mock;
55+
import org.mockito.runners.MockitoJUnitRunner;
56+
57+
import com.cloud.cluster.dao.ManagementServerHostDao;
58+
import com.cloud.dc.dao.ClusterDao;
59+
import com.cloud.dc.dao.DataCenterDao;
60+
import com.cloud.dc.dao.HostPodDao;
61+
import com.cloud.dc.dao.VlanDao;
62+
import com.cloud.host.dao.HostDao;
4663
import com.cloud.network.rules.dao.PortForwardingRulesDao;
4764
import com.cloud.offerings.dao.NetworkOfferingDao;
4865
import com.cloud.service.dao.ServiceOfferingDao;
@@ -59,6 +76,18 @@
5976
import com.cloud.vm.dao.UserVmDao;
6077
import com.cloud.vm.dao.UserVmDetailsDao;
6178
import com.cloud.vm.dao.VMInstanceDao;
79+
import java.util.ArrayList;
80+
import java.util.Date;
81+
import java.util.List;
82+
import static org.mockito.Mockito.doNothing;
83+
import static org.mockito.Mockito.doReturn;
84+
import static org.mockito.Mockito.when;
85+
import static org.mockito.Matchers.any;
86+
import static org.mockito.Matchers.anyLong;
87+
import static org.mockito.Matchers.anyString;
88+
import static org.junit.Assert.assertEquals;
89+
90+
6291

6392
@RunWith(MockitoJUnitRunner.class)
6493
public class VirtualNetworkApplianceManagerImplTest {
@@ -177,6 +206,31 @@ public class VirtualNetworkApplianceManagerImplTest {
177206

178207
@Mock private VirtualMachineManager _itMgr;
179208

209+
@Mock
210+
private AgentManager _agentMgr;
211+
212+
@Mock
213+
private CheckS2SVpnConnectionsCommand _s2sConnCommand;
214+
215+
@Mock
216+
private CheckS2SVpnConnectionsAnswer _s2sVpnAnswer;
217+
218+
@Mock
219+
private DomainRouterVO _router;
220+
221+
@Mock
222+
private AlertManager _alertMgr;
223+
224+
@Mock
225+
private Site2SiteVpnManager _s2sVpnMgr;
226+
227+
@Mock
228+
private RouterControlHelper _routerControlHelper;
229+
230+
@InjectMocks
231+
private VirtualNetworkApplianceManagerImpl virtualNetworkApplianceManagerImpl;
232+
233+
180234
// @InjectMocks
181235
// private VirtualNetworkApplianceManagerImpl virtualNetworkApplianceManagerImpl;
182236

@@ -202,4 +256,53 @@ public void testDeployRouterNotRedundant() throws Exception {
202256
// // TODO: more elaborate mocking needed to have a vr returned
203257
//assertEquals(vr, null);
204258
}
259+
260+
@Test
261+
public void testUpdateSite2SiteVpnConnectionState() throws Exception{
262+
263+
DomainRouterVO router = new DomainRouterVO(1L, 1L, 1L, "First testing router", 1L, Hypervisor.HypervisorType.XenServer, 1L, 1L, 1L, 1L, false, VirtualRouter.RedundantState.MASTER, true, true, 1L);
264+
router.setState(VirtualMachine.State.Running);
265+
router.setPrivateIpAddress("192.168.50.15");
266+
267+
List<DomainRouterVO> routers = new ArrayList<DomainRouterVO>();
268+
routers.add(router);
269+
270+
Site2SiteVpnConnectionVO conn = new Site2SiteVpnConnectionVO(1L, 1L, 1L, 1L, false);
271+
Site2SiteVpnConnectionVO conn1 = new Site2SiteVpnConnectionVO(1L, 1L, 1L, 1L, false);
272+
conn.setState(Site2SiteVpnConnection.State.Disconnected);
273+
conn1.setState(Site2SiteVpnConnection.State.Disconnected);
274+
List<Site2SiteVpnConnectionVO> conns = new ArrayList<Site2SiteVpnConnectionVO>();
275+
conns.add(conn);
276+
conns.add(conn1);
277+
278+
Site2SiteCustomerGatewayVO gw = new Site2SiteCustomerGatewayVO("Testing gateway", 1L, 1L, "192.168.50.15", "Guest List", "ipsecPsk", "ikePolicy", "espPolicy", 1L, 1L, true, true);
279+
HostVO hostVo = new HostVO(1L, "Testing host", Host.Type.Routing, "192.168.50.15", "privateNetmask", "privateMacAddress", "publicIpAddress", "publicNetmask", "publicMacAddress", "storageIpAddress", "storageNetmask", "storageMacAddress", "deuxStorageIpAddress", "duxStorageNetmask", "deuxStorageMacAddress", "guid", Status.Up, "version", "iqn", new Date() , 1L, 1L, 1L, 1L, "parent", 20L, Storage.StoragePoolType.Gluster);
280+
hostVo.setManagementServerId(ManagementServerNode.getManagementServerId());
281+
282+
ArrayList<String> ipList = new ArrayList<>();
283+
ipList.add("192.168.50.15");
284+
285+
_s2sConnCommand = new CheckS2SVpnConnectionsCommand(ipList);
286+
287+
when(_s2sVpnMgr.getConnectionsForRouter(router)).thenReturn(conns);
288+
when(_s2sVpnConnectionDao.persist(conn)).thenReturn(null);
289+
when(_s2sCustomerGatewayDao.findById(conn.getCustomerGatewayId())).thenReturn(gw);
290+
when(_hostDao.findById(router.getHostId())).thenReturn(hostVo);
291+
when(_routerControlHelper.getRouterControlIp(router.getId())).thenReturn("192.168.50.15");
292+
doReturn(_s2sVpnAnswer).when(_agentMgr).easySend(anyLong(), any(CheckS2SVpnConnectionsCommand.class));
293+
when(_s2sVpnAnswer.getResult()).thenReturn(true);
294+
when(_s2sVpnConnectionDao.acquireInLockTable(conn.getId())).thenReturn(conn);
295+
when(_s2sVpnAnswer.isIPPresent("192.168.50.15")).thenReturn(true);
296+
when(_s2sVpnAnswer.isConnected("192.168.50.15")).thenReturn(true);
297+
doNothing().when(_alertMgr).sendAlert(any(AlertManager.AlertType.class), anyLong(), anyLong(), anyString(), anyString());
298+
299+
virtualNetworkApplianceManagerImpl.updateSite2SiteVpnConnectionState(routers);
300+
301+
for(Site2SiteVpnConnection connection : conns){
302+
assertEquals(Site2SiteVpnConnection.State.Connected, connection.getState());
303+
}
304+
}
305+
306+
307+
205308
}

0 commit comments

Comments
 (0)