Skip to content

Commit 16f76c0

Browse files
committed
server: apply BGP peers for isolated networks with dynamic routed IPv6
1 parent 3b42fbf commit 16f76c0

File tree

10 files changed

+112
-39
lines changed

10 files changed

+112
-39
lines changed

api/src/main/java/org/apache/cloudstack/api/response/VpcResponse.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,10 @@ public class VpcResponse extends BaseResponseWithAnnotations implements Controll
165165
@Param(description = "The IPv4 routing mode of VPC", since = "4.20.0")
166166
private String ipv4Routing;
167167

168+
@SerializedName(ApiConstants.IPV6_ROUTING)
169+
@Param(description = "The Ipv6 routing type of VPC", since = "4.22.1")
170+
private String ipv6Routing;
171+
168172
@SerializedName(ApiConstants.IPV4_ROUTES)
169173
@Param(description = "The routes for the VPC to ease adding route in upstream router", since = "4.20.0")
170174
private Set<Ipv4RouteResponse> ipv4Routes;
@@ -312,6 +316,10 @@ public void addIpv4Route(Ipv4RouteResponse ipv4Route) {
312316
this.ipv4Routes.add(ipv4Route);
313317
}
314318

319+
public void setIpv6Routing(String ipv6Routing) {
320+
this.ipv6Routing = ipv6Routing;
321+
}
322+
315323
public void setIpv6Routes(Set<Ipv6RouteResponse> ipv6Routes) {
316324
this.ipv6Routes = ipv6Routes;
317325
}

server/src/main/java/com/cloud/api/ApiResponseHelper.java

Lines changed: 32 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2820,19 +2820,15 @@ public NetworkResponse createNetworkResponse(ResponseView view, Network network)
28202820
Ipv4RouteResponse route = new Ipv4RouteResponse(network.getCidr(), ip.getAddress().addr());
28212821
response.addIpv4Route(route);
28222822
}
2823-
2824-
if (view == ResponseView.Full) {
2825-
List<BgpPeerVO> bgpPeerVOS = bgpPeerDao.listNonRevokeByNetworkId(network.getId());
2826-
for (BgpPeerVO bgpPeerVO : bgpPeerVOS) {
2827-
BgpPeerResponse bgpPeerResponse = routedIpv4Manager.createBgpPeerResponse(bgpPeerVO);
2828-
response.addBgpPeer(bgpPeerResponse);
2829-
}
2830-
}
28312823
}
28322824

28332825
if (networkOfferingDao.isIpv6Supported(network.getNetworkOfferingId())) {
28342826
response.setInternetProtocol(networkOfferingDao.getNetworkOfferingInternetProtocol(network.getNetworkOfferingId(), NetUtils.InternetProtocol.IPv4).toString());
2835-
response.setIpv6Routing(Network.Routing.Static.toString());
2827+
if (networkOffering != null && networkOffering.getRoutingMode() != null) {
2828+
response.setIpv6Routing(networkOffering.getRoutingMode().name());
2829+
} else {
2830+
response.setIpv6Routing(Network.Routing.Static.toString());
2831+
}
28362832
response.setIpv6Routes(new LinkedHashSet<>());
28372833
if (Network.GuestType.Isolated.equals(networkOffering.getGuestType())) {
28382834
List<String> ipv6Addresses = ipv6Service.getPublicIpv6AddressesForNetwork(network);
@@ -2843,6 +2839,15 @@ public NetworkResponse createNetworkResponse(ResponseView view, Network network)
28432839
}
28442840
}
28452841

2842+
// Add BGP peer information for full view
2843+
if (view == ResponseView.Full) {
2844+
List<BgpPeerVO> bgpPeerVOS = bgpPeerDao.listNonRevokeByNetworkId(network.getId());
2845+
for (BgpPeerVO bgpPeerVO : bgpPeerVOS) {
2846+
BgpPeerResponse bgpPeerResponse = routedIpv4Manager.createBgpPeerResponse(bgpPeerVO);
2847+
response.addBgpPeer(bgpPeerResponse);
2848+
}
2849+
}
2850+
28462851
response.setObjectName("network");
28472852
return response;
28482853
}
@@ -3557,7 +3562,6 @@ public VpcResponse createVpcResponse(ResponseView view, Vpc vpc) {
35573562
response.setTags(tagResponses);
35583563
response.setHasAnnotation(annotationDao.hasAnnotations(vpc.getUuid(), AnnotationService.EntityType.VPC.name(),
35593564
_accountMgr.isRootAdmin(CallContext.current().getCallingAccount().getId())));
3560-
ipv6Service.updateIpv6RoutesForVpcResponse(vpc, response);
35613565
response.setDns1(vpc.getIp4Dns1());
35623566
response.setDns2(vpc.getIp4Dns2());
35633567
response.setIpv6Dns1(vpc.getIp6Dns1());
@@ -3578,12 +3582,24 @@ public VpcResponse createVpcResponse(ResponseView view, Vpc vpc) {
35783582
response.addIpv4Route(route);
35793583
}
35803584
}
3581-
if (view == ResponseView.Full) {
3582-
List<BgpPeerVO> bgpPeerVOS = bgpPeerDao.listNonRevokeByVpcId(vpc.getId());
3583-
for (BgpPeerVO bgpPeerVO : bgpPeerVOS) {
3584-
BgpPeerResponse bgpPeerResponse = routedIpv4Manager.createBgpPeerResponse(bgpPeerVO);
3585-
response.addBgpPeer(bgpPeerResponse);
3586-
}
3585+
}
3586+
3587+
// add IPv6 routes
3588+
ipv6Service.updateIpv6RoutesForVpcResponse(vpc, response);
3589+
if (CollectionUtils.isNotEmpty(response.getIpv6Routes())) {
3590+
if (Objects.nonNull(asNumberVO)) {
3591+
response.setIpv6Routing(Network.Routing.Dynamic.name());
3592+
} else {
3593+
response.setIpv6Routing(Network.Routing.Static.name());
3594+
}
3595+
}
3596+
3597+
// Add BGP peer information for full view
3598+
if (view == ResponseView.Full) {
3599+
List<BgpPeerVO> bgpPeerVOS = bgpPeerDao.listNonRevokeByVpcId(vpc.getId());
3600+
for (BgpPeerVO bgpPeerVO : bgpPeerVOS) {
3601+
BgpPeerResponse bgpPeerResponse = routedIpv4Manager.createBgpPeerResponse(bgpPeerVO);
3602+
response.addBgpPeer(bgpPeerResponse);
35873603
}
35883604
}
35893605

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

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import com.cloud.network.element.BgpServiceProvider;
3535
import com.cloud.network.element.NetworkElement;
3636
import com.cloud.network.vpc.Vpc;
37+
import com.cloud.network.vpc.VpcOffering;
3738
import com.cloud.network.vpc.VpcOfferingVO;
3839
import com.cloud.network.vpc.VpcVO;
3940
import com.cloud.network.vpc.dao.VpcDao;
@@ -396,9 +397,12 @@ public boolean applyBgpPeers(Network network, boolean continueOnError) throws Re
396397
if (!routedIpv4Manager.isDynamicRoutedNetwork(network)) {
397398
return true;
398399
}
399-
final String gatewayProviderStr = ntwkSrvcDao.getProviderForServiceInNetwork(network.getId(), Network.Service.Gateway);
400-
if (gatewayProviderStr != null) {
401-
NetworkElement provider = networkModel.getElementImplementingProvider(gatewayProviderStr);
400+
NetworkOffering networkOffering = networkOfferingDao.findById(network.getNetworkOfferingId());
401+
final String bgpServiceProvider = NetworkOffering.NetworkMode.ROUTED.equals(networkOffering.getNetworkMode()) ?
402+
ntwkSrvcDao.getProviderForServiceInNetwork(network.getId(), Network.Service.Gateway):
403+
ntwkSrvcDao.getProviderForServiceInNetwork(network.getId(), Network.Service.SourceNat);
404+
if (bgpServiceProvider != null) {
405+
NetworkElement provider = networkModel.getElementImplementingProvider(bgpServiceProvider);
402406
if (provider != null && provider instanceof BgpServiceProvider) {
403407
List<? extends BgpPeer> bgpPeers = getBgpPeersForNetwork(network);
404408
LOGGER.debug(String.format("Applying BPG Peers for network [%s]: [%s]", network, bgpPeers));
@@ -413,9 +417,12 @@ public boolean applyBgpPeers(Vpc vpc, boolean continueOnError) throws ResourceUn
413417
if (!routedIpv4Manager.isDynamicRoutedVpc(vpc)) {
414418
return true;
415419
}
416-
final String gatewayProviderStr = vpcServiceMapDao.getProviderForServiceInVpc(vpc.getId(), Network.Service.Gateway);
417-
if (gatewayProviderStr != null) {
418-
NetworkElement provider = networkModel.getElementImplementingProvider(gatewayProviderStr);
420+
VpcOffering vpcOffering = vpcOfferingDao.findById(vpc.getVpcOfferingId());
421+
final String bgpServiceProvider = NetworkOffering.NetworkMode.ROUTED.equals(vpcOffering.getNetworkMode()) ?
422+
vpcServiceMapDao.getProviderForServiceInVpc(vpc.getId(), Network.Service.Gateway):
423+
vpcServiceMapDao.getProviderForServiceInVpc(vpc.getId(), Network.Service.SourceNat);
424+
if (bgpServiceProvider != null) {
425+
NetworkElement provider = networkModel.getElementImplementingProvider(bgpServiceProvider);
419426
if (provider != null && provider instanceof BgpServiceProvider) {
420427
List<? extends BgpPeer> bgpPeers = getBgpPeersForVpc(vpc);
421428
LOGGER.debug(String.format("Applying BPG Peers for VPC [%s]: [%s]", vpc, bgpPeers));

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

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1470,11 +1470,21 @@ public void createBgpPeersCommands(final List<? extends BgpPeer> bgpPeers, final
14701470
for (BgpPeer bgpPeer: bgpPeers) {
14711471
Map<BgpPeer.Detail, String> bgpPeerDetails = bgpPeerDetailsDao.getBgpPeerDetails(bgpPeer.getId());
14721472
for (Network guestNetwork : guestNetworks) {
1473-
bgpPeerTOs.add(new BgpPeerTO(bgpPeer.getId(), bgpPeer.getIp4Address(), bgpPeer.getIp6Address(), bgpPeer.getAsNumber(), bgpPeer.getPassword(),
1474-
guestNetwork.getId(), asNumberVO.getAsNumber(), guestNetwork.getCidr(), guestNetwork.getIp6Cidr(), bgpPeerDetails));
1473+
final NetworkOfferingVO offering = _networkOfferingDao.findByIdIncludingRemoved(guestNetwork.getNetworkOfferingId());
1474+
if (NetworkOffering.NetworkMode.ROUTED.equals(offering.getNetworkMode())) {
1475+
bgpPeerTOs.add(new BgpPeerTO(bgpPeer.getId(), bgpPeer.getIp4Address(), bgpPeer.getIp6Address(), bgpPeer.getAsNumber(), bgpPeer.getPassword(),
1476+
guestNetwork.getId(), asNumberVO.getAsNumber(), guestNetwork.getCidr(), guestNetwork.getIp6Cidr(), bgpPeerDetails));
1477+
} else if (guestNetwork.getIp6Cidr() != null && bgpPeer.getIp6Address() != null) {
1478+
bgpPeerTOs.add(new BgpPeerTO(bgpPeer.getId(), null, bgpPeer.getIp6Address(), bgpPeer.getAsNumber(), bgpPeer.getPassword(),
1479+
guestNetwork.getId(), asNumberVO.getAsNumber(), guestNetwork.getCidr(), guestNetwork.getIp6Cidr(), bgpPeerDetails));
1480+
}
14751481
}
14761482
}
14771483

1484+
if (bgpPeerTOs.isEmpty()) {
1485+
logger.debug("No BGP peers to configure for the guest network or VPC, skipping.");
1486+
return;
1487+
}
14781488
final SetBgpPeersCommand cmd = new SetBgpPeersCommand(bgpPeerTOs);
14791489
cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, _routerControlHelper.getRouterControlIp(router.getId()));
14801490
cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName());

server/src/main/java/org/apache/cloudstack/network/RoutedIpv4ManagerImpl.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1013,8 +1013,9 @@ public boolean isDynamicRoutedNetwork(Network network) {
10131013

10141014
@Override
10151015
public boolean isDynamicRoutedNetwork(NetworkOffering networkOffering) {
1016-
return NetworkOffering.NetworkMode.ROUTED.equals(networkOffering.getNetworkMode())
1017-
&& NetworkOffering.RoutingMode.Dynamic.equals(networkOffering.getRoutingMode());
1016+
return NetworkOffering.RoutingMode.Dynamic.equals(networkOffering.getRoutingMode()) &&
1017+
(NetworkOffering.NetworkMode.ROUTED.equals(networkOffering.getNetworkMode()) ||
1018+
NetUtils.InternetProtocol.DualStack.equals(networkOfferingDao.getNetworkOfferingInternetProtocol(networkOffering.getId())));
10181019
}
10191020

10201021
@Override
@@ -1030,8 +1031,9 @@ public boolean isDynamicRoutedVpc(Vpc vpc) {
10301031

10311032
@Override
10321033
public boolean isDynamicRoutedVpc(VpcOffering vpcOffering) {
1033-
return NetworkOffering.NetworkMode.ROUTED.equals(vpcOffering.getNetworkMode())
1034-
&& NetworkOffering.RoutingMode.Dynamic.equals(vpcOffering.getRoutingMode());
1034+
return NetworkOffering.RoutingMode.Dynamic.equals(vpcOffering.getRoutingMode()) &&
1035+
(NetworkOffering.NetworkMode.ROUTED.equals(vpcOffering.getNetworkMode()) ||
1036+
NetUtils.InternetProtocol.DualStack.equals(vpcOfferingDao.getVpcOfferingInternetProtocol(vpcOffering.getId())));
10351037
}
10361038

10371039
@Override

server/src/test/java/com/cloud/bgp/BGPServiceImplTest.java

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,12 @@
2525
import com.cloud.network.element.VirtualRouterElement;
2626
import com.cloud.network.element.VpcVirtualRouterElement;
2727
import com.cloud.network.vpc.Vpc;
28+
import com.cloud.network.vpc.VpcOfferingVO;
29+
import com.cloud.network.vpc.dao.VpcOfferingDao;
2830
import com.cloud.network.vpc.dao.VpcServiceMapDao;
31+
import com.cloud.offering.NetworkOffering;
32+
import com.cloud.offerings.NetworkOfferingVO;
33+
import com.cloud.offerings.dao.NetworkOfferingDao;
2934
import com.cloud.user.AccountVO;
3035
import com.cloud.user.dao.AccountDao;
3136
import org.apache.cloudstack.network.BgpPeerVO;
@@ -46,6 +51,7 @@
4651
import java.util.List;
4752

4853
import static org.mockito.ArgumentMatchers.any;
54+
import static org.mockito.ArgumentMatchers.anyLong;
4955
import static org.mockito.ArgumentMatchers.eq;
5056
import static org.mockito.Mockito.doReturn;
5157
import static org.mockito.Mockito.verify;
@@ -76,6 +82,18 @@ public class BGPServiceImplTest {
7682
@Mock
7783
VpcServiceMapDao vpcServiceMapDao;
7884

85+
@Mock
86+
NetworkOfferingDao networkOfferingDao;
87+
88+
@Mock
89+
VpcOfferingDao vpcOfferingDao;
90+
91+
@Mock
92+
NetworkOfferingVO networkOffering;
93+
94+
@Mock
95+
VpcOfferingVO vpcOffering;
96+
7997
@Test
8098
public void testASNumbersOverlap() {
8199
Assert.assertEquals(bGPServiceImplSpy.isASNumbersOverlap(1,2,3,4), false);
@@ -94,6 +112,8 @@ public void testApplyBgpPeersForIsolatedNetwork() throws ResourceUnavailableExce
94112
when(network.getVpcId()).thenReturn(null);
95113

96114
when(routedIpv4Manager.isDynamicRoutedNetwork(network)).thenReturn(true);
115+
when(networkOfferingDao.findById(anyLong())).thenReturn(networkOffering);
116+
when(networkOffering.getNetworkMode()).thenReturn(NetworkOffering.NetworkMode.ROUTED);
97117
when(ntwkSrvcDao.getProviderForServiceInNetwork(networkId, Network.Service.Gateway)).thenReturn("VirtualRouter");
98118
VirtualRouterElement virtualRouterElement = Mockito.mock(VirtualRouterElement.class);
99119
when(networkModel.getElementImplementingProvider("VirtualRouter")).thenReturn(virtualRouterElement);
@@ -121,9 +141,11 @@ public void testApplyBgpPeersForVpcTier() throws ResourceUnavailableException {
121141
when(network.getDataCenterId()).thenReturn(zoneId);
122142

123143
when(routedIpv4Manager.isDynamicRoutedNetwork(network)).thenReturn(true);
124-
when(ntwkSrvcDao.getProviderForServiceInNetwork(networkId, Network.Service.Gateway)).thenReturn("VirtualRouter");
144+
when(networkOfferingDao.findById(anyLong())).thenReturn(networkOffering);
145+
when(networkOffering.getNetworkMode()).thenReturn(NetworkOffering.NetworkMode.ROUTED);
146+
when(ntwkSrvcDao.getProviderForServiceInNetwork(networkId, Network.Service.Gateway)).thenReturn("VPCVirtualRouter");
125147
VirtualRouterElement virtualRouterElement = Mockito.mock(VirtualRouterElement.class);
126-
when(networkModel.getElementImplementingProvider("VirtualRouter")).thenReturn(virtualRouterElement);
148+
when(networkModel.getElementImplementingProvider("VPCVirtualRouter")).thenReturn(virtualRouterElement);
127149

128150
when(bgpPeerDao.listNonRevokeByVpcId(vpcId)).thenReturn(new ArrayList<>());
129151

@@ -153,6 +175,8 @@ public void testApplyBgpPeersForVpcWithBgpPeers() throws ResourceUnavailableExce
153175
when(vpc.getZoneId()).thenReturn(zoneId);
154176

155177
when(routedIpv4Manager.isDynamicRoutedVpc(vpc)).thenReturn(true);
178+
when(vpcOfferingDao.findById(anyLong())).thenReturn(vpcOffering);
179+
when(vpcOffering.getNetworkMode()).thenReturn(NetworkOffering.NetworkMode.ROUTED);
156180
when(vpcServiceMapDao.getProviderForServiceInVpc(vpcId, Network.Service.Gateway)).thenReturn("VPCVirtualRouter");
157181
VpcVirtualRouterElement vpcVirtualRouterElement = Mockito.mock(VpcVirtualRouterElement.class);
158182
when(networkModel.getElementImplementingProvider("VPCVirtualRouter")).thenReturn(vpcVirtualRouterElement);

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@
6565
import java.util.List;
6666
import java.util.Map;
6767

68+
import static org.mockito.ArgumentMatchers.anyLong;
6869
import static org.mockito.Mockito.when;
6970

7071
@RunWith(MockitoJUnitRunner.class)
@@ -226,6 +227,10 @@ public void testCreateBgpPeersCommandsForNetwork() {
226227
when(dcDao.findById(zoneId)).thenReturn(dc);
227228
when(dc.getNetworkType()).thenReturn(DataCenter.NetworkType.Advanced);
228229

230+
NetworkOfferingVO offering = Mockito.mock(NetworkOfferingVO.class);
231+
when(networkOfferingDao.findByIdIncludingRemoved(anyLong())).thenReturn(offering);
232+
when(offering.getNetworkMode()).thenReturn(NetworkOffering.NetworkMode.ROUTED);
233+
229234
commandSetupHelper.createBgpPeersCommands(bgpPeers, router, cmds, network);
230235

231236
Assert.assertEquals(1, cmds.size());
@@ -254,6 +259,7 @@ public void testCreateBgpPeersCommandsForVpc() {
254259
NetworkOfferingVO offering = Mockito.mock(NetworkOfferingVO.class);
255260
when(networkOfferingDao.findByIdIncludingRemoved(networkOfferingId)).thenReturn(offering);
256261
when(offering.getRoutingMode()).thenReturn(NetworkOffering.RoutingMode.Dynamic);
262+
when(offering.getNetworkMode()).thenReturn(NetworkOffering.NetworkMode.ROUTED);
257263
NetworkVO network1 = Mockito.mock(NetworkVO.class);
258264
when(network1.getNetworkOfferingId()).thenReturn(networkOfferingId);
259265
NetworkVO network2 = Mockito.mock(NetworkVO.class);

ui/src/config/section/network.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ export default {
7171
}, {
7272
name: 'bgp.peers',
7373
component: shallowRef(defineAsyncComponent(() => import('@/views/infra/zone/BgpPeersTab.vue'))),
74-
show: (record, route, user) => { return !record.vpcid && ['Admin'].includes(user.roletype) && record.ip4routing === 'Dynamic' }
74+
show: (record, route, user) => { return !record.vpcid && ['Admin'].includes(user.roletype) && (record.ip4routing === 'Dynamic' || record.ip6routing === 'Dynamic') }
7575
}, {
7676
name: 'routing.firewall',
7777
component: shallowRef(defineAsyncComponent(() => import('@/views/network/RoutingFirewallRulesTab.vue'))),

ui/src/views/infra/zone/BgpPeersTab.vue

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,15 @@
1818
<template>
1919
<a-spin :spinning="componentLoading">
2020
<a-alert
21-
v-if="this.resource.ip4routing"
21+
v-if="this.resource.ip4routing || this.resource.ip6routing"
2222
type="info">
2323
<template #message>
2424
<div v-html="$t('message.bgp.peers.null')" />
2525
</template>
2626
</a-alert>
2727
<br>
2828
<a-button
29-
v-if="!this.resource.ip4routing"
29+
v-if="!(this.resource.ip4routing || this.resource.ip6routing)"
3030
:disabled="!('createBgpPeer' in $store.getters.apis)"
3131
type="primary"
3232
style="margin-bottom: 20px; width: 100%"
@@ -56,7 +56,7 @@
5656
<template v-if="column.key === 'project'">
5757
{{ record.project }}
5858
</template>
59-
<template v-if="column.key === 'actions' && !this.resource.ip4routing">
59+
<template v-if="column.key === 'actions' && !(this.resource.ip4routing || this.resource.ip6routing)">
6060
<div
6161
class="actions"
6262
style="text-align: right" >
@@ -103,7 +103,7 @@
103103
</template>
104104
</a-table>
105105
<a-pagination
106-
v-if="!this.resource.ip4routing"
106+
v-if="!(this.resource.ip4routing || this.resource.ip6routing)"
107107
class="row-element pagination"
108108
size="small"
109109
:current="bgpPeersPage"
@@ -318,7 +318,7 @@
318318

319319
<br>
320320
<a-button
321-
v-if="this.resource.ip4routing && this.$route.meta.name === 'guestnetwork'"
321+
v-if="(this.resource.ip4routing || this.resource.ip6routing) && this.$route.meta.name === 'guestnetwork'"
322322
type="primary"
323323
style="margin-bottom: 20px; width: 100%"
324324
@click="() => { changeBgpPeersForNetworkModal = true }"
@@ -327,7 +327,7 @@
327327
{{ $t('label.change.bgp.peers') }}
328328
</a-button>
329329
<a-button
330-
v-if="this.resource.ip4routing && this.$route.meta.name === 'vpc'"
330+
v-if="(this.resource.ip4routing || this.resource.ip6routing) && this.$route.meta.name === 'vpc'"
331331
type="primary"
332332
style="margin-bottom: 20px; width: 100%"
333333
@click="() => { changeBgpPeersForVpcModal = true }"
@@ -474,7 +474,7 @@ export default {
474474
})
475475
},
476476
fetchData () {
477-
if (this.resource.ip4routing) {
477+
if (this.resource.ip4routing || this.resource.ip6routing) {
478478
this.bgpPeers = this.resource.bgppeers
479479
} else {
480480
this.fetchZoneBgpPeer()

ui/src/views/network/VpcTab.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
<a-tab-pane :tab="$t('label.networks')" key="tier">
2929
<VpcTiersTab :resource="resource" :loading="loading" />
3030
</a-tab-pane>
31-
<a-tab-pane :tab="$t('label.bgp.peers')" key="bgppeers" v-if="resource.ip4routing === 'Dynamic'">
31+
<a-tab-pane :tab="$t('label.bgp.peers')" key="bgppeers" v-if="resource.ip4routing === 'Dynamic' || resource.ip6routing === 'Dynamic'">
3232
<BgpPeersTab :resource="resource" />
3333
</a-tab-pane>
3434
<a-tab-pane :tab="$t('label.public.ips')" key="ip" v-if="'listPublicIpAddresses' in $store.getters.apis">

0 commit comments

Comments
 (0)