This is an automated email from the ASF dual-hosted git repository.
dahn pushed a commit to branch 4.20
in repository https://gitbox.apache.org/repos/asf/cloudstack.git
The following commit(s) were added to refs/heads/4.20 by this push:
new 6a324da27a6 MAC address assignment improvements (#12349)
6a324da27a6 is described below
commit 6a324da27a6005959932d2ddf108ed76f6878aae
Author: Suresh Kumar Anaparti <[email protected]>
AuthorDate: Tue Jan 13 18:26:39 2026 +0530
MAC address assignment improvements (#12349)
---
.../main/java/com/cloud/network/NetworkModel.java | 8 +++++
.../main/java/com/cloud/network/addr/PublicIp.java | 8 +++--
.../engine/orchestration/NetworkOrchestrator.java | 2 +-
.../orchestration/NetworkOrchestratorTest.java | 1 +
.../java/com/cloud/network/dao/NetworkDaoImpl.java | 4 +--
.../src/main/java/com/cloud/vm/dao/NicDao.java | 2 +-
.../src/main/java/com/cloud/vm/dao/NicDaoImpl.java | 3 +-
.../com/cloud/network/IpAddressManagerImpl.java | 4 +--
.../com/cloud/network/Ipv6AddressManagerImpl.java | 2 +-
.../java/com/cloud/network/NetworkModelImpl.java | 40 ++++++++++++++++++----
.../com/cloud/network/guru/DirectNetworkGuru.java | 2 +-
.../cloud/network/guru/PodBasedNetworkGuru.java | 5 ++-
.../com/cloud/network/guru/PrivateNetworkGuru.java | 6 +++-
.../com/cloud/network/guru/StorageNetworkGuru.java | 6 ++--
.../com/cloud/network/router/NicProfileHelper.java | 3 +-
.../cloud/network/router/NicProfileHelperImpl.java | 11 +++---
.../com/cloud/network/Ipv6AddressManagerTest.java | 2 ++
.../com/cloud/network/MockNetworkModelImpl.java | 18 ++++++++++
.../java/com/cloud/vpc/MockNetworkModelImpl.java | 18 ++++++++++
.../main/java/com/cloud/utils/net/NetUtils.java | 6 ++--
20 files changed, 119 insertions(+), 32 deletions(-)
diff --git a/api/src/main/java/com/cloud/network/NetworkModel.java
b/api/src/main/java/com/cloud/network/NetworkModel.java
index a4cd87af008..309595d746f 100644
--- a/api/src/main/java/com/cloud/network/NetworkModel.java
+++ b/api/src/main/java/com/cloud/network/NetworkModel.java
@@ -125,6 +125,10 @@ public interface NetworkModel {
*/
String getNextAvailableMacAddressInNetwork(long networkConfigurationId)
throws InsufficientAddressCapacityException;
+ String getUniqueMacAddress(long macAddress, long networkId, long
datacenterId) throws InsufficientAddressCapacityException;
+
+ boolean isMACUnique(String mac, long networkId);
+
PublicIpAddress getPublicIpAddress(long ipAddressId);
List<? extends Vlan> listPodVlans(long podId);
@@ -362,4 +366,8 @@ public interface NetworkModel {
boolean checkSecurityGroupSupportForNetwork(Account account, DataCenter
zone, List<Long> networkIds,
List<Long> securityGroupsIds);
+
+ default long getMacIdentifier(Long dataCenterId) {
+ return 0;
+ }
}
diff --git
a/engine/components-api/src/main/java/com/cloud/network/addr/PublicIp.java
b/engine/components-api/src/main/java/com/cloud/network/addr/PublicIp.java
index d69a72a02c5..2f9cd45d632 100644
--- a/engine/components-api/src/main/java/com/cloud/network/addr/PublicIp.java
+++ b/engine/components-api/src/main/java/com/cloud/network/addr/PublicIp.java
@@ -40,7 +40,11 @@ public class PublicIp implements PublicIpAddress {
}
public static PublicIp createFromAddrAndVlan(IPAddressVO addr, VlanVO
vlan) {
- return new PublicIp(addr, vlan,
NetUtils.createSequenceBasedMacAddress(addr.getMacAddress(),
NetworkModel.MACIdentifier.value()));
+ long macIdentifier =
NetworkModel.MACIdentifier.valueIn(addr.getDataCenterId());
+ if (macIdentifier == 0) {
+ macIdentifier = addr.getDataCenterId();
+ }
+ return new PublicIp(addr, vlan,
NetUtils.createSequenceBasedMacAddress(addr.getMacAddress(), macIdentifier));
}
@Override
@@ -274,6 +278,4 @@ public class PublicIp implements PublicIpAddress {
public boolean isForSystemVms() {
return false;
}
-
-
}
diff --git
a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java
b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java
index 8a97735bab5..d19a4f1d4a0 100644
---
a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java
+++
b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java
@@ -1270,7 +1270,7 @@ public class NetworkOrchestrator extends ManagerBase
implements NetworkOrchestra
nicProfile.setIPv4Gateway(ipv4Gateway);
nicProfile.setIPv4Netmask(ipv4Netmask);
- if (nicProfile.getMacAddress() == null) {
+ if (nicProfile.getMacAddress() == null ||
!_networkModel.isMACUnique(nicProfile.getMacAddress(), network.getId())) {
try {
String macAddress =
_networkModel.getNextAvailableMacAddressInNetwork(network.getId());
nicProfile.setMacAddress(macAddress);
diff --git
a/engine/orchestration/src/test/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestratorTest.java
b/engine/orchestration/src/test/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestratorTest.java
index a95f0e36475..e3989737112 100644
---
a/engine/orchestration/src/test/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestratorTest.java
+++
b/engine/orchestration/src/test/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestratorTest.java
@@ -396,6 +396,7 @@ public class NetworkOrchestratorTest extends TestCase {
when(testOrchestrator._ipAddressDao.acquireInLockTable(Mockito.anyLong())).thenReturn(ipVoSpy);
when(testOrchestrator._ipAddressDao.update(Mockito.anyLong(),
Mockito.any(IPAddressVO.class))).thenReturn(true);
when(testOrchestrator._ipAddressDao.releaseFromLockTable(Mockito.anyLong())).thenReturn(true);
+ when(testOrchestrator._networkModel.isMACUnique(Mockito.anyString(),
Mockito.anyLong())).thenReturn(true);
try {
when(testOrchestrator._networkModel.getNextAvailableMacAddressInNetwork(Mockito.anyLong())).thenReturn(macAddress);
} catch (InsufficientAddressCapacityException e) {
diff --git
a/engine/schema/src/main/java/com/cloud/network/dao/NetworkDaoImpl.java
b/engine/schema/src/main/java/com/cloud/network/dao/NetworkDaoImpl.java
index 0aae532eac5..058ffa0030d 100644
--- a/engine/schema/src/main/java/com/cloud/network/dao/NetworkDaoImpl.java
+++ b/engine/schema/src/main/java/com/cloud/network/dao/NetworkDaoImpl.java
@@ -432,8 +432,8 @@ public class NetworkDaoImpl extends
GenericDaoBase<NetworkVO, Long>implements Ne
public String getNextAvailableMacAddress(final long networkConfigId,
Integer zoneMacIdentifier) {
final SequenceFetcher fetch = SequenceFetcher.getInstance();
long seq = fetch.getNextSequence(Long.class, _tgMacAddress,
networkConfigId);
- if(zoneMacIdentifier != null && zoneMacIdentifier.intValue() != 0 ){
- seq = seq | _prefix << 40 | (long)zoneMacIdentifier << 32 |
networkConfigId << 16 & 0x00000000ffff0000l;
+ if (zoneMacIdentifier != null && zoneMacIdentifier != 0) {
+ seq = seq | _prefix << 40 | (long)zoneMacIdentifier << 32 |
networkConfigId << 16 & 0x00000000ffff0000L;
}
return NetUtils.long2Mac(seq);
}
diff --git a/engine/schema/src/main/java/com/cloud/vm/dao/NicDao.java
b/engine/schema/src/main/java/com/cloud/vm/dao/NicDao.java
index d34b03c4cb0..d2798eae8f7 100644
--- a/engine/schema/src/main/java/com/cloud/vm/dao/NicDao.java
+++ b/engine/schema/src/main/java/com/cloud/vm/dao/NicDao.java
@@ -91,7 +91,7 @@ public interface NicDao extends GenericDao<NicVO, Long> {
List<NicVO> listByVmIdAndKeyword(long instanceId, String keyword);
- NicVO findByMacAddress(String macAddress);
+ NicVO findByMacAddress(String macAddress, long networkId);
NicVO findByNetworkIdAndMacAddressIncludingRemoved(long networkId, String
mac);
diff --git a/engine/schema/src/main/java/com/cloud/vm/dao/NicDaoImpl.java
b/engine/schema/src/main/java/com/cloud/vm/dao/NicDaoImpl.java
index 7d1af1982ae..ee8f4293e06 100644
--- a/engine/schema/src/main/java/com/cloud/vm/dao/NicDaoImpl.java
+++ b/engine/schema/src/main/java/com/cloud/vm/dao/NicDaoImpl.java
@@ -400,9 +400,10 @@ public class NicDaoImpl extends GenericDaoBase<NicVO,
Long> implements NicDao {
}
@Override
- public NicVO findByMacAddress(String macAddress) {
+ public NicVO findByMacAddress(String macAddress, long networkId) {
SearchCriteria<NicVO> sc = AllFieldsSearch.create();
sc.setParameters("macAddress", macAddress);
+ sc.setParameters("network", networkId);
return findOneBy(sc);
}
diff --git a/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java
b/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java
index 1c8bf7ae03f..fe555af9d50 100644
--- a/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java
+++ b/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java
@@ -2321,7 +2321,7 @@ public class IpAddressManagerImpl extends ManagerBase
implements IpAddressManage
nic.setBroadcastUri(BroadcastDomainType.Vlan.toUri(ip.getVlanTag()));
nic.setFormat(AddressFormat.Ip4);
nic.setReservationId(String.valueOf(ip.getVlanTag()));
- if(nic.getMacAddress() == null) {
+ if (nic.getMacAddress() == null) {
nic.setMacAddress(ip.getMacAddress());
}
}
@@ -2372,7 +2372,7 @@ public class IpAddressManagerImpl extends ManagerBase
implements IpAddressManage
nic.setBroadcastUri(network.getBroadcastUri());
nic.setFormat(AddressFormat.Ip4);
- if(nic.getMacAddress() == null) {
+ if (nic.getMacAddress() == null ||
!_networkModel.isMACUnique(nic.getMacAddress(), network.getId())) {
nic.setMacAddress(_networkModel.getNextAvailableMacAddressInNetwork(network.getId()));
}
}
diff --git a/server/src/main/java/com/cloud/network/Ipv6AddressManagerImpl.java
b/server/src/main/java/com/cloud/network/Ipv6AddressManagerImpl.java
index d4c293ecf88..d096b09ec0d 100644
--- a/server/src/main/java/com/cloud/network/Ipv6AddressManagerImpl.java
+++ b/server/src/main/java/com/cloud/network/Ipv6AddressManagerImpl.java
@@ -241,7 +241,7 @@ public class Ipv6AddressManagerImpl extends ManagerBase
implements Ipv6AddressMa
if (nic.getBroadCastUri() == null) {
nic.setBroadcastUri(network.getBroadcastUri());
}
- if (nic.getMacAddress() == null) {
+ if (nic.getMacAddress() == null ||
!_networkModel.isMACUnique(nic.getMacAddress(), network.getId())) {
nic.setMacAddress(_networkModel.getNextAvailableMacAddressInNetwork(network.getId()));
}
}
diff --git a/server/src/main/java/com/cloud/network/NetworkModelImpl.java
b/server/src/main/java/com/cloud/network/NetworkModelImpl.java
index 26464273490..4a5b7199430 100644
--- a/server/src/main/java/com/cloud/network/NetworkModelImpl.java
+++ b/server/src/main/java/com/cloud/network/NetworkModelImpl.java
@@ -593,22 +593,34 @@ public class NetworkModelImpl extends ManagerBase
implements NetworkModel, Confi
@Override
public String getNextAvailableMacAddressInNetwork(long networkId) throws
InsufficientAddressCapacityException {
NetworkVO network = _networksDao.findById(networkId);
- Integer zoneIdentifier = MACIdentifier.value();
- if (zoneIdentifier.intValue() == 0) {
- zoneIdentifier =
Long.valueOf(network.getDataCenterId()).intValue();
+ if (network == null) {
+ throw new CloudRuntimeException("Could not find network with id "
+ networkId);
}
+
+ Integer zoneMacIdentifier =
Long.valueOf(getMacIdentifier(network.getDataCenterId())).intValue();
String mac;
do {
- mac = _networksDao.getNextAvailableMacAddress(networkId,
zoneIdentifier);
+ mac = _networksDao.getNextAvailableMacAddress(networkId,
zoneMacIdentifier);
if (mac == null) {
throw new InsufficientAddressCapacityException("Unable to
create another mac address", Network.class, networkId);
}
- } while(! isMACUnique(mac));
+ } while (!isMACUnique(mac, networkId));
return mac;
}
- private boolean isMACUnique(String mac) {
- return (_nicDao.findByMacAddress(mac) == null);
+ @Override
+ public String getUniqueMacAddress(long macAddress, long networkId, long
datacenterId) throws InsufficientAddressCapacityException {
+ String macAddressStr =
NetUtils.long2Mac(NetUtils.createSequenceBasedMacAddress(macAddress,
getMacIdentifier(datacenterId)));
+ if (!isMACUnique(macAddressStr, networkId)) {
+ macAddressStr = getNextAvailableMacAddressInNetwork(networkId);
+ }
+ return macAddressStr;
+ }
+
+ @Override
+ public boolean isMACUnique(String mac, long networkId) {
+ return (_nicDao.findByMacAddress(mac, networkId) == null);
+
}
@Override
@@ -2815,4 +2827,18 @@ public class NetworkModelImpl extends ManagerBase
implements NetworkModel, Confi
}
return false;
}
+
+ @Override
+ public long getMacIdentifier(Long dataCenterId) {
+ long macAddress = 0;
+ if (dataCenterId == null) {
+ macAddress = NetworkModel.MACIdentifier.value();
+ } else {
+ macAddress = NetworkModel.MACIdentifier.valueIn(dataCenterId);
+ if (macAddress == 0) {
+ macAddress = dataCenterId;
+ }
+ }
+ return macAddress;
+ }
}
diff --git a/server/src/main/java/com/cloud/network/guru/DirectNetworkGuru.java
b/server/src/main/java/com/cloud/network/guru/DirectNetworkGuru.java
index 0cb698e9682..5c0c4eed7fc 100644
--- a/server/src/main/java/com/cloud/network/guru/DirectNetworkGuru.java
+++ b/server/src/main/java/com/cloud/network/guru/DirectNetworkGuru.java
@@ -293,7 +293,7 @@ public class DirectNetworkGuru extends AdapterBase
implements NetworkGuru {
allocateDirectIp(nic, network, vm, dc, nic.getRequestedIPv4(),
nic.getRequestedIPv6());
nic.setReservationStrategy(ReservationStrategy.Create);
- if (nic.getMacAddress() == null) {
+ if (nic.getMacAddress() == null ||
!_networkModel.isMACUnique(nic.getMacAddress(), network.getId())) {
nic.setMacAddress(_networkModel.getNextAvailableMacAddressInNetwork(network.getId()));
if (nic.getMacAddress() == null) {
throw new InsufficientAddressCapacityException("Unable to
allocate more mac addresses", Network.class, network.getId());
diff --git
a/server/src/main/java/com/cloud/network/guru/PodBasedNetworkGuru.java
b/server/src/main/java/com/cloud/network/guru/PodBasedNetworkGuru.java
index 5dafa60f1c7..15faec46589 100644
--- a/server/src/main/java/com/cloud/network/guru/PodBasedNetworkGuru.java
+++ b/server/src/main/java/com/cloud/network/guru/PodBasedNetworkGuru.java
@@ -53,6 +53,8 @@ public class PodBasedNetworkGuru extends AdapterBase
implements NetworkGuru {
DataCenterDao _dcDao;
@Inject
StorageNetworkManager _sNwMgr;
+ @Inject
+ NetworkModel _networkModel;
Random _rand = new Random(System.currentTimeMillis());
@@ -131,7 +133,8 @@ public class PodBasedNetworkGuru extends AdapterBase
implements NetworkGuru {
Integer vlan = result.getVlan();
nic.setIPv4Address(result.getIpAddress());
-
nic.setMacAddress(NetUtils.long2Mac(NetUtils.createSequenceBasedMacAddress(result.getMacAddress(),
NetworkModel.MACIdentifier.value())));
+ String macAddress =
_networkModel.getUniqueMacAddress(result.getMacAddress(), config.getId(),
dest.getDataCenter().getId());
+ nic.setMacAddress(macAddress);
nic.setIPv4Gateway(pod.getGateway());
nic.setFormat(AddressFormat.Ip4);
String netmask = NetUtils.getCidrNetmask(pod.getCidrSize());
diff --git
a/server/src/main/java/com/cloud/network/guru/PrivateNetworkGuru.java
b/server/src/main/java/com/cloud/network/guru/PrivateNetworkGuru.java
index 9fa8e2f26de..4c22dc16f82 100644
--- a/server/src/main/java/com/cloud/network/guru/PrivateNetworkGuru.java
+++ b/server/src/main/java/com/cloud/network/guru/PrivateNetworkGuru.java
@@ -189,8 +189,12 @@ public class PrivateNetworkGuru extends AdapterBase
implements NetworkGuru {
PrivateIpVO ipVO =
_privateIpDao.allocateIpAddress(network.getDataCenterId(), network.getId(),
null);
String vlanTag =
BroadcastDomainType.getValue(network.getBroadcastUri());
String netmask = NetUtils.getCidrNetmask(network.getCidr());
+ String macAddress =
NetUtils.long2Mac(NetUtils.createSequenceBasedMacAddress(ipVO.getMacAddress(),
networkModel.getMacIdentifier(network.getDataCenterId())));
+ if (!networkModel.isMACUnique(macAddress, network.getId())) {
+ macAddress =
networkModel.getNextAvailableMacAddressInNetwork(network.getId());
+ }
PrivateIpAddress ip =
- new PrivateIpAddress(ipVO, vlanTag, network.getGateway(),
netmask,
NetUtils.long2Mac(NetUtils.createSequenceBasedMacAddress(ipVO.getMacAddress(),
NetworkModel.MACIdentifier.value())));
+ new PrivateIpAddress(ipVO, vlanTag, network.getGateway(),
netmask, macAddress);
nic.setIPv4Address(ip.getIpAddress());
nic.setIPv4Gateway(ip.getGateway());
diff --git
a/server/src/main/java/com/cloud/network/guru/StorageNetworkGuru.java
b/server/src/main/java/com/cloud/network/guru/StorageNetworkGuru.java
index 221661fea12..4d2d582c9ff 100644
--- a/server/src/main/java/com/cloud/network/guru/StorageNetworkGuru.java
+++ b/server/src/main/java/com/cloud/network/guru/StorageNetworkGuru.java
@@ -37,7 +37,6 @@ import com.cloud.network.dao.NetworkDao;
import com.cloud.network.dao.NetworkVO;
import com.cloud.offering.NetworkOffering;
import com.cloud.user.Account;
-import com.cloud.utils.net.NetUtils;
import com.cloud.vm.Nic.ReservationStrategy;
import com.cloud.vm.NicProfile;
import com.cloud.vm.ReservationContext;
@@ -47,6 +46,8 @@ public class StorageNetworkGuru extends PodBasedNetworkGuru
implements NetworkGu
@Inject
StorageNetworkManager _sNwMgr;
@Inject
+ NetworkModel _networkModel;
+ @Inject
NetworkDao _nwDao;
protected StorageNetworkGuru() {
@@ -130,7 +131,8 @@ public class StorageNetworkGuru extends PodBasedNetworkGuru
implements NetworkGu
vlan = ip.getVlan();
nic.setIPv4Address(ip.getIpAddress());
-
nic.setMacAddress(NetUtils.long2Mac(NetUtils.createSequenceBasedMacAddress(ip.getMac(),
NetworkModel.MACIdentifier.value())));
+ String macAddress = _networkModel.getUniqueMacAddress(ip.getMac(),
network.getId(), dest.getDataCenter().getId());
+ nic.setMacAddress(macAddress);
nic.setFormat(AddressFormat.Ip4);
nic.setIPv4Netmask(ip.getNetmask());
nic.setBroadcastType(BroadcastDomainType.Storage);
diff --git
a/server/src/main/java/com/cloud/network/router/NicProfileHelper.java
b/server/src/main/java/com/cloud/network/router/NicProfileHelper.java
index 832d77f9e40..b1ad2ef950b 100644
--- a/server/src/main/java/com/cloud/network/router/NicProfileHelper.java
+++ b/server/src/main/java/com/cloud/network/router/NicProfileHelper.java
@@ -16,6 +16,7 @@
// under the License.
package com.cloud.network.router;
+import com.cloud.exception.InsufficientAddressCapacityException;
import
org.apache.cloudstack.network.router.deployment.RouterDeploymentDefinition;
import com.cloud.network.Network;
@@ -24,7 +25,7 @@ import com.cloud.vm.NicProfile;
public interface NicProfileHelper {
- public abstract NicProfile createPrivateNicProfileForGateway(final
VpcGateway privateGateway, final VirtualRouter router);
+ public abstract NicProfile createPrivateNicProfileForGateway(final
VpcGateway privateGateway, final VirtualRouter router) throws
InsufficientAddressCapacityException;
public abstract NicProfile createGuestNicProfileForVpcRouter(final
RouterDeploymentDefinition vpcRouterDeploymentDefinition,
Network guestNetwork);
diff --git
a/server/src/main/java/com/cloud/network/router/NicProfileHelperImpl.java
b/server/src/main/java/com/cloud/network/router/NicProfileHelperImpl.java
index 399019db3e2..b0320dbfab9 100644
--- a/server/src/main/java/com/cloud/network/router/NicProfileHelperImpl.java
+++ b/server/src/main/java/com/cloud/network/router/NicProfileHelperImpl.java
@@ -21,6 +21,7 @@ import java.net.URI;
import javax.inject.Inject;
+import com.cloud.exception.InsufficientAddressCapacityException;
import com.cloud.vm.NicVO;
import com.cloud.vm.VirtualMachine;
import
org.apache.cloudstack.network.router.deployment.RouterDeploymentDefinition;
@@ -61,7 +62,7 @@ public class NicProfileHelperImpl implements NicProfileHelper
{
@Override
@DB
- public NicProfile createPrivateNicProfileForGateway(final VpcGateway
privateGateway, final VirtualRouter router) {
+ public NicProfile createPrivateNicProfileForGateway(final VpcGateway
privateGateway, final VirtualRouter router) throws
InsufficientAddressCapacityException {
final Network privateNetwork =
_networkModel.getNetwork(privateGateway.getNetworkId());
PrivateIpVO ipVO =
_privateIpDao.allocateIpAddress(privateNetwork.getDataCenterId(),
privateNetwork.getId(), privateGateway.getIp4Address());
@@ -90,14 +91,14 @@ public class NicProfileHelperImpl implements
NicProfileHelper {
privateNicProfile.setDeviceId(null);
if (router.getIsRedundantRouter()) {
- String newMacAddress =
NetUtils.long2Mac(NetUtils.createSequenceBasedMacAddress(ipVO.getMacAddress(),
NetworkModel.MACIdentifier.value()));
- privateNicProfile.setMacAddress(newMacAddress);
+ String newMacAddress =
_networkModel.getUniqueMacAddress(ipVO.getMacAddress(), privateNetwork.getId(),
privateNetwork.getDataCenterId());
+ privateNicProfile.setMacAddress(newMacAddress);
}
} else {
final String netmask =
NetUtils.getCidrNetmask(privateNetwork.getCidr());
+ String newMacAddress =
_networkModel.getUniqueMacAddress(ipVO.getMacAddress(), privateNetwork.getId(),
privateNetwork.getDataCenterId());
final PrivateIpAddress ip =
- new PrivateIpAddress(ipVO,
privateNetwork.getBroadcastUri().toString(), privateNetwork.getGateway(),
netmask,
-
NetUtils.long2Mac(NetUtils.createSequenceBasedMacAddress(ipVO.getMacAddress(),
NetworkModel.MACIdentifier.value())));
+ new PrivateIpAddress(ipVO,
privateNetwork.getBroadcastUri().toString(), privateNetwork.getGateway(),
netmask, newMacAddress);
final URI netUri =
BroadcastDomainType.fromString(ip.getBroadcastUri());
privateNicProfile.setIPv4Address(ip.getIpAddress());
diff --git a/server/src/test/java/com/cloud/network/Ipv6AddressManagerTest.java
b/server/src/test/java/com/cloud/network/Ipv6AddressManagerTest.java
index 0b8e7f43137..68a0fa8052d 100644
--- a/server/src/test/java/com/cloud/network/Ipv6AddressManagerTest.java
+++ b/server/src/test/java/com/cloud/network/Ipv6AddressManagerTest.java
@@ -246,8 +246,10 @@ public class Ipv6AddressManagerTest {
Mockito.when(network.getIp6Cidr()).thenReturn("2001:db8:100::/64");
Mockito.when(network.getIp6Gateway()).thenReturn("2001:db8:100::1");
+ Mockito.when(network.getId()).thenReturn(1L);
Mockito.when(networkModel.getNetworkIp6Dns(network,
dc)).thenReturn(new Pair<>("2001:db8::53:1", "2001:db8::53:2"));
+ Mockito.when(networkModel.isMACUnique("1e:00:b1:00:0a:f6",
1L)).thenReturn(true);
String expected = "2001:db8:100:0:1c00:b1ff:fe00:af6";
diff --git a/server/src/test/java/com/cloud/network/MockNetworkModelImpl.java
b/server/src/test/java/com/cloud/network/MockNetworkModelImpl.java
index ea9a0340eaa..88df58da645 100644
--- a/server/src/test/java/com/cloud/network/MockNetworkModelImpl.java
+++ b/server/src/test/java/com/cloud/network/MockNetworkModelImpl.java
@@ -129,6 +129,24 @@ public class MockNetworkModelImpl extends ManagerBase
implements NetworkModel {
return null;
}
+ /* (non-Javadoc)
+ * @see com.cloud.network.NetworkModel#getUniqueMacAddress(long, long,
long)
+ */
+ @Override
+ public String getUniqueMacAddress(long macAddress, long networkId, long
datacenterId) throws InsufficientAddressCapacityException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see com.cloud.network.NetworkModel#isMACUnique(String, long)
+ */
+ @Override
+ public boolean isMACUnique(String mac, long networkId) {
+ // TODO Auto-generated method stub
+ return true;
+ }
+
/* (non-Javadoc)
* @see com.cloud.network.NetworkModel#getPublicIpAddress(long)
*/
diff --git a/server/src/test/java/com/cloud/vpc/MockNetworkModelImpl.java
b/server/src/test/java/com/cloud/vpc/MockNetworkModelImpl.java
index 3b41a56dc0f..5efcd972022 100644
--- a/server/src/test/java/com/cloud/vpc/MockNetworkModelImpl.java
+++ b/server/src/test/java/com/cloud/vpc/MockNetworkModelImpl.java
@@ -141,6 +141,24 @@ public class MockNetworkModelImpl extends ManagerBase
implements NetworkModel {
return null;
}
+ /* (non-Javadoc)
+ * @see com.cloud.network.NetworkModel#getUniqueMacAddress(long, long,
long)
+ */
+ @Override
+ public String getUniqueMacAddress(long macAddress, long networkId, long
datacenterId) throws InsufficientAddressCapacityException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see com.cloud.network.NetworkModel#isMACUnique(String, long)
+ */
+ @Override
+ public boolean isMACUnique(String mac, long networkId) {
+ // TODO Auto-generated method stub
+ return true;
+ }
+
/* (non-Javadoc)
* @see com.cloud.network.NetworkModel#getPublicIpAddress(long)
*/
diff --git a/utils/src/main/java/com/cloud/utils/net/NetUtils.java
b/utils/src/main/java/com/cloud/utils/net/NetUtils.java
index 0b7d2350281..1a0382f249b 100644
--- a/utils/src/main/java/com/cloud/utils/net/NetUtils.java
+++ b/utils/src/main/java/com/cloud/utils/net/NetUtils.java
@@ -131,17 +131,17 @@ public class NetUtils {
}
}
- public static long createSequenceBasedMacAddress(final long macAddress,
long globalConfig) {
+ public static long createSequenceBasedMacAddress(final long macAddress,
long macIdentifier) {
/*
Logic for generating MAC address:
Mac = B1:B2:B3:B4:B5:B6 (Bx is a byte).
B1 -> Presently controlled by prefix variable. The value should be
such that the MAC is local and unicast.
- B2 -> This will be configurable for each deployment/installation.
Controlled by the global config MACIdentifier
+ B2 -> This will be configurable for each deployment/installation.
Controlled by the 'mac.identifier' zone-level config
B3 -> A randomly generated number between 0 - 255
B4,5,6 -> These bytes are based on the unique DB identifier
associated with the IP address for which MAC is generated (refer to mac_address
field in user_ip_address table).
*/
- return macAddress | prefix<<40 | globalConfig << 32 & 0x00ff00000000l
| (long)s_rand.nextInt(255) << 24;
+ return macAddress | prefix << 40 | macIdentifier << 32 &
0x00ff00000000L | (long)s_rand.nextInt(255) << 24;
}
public static String getHostName() {