From b0facd16e48067258c738933dd091abc6e61c84d Mon Sep 17 00:00:00 2001 From: Vijayendra Bhamidipati Date: Thu, 19 Apr 2012 18:34:22 -0700 Subject: [PATCH] Bug CS-9919: Support for Nexus Swiches (Cisco Vswitches) At this point, the mgmt server comes up, loading the Nexus related modules without dying. Description: 1) Added a new properties file for Cisco N1kv VSM commands: cisconexusvsm_commands.properties.in 2) Added the CiscoNexusVSMElement to the components.xml file. 3) Modified CiscoNexusVSMElement to implement NetworkElement. The NetworkElement interface functions are not relevant to the N1KV VSM, so we override them with noops. 4) Added an addDao() of CiscoNexusVSMDeviceDaoImpl in populateDaos(), else we'd run into a failure to look up the VSM's dao when the mgmt server is starting up: com.cloud.utils.exception.CloudRuntimeException: Unable to find DAO com.cloud.network.dao.CiscoNexusVSMDeviceDao 5) Also added the CiscoNexusVSMElementService in populateServices(), and modified CiscoNexusVSMElement to implement Manager as well. 6) populateServices() was running into an exception that indicated that it was unable to find a commands.properties file for the cisco n1kv vsm service. Fixed it by changing getProperties() in CiscoNexusVSMElement to return the correct string "cisconexusvsm_commands.properties", and putting in an @Override for getProperties() in CiscoNexusVSMElement. Also fixed up all the other functions in CiscoNexusVSMElement that needed to have @Override. Also updated build/developers.xml with this file location. And did other small cleanup. 7) More clean up in CiscoNexusVSMDeviceManagerImpl. Conflicts: server/src/com/cloud/configuration/DefaultComponentLibrary.java --- build/developer.xml | 1 + .../cisconexusvsm_commands.properties.in | 6 ++ client/tomcatconf/components.xml.in | 1 + .../DefaultComponentLibrary.java | 7 ++ .../CiscoNexusVSMDeviceManagerImpl.java | 47 --------- .../network/element/CiscoNexusVSMElement.java | 98 ++++++++++++++++++- utils/src/com/cloud/utils/PropertiesUtil.java | 3 + 7 files changed, 113 insertions(+), 50 deletions(-) create mode 100644 client/tomcatconf/cisconexusvsm_commands.properties.in diff --git a/build/developer.xml b/build/developer.xml index 0fc0d7eb95d..2e3bbf647e1 100755 --- a/build/developer.xml +++ b/build/developer.xml @@ -381,6 +381,7 @@ + diff --git a/client/tomcatconf/cisconexusvsm_commands.properties.in b/client/tomcatconf/cisconexusvsm_commands.properties.in new file mode 100644 index 00000000000..25272b7df32 --- /dev/null +++ b/client/tomcatconf/cisconexusvsm_commands.properties.in @@ -0,0 +1,6 @@ +### bitmap of permissions at the end of each classname, 1 = ADMIN, 2 = RESOURCE_DOMAIN_ADMIN, 4 = DOMAIN_ADMIN, 8 = USER +### Please standardize naming conventions to camel-case (even for acronyms). + +#### Cisco Nexus 1000v Virtual Supervisor Module (VSM) commands +addCiscoNexusVSM = com.cloud.api.commands.AddCiscoNexusVSMCmd;7 +deleteCiscoNexusVSM = com.cloud.api.commands.DeleteCiscoNexusVSMCmd;7 diff --git a/client/tomcatconf/components.xml.in b/client/tomcatconf/components.xml.in index d6a7c98a1ce..48869b5daee 100755 --- a/client/tomcatconf/components.xml.in +++ b/client/tomcatconf/components.xml.in @@ -141,6 +141,7 @@ + diff --git a/server/src/com/cloud/configuration/DefaultComponentLibrary.java b/server/src/com/cloud/configuration/DefaultComponentLibrary.java index 3794c713fc3..3cebd602645 100755 --- a/server/src/com/cloud/configuration/DefaultComponentLibrary.java +++ b/server/src/com/cloud/configuration/DefaultComponentLibrary.java @@ -72,6 +72,8 @@ import com.cloud.network.NetworkManagerImpl; import com.cloud.network.StorageNetworkManagerImpl; import com.cloud.network.dao.ExternalFirewallDeviceDaoImpl; import com.cloud.network.dao.ExternalLoadBalancerDeviceDaoImpl; +import com.cloud.network.dao.CiscoNexusVSMDeviceDaoImpl; +// TODO - Import the Port Profile Device Dao as well. import com.cloud.network.dao.FirewallRulesCidrsDaoImpl; import com.cloud.network.dao.FirewallRulesDaoImpl; import com.cloud.network.dao.IPAddressDaoImpl; @@ -97,6 +99,8 @@ import com.cloud.network.element.F5ExternalLoadBalancerElementService; import com.cloud.network.element.JuniperSRXExternalFirewallElement; import com.cloud.network.element.JuniperSRXFirewallElementService; import com.cloud.network.element.NetscalerElement; +import com.cloud.network.element.CiscoNexusVSMElement; +import com.cloud.network.element.CiscoNexusVSMElementService; import com.cloud.network.element.NetscalerLoadBalancerElementService; import com.cloud.network.element.VirtualRouterElement; import com.cloud.network.element.VirtualRouterElementService; @@ -317,6 +321,8 @@ public class DefaultComponentLibrary extends ComponentLibraryBase implements Com addDao("NetworkExternalLoadBalancerDao", NetworkExternalLoadBalancerDaoImpl.class); addDao("NetworkExternalFirewallDao", NetworkExternalFirewallDaoImpl.class); addDao("NetScalerPodDao", NetScalerPodDaoImpl.class); + addDao("CiscoNexusVSMDeviceDao", CiscoNexusVSMDeviceDaoImpl.class); + // TODO - Also put in the Port Profile Device Dao here. addDao("PhysicalNetworkTrafficTypeDao", PhysicalNetworkTrafficTypeDaoImpl.class); addDao("NetworkServiceMapDao", NetworkServiceMapDaoImpl.class); addDao("StorageNetworkIpAddressDao", StorageNetworkIpAddressDaoImpl.class); @@ -411,6 +417,7 @@ public class DefaultComponentLibrary extends ComponentLibraryBase implements Com addService("NetscalerExternalLoadBalancerElementService", NetscalerLoadBalancerElementService.class, NetscalerElement.class); addService("F5LoadBalancerElementService", F5ExternalLoadBalancerElementService.class, F5ExternalLoadBalancerElement.class); addService("JuniperSRXFirewallElementService", JuniperSRXFirewallElementService.class, JuniperSRXExternalFirewallElement.class); + addService("CiscoNexusVSMElementService", CiscoNexusVSMElementService.class, CiscoNexusVSMElement.class); } @Override diff --git a/server/src/com/cloud/network/CiscoNexusVSMDeviceManagerImpl.java b/server/src/com/cloud/network/CiscoNexusVSMDeviceManagerImpl.java index 71b08a58ad8..cf4bc5445d1 100644 --- a/server/src/com/cloud/network/CiscoNexusVSMDeviceManagerImpl.java +++ b/server/src/com/cloud/network/CiscoNexusVSMDeviceManagerImpl.java @@ -12,10 +12,7 @@ // Automatically generated by addcopyright.py at 04/03/2012 package com.cloud.network; -import java.net.URI; -import java.util.ArrayList; import java.util.HashMap; -import java.util.List; import java.util.Map; import java.util.UUID; @@ -26,16 +23,6 @@ import org.apache.log4j.Logger; import com.cloud.agent.AgentManager; import com.cloud.agent.api.Answer; import com.cloud.agent.api.StartupCommand; -import com.cloud.agent.api.StartupExternalLoadBalancerCommand; -import com.cloud.agent.api.routing.CreateLoadBalancerApplianceCommand; -import com.cloud.agent.api.routing.DestroyLoadBalancerApplianceCommand; -import com.cloud.agent.api.routing.IpAssocCommand; -import com.cloud.agent.api.routing.LoadBalancerConfigCommand; -import com.cloud.agent.api.routing.NetworkElementCommand; -import com.cloud.agent.api.routing.SetStaticNatRulesCommand; -import com.cloud.agent.api.to.IpAddressTO; -import com.cloud.agent.api.to.LoadBalancerTO; -import com.cloud.agent.api.to.StaticNatRuleTO; import com.cloud.api.ApiConstants; import com.cloud.configuration.Config; import com.cloud.configuration.dao.ConfigurationDao; @@ -57,42 +44,22 @@ import com.cloud.host.Host; import com.cloud.host.HostVO; import com.cloud.host.dao.HostDao; import com.cloud.host.dao.HostDetailsDao; -import com.cloud.network.ExternalLoadBalancerDeviceVO.LBDeviceAllocationState; -import com.cloud.network.ExternalLoadBalancerDeviceVO.LBDeviceState; import com.cloud.network.ExternalNetworkDeviceManager.NetworkDevice; import com.cloud.network.Network.Service; import com.cloud.network.Networks.TrafficType; import com.cloud.network.addr.PublicIp; -import com.cloud.network.dao.ExternalFirewallDeviceDao; -import com.cloud.network.dao.ExternalLoadBalancerDeviceDao; import com.cloud.network.dao.IPAddressDao; -import com.cloud.network.dao.InlineLoadBalancerNicMapDao; -import com.cloud.network.dao.LoadBalancerDao; import com.cloud.network.dao.NetworkDao; -import com.cloud.network.dao.NetworkExternalFirewallDao; import com.cloud.network.dao.NetworkExternalLoadBalancerDao; import com.cloud.network.dao.NetworkServiceMapDao; import com.cloud.network.dao.PhysicalNetworkDao; import com.cloud.network.dao.PhysicalNetworkServiceProviderDao; -import com.cloud.network.dao.PhysicalNetworkServiceProviderVO; -import com.cloud.network.lb.LoadBalancingRule; -import com.cloud.network.lb.LoadBalancingRule.LbDestination; -import com.cloud.network.resource.CreateLoadBalancerApplianceAnswer; -import com.cloud.network.resource.DestroyLoadBalancerApplianceAnswer; -import com.cloud.network.rules.FirewallRule; -import com.cloud.network.rules.FirewallRule.Purpose; -import com.cloud.network.rules.FirewallRuleVO; -import com.cloud.network.rules.StaticNatRule; -import com.cloud.network.rules.StaticNatRuleImpl; import com.cloud.network.rules.dao.PortForwardingRulesDao; -import com.cloud.offerings.NetworkOfferingVO; import com.cloud.offerings.dao.NetworkOfferingDao; import com.cloud.resource.ResourceManager; import com.cloud.resource.ResourceState; import com.cloud.resource.ResourceStateAdapter; import com.cloud.resource.ServerResource; -import com.cloud.resource.UnableDeleteHostException; -import com.cloud.server.api.response.ExternalLoadBalancerResponse; import com.cloud.user.Account; import com.cloud.user.AccountManager; import com.cloud.user.dao.AccountDao; @@ -105,11 +72,6 @@ import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.GlobalLock; import com.cloud.utils.db.Transaction; import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.utils.net.NetUtils; -import com.cloud.utils.net.UrlUtil; -import com.cloud.vm.Nic.ReservationStrategy; -import com.cloud.vm.Nic.State; -import com.cloud.vm.NicVO; import com.cloud.vm.dao.DomainRouterDao; import com.cloud.vm.dao.NicDao; import com.cloud.network.dao.CiscoNexusVSMDeviceDao; @@ -126,8 +88,6 @@ public abstract class CiscoNexusVSMDeviceManagerImpl extends AdapterBase { @Inject NetworkManager _networkMgr; @Inject - InlineLoadBalancerNicMapDao _inlineLoadBalancerNicMapDao; - @Inject NicDao _nicDao; @Inject AgentManager _agentMgr; @@ -154,8 +114,6 @@ public abstract class CiscoNexusVSMDeviceManagerImpl extends AdapterBase { @Inject DomainRouterDao _routerDao; @Inject - LoadBalancerDao _loadBalancerDao; - @Inject PortForwardingRulesDao _portForwardingRulesDao; @Inject ConfigurationDao _configDao; @@ -166,13 +124,8 @@ public abstract class CiscoNexusVSMDeviceManagerImpl extends AdapterBase { @Inject NetworkServiceMapDao _ntwkSrvcProviderDao; @Inject - NetworkExternalFirewallDao _networkExternalFirewallDao; - @Inject - ExternalFirewallDeviceDao _externalFirewallDeviceDao; - @Inject protected HostPodDao _podDao = null; - private long _defaultLbCapacity; private static final org.apache.log4j.Logger s_logger = Logger.getLogger(ExternalLoadBalancerDeviceManagerImpl.class); @DB diff --git a/server/src/com/cloud/network/element/CiscoNexusVSMElement.java b/server/src/com/cloud/network/element/CiscoNexusVSMElement.java index 91884ebf4f0..29a6303c8f1 100644 --- a/server/src/com/cloud/network/element/CiscoNexusVSMElement.java +++ b/server/src/com/cloud/network/element/CiscoNexusVSMElement.java @@ -13,6 +13,7 @@ package com.cloud.network.element; import java.util.List; +import java.util.Map; import javax.ejb.Local; @@ -27,21 +28,37 @@ import com.cloud.api.response.CiscoNexusVSMResponse; import com.cloud.configuration.ConfigurationManager; import com.cloud.configuration.dao.ConfigurationDao; import com.cloud.dc.dao.DataCenterDao; +import com.cloud.deploy.DeployDestination; +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.ResourceUnavailableException; import com.cloud.host.dao.HostDao; import com.cloud.host.dao.HostDetailsDao; import com.cloud.network.CiscoNexusVSMDeviceVO; import com.cloud.network.CiscoNexusVSMDeviceManagerImpl; +import com.cloud.network.Network; import com.cloud.network.NetworkManager; +import com.cloud.network.PhysicalNetworkServiceProvider; +import com.cloud.network.Network.Capability; +import com.cloud.network.Network.Provider; +import com.cloud.network.Network.Service; import com.cloud.network.dao.NetworkDao; import com.cloud.network.dao.NetworkServiceMapDao; import com.cloud.network.dao.PhysicalNetworkDao; import com.cloud.network.resource.CiscoNexusVSMResource; import com.cloud.resource.ServerResource; import com.cloud.utils.component.Inject; +import com.cloud.vm.NicProfile; +import com.cloud.vm.ReservationContext; +import com.cloud.vm.VirtualMachine; +import com.cloud.vm.VirtualMachineProfile; import com.cloud.network.PortProfile; +import com.cloud.network.element.NetworkElement; +import com.cloud.offering.NetworkOffering; +import com.cloud.utils.component.Manager; @Local(value = NetworkElement.class) -public class CiscoNexusVSMElement extends CiscoNexusVSMDeviceManagerImpl implements CiscoNexusVSMElementService { +public class CiscoNexusVSMElement extends CiscoNexusVSMDeviceManagerImpl implements CiscoNexusVSMElementService, NetworkElement, Manager { private static final Logger s_logger = Logger.getLogger(CiscoNexusVSMElement.class); @@ -70,7 +87,78 @@ public class CiscoNexusVSMElement extends CiscoNexusVSMDeviceManagerImpl impleme @Inject ConfigurationDao _configDao; + + @Override + public Map> getCapabilities() { + return null; + } + @Override + public Provider getProvider() { + return null; + } + + @Override + public boolean implement(Network network, NetworkOffering offering, + DeployDestination dest, ReservationContext context) + throws ConcurrentOperationException, ResourceUnavailableException, + InsufficientCapacityException { + return true; + } + + @Override + public boolean prepare(Network network, NicProfile nic, + VirtualMachineProfile vm, + DeployDestination dest, ReservationContext context) + throws ConcurrentOperationException, ResourceUnavailableException, + InsufficientCapacityException { + return true; + } + + @Override + public boolean release(Network network, NicProfile nic, + VirtualMachineProfile vm, + ReservationContext context) throws ConcurrentOperationException, + ResourceUnavailableException { + return true; + } + + @Override + public boolean shutdown(Network network, ReservationContext context, + boolean cleanup) throws ConcurrentOperationException, + ResourceUnavailableException { + return true; + } + + @Override + public boolean destroy(Network network) + throws ConcurrentOperationException, ResourceUnavailableException { + return true; + } + + @Override + public boolean isReady(PhysicalNetworkServiceProvider provider) { + return true; + } + + @Override + public boolean shutdownProviderInstances(PhysicalNetworkServiceProvider provider, + ReservationContext context) throws ConcurrentOperationException, + ResourceUnavailableException { + return true; + } + + @Override + public boolean canEnableIndividualServices() { + return true; + } + + @Override + public boolean verifyServicesCombination(List services) { + return true; + } + + @Override public CiscoNexusVSMDeviceVO addCiscoNexusVSM(AddCiscoNexusVSMCmd cmd) { // This function essentially prepares all the parameters we need to send @@ -95,11 +183,13 @@ public class CiscoNexusVSMElement extends CiscoNexusVSMDeviceManagerImpl impleme return vsmDeviceVO; } + @Override public boolean deleteCiscoNexusVSM(DeleteCiscoNexusVSMCmd cmd) { return true; } + @Override public List listNetworks(ListCiscoNexusVSMNetworksCmd cmd) { /*** @@ -122,11 +212,13 @@ public class CiscoNexusVSMElement extends CiscoNexusVSMDeviceManagerImpl impleme return null; } + @Override public List listCiscoNexusVSMs(ListCiscoNexusVSMCmd cmd) { return null; } + @Override public CiscoNexusVSMResponse createCiscoNexusVSMResponse(CiscoNexusVSMDeviceVO vsmDeviceVO) { CiscoNexusVSMResponse response = new CiscoNexusVSMResponse(); response.setId(vsmDeviceVO.getId()); @@ -134,8 +226,8 @@ public class CiscoNexusVSMElement extends CiscoNexusVSMDeviceManagerImpl impleme return response; } - + @Override public String getPropertiesFile() { - return null; + return "cisconexusvsm_commands.properties"; } } \ No newline at end of file diff --git a/utils/src/com/cloud/utils/PropertiesUtil.java b/utils/src/com/cloud/utils/PropertiesUtil.java index edc1c30892c..4b1b1d50745 100755 --- a/utils/src/com/cloud/utils/PropertiesUtil.java +++ b/utils/src/com/cloud/utils/PropertiesUtil.java @@ -21,12 +21,15 @@ import java.util.Map; import java.util.Properties; import java.util.Set; +import org.apache.log4j.Logger; + public class PropertiesUtil { /** * Searches the class path and local paths to find the config file. * @param path path to find. if it starts with / then it's absolute path. * @return File or null if not found at all. */ + public static File findConfigFile(String path) { ClassLoader cl = PropertiesUtil.class.getClassLoader(); URL url = cl.getResource(path);