Skip to content

Commit 53b61cd

Browse files
committed
Routed: apply available BGP peers when VR is restarted
1 parent a5a7c5a commit 53b61cd

File tree

4 files changed

+51
-36
lines changed

4 files changed

+51
-36
lines changed

api/src/main/java/com/cloud/bgp/BGPService.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import com.cloud.network.vpc.Vpc;
2222
import com.cloud.utils.Pair;
2323
import org.apache.cloudstack.api.command.user.bgp.ListASNumbersCmd;
24+
import org.apache.cloudstack.network.BgpPeer;
2425

2526
import java.util.List;
2627

@@ -36,4 +37,8 @@ public interface BGPService {
3637
boolean applyBgpPeers(Network network, boolean continueOnError) throws ResourceUnavailableException;
3738

3839
boolean applyBgpPeers(Vpc vpc, boolean continueOnError) throws ResourceUnavailableException;
40+
41+
List<? extends BgpPeer> getBgpPeersForNetwork(Network network);
42+
43+
List<? extends BgpPeer> getBgpPeersForVpc(Vpc vpc);
3944
}

server/src/main/java/com/cloud/bgp/BGPServiceImpl.java

Lines changed: 34 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
import com.cloud.utils.exception.CloudRuntimeException;
5656
import org.apache.cloudstack.api.command.user.bgp.ListASNumbersCmd;
5757
import org.apache.cloudstack.context.CallContext;
58+
import org.apache.cloudstack.network.BgpPeer;
5859
import org.apache.cloudstack.network.BgpPeerVO;
5960
import org.apache.cloudstack.network.RoutedIpv4Manager;
6061
import org.apache.cloudstack.network.dao.BgpPeerDao;
@@ -395,19 +396,7 @@ public boolean applyBgpPeers(Network network, boolean continueOnError) throws Re
395396
if (gatewayProviderStr != null) {
396397
NetworkElement provider = networkModel.getElementImplementingProvider(gatewayProviderStr);
397398
if (provider != null && provider instanceof BgpServiceProvider) {
398-
List<BgpPeerVO> bgpPeers;
399-
if (network.getVpcId() != null) {
400-
bgpPeers = bgpPeerDao.listNonRevokeByVpcId(network.getVpcId());
401-
} else {
402-
bgpPeers = bgpPeerDao.listNonRevokeByNetworkId(network.getId());
403-
}
404-
if (CollectionUtils.isEmpty(bgpPeers)) {
405-
Account owner = accountDao.findByIdIncludingRemoved(network.getAccountId());
406-
List<Long> bgpPeerIds = routedIpv4Manager.getBgpPeerIdsForAccount(owner, network.getDataCenterId());
407-
bgpPeers = bgpPeerIds.stream()
408-
.map(bgpPeerId -> bgpPeerDao.findById(bgpPeerId))
409-
.collect(Collectors.toList());
410-
}
399+
List<? extends BgpPeer> bgpPeers = getBgpPeersForNetwork(network);
411400
LOGGER.debug(String.format("Applying BPG Peers for network [%s]: [%s]", network, bgpPeers));
412401
return ((BgpServiceProvider) provider).applyBgpPeers(null, network, bgpPeers);
413402
}
@@ -424,19 +413,43 @@ public boolean applyBgpPeers(Vpc vpc, boolean continueOnError) throws ResourceUn
424413
if (gatewayProviderStr != null) {
425414
NetworkElement provider = networkModel.getElementImplementingProvider(gatewayProviderStr);
426415
if (provider != null && provider instanceof BgpServiceProvider) {
427-
List<BgpPeerVO> bgpPeers = bgpPeerDao.listNonRevokeByVpcId(vpc.getId());
428-
if (CollectionUtils.isEmpty(bgpPeers)) {
429-
Account owner = accountDao.findByIdIncludingRemoved(vpc.getAccountId());
430-
List<Long> bgpPeerIds = routedIpv4Manager.getBgpPeerIdsForAccount(owner, vpc.getZoneId());
431-
bgpPeers = bgpPeerIds.stream()
432-
.map(bgpPeerId -> bgpPeerDao.findById(bgpPeerId))
433-
.collect(Collectors.toList());
434-
}
416+
List<? extends BgpPeer> bgpPeers = getBgpPeersForVpc(vpc);
435417
LOGGER.debug(String.format("Applying BPG Peers for VPC [%s]: [%s]", vpc, bgpPeers));
436418
return ((BgpServiceProvider) provider).applyBgpPeers(vpc, null, bgpPeers);
437419

438420
}
439421
}
440422
return true;
441423
}
424+
425+
@Override
426+
public List<? extends BgpPeer> getBgpPeersForNetwork(Network network) {
427+
List<BgpPeerVO> bgpPeers;
428+
if (network.getVpcId() != null) {
429+
bgpPeers = bgpPeerDao.listNonRevokeByVpcId(network.getVpcId());
430+
} else {
431+
bgpPeers = bgpPeerDao.listNonRevokeByNetworkId(network.getId());
432+
}
433+
if (CollectionUtils.isEmpty(bgpPeers)) {
434+
Account owner = accountDao.findByIdIncludingRemoved(network.getAccountId());
435+
List<Long> bgpPeerIds = routedIpv4Manager.getBgpPeerIdsForAccount(owner, network.getDataCenterId());
436+
bgpPeers = bgpPeerIds.stream()
437+
.map(bgpPeerId -> bgpPeerDao.findById(bgpPeerId))
438+
.collect(Collectors.toList());
439+
}
440+
return bgpPeers;
441+
}
442+
443+
@Override
444+
public List<? extends BgpPeer> getBgpPeersForVpc(Vpc vpc) {
445+
List<BgpPeerVO> bgpPeers = bgpPeerDao.listNonRevokeByVpcId(vpc.getId());
446+
if (CollectionUtils.isEmpty(bgpPeers)) {
447+
Account owner = accountDao.findByIdIncludingRemoved(vpc.getAccountId());
448+
List<Long> bgpPeerIds = routedIpv4Manager.getBgpPeerIdsForAccount(owner, vpc.getZoneId());
449+
bgpPeers = bgpPeerIds.stream()
450+
.map(bgpPeerId -> bgpPeerDao.findById(bgpPeerId))
451+
.collect(Collectors.toList());
452+
}
453+
return bgpPeers;
454+
}
442455
}

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

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -65,10 +65,8 @@
6565
import org.apache.cloudstack.lb.ApplicationLoadBalancerRuleVO;
6666
import org.apache.cloudstack.lb.dao.ApplicationLoadBalancerRuleDao;
6767
import org.apache.cloudstack.managed.context.ManagedContextRunnable;
68-
import org.apache.cloudstack.network.BgpPeerVO;
68+
import org.apache.cloudstack.network.BgpPeer;
6969
import org.apache.cloudstack.network.RoutedIpv4Manager;
70-
import org.apache.cloudstack.network.dao.BgpPeerDao;
71-
import org.apache.cloudstack.network.dao.BgpPeerNetworkMapDao;
7270
import org.apache.cloudstack.network.topology.NetworkTopology;
7371
import org.apache.cloudstack.network.topology.NetworkTopologyContext;
7472
import org.apache.cloudstack.utils.CloudStackVersion;
@@ -114,6 +112,7 @@
114112
import com.cloud.api.query.dao.UserVmJoinDao;
115113
import com.cloud.api.query.vo.DomainRouterJoinVO;
116114
import com.cloud.api.query.vo.UserVmJoinVO;
115+
import com.cloud.bgp.BGPService;
117116
import com.cloud.cluster.ManagementServerHostVO;
118117
import com.cloud.cluster.dao.ManagementServerHostDao;
119118
import com.cloud.configuration.Config;
@@ -348,9 +347,7 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
348347
@Inject
349348
RoutedIpv4Manager routedIpv4Manager;
350349
@Inject
351-
BgpPeerDao bgpPeerDao;
352-
@Inject
353-
BgpPeerNetworkMapDao bgpPeerNetworkMapDao;
350+
BGPService bgpService;
354351

355352
private int _routerRamSize;
356353
private int _routerCpuMHz;
@@ -2508,12 +2505,12 @@ protected void finalizeNetworkRulesForNetwork(final Commands cmds, final DomainR
25082505
if (guestNetwork.getVpcId() != null) {
25092506
final Vpc vpc = _vpcDao.findById(guestNetwork.getVpcId());
25102507
if (routedIpv4Manager.isDynamicRoutedVpc(vpc)) {
2511-
final List<BgpPeerVO> bgpPeers = bgpPeerDao.listNonRevokeByVpcId(guestNetwork.getVpcId());
2508+
List<? extends BgpPeer> bgpPeers = bgpService.getBgpPeersForVpc(vpc);
25122509
_commandSetupHelper.createBgpPeersCommands(bgpPeers, router, cmds, guestNetwork);
25132510
}
25142511
} else {
25152512
if (routedIpv4Manager.isDynamicRoutedNetwork(guestNetwork)) {
2516-
final List<BgpPeerVO> bgpPeers = bgpPeerDao.listNonRevokeByNetworkId(guestNetworkId);
2513+
List<? extends BgpPeer> bgpPeers = bgpService.getBgpPeersForNetwork(guestNetwork);
25172514
_commandSetupHelper.createBgpPeersCommands(bgpPeers, router, cmds, guestNetwork);
25182515
}
25192516
}

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

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import com.cloud.agent.api.Command;
2323
import com.cloud.agent.manager.Commands;
2424
import com.cloud.alert.AlertManager;
25+
import com.cloud.bgp.BGPService;
2526
import com.cloud.cluster.dao.ManagementServerHostDao;
2627
import com.cloud.dc.dao.ClusterDao;
2728
import com.cloud.dc.dao.DataCenterDao;
@@ -76,9 +77,8 @@
7677
import com.cloud.vm.dao.UserVmDetailsDao;
7778
import com.cloud.vm.dao.VMInstanceDao;
7879
import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
79-
import org.apache.cloudstack.network.BgpPeerVO;
80+
import org.apache.cloudstack.network.BgpPeer;
8081
import org.apache.cloudstack.network.RoutedIpv4Manager;
81-
import org.apache.cloudstack.network.dao.BgpPeerDao;
8282
import org.apache.cloudstack.utils.identity.ManagementServerNode;
8383
import org.junit.Assert;
8484
import org.junit.Test;
@@ -257,7 +257,7 @@ public class VirtualNetworkApplianceManagerImplTest {
257257
private VpcDao _vpcDao;
258258

259259
@Mock
260-
private BgpPeerDao bgpPeerDao;
260+
private BGPService bgpService;
261261

262262
// @InjectMocks
263263
// private VirtualNetworkApplianceManagerImpl virtualNetworkApplianceManagerImpl;
@@ -364,8 +364,8 @@ public void testFinalizeNetworkRulesForNetwork() {
364364
when(_networkDao.findById(guestNetworkId)).thenReturn(network);
365365
when(network.getVpcId()).thenReturn(null);
366366
when(routedIpv4Manager.isDynamicRoutedNetwork(network)).thenReturn(true);
367-
List<BgpPeerVO> bgpPeers = Mockito.mock(List.class);
368-
when(bgpPeerDao.listNonRevokeByNetworkId(guestNetworkId)).thenReturn(bgpPeers);
367+
List<? extends BgpPeer> bgpPeers = Mockito.mock(List.class);
368+
doReturn(bgpPeers).when(bgpService).getBgpPeersForNetwork(network);
369369
virtualNetworkApplianceManagerImpl.finalizeNetworkRulesForNetwork(cmds, router, Network.Provider.VirtualRouter, guestNetworkId);
370370

371371
Mockito.verify(_commandSetupHelper).createBgpPeersCommands(bgpPeers, router, cmds, network);
@@ -384,8 +384,8 @@ public void testFinalizeNetworkRulesForVpcNetwork() {
384384
VpcVO vpc = Mockito.mock(VpcVO.class);
385385
when(_vpcDao.findById(vpcId)).thenReturn(vpc);
386386
when(routedIpv4Manager.isDynamicRoutedVpc(vpc)).thenReturn(true);
387-
List<BgpPeerVO> bgpPeers = Mockito.mock(List.class);
388-
when(bgpPeerDao.listNonRevokeByVpcId(vpcId)).thenReturn(bgpPeers);
387+
List<? extends BgpPeer> bgpPeers = Mockito.mock(List.class);
388+
doReturn(bgpPeers).when(bgpService).getBgpPeersForVpc(vpc);
389389

390390
virtualNetworkApplianceManagerImpl.finalizeNetworkRulesForNetwork(cmds, router, Network.Provider.VirtualRouter, guestNetworkId);
391391

0 commit comments

Comments
 (0)