Skip to content

Commit 507c4cd

Browse files
Merge branch '4.22'
2 parents 5385783 + b5fd39f commit 507c4cd

File tree

23 files changed

+214
-134
lines changed

23 files changed

+214
-134
lines changed

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,10 @@ public interface NetworkModel {
125125
*/
126126
String getNextAvailableMacAddressInNetwork(long networkConfigurationId) throws InsufficientAddressCapacityException;
127127

128+
String getUniqueMacAddress(long macAddress, long networkId, long datacenterId) throws InsufficientAddressCapacityException;
129+
130+
boolean isMACUnique(String mac, long networkId);
131+
128132
PublicIpAddress getPublicIpAddress(long ipAddressId);
129133

130134
List<? extends Vlan> listPodVlans(long podId);
@@ -364,4 +368,8 @@ List<String[]> generateVmData(String userData, String userDataDetails, String se
364368

365369
boolean checkSecurityGroupSupportForNetwork(Account account, DataCenter zone, List<Long> networkIds,
366370
List<Long> securityGroupsIds);
371+
372+
default long getMacIdentifier(Long dataCenterId) {
373+
return 0;
374+
}
367375
}

engine/components-api/src/main/java/com/cloud/network/addr/PublicIp.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,11 @@ public PublicIp(IPAddressVO addr, VlanVO vlan, long macAddress) {
4040
}
4141

4242
public static PublicIp createFromAddrAndVlan(IPAddressVO addr, VlanVO vlan) {
43-
return new PublicIp(addr, vlan, NetUtils.createSequenceBasedMacAddress(addr.getMacAddress(), NetworkModel.MACIdentifier.value()));
43+
long macIdentifier = NetworkModel.MACIdentifier.valueIn(addr.getDataCenterId());
44+
if (macIdentifier == 0) {
45+
macIdentifier = addr.getDataCenterId();
46+
}
47+
return new PublicIp(addr, vlan, NetUtils.createSequenceBasedMacAddress(addr.getMacAddress(), macIdentifier));
4448
}
4549

4650
@Override
@@ -279,5 +283,4 @@ public boolean isForSystemVms() {
279283
public boolean isForRouter() {
280284
return _addr.isForRouter();
281285
}
282-
283286
}

engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1283,7 +1283,7 @@ protected void configureNicProfileBasedOnRequestedIp(NicProfile requestedNicProf
12831283
nicProfile.setIPv4Gateway(ipv4Gateway);
12841284
nicProfile.setIPv4Netmask(ipv4Netmask);
12851285

1286-
if (nicProfile.getMacAddress() == null) {
1286+
if (nicProfile.getMacAddress() == null || !_networkModel.isMACUnique(nicProfile.getMacAddress(), network.getId())) {
12871287
try {
12881288
String macAddress = _networkModel.getNextAvailableMacAddressInNetwork(network.getId());
12891289
nicProfile.setMacAddress(macAddress);

engine/orchestration/src/test/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestratorTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -396,6 +396,7 @@ private void configureTestConfigureNicProfileBasedOnRequestedIpTests(NicProfile
396396
when(testOrchestrator._ipAddressDao.acquireInLockTable(Mockito.anyLong())).thenReturn(ipVoSpy);
397397
when(testOrchestrator._ipAddressDao.update(Mockito.anyLong(), Mockito.any(IPAddressVO.class))).thenReturn(true);
398398
when(testOrchestrator._ipAddressDao.releaseFromLockTable(Mockito.anyLong())).thenReturn(true);
399+
when(testOrchestrator._networkModel.isMACUnique(Mockito.anyString(), Mockito.anyLong())).thenReturn(true);
399400
try {
400401
when(testOrchestrator._networkModel.getNextAvailableMacAddressInNetwork(Mockito.anyLong())).thenReturn(macAddress);
401402
} catch (InsufficientAddressCapacityException e) {

engine/schema/src/main/java/com/cloud/network/dao/NetworkDaoImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -462,8 +462,8 @@ public List<NetworkVO> listByNetworkDomainsAndDomainIds(Set<String> uniqueNtwkDo
462462
public String getNextAvailableMacAddress(final long networkConfigId, Integer zoneMacIdentifier) {
463463
final SequenceFetcher fetch = SequenceFetcher.getInstance();
464464
long seq = fetch.getNextSequence(Long.class, _tgMacAddress, networkConfigId);
465-
if(zoneMacIdentifier != null && zoneMacIdentifier.intValue() != 0 ){
466-
seq = seq | _prefix << 40 | (long)zoneMacIdentifier << 32 | networkConfigId << 16 & 0x00000000ffff0000l;
465+
if (zoneMacIdentifier != null && zoneMacIdentifier != 0) {
466+
seq = seq | _prefix << 40 | (long)zoneMacIdentifier << 32 | networkConfigId << 16 & 0x00000000ffff0000L;
467467
}
468468
return NetUtils.long2Mac(seq);
469469
}

engine/schema/src/main/java/com/cloud/vm/dao/NicDao.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ public interface NicDao extends GenericDao<NicVO, Long> {
9595

9696
List<NicVO> listByVmIdAndKeyword(long instanceId, String keyword);
9797

98-
NicVO findByMacAddress(String macAddress);
98+
NicVO findByMacAddress(String macAddress, long networkId);
9999

100100
NicVO findByNetworkIdAndMacAddressIncludingRemoved(long networkId, String mac);
101101

engine/schema/src/main/java/com/cloud/vm/dao/NicDaoImpl.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -420,9 +420,10 @@ public List<NicVO> listByVmIdAndKeyword(long instanceId, String keyword) {
420420
}
421421

422422
@Override
423-
public NicVO findByMacAddress(String macAddress) {
423+
public NicVO findByMacAddress(String macAddress, long networkId) {
424424
SearchCriteria<NicVO> sc = AllFieldsSearch.create();
425425
sc.setParameters("macAddress", macAddress);
426+
sc.setParameters("network", networkId);
426427
return findOneBy(sc);
427428
}
428429

server/src/main/java/com/cloud/alert/AlertManagerImpl.java

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -313,13 +313,8 @@ protected void recalculateHostCapacities() {
313313
Math.min(CapacityManager.CapacityCalculateWorkers.value(), hostIds.size())));
314314
for (Long hostId : hostIds) {
315315
futures.put(hostId, executorService.submit(() -> {
316-
Transaction.execute(new TransactionCallbackNoReturn() {
317-
@Override
318-
public void doInTransactionWithoutResult(TransactionStatus status) {
319-
final HostVO host = hostDao.findById(hostId);
320-
_capacityMgr.updateCapacityForHost(host);
321-
}
322-
});
316+
final HostVO host = hostDao.findById(hostId);
317+
_capacityMgr.updateCapacityForHost(host);
323318
return null;
324319
}));
325320
}

server/src/main/java/com/cloud/network/IpAddressManagerImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2409,7 +2409,7 @@ public void doInTransactionWithoutResult(TransactionStatus status) throws Insuff
24092409
nic.setBroadcastUri(BroadcastDomainType.Vlan.toUri(ip.getVlanTag()));
24102410
nic.setFormat(AddressFormat.Ip4);
24112411
nic.setReservationId(String.valueOf(ip.getVlanTag()));
2412-
if(nic.getMacAddress() == null) {
2412+
if (nic.getMacAddress() == null) {
24132413
nic.setMacAddress(ip.getMacAddress());
24142414
}
24152415
}
@@ -2460,7 +2460,7 @@ public void doInTransactionWithoutResult(TransactionStatus status) throws Insuff
24602460

24612461
nic.setBroadcastUri(network.getBroadcastUri());
24622462
nic.setFormat(AddressFormat.Ip4);
2463-
if(nic.getMacAddress() == null) {
2463+
if (nic.getMacAddress() == null || !_networkModel.isMACUnique(nic.getMacAddress(), network.getId())) {
24642464
nic.setMacAddress(_networkModel.getNextAvailableMacAddressInNetwork(network.getId()));
24652465
}
24662466
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,7 @@ private void setNicPropertiesFromNetwork(NicProfile nic, Network network) throws
241241
if (nic.getBroadCastUri() == null) {
242242
nic.setBroadcastUri(network.getBroadcastUri());
243243
}
244-
if (nic.getMacAddress() == null) {
244+
if (nic.getMacAddress() == null || !_networkModel.isMACUnique(nic.getMacAddress(), network.getId())) {
245245
nic.setMacAddress(_networkModel.getNextAvailableMacAddressInNetwork(network.getId()));
246246
}
247247
}

0 commit comments

Comments
 (0)