Skip to content

server: apply BGP peers for isolated networks with dynamic routed IPv6#12811

Draft
weizhouapache wants to merge 4 commits intoapache:4.22from
weizhouapache:4.22-isolated-network-dynamic-routing-ipv6
Draft

server: apply BGP peers for isolated networks with dynamic routed IPv6#12811
weizhouapache wants to merge 4 commits intoapache:4.22from
weizhouapache:4.22-isolated-network-dynamic-routing-ipv6

Conversation

@weizhouapache
Copy link
Member

Description

This PR fixes #11584

Types of changes

  • Breaking change (fix or feature that would cause existing functionality to change)
  • New feature (non-breaking change which adds functionality)
  • Bug fix (non-breaking change which fixes an issue)
  • Enhancement (improves an existing feature and functionality)
  • Cleanup (Code refactoring and cleanup, that may add test cases)
  • Build/CI
  • Test (unit or integration test code)

Feature/Enhancement Scale or Bug Severity

Feature/Enhancement Scale

  • Major
  • Minor

Bug Severity

  • BLOCKER
  • Critical
  • Major
  • Minor
  • Trivial

Screenshots (if appropriate):

How Has This Been Tested?

How did you try to break this feature and the system with this change?

@weizhouapache
Copy link
Member Author

@blueorangutan package

@weizhouapache weizhouapache requested a review from Copilot March 13, 2026 09:03
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

@codecov
Copy link

codecov bot commented Mar 13, 2026

Codecov Report

❌ Patch coverage is 31.57895% with 39 lines in your changes missing coverage. Please review.
✅ Project coverage is 17.61%. Comparing base (3b42fbf) to head (632b038).

Files with missing lines Patch % Lines
...src/main/java/com/cloud/api/ApiResponseHelper.java 0.00% 20 Missing ⚠️
...a/com/cloud/network/router/CommandSetupHelper.java 53.33% 5 Missing and 2 partials ⚠️
...er/src/main/java/com/cloud/bgp/BGPServiceImpl.java 66.66% 0 Missing and 4 partials ⚠️
...ache/cloudstack/network/RoutedIpv4ManagerImpl.java 33.33% 2 Missing and 2 partials ⚠️
...rg/apache/cloudstack/api/response/VpcResponse.java 0.00% 3 Missing ⚠️
api/src/main/java/com/cloud/network/Network.java 0.00% 1 Missing ⚠️
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     
Flag Coverage Δ
uitests 3.70% <ø> (-0.01%) ⬇️
unittests 18.68% <31.57%> (+<0.01%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

weizhouapache and others added 3 commits March 13, 2026 11:21
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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=Dynamic as dynamically routed (even when NetworkMode != 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())));
Comment on lines +1034 to +1036
return NetworkOffering.RoutingMode.Dynamic.equals(vpcOffering.getRoutingMode()) &&
(NetworkOffering.NetworkMode.ROUTED.equals(vpcOffering.getNetworkMode()) ||
NetUtils.InternetProtocol.DualStack.equals(vpcOfferingDao.getVpcOfferingInternetProtocol(vpcOffering.getId())));
Comment on lines +2842 to +2849
// 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);
}
}
Comment on lines +3589 to +3592
if (Objects.nonNull(asNumberVO)) {
response.setIpv6Routing(Network.Routing.Dynamic.name());
} else {
response.setIpv6Routing(Network.Routing.Static.name());
Comment on lines +1490 to +1491
logger.debug("No BGP peers to configure for the guest network or VPC, skipping.");
return;
Comment on lines +1471 to +1484
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));
Comment on lines +400 to +403
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());
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

NATTED mode should support dynamic routing (BGP) to advertise public ipv4/32 addresses and ipv6 subnets

2 participants