From a35c5ed1022b8786d1eb332bc34aa59fb3f3a895 Mon Sep 17 00:00:00 2001 From: alena Date: Mon, 7 Mar 2011 17:03:50 -0800 Subject: [PATCH] bug 8146: Multiple network case (default network is Virtual) - for Direct networks dhcp servers set dns to the eth0 ip address of the domR belonging to virtualNetwork bug 8146: resolved fixed --- api/src/com/cloud/network/NetworkService.java | 2 - api/src/com/cloud/vm/NicProfile.java | 1 + .../src/com/cloud/network/NetworkManager.java | 1 + .../com/cloud/network/NetworkManagerImpl.java | 38 +++++++++++++++++++ .../cloud/network/guru/DirectNetworkGuru.java | 3 +- .../VirtualNetworkApplianceManagerImpl.java | 27 +++++++++---- server/src/com/cloud/vm/dao/NicDao.java | 3 ++ server/src/com/cloud/vm/dao/NicDaoImpl.java | 10 +++++ 8 files changed, 75 insertions(+), 10 deletions(-) diff --git a/api/src/com/cloud/network/NetworkService.java b/api/src/com/cloud/network/NetworkService.java index 5726543ce05..d6c86f61c0f 100644 --- a/api/src/com/cloud/network/NetworkService.java +++ b/api/src/com/cloud/network/NetworkService.java @@ -25,7 +25,6 @@ import com.cloud.api.commands.CreateNetworkCmd; import com.cloud.api.commands.DisassociateIPAddrCmd; import com.cloud.api.commands.ListNetworksCmd; import com.cloud.api.commands.RestartNetworkCmd; -import com.cloud.deploy.DeployDestination; import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.InsufficientAddressCapacityException; import com.cloud.exception.InsufficientCapacityException; @@ -36,7 +35,6 @@ import com.cloud.exception.ResourceUnavailableException; import com.cloud.network.Network.Capability; import com.cloud.network.Network.Service; import com.cloud.offering.NetworkOffering; -import com.cloud.vm.ReservationContext; public interface NetworkService { diff --git a/api/src/com/cloud/vm/NicProfile.java b/api/src/com/cloud/vm/NicProfile.java index 7a2b5a4b7f9..3cc64fb3df1 100644 --- a/api/src/com/cloud/vm/NicProfile.java +++ b/api/src/com/cloud/vm/NicProfile.java @@ -203,6 +203,7 @@ public class NicProfile { this.isolationUri = isolationUri; this.netmask = nic.getNetmask(); this.isSecurityGroupEnabled = network.isSecurityGroupEnabled(); + this.vmId = nic.getInstanceId(); if (networkRate != null) { this.networkRate = networkRate; diff --git a/server/src/com/cloud/network/NetworkManager.java b/server/src/com/cloud/network/NetworkManager.java index 8ed9903cfa0..83edf818289 100644 --- a/server/src/com/cloud/network/NetworkManager.java +++ b/server/src/com/cloud/network/NetworkManager.java @@ -183,4 +183,5 @@ public interface NetworkManager extends NetworkService { boolean startNetwork(long networkId, DeployDestination dest, ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException; + String getIpOfNetworkElementInVirtualNetwork(long accountId, long dataCenterId); } diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index ac27502af58..5a0937f529a 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -20,6 +20,7 @@ package com.cloud.network; import java.net.URI; import java.util.ArrayList; import java.util.Arrays; +import java.util.Comparator; import java.util.Date; import java.util.HashMap; import java.util.Iterator; @@ -138,6 +139,8 @@ import com.cloud.vm.VirtualMachineProfile; import com.cloud.vm.dao.NicDao; import com.cloud.vm.dao.UserVmDao; +import edu.emory.mathcs.backport.java.util.Collections; + /** * NetworkManagerImpl implements NetworkManager. */ @@ -1148,6 +1151,19 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag @Override public void prepare(VirtualMachineProfile vmProfile, DeployDestination dest, ReservationContext context) throws InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException { List nics = _nicDao.listByVmId(vmProfile.getId()); + + // we have to implement default nics first - to ensure that default network elements start up first in multiple nics case) + // (need for setting DNS on Dhcp to domR's Ip4 address) + Collections.sort(nics, new Comparator() { + + public int compare(NicVO nic1, NicVO nic2){ + boolean isDefault1 = getNetwork(nic1.getNetworkId()).isDefault(); + boolean isDefault2 = getNetwork(nic2.getNetworkId()).isDefault(); + + return (isDefault1 ^ isDefault2) ? ((isDefault1 ^ true) ? 1 : -1) : 0; + } + }); + for (NicVO nic : nics) { Pair implemented = implementNetwork(nic.getNetworkId(), dest, context); NetworkGuru concierge = implemented.first(); @@ -2538,4 +2554,26 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag return success; } + + @Override + public String getIpOfNetworkElementInVirtualNetwork(long accountId, long dataCenterId) { + + List virtualNetworks = _networksDao.listBy(accountId, dataCenterId , GuestIpType.Virtual); + + if (virtualNetworks.isEmpty()) { + s_logger.trace("Unable to find default Virtual network account id=" + accountId); + return null; + } + + NetworkVO virtualNetwork = virtualNetworks.get(0); + + NicVO networkElementNic = _nicDao.findByNetworkIdAndType(virtualNetwork.getId(), Type.DomainRouter); + + if (networkElementNic != null) { + return networkElementNic.getIp4Address(); + } else { + s_logger.warn("Unable to set find network element for the network id=" + virtualNetwork.getId()); + return null; + } + } } diff --git a/server/src/com/cloud/network/guru/DirectNetworkGuru.java b/server/src/com/cloud/network/guru/DirectNetworkGuru.java index 2435076431e..18c8b07cf8c 100644 --- a/server/src/com/cloud/network/guru/DirectNetworkGuru.java +++ b/server/src/com/cloud/network/guru/DirectNetworkGuru.java @@ -145,6 +145,7 @@ public class DirectNetworkGuru extends AdapterBase implements NetworkGuru { nic.setReservationId(String.valueOf(ip.getVlanTag())); nic.setMacAddress(ip.getMacAddress()); } + nic.setDns1(dc.getDns1()); nic.setDns2(dc.getDns2()); } @@ -154,7 +155,7 @@ public class DirectNetworkGuru extends AdapterBase implements NetworkGuru { DataCenter dc = _dcDao.findById(network.getDataCenterId()); if (profile != null) { profile.setDns1(dc.getDns1()); - profile.setDns2(dc.getDns2()); + profile.setDns2(dc.getDns2()); } } diff --git a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java index f1d310f161d..25683393db8 100644 --- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java +++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java @@ -867,24 +867,25 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian buf.append(" template=domP type=" + type); buf.append(" name=").append(profile.getHostName()); NicProfile controlNic = null; + String defaultDns1 = null; + String defaultDns2 = null; for (NicProfile nic : profile.getNics()) { int deviceId = nic.getDeviceId(); buf.append(" eth").append(deviceId).append("ip=").append(nic.getIp4Address()); buf.append(" eth").append(deviceId).append("mask=").append(nic.getNetmask()); if (nic.isDefaultNic()) { - buf.append(" gateway=").append(nic.getGateway()); - buf.append(" dns1=").append(nic.getDns1()); - if (nic.getDns2() != null) { - buf.append(" dns2=").append(nic.getDns2()); - } + buf.append(" gateway=").append(nic.getGateway()); + defaultDns1 = nic.getDns1(); + defaultDns2 = nic.getDns2(); + if (dc.getNetworkType() == NetworkType.Basic) { long cidrSize = NetUtils.getCidrSize(nic.getNetmask()); String cidr = NetUtils.getCidrSubNet(nic.getGateway(), cidrSize); if (cidr != null) { dhcpRange = NetUtils.getIpRangeStartIpFromCidr(cidr, cidrSize); } - } + } } if (nic.getTrafficType() == TrafficType.Management) { buf.append(" localgw=").append(dest.getPod().getGateway()); @@ -924,13 +925,25 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian String domain = network.getNetworkDomain(); if (domain != null) { buf.append(" domain=" + domain); - } + } if (!network.isDefault() && network.getGuestType() == GuestIpType.Direct) { buf.append(" defaultroute=false"); + + String virtualNetworkElementNicIP = _networkMgr.getIpOfNetworkElementInVirtualNetwork(network.getAccountId(), network.getDataCenterId()); + if (!network.isShared() && virtualNetworkElementNicIP != null) { + defaultDns1 = virtualNetworkElementNicIP; + } else { + s_logger.debug("No Virtual network found for account id=" + network.getAccountId() + " so setting dns to the dns of the network id=" + network.getId()); + } } else { buf.append(" defaultroute=true"); } + + buf.append(" dns1=").append(defaultDns1); + if (defaultDns2 != null) { + buf.append(" dns2=").append(defaultDns2); + } if (s_logger.isDebugEnabled()) { s_logger.debug("Boot Args for " + profile + ": " + buf.toString()); diff --git a/server/src/com/cloud/vm/dao/NicDao.java b/server/src/com/cloud/vm/dao/NicDao.java index 6d526660da5..43eeca36671 100644 --- a/server/src/com/cloud/vm/dao/NicDao.java +++ b/server/src/com/cloud/vm/dao/NicDao.java @@ -7,6 +7,7 @@ import java.util.List; import com.cloud.utils.db.GenericDao; import com.cloud.vm.NicVO; +import com.cloud.vm.VirtualMachine; public interface NicDao extends GenericDao { List listByVmId(long instanceId); @@ -23,4 +24,6 @@ public interface NicDao extends GenericDao { NicVO findByInstanceIdAndNetworkIdIncludingRemoved(long networkId, long instanceId); void removeNicsForInstance(long instanceId); + + NicVO findByNetworkIdAndType(long networkId, VirtualMachine.Type vmType); } diff --git a/server/src/com/cloud/vm/dao/NicDaoImpl.java b/server/src/com/cloud/vm/dao/NicDaoImpl.java index 8b8e0903bd4..ccdb5d5ace1 100644 --- a/server/src/com/cloud/vm/dao/NicDaoImpl.java +++ b/server/src/com/cloud/vm/dao/NicDaoImpl.java @@ -14,6 +14,7 @@ import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.db.SearchCriteria.Func; import com.cloud.utils.db.SearchCriteria.Op; import com.cloud.vm.NicVO; +import com.cloud.vm.VirtualMachine; @Local(value=NicDao.class) public class NicDaoImpl extends GenericDaoBase implements NicDao { @@ -26,6 +27,7 @@ public class NicDaoImpl extends GenericDaoBase implements NicDao { AllFieldsSearch = createSearchBuilder(); AllFieldsSearch.and("instance", AllFieldsSearch.entity().getInstanceId(), Op.EQ); AllFieldsSearch.and("network", AllFieldsSearch.entity().getNetworkId(), Op.EQ); + AllFieldsSearch.and("vmType", AllFieldsSearch.entity().getVmType(), Op.EQ); AllFieldsSearch.done(); IpSearch = createSearchBuilder(String.class); @@ -93,4 +95,12 @@ public class NicDaoImpl extends GenericDaoBase implements NicDao { sc.addAnd("instanceId", SearchCriteria.Op.EQ, instanceId); return findOneIncludingRemovedBy(sc); } + + @Override + public NicVO findByNetworkIdAndType(long networkId, VirtualMachine.Type vmType) { + SearchCriteria sc = AllFieldsSearch.create(); + sc.setParameters("network", networkId); + sc.setParameters("vmType", vmType); + return findOneBy(sc); + } }