Visitar URL original
IPv6: One network can have more than one vlan · gitqueue/cloudstack@06acd9f · GitHub
Skip to content

Commit 06acd9f

Browse files
author
Sheng Yang
committed
IPv6: One network can have more than one vlan
1 parent 3d1989c commit 06acd9f

8 files changed

Lines changed: 67 additions & 43 deletions

File tree

‎api/src/com/cloud/network/NetworkModel.java‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,7 @@ Map<PublicIpAddress, Set<Service>> getIpToServices(List<? extends PublicIpAddres
249249

250250
boolean isNetworkInlineMode(Network network);
251251

252-
Vlan getVlanForNetwork(long networkId);
252+
boolean isIP6AddressAvailableInNetwork(long networkId);
253253

254-
boolean isIP6AddressAvailable(long networkId);
254+
boolean isIP6AddressAvailableInVlan(long vlanId);
255255
}

‎server/src/com/cloud/network/Ipv6AddressManagerImpl.java‎

Lines changed: 33 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
package com.cloud.network;
1919

20+
import java.util.List;
2021
import java.util.Map;
2122

2223
import javax.ejb.Local;
@@ -30,6 +31,7 @@
3031
import com.cloud.dc.DataCenter;
3132
import com.cloud.dc.DataCenterVO;
3233
import com.cloud.dc.Vlan;
34+
import com.cloud.dc.VlanVO;
3335
import com.cloud.dc.dao.DataCenterDao;
3436
import com.cloud.dc.dao.VlanDao;
3537
import com.cloud.exception.InsufficientAddressCapacityException;
@@ -76,33 +78,48 @@ public UserIpv6Address assignDirectIp6Address(long dcId, Account owner, Long net
7678
if (network == null) {
7779
return null;
7880
}
79-
Vlan vlan = _networkModel.getVlanForNetwork(networkId);
80-
if (vlan == null) {
81+
List<VlanVO> vlans = _vlanDao.listVlansByNetworkId(networkId);
82+
if (vlans == null) {
8183
s_logger.debug("Cannot find related vlan or too many vlan attached to network " + networkId);
8284
return null;
8385
}
8486
String ip = null;
87+
Vlan ipVlan = null;
8588
if (requestedIp6 == null) {
86-
if (!_networkModel.isIP6AddressAvailable(networkId)) {
89+
if (!_networkModel.isIP6AddressAvailableInNetwork(networkId)) {
8790
throw new InsufficientAddressCapacityException("There is no more address available in the network " + network.getName(), DataCenter.class, network.getDataCenterId());
8891
}
89-
ip = NetUtils.getIp6FromRange(vlan.getIp6Range());
90-
int count = 0;
91-
while (_ipv6Dao.findByNetworkIdAndIp(networkId, ip) != null) {
92-
ip = NetUtils.getNextIp6InRange(ip, vlan.getIp6Range());
93-
count ++;
94-
// It's an arbitrate number to prevent the infinite loop
95-
if (count > _ipv6RetryMax) {
96-
ip = null;
97-
break;
92+
for (Vlan vlan : vlans) {
93+
if (!_networkModel.isIP6AddressAvailableInVlan(vlan.getId())) {
94+
continue;
95+
}
96+
ip = NetUtils.getIp6FromRange(vlan.getIp6Range());
97+
int count = 0;
98+
while (_ipv6Dao.findByNetworkIdAndIp(networkId, ip) != null) {
99+
ip = NetUtils.getNextIp6InRange(ip, vlan.getIp6Range());
100+
count ++;
101+
// It's an arbitrate number to prevent the infinite loop
102+
if (count > _ipv6RetryMax) {
103+
ip = null;
104+
break;
105+
}
106+
}
107+
if (ip != null) {
108+
ipVlan = vlan;
98109
}
99110
}
100111
if (ip == null) {
101112
throw new InsufficientAddressCapacityException("Cannot find a usable IP in the network " + network.getName() + " after network.ipv6.search.retry.max = " + _ipv6RetryMax + " times retry!",
102113
DataCenter.class, network.getDataCenterId());
103114
}
104115
} else {
105-
if (!NetUtils.isIp6InRange(requestedIp6, vlan.getIp6Range())) {
116+
for (Vlan vlan : vlans) {
117+
if (NetUtils.isIp6InRange(requestedIp6, vlan.getIp6Range())) {
118+
ipVlan = vlan;
119+
break;
120+
}
121+
}
122+
if (ipVlan == null) {
106123
throw new CloudRuntimeException("Requested IPv6 is not in the predefined range!");
107124
}
108125
ip = requestedIp6;
@@ -117,9 +134,9 @@ public UserIpv6Address assignDirectIp6Address(long dcId, Account owner, Long net
117134
_dcDao.update(dc.getId(), dc);
118135

119136
String macAddress = NetUtils.long2Mac(NetUtils.createSequenceBasedMacAddress(mac));
120-
UserIpv6AddressVO ipVO = new UserIpv6AddressVO(ip, dcId, macAddress, vlan.getId());
121-
ipVO.setPhysicalNetworkId(vlan.getPhysicalNetworkId());
122-
ipVO.setSourceNetworkId(vlan.getNetworkId());
137+
UserIpv6AddressVO ipVO = new UserIpv6AddressVO(ip, dcId, macAddress, ipVlan.getId());
138+
ipVO.setPhysicalNetworkId(network.getPhysicalNetworkId());
139+
ipVO.setSourceNetworkId(networkId);
123140
ipVO.setState(UserIpv6Address.State.Allocated);
124141
ipVO.setDomainId(owner.getDomainId());
125142
ipVO.setAccountId(owner.getAccountId());

‎server/src/com/cloud/network/NetworkManagerImpl.java‎

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3405,11 +3405,7 @@ public void allocateDirectIp(NicProfile nic, DataCenter dc, VirtualMachineProfil
34053405
if (nic.getIp6Address() == null) {
34063406
ipv6 = true;
34073407
UserIpv6Address ip = _ipv6Mgr.assignDirectIp6Address(dc.getId(), vm.getOwner(), network.getId(), requestedIpv6);
3408-
Vlan vlan = _networkModel.getVlanForNetwork(network.getId());
3409-
if (vlan == null) {
3410-
s_logger.debug("Cannot find related vlan or too many vlan attached to network " + network.getId());
3411-
return;
3412-
}
3408+
Vlan vlan = _vlanDao.findById(ip.getVlanId());
34133409
nic.setIp6Address(ip.getAddress().toString());
34143410
nic.setIp6Gateway(vlan.getIp6Gateway());
34153411
nic.setIp6Cidr(vlan.getIp6Cidr());

‎server/src/com/cloud/network/NetworkModelImpl.java‎

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -527,7 +527,7 @@ public boolean canUseForDeploy(Network network) {
527527
return false;
528528
}
529529
if (network.getIp6Gateway() != null) {
530-
hasFreeIps = isIP6AddressAvailable(network.getId());
530+
hasFreeIps = isIP6AddressAvailableInNetwork(network.getId());
531531
}
532532
} else {
533533
hasFreeIps = (getAvailableIps(network, null)).size() > 0;
@@ -537,26 +537,27 @@ public boolean canUseForDeploy(Network network) {
537537
}
538538

539539
@Override
540-
public Vlan getVlanForNetwork(long networkId) {
541-
List<VlanVO> vlans = _vlanDao.listVlansByNetworkId(networkId);
542-
if (vlans == null || vlans.size() > 1) {
543-
s_logger.debug("Cannot find related vlan or too many vlan attached to network " + networkId);
544-
return null;
545-
}
546-
return vlans.get(0);
547-
}
548-
549-
@Override
550-
public boolean isIP6AddressAvailable(long networkId) {
540+
public boolean isIP6AddressAvailableInNetwork(long networkId) {
551541
Network network = _networksDao.findById(networkId);
552542
if (network == null) {
553543
return false;
554544
}
555545
if (network.getIp6Gateway() == null) {
556546
return false;
557547
}
558-
Vlan vlan = getVlanForNetwork(network.getId());
559-
long existedCount = _ipv6Dao.countExistedIpsInNetwork(network.getId());
548+
List<VlanVO> vlans = _vlanDao.listVlansByNetworkId(networkId);
549+
for (Vlan vlan : vlans) {
550+
if (isIP6AddressAvailableInVlan(vlan.getId())) {
551+
return true;
552+
}
553+
}
554+
return false;
555+
}
556+
557+
@Override
558+
public boolean isIP6AddressAvailableInVlan(long vlanId) {
559+
VlanVO vlan = _vlanDao.findById(vlanId);
560+
long existedCount = _ipv6Dao.countExistedIpsInVlan(vlanId);
560561
BigInteger existedInt = BigInteger.valueOf(existedCount);
561562
BigInteger rangeInt = NetUtils.countIp6InRange(vlan.getIp6Range());
562563
return (existedInt.compareTo(rangeInt) < 0);

‎server/src/com/cloud/network/dao/UserIpv6AddressDao.java‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,4 +36,6 @@ public interface UserIpv6AddressDao extends GenericDao<UserIpv6AddressVO, Long>
3636
List<UserIpv6AddressVO> listByPhysicalNetworkId(long physicalNetworkId);
3737

3838
long countExistedIpsInNetwork(long networkId);
39+
40+
long countExistedIpsInVlan(long vlanId);
3941
}

‎server/src/com/cloud/network/dao/UserIpv6AddressDaoImpl.java‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ public UserIpv6AddressDaoImpl() {
5959
CountFreePublicIps = createSearchBuilder(Long.class);
6060
CountFreePublicIps.select(null, Func.COUNT, null);
6161
CountFreePublicIps.and("networkId", CountFreePublicIps.entity().getSourceNetworkId(), SearchCriteria.Op.EQ);
62+
CountFreePublicIps.and("vlanId", CountFreePublicIps.entity().getSourceNetworkId(), SearchCriteria.Op.EQ);
6263
CountFreePublicIps.done();
6364
}
6465

@@ -111,4 +112,11 @@ public long countExistedIpsInNetwork(long networkId) {
111112
sc.setParameters("networkId", networkId);
112113
return customSearch(sc, null).get(0);
113114
}
115+
116+
@Override
117+
public long countExistedIpsInVlan(long vlanId) {
118+
SearchCriteria<Long> sc = CountFreePublicIps.create();
119+
sc.setParameters("vlanId", vlanId);
120+
return customSearch(sc, null).get(0);
121+
}
114122
}

‎server/test/com/cloud/network/MockNetworkModelImpl.java‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -810,13 +810,13 @@ public boolean isNetworkInlineMode(Network network) {
810810
}
811811

812812
@Override
813-
public Vlan getVlanForNetwork(long networkId) {
813+
public boolean isIP6AddressAvailableInNetwork(long networkId) {
814814
// TODO Auto-generated method stub
815-
return null;
815+
return false;
816816
}
817817

818818
@Override
819-
public boolean isIP6AddressAvailable(long networkId) {
819+
public boolean isIP6AddressAvailableInVlan(long vlanId) {
820820
// TODO Auto-generated method stub
821821
return false;
822822
}

‎server/test/com/cloud/vpc/MockNetworkModelImpl.java‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -824,13 +824,13 @@ public boolean isNetworkInlineMode(Network network) {
824824
}
825825

826826
@Override
827-
public Vlan getVlanForNetwork(long networkId) {
827+
public boolean isIP6AddressAvailableInNetwork(long networkId) {
828828
// TODO Auto-generated method stub
829-
return null;
829+
return false;
830830
}
831831

832832
@Override
833-
public boolean isIP6AddressAvailable(long networkId) {
833+
public boolean isIP6AddressAvailableInVlan(long vlanId) {
834834
// TODO Auto-generated method stub
835835
return false;
836836
}

0 commit comments

Comments
 (0)