From ac74adb465f94bed7dbe3744fa7cf26df415712e Mon Sep 17 00:00:00 2001 From: Sateesh Chodapuneedi Date: Sun, 13 May 2012 03:01:22 +0530 Subject: [PATCH] CS-9919 Support for Nexus Swiches (Cisco Vswitches) Description: Retreving physical network configuration from database. Passing configuration down to resource. Cleanup. --- .../vmware/manager/VmwareManager.java | 5 +- .../hypervisor/vmware/VmwareManagerImpl.java | 39 +++++- .../vmware/VmwareServerDiscoverer.java | 124 +++++++++++------- .../vmware/mo/HypervisorHostHelper.java | 15 +-- 4 files changed, 120 insertions(+), 63 deletions(-) diff --git a/core/src/com/cloud/hypervisor/vmware/manager/VmwareManager.java b/core/src/com/cloud/hypervisor/vmware/manager/VmwareManager.java index 0752298a979..b55514f7517 100755 --- a/core/src/com/cloud/hypervisor/vmware/manager/VmwareManager.java +++ b/core/src/com/cloud/hypervisor/vmware/manager/VmwareManager.java @@ -16,7 +16,6 @@ import java.io.File; import java.util.List; import java.util.Map; -//import com.cloud.cluster.CheckPointManager; import com.cloud.hypervisor.vmware.mo.HostMO; import com.cloud.hypervisor.vmware.util.VmwareContext; import com.cloud.utils.Pair; @@ -62,4 +61,8 @@ public interface VmwareManager { void endExclusiveOperation(); Map getNexusVSMCredentials(String hostGuid); + + boolean getNexusVSwitchGlobalParameter(); + + Map getNexusVSMCredentialsByClusterId(Long clusterId); } diff --git a/server/src/com/cloud/hypervisor/vmware/VmwareManagerImpl.java b/server/src/com/cloud/hypervisor/vmware/VmwareManagerImpl.java index 0346eae917c..9779994b0ac 100755 --- a/server/src/com/cloud/hypervisor/vmware/VmwareManagerImpl.java +++ b/server/src/com/cloud/hypervisor/vmware/VmwareManagerImpl.java @@ -61,7 +61,6 @@ import com.cloud.hypervisor.vmware.manager.VmwareStorageMount; import com.cloud.hypervisor.vmware.mo.DiskControllerType; import com.cloud.hypervisor.vmware.mo.HostFirewallSystemMO; import com.cloud.hypervisor.vmware.mo.HostMO; -import com.cloud.hypervisor.vmware.mo.HostVirtualNicType; import com.cloud.hypervisor.vmware.mo.HypervisorHostHelper; import com.cloud.hypervisor.vmware.mo.TaskMO; import com.cloud.hypervisor.vmware.mo.VirtualEthernetCardType; @@ -69,6 +68,7 @@ import com.cloud.hypervisor.vmware.mo.VmwareHostType; import com.cloud.hypervisor.vmware.resource.SshHelper; import com.cloud.hypervisor.vmware.util.VmwareContext; import com.cloud.network.CiscoNexusVSMDeviceVO; +import com.cloud.network.NetworkManager; import com.cloud.network.dao.CiscoNexusVSMDeviceDao; import com.cloud.network.router.VirtualNetworkApplianceManager; import com.cloud.org.Cluster.ClusterType; @@ -91,7 +91,6 @@ import com.cloud.utils.script.Script; import com.cloud.vm.DomainRouterVO; import com.google.gson.Gson; import com.vmware.apputils.vim25.ServiceUtil; -import com.vmware.vim25.AboutInfo; import com.vmware.vim25.HostConnectSpec; import com.vmware.vim25.HostPortGroupSpec; import com.vmware.vim25.ManagedObjectReference; @@ -110,6 +109,8 @@ public class VmwareManagerImpl implements VmwareManager, VmwareStorageMount, Lis private String _instance; @Inject AgentManager _agentMgr; + @Inject + protected NetworkManager _netMgr; @Inject HostDao _hostDao; @Inject ClusterDao _clusterDao; @Inject ClusterDetailsDao _clusterDetailsDao; @@ -132,7 +133,7 @@ public class VmwareManagerImpl implements VmwareManager, VmwareStorageMount, Lis String _privateNetworkVSwitchType; String _publicNetworkVSwitchType; String _guestNetworkVSwitchType; - Boolean _nexusVSwitchActive; + boolean _nexusVSwitchActive; String _serviceConsoleName; String _managemetPortGroupName; String _defaultSystemVmNicAdapterType = VirtualEthernetCardType.E1000.toString(); @@ -358,6 +359,10 @@ public class VmwareManagerImpl implements VmwareManager, VmwareStorageMount, Lis return _name; } + public boolean getNexusVSwitchGlobalParameter() { + return _nexusVSwitchActive; + } + @Override public String composeWorkerName() { return UUID.randomUUID().toString().replace("-", ""); @@ -367,6 +372,13 @@ public class VmwareManagerImpl implements VmwareManager, VmwareStorageMount, Lis public List addHostToPodCluster(VmwareContext serviceContext, long dcId, Long podId, Long clusterId, String hostInventoryPath) throws Exception { ManagedObjectReference mor = serviceContext.getHostMorByPath(hostInventoryPath); + String privateTrafficLabel = null; + if (_nexusVSwitchActive) { + privateTrafficLabel = serviceContext.getStockObject("privateTrafficLabel"); + if (privateTrafficLabel == null) { + privateTrafficLabel = _privateNetworkVSwitchName; + } + } if(mor != null) { List returnedHostList = new ArrayList(); @@ -392,12 +404,12 @@ public class VmwareManagerImpl implements VmwareManager, VmwareStorageMount, Lis if(spec.getVlanId() != 0) { vlanId = String.valueOf(spec.getVlanId()); } - + if(!_nexusVSwitchActive) { HypervisorHostHelper.prepareNetwork(_privateNetworkVSwitchName, "cloud.private", hostMo, vlanId, null, null, 180000, false); } else { - HypervisorHostHelper.prepareNetwork(_privateNetworkVSwitchName, "cloud.private", hostMo, vlanId, null, null, 180000); + HypervisorHostHelper.prepareNetwork(privateTrafficLabel, "cloud.private", hostMo, vlanId, null, null, 180000); } returnedHostList.add(hosts[0]); return returnedHostList; @@ -435,7 +447,7 @@ public class VmwareManagerImpl implements VmwareManager, VmwareStorageMount, Lis HypervisorHostHelper.prepareNetwork(_privateNetworkVSwitchName, "cloud.private", hostMo, vlanId, null, null, 180000, false); } else { - HypervisorHostHelper.prepareNetwork(_privateNetworkVSwitchName, "cloud.private", hostMo, vlanId, null, null, 180000); + HypervisorHostHelper.prepareNetwork(privateTrafficLabel, "cloud.private", hostMo, vlanId, null, null, 180000); } returnedHostList.add(morHost); } @@ -464,7 +476,7 @@ public class VmwareManagerImpl implements VmwareManager, VmwareStorageMount, Lis HypervisorHostHelper.prepareNetwork(_privateNetworkVSwitchName, "cloud.private", hostMo, vlanId, null, null, 180000, false); } else { - HypervisorHostHelper.prepareNetwork(_privateNetworkVSwitchName, "cloud.private", hostMo, vlanId, null, null, 180000); + HypervisorHostHelper.prepareNetwork(privateTrafficLabel, "cloud.private", hostMo, vlanId, null, null, 180000); } returnedHostList.add(mor); return returnedHostList; @@ -962,4 +974,17 @@ public class VmwareManagerImpl implements VmwareManager, VmwareStorageMount, Lis public int getRouterExtraPublicNics() { return this._routerExtraPublicNics; } + + @Override + public Map getNexusVSMCredentialsByClusterId(Long clusterId) { + ClusterVSMMapVO vsmMapVO = _vsmMapDao.findByClusterId(clusterId); + CiscoNexusVSMDeviceVO nexusVSM = _nexusDao.findById(vsmMapVO.getVsmId()); + if (nexusVSM == null) + return null; + Map nexusVSMCredentials = new HashMap(); + nexusVSMCredentials.put("vsmip", nexusVSM.getipaddr()); + nexusVSMCredentials.put("vsmusername", nexusVSM.getUserName()); + nexusVSMCredentials.put("vsmpassword", nexusVSM.getPassword()); + return nexusVSMCredentials; + } } diff --git a/server/src/com/cloud/hypervisor/vmware/VmwareServerDiscoverer.java b/server/src/com/cloud/hypervisor/vmware/VmwareServerDiscoverer.java index bd10d7b475e..500b84ca55b 100755 --- a/server/src/com/cloud/hypervisor/vmware/VmwareServerDiscoverer.java +++ b/server/src/com/cloud/hypervisor/vmware/VmwareServerDiscoverer.java @@ -12,55 +12,55 @@ // Automatically generated by addcopyright.py at 04/03/2012 package com.cloud.hypervisor.vmware; -import java.net.URI; -import java.net.URLDecoder; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; - -import javax.ejb.Local; -import javax.naming.ConfigurationException; - -import org.apache.log4j.Logger; - +import java.net.URI; +import java.net.URLDecoder; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +import javax.ejb.Local; +import javax.naming.ConfigurationException; + +import org.apache.log4j.Logger; + import com.cloud.agent.api.StartupCommand; import com.cloud.agent.api.StartupRoutingCommand; -import com.cloud.alert.AlertManager; -import com.cloud.configuration.dao.ConfigurationDao; -import com.cloud.dc.ClusterDetailsDao; -import com.cloud.dc.ClusterVO; -import com.cloud.dc.dao.ClusterDao; +import com.cloud.alert.AlertManager; +import com.cloud.configuration.dao.ConfigurationDao; +import com.cloud.dc.ClusterDetailsDao; +import com.cloud.dc.ClusterVO; +import com.cloud.dc.dao.ClusterDao; import com.cloud.exception.DiscoveredWithErrorException; -import com.cloud.exception.DiscoveryException; -import com.cloud.host.HostVO; +import com.cloud.exception.DiscoveryException; +import com.cloud.host.HostVO; import com.cloud.host.dao.HostDao; -import com.cloud.hypervisor.Hypervisor; -import com.cloud.hypervisor.Hypervisor.HypervisorType; -import com.cloud.hypervisor.vmware.manager.VmwareManager; -import com.cloud.hypervisor.vmware.mo.ClusterMO; -import com.cloud.hypervisor.vmware.mo.HostMO; -import com.cloud.hypervisor.vmware.resource.VmwareContextFactory; -import com.cloud.hypervisor.vmware.resource.VmwareResource; -import com.cloud.hypervisor.vmware.util.VmwareContext; +import com.cloud.hypervisor.Hypervisor; +import com.cloud.hypervisor.Hypervisor.HypervisorType; +import com.cloud.hypervisor.vmware.manager.VmwareManager; +import com.cloud.hypervisor.vmware.mo.ClusterMO; +import com.cloud.hypervisor.vmware.mo.HostMO; +import com.cloud.hypervisor.vmware.resource.VmwareContextFactory; +import com.cloud.hypervisor.vmware.resource.VmwareResource; +import com.cloud.hypervisor.vmware.util.VmwareContext; +import com.cloud.network.NetworkManager; import com.cloud.network.dao.CiscoNexusVSMDeviceDao; -import com.cloud.resource.Discoverer; -import com.cloud.resource.DiscovererBase; +import com.cloud.resource.Discoverer; +import com.cloud.resource.DiscovererBase; import com.cloud.resource.ResourceManager; import com.cloud.resource.ResourceStateAdapter; -import com.cloud.resource.ServerResource; +import com.cloud.resource.ServerResource; import com.cloud.resource.UnableDeleteHostException; -import com.cloud.resource.ResourceStateAdapter.DeleteHostAnswer; -import com.cloud.storage.Storage.ImageFormat; -import com.cloud.storage.Storage.TemplateType; -import com.cloud.storage.VMTemplateVO; -import com.cloud.storage.dao.VMTemplateDao; -import com.cloud.user.Account; -import com.cloud.utils.UriUtils; -import com.cloud.utils.component.ComponentLocator; -import com.cloud.utils.component.Inject; -import com.vmware.vim25.ClusterDasConfigInfo; -import com.vmware.vim25.ManagedObjectReference; +import com.cloud.storage.Storage.ImageFormat; +import com.cloud.storage.Storage.TemplateType; +import com.cloud.storage.VMTemplateVO; +import com.cloud.storage.dao.VMTemplateDao; +import com.cloud.user.Account; +import com.cloud.utils.UriUtils; +import com.cloud.utils.component.ComponentLocator; +import com.cloud.utils.component.Inject; +import com.vmware.vim25.ClusterDasConfigInfo; +import com.vmware.vim25.ManagedObjectReference; @Local(value=Discoverer.class) public class VmwareServerDiscoverer extends DiscovererBase implements Discoverer, ResourceStateAdapter { @@ -74,6 +74,8 @@ public class VmwareServerDiscoverer extends DiscovererBase implements Discoverer @Inject HostDao _hostDao; @Inject ResourceManager _resourceMgr; @Inject CiscoNexusVSMDeviceDao _nexusDao; + @Inject + NetworkManager _netmgr; @Override public Map> find(long dcId, Long podId, Long clusterId, URI url, @@ -101,12 +103,39 @@ public class VmwareServerDiscoverer extends DiscovererBase implements Discoverer s_logger.error(msg); throw new DiscoveredWithErrorException(msg); } - + + String privateTrafficLabel = null; + Map vsmCredentials = null; + if (_vmwareMgr.getNexusVSwitchGlobalParameter()) { + // Get physical network label + privateTrafficLabel = _netmgr.getDefaultManagementTrafficLabel(dcId, HypervisorType.VMware); + if (privateTrafficLabel != null) { + s_logger.info("Detected private network label : " + privateTrafficLabel); + } + // Get credentials + vsmCredentials = _vmwareMgr.getNexusVSMCredentialsByClusterId(clusterId); + } + VmwareContext context = null; try { - context = VmwareContextFactory.create(url.getHost(), username, password); + context = VmwareContextFactory.create(url.getHost(), username, password); + if (_vmwareMgr.getNexusVSwitchGlobalParameter()) { + // Get physical network label + privateTrafficLabel = _netmgr.getDefaultManagementTrafficLabel(dcId, HypervisorType.VMware); + if (privateTrafficLabel != null) { + context.registerStockObject("privateTrafficLabel", privateTrafficLabel); + s_logger.info("Detected private network label : " + privateTrafficLabel); + } + // Get credentials + vsmCredentials = _vmwareMgr.getNexusVSMCredentialsByClusterId(clusterId); + if (vsmCredentials != null) + context.registerStockObject("vsmCredentials", vsmCredentials); + } List morHosts = _vmwareMgr.addHostToPodCluster(context, dcId, podId, clusterId, - URLDecoder.decode(url.getPath())); + URLDecoder.decode(url.getPath())); + if (privateTrafficLabel != null) + context.uregisterStockObject("privateTrafficLabel"); + if(morHosts == null) { s_logger.error("Unable to find host or cluster based on url: " + URLDecoder.decode(url.getPath())); return null; @@ -138,7 +167,7 @@ public class VmwareServerDiscoverer extends DiscovererBase implements Discoverer s_logger.warn("The discovered host does not belong to the cluster"); return null; } - + Map> resources = new HashMap>(); for(ManagedObjectReference morHost : morHosts) { Map details = new HashMap(); @@ -157,7 +186,10 @@ public class VmwareServerDiscoverer extends DiscovererBase implements Discoverer params.put("zone", Long.toString(dcId)); params.put("pod", Long.toString(podId)); params.put("cluster", Long.toString(clusterId)); - params.put("guid", guid); + params.put("guid", guid); + if (privateTrafficLabel != null) { + params.put("private.network.vswitch.name", privateTrafficLabel); + } VmwareResource resource = new VmwareResource(); try { diff --git a/vmware-base/src/com/cloud/hypervisor/vmware/mo/HypervisorHostHelper.java b/vmware-base/src/com/cloud/hypervisor/vmware/mo/HypervisorHostHelper.java index b50f1242c32..702a5b1144f 100755 --- a/vmware-base/src/com/cloud/hypervisor/vmware/mo/HypervisorHostHelper.java +++ b/vmware-base/src/com/cloud/hypervisor/vmware/mo/HypervisorHostHelper.java @@ -20,7 +20,6 @@ import java.util.List; import java.util.Map; import org.apache.log4j.Logger; -import org.mortbay.jetty.servlet.Context; import com.cloud.hypervisor.vmware.util.VmwareContext; import com.cloud.hypervisor.vmware.util.VmwareHelper; @@ -35,10 +34,8 @@ import com.cloud.utils.db.GlobalLock; import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.net.NetUtils; import com.vmware.vim25.BoolPolicy; -import com.vmware.vim25.DVPortgroupConfigSpec; -import com.vmware.vim25.DVSTrafficShapingPolicy; -//import com.vmware.vim25.DistributedVirtualSwitchKeyedOpaqueBlob; import com.vmware.vim25.DVPortgroupConfigInfo; +import com.vmware.vim25.DVSTrafficShapingPolicy; import com.vmware.vim25.DynamicProperty; import com.vmware.vim25.HostNetworkTrafficShapingPolicy; import com.vmware.vim25.HostPortGroupSpec; @@ -122,7 +119,7 @@ public class HypervisorHostHelper { return sb.toString(); } - public static Map getValidatedVsmCredentials(VmwareContext context) throws Exception, CloudRuntimeException { + public static Map getValidatedVsmCredentials(VmwareContext context) throws Exception { Map vsmCredentials = context.getStockObject("vsmcredentials"); String msg; if(vsmCredentials == null || vsmCredentials.size() != 3) { @@ -137,12 +134,12 @@ public class HypervisorHostHelper { if(vsmIp == null || vsmIp.isEmpty() || vsmUserName == null || vsmUserName.isEmpty() || vsmPassword == null || vsmPassword.isEmpty()) { msg = "Detected invalid credentials for Nexus VSM"; s_logger.error(msg); - throw new CloudRuntimeException(msg); + throw new Exception(msg); } return vsmCredentials; } - public static void createPortProfile(VmwareContext context, String ethPortProfileName, String networkName, Integer vid, Integer networkRateMbps) throws Exception, CloudRuntimeException { + public static void createPortProfile(VmwareContext context, String ethPortProfileName, String networkName, Integer vid, Integer networkRateMbps) throws Exception { Map vsmCredentials = getValidatedVsmCredentials(context); String vsmIp = vsmCredentials.get("vsmip"); String vsmUserName = vsmCredentials.get("vsmusername"); @@ -179,7 +176,7 @@ public class HypervisorHostHelper { } } - public static void updatePortProfile(VmwareContext context, String ethPortProfileName, Integer vid, Integer networkRateMbps) throws CloudRuntimeException, Exception { + public static void updatePortProfile(VmwareContext context, String ethPortProfileName, Integer vid, Integer networkRateMbps) throws Exception { Map vsmCredentials = getValidatedVsmCredentials(context); String vsmIp = vsmCredentials.get("vsmip"); String vsmUserName = vsmCredentials.get("vsmusername"); @@ -210,7 +207,7 @@ public class HypervisorHostHelper { public static Pair prepareNetwork(String ethPortProfileName, String namePrefix, HostMO hostMo, String vlanId, Integer networkRateMbps, Integer networkRateMulticastMbps, - long timeOutMs) throws Exception, CloudRuntimeException { + long timeOutMs) throws Exception { ManagedObjectReference morNetwork = null; VmwareContext context = hostMo.getContext(); ManagedObjectReference dcMor = hostMo.getHyperHostDatacenter();