adding Ip Association and VPN Rules

Conflicts:
	server/src/com/cloud/network/topology/AdvancedNetworkVisitor.java
	server/src/com/cloud/network/topology/BasicNetworkTopology.java
	server/src/com/cloud/network/topology/NetworkTopologyVisitor.java
This commit is contained in:
Wilder Rodrigues 2014-07-15 10:59:42 +02:00
parent 91dfad4a97
commit 5b60394a3a
8 changed files with 279 additions and 117 deletions

View File

@ -423,7 +423,11 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl
s_logger.debug("Virtual router elemnt doesn't need to apply vpn users on the backend; virtual router" + " doesn't exist in the network " + network.getId());
return null;
}
return _routerMgr.applyVpnUsers(network, users, routers);
DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);
return networkTopology.applyVpnUsers(network, users, routers);
} else {
s_logger.debug("Element " + getName() + " doesn't handle applyVpnUsers command");
return null;
@ -486,7 +490,10 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl
return true;
}
return _routerMgr.associatePublicIP(network, ipAddress, routers);
DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);
return networkTopology.associatePublicIP(network, ipAddress, routers);
} else {
return false;
}
@ -818,7 +825,10 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl
return true;
}
if (!_routerMgr.applyFirewallRules(network, rules, routers)) {
DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);
if (!networkTopology.applyFirewallRules(network, rules, routers)) {
throw new CloudRuntimeException("Failed to apply firewall rules in network " + network.getId());
} else {
return true;

View File

@ -24,43 +24,25 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.inject.Inject;
import com.cloud.agent.api.Command;
import com.cloud.agent.api.routing.IpAssocCommand;
import com.cloud.agent.api.routing.NetworkElementCommand;
import com.cloud.agent.api.to.IpAddressTO;
import com.cloud.agent.manager.Commands;
import com.cloud.dc.DataCenterVO;
import com.cloud.dc.dao.DataCenterDao;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.network.IpAddress;
import com.cloud.network.Network;
import com.cloud.network.NetworkModel;
import com.cloud.network.Networks.TrafficType;
import com.cloud.network.PublicIpAddress;
import com.cloud.network.dao.NetworkDao;
import com.cloud.network.dao.NetworkVO;
import com.cloud.network.router.VirtualRouter;
import com.cloud.network.topology.NetworkTopologyVisitor;
import com.cloud.utils.net.NetUtils;
import com.cloud.vm.NicVO;
import com.cloud.vm.dao.NicDao;
public class IpAssociationRules extends RuleApplier {
@Inject
NicDao _nicDao;
@Inject
NetworkDao _networkDao;
@Inject
DataCenterDao _dcDao;
@Inject
NetworkModel _networkModel;
private final List<? extends PublicIpAddress> ipAddresses;
private Commands commands;
@ -73,12 +55,24 @@ public class IpAssociationRules extends RuleApplier {
@Override
public boolean accept(final NetworkTopologyVisitor visitor, final VirtualRouter router) throws ResourceUnavailableException {
this.router = router;
commands = new Commands(Command.OnError.Continue);
//
return visitor.visit(this);
}
public List<? extends PublicIpAddress> getIpAddresses() {
return ipAddresses;
}
public Commands getCommands() {
return commands;
}
public void createAssociateIPCommands(final VirtualRouter router, final List<? extends PublicIpAddress> ips, final Commands cmds, final long vmId) {
// Ensure that in multiple vlans case we first send all ip addresses of vlan1, then all ip addresses of vlan2, etc..
final Map<String, ArrayList<PublicIpAddress>> vlanIpMap = new HashMap<String, ArrayList<PublicIpAddress>>();
for (final PublicIpAddress ipAddress : ipAddresses) {
for (final PublicIpAddress ipAddress : ips) {
final String vlanTag = ipAddress.getVlanTag();
ArrayList<PublicIpAddress> ipList = vlanIpMap.get(vlanTag);
if (ipList == null) {
@ -92,10 +86,10 @@ public class IpAssociationRules extends RuleApplier {
vlanIpMap.put(vlanTag, ipList);
}
final List<NicVO> nics = _nicDao.listByVmId(router.getId());
final List<NicVO> nics = nicDao.listByVmId(router.getId());
String baseMac = null;
for (final NicVO nic : nics) {
final NetworkVO nw = _networkDao.findById(nic.getNetworkId());
final NetworkVO nw = networkDao.findById(nic.getNetworkId());
if (nw.getTrafficType() == TrafficType.Public) {
baseMac = nic.getMacAddress();
break;
@ -115,8 +109,8 @@ public class IpAssociationRules extends RuleApplier {
});
// Get network rate - required for IpAssoc
final Integer networkRate = _networkModel.getNetworkRate(ipAddrList.get(0).getNetworkId(), router.getId());
final Network network = _networkModel.getNetwork(ipAddrList.get(0).getNetworkId());
final Integer networkRate = networkModel.getNetworkRate(ipAddrList.get(0).getNetworkId(), router.getId());
final Network network = networkModel.getNetwork(ipAddrList.get(0).getNetworkId());
final IpAddressTO[] ipsToSend = new IpAddressTO[ipAddrList.size()];
int i = 0;
@ -147,7 +141,7 @@ public class IpAssociationRules extends RuleApplier {
networkRate, ipAddr.isOneToOneNat());
ip.setTrafficType(network.getTrafficType());
ip.setNetworkName(_networkModel.getNetworkTag(router.getHypervisorType(), network));
ip.setNetworkName(networkModel.getNetworkTag(router.getHypervisorType(), network));
ipsToSend[i++] = ip;
/* send the firstIP = true for the first Add, this is to create primary on interface*/
if (!firstIP || add) {
@ -155,24 +149,13 @@ public class IpAssociationRules extends RuleApplier {
}
}
final IpAssocCommand cmd = new IpAssocCommand(ipsToSend);
//cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, getRouterControlIp(router.getId()));
//cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, getRouterIpInNetwork(ipAddrList.get(0).getAssociatedWithNetworkId(), router.getId()));
cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, routerControlHelper.getRouterControlIp(router.getId()));
cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, routerControlHelper.getRouterIpInNetwork(ipAddrList.get(0).getAssociatedWithNetworkId(), router.getId()));
cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName());
final DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId());
final DataCenterVO dcVo = dcDao.findById(router.getDataCenterId());
cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString());
commands.addCommand("IPAssocCommand", cmd);
cmds.addCommand("IPAssocCommand", cmd);
}
//
return visitor.visit(this);
}
public List<? extends PublicIpAddress> getIpAddresses() {
return ipAddresses;
}
public Commands getCommands() {
return commands;
}
}

View File

@ -1,3 +1,19 @@
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
package com.cloud.network.rules;
import java.util.List;
@ -9,6 +25,8 @@ import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
import com.cloud.dc.dao.DataCenterDao;
import com.cloud.network.Network;
import com.cloud.network.NetworkModel;
import com.cloud.network.PublicIpAddress;
import com.cloud.network.VpnUser;
import com.cloud.network.dao.FirewallRulesDao;
import com.cloud.network.dao.LoadBalancerDao;
import com.cloud.network.dao.NetworkDao;
@ -106,4 +124,20 @@ public class VirtualNetworkApplianceFactory {
applier.routerControlHelper = routerControlHelper;
applier.applianceManager = applianceManager;
}
public IpAssociationRules createIpAssociationRules(final Network network, final List<? extends PublicIpAddress> ipAddresses) {
IpAssociationRules ipAssociationRules = new IpAssociationRules(network, ipAddresses);
initBeans(ipAssociationRules);
return ipAssociationRules;
}
public VpnRules createVpnRules(final Network network, final List<? extends VpnUser> users) {
VpnRules vpnRules = new VpnRules(network, users);
initBeans(vpnRules);
return vpnRules;
}
}

View File

@ -17,21 +17,26 @@
package com.cloud.network.rules;
import java.util.ArrayList;
import java.util.List;
import com.cloud.agent.api.routing.NetworkElementCommand;
import com.cloud.agent.api.routing.VpnUsersCfgCommand;
import com.cloud.agent.manager.Commands;
import com.cloud.dc.DataCenterVO;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.network.Network;
import com.cloud.network.VpnUser;
import com.cloud.network.router.VirtualRouter;
import com.cloud.network.topology.NetworkTopologyVisitor;
import com.cloud.network.vpc.NetworkACLItem;
public class VpnRules extends RuleApplier {
private final List<? extends NetworkACLItem> rules;
private final List<? extends VpnUser> users;
public VpnRules(final Network network, final List<? extends NetworkACLItem> rules) {
public VpnRules(final Network network, final List<? extends VpnUser> users) {
super(network);
this.rules = rules;
this.users = users;
}
@Override
@ -41,7 +46,28 @@ public class VpnRules extends RuleApplier {
return visitor.visit(this);
}
public List<? extends NetworkACLItem> getRules() {
return rules;
public void createApplyVpnUsersCommand(final List<? extends VpnUser> users, final VirtualRouter router, final Commands cmds) {
final List<VpnUser> addUsers = new ArrayList<VpnUser>();
final List<VpnUser> removeUsers = new ArrayList<VpnUser>();
for (final VpnUser user : users) {
if (user.getState() == VpnUser.State.Add || user.getState() == VpnUser.State.Active) {
addUsers.add(user);
} else if (user.getState() == VpnUser.State.Revoke) {
removeUsers.add(user);
}
}
final VpnUsersCfgCommand cmd = new VpnUsersCfgCommand(addUsers, removeUsers);
cmd.setAccessDetail(NetworkElementCommand.ACCOUNT_ID, String.valueOf(router.getAccountId()));
cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, routerControlHelper.getRouterControlIp(router.getId()));
cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName());
final DataCenterVO dcVo = dcDao.findById(router.getDataCenterId());
cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString());
cmds.addCommand("users", cmd);
}
public List<? extends VpnUser> getUsers() {
return users;
}
}

View File

@ -25,6 +25,8 @@ import com.cloud.agent.api.Command;
import com.cloud.agent.manager.Commands;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.network.Network;
import com.cloud.network.PublicIpAddress;
import com.cloud.network.VpnUser;
import com.cloud.network.lb.LoadBalancingRule;
import com.cloud.network.router.VirtualRouter;
import com.cloud.network.rules.DhcpRules;
@ -123,12 +125,13 @@ public class AdvancedNetworkVisitor extends NetworkTopologyVisitor {
@Override
public boolean visit(final IpAssociationRules ipRules) throws ResourceUnavailableException {
Network network = ipRules.getNetwork();
VirtualRouter router = ipRules.getRouter();
Commands commands = ipRules.getCommands();
List<? extends PublicIpAddress> ips = ipRules.getIpAddresses();
// return sendCommandsToRouter(router, commands);
return false;
ipRules.createAssociateIPCommands(router, ips, commands, network.getId());
return applianceManager.sendCommandsToRouter(router, commands);
}
@Override
@ -167,7 +170,23 @@ public class AdvancedNetworkVisitor extends NetworkTopologyVisitor {
}
@Override
public boolean visit(final PrivateGatewayRules userdata) throws ResourceUnavailableException {
public boolean visit(final PrivateGatewayRules privateGW) throws ResourceUnavailableException {
return false;
}
@Override
public boolean visit(final VpnRules vpn) throws ResourceUnavailableException {
VirtualRouter router = vpn.getRouter();
List<? extends VpnUser> users = vpn.getUsers();
final Commands cmds = new Commands(Command.OnError.Continue);
vpn.createApplyVpnUsersCommand(users, router, cmds);
return applianceManager.sendCommandsToRouter(router, cmds);
}
@Override
public boolean visit(final DhcpPvlanRules vpn) throws ResourceUnavailableException {
return false;
}

View File

@ -36,16 +36,20 @@ import com.cloud.exception.InsufficientCapacityException;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.host.dao.HostDao;
import com.cloud.network.Network;
import com.cloud.network.PublicIpAddress;
import com.cloud.network.VpnUser;
import com.cloud.network.lb.LoadBalancingRule;
import com.cloud.network.router.VirtualRouter;
import com.cloud.network.rules.FirewallRule;
import com.cloud.network.rules.FirewallRules;
import com.cloud.network.rules.IpAssociationRules;
import com.cloud.network.rules.LoadBalancingRules;
import com.cloud.network.rules.RuleApplier;
import com.cloud.network.rules.RuleApplierWrapper;
import com.cloud.network.rules.StaticNat;
import com.cloud.network.rules.StaticNatRules;
import com.cloud.network.rules.VirtualNetworkApplianceFactory;
import com.cloud.network.rules.VpnRules;
import com.cloud.user.Account;
import com.cloud.vm.DomainRouterVO;
import com.cloud.vm.NicProfile;
@ -105,6 +109,132 @@ public class BasicNetworkTopology implements NetworkTopology {
return false;
}
@Override
public boolean applyLoadBalancingRules(final Network network, final List<LoadBalancingRule> rules, final List<? extends VirtualRouter> routers)
throws ResourceUnavailableException {
if (rules == null || rules.isEmpty()) {
s_logger.debug("No lb rules to be applied for network " + network.getId());
return true;
}
s_logger.debug("APPLYING LOAD BALANCING RULES");
final String typeString = "loadbalancing rules";
final boolean isPodLevelException = false;
final boolean failWhenDisconnect = false;
final Long podId = null;
LoadBalancingRules loadBalancingRules = virtualNetworkApplianceFactory.createLoadBalancingRules(network, rules);
return applyRules(network, routers, typeString, isPodLevelException, podId, failWhenDisconnect, new RuleApplierWrapper<RuleApplier>(loadBalancingRules));
}
@Override
public boolean applyFirewallRules(final Network network, final List<? extends FirewallRule> rules, final List<? extends VirtualRouter> routers)
throws ResourceUnavailableException {
if (rules == null || rules.isEmpty()) {
s_logger.debug("No firewall rules to be applied for network " + network.getId());
return true;
}
s_logger.debug("APPLYING FIREWALL RULES");
final String typeString = "firewall rules";
final boolean isPodLevelException = false;
final boolean failWhenDisconnect = false;
final Long podId = null;
FirewallRules firewallRules = virtualNetworkApplianceFactory.createFirewallRules(network, rules);
return applyRules(network, routers, typeString, isPodLevelException, podId, failWhenDisconnect, new RuleApplierWrapper<RuleApplier>(firewallRules));
}
@Override
public boolean applyStaticNats(final Network network, final List<? extends StaticNat> rules, final List<? extends VirtualRouter> routers) throws ResourceUnavailableException {
if (rules == null || rules.isEmpty()) {
s_logger.debug("No static nat rules to be applied for network " + network.getId());
return true;
}
s_logger.debug("APPLYING STATIC NAT RULES");
final String typeString = "static nat rules";
final boolean isPodLevelException = false;
final boolean failWhenDisconnect = false;
final Long podId = null;
StaticNatRules natRules = virtualNetworkApplianceFactory.createStaticNatRules(network, rules);
return applyRules(network, routers, typeString, isPodLevelException, podId, failWhenDisconnect, new RuleApplierWrapper<RuleApplier>(natRules));
}
@Override
public boolean associatePublicIP(final Network network, final List<? extends PublicIpAddress> ipAddress, final List<? extends VirtualRouter> routers)
throws ResourceUnavailableException {
if (ipAddress == null || ipAddress.isEmpty()) {
s_logger.debug("No ip association rules to be applied for network " + network.getId());
return true;
}
s_logger.debug("APPLYING IP RULES");
final String typeString = "ip association";
final boolean isPodLevelException = false;
final boolean failWhenDisconnect = false;
final Long podId = null;
IpAssociationRules ipAddresses = virtualNetworkApplianceFactory.createIpAssociationRules(network, ipAddress);
return applyRules(network, routers, typeString, isPodLevelException, podId, failWhenDisconnect, new RuleApplierWrapper<RuleApplier>(ipAddresses));
}
@Override
public String[] applyVpnUsers(final Network network, final List<? extends VpnUser> users, final List<DomainRouterVO> routers) throws ResourceUnavailableException {
if (routers == null || routers.isEmpty()) {
s_logger.warn("Failed to add/remove VPN users: no router found for account and zone");
throw new ResourceUnavailableException("Unable to assign ip addresses, domR doesn't exist for network " + network.getId(), DataCenter.class, network.getDataCenterId());
}
s_logger.debug("APPLYING VPN RULES");
// should become a BasicNetworkVisitor in the end
AdvancedNetworkVisitor visitor = new AdvancedNetworkVisitor();
boolean agentResults = true;
for (final DomainRouterVO router : routers) {
if (router.getState() != State.Running) {
s_logger.warn("Failed to add/remove VPN users: router not in running state");
throw new ResourceUnavailableException("Unable to assign ip addresses, domR is not in right state " + router.getState(), DataCenter.class,
network.getDataCenterId());
}
VpnRules vpnRules = virtualNetworkApplianceFactory.createVpnRules(network, users);
// [FIXME] REMOVE THIS SHIT AND INJECT USING A FACTORY FOR THE
// VISITORS
visitor.setApplianceManager(vpnRules.getApplianceManager());
// Currently we receive just one answer from the agent. In the
// future we have to parse individual answers and set
// results accordingly
final boolean agentResult = vpnRules.accept(visitor, router);
agentResults = agentResults && agentResult;
}
final String[] result = new String[users.size()];
for (int i = 0; i < result.length; i++) {
if (agentResults) {
result[i] = null;
} else {
result[i] = String.valueOf(agentResults);
}
}
return result;
}
@Override
public boolean applyRules(final Network network, final List<? extends VirtualRouter> routers, final String typeString, final boolean isPodLevelException, final Long podId,
final boolean failWhenDisconnect, final RuleApplierWrapper<RuleApplier> ruleApplierWrapper) throws ResourceUnavailableException {
@ -199,64 +329,4 @@ public class BasicNetworkTopology implements NetworkTopology {
}
return result;
}
@Override
public boolean applyLoadBalancingRules(final Network network, final List<LoadBalancingRule> rules, final List<? extends VirtualRouter> routers)
throws ResourceUnavailableException {
if (rules == null || rules.isEmpty()) {
s_logger.debug("No lb rules to be applied for network " + network.getId());
return true;
}
s_logger.debug("APPLYING LOAD BALANCING RULES");
final String typeString = "loadbalancing rules";
final boolean isPodLevelException = false;
final boolean failWhenDisconnect = false;
final Long podId = null;
LoadBalancingRules loadBalancingRules = virtualNetworkApplianceFactory.createLoadBalancingRules(network, rules);
return applyRules(network, routers, typeString, isPodLevelException, podId, failWhenDisconnect, new RuleApplierWrapper<RuleApplier>(loadBalancingRules));
}
@Override
public boolean applyFirewallRules(final Network network, final List<? extends FirewallRule> rules, final List<? extends VirtualRouter> routers)
throws ResourceUnavailableException {
if (rules == null || rules.isEmpty()) {
s_logger.debug("No firewall rules to be applied for network " + network.getId());
return true;
}
s_logger.debug("APPLYING FIREWALL RULES");
final String typeString = "firewall rules";
final boolean isPodLevelException = false;
final boolean failWhenDisconnect = false;
final Long podId = null;
FirewallRules firewallRules = virtualNetworkApplianceFactory.createFirewallRules(network, rules);
return applyRules(network, routers, typeString, isPodLevelException, podId, failWhenDisconnect, new RuleApplierWrapper<RuleApplier>(firewallRules));
}
@Override
public boolean applyStaticNats(final Network network, final List<? extends StaticNat> rules, final List<? extends VirtualRouter> routers) throws ResourceUnavailableException {
if (rules == null || rules.isEmpty()) {
s_logger.debug("No static nat rules to be applied for network " + network.getId());
return true;
}
s_logger.debug("APPLYING STATIC NAT RULES");
final String typeString = "static nat rules";
final boolean isPodLevelException = false;
final boolean failWhenDisconnect = false;
final Long podId = null;
StaticNatRules natRules = virtualNetworkApplianceFactory.createStaticNatRules(network, rules);
return applyRules(network, routers, typeString, isPodLevelException, podId, failWhenDisconnect, new RuleApplierWrapper<RuleApplier>(natRules));
}
}

View File

@ -26,6 +26,8 @@ import com.cloud.exception.ConcurrentOperationException;
import com.cloud.exception.InsufficientCapacityException;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.network.Network;
import com.cloud.network.PublicIpAddress;
import com.cloud.network.VpnUser;
import com.cloud.network.lb.LoadBalancingRule;
import com.cloud.network.router.VirtualRouter;
import com.cloud.network.rules.FirewallRule;
@ -61,9 +63,15 @@ public interface NetworkTopology {
boolean applyRules(final Network network, final List<? extends VirtualRouter> routers, final String typeString, final boolean isPodLevelException, final Long podId,
final boolean failWhenDisconnect, RuleApplierWrapper<RuleApplier> ruleApplier) throws ResourceUnavailableException;
// ====== USER FOR GUEST NETWORK ====== //
boolean applyLoadBalancingRules(Network network, List<LoadBalancingRule> rules, List<? extends VirtualRouter> routers) throws ResourceUnavailableException;
boolean applyFirewallRules(final Network network, final List<? extends FirewallRule> rules, final List<? extends VirtualRouter> routers) throws ResourceUnavailableException;
boolean applyStaticNats(final Network network, final List<? extends StaticNat> rules, final List<? extends VirtualRouter> routers) throws ResourceUnavailableException;
boolean associatePublicIP(final Network network, final List<? extends PublicIpAddress> ipAddress, final List<? extends VirtualRouter> routers) throws ResourceUnavailableException;
String[] applyVpnUsers(final Network network, final List<? extends VpnUser> users, final List<DomainRouterVO> routers) throws ResourceUnavailableException;
}

View File

@ -41,20 +41,32 @@ public abstract class NetworkTopologyVisitor {
}
public abstract boolean visit(StaticNatRules nat) throws ResourceUnavailableException;
public abstract boolean visit(LoadBalancingRules loadbalancing) throws ResourceUnavailableException;
public abstract boolean visit(FirewallRules firewall) throws ResourceUnavailableException;
public abstract boolean visit(IpAssociationRules ipAddresses) throws ResourceUnavailableException;
public abstract boolean visit(UserdataPwdRules userdata) throws ResourceUnavailableException;
public abstract boolean visit(DhcpRules dhcp) throws ResourceUnavailableException;
public abstract boolean visit(SshKeyToRouterRules ssh) throws ResourceUnavailableException;
public abstract boolean visit(PasswordToRouterRules pwd) throws ResourceUnavailableException;
public abstract boolean visit(NetworkAclsRules acl) throws ResourceUnavailableException;
public abstract boolean visit(VpcIpAssociationRules vpcIp) throws ResourceUnavailableException;
public abstract boolean visit(UserdataToRouterRules userdata) throws ResourceUnavailableException;
public abstract boolean visit(VpnRules userdata) throws ResourceUnavailableException;
public abstract boolean visit(PrivateGatewayRules userdata) throws ResourceUnavailableException;
public NetworkTopology getNetworkTopology() {
return networkTopology;
}
public abstract boolean visit(DhcpPvlanRules vpn) throws ResourceUnavailableException;
public abstract boolean visit(DhcpSubNetRules vpn) throws ResourceUnavailableException;
}