From 64eeb8d79ba1dbb04b02ab69de786944b56a3207 Mon Sep 17 00:00:00 2001 From: alena Date: Tue, 2 Aug 2011 17:36:41 -0700 Subject: [PATCH] bug 10869: always allocate first ip address from the range for the dhcp server. status 10869: resolved fixed Here is the flow (design is approved by Will Chan): 1) If user specifies custom ip address, and this ip is not the first ip in the range, the dhcp server gets the ip. 2) If user specifies custom ip address, and this ip is the first ip in the range, the dhcp server will get the random ip address from the range. 2) If user doesn't specify custom ip address, we always try to allocate first ip address from the range for the dhcp server; if this ip is already allocated, the dhcp server will get the random ip from the range. This will work for: * domR's Guest network * dhcp's Direct network --- .../src/com/cloud/network/NetworkManager.java | 2 ++ .../com/cloud/network/NetworkManagerImpl.java | 22 +++++++++++++++++++ .../VirtualNetworkApplianceManagerImpl.java | 16 +++++++++++--- 3 files changed, 37 insertions(+), 3 deletions(-) diff --git a/server/src/com/cloud/network/NetworkManager.java b/server/src/com/cloud/network/NetworkManager.java index f2afeca5e95..c46f2b6728e 100644 --- a/server/src/com/cloud/network/NetworkManager.java +++ b/server/src/com/cloud/network/NetworkManager.java @@ -208,4 +208,6 @@ public interface NetworkManager extends NetworkService { public String acquireGuestIpAddress(Network network, String requestedIp); String getGlobalGuestDomainSuffix(); + + String getStartIpAddress(long networkId); } diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index c37efda5dc7..b754bcb9077 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -3131,4 +3131,26 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag public String getGlobalGuestDomainSuffix() { return _networkDomain; } + + @Override + public String getStartIpAddress(long networkId) { + List vlans = _vlanDao.listVlansByNetworkId(networkId); + if (vlans.isEmpty()) { + return null; + } + + String startIP = vlans.get(0).getIpRange().split("-")[0]; + + for (VlanVO vlan : vlans) { + String startIP1 = vlan.getIpRange().split("-")[0]; + long startIPLong = NetUtils.ip2Long(startIP); + long startIPLong1 = NetUtils.ip2Long(startIP1); + + if (startIPLong1 < startIPLong) { + startIP = startIP1; + } + } + + return startIP; + } } diff --git a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java index f4c6be44169..62669fac4c9 100755 --- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java +++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java @@ -75,7 +75,6 @@ import com.cloud.dc.DataCenterVO; import com.cloud.dc.HostPodVO; import com.cloud.dc.dao.AccountVlanMapDao; import com.cloud.dc.dao.DataCenterDao; -import com.cloud.dc.dao.DcDetailsDaoImpl; import com.cloud.dc.dao.HostPodDao; import com.cloud.dc.dao.VlanDao; import com.cloud.deploy.DataCenterDeployment; @@ -143,8 +142,8 @@ import com.cloud.service.ServiceOfferingVO; import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.storage.StorageManager; import com.cloud.storage.VMTemplateVO; -import com.cloud.storage.VolumeVO; import com.cloud.storage.Volume.Type; +import com.cloud.storage.VolumeVO; import com.cloud.storage.dao.GuestOSDao; import com.cloud.storage.dao.VMTemplateDao; import com.cloud.storage.dao.VMTemplateHostDao; @@ -1058,7 +1057,18 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian NetworkVO controlConfig = _networkMgr.setupNetwork(_systemAcct, controlOffering, plan, null, null, false, false).get(0); List> networks = new ArrayList>(3); - NicProfile gatewayNic = new NicProfile(); + + String defaultNetworkStartIp = null; + if (guestNetwork.getCidr() != null) { + String startIp = _networkMgr.getStartIpAddress(guestNetwork.getId()); + if (_ipAddressDao.findByIpAndSourceNetworkId(guestNetwork.getId(), startIp).getAllocatedTime() == null) { + defaultNetworkStartIp = startIp; + } else if (s_logger.isDebugEnabled()){ + s_logger.debug("First ip " + startIp + " in network id=" + guestNetwork.getId() + " is already allocated, can't use it for domain router; will get random ip address from the range"); + } + } + + NicProfile gatewayNic = new NicProfile(defaultNetworkStartIp); gatewayNic.setDefaultNic(true); networks.add(new Pair((NetworkVO) guestNetwork, gatewayNic)); networks.add(new Pair(controlConfig, null));