diff --git a/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java b/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java index 95fe2970c1a..ae8e2581fea 100644 --- a/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java +++ b/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java @@ -72,6 +72,8 @@ import com.cloud.agent.api.BackupSnapshotAnswer; import com.cloud.agent.api.BackupSnapshotCommand; import com.cloud.agent.api.CheckHealthAnswer; import com.cloud.agent.api.CheckHealthCommand; +import com.cloud.agent.api.CheckNetworkAnswer; +import com.cloud.agent.api.CheckNetworkCommand; import com.cloud.agent.api.CheckStateCommand; import com.cloud.agent.api.CheckVirtualMachineAnswer; import com.cloud.agent.api.CheckVirtualMachineCommand; @@ -179,6 +181,7 @@ import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.network.Networks.BroadcastDomainType; import com.cloud.network.Networks.RouterPrivateIpStrategy; import com.cloud.network.Networks.TrafficType; +import com.cloud.network.PhysicalNetworkSetupInfo; import com.cloud.resource.ServerResource; import com.cloud.resource.ServerResourceBase; import com.cloud.storage.Storage; @@ -718,6 +721,15 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv } return new Pair(privPif, pubPif); } + + private boolean checkNetwork(String networkName) { + String name = Script.runSimpleBashScript("brctl show | grep " + networkName + " | awk '{print $4}'"); + if (name == null) { + return false; + } else { + return true; + } + } private String getVnetId(String vnetId) { return vnetId; } @@ -935,6 +947,8 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv return execute((CleanupNetworkRulesCmd)cmd); } else if (cmd instanceof CopyVolumeCommand) { return execute((CopyVolumeCommand)cmd); + } else if (cmd instanceof CheckNetworkCommand) { + return execute((CheckNetworkCommand)cmd); } else { s_logger.warn("Unsupported command "); return Answer.createUnsupportedCommandAnswer(cmd); @@ -944,7 +958,28 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv } } - + private CheckNetworkAnswer execute(CheckNetworkCommand cmd) { + List phyNics = cmd.getPhysicalNetworkInfoList(); + String errMsg = null; + for (PhysicalNetworkSetupInfo nic : phyNics) { + if (!checkNetwork(nic.getGuestNetworkName())) { + errMsg = "Can not find network: " + nic.getGuestNetworkName(); + break; + } else if (!checkNetwork(nic.getPrivateNetworkName())) { + errMsg = "Can not find network: " + nic.getPrivateNetworkName(); + break; + } else if (!checkNetwork(nic.getPublicNetworkName())) { + errMsg = "Can not find network: " + nic.getPublicNetworkName(); + break; + } + } + + if (errMsg != null) { + return new CheckNetworkAnswer(cmd, false, errMsg); + } else { + return new CheckNetworkAnswer(cmd, true, null); + } + } private CopyVolumeAnswer execute(CopyVolumeCommand cmd) { boolean copyToSecondary = cmd.toSecondaryStorage(); String volumePath = cmd.getVolumePath(); diff --git a/cloud.spec b/cloud.spec index 54f1a00ac14..c67de8f8625 100644 --- a/cloud.spec +++ b/cloud.spec @@ -224,6 +224,7 @@ Requires: %{name}-daemonize Requires: /sbin/service Requires: /sbin/chkconfig Requires: jna +Requires: ebtables Group: System Environment/Libraries Requires: kvm diff --git a/python/lib/cloudutils/syscfg.py b/python/lib/cloudutils/syscfg.py index 548968c56a6..256991a93c7 100755 --- a/python/lib/cloudutils/syscfg.py +++ b/python/lib/cloudutils/syscfg.py @@ -72,7 +72,7 @@ class sysConfig(object): class sysConfigAgent(sysConfig): def __init__(self, env): - super(sysConfigServer, self).__init__(env) + super(sysConfigAgent, self).__init__(env) def check(self): if self.env.debug: diff --git a/server/src/com/cloud/hypervisor/kvm/discoverer/KvmServerDiscoverer.java b/server/src/com/cloud/hypervisor/kvm/discoverer/KvmServerDiscoverer.java index 86f3946c94a..b474ca75abf 100755 --- a/server/src/com/cloud/hypervisor/kvm/discoverer/KvmServerDiscoverer.java +++ b/server/src/com/cloud/hypervisor/kvm/discoverer/KvmServerDiscoverer.java @@ -54,6 +54,9 @@ import com.cloud.host.dao.HostDao; import com.cloud.hypervisor.Hypervisor; import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.hypervisor.kvm.resource.KvmDummyResourceBase; +import com.cloud.network.NetworkManager; +import com.cloud.network.PhysicalNetworkSetupInfo; +import com.cloud.network.PhysicalNetworkVO; import com.cloud.resource.Discoverer; import com.cloud.resource.DiscovererBase; import com.cloud.resource.ResourceManager; @@ -83,6 +86,7 @@ public class KvmServerDiscoverer extends DiscovererBase implements Discoverer, @Inject ClusterDao _clusterDao; @Inject ResourceManager _resourceMgr; @Inject AgentManager _agentMgr; + @Inject NetworkManager _networkMgr; @Override public boolean processAnswers(long agentId, long seq, Answer[] answers) { @@ -177,6 +181,19 @@ public class KvmServerDiscoverer extends DiscovererBase implements Discoverer, return null; } + List networks = _networkMgr.getPhysicalNetworkInfo(dcId, HypervisorType.KVM); + if (networks.size() < 1) { + _kvmPublicNic = "cloudbr0"; + _kvmPrivateNic = "cloudbr0"; + _kvmGuestNic = "cloudbr0"; + s_logger.debug("Can't find physical network devices on zone: " + dcId + ", use the default cloudbr0"); + } else { + PhysicalNetworkSetupInfo network = networks.get(0); + _kvmPublicNic = network.getPublicNetworkName(); + _kvmPrivateNic = network.getPrivateNetworkName(); + _kvmGuestNic = network.getGuestNetworkName(); + } + String parameters = " -m " + _hostIp + " -z " + dcId + " -p " + podId + " -c " + clusterId + " -g " + guid + " -a"; if (_kvmPublicNic != null) { diff --git a/server/src/com/cloud/network/NetworkManager.java b/server/src/com/cloud/network/NetworkManager.java index dcbd8baf3e4..c7511feeb9f 100644 --- a/server/src/com/cloud/network/NetworkManager.java +++ b/server/src/com/cloud/network/NetworkManager.java @@ -253,4 +253,7 @@ public interface NetworkManager extends NetworkService { PhysicalNetworkServiceProvider addDefaultSecurityGroupProviderToPhysicalNetwork( long physicalNetworkId); + + List getPhysicalNetworkInfo(long dcId, + HypervisorType hypervisorType); } diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index f53e9938aad..d991e250b34 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -4750,6 +4750,32 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag public AgentControlAnswer processControlCommand(long agentId, AgentControlCommand cmd) { return null; } + + @Override + public List getPhysicalNetworkInfo(long dcId, HypervisorType hypervisorType) { + List networkInfoList = new ArrayList(); + List physicalNtwkList = _physicalNetworkDao.listByZone(dcId); + for(PhysicalNetworkVO pNtwk : physicalNtwkList){ + String publicName = _pNTrafficTypeDao.getNetworkTag(pNtwk.getId(), TrafficType.Public, hypervisorType); + String privateName = _pNTrafficTypeDao.getNetworkTag(pNtwk.getId(), TrafficType.Management, hypervisorType); + String guestName = _pNTrafficTypeDao.getNetworkTag(pNtwk.getId(), TrafficType.Guest, hypervisorType); + String storageName = _pNTrafficTypeDao.getNetworkTag(pNtwk.getId(), TrafficType.Storage, hypervisorType); + //String controlName = _pNTrafficTypeDao.getNetworkTag(pNtwk.getId(), TrafficType.Control, hypervisorType); + PhysicalNetworkSetupInfo info = new PhysicalNetworkSetupInfo(); + info.setPhysicalNetworkId(pNtwk.getId()); + info.setGuestNetworkName(guestName); + info.setPrivateNetworkName(privateName); + info.setPublicNetworkName(publicName); + info.setStorageNetworkName(storageName); + PhysicalNetworkTrafficTypeVO mgmtTraffic = _pNTrafficTypeDao.findBy(pNtwk.getId(), TrafficType.Management); + if(mgmtTraffic != null){ + String vlan = mgmtTraffic.getVlan(); + info.setMgmtVlan(vlan); + } + networkInfoList.add(info); + } + return networkInfoList; + } @Override public void processConnect(HostVO host, StartupCommand cmd, boolean forRebalance) throws ConnectionException {