server: apply BGP peers for isolated networks with dynamic routed IPv6#12811
server: apply BGP peers for isolated networks with dynamic routed IPv6#12811weizhouapache wants to merge 4 commits intoapache:4.22from
Conversation
|
@blueorangutan package |
There was a problem hiding this comment.
Pull request overview
Enables BGP peer configuration/visibility for isolated networks (and VPCs) when dynamic routing is used with IPv6 (including DualStack offerings), addressing #11584.
Changes:
- UI: show BGP Peers tab/actions when IPv4 or IPv6 routing is dynamic.
- Server: treat DualStack + Dynamic routing as eligible for dynamic routed checks, and apply BGP peers via the correct service provider (Gateway vs SourceNat).
- API/tests: enrich routing/BGP peer data in network/VPC responses and update unit tests for the new offering-mode logic.
Reviewed changes
Copilot reviewed 10 out of 10 changed files in this pull request and generated 9 comments.
Show a summary per file
| File | Description |
|---|---|
| ui/src/views/network/VpcTab.vue | Shows BGP peers tab when either IPv4 or IPv6 dynamic routing is enabled. |
| ui/src/views/infra/zone/BgpPeersTab.vue | Extends routing gating logic to consider IPv6 routing state. |
| ui/src/config/section/network.js | Shows BGP peers section for Admin when IPv4 or IPv6 routing is dynamic. |
| server/src/test/java/com/cloud/network/router/CommandSetupHelperTest.java | Updates mocks to include network mode for command creation paths. |
| server/src/test/java/com/cloud/bgp/BGPServiceImplTest.java | Updates mocks to include offering network mode and correct provider selection. |
| server/src/main/java/org/apache/cloudstack/network/RoutedIpv4ManagerImpl.java | Treats DualStack offerings with Dynamic routing as “dynamic routed”. |
| server/src/main/java/com/cloud/network/router/CommandSetupHelper.java | Filters BGP peer command payload per offering mode; supports IPv6-only peer config for non-routed offerings; skips empty command. |
| server/src/main/java/com/cloud/bgp/BGPServiceImpl.java | Chooses provider service (Gateway vs SourceNat) based on offering network mode for applying peers. |
| server/src/main/java/com/cloud/api/ApiResponseHelper.java | Adjusts routing fields and moves BGP peer population to full-view blocks for network/VPC responses. |
| api/src/main/java/org/apache/cloudstack/api/response/VpcResponse.java | Adds ipv6Routing field to VPC API response. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
server/src/main/java/com/cloud/network/router/CommandSetupHelper.java
Outdated
Show resolved
Hide resolved
api/src/main/java/org/apache/cloudstack/api/response/VpcResponse.java
Outdated
Show resolved
Hide resolved
server/src/test/java/com/cloud/network/router/CommandSetupHelperTest.java
Show resolved
Hide resolved
Codecov Report❌ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## 4.22 #12811 +/- ##
=========================================
Coverage 17.60% 17.61%
- Complexity 15660 15663 +3
=========================================
Files 5917 5917
Lines 531415 531447 +32
Branches 64973 64984 +11
=========================================
+ Hits 93566 93597 +31
+ Misses 427294 427289 -5
- Partials 10555 10561 +6
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
There was a problem hiding this comment.
Pull request overview
This PR addresses #11584 by extending dynamic routing (BGP) support so isolated (NATted) networks/VPCs with dynamic IPv6 (dual-stack) can expose/apply BGP peers similarly to routed IPv4 scenarios.
Changes:
- Update routed/dynamic detection to treat dual-stack offerings with
RoutingMode=Dynamicas dynamically routed (even whenNetworkMode != ROUTED). - Adjust BGP peer application logic (provider selection and command construction) to handle IPv6-only advertisements for non-ROUTED offerings.
- Expose/consume IPv6 routing mode and show BGP peers UI where IPv6 dynamic routing is enabled.
Reviewed changes
Copilot reviewed 12 out of 12 changed files in this pull request and generated 8 comments.
Show a summary per file
| File | Description |
|---|---|
| ui/src/views/network/VpcTab.vue | Show BGP peers tab when IPv4 or IPv6 routing is dynamic. |
| ui/src/views/infra/zone/BgpPeersTab.vue | Treat IPv6 routing as enabling “resource-level” BGP peers view/actions. |
| ui/src/config/section/network.js | Show BGP peers tab for guest networks when IPv4 or IPv6 routing is dynamic. |
| server/src/test/java/com/cloud/network/router/CommandSetupHelperTest.java | Update mocks to include offering network mode required by new branching logic. |
| server/src/test/java/com/cloud/bgp/BGPServiceImplTest.java | Add offering mocks and adjust expected provider selection for apply logic. |
| server/src/main/java/org/apache/cloudstack/network/RoutedIpv4ManagerImpl.java | Extend “dynamic routed” predicate to include dual-stack offerings. |
| server/src/main/java/com/cloud/network/router/CommandSetupHelper.java | Build BGP peer TOs with IPv6-only data for non-ROUTED offerings; skip command in some cases. |
| server/src/main/java/com/cloud/bgp/BGPServiceImpl.java | Select BGP service provider based on offering network mode (Gateway vs SourceNat). |
| server/src/main/java/com/cloud/api/ApiResponseHelper.java | Add IPv6 routing mode for networks/VPCs and adjust when BGP peers/routes are included in responses. |
| api/src/main/java/org/apache/cloudstack/api/response/VpcResponse.java | Add ip6routing field to VPC response. |
| api/src/main/java/org/apache/cloudstack/api/response/NetworkResponse.java | Wording tweak in API param descriptions (“type” → “mode”). |
| api/src/main/java/com/cloud/network/Network.java | Error message wording tweak (“type” → “mode”). |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| && NetworkOffering.RoutingMode.Dynamic.equals(networkOffering.getRoutingMode()); | ||
| return NetworkOffering.RoutingMode.Dynamic.equals(networkOffering.getRoutingMode()) && | ||
| (NetworkOffering.NetworkMode.ROUTED.equals(networkOffering.getNetworkMode()) || | ||
| NetUtils.InternetProtocol.DualStack.equals(networkOfferingDao.getNetworkOfferingInternetProtocol(networkOffering.getId()))); |
| return NetworkOffering.RoutingMode.Dynamic.equals(vpcOffering.getRoutingMode()) && | ||
| (NetworkOffering.NetworkMode.ROUTED.equals(vpcOffering.getNetworkMode()) || | ||
| NetUtils.InternetProtocol.DualStack.equals(vpcOfferingDao.getVpcOfferingInternetProtocol(vpcOffering.getId()))); |
| // 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); | ||
| } | ||
| } |
| if (Objects.nonNull(asNumberVO)) { | ||
| response.setIpv6Routing(Network.Routing.Dynamic.name()); | ||
| } else { | ||
| response.setIpv6Routing(Network.Routing.Static.name()); |
| logger.debug("No BGP peers to configure for the guest network or VPC, skipping."); | ||
| return; |
| 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)); | ||
| } else if (guestNetwork.getIp6Cidr() != null && bgpPeer.getIp6Address() != null) { | ||
| bgpPeerTOs.add(new BgpPeerTO(bgpPeer.getId(), null, bgpPeer.getIp6Address(), bgpPeer.getAsNumber(), bgpPeer.getPassword(), | ||
| guestNetwork.getId(), asNumberVO.getAsNumber(), null, guestNetwork.getIp6Cidr(), bgpPeerDetails)); |
| 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); |
| final String gatewayProviderStr = vpcServiceMapDao.getProviderForServiceInVpc(vpc.getId(), Network.Service.Gateway); | ||
| if (gatewayProviderStr != null) { | ||
| NetworkElement provider = networkModel.getElementImplementingProvider(gatewayProviderStr); | ||
| VpcOffering vpcOffering = vpcOfferingDao.findById(vpc.getVpcOfferingId()); |
Description
This PR fixes #11584
Types of changes
Feature/Enhancement Scale or Bug Severity
Feature/Enhancement Scale
Bug Severity
Screenshots (if appropriate):
How Has This Been Tested?
How did you try to break this feature and the system with this change?