From 0121c0516d5b6d7baeb326e0029d25742ce6e538 Mon Sep 17 00:00:00 2001 From: Sheng Yang Date: Fri, 7 Oct 2011 18:07:35 -0700 Subject: [PATCH] Network: Add Service providers In the past, the NetworkElement would cover almost all the functionality that e.g. virtual router can cover: firewall, source NAT, static NAT, password, VPN... So anyone want to implement the NetworkElement would have to implement these service's specific methods, even it wouldn't support it. Also, if we want to find a e.g. FirewallServiceProvider, we have to proceed all the current network service providers, to call a method to know if it support such service. That's neither elegant nor scaling way to do it. As the first step, this patch separates each ServiceProvider from NetworkElement (there are some interface already out of NetworkElement, so this patch slightly modifies them too), and only the class would implement the correlated interface, would have the ability to do these services. --- .../element/FirewallServiceProvider.java | 19 ++++++ .../cloud/network/element/NetworkElement.java | 33 ---------- .../element/PasswordServiceProvider.java | 12 ++++ .../RemoteAccessVPNServiceProvider.java | 18 ++++++ .../element/SourceNATServiceProvider.java | 20 ++++++ .../element/StaticNATServiceProvider.java | 20 ++++++ .../network/vpn/PasswordResetElement.java | 30 --------- .../network/vpn/RemoteAccessVpnElement.java | 34 ---------- .../src/com/cloud/network/NetworkManager.java | 8 +-- .../com/cloud/network/NetworkManagerImpl.java | 62 +++++++++++++++---- .../network/element/BareMetalElement.java | 16 ----- .../element/CloudZonesNetworkElement.java | 25 +------- .../cloud/network/element/DhcpElement.java | 20 ++---- .../element/ElasticLoadBalancerElement.java | 13 ++-- .../network/element/ExternalDhcpElement.java | 24 +------ .../element/ExternalFirewallElement.java | 17 +++-- .../F5ExternalLoadBalancerElement.java | 14 ++--- .../NetscalerExternalLoadBalancerElement.java | 14 ++--- .../com/cloud/network/element/OvsElement.java | 20 ------ .../network/element/VirtualRouterElement.java | 23 ++++++- .../vpn/RemoteAccessVpnManagerImpl.java | 13 ++-- .../src/com/cloud/vm/UserVmManagerImpl.java | 6 +- 22 files changed, 204 insertions(+), 257 deletions(-) create mode 100644 api/src/com/cloud/network/element/FirewallServiceProvider.java create mode 100644 api/src/com/cloud/network/element/PasswordServiceProvider.java create mode 100644 api/src/com/cloud/network/element/RemoteAccessVPNServiceProvider.java create mode 100644 api/src/com/cloud/network/element/SourceNATServiceProvider.java create mode 100644 api/src/com/cloud/network/element/StaticNATServiceProvider.java delete mode 100644 api/src/com/cloud/network/vpn/PasswordResetElement.java delete mode 100644 api/src/com/cloud/network/vpn/RemoteAccessVpnElement.java diff --git a/api/src/com/cloud/network/element/FirewallServiceProvider.java b/api/src/com/cloud/network/element/FirewallServiceProvider.java new file mode 100644 index 00000000000..9d00da94949 --- /dev/null +++ b/api/src/com/cloud/network/element/FirewallServiceProvider.java @@ -0,0 +1,19 @@ +package com.cloud.network.element; + +import java.util.List; + +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.network.Network; +import com.cloud.network.rules.FirewallRule; + +public interface FirewallServiceProvider extends NetworkElement { + /** + * Apply rules + * @param network + * @param rules + * @return + * @throws ResourceUnavailableException + */ + boolean applyRules(Network network, List rules) throws ResourceUnavailableException; + boolean isFirewallServiceProvider(); +} diff --git a/api/src/com/cloud/network/element/NetworkElement.java b/api/src/com/cloud/network/element/NetworkElement.java index bf9ca329b8e..8ff75971b09 100644 --- a/api/src/com/cloud/network/element/NetworkElement.java +++ b/api/src/com/cloud/network/element/NetworkElement.java @@ -21,7 +21,6 @@ */ package com.cloud.network.element; -import java.util.List; import java.util.Map; import com.cloud.deploy.DeployDestination; @@ -33,9 +32,6 @@ import com.cloud.network.Network; import com.cloud.network.Network.Capability; import com.cloud.network.Network.Provider; import com.cloud.network.Network.Service; -import com.cloud.network.PublicIpAddress; -import com.cloud.network.rules.FirewallRule; -import com.cloud.network.rules.StaticNat; import com.cloud.offering.NetworkOffering; import com.cloud.utils.component.Adapter; import com.cloud.vm.NicProfile; @@ -115,33 +111,4 @@ public interface NetworkElement extends Adapter { * @throws ConcurrentOperationException */ boolean destroy(Network network) throws ConcurrentOperationException, ResourceUnavailableException; - - - /** - * Apply ip addresses to this network - * @param network - * @param ipAddress - * @return - * @throws ResourceUnavailableException - */ - boolean applyIps(Network network, List ipAddress) throws ResourceUnavailableException; - - /** - * Apply rules - * @param network - * @param rules - * @return - * @throws ResourceUnavailableException - */ - boolean applyRules(Network network, List rules) throws ResourceUnavailableException; - - /** - * Creates static nat rule (public IP to private IP mapping) on the network element - * @param config - * @param rules - * @return - * @throws ResourceUnavailableException - */ - boolean applyStaticNats(Network config, List rules) throws ResourceUnavailableException; - } diff --git a/api/src/com/cloud/network/element/PasswordServiceProvider.java b/api/src/com/cloud/network/element/PasswordServiceProvider.java new file mode 100644 index 00000000000..092c3590b72 --- /dev/null +++ b/api/src/com/cloud/network/element/PasswordServiceProvider.java @@ -0,0 +1,12 @@ +package com.cloud.network.element; + +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.network.Network; +import com.cloud.vm.NicProfile; +import com.cloud.vm.VirtualMachine; +import com.cloud.vm.VirtualMachineProfile; + +public interface PasswordServiceProvider extends NetworkElement { + boolean savePassword(Network network, NicProfile nic, VirtualMachineProfile vm) throws ResourceUnavailableException; + boolean isPasswordServiceProvider(); +} diff --git a/api/src/com/cloud/network/element/RemoteAccessVPNServiceProvider.java b/api/src/com/cloud/network/element/RemoteAccessVPNServiceProvider.java new file mode 100644 index 00000000000..31026bfbe5c --- /dev/null +++ b/api/src/com/cloud/network/element/RemoteAccessVPNServiceProvider.java @@ -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.RemoteAccessVpn; +import com.cloud.network.VpnUser; + +public interface RemoteAccessVPNServiceProvider extends NetworkElement { + String[] applyVpnUsers(RemoteAccessVpn vpn, List users) throws ResourceUnavailableException; + + boolean startVpn(Network network, RemoteAccessVpn vpn) throws ResourceUnavailableException; + + boolean stopVpn(Network network, RemoteAccessVpn vpn) throws ResourceUnavailableException; + + boolean isRemoteAccessVPNServiceProvider(); +} diff --git a/api/src/com/cloud/network/element/SourceNATServiceProvider.java b/api/src/com/cloud/network/element/SourceNATServiceProvider.java new file mode 100644 index 00000000000..2d1d9761de0 --- /dev/null +++ b/api/src/com/cloud/network/element/SourceNATServiceProvider.java @@ -0,0 +1,20 @@ +package com.cloud.network.element; + +import java.util.List; + +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.network.Network; +import com.cloud.network.PublicIpAddress; + +public interface SourceNATServiceProvider extends NetworkElement { + /** + * Apply ip addresses to this network + * @param network + * @param ipAddress + * @return + * @throws ResourceUnavailableException + */ + boolean applyIps(Network network, List ipAddress) throws ResourceUnavailableException; + + boolean isSourceNATServiceProvider(); +} diff --git a/api/src/com/cloud/network/element/StaticNATServiceProvider.java b/api/src/com/cloud/network/element/StaticNATServiceProvider.java new file mode 100644 index 00000000000..91ea72406ad --- /dev/null +++ b/api/src/com/cloud/network/element/StaticNATServiceProvider.java @@ -0,0 +1,20 @@ +package com.cloud.network.element; + +import java.util.List; + +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.network.Network; +import com.cloud.network.rules.StaticNat; + +public interface StaticNATServiceProvider extends NetworkElement { + /** + * Creates static nat rule (public IP to private IP mapping) on the network element + * @param config + * @param rules + * @return + * @throws ResourceUnavailableException + */ + boolean applyStaticNats(Network config, List rules) throws ResourceUnavailableException; + + boolean isStaticNATServiceProvider(); +} diff --git a/api/src/com/cloud/network/vpn/PasswordResetElement.java b/api/src/com/cloud/network/vpn/PasswordResetElement.java deleted file mode 100644 index ab362b451eb..00000000000 --- a/api/src/com/cloud/network/vpn/PasswordResetElement.java +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. - * - * This software is licensed under the GNU General Public License v3 or later. - * - * It is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or any later version. - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -package com.cloud.network.vpn; - -import com.cloud.exception.ResourceUnavailableException; -import com.cloud.network.Network; -import com.cloud.vm.NicProfile; -import com.cloud.vm.VirtualMachine; -import com.cloud.vm.VirtualMachineProfile; - -public interface PasswordResetElement { - - boolean savePassword(Network network, NicProfile nic, VirtualMachineProfile vm) throws ResourceUnavailableException; -} diff --git a/api/src/com/cloud/network/vpn/RemoteAccessVpnElement.java b/api/src/com/cloud/network/vpn/RemoteAccessVpnElement.java deleted file mode 100644 index 0a1dfbfd379..00000000000 --- a/api/src/com/cloud/network/vpn/RemoteAccessVpnElement.java +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. - * - * This software is licensed under the GNU General Public License v3 or later. - * - * It is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or any later version. - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -package com.cloud.network.vpn; - -import java.util.List; - -import com.cloud.exception.ResourceUnavailableException; -import com.cloud.network.Network; -import com.cloud.network.RemoteAccessVpn; -import com.cloud.network.VpnUser; -import com.cloud.utils.component.Adapter; - -public interface RemoteAccessVpnElement extends Adapter { - String[] applyVpnUsers(RemoteAccessVpn vpn, List users) throws ResourceUnavailableException; - - boolean startVpn(Network network, RemoteAccessVpn vpn) throws ResourceUnavailableException; - - boolean stopVpn(Network network, RemoteAccessVpn vpn) throws ResourceUnavailableException; -} diff --git a/server/src/com/cloud/network/NetworkManager.java b/server/src/com/cloud/network/NetworkManager.java index 1fe3c6371f8..582b884f850 100644 --- a/server/src/com/cloud/network/NetworkManager.java +++ b/server/src/com/cloud/network/NetworkManager.java @@ -33,11 +33,11 @@ import com.cloud.network.Network.GuestIpType; 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.RemoteAccessVPNServiceProvider; import com.cloud.network.guru.NetworkGuru; import com.cloud.network.rules.FirewallRule; import com.cloud.network.rules.StaticNat; -import com.cloud.network.vpn.PasswordResetElement; -import com.cloud.network.vpn.RemoteAccessVpnElement; import com.cloud.offerings.NetworkOfferingVO; import com.cloud.user.Account; import com.cloud.user.AccountVO; @@ -142,7 +142,7 @@ public interface NetworkManager extends NetworkService { boolean applyRules(List rules, boolean continueOnError) throws ResourceUnavailableException; - List getRemoteAccessVpnElements(); + List getRemoteAccessVpnElements(); PublicIpAddress getPublicIpAddress(long ipAddressId); @@ -186,7 +186,7 @@ public interface NetworkManager extends NetworkService { Nic getDefaultNic(long vmId); - List getPasswordResetElements(); + List getPasswordResetElements(); boolean zoneIsConfiguredForExternalNetworking(long zoneId); diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index 56808f7df76..acc8a091de0 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -97,7 +97,12 @@ import com.cloud.network.dao.FirewallRulesDao; import com.cloud.network.dao.IPAddressDao; import com.cloud.network.dao.NetworkDao; import com.cloud.network.dao.NetworkDomainDao; +import com.cloud.network.element.FirewallServiceProvider; import com.cloud.network.element.NetworkElement; +import com.cloud.network.element.PasswordServiceProvider; +import com.cloud.network.element.RemoteAccessVPNServiceProvider; +import com.cloud.network.element.SourceNATServiceProvider; +import com.cloud.network.element.StaticNATServiceProvider; import com.cloud.network.guru.NetworkGuru; import com.cloud.network.lb.LoadBalancingRulesManager; import com.cloud.network.rules.FirewallManager; @@ -106,8 +111,6 @@ import com.cloud.network.rules.FirewallRule.Purpose; import com.cloud.network.rules.FirewallRuleVO; import com.cloud.network.rules.RulesManager; import com.cloud.network.rules.StaticNat; -import com.cloud.network.vpn.PasswordResetElement; -import com.cloud.network.vpn.RemoteAccessVpnElement; import com.cloud.network.vpn.RemoteAccessVpnService; import com.cloud.offering.NetworkOffering; import com.cloud.offering.NetworkOffering.Availability; @@ -493,10 +496,19 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } boolean success = true; + int found = 0; for (NetworkElement element : _networkElements) { try { + if (!(element instanceof SourceNATServiceProvider)) { + continue; + } + SourceNATServiceProvider e = (SourceNATServiceProvider)element; + if (!e.isSourceNATServiceProvider()) { + continue; + } + found ++; s_logger.trace("Asking " + element + " to apply ip associations"); - element.applyIps(network, publicIps); + e.applyIps(network, publicIps); } catch (ResourceUnavailableException e) { success = false; if (!continueOnError) { @@ -1478,11 +1490,14 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } @Override - public List getRemoteAccessVpnElements() { - List elements = new ArrayList(); + public List getRemoteAccessVpnElements() { + List elements = new ArrayList(); for (NetworkElement element : _networkElements) { - if (element instanceof RemoteAccessVpnElement) { - elements.add((RemoteAccessVpnElement) element); + if (element instanceof RemoteAccessVPNServiceProvider) { + RemoteAccessVPNServiceProvider e = (RemoteAccessVPNServiceProvider) element; + if (e.isRemoteAccessVPNServiceProvider()) { + elements.add(e); + } } } @@ -2303,9 +2318,18 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag boolean success = true; Network network = _networksDao.findById(rules.get(0).getNetworkId()); + int found = 0; for (NetworkElement ne : _networkElements) { try { - boolean handled = ne.applyRules(network, rules); + if (!(ne instanceof FirewallServiceProvider)) { + continue; + } + FirewallServiceProvider e = (FirewallServiceProvider)ne; + if (!e.isFirewallServiceProvider()) { + continue; + } + found ++; + boolean handled = e.applyRules(network, rules); s_logger.debug("Network Rules for network " + network.getId() + " were " + (handled ? "" : " not") + " handled by " + ne.getName()); } catch (ResourceUnavailableException e) { if (!continueOnError) { @@ -2810,11 +2834,14 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } @Override - public List getPasswordResetElements() { - List elements = new ArrayList(); + public List getPasswordResetElements() { + List elements = new ArrayList(); for (NetworkElement element : _networkElements) { - if (element instanceof PasswordResetElement) { - elements.add((PasswordResetElement) element); + if (element instanceof PasswordServiceProvider) { + PasswordServiceProvider e = (PasswordServiceProvider)element; + if (e.isPasswordServiceProvider()) { + elements.add(e); + } } } return elements; @@ -3267,9 +3294,18 @@ 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 { - boolean handled = ne.applyStaticNats(network, staticNats); + if (!(ne instanceof StaticNATServiceProvider)) { + continue; + } + StaticNATServiceProvider e = (StaticNATServiceProvider)ne; + if (!e.isStaticNATServiceProvider()) { + continue; + } + found ++; + boolean handled = e.applyStaticNats(network, staticNats); s_logger.debug("Static Nat for network " + network.getId() + " were " + (handled ? "" : " not") + " handled by " + ne.getName()); } catch (ResourceUnavailableException e) { if (!continueOnError) { diff --git a/server/src/com/cloud/network/element/BareMetalElement.java b/server/src/com/cloud/network/element/BareMetalElement.java index fae74d8fbb3..9fc1d60e7a1 100644 --- a/server/src/com/cloud/network/element/BareMetalElement.java +++ b/server/src/com/cloud/network/element/BareMetalElement.java @@ -116,20 +116,4 @@ public class BareMetalElement extends AdapterBase implements NetworkElement { public boolean destroy(Network network) throws ConcurrentOperationException, ResourceUnavailableException { return true; } - - @Override - public boolean applyIps(Network network, List ipAddress) throws ResourceUnavailableException { - return true; - } - - @Override - public boolean applyRules(Network network, List rules) throws ResourceUnavailableException { - return true; - } - - @Override - public boolean applyStaticNats(Network config, List rules) throws ResourceUnavailableException { - return false; - } - } diff --git a/server/src/com/cloud/network/element/CloudZonesNetworkElement.java b/server/src/com/cloud/network/element/CloudZonesNetworkElement.java index 39259eec57d..f9d778b41eb 100644 --- a/server/src/com/cloud/network/element/CloudZonesNetworkElement.java +++ b/server/src/com/cloud/network/element/CloudZonesNetworkElement.java @@ -74,7 +74,6 @@ import com.cloud.network.router.VirtualNetworkApplianceManager; import com.cloud.network.router.VirtualRouter; import com.cloud.network.rules.FirewallRule; import com.cloud.network.rules.StaticNat; -import com.cloud.network.vpn.PasswordResetElement; import com.cloud.offering.NetworkOffering; import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.uservm.UserVm; @@ -96,7 +95,7 @@ import com.cloud.vm.dao.UserVmDao; @Local(value=NetworkElement.class) -public class CloudZonesNetworkElement extends AdapterBase implements NetworkElement, PasswordResetElement{ +public class CloudZonesNetworkElement extends AdapterBase implements NetworkElement { private static final Logger s_logger = Logger.getLogger(CloudZonesNetworkElement.class); private static final Map> capabilities = setCapabilities(); @@ -194,22 +193,6 @@ public class CloudZonesNetworkElement extends AdapterBase implements NetworkElem return false; //assume that the agent will remove userdata etc } - @Override - public boolean applyRules(Network network, List rules) throws ResourceUnavailableException { - return false; - } - - @Override - public boolean applyIps(Network network, List ipAddress) throws ResourceUnavailableException { - return false; - } - - @Override - public boolean applyStaticNats(Network config, List rules) throws ResourceUnavailableException { - return false; - } - - @Override public Provider getProvider() { return Provider.ExternalDhcpServer; @@ -236,12 +219,6 @@ public class CloudZonesNetworkElement extends AdapterBase implements NetworkElem } - @Override - public boolean savePassword(Network network, NicProfile nic, VirtualMachineProfile vm) throws ResourceUnavailableException{ - s_logger.trace("Cloudzones element doesn't handle saving passwords for " + network); - return true; - } - private VmDataCommand generateVmDataCommand( String vmPrivateIpAddress, String userData, String serviceOffering, String zoneName, String guestIpAddress, String vmName, String vmInstanceName, long vmId, String publicKey) { VmDataCommand cmd = new VmDataCommand(vmPrivateIpAddress, vmName); diff --git a/server/src/com/cloud/network/element/DhcpElement.java b/server/src/com/cloud/network/element/DhcpElement.java index 179f266ab1e..a8a51631f60 100644 --- a/server/src/com/cloud/network/element/DhcpElement.java +++ b/server/src/com/cloud/network/element/DhcpElement.java @@ -49,7 +49,6 @@ import com.cloud.network.router.VirtualRouter; import com.cloud.network.router.VirtualRouter.Role; import com.cloud.network.rules.FirewallRule; import com.cloud.network.rules.StaticNat; -import com.cloud.network.vpn.PasswordResetElement; import com.cloud.offering.NetworkOffering; import com.cloud.org.Cluster; import com.cloud.user.AccountManager; @@ -68,7 +67,7 @@ import com.cloud.vm.dao.UserVmDao; @Local(value=NetworkElement.class) -public class DhcpElement extends AdapterBase implements NetworkElement, PasswordResetElement{ +public class DhcpElement extends AdapterBase implements PasswordServiceProvider { private static final Logger s_logger = Logger.getLogger(DhcpElement.class); private static final Map> capabilities = setCapabilities(); @@ -176,17 +175,6 @@ public class DhcpElement extends AdapterBase implements NetworkElement, Password return result; } - @Override - public boolean applyRules(Network network, List rules) throws ResourceUnavailableException { - return false; - } - - @Override - public boolean applyIps(Network network, List ipAddress) throws ResourceUnavailableException { - return false; - } - - @Override public Provider getProvider() { return Provider.DhcpServer; @@ -268,9 +256,9 @@ public class DhcpElement extends AdapterBase implements NetworkElement, Password return _routerMgr.savePasswordToRouter(network, nic, uservm, routers); } - + @Override - public boolean applyStaticNats(Network config, List rules) throws ResourceUnavailableException { - return false; + public boolean isPasswordServiceProvider() { + return true; } } diff --git a/server/src/com/cloud/network/element/ElasticLoadBalancerElement.java b/server/src/com/cloud/network/element/ElasticLoadBalancerElement.java index 535cea4fd9d..b814d959b8a 100644 --- a/server/src/com/cloud/network/element/ElasticLoadBalancerElement.java +++ b/server/src/com/cloud/network/element/ElasticLoadBalancerElement.java @@ -54,7 +54,7 @@ import com.cloud.vm.VirtualMachineProfile; @Local(value=NetworkElement.class) -public class ElasticLoadBalancerElement extends AdapterBase implements NetworkElement{ +public class ElasticLoadBalancerElement extends AdapterBase implements FirewallServiceProvider { private static final Logger s_logger = Logger.getLogger(ElasticLoadBalancerElement.class); private static final Map> capabilities = setCapabilities(); @Inject NetworkManager _networkManager; @@ -135,11 +135,6 @@ public class ElasticLoadBalancerElement extends AdapterBase implements NetworkEl return false; } - @Override - public boolean applyIps(Network network, List ipAddress) throws ResourceUnavailableException { - return true; - } - @Override public boolean applyRules(Network network, List rules) throws ResourceUnavailableException { if (!canHandle(network)) { @@ -167,9 +162,9 @@ public class ElasticLoadBalancerElement extends AdapterBase implements NetworkEl } return true; } - + @Override - public boolean applyStaticNats(Network config, List rules) throws ResourceUnavailableException { - return false; + public boolean isFirewallServiceProvider() { + return true; } } diff --git a/server/src/com/cloud/network/element/ExternalDhcpElement.java b/server/src/com/cloud/network/element/ExternalDhcpElement.java index e8c19817863..777f4af7b41 100644 --- a/server/src/com/cloud/network/element/ExternalDhcpElement.java +++ b/server/src/com/cloud/network/element/ExternalDhcpElement.java @@ -45,7 +45,6 @@ import com.cloud.network.Network.Service; import com.cloud.network.Networks.TrafficType; import com.cloud.network.rules.FirewallRule; import com.cloud.network.rules.StaticNat; -import com.cloud.network.vpn.PasswordResetElement; import com.cloud.offering.NetworkOffering; import com.cloud.utils.component.AdapterBase; import com.cloud.utils.component.Inject; @@ -56,7 +55,7 @@ import com.cloud.vm.VirtualMachine; import com.cloud.vm.VirtualMachineProfile; @Local(value=NetworkElement.class) -public class ExternalDhcpElement extends AdapterBase implements NetworkElement, PasswordResetElement { +public class ExternalDhcpElement extends AdapterBase implements NetworkElement { private static final Logger s_logger = Logger.getLogger(ExternalDhcpElement.class); @Inject ExternalDhcpManager _dhcpMgr; private boolean canHandle(GuestIpType ipType, DeployDestination dest, TrafficType trafficType) { @@ -72,11 +71,6 @@ public class ExternalDhcpElement extends AdapterBase implements NetworkElement, return false; } - @Override - public boolean savePassword(Network network, NicProfile nic, VirtualMachineProfile vm) throws ResourceUnavailableException { - return true; - } - @Override public Map> getCapabilities() { return null; @@ -129,20 +123,4 @@ public class ExternalDhcpElement extends AdapterBase implements NetworkElement, public boolean destroy(Network network) throws ConcurrentOperationException, ResourceUnavailableException { return true; } - - @Override - public boolean applyIps(Network network, List ipAddress) throws ResourceUnavailableException { - return true; - } - - @Override - public boolean applyRules(Network network, List rules) throws ResourceUnavailableException { - return true; - } - - @Override - public boolean applyStaticNats(Network config, List rules) throws ResourceUnavailableException { - return false; - } - } diff --git a/server/src/com/cloud/network/element/ExternalFirewallElement.java b/server/src/com/cloud/network/element/ExternalFirewallElement.java index 0d0db524b17..1a848b05aff 100644 --- a/server/src/com/cloud/network/element/ExternalFirewallElement.java +++ b/server/src/com/cloud/network/element/ExternalFirewallElement.java @@ -48,7 +48,6 @@ import com.cloud.network.VpnUser; import com.cloud.network.dao.NetworkDao; import com.cloud.network.rules.FirewallRule; import com.cloud.network.rules.StaticNat; -import com.cloud.network.vpn.RemoteAccessVpnElement; import com.cloud.offering.NetworkOffering; import com.cloud.offerings.NetworkOfferingVO; import com.cloud.offerings.dao.NetworkOfferingDao; @@ -60,7 +59,7 @@ import com.cloud.vm.VirtualMachine; import com.cloud.vm.VirtualMachineProfile; @Local(value=NetworkElement.class) -public class ExternalFirewallElement extends AdapterBase implements NetworkElement, RemoteAccessVpnElement { +public class ExternalFirewallElement extends AdapterBase implements SourceNATServiceProvider, FirewallServiceProvider, RemoteAccessVPNServiceProvider { private static final Logger s_logger = Logger.getLogger(ExternalFirewallElement.class); @@ -239,8 +238,18 @@ public class ExternalFirewallElement extends AdapterBase implements NetworkEleme } @Override - public boolean applyStaticNats(Network config, List rules) throws ResourceUnavailableException { - return false; + public boolean isSourceNATServiceProvider() { + return true; + } + + @Override + public boolean isFirewallServiceProvider() { + return true; + } + + @Override + public boolean isRemoteAccessVPNServiceProvider() { + return true; } } diff --git a/server/src/com/cloud/network/element/F5ExternalLoadBalancerElement.java b/server/src/com/cloud/network/element/F5ExternalLoadBalancerElement.java index 51ab184c9ef..af105990747 100644 --- a/server/src/com/cloud/network/element/F5ExternalLoadBalancerElement.java +++ b/server/src/com/cloud/network/element/F5ExternalLoadBalancerElement.java @@ -53,7 +53,7 @@ import com.cloud.vm.VirtualMachine; import com.cloud.vm.VirtualMachineProfile; @Local(value=NetworkElement.class) -public class F5ExternalLoadBalancerElement extends AdapterBase implements NetworkElement { +public class F5ExternalLoadBalancerElement extends AdapterBase implements FirewallServiceProvider { private static final Logger s_logger = Logger.getLogger(F5ExternalLoadBalancerElement.class); @@ -106,11 +106,6 @@ public class F5ExternalLoadBalancerElement extends AdapterBase implements Networ return true; } - @Override - public boolean applyIps(Network network, List ipAddress) throws ResourceUnavailableException { - return true; - } - @Override public boolean applyRules(Network config, List rules) throws ResourceUnavailableException { if (!canHandle(config)) { @@ -153,10 +148,9 @@ public class F5ExternalLoadBalancerElement extends AdapterBase implements Networ public boolean restart(Network network, ReservationContext context, boolean cleanup) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException{ return true; } - + @Override - public boolean applyStaticNats(Network config, List rules) throws ResourceUnavailableException { - return false; + public boolean isFirewallServiceProvider() { + return true; } - } diff --git a/server/src/com/cloud/network/element/NetscalerExternalLoadBalancerElement.java b/server/src/com/cloud/network/element/NetscalerExternalLoadBalancerElement.java index 4fe36ae2d09..fed4aac022f 100644 --- a/server/src/com/cloud/network/element/NetscalerExternalLoadBalancerElement.java +++ b/server/src/com/cloud/network/element/NetscalerExternalLoadBalancerElement.java @@ -53,7 +53,7 @@ import com.cloud.vm.VirtualMachine; import com.cloud.vm.VirtualMachineProfile; @Local(value=NetworkElement.class) -public class NetscalerExternalLoadBalancerElement extends AdapterBase implements NetworkElement { +public class NetscalerExternalLoadBalancerElement extends AdapterBase implements FirewallServiceProvider { private static final Logger s_logger = Logger.getLogger(NetscalerExternalLoadBalancerElement.class); @@ -106,11 +106,6 @@ public class NetscalerExternalLoadBalancerElement extends AdapterBase implements return true; } - @Override - public boolean applyIps(Network network, List ipAddress) throws ResourceUnavailableException { - return true; - } - @Override public boolean applyRules(Network config, List rules) throws ResourceUnavailableException { if (!canHandle(config)) { @@ -153,10 +148,9 @@ public class NetscalerExternalLoadBalancerElement extends AdapterBase implements public boolean restart(Network network, ReservationContext context, boolean cleanup) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException{ return true; } - + @Override - public boolean applyStaticNats(Network config, List rules) throws ResourceUnavailableException { - return false; + public boolean isFirewallServiceProvider() { + return true; } - } diff --git a/server/src/com/cloud/network/element/OvsElement.java b/server/src/com/cloud/network/element/OvsElement.java index 4dca5bf9234..1b928578533 100644 --- a/server/src/com/cloud/network/element/OvsElement.java +++ b/server/src/com/cloud/network/element/OvsElement.java @@ -52,20 +52,6 @@ public class OvsElement extends AdapterBase implements NetworkElement { @Inject OvsNetworkManager _ovsVlanMgr; @Inject OvsTunnelManager _ovsTunnelMgr; - @Override - public boolean applyIps(Network network, - List ipAddress) - throws ResourceUnavailableException { - return true; - } - - @Override - public boolean applyRules(Network network, - List rules) - throws ResourceUnavailableException { - return true; - } - @Override public boolean destroy(Network network) throws ConcurrentOperationException, ResourceUnavailableException { @@ -143,10 +129,4 @@ public class OvsElement extends AdapterBase implements NetworkElement { throws ConcurrentOperationException, ResourceUnavailableException { return true; } - - @Override - public boolean applyStaticNats(Network config, List rules) throws ResourceUnavailableException { - return false; - } - } diff --git a/server/src/com/cloud/network/element/VirtualRouterElement.java b/server/src/com/cloud/network/element/VirtualRouterElement.java index eb77ad262b5..ef73c1bd5b8 100644 --- a/server/src/com/cloud/network/element/VirtualRouterElement.java +++ b/server/src/com/cloud/network/element/VirtualRouterElement.java @@ -51,7 +51,6 @@ import com.cloud.network.router.VirtualRouter.Role; import com.cloud.network.rules.FirewallRule; import com.cloud.network.rules.RulesManager; import com.cloud.network.rules.StaticNat; -import com.cloud.network.vpn.RemoteAccessVpnElement; import com.cloud.offering.NetworkOffering; import com.cloud.offerings.NetworkOfferingVO; import com.cloud.offerings.dao.NetworkOfferingDao; @@ -71,7 +70,7 @@ import com.cloud.vm.dao.UserVmDao; @Local(value=NetworkElement.class) -public class VirtualRouterElement extends DhcpElement implements NetworkElement, RemoteAccessVpnElement { +public class VirtualRouterElement extends DhcpElement implements SourceNATServiceProvider, FirewallServiceProvider, StaticNATServiceProvider, RemoteAccessVPNServiceProvider { private static final Logger s_logger = Logger.getLogger(VirtualRouterElement.class); private static final Map> capabilities = setCapabilities(); @@ -381,4 +380,24 @@ public class VirtualRouterElement extends DhcpElement implements NetworkElement, return _routerMgr.savePasswordToRouter(network, nic, uservm, routers); } + + @Override + public boolean isSourceNATServiceProvider() { + return true; + } + + @Override + public boolean isFirewallServiceProvider() { + return true; + } + + @Override + public boolean isStaticNATServiceProvider() { + return true; + } + + @Override + public boolean isRemoteAccessVPNServiceProvider() { + return true; + } } diff --git a/server/src/com/cloud/network/vpn/RemoteAccessVpnManagerImpl.java b/server/src/com/cloud/network/vpn/RemoteAccessVpnManagerImpl.java index 2fee27513d3..bcfd0889587 100755 --- a/server/src/com/cloud/network/vpn/RemoteAccessVpnManagerImpl.java +++ b/server/src/com/cloud/network/vpn/RemoteAccessVpnManagerImpl.java @@ -50,6 +50,7 @@ import com.cloud.network.dao.FirewallRulesDao; import com.cloud.network.dao.IPAddressDao; import com.cloud.network.dao.RemoteAccessVpnDao; import com.cloud.network.dao.VpnUserDao; +import com.cloud.network.element.RemoteAccessVPNServiceProvider; import com.cloud.network.router.VirtualNetworkApplianceManager; import com.cloud.network.rules.FirewallManager; import com.cloud.network.rules.FirewallRule; @@ -221,10 +222,10 @@ public class RemoteAccessVpnManagerImpl implements RemoteAccessVpnService, Manag _remoteAccessVpnDao.update(vpn.getServerAddressId(), vpn); - List elements = _networkMgr.getRemoteAccessVpnElements(); + List elements = _networkMgr.getRemoteAccessVpnElements(); boolean success = false; try { - for (RemoteAccessVpnElement element : elements) { + for (RemoteAccessVPNServiceProvider element : elements) { if (element.stopVpn(network, vpn)) { success = true; break; @@ -349,7 +350,7 @@ public class RemoteAccessVpnManagerImpl implements RemoteAccessVpnService, Manag Network network = _networkMgr.getNetwork(vpn.getNetworkId()); - List elements = _networkMgr.getRemoteAccessVpnElements(); + List elements = _networkMgr.getRemoteAccessVpnElements(); boolean started = false; try { boolean firewallOpened = true; @@ -358,7 +359,7 @@ public class RemoteAccessVpnManagerImpl implements RemoteAccessVpnService, Manag } if (firewallOpened) { - for (RemoteAccessVpnElement element : elements) { + for (RemoteAccessVPNServiceProvider element : elements) { if (element.startVpn(network, vpn)) { started = true; break; @@ -395,12 +396,12 @@ public class RemoteAccessVpnManagerImpl implements RemoteAccessVpnService, Manag } } - List elements = _networkMgr.getRemoteAccessVpnElements(); + List elements = _networkMgr.getRemoteAccessVpnElements(); boolean success = true; boolean[] finals = new boolean[users.size()]; - for (RemoteAccessVpnElement element : elements) { + for (RemoteAccessVPNServiceProvider element : elements) { s_logger.debug("Applying vpn access to " + element.getName()); for (RemoteAccessVpnVO vpn : vpns) { try { diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index 864ec1611c8..8880c8d2254 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -127,6 +127,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.lb.LoadBalancingRulesManager; import com.cloud.network.router.VirtualNetworkApplianceManager; import com.cloud.network.rules.FirewallManager; @@ -134,7 +135,6 @@ import com.cloud.network.rules.RulesManager; import com.cloud.network.security.SecurityGroup; import com.cloud.network.security.SecurityGroupManager; import com.cloud.network.security.dao.SecurityGroupDao; -import com.cloud.network.vpn.PasswordResetElement; import com.cloud.offering.NetworkOffering; import com.cloud.offering.NetworkOffering.Availability; import com.cloud.offering.ServiceOffering; @@ -424,10 +424,10 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager VirtualMachineProfile vmProfile = new VirtualMachineProfileImpl(vmInstance); vmProfile.setParameter(VirtualMachineProfile.Param.VmPassword, password); - List elements = _networkMgr.getPasswordResetElements(); + List elements = _networkMgr.getPasswordResetElements(); boolean result = true; - for (PasswordResetElement element : elements) { + for (PasswordServiceProvider element : elements) { if (!element.savePassword(defaultNetwork, defaultNicProfile, vmProfile)) { result = false; }