From f78650c590a687596a3f03a8db7cd29bcf524483 Mon Sep 17 00:00:00 2001 From: Daan Hoogland Date: Thu, 15 Jun 2023 14:20:03 +0200 Subject: [PATCH 1/8] use zone DB ID as default ZoneMacIdentifyer --- api/src/main/java/com/cloud/network/NetworkModel.java | 2 +- .../java/com/cloud/network/vm/NetScalerVMManagerImpl.java | 2 +- .../src/main/java/com/cloud/network/NetworkModelImpl.java | 6 +++++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/api/src/main/java/com/cloud/network/NetworkModel.java b/api/src/main/java/com/cloud/network/NetworkModel.java index 9fd4fcb98621..882187fec787 100644 --- a/api/src/main/java/com/cloud/network/NetworkModel.java +++ b/api/src/main/java/com/cloud/network/NetworkModel.java @@ -90,7 +90,7 @@ public interface NetworkModel { INSTANCE_ID_FILE, VM_ID_FILE, PUBLIC_KEYS_FILE, CLOUD_IDENTIFIER_FILE, HYPERVISOR_HOST_NAME_FILE)); static final ConfigKey MACIdentifier = new ConfigKey<>("Advanced",Integer.class, "mac.identifier", "0", - "This value will be used while generating the mac addresses for isolated and shared networks. The hexadecimal equivalent value will be present at the 2nd octet of the mac address. Default value is null which means this feature is disabled.Its scope is global.", true, ConfigKey.Scope.Global); + "This value will be used while generating the mac addresses for isolated and shared networks. The hexadecimal equivalent value will be present at the 2nd octet of the mac address. Default value is zero (0) which means that the DB id of the zone will be used.", true, ConfigKey.Scope.Zone); static final ConfigKey AdminIsAllowedToDeployAnywhere = new ConfigKey<>("Advanced",Boolean.class, "admin.is.allowed.to.deploy.anywhere", "false", "This will determine if the root admin is allowed to deploy in networks in subdomains.", true, ConfigKey.Scope.Global); diff --git a/plugins/network-elements/netscaler/src/main/java/com/cloud/network/vm/NetScalerVMManagerImpl.java b/plugins/network-elements/netscaler/src/main/java/com/cloud/network/vm/NetScalerVMManagerImpl.java index 277c77472277..9509e86212d9 100644 --- a/plugins/network-elements/netscaler/src/main/java/com/cloud/network/vm/NetScalerVMManagerImpl.java +++ b/plugins/network-elements/netscaler/src/main/java/com/cloud/network/vm/NetScalerVMManagerImpl.java @@ -324,7 +324,7 @@ public Map deployNsVpx(Account owner, DeployDestination dest, De defaultNic2.setIPv4Address(""); defaultNic2.setIPv4Gateway(""); defaultNic2.setIPv4Netmask(""); - String macAddress = _networkDao.getNextAvailableMacAddress(defaultPublicNetwork.getId(), null); + String macAddress = _networkDao.getNextAvailableMacAddress(defaultPublicNetwork.getId(), Long.valueOf(defaultPublicNetwork.getDataCenterId()).intValue()); defaultNic2.setMacAddress(macAddress); networks.put(_networkMgr.setupNetwork(_accountMgr.getSystemAccount(), _networkOfferingDao.findByUniqueName(NetworkOffering.SystemPublicNetwork), plan, null, null, false).get(0), diff --git a/server/src/main/java/com/cloud/network/NetworkModelImpl.java b/server/src/main/java/com/cloud/network/NetworkModelImpl.java index 5776d4e1628e..54df102ea816 100644 --- a/server/src/main/java/com/cloud/network/NetworkModelImpl.java +++ b/server/src/main/java/com/cloud/network/NetworkModelImpl.java @@ -593,7 +593,11 @@ public List getNics(long vmId) { @Override public String getNextAvailableMacAddressInNetwork(long networkId) throws InsufficientAddressCapacityException { NetworkVO network = _networksDao.findById(networkId); - String mac = _networksDao.getNextAvailableMacAddress(networkId, MACIdentifier.value()); + Integer zoneIdentifyer = MACIdentifier.value(); + if (zoneIdentifyer.intValue() == 0) { + zoneIdentifyer = Long.valueOf(network.getDataCenterId()).intValue(); + } + String mac = _networksDao.getNextAvailableMacAddress(networkId, zoneIdentifyer); if (mac == null) { throw new InsufficientAddressCapacityException("Unable to create another mac address", Network.class, networkId); } From e909e39e5074c7e14aefd2009617bea14f23ea7f Mon Sep 17 00:00:00 2001 From: Daan Hoogland Date: Thu, 15 Jun 2023 15:19:02 +0200 Subject: [PATCH 2/8] remove unused methods --- .../api/db/dao/EngineDataCenterDao.java | 8 -------- .../api/db/dao/EngineDataCenterDaoImpl.java | 19 ------------------- .../java/com/cloud/dc/dao/DataCenterDao.java | 8 -------- .../com/cloud/dc/dao/DataCenterDaoImpl.java | 19 ------------------- 4 files changed, 54 deletions(-) diff --git a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineDataCenterDao.java b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineDataCenterDao.java index f9cee4c20266..4239930c6127 100644 --- a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineDataCenterDao.java +++ b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineDataCenterDao.java @@ -28,14 +28,6 @@ public interface EngineDataCenterDao extends GenericDao { EngineDataCenterVO findByName(String name); - /** - * @param id data center id - * @return a pair of mac address strings. The first one is private and second is public. - */ - String[] getNextAvailableMacAddressPair(long id); - - String[] getNextAvailableMacAddressPair(long id, long mask); - List findZonesByDomainId(Long domainId); List listPublicZones(String keyword); diff --git a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineDataCenterDaoImpl.java b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineDataCenterDaoImpl.java index a0d484c61931..1c1cadb253d2 100644 --- a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineDataCenterDaoImpl.java +++ b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineDataCenterDaoImpl.java @@ -139,25 +139,6 @@ public List findByKeyword(String keyword) { return listBy(ssc); } - @Override - public String[] getNextAvailableMacAddressPair(long id) { - return getNextAvailableMacAddressPair(id, 0); - } - - @Override - public String[] getNextAvailableMacAddressPair(long id, long mask) { - SequenceFetcher fetch = SequenceFetcher.getInstance(); - - long seq = fetch.getNextSequence(Long.class, _tgMacAddress, id); - seq = seq | _prefix | ((id & 0x7f) << 32); - seq |= mask; - seq |= ((_rand.nextInt(Short.MAX_VALUE) << 16) & 0x00000000ffff0000l); - String[] pair = new String[2]; - pair[0] = NetUtils.long2Mac(seq); - pair[1] = NetUtils.long2Mac(seq | 0x1l << 39); - return pair; - } - @Override public boolean configure(String name, Map params) throws ConfigurationException { if (!super.configure(name, params)) { diff --git a/engine/schema/src/main/java/com/cloud/dc/dao/DataCenterDao.java b/engine/schema/src/main/java/com/cloud/dc/dao/DataCenterDao.java index 0754bbf3591b..aea51925f9c6 100644 --- a/engine/schema/src/main/java/com/cloud/dc/dao/DataCenterDao.java +++ b/engine/schema/src/main/java/com/cloud/dc/dao/DataCenterDao.java @@ -52,14 +52,6 @@ public Integer getVlan() { DataCenterVO findByName(String name); - /** - * @param id data center id - * @return a pair of mac address strings. The first one is private and second is public. - */ - String[] getNextAvailableMacAddressPair(long id); - - String[] getNextAvailableMacAddressPair(long id, long mask); - PrivateAllocationData allocatePrivateIpAddress(long id, long podId, long instanceId, String reservationId, boolean forSystemVms); DataCenterIpAddressVO allocatePrivateIpAddress(long id, String reservationId); diff --git a/engine/schema/src/main/java/com/cloud/dc/dao/DataCenterDaoImpl.java b/engine/schema/src/main/java/com/cloud/dc/dao/DataCenterDaoImpl.java index 3bad5ee7eef2..e0f8b86ca4af 100644 --- a/engine/schema/src/main/java/com/cloud/dc/dao/DataCenterDaoImpl.java +++ b/engine/schema/src/main/java/com/cloud/dc/dao/DataCenterDaoImpl.java @@ -230,25 +230,6 @@ public String allocatePodVlan(long podId, long accountId) { return vo.getVlan(); } - @Override - public String[] getNextAvailableMacAddressPair(long id) { - return getNextAvailableMacAddressPair(id, 0); - } - - @Override - public String[] getNextAvailableMacAddressPair(long id, long mask) { - SequenceFetcher fetch = SequenceFetcher.getInstance(); - - long seq = fetch.getNextSequence(Long.class, _tgMacAddress, id); - seq = seq | _prefix | ((id & 0x7f) << 32); - seq |= mask; - seq |= ((_rand.nextInt(Short.MAX_VALUE) << 16) & 0x00000000ffff0000l); - String[] pair = new String[2]; - pair[0] = NetUtils.long2Mac(seq); - pair[1] = NetUtils.long2Mac(seq | 0x1l << 39); - return pair; - } - @Override public PrivateAllocationData allocatePrivateIpAddress(long dcId, long podId, long instanceId, String reservationId, boolean forSystemVms) { _ipAllocDao.releaseIpAddress(instanceId); From 423b5b4e266e889e5e2e23b89c5712569e696284 Mon Sep 17 00:00:00 2001 From: Daan Hoogland Date: Thu, 15 Jun 2023 15:56:09 +0200 Subject: [PATCH 3/8] rename occurances of NetworkModel from mgr to model --- .../java/com/cloud/hypervisor/hyperv/guru/HypervGuru.java | 6 +++--- .../com/cloud/hypervisor/guru/VmwareVmImplementer.java | 8 ++++---- .../java/com/cloud/network/guru/ControlNetworkGuru.java | 6 +++--- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/plugins/hypervisors/hyperv/src/main/java/com/cloud/hypervisor/hyperv/guru/HypervGuru.java b/plugins/hypervisors/hyperv/src/main/java/com/cloud/hypervisor/hyperv/guru/HypervGuru.java index 9c586619b232..c00ee70bf135 100644 --- a/plugins/hypervisors/hyperv/src/main/java/com/cloud/hypervisor/hyperv/guru/HypervGuru.java +++ b/plugins/hypervisors/hyperv/src/main/java/com/cloud/hypervisor/hyperv/guru/HypervGuru.java @@ -50,7 +50,7 @@ public class HypervGuru extends HypervisorGuruBase implements HypervisorGuru { @Inject private GuestOSDao _guestOsDao; @Inject HypervManager _hypervMgr; - @Inject NetworkModel _networkMgr; + @Inject NetworkModel networkModel; int MaxNicSupported = 8; @Override public final HypervisorType getHypervisorType() { @@ -120,7 +120,7 @@ else if (nicProfile.getTrafficType() == TrafficType.Control) { nicTo.setName(profile.getName()); try { - String mac = _networkMgr.getNextAvailableMacAddressInNetwork(networkId); + String mac = networkModel.getNextAvailableMacAddressInNetwork(networkId); nicTo.setMac(mac); } catch (InsufficientAddressCapacityException e) { throw new CloudRuntimeException("unable to allocate mac address on network: " + networkId); @@ -136,7 +136,7 @@ else if (nicProfile.getTrafficType() == TrafficType.Control) { nicTo.setBroadcastUri(profile.getBroadCastUri()); nicTo.setIsolationuri(profile.getIsolationUri()); - Integer networkRate = _networkMgr.getNetworkRate(network.getId(), null); + Integer networkRate = networkModel.getNetworkRate(network.getId(), null); nicTo.setNetworkRateMbps(networkRate); expandedNics[i] = nicTo; diff --git a/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/guru/VmwareVmImplementer.java b/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/guru/VmwareVmImplementer.java index aef50d2c2524..100e3d416a71 100644 --- a/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/guru/VmwareVmImplementer.java +++ b/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/guru/VmwareVmImplementer.java @@ -72,7 +72,7 @@ class VmwareVmImplementer { @Inject NetworkDao networkDao; @Inject - NetworkModel networkMgr; + NetworkModel networkModel; @Inject NicDao nicDao; @Inject @@ -237,7 +237,7 @@ private void configureDomainRouterNicsAndDetails(VirtualMachineProfile vm, Virtu nicTo.setNetmask("255.255.255.255"); try { - String mac = networkMgr.getNextAvailableMacAddressInNetwork(networkId); + String mac = networkModel.getNextAvailableMacAddressInNetwork(networkId); nicTo.setMac(mac); } catch (InsufficientAddressCapacityException e) { throw new CloudRuntimeException("unable to allocate mac address on network: " + networkId); @@ -253,7 +253,7 @@ private void configureDomainRouterNicsAndDetails(VirtualMachineProfile vm, Virtu nicTo.setBroadcastUri(publicNicProfile.getBroadCastUri()); nicTo.setIsolationuri(publicNicProfile.getIsolationUri()); - Integer networkRate = networkMgr.getNetworkRate(network.getId(), null); + Integer networkRate = networkModel.getNetworkRate(network.getId(), null); nicTo.setNetworkRateMbps(networkRate); expandedNics[i] = nicTo; @@ -296,7 +296,7 @@ private List getNicProfiles(VirtualMachineProfile vm, Map Date: Thu, 15 Jun 2023 16:11:50 +0200 Subject: [PATCH 4/8] remove unused code --- .../entity/api/db/dao/EngineDataCenterDaoImpl.java | 4 ---- .../src/main/java/com/cloud/dc/dao/DataCenterDaoImpl.java | 5 +---- .../src/main/java/com/cloud/network/dao/NetworkDaoImpl.java | 3 --- .../db/src/main/java/com/cloud/utils/db/SequenceFetcher.java | 4 ++-- 4 files changed, 3 insertions(+), 13 deletions(-) diff --git a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineDataCenterDaoImpl.java b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineDataCenterDaoImpl.java index 1c1cadb253d2..be7d8c8a5995 100644 --- a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineDataCenterDaoImpl.java +++ b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineDataCenterDaoImpl.java @@ -66,7 +66,6 @@ public class EngineDataCenterDaoImpl extends GenericDaoBase implem protected long _prefix; protected Random _rand = new Random(System.currentTimeMillis()); - protected TableGenerator _tgMacAddress; + @Override public DataCenterVO findByName(String name) { @@ -329,9 +329,6 @@ public DataCenterDaoImpl() { TokenSearch = createSearchBuilder(); TokenSearch.and("zoneToken", TokenSearch.entity().getZoneToken(), SearchCriteria.Op.EQ); TokenSearch.done(); - - _tgMacAddress = _tgs.get("macAddress"); - assert _tgMacAddress != null : "Couldn't get mac address table generator"; } @Override 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 502ddfa7a7cd..fa448b026e45 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 @@ -436,9 +436,6 @@ public String getNextAvailableMacAddress(final long networkConfigId, Integer zon if(zoneMacIdentifier != null && zoneMacIdentifier.intValue() != 0 ){ seq = seq | _prefix << 40 | (long)zoneMacIdentifier << 32 | networkConfigId << 16 & 0x00000000ffff0000l; } - else { - seq = seq | _prefix << 40 | _rand.nextInt(Short.MAX_VALUE) << 16 & 0x00000000ffff0000l; - } return NetUtils.long2Mac(seq); } diff --git a/framework/db/src/main/java/com/cloud/utils/db/SequenceFetcher.java b/framework/db/src/main/java/com/cloud/utils/db/SequenceFetcher.java index 7785d5665703..0ea8401a03cc 100644 --- a/framework/db/src/main/java/com/cloud/utils/db/SequenceFetcher.java +++ b/framework/db/src/main/java/com/cloud/utils/db/SequenceFetcher.java @@ -59,7 +59,7 @@ public T getRandomNextSequence(Class clazz, TableGenerator tg) { } public T getNextSequence(Class clazz, TableGenerator tg, Object key, boolean isRandom) { - Future future = _executors.submit(new Fetcher(clazz, tg, key, isRandom)); + Future future = _executors.submit(new Fetcher<>(clazz, tg, key, isRandom)); try { return future.get(); } catch (Exception e) { @@ -69,7 +69,7 @@ public T getNextSequence(Class clazz, TableGenerator tg, Object key, bool } protected SequenceFetcher() { - _executors = new ThreadPoolExecutor(100, 100, 120l, TimeUnit.SECONDS, new LinkedBlockingQueue(250), new NamedThreadFactory("SequenceFetcher")); + _executors = new ThreadPoolExecutor(100, 100, 120l, TimeUnit.SECONDS, new LinkedBlockingQueue<>(250), new NamedThreadFactory("SequenceFetcher")); } protected static final SequenceFetcher s_instance = new SequenceFetcher(); From 6c7b6c3809e06c72d7d566dba17f0fd6d78b3182 Mon Sep 17 00:00:00 2001 From: Daan Hoogland Date: Fri, 16 Jun 2023 09:27:31 +0200 Subject: [PATCH 5/8] imports --- .../datacenter/entity/api/db/dao/EngineDataCenterDaoImpl.java | 3 --- .../src/main/java/com/cloud/dc/dao/DataCenterDaoImpl.java | 3 --- 2 files changed, 6 deletions(-) diff --git a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineDataCenterDaoImpl.java b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineDataCenterDaoImpl.java index be7d8c8a5995..f4b2362d0557 100644 --- a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineDataCenterDaoImpl.java +++ b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineDataCenterDaoImpl.java @@ -23,7 +23,6 @@ import javax.inject.Inject; import javax.naming.ConfigurationException; -import javax.persistence.TableGenerator; import org.apache.log4j.Logger; import org.springframework.stereotype.Component; @@ -39,10 +38,8 @@ import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; -import com.cloud.utils.db.SequenceFetcher; import com.cloud.utils.db.TransactionLegacy; import com.cloud.utils.db.UpdateBuilder; -import com.cloud.utils.net.NetUtils; /** * @config diff --git a/engine/schema/src/main/java/com/cloud/dc/dao/DataCenterDaoImpl.java b/engine/schema/src/main/java/com/cloud/dc/dao/DataCenterDaoImpl.java index afe2c9ec1b78..0c75568cd812 100644 --- a/engine/schema/src/main/java/com/cloud/dc/dao/DataCenterDaoImpl.java +++ b/engine/schema/src/main/java/com/cloud/dc/dao/DataCenterDaoImpl.java @@ -24,7 +24,6 @@ import javax.inject.Inject; import javax.naming.ConfigurationException; -import javax.persistence.TableGenerator; import org.apache.commons.collections.CollectionUtils; import org.apache.log4j.Logger; @@ -45,9 +44,7 @@ import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; -import com.cloud.utils.db.SequenceFetcher; import com.cloud.utils.db.TransactionLegacy; -import com.cloud.utils.net.NetUtils; /** * @config From 884731e736ce6f026aa397fe9f601fd2c689bfe9 Mon Sep 17 00:00:00 2001 From: Daan Hoogland Date: Mon, 19 Jun 2023 10:12:15 +0200 Subject: [PATCH 6/8] check for existence of MAC in NICs table --- .../java/com/cloud/network/NetworkModel.java | 7 +++++++ .../src/main/java/com/cloud/vm/dao/NicDao.java | 2 +- .../main/java/com/cloud/vm/dao/NicDaoImpl.java | 3 +-- .../network/vm/NetScalerVMManagerImpl.java | 2 +- .../com/cloud/network/NetworkModelImpl.java | 18 +++++++++++------- 5 files changed, 21 insertions(+), 11 deletions(-) diff --git a/api/src/main/java/com/cloud/network/NetworkModel.java b/api/src/main/java/com/cloud/network/NetworkModel.java index 882187fec787..77879a08d07c 100644 --- a/api/src/main/java/com/cloud/network/NetworkModel.java +++ b/api/src/main/java/com/cloud/network/NetworkModel.java @@ -114,6 +114,13 @@ public interface NetworkModel { List getNics(long vmId); + /** + * gets the next available MAC and checks it for global uniqueness in the nics table. It will keep looking till it fins a nic to use. + * + * @param networkConfigurationId the id of the network to use the nic in. used for finding the zone + * @return a string containing a MAC address + * @throws InsufficientAddressCapacityException if no MAC can be returned + */ String getNextAvailableMacAddressInNetwork(long networkConfigurationId) throws InsufficientAddressCapacityException; PublicIpAddress getPublicIpAddress(long ipAddressId); 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 fc2da6124cfc..c52c690d8b54 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 @@ -87,7 +87,7 @@ public interface NicDao extends GenericDao { List listByVmIdAndKeyword(long instanceId, String keyword); - NicVO findByInstanceIdAndMacAddress(long instanceId, String macAddress); + NicVO findByMacAddress(String macAddress); List findNicsByIpv6GatewayIpv6CidrAndReserver(String ipv6Gateway, String ipv6Cidr, String reserverName); 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 3b669aa526ba..c8efc074a106 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 @@ -368,9 +368,8 @@ public List listByVmIdAndKeyword(long instanceId, String keyword) { } @Override - public NicVO findByInstanceIdAndMacAddress(long instanceId, String macAddress) { + public NicVO findByMacAddress(String macAddress) { SearchCriteria sc = AllFieldsSearch.create(); - sc.setParameters("instance", instanceId); sc.setParameters("macAddress", macAddress); return findOneBy(sc); } diff --git a/plugins/network-elements/netscaler/src/main/java/com/cloud/network/vm/NetScalerVMManagerImpl.java b/plugins/network-elements/netscaler/src/main/java/com/cloud/network/vm/NetScalerVMManagerImpl.java index 9509e86212d9..2293ccbbaa55 100644 --- a/plugins/network-elements/netscaler/src/main/java/com/cloud/network/vm/NetScalerVMManagerImpl.java +++ b/plugins/network-elements/netscaler/src/main/java/com/cloud/network/vm/NetScalerVMManagerImpl.java @@ -324,7 +324,7 @@ public Map deployNsVpx(Account owner, DeployDestination dest, De defaultNic2.setIPv4Address(""); defaultNic2.setIPv4Gateway(""); defaultNic2.setIPv4Netmask(""); - String macAddress = _networkDao.getNextAvailableMacAddress(defaultPublicNetwork.getId(), Long.valueOf(defaultPublicNetwork.getDataCenterId()).intValue()); + String macAddress = _networkModel.getNextAvailableMacAddressInNetwork(defaultPublicNetwork.getId()); defaultNic2.setMacAddress(macAddress); networks.put(_networkMgr.setupNetwork(_accountMgr.getSystemAccount(), _networkOfferingDao.findByUniqueName(NetworkOffering.SystemPublicNetwork), plan, null, null, false).get(0), diff --git a/server/src/main/java/com/cloud/network/NetworkModelImpl.java b/server/src/main/java/com/cloud/network/NetworkModelImpl.java index 54df102ea816..f6d577dc1ab2 100644 --- a/server/src/main/java/com/cloud/network/NetworkModelImpl.java +++ b/server/src/main/java/com/cloud/network/NetworkModelImpl.java @@ -80,7 +80,6 @@ import com.cloud.network.dao.NetworkAccountDao; import com.cloud.network.dao.NetworkAccountVO; import com.cloud.network.dao.NetworkDao; -import com.cloud.network.dao.NetworkDetailsDao; import com.cloud.network.dao.NetworkDomainDao; import com.cloud.network.dao.NetworkDomainVO; import com.cloud.network.dao.NetworkServiceMapDao; @@ -172,8 +171,6 @@ public class NetworkModelImpl extends ManagerBase implements NetworkModel, Confi @Inject NetworkDao _networksDao = null; @Inject - NetworkDetailsDao networkDetailsDao; - @Inject NicDao _nicDao = null; @Inject PodVlanMapDao _podVlanMapDao; @@ -597,13 +594,20 @@ public String getNextAvailableMacAddressInNetwork(long networkId) throws Insuffi if (zoneIdentifyer.intValue() == 0) { zoneIdentifyer = Long.valueOf(network.getDataCenterId()).intValue(); } - String mac = _networksDao.getNextAvailableMacAddress(networkId, zoneIdentifyer); - if (mac == null) { - throw new InsufficientAddressCapacityException("Unable to create another mac address", Network.class, networkId); - } + String mac; + do { + mac = _networksDao.getNextAvailableMacAddress(networkId, zoneIdentifyer); + if (mac == null) { + throw new InsufficientAddressCapacityException("Unable to create another mac address", Network.class, networkId); + } + } while(isMACUnique(mac)); return mac; } + private boolean isMACUnique(String mac) { + return (_nicDao.findByMacAddress(mac) == null); + } + @Override @DB public Network getNetwork(long id) { From 9ccc3f7d850c57f7700dbde385d19010fee45db3 Mon Sep 17 00:00:00 2001 From: dahn Date: Wed, 21 Jun 2023 07:26:35 +0200 Subject: [PATCH 7/8] Apply suggestions from code review Co-authored-by: Bryan Lima <42067040+BryanMLima@users.noreply.github.com> --- api/src/main/java/com/cloud/network/NetworkModel.java | 2 +- .../src/main/java/com/cloud/network/NetworkModelImpl.java | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/api/src/main/java/com/cloud/network/NetworkModel.java b/api/src/main/java/com/cloud/network/NetworkModel.java index 77879a08d07c..96f38b64bcdd 100644 --- a/api/src/main/java/com/cloud/network/NetworkModel.java +++ b/api/src/main/java/com/cloud/network/NetworkModel.java @@ -115,7 +115,7 @@ public interface NetworkModel { List getNics(long vmId); /** - * gets the next available MAC and checks it for global uniqueness in the nics table. It will keep looking till it fins a nic to use. + * Gets the next available MAC and checks it for global uniqueness in the nics table. It will keep looking until it finds a MAC address that is unique. * * @param networkConfigurationId the id of the network to use the nic in. used for finding the zone * @return a string containing a MAC address diff --git a/server/src/main/java/com/cloud/network/NetworkModelImpl.java b/server/src/main/java/com/cloud/network/NetworkModelImpl.java index f6d577dc1ab2..37088e515af6 100644 --- a/server/src/main/java/com/cloud/network/NetworkModelImpl.java +++ b/server/src/main/java/com/cloud/network/NetworkModelImpl.java @@ -590,13 +590,13 @@ public List getNics(long vmId) { @Override public String getNextAvailableMacAddressInNetwork(long networkId) throws InsufficientAddressCapacityException { NetworkVO network = _networksDao.findById(networkId); - Integer zoneIdentifyer = MACIdentifier.value(); - if (zoneIdentifyer.intValue() == 0) { - zoneIdentifyer = Long.valueOf(network.getDataCenterId()).intValue(); + Integer zoneIdentifier = MACIdentifier.value(); + if (zoneIdentifier.intValue() == 0) { + zoneIdentifier = Long.valueOf(network.getDataCenterId()).intValue(); } String mac; do { - mac = _networksDao.getNextAvailableMacAddress(networkId, zoneIdentifyer); + mac = _networksDao.getNextAvailableMacAddress(networkId, zoneIdentifier); if (mac == null) { throw new InsufficientAddressCapacityException("Unable to create another mac address", Network.class, networkId); } From 016c5508f5065d7f7e2f20b3e0444d0d415e6ea4 Mon Sep 17 00:00:00 2001 From: dahn Date: Thu, 13 Jul 2023 13:22:36 +0200 Subject: [PATCH 8/8] Update server/src/main/java/com/cloud/network/NetworkModelImpl.java --- server/src/main/java/com/cloud/network/NetworkModelImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/main/java/com/cloud/network/NetworkModelImpl.java b/server/src/main/java/com/cloud/network/NetworkModelImpl.java index 37088e515af6..beb416cab574 100644 --- a/server/src/main/java/com/cloud/network/NetworkModelImpl.java +++ b/server/src/main/java/com/cloud/network/NetworkModelImpl.java @@ -600,7 +600,7 @@ public String getNextAvailableMacAddressInNetwork(long networkId) throws Insuffi if (mac == null) { throw new InsufficientAddressCapacityException("Unable to create another mac address", Network.class, networkId); } - } while(isMACUnique(mac)); + } while(! isMACUnique(mac)); return mac; }