mirror of
				https://github.com/apache/cloudstack.git
				synced 2025-11-04 00:02:37 +01:00 
			
		
		
		
	CLOUDSTACK-9592 Empty responses from site to site connection status are not handled propertly
(cherry picked from commit ddf8fd514af3ee6fd2a7524a2bc7ea84fc22ea2d) Signed-off-by: Rohit Yadav <rohit.yadav@shapeblue.com>
This commit is contained in:
		
							parent
							
								
									30bb5587d2
								
							
						
					
					
						commit
						77fb2c92ce
					
				@ -76,4 +76,14 @@ public class CheckS2SVpnConnectionsAnswer extends Answer {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
        return null;
 | 
					        return null;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public boolean isIPPresent(String ip) {
 | 
				
			||||||
 | 
					        if (this.getResult()) {
 | 
				
			||||||
 | 
					            Boolean status = ipToConnected.get(ip);
 | 
				
			||||||
 | 
					            if (status != null) {
 | 
				
			||||||
 | 
					                return true;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return  false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -898,18 +898,22 @@ Configurable, StateListener<VirtualMachine.State, VirtualMachine.Event, VirtualM
 | 
				
			|||||||
                        }
 | 
					                        }
 | 
				
			||||||
                        final Site2SiteVpnConnection.State oldState = conn.getState();
 | 
					                        final Site2SiteVpnConnection.State oldState = conn.getState();
 | 
				
			||||||
                        final Site2SiteCustomerGateway gw = _s2sCustomerGatewayDao.findById(conn.getCustomerGatewayId());
 | 
					                        final Site2SiteCustomerGateway gw = _s2sCustomerGatewayDao.findById(conn.getCustomerGatewayId());
 | 
				
			||||||
                        if (answer.isConnected(gw.getGatewayIp())) {
 | 
					
 | 
				
			||||||
                            conn.setState(Site2SiteVpnConnection.State.Connected);
 | 
					                        if (answer.isIPPresent(gw.getGatewayIp())) {
 | 
				
			||||||
                        } else {
 | 
					                            if (answer.isConnected(gw.getGatewayIp())) {
 | 
				
			||||||
                            conn.setState(Site2SiteVpnConnection.State.Disconnected);
 | 
					                                conn.setState(Site2SiteVpnConnection.State.Connected);
 | 
				
			||||||
                        }
 | 
					                            } else {
 | 
				
			||||||
                        _s2sVpnConnectionDao.persist(conn);
 | 
					                                conn.setState(Site2SiteVpnConnection.State.Disconnected);
 | 
				
			||||||
                        if (oldState != conn.getState()) {
 | 
					                            }
 | 
				
			||||||
                            final String title = "Site-to-site Vpn Connection to " + gw.getName() + " just switch from " + oldState + " to " + conn.getState();
 | 
					                            _s2sVpnConnectionDao.persist(conn);
 | 
				
			||||||
                            final String context = "Site-to-site Vpn Connection to " + gw.getName() + " on router " + router.getHostName() + "(id: " + router.getId() + ") "
 | 
					                            if (oldState != conn.getState()) {
 | 
				
			||||||
                                    + " just switch from " + oldState + " to " + conn.getState();
 | 
					                                final String title = "Site-to-site Vpn Connection to " + gw.getName() + " just switched from " + oldState + " to " + conn.getState();
 | 
				
			||||||
                            s_logger.info(context);
 | 
					                                final String context =
 | 
				
			||||||
                            _alertMgr.sendAlert(AlertManager.AlertType.ALERT_TYPE_DOMAIN_ROUTER, router.getDataCenterId(), router.getPodIdToDeployIn(), title, context);
 | 
					                                        "Site-to-site Vpn Connection to " + gw.getName() + " on router " + router.getHostName() + "(id: " + router.getId() + ") " +
 | 
				
			||||||
 | 
					                                                " just switched from " + oldState + " to " + conn.getState();
 | 
				
			||||||
 | 
					                                s_logger.info(context);
 | 
				
			||||||
 | 
					                                _alertMgr.sendAlert(AlertManager.AlertType.ALERT_TYPE_DOMAIN_ROUTER, router.getDataCenterId(), router.getPodIdToDeployIn(), title, context);
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                    } finally {
 | 
					                    } finally {
 | 
				
			||||||
                        _s2sVpnConnectionDao.releaseFromLockTable(lock.getId());
 | 
					                        _s2sVpnConnectionDao.releaseFromLockTable(lock.getId());
 | 
				
			||||||
 | 
				
			|||||||
@ -16,18 +16,17 @@
 | 
				
			|||||||
// under the License.
 | 
					// under the License.
 | 
				
			||||||
package com.cloud.network.router;
 | 
					package com.cloud.network.router;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
 | 
					import com.cloud.agent.AgentManager;
 | 
				
			||||||
import org.junit.Test;
 | 
					import com.cloud.agent.api.CheckS2SVpnConnectionsAnswer;
 | 
				
			||||||
import org.junit.runner.RunWith;
 | 
					import com.cloud.agent.api.CheckS2SVpnConnectionsCommand;
 | 
				
			||||||
import org.mockito.Mock;
 | 
					import com.cloud.alert.AlertManager;
 | 
				
			||||||
import org.mockito.runners.MockitoJUnitRunner;
 | 
					import com.cloud.host.Host;
 | 
				
			||||||
 | 
					import com.cloud.host.HostVO;
 | 
				
			||||||
import com.cloud.cluster.dao.ManagementServerHostDao;
 | 
					import com.cloud.host.Status;
 | 
				
			||||||
import com.cloud.dc.dao.ClusterDao;
 | 
					import com.cloud.hypervisor.Hypervisor;
 | 
				
			||||||
import com.cloud.dc.dao.DataCenterDao;
 | 
					import com.cloud.network.Site2SiteVpnConnection;
 | 
				
			||||||
import com.cloud.dc.dao.HostPodDao;
 | 
					import com.cloud.network.dao.Site2SiteVpnConnectionVO;
 | 
				
			||||||
import com.cloud.dc.dao.VlanDao;
 | 
					import com.cloud.network.dao.Site2SiteCustomerGatewayDao;
 | 
				
			||||||
import com.cloud.host.dao.HostDao;
 | 
					 | 
				
			||||||
import com.cloud.network.dao.FirewallRulesDao;
 | 
					import com.cloud.network.dao.FirewallRulesDao;
 | 
				
			||||||
import com.cloud.network.dao.IPAddressDao;
 | 
					import com.cloud.network.dao.IPAddressDao;
 | 
				
			||||||
import com.cloud.network.dao.LoadBalancerDao;
 | 
					import com.cloud.network.dao.LoadBalancerDao;
 | 
				
			||||||
@ -37,12 +36,30 @@ import com.cloud.network.dao.NetworkDao;
 | 
				
			|||||||
import com.cloud.network.dao.OpRouterMonitorServiceDao;
 | 
					import com.cloud.network.dao.OpRouterMonitorServiceDao;
 | 
				
			||||||
import com.cloud.network.dao.PhysicalNetworkServiceProviderDao;
 | 
					import com.cloud.network.dao.PhysicalNetworkServiceProviderDao;
 | 
				
			||||||
import com.cloud.network.dao.RemoteAccessVpnDao;
 | 
					import com.cloud.network.dao.RemoteAccessVpnDao;
 | 
				
			||||||
import com.cloud.network.dao.Site2SiteCustomerGatewayDao;
 | 
					import com.cloud.network.dao.Site2SiteCustomerGatewayVO;
 | 
				
			||||||
import com.cloud.network.dao.Site2SiteVpnConnectionDao;
 | 
					import com.cloud.network.dao.Site2SiteVpnConnectionDao;
 | 
				
			||||||
import com.cloud.network.dao.Site2SiteVpnGatewayDao;
 | 
					import com.cloud.network.dao.Site2SiteVpnGatewayDao;
 | 
				
			||||||
import com.cloud.network.dao.UserIpv6AddressDao;
 | 
					import com.cloud.network.dao.UserIpv6AddressDao;
 | 
				
			||||||
import com.cloud.network.dao.VirtualRouterProviderDao;
 | 
					import com.cloud.network.dao.VirtualRouterProviderDao;
 | 
				
			||||||
import com.cloud.network.dao.VpnUserDao;
 | 
					import com.cloud.network.dao.VpnUserDao;
 | 
				
			||||||
 | 
					import com.cloud.network.vpn.Site2SiteVpnManager;
 | 
				
			||||||
 | 
					import com.cloud.storage.Storage;
 | 
				
			||||||
 | 
					import com.cloud.vm.DomainRouterVO;
 | 
				
			||||||
 | 
					import com.cloud.vm.VirtualMachine;
 | 
				
			||||||
 | 
					import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
 | 
				
			||||||
 | 
					import org.apache.cloudstack.utils.identity.ManagementServerNode;
 | 
				
			||||||
 | 
					import org.junit.Test;
 | 
				
			||||||
 | 
					import org.junit.runner.RunWith;
 | 
				
			||||||
 | 
					import org.mockito.InjectMocks;
 | 
				
			||||||
 | 
					import org.mockito.Mock;
 | 
				
			||||||
 | 
					import org.mockito.runners.MockitoJUnitRunner;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.cloud.cluster.dao.ManagementServerHostDao;
 | 
				
			||||||
 | 
					import com.cloud.dc.dao.ClusterDao;
 | 
				
			||||||
 | 
					import com.cloud.dc.dao.DataCenterDao;
 | 
				
			||||||
 | 
					import com.cloud.dc.dao.HostPodDao;
 | 
				
			||||||
 | 
					import com.cloud.dc.dao.VlanDao;
 | 
				
			||||||
 | 
					import com.cloud.host.dao.HostDao;
 | 
				
			||||||
import com.cloud.network.rules.dao.PortForwardingRulesDao;
 | 
					import com.cloud.network.rules.dao.PortForwardingRulesDao;
 | 
				
			||||||
import com.cloud.offerings.dao.NetworkOfferingDao;
 | 
					import com.cloud.offerings.dao.NetworkOfferingDao;
 | 
				
			||||||
import com.cloud.service.dao.ServiceOfferingDao;
 | 
					import com.cloud.service.dao.ServiceOfferingDao;
 | 
				
			||||||
@ -59,6 +76,18 @@ import com.cloud.vm.dao.NicIpAliasDao;
 | 
				
			|||||||
import com.cloud.vm.dao.UserVmDao;
 | 
					import com.cloud.vm.dao.UserVmDao;
 | 
				
			||||||
import com.cloud.vm.dao.UserVmDetailsDao;
 | 
					import com.cloud.vm.dao.UserVmDetailsDao;
 | 
				
			||||||
import com.cloud.vm.dao.VMInstanceDao;
 | 
					import com.cloud.vm.dao.VMInstanceDao;
 | 
				
			||||||
 | 
					import java.util.ArrayList;
 | 
				
			||||||
 | 
					import java.util.Date;
 | 
				
			||||||
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					import static org.mockito.Mockito.doNothing;
 | 
				
			||||||
 | 
					import static org.mockito.Mockito.doReturn;
 | 
				
			||||||
 | 
					import static org.mockito.Mockito.when;
 | 
				
			||||||
 | 
					import static org.mockito.Matchers.any;
 | 
				
			||||||
 | 
					import static org.mockito.Matchers.anyLong;
 | 
				
			||||||
 | 
					import static org.mockito.Matchers.anyString;
 | 
				
			||||||
 | 
					import static org.junit.Assert.assertEquals;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@RunWith(MockitoJUnitRunner.class)
 | 
					@RunWith(MockitoJUnitRunner.class)
 | 
				
			||||||
public class VirtualNetworkApplianceManagerImplTest {
 | 
					public class VirtualNetworkApplianceManagerImplTest {
 | 
				
			||||||
@ -177,6 +206,31 @@ public class VirtualNetworkApplianceManagerImplTest {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    @Mock private VirtualMachineManager _itMgr;
 | 
					    @Mock private VirtualMachineManager _itMgr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Mock
 | 
				
			||||||
 | 
					    private AgentManager _agentMgr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Mock
 | 
				
			||||||
 | 
					    private CheckS2SVpnConnectionsCommand _s2sConnCommand;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Mock
 | 
				
			||||||
 | 
					    private CheckS2SVpnConnectionsAnswer _s2sVpnAnswer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Mock
 | 
				
			||||||
 | 
					    private DomainRouterVO _router;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Mock
 | 
				
			||||||
 | 
					    private AlertManager _alertMgr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Mock
 | 
				
			||||||
 | 
					    private Site2SiteVpnManager _s2sVpnMgr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Mock
 | 
				
			||||||
 | 
					    private RouterControlHelper _routerControlHelper;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @InjectMocks
 | 
				
			||||||
 | 
					    private VirtualNetworkApplianceManagerImpl virtualNetworkApplianceManagerImpl;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    //    @InjectMocks
 | 
					    //    @InjectMocks
 | 
				
			||||||
    //    private VirtualNetworkApplianceManagerImpl virtualNetworkApplianceManagerImpl;
 | 
					    //    private VirtualNetworkApplianceManagerImpl virtualNetworkApplianceManagerImpl;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -202,4 +256,53 @@ public class VirtualNetworkApplianceManagerImplTest {
 | 
				
			|||||||
        //        // TODO: more elaborate mocking needed to have a vr returned
 | 
					        //        // TODO: more elaborate mocking needed to have a vr returned
 | 
				
			||||||
        //assertEquals(vr, null);
 | 
					        //assertEquals(vr, null);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Test
 | 
				
			||||||
 | 
					    public void testUpdateSite2SiteVpnConnectionState() throws Exception{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        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);
 | 
				
			||||||
 | 
					        router.setState(VirtualMachine.State.Running);
 | 
				
			||||||
 | 
					        router.setPrivateIpAddress("192.168.50.15");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        List<DomainRouterVO> routers = new ArrayList<DomainRouterVO>();
 | 
				
			||||||
 | 
					        routers.add(router);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Site2SiteVpnConnectionVO conn = new Site2SiteVpnConnectionVO(1L, 1L, 1L, 1L, false);
 | 
				
			||||||
 | 
					        Site2SiteVpnConnectionVO conn1 = new Site2SiteVpnConnectionVO(1L, 1L, 1L, 1L, false);
 | 
				
			||||||
 | 
					        conn.setState(Site2SiteVpnConnection.State.Disconnected);
 | 
				
			||||||
 | 
					        conn1.setState(Site2SiteVpnConnection.State.Disconnected);
 | 
				
			||||||
 | 
					        List<Site2SiteVpnConnectionVO> conns = new ArrayList<Site2SiteVpnConnectionVO>();
 | 
				
			||||||
 | 
					        conns.add(conn);
 | 
				
			||||||
 | 
					        conns.add(conn1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Site2SiteCustomerGatewayVO gw = new Site2SiteCustomerGatewayVO("Testing gateway", 1L, 1L, "192.168.50.15", "Guest List", "ipsecPsk", "ikePolicy", "espPolicy", 1L, 1L, true, true);
 | 
				
			||||||
 | 
					        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);
 | 
				
			||||||
 | 
					        hostVo.setManagementServerId(ManagementServerNode.getManagementServerId());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ArrayList<String> ipList = new ArrayList<>();
 | 
				
			||||||
 | 
					        ipList.add("192.168.50.15");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        _s2sConnCommand = new CheckS2SVpnConnectionsCommand(ipList);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        when(_s2sVpnMgr.getConnectionsForRouter(router)).thenReturn(conns);
 | 
				
			||||||
 | 
					        when(_s2sVpnConnectionDao.persist(conn)).thenReturn(null);
 | 
				
			||||||
 | 
					        when(_s2sCustomerGatewayDao.findById(conn.getCustomerGatewayId())).thenReturn(gw);
 | 
				
			||||||
 | 
					        when(_hostDao.findById(router.getHostId())).thenReturn(hostVo);
 | 
				
			||||||
 | 
					        when(_routerControlHelper.getRouterControlIp(router.getId())).thenReturn("192.168.50.15");
 | 
				
			||||||
 | 
					        doReturn(_s2sVpnAnswer).when(_agentMgr).easySend(anyLong(), any(CheckS2SVpnConnectionsCommand.class));
 | 
				
			||||||
 | 
					        when(_s2sVpnAnswer.getResult()).thenReturn(true);
 | 
				
			||||||
 | 
					        when(_s2sVpnConnectionDao.acquireInLockTable(conn.getId())).thenReturn(conn);
 | 
				
			||||||
 | 
					        when(_s2sVpnAnswer.isIPPresent("192.168.50.15")).thenReturn(true);
 | 
				
			||||||
 | 
					        when(_s2sVpnAnswer.isConnected("192.168.50.15")).thenReturn(true);
 | 
				
			||||||
 | 
					        doNothing().when(_alertMgr).sendAlert(any(AlertManager.AlertType.class), anyLong(), anyLong(), anyString(), anyString());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        virtualNetworkApplianceManagerImpl.updateSite2SiteVpnConnectionState(routers);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for(Site2SiteVpnConnection connection : conns){
 | 
				
			||||||
 | 
					            assertEquals(Site2SiteVpnConnection.State.Connected, connection.getState());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user