From 5adfc9953f520f270c1848ef05d2d9037389c3e6 Mon Sep 17 00:00:00 2001 From: Alena Prokharchyk Date: Wed, 11 Jan 2012 15:48:57 -0800 Subject: [PATCH] Can enable/disable static nat and create IpForwarding/Firewall rules in Basic zone now. Made Netscaler a StaticNat/Firewall provider. Murali will take care of actual implementation on the backend. --- .../api/commands/AssociateIPAddrCmd.java | 15 +++-- client/tomcatconf/components.xml.in | 6 +- .../com/cloud/network/NetworkManagerImpl.java | 5 +- .../network/element/NetscalerElement.java | 64 ++++++++++++++----- 4 files changed, 65 insertions(+), 25 deletions(-) diff --git a/api/src/com/cloud/api/commands/AssociateIPAddrCmd.java b/api/src/com/cloud/api/commands/AssociateIPAddrCmd.java index 771b4ac2bbf..5c514c7569b 100644 --- a/api/src/com/cloud/api/commands/AssociateIPAddrCmd.java +++ b/api/src/com/cloud/api/commands/AssociateIPAddrCmd.java @@ -42,6 +42,7 @@ import com.cloud.exception.ResourceAllocationException; import com.cloud.exception.ResourceUnavailableException; import com.cloud.network.IpAddress; import com.cloud.network.Network; +import com.cloud.user.Account; import com.cloud.user.UserContext; @Implementation(description="Acquires and associates a public IP to an account.", responseObject=IPAddressResponse.class) @@ -134,10 +135,16 @@ public class AssociateIPAddrCmd extends BaseAsyncCreateCmd { } @Override - public long getEntityOwnerId() { - //owner of the network should be the same as the owner of the ip - Network network = _networkService.getNetwork(getNetworkId()); - return network.getAccountId(); + public long getEntityOwnerId() { + Account caller = UserContext.current().getCaller(); + if (accountName != null && domainId != null) { + Account account = _accountService.finalizeOwner(caller, accountName, domainId, projectId); + return account.getId(); + } else { + Network network = _networkService.getNetwork(getNetworkId()); + return network.getAccountId(); + } + } @Override diff --git a/client/tomcatconf/components.xml.in b/client/tomcatconf/components.xml.in index 72135d947cd..4804a3b3359 100755 --- a/client/tomcatconf/components.xml.in +++ b/client/tomcatconf/components.xml.in @@ -133,9 +133,9 @@ - - - + + + diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index ef97ed941d2..e60894c60a8 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -4044,10 +4044,13 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag // static NAT rules can not programmed unless IP is associated with network service provider, so run IP association for // the network so as to ensure IP is associated before applying rules (in add state) applyIpAssociations(network, false, continueOnError, publicIps); + + //get provider + String staticNatProvider = _ntwkSrvcDao.getProviderForServiceInNetwork(network.getId(), Service.StaticNat); for (NetworkElement ne : _networkElements) { try { - if (!(ne instanceof StaticNatServiceProvider)) { + if (!(ne instanceof StaticNatServiceProvider && ne.getName().equalsIgnoreCase(staticNatProvider))) { continue; } diff --git a/server/src/com/cloud/network/element/NetscalerElement.java b/server/src/com/cloud/network/element/NetscalerElement.java index 6b2c0da573c..a395a6f0ff9 100644 --- a/server/src/com/cloud/network/element/NetscalerElement.java +++ b/server/src/com/cloud/network/element/NetscalerElement.java @@ -39,6 +39,8 @@ import com.cloud.api.commands.ListNetscalerLoadBalancerNetworksCmd; import com.cloud.api.commands.ListNetscalerLoadBalancersCmd; import com.cloud.api.response.NetscalerLoadBalancerResponse; import com.cloud.configuration.ConfigurationManager; +import com.cloud.dc.DataCenter; +import com.cloud.dc.DataCenter.NetworkType; import com.cloud.dc.dao.DataCenterDao; import com.cloud.deploy.DeployDestination; import com.cloud.exception.ConcurrentOperationException; @@ -53,6 +55,7 @@ import com.cloud.host.dao.HostDetailsDao; import com.cloud.network.ExternalLoadBalancerDeviceManager; import com.cloud.network.ExternalLoadBalancerDeviceManagerImpl; import com.cloud.network.ExternalLoadBalancerDeviceVO; +import com.cloud.network.ExternalLoadBalancerDeviceVO.LBDeviceState; import com.cloud.network.ExternalNetworkDeviceManager.NetworkDevice; import com.cloud.network.Network; import com.cloud.network.Network.Capability; @@ -72,8 +75,10 @@ import com.cloud.network.dao.NetworkServiceMapDao; import com.cloud.network.dao.PhysicalNetworkDao; import com.cloud.network.lb.LoadBalancingRule; import com.cloud.network.resource.NetscalerResource; +import com.cloud.network.rules.FirewallRule; import com.cloud.network.rules.LbStickinessMethod; import com.cloud.network.rules.LbStickinessMethod.StickinessMethodType; +import com.cloud.network.rules.StaticNat; import com.cloud.offering.NetworkOffering; import com.cloud.resource.ServerResource; import com.cloud.utils.component.Inject; @@ -88,7 +93,7 @@ import com.cloud.vm.VirtualMachineProfile; import com.google.gson.Gson; @Local(value=NetworkElement.class) -public class NetscalerElement extends ExternalLoadBalancerDeviceManagerImpl implements LoadBalancingServiceProvider, NetscalerLoadBalancerElementService, ExternalLoadBalancerDeviceManager, IpDeployer { +public class NetscalerElement extends ExternalLoadBalancerDeviceManagerImpl implements LoadBalancingServiceProvider, NetscalerLoadBalancerElementService, ExternalLoadBalancerDeviceManager, IpDeployer, StaticNatServiceProvider, FirewallServiceProvider { private static final Logger s_logger = Logger.getLogger(NetscalerElement.class); @@ -106,8 +111,12 @@ public class NetscalerElement extends ExternalLoadBalancerDeviceManagerImpl impl @Inject HostDetailsDao _detailsDao; private boolean canHandle(Network config) { - if (config.getGuestType() != Network.GuestType.Isolated || config.getTrafficType() != TrafficType.Guest) { - s_logger.trace("Not handling network with Type " + config.getGuestType() + " and traffic type " + config.getTrafficType()); + DataCenter zone = _dcDao.findById(config.getDataCenterId()); + boolean handleInAdvanceZone = (zone.getNetworkType() == NetworkType.Advanced && config.getGuestType() == Network.GuestType.Isolated && config.getTrafficType() == TrafficType.Guest); + boolean handleInBasicZone = (zone.getNetworkType() == NetworkType.Basic && config.getGuestType() == Network.GuestType.Shared && config.getTrafficType() == TrafficType.Guest); + + if (!(handleInAdvanceZone || handleInBasicZone)) { + s_logger.trace("Not handling network with Type " + config.getGuestType() + " and traffic type " + config.getTrafficType() + " in zone of type " + zone.getNetworkType()); return false; } @@ -216,7 +225,14 @@ public class NetscalerElement extends ExternalLoadBalancerDeviceManagerImpl impl staticNatCapabilities.put(Capability.ElasticIp, "true"); capabilities.put(Service.StaticNat, staticNatCapabilities); - capabilities.put(Service.Firewall, staticNatCapabilities); + + //TODO - Murali, please put correct capabilities here + Map firewallCapabilities = new HashMap(); + firewallCapabilities.put(Capability.TrafficStatistics, "per public ip"); + firewallCapabilities.put(Capability.SupportedProtocols, "tcp,udp,icmp"); + firewallCapabilities.put(Capability.MultipleIps, "true"); + + capabilities.put(Service.Firewall, firewallCapabilities); return capabilities; } @@ -435,19 +451,17 @@ public class NetscalerElement extends ExternalLoadBalancerDeviceManagerImpl impl @Override public boolean isReady(PhysicalNetworkServiceProvider provider) { -// List lbDevices = _lbDeviceDao.listByPhysicalNetworkAndProvider(provider.getPhysicalNetworkId(), Provider.Netscaler.getName()); -// -// // true if at-least one Netscaler device is added in to physical network and is in configured (in enabled state) state -// if (lbDevices != null && !lbDevices.isEmpty()) { -// for (ExternalLoadBalancerDeviceVO lbDevice : lbDevices) { -// if (lbDevice.getState() == LBDeviceState.Enabled) { -// return true; -// } -// } -// } -// return false; - //uncomment later - return true; + List lbDevices = _lbDeviceDao.listByPhysicalNetworkAndProvider(provider.getPhysicalNetworkId(), Provider.Netscaler.getName()); + + // true if at-least one Netscaler device is added in to physical network and is in configured (in enabled state) state + if (lbDevices != null && !lbDevices.isEmpty()) { + for (ExternalLoadBalancerDeviceVO lbDevice : lbDevices) { + if (lbDevice.getState() == LBDeviceState.Enabled) { + return true; + } + } + } + return false; } @Override @@ -487,4 +501,20 @@ public class NetscalerElement extends ExternalLoadBalancerDeviceManagerImpl impl public IpDeployer getIpDeployer(Network network) { return this; } + + @Override + public boolean applyFWRules(Network network, + List rules) + throws ResourceUnavailableException { + // TODO - Murali, your code should go here + return true; + } + + @Override + public boolean applyStaticNats(Network config, + List rules) + throws ResourceUnavailableException { + // TODO - Murali, your code should go here + return true; + } } \ No newline at end of file