Copilot commented on code in PR #12811:
URL: https://github.com/apache/cloudstack/pull/12811#discussion_r3200408054
##########
server/src/main/java/com/cloud/api/ApiResponseHelper.java:
##########
@@ -2859,6 +2855,15 @@ public NetworkResponse
createNetworkResponse(ResponseView view, Network network)
}
}
+ // Add BGP peer information for full view
+ if (view == ResponseView.Full) {
+ List<BgpPeerVO> bgpPeerVOS =
bgpPeerDao.listNonRevokeByNetworkId(network.getId());
+ for (BgpPeerVO bgpPeerVO : bgpPeerVOS) {
+ BgpPeerResponse bgpPeerResponse =
routedIpv4Manager.createBgpPeerResponse(bgpPeerVO);
+ response.addBgpPeer(bgpPeerResponse);
+ }
+ }
Review Comment:
`createNetworkResponse` now always queries and attaches BGP peers for
`ResponseView.Full` (`bgpPeerDao.listNonRevokeByNetworkId(...)`) regardless of
whether the network is using dynamic routing. This can introduce an N+1
query/performance regression for full network listings. Consider guarding this
block (e.g., only when the network/VPC has an ASN or when
`routedIpv4Manager.isDynamicRoutedNetwork(network)` is true) so the extra DB
lookup only happens when BGP peers are relevant.
##########
ui/src/views/infra/zone/BgpPeersTab.vue:
##########
@@ -456,6 +456,9 @@ export default {
asnumber: [{ required: true, message: this.$t('label.required') }]
})
},
+ isIpRoutingEnabled () {
+ return !!(this.resource && (this.resource.ip4routing ||
this.resource.ip6routing))
Review Comment:
`isIpRoutingEnabled()` currently treats any truthy `ip4routing`/`ip6routing`
value as “enabled”. Since these fields are typically strings like
"Static"/"Dynamic", this will return true even for static routing, causing the
component to hide the zone-level BGP peer list/actions and instead read
`resource.bgppeers` (often undefined). Consider checking explicitly for dynamic
routing (e.g., `ip4routing === 'Dynamic' || ip6routing === 'Dynamic'`) to match
other UI gating and the intended behavior.
##########
server/src/main/java/com/cloud/bgp/BGPServiceImpl.java:
##########
@@ -396,9 +397,12 @@ public boolean applyBgpPeers(Network network, boolean
continueOnError) throws Re
if (!routedIpv4Manager.isDynamicRoutedNetwork(network)) {
return true;
}
- final String gatewayProviderStr =
ntwkSrvcDao.getProviderForServiceInNetwork(network.getId(),
Network.Service.Gateway);
- if (gatewayProviderStr != null) {
- NetworkElement provider =
networkModel.getElementImplementingProvider(gatewayProviderStr);
+ NetworkOffering networkOffering =
networkOfferingDao.findById(network.getNetworkOfferingId());
+ final String bgpServiceProvider =
NetworkOffering.NetworkMode.ROUTED.equals(networkOffering.getNetworkMode()) ?
+ ntwkSrvcDao.getProviderForServiceInNetwork(network.getId(),
Network.Service.Gateway):
+ ntwkSrvcDao.getProviderForServiceInNetwork(network.getId(),
Network.Service.SourceNat);
Review Comment:
`applyBgpPeers(Network, ...)` dereferences
`networkOffering.getNetworkMode()` without handling the case where
`networkOfferingDao.findById(...)` returns null (e.g., offering removed). This
can lead to a NullPointerException. Consider null-checking the offering (and/or
using `findByIdIncludingRemoved`) before selecting the provider service
(Gateway vs SourceNat).
##########
server/src/main/java/com/cloud/bgp/BGPServiceImpl.java:
##########
@@ -413,9 +417,12 @@ public boolean applyBgpPeers(Vpc vpc, boolean
continueOnError) throws ResourceUn
if (!routedIpv4Manager.isDynamicRoutedVpc(vpc)) {
return true;
}
- final String gatewayProviderStr =
vpcServiceMapDao.getProviderForServiceInVpc(vpc.getId(),
Network.Service.Gateway);
- if (gatewayProviderStr != null) {
- NetworkElement provider =
networkModel.getElementImplementingProvider(gatewayProviderStr);
+ VpcOffering vpcOffering =
vpcOfferingDao.findById(vpc.getVpcOfferingId());
Review Comment:
`applyBgpPeers(Vpc, ...)` dereferences `vpcOffering.getNetworkMode()`
without handling the case where `vpcOfferingDao.findById(...)` returns null
(e.g., offering removed). This can lead to a NullPointerException. Consider
null-checking the offering (and/or using `findByIdIncludingRemoved`) before
selecting the provider service (Gateway vs SourceNat).
##########
server/src/main/java/com/cloud/network/router/CommandSetupHelper.java:
##########
@@ -1468,14 +1468,29 @@ public void createBgpPeersCommands(final List<? extends
BgpPeer> bgpPeers, final
} else {
guestNetworks.add(network);
}
+ Map<Long, NetworkOfferingVO> guestNetworkOfferings = new HashMap<>();
+ for (Network guestNetwork : guestNetworks) {
+ final NetworkOfferingVO offering =
_networkOfferingDao.findByIdIncludingRemoved(guestNetwork.getNetworkOfferingId());
+ guestNetworkOfferings.put(guestNetwork.getId(), offering);
+ }
for (BgpPeer bgpPeer: bgpPeers) {
Map<BgpPeer.Detail, String> bgpPeerDetails =
bgpPeerDetailsDao.getBgpPeerDetails(bgpPeer.getId());
for (Network guestNetwork : guestNetworks) {
- bgpPeerTOs.add(new BgpPeerTO(bgpPeer.getId(),
bgpPeer.getIp4Address(), bgpPeer.getIp6Address(), bgpPeer.getAsNumber(),
bgpPeer.getPassword(),
- guestNetwork.getId(), asNumberVO.getAsNumber(),
guestNetwork.getCidr(), guestNetwork.getIp6Cidr(), bgpPeerDetails));
+ final NetworkOfferingVO offering =
guestNetworkOfferings.get(guestNetwork.getId());
+ if
(NetworkOffering.NetworkMode.ROUTED.equals(offering.getNetworkMode())) {
+ bgpPeerTOs.add(new BgpPeerTO(bgpPeer.getId(),
bgpPeer.getIp4Address(), bgpPeer.getIp6Address(), bgpPeer.getAsNumber(),
bgpPeer.getPassword(),
+ guestNetwork.getId(), asNumberVO.getAsNumber(),
guestNetwork.getCidr(), guestNetwork.getIp6Cidr(), bgpPeerDetails));
Review Comment:
`guestNetworkOfferings` may contain null values if
`_networkOfferingDao.findByIdIncludingRemoved(...)` returns null; the later
`offering.getNetworkMode()` dereference would then throw an NPE. Consider
skipping networks with missing offerings (or logging) and guarding the
`getNetworkMode()` call to avoid breaking BGP peer configuration for the whole
router due to one missing offering record.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]