NaaS: Add ServiceProviders

Added PortForwardingServiceProvider, StaticNatServiceProvider, rename
PasswordServiceProvider to UserDataServiceProvider(may rename to a better name
later).

Add related function for service providers.
This commit is contained in:
Sheng Yang 2011-10-27 11:39:21 -07:00
parent b369e45c78
commit e1e96c0bb3
15 changed files with 130 additions and 45 deletions

View File

@ -14,5 +14,5 @@ public interface FirewallServiceProvider extends NetworkElement {
* @return
* @throws ResourceUnavailableException
*/
boolean applyRules(Network network, List<? extends FirewallRule> rules) throws ResourceUnavailableException;
boolean applyFWRules(Network network, List<? extends FirewallRule> rules) throws ResourceUnavailableException;
}

View File

@ -4,7 +4,7 @@ import java.util.List;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.network.Network;
import com.cloud.network.rules.FirewallRule;
import com.cloud.network.lb.LoadBalancingRule;
public interface LoadBalancingServiceProvider extends NetworkElement {
/**
@ -14,5 +14,5 @@ public interface LoadBalancingServiceProvider extends NetworkElement {
* @return
* @throws ResourceUnavailableException
*/
boolean applyRules(Network network, List<? extends FirewallRule> rules) throws ResourceUnavailableException;
boolean applyLBRules(Network network, List<LoadBalancingRule> rules) throws ResourceUnavailableException;
}

View File

@ -0,0 +1,18 @@
package com.cloud.network.element;
import java.util.List;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.network.Network;
import com.cloud.network.rules.PortForwardingRule;
public interface PortForwardingServiceProvider extends NetworkElement {
/**
* Apply rules
* @param network
* @param rules
* @return
* @throws ResourceUnavailableException
*/
boolean applyPFRules(Network network, List<PortForwardingRule> rules) throws ResourceUnavailableException;
}

View File

@ -6,7 +6,7 @@ import com.cloud.exception.ResourceUnavailableException;
import com.cloud.network.Network;
import com.cloud.network.PublicIpAddress;
public interface SourceNATServiceProvider extends NetworkElement {
public interface SourceNatServiceProvider extends NetworkElement {
/**
* Apply ip addresses to this network
* @param network

View File

@ -6,7 +6,7 @@ import com.cloud.exception.ResourceUnavailableException;
import com.cloud.network.Network;
import com.cloud.network.rules.StaticNat;
public interface StaticNATServiceProvider extends NetworkElement {
public interface StaticNatServiceProvider extends NetworkElement {
/**
* Creates static nat rule (public IP to private IP mapping) on the network element
* @param config

View File

@ -6,6 +6,6 @@ import com.cloud.vm.NicProfile;
import com.cloud.vm.VirtualMachine;
import com.cloud.vm.VirtualMachineProfile;
public interface PasswordServiceProvider extends NetworkElement {
public interface UserDataServiceProvider extends NetworkElement {
boolean savePassword(Network network, NicProfile nic, VirtualMachineProfile<? extends VirtualMachine> vm) throws ResourceUnavailableException;
}

View File

@ -33,7 +33,7 @@ import com.cloud.network.Network.Provider;
import com.cloud.network.Network.Service;
import com.cloud.network.Networks.TrafficType;
import com.cloud.network.addr.PublicIp;
import com.cloud.network.element.PasswordServiceProvider;
import com.cloud.network.element.UserDataServiceProvider;
import com.cloud.network.element.RemoteAccessVPNServiceProvider;
import com.cloud.network.guru.NetworkGuru;
import com.cloud.network.rules.FirewallRule;
@ -182,7 +182,7 @@ public interface NetworkManager extends NetworkService {
Nic getDefaultNic(long vmId);
List<? extends PasswordServiceProvider> getPasswordResetElements();
List<? extends UserDataServiceProvider> getPasswordResetElements();
@Deprecated
boolean zoneIsConfiguredForExternalNetworking(long zoneId);

View File

@ -106,10 +106,11 @@ import com.cloud.network.dao.PhysicalNetworkServiceProviderVO;
import com.cloud.network.element.FirewallServiceProvider;
import com.cloud.network.element.LoadBalancingServiceProvider;
import com.cloud.network.element.NetworkElement;
import com.cloud.network.element.PasswordServiceProvider;
import com.cloud.network.element.PortForwardingServiceProvider;
import com.cloud.network.element.StaticNatServiceProvider;
import com.cloud.network.element.UserDataServiceProvider;
import com.cloud.network.element.RemoteAccessVPNServiceProvider;
import com.cloud.network.element.SourceNATServiceProvider;
import com.cloud.network.element.StaticNATServiceProvider;
import com.cloud.network.element.SourceNatServiceProvider;
import com.cloud.network.guru.NetworkGuru;
import com.cloud.network.lb.LoadBalancingRule;
import com.cloud.network.lb.LoadBalancingRule.LbDestination;
@ -119,6 +120,7 @@ import com.cloud.network.rules.FirewallRule;
import com.cloud.network.rules.FirewallRule.Purpose;
import com.cloud.network.rules.FirewallRuleVO;
import com.cloud.network.rules.PortForwardingRuleVO;
import com.cloud.network.rules.PortForwardingRule;
import com.cloud.network.rules.RulesManager;
import com.cloud.network.rules.StaticNat;
import com.cloud.network.rules.StaticNatRule;
@ -550,10 +552,10 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
int found = 0;
for (NetworkElement element : _networkElements) {
try {
if (!(element instanceof SourceNATServiceProvider)) {
if (!(element instanceof SourceNatServiceProvider)) {
continue;
}
SourceNATServiceProvider e = (SourceNATServiceProvider)element;
SourceNatServiceProvider e = (SourceNatServiceProvider)element;
found ++;
s_logger.trace("Asking " + element + " to apply ip associations");
e.applyIps(network, publicIps);
@ -2336,6 +2338,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
}
@Override
/* The rules here is only the same kind of rule, e.g. all load balancing rules or all port forwarding rules */
public boolean applyRules(List<? extends FirewallRule> rules, boolean continueOnError) throws ResourceUnavailableException {
if (rules == null || rules.size() == 0) {
s_logger.debug("There are no rules to forward to the network elements");
@ -2344,22 +2347,36 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
boolean success = true;
Network network = _networksDao.findById(rules.get(0).getNetworkId());
int found = 0;
Purpose purpose = rules.get(0).getPurpose();
for (NetworkElement ne : _networkElements) {
try {
if (!(ne instanceof FirewallServiceProvider) && !(ne instanceof LoadBalancingServiceProvider)) {
continue;
}
found ++;
boolean handled;
if (ne instanceof FirewallServiceProvider) {
FirewallServiceProvider e = (FirewallServiceProvider)ne;
handled = e.applyRules(network, rules);
} else {
LoadBalancingServiceProvider e = (LoadBalancingServiceProvider) ne;
handled = e.applyRules(network, rules);
switch (purpose) {
case LoadBalancing:
if (!(ne instanceof LoadBalancingServiceProvider)) {
continue;
}
handled = ((LoadBalancingServiceProvider)ne).applyLBRules(network, (List<LoadBalancingRule>)rules);
break;
case PortForwarding:
if (!(ne instanceof PortForwardingServiceProvider)) {
continue;
}
handled = ((PortForwardingServiceProvider)ne).applyPFRules(network, (List<PortForwardingRule>)rules);
break;
case StaticNat:
/* It's firewall rule for static nat, not static nat rule */
/* Fall through */
case Firewall:
if (!(ne instanceof FirewallServiceProvider)) {
continue;
}
handled = ((FirewallServiceProvider)ne).applyFWRules(network, rules);
break;
default:
s_logger.debug("Unable to handle network rules for purpose: " + purpose.toString());
handled = false;
}
s_logger.debug("Network Rules for network " + network.getId() + " were " + (handled ? "" : " not") + " handled by " + ne.getName());
} catch (ResourceUnavailableException e) {
if (!continueOnError) {
@ -2857,11 +2874,11 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
}
@Override
public List<? extends PasswordServiceProvider> getPasswordResetElements() {
List<PasswordServiceProvider> elements = new ArrayList<PasswordServiceProvider>();
public List<? extends UserDataServiceProvider> getPasswordResetElements() {
List<UserDataServiceProvider> elements = new ArrayList<UserDataServiceProvider>();
for (NetworkElement element : _networkElements) {
if (element instanceof PasswordServiceProvider) {
PasswordServiceProvider e = (PasswordServiceProvider)element;
if (element instanceof UserDataServiceProvider) {
UserDataServiceProvider e = (UserDataServiceProvider)element;
elements.add(e);
}
}
@ -3329,15 +3346,12 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
boolean success = true;
Network network = _networksDao.findById(staticNats.get(0).getNetworkId());
int found = 0;
for (NetworkElement ne : _networkElements) {
try {
if (!(ne instanceof StaticNATServiceProvider)) {
if (!(ne instanceof StaticNatServiceProvider)) {
continue;
}
StaticNATServiceProvider e = (StaticNATServiceProvider)ne;
found ++;
boolean handled = e.applyStaticNats(network, staticNats);
boolean handled = ((StaticNatServiceProvider)ne).applyStaticNats(network, staticNats);
s_logger.debug("Static Nat for network " + network.getId() + " were " + (handled ? "" : " not") + " handled by " + ne.getName());
} catch (ResourceUnavailableException e) {
if (!continueOnError) {

View File

@ -68,7 +68,7 @@ import com.cloud.vm.dao.UserVmDao;
@Local(value=NetworkElement.class)
public class DhcpElement extends AdapterBase implements DhcpElementService, PasswordServiceProvider {
public class DhcpElement extends AdapterBase implements DhcpElementService, UserDataServiceProvider {
private static final Logger s_logger = Logger.getLogger(DhcpElement.class);
private static final Map<Service, Map<Capability, String>> capabilities = setCapabilities();

View File

@ -40,6 +40,7 @@ import com.cloud.network.NetworkManager;
import com.cloud.network.Networks.TrafficType;
import com.cloud.network.dao.NetworkDao;
import com.cloud.network.lb.ElasticLoadBalancerManager;
import com.cloud.network.lb.LoadBalancingRule;
import com.cloud.network.rules.FirewallRule;
import com.cloud.offering.NetworkOffering;
import com.cloud.offerings.dao.NetworkOfferingDao;
@ -128,7 +129,7 @@ public class ElasticLoadBalancerElement extends AdapterBase implements LoadBalan
}
@Override
public boolean applyRules(Network network, List<? extends FirewallRule> rules) throws ResourceUnavailableException {
public boolean applyLBRules(Network network, List<LoadBalancingRule> rules) throws ResourceUnavailableException {
if (!canHandle(network)) {
return false;
}

View File

@ -41,6 +41,7 @@ import com.cloud.network.Network.Provider;
import com.cloud.network.Network.Service;
import com.cloud.network.NetworkManager;
import com.cloud.network.Networks.TrafficType;
import com.cloud.network.lb.LoadBalancingRule;
import com.cloud.network.rules.FirewallRule;
import com.cloud.offering.NetworkOffering;
import com.cloud.offerings.dao.NetworkOfferingServiceMapDao;
@ -107,7 +108,7 @@ public class F5ExternalLoadBalancerElement extends AdapterBase implements LoadBa
}
@Override
public boolean applyRules(Network config, List<? extends FirewallRule> rules) throws ResourceUnavailableException {
public boolean applyLBRules(Network config, List<LoadBalancingRule> rules) throws ResourceUnavailableException {
if (!canHandle(config)) {
return false;
}

View File

@ -47,6 +47,8 @@ import com.cloud.network.RemoteAccessVpn;
import com.cloud.network.VpnUser;
import com.cloud.network.dao.NetworkDao;
import com.cloud.network.rules.FirewallRule;
import com.cloud.network.rules.PortForwardingRule;
import com.cloud.network.rules.StaticNat;
import com.cloud.offering.NetworkOffering;
import com.cloud.offerings.NetworkOfferingVO;
import com.cloud.offerings.dao.NetworkOfferingDao;
@ -58,7 +60,7 @@ import com.cloud.vm.VirtualMachine;
import com.cloud.vm.VirtualMachineProfile;
@Local(value=NetworkElement.class)
public class JuniperSRXExternalFirewallElement extends AdapterBase implements SourceNATServiceProvider, FirewallServiceProvider, RemoteAccessVPNServiceProvider {
public class JuniperSRXExternalFirewallElement extends AdapterBase implements SourceNatServiceProvider, FirewallServiceProvider, PortForwardingServiceProvider, RemoteAccessVPNServiceProvider {
private static final Logger s_logger = Logger.getLogger(JuniperSRXExternalFirewallElement.class);
@ -142,7 +144,7 @@ public class JuniperSRXExternalFirewallElement extends AdapterBase implements So
@Override
public boolean applyRules(Network config, List<? extends FirewallRule> rules) throws ResourceUnavailableException {
public boolean applyFWRules(Network config, List<? extends FirewallRule> rules) throws ResourceUnavailableException {
if (!canHandle(config)) {
return false;
}
@ -231,6 +233,14 @@ public class JuniperSRXExternalFirewallElement extends AdapterBase implements So
return capabilities;
}
@Override
public boolean applyPFRules(Network network, List<PortForwardingRule> rules) throws ResourceUnavailableException {
if (!canHandle(network)) {
return false;
}
return _externalNetworkManager.applyFirewallRules(network, rules);
}
}

View File

@ -40,6 +40,7 @@ import com.cloud.network.Network.Provider;
import com.cloud.network.Network.Service;
import com.cloud.network.NetworkManager;
import com.cloud.network.Networks.TrafficType;
import com.cloud.network.lb.LoadBalancingRule;
import com.cloud.network.rules.FirewallRule;
import com.cloud.offering.NetworkOffering;
import com.cloud.offerings.dao.NetworkOfferingServiceMapDao;
@ -106,7 +107,7 @@ public class NetscalerExternalLoadBalancerElement extends AdapterBase implements
}
@Override
public boolean applyRules(Network config, List<? extends FirewallRule> rules) throws ResourceUnavailableException {
public boolean applyLBRules(Network config, List<LoadBalancingRule> rules) throws ResourceUnavailableException {
if (!canHandle(config)) {
return false;
}

View File

@ -47,11 +47,13 @@ import com.cloud.network.dao.LoadBalancerDao;
import com.cloud.network.dao.NetworkDao;
import com.cloud.network.dao.VirtualRouterElementsDao;
import com.cloud.network.element.VirtualRouterElements.VirtualRouterElementsType;
import com.cloud.network.lb.LoadBalancingRule;
import com.cloud.network.lb.LoadBalancingRulesManager;
import com.cloud.network.router.VirtualNetworkApplianceManager;
import com.cloud.network.router.VirtualRouter;
import com.cloud.network.router.VirtualRouter.Role;
import com.cloud.network.rules.FirewallRule;
import com.cloud.network.rules.PortForwardingRule;
import com.cloud.network.rules.RulesManager;
import com.cloud.network.rules.StaticNat;
import com.cloud.offering.NetworkOffering;
@ -70,7 +72,7 @@ import com.cloud.vm.dao.UserVmDao;
@Local(value=NetworkElement.class)
public class VirtualRouterElement extends DhcpElement implements VirtualRouterElementService, SourceNATServiceProvider, FirewallServiceProvider, LoadBalancingServiceProvider, StaticNATServiceProvider, RemoteAccessVPNServiceProvider {
public class VirtualRouterElement extends DhcpElement implements VirtualRouterElementService, SourceNatServiceProvider, StaticNatServiceProvider, FirewallServiceProvider, LoadBalancingServiceProvider, PortForwardingServiceProvider, RemoteAccessVPNServiceProvider {
private static final Logger s_logger = Logger.getLogger(VirtualRouterElement.class);
private static final Map<Service, Map<Capability, String>> capabilities = setCapabilities();
@ -173,7 +175,7 @@ public class VirtualRouterElement extends DhcpElement implements VirtualRouterEl
// }
@Override
public boolean applyRules(Network config, List<? extends FirewallRule> rules) throws ResourceUnavailableException {
public boolean applyFWRules(Network config, List<? extends FirewallRule> rules) throws ResourceUnavailableException {
DataCenter dc = _configMgr.getZone(config.getDataCenterId());
if (canHandle(config.getType(), config.getNetworkOfferingId())) {
@ -193,6 +195,25 @@ public class VirtualRouterElement extends DhcpElement implements VirtualRouterEl
}
}
@Override
public boolean applyLBRules(Network network, List<LoadBalancingRule> rules) throws ResourceUnavailableException {
if (canHandle(network.getType(), network.getNetworkOfferingId())) {
List<DomainRouterVO> routers = _routerDao.listByNetworkAndRole(network.getId(), Role.DHCP_FIREWALL_LB_PASSWD_USERDATA);
if (routers == null || routers.isEmpty()) {
s_logger.debug("Virtual router elemnt doesn't need to apply firewall rules on the backend; virtual router doesn't exist in the network " + network.getId());
return true;
}
if(!_routerMgr.applyFirewallRules(network, rules, routers)){
throw new CloudRuntimeException("Failed to apply firewall rules in network " + network.getId());
} else {
return true;
}
} else {
return true;
}
}
@Override
public String[] applyVpnUsers(RemoteAccessVpn vpn, List<? extends VpnUser> users) throws ResourceUnavailableException{
@ -403,4 +424,23 @@ public class VirtualRouterElement extends DhcpElement implements VirtualRouterEl
_vrElementsDao.persist(element);
return true;
}
@Override
public boolean applyPFRules(Network network, List<PortForwardingRule> rules) throws ResourceUnavailableException {
if (canHandle(network.getType(), network.getNetworkOfferingId())) {
List<DomainRouterVO> routers = _routerDao.listByNetworkAndRole(network.getId(), Role.DHCP_FIREWALL_LB_PASSWD_USERDATA);
if (routers == null || routers.isEmpty()) {
s_logger.debug("Virtual router elemnt doesn't need to apply firewall rules on the backend; virtual router doesn't exist in the network " + network.getId());
return true;
}
if(!_routerMgr.applyFirewallRules(network, rules, routers)){
throw new CloudRuntimeException("Failed to apply firewall rules in network " + network.getId());
} else {
return true;
}
} else {
return true;
}
}
}

View File

@ -128,7 +128,7 @@ import com.cloud.network.dao.IPAddressDao;
import com.cloud.network.dao.LoadBalancerDao;
import com.cloud.network.dao.LoadBalancerVMMapDao;
import com.cloud.network.dao.NetworkDao;
import com.cloud.network.element.PasswordServiceProvider;
import com.cloud.network.element.UserDataServiceProvider;
import com.cloud.network.lb.LoadBalancingRulesManager;
import com.cloud.network.router.VirtualNetworkApplianceManager;
import com.cloud.network.rules.FirewallManager;
@ -428,10 +428,10 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager
VirtualMachineProfile<VMInstanceVO> vmProfile = new VirtualMachineProfileImpl<VMInstanceVO>(vmInstance);
vmProfile.setParameter(VirtualMachineProfile.Param.VmPassword, password);
List<? extends PasswordServiceProvider> elements = _networkMgr.getPasswordResetElements();
List<? extends UserDataServiceProvider> elements = _networkMgr.getPasswordResetElements();
boolean result = true;
for (PasswordServiceProvider element : elements) {
for (UserDataServiceProvider element : elements) {
if (!element.savePassword(defaultNetwork, defaultNicProfile, vmProfile)) {
result = false;
}