cloudstack-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From mc...@apache.org
Subject [34/50] [abbrv] git commit: updated refs/heads/rbac to 99bdc8d
Date Thu, 13 Mar 2014 18:06:21 GMT
CLOUDSTACK-6047: Enable VR aggregation commands for VR start/reboot


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/f45de30d
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/f45de30d
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/f45de30d

Branch: refs/heads/rbac
Commit: f45de30d1b94df8bb32f9aa724521209f1ae6eb0
Parents: b399c31
Author: Sheng Yang <sheng.yang@citrix.com>
Authored: Thu Mar 6 19:29:20 2014 -0800
Committer: Sheng Yang <sheng.yang@citrix.com>
Committed: Tue Mar 11 13:04:26 2014 -0700

----------------------------------------------------------------------
 .../element/AggregatedCommandExecutor.java      |  28 +++++
 .../api/routing/AggregationControlCommand.java  |  44 +++++++
 .../api/routing/FinishAggregationCommand.java   |  31 -----
 .../api/routing/StartAggregationCommand.java    |  31 -----
 .../virtualnetwork/VirtualRoutingResource.java  | 108 +++++++++--------
 .../VirtualRoutingResourceTest.java             |  29 ++---
 .../orchestration/NetworkOrchestrator.java      | 105 +++++++++-------
 .../network/element/VirtualRouterElement.java   |  71 +++++++----
 .../router/VirtualNetworkApplianceManager.java  |  16 ++-
 .../VirtualNetworkApplianceManagerImpl.java     | 119 ++++++++++++-------
 .../MockVpcVirtualNetworkApplianceManager.java  |  34 ++++--
 11 files changed, 367 insertions(+), 249 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f45de30d/api/src/com/cloud/network/element/AggregatedCommandExecutor.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/network/element/AggregatedCommandExecutor.java b/api/src/com/cloud/network/element/AggregatedCommandExecutor.java
new file mode 100644
index 0000000..012908f
--- /dev/null
+++ b/api/src/com/cloud/network/element/AggregatedCommandExecutor.java
@@ -0,0 +1,28 @@
+// 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.element;
+
+import com.cloud.deploy.DeployDestination;
+import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.network.Network;
+
+public interface AggregatedCommandExecutor {
+    public boolean prepareAggregatedExecution(Network network, DeployDestination dest) throws
ResourceUnavailableException;
+    public boolean completeAggregatedExecution(Network network, DeployDestination dest) throws
ResourceUnavailableException;
+    public boolean cleanupAggregatedExecution(Network network, DeployDestination dest) throws
ResourceUnavailableException;
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f45de30d/core/src/com/cloud/agent/api/routing/AggregationControlCommand.java
----------------------------------------------------------------------
diff --git a/core/src/com/cloud/agent/api/routing/AggregationControlCommand.java b/core/src/com/cloud/agent/api/routing/AggregationControlCommand.java
new file mode 100644
index 0000000..ef75360
--- /dev/null
+++ b/core/src/com/cloud/agent/api/routing/AggregationControlCommand.java
@@ -0,0 +1,44 @@
+// 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.agent.api.routing;
+
+public class AggregationControlCommand extends NetworkElementCommand{
+    public enum Action {
+        Start,
+        Finish,
+        Cleanup,
+    }
+
+    private Action action;
+
+    protected AggregationControlCommand() {
+        super();
+    }
+
+    public AggregationControlCommand(Action action, String name, String ip, String guestIp)
{
+        super();
+        this.action = action;
+        this.setAccessDetail(NetworkElementCommand.ROUTER_NAME, name);
+        this.setAccessDetail(NetworkElementCommand.ROUTER_IP, ip);
+        this.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, guestIp);
+    }
+
+    public Action getAction() {
+        return action;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f45de30d/core/src/com/cloud/agent/api/routing/FinishAggregationCommand.java
----------------------------------------------------------------------
diff --git a/core/src/com/cloud/agent/api/routing/FinishAggregationCommand.java b/core/src/com/cloud/agent/api/routing/FinishAggregationCommand.java
deleted file mode 100644
index bfafccd..0000000
--- a/core/src/com/cloud/agent/api/routing/FinishAggregationCommand.java
+++ /dev/null
@@ -1,31 +0,0 @@
-// 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.agent.api.routing;
-
-public class FinishAggregationCommand extends NetworkElementCommand{
-    protected FinishAggregationCommand() {
-        super();
-    }
-
-    public FinishAggregationCommand(String name, String ip, String guestIp) {
-        super();
-        this.setAccessDetail(NetworkElementCommand.ROUTER_NAME, name);
-        this.setAccessDetail(NetworkElementCommand.ROUTER_IP, ip);
-        this.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, guestIp);
-    }
-}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f45de30d/core/src/com/cloud/agent/api/routing/StartAggregationCommand.java
----------------------------------------------------------------------
diff --git a/core/src/com/cloud/agent/api/routing/StartAggregationCommand.java b/core/src/com/cloud/agent/api/routing/StartAggregationCommand.java
deleted file mode 100644
index fbf97a8..0000000
--- a/core/src/com/cloud/agent/api/routing/StartAggregationCommand.java
+++ /dev/null
@@ -1,31 +0,0 @@
-// 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.agent.api.routing;
-
-public class StartAggregationCommand extends NetworkElementCommand{
-    protected StartAggregationCommand() {
-        super();
-    }
-
-    public StartAggregationCommand(String name, String ip, String guestIp) {
-        super();
-        this.setAccessDetail(NetworkElementCommand.ROUTER_NAME, name);
-        this.setAccessDetail(NetworkElementCommand.ROUTER_IP, ip);
-        this.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, guestIp);
-    }
-}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f45de30d/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java
----------------------------------------------------------------------
diff --git a/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java
b/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java
index 29a176a..3712aba 100755
--- a/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java
+++ b/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java
@@ -25,11 +25,12 @@ import com.cloud.agent.api.CheckS2SVpnConnectionsCommand;
 import com.cloud.agent.api.GetDomRVersionAnswer;
 import com.cloud.agent.api.GetDomRVersionCmd;
 import com.cloud.agent.api.SetupGuestNetworkCommand;
+import com.cloud.agent.api.routing.AggregationControlCommand;
+import com.cloud.agent.api.routing.AggregationControlCommand.Action;
 import com.cloud.agent.api.routing.CreateIpAliasCommand;
 import com.cloud.agent.api.routing.DeleteIpAliasCommand;
 import com.cloud.agent.api.routing.DhcpEntryCommand;
 import com.cloud.agent.api.routing.DnsMasqConfigCommand;
-import com.cloud.agent.api.routing.FinishAggregationCommand;
 import com.cloud.agent.api.routing.GroupAnswer;
 import com.cloud.agent.api.routing.IpAliasTO;
 import com.cloud.agent.api.routing.IpAssocCommand;
@@ -47,7 +48,6 @@ import com.cloud.agent.api.routing.SetSourceNatCommand;
 import com.cloud.agent.api.routing.SetStaticNatRulesCommand;
 import com.cloud.agent.api.routing.SetStaticRouteCommand;
 import com.cloud.agent.api.routing.Site2SiteVpnCfgCommand;
-import com.cloud.agent.api.routing.StartAggregationCommand;
 import com.cloud.agent.api.routing.VmDataCommand;
 import com.cloud.agent.api.routing.VpnUsersCfgCommand;
 import com.cloud.agent.api.to.DhcpTO;
@@ -163,10 +163,8 @@ public class VirtualRoutingResource {
                 return executeQueryCommand(cmd);
             }
 
-            if (cmd instanceof StartAggregationCommand) {
-                return execute((StartAggregationCommand)cmd);
-            } else if (cmd instanceof FinishAggregationCommand) {
-                return execute((FinishAggregationCommand)cmd);
+            if (cmd instanceof AggregationControlCommand) {
+                return execute((AggregationControlCommand)cmd);
             }
 
             if (_vrAggregateCommandsSet.containsKey(routerName)) {
@@ -1032,15 +1030,6 @@ public class VirtualRoutingResource {
         return false;
     }
 
-    private Answer execute(StartAggregationCommand cmd) {
-        // Access IP would be used as ID for router
-        String routerName = cmd.getAccessDetail(NetworkElementCommand.ROUTER_NAME);
-        assert routerName != null;
-        Queue<NetworkElementCommand> queue = new LinkedBlockingQueue<>();
-        _vrAggregateCommandsSet.put(routerName, queue);
-        return new Answer(cmd);
-    }
-
     private List<ConfigItem> generateCommandCfg(NetworkElementCommand cmd) {
         List<ConfigItem> cfg;
         if (cmd instanceof SetPortForwardingRulesVpcCommand) {
@@ -1091,51 +1080,70 @@ public class VirtualRoutingResource {
         return cfg;
     }
 
-    private Answer execute(FinishAggregationCommand cmd) {
+    private Answer execute(AggregationControlCommand cmd) {
+        Action action = cmd.getAction();
         String routerName = cmd.getAccessDetail(NetworkElementCommand.ROUTER_NAME);
         assert routerName != null;
         assert cmd.getRouterAccessIp() != null;
-        Queue<NetworkElementCommand> queue = _vrAggregateCommandsSet.get(routerName);
-        try {
-            StringBuilder sb = new StringBuilder();
-            sb.append("#Apache CloudStack Virtual Router Config File\n");
-            sb.append("<version>\n" + _cfgVersion + "\n</version>\n");
-            for (NetworkElementCommand command : queue) {
-                List<ConfigItem> cfg = generateCommandCfg(command);
-                if (cfg == null) {
-                    s_logger.warn("Unknown commands for VirtualRoutingResource, but continue:
" + cmd.toString());
-                    continue;
-                }
 
-                for (ConfigItem c : cfg) {
-                    if (c.isFile()) {
-                        sb.append("<file>\n");
-                        sb.append(c.getFilePath() + c.getFileName() + "\n");
-                        sb.append(c.getFileContents() + "\n");
-                        sb.append("</file>\n");
-                    } else {
-                        sb.append("<script>\n");
-                        sb.append("/opt/cloud/bin/" + c.getScript() + " " + c.getArgs() +
"\n");
-                        sb.append("</script>\n");
+        if (action == Action.Start) {
+            assert (!_vrAggregateCommandsSet.containsKey(routerName));
+
+            Queue<NetworkElementCommand> queue = new LinkedBlockingQueue<>();
+            _vrAggregateCommandsSet.put(routerName, queue);
+            return new Answer(cmd);
+        } else if (action == Action.Finish) {
+            Queue<NetworkElementCommand> queue = _vrAggregateCommandsSet.get(routerName);
+            try {
+                StringBuilder sb = new StringBuilder();
+                sb.append("#Apache CloudStack Virtual Router Config File\n");
+                sb.append("<version>\n" + _cfgVersion + "\n</version>\n");
+                for (NetworkElementCommand command : queue) {
+                    List<ConfigItem> cfg = generateCommandCfg(command);
+                    if (cfg == null) {
+                        s_logger.warn("Unknown commands for VirtualRoutingResource, but continue:
" + cmd.toString());
+                        continue;
+                    }
+
+                    for (ConfigItem c : cfg) {
+                        if (c.isFile()) {
+                            sb.append("<file>\n");
+                            sb.append(c.getFilePath() + c.getFileName() + "\n");
+                            sb.append(c.getFileContents() + "\n");
+                            sb.append("</file>\n");
+                        } else {
+                            sb.append("<script>\n");
+                            sb.append("/opt/cloud/bin/" + c.getScript() + " " + c.getArgs()
+ "\n");
+                            sb.append("</script>\n");
+                        }
                     }
                 }
+                String cfgFilePath = "/var/cache/cloud/";
+                String cfgFileName = "VR-"+ UUID.randomUUID().toString() + ".cfg";
+                ExecutionResult result = _vrDeployer.createFileInVR(cmd.getRouterAccessIp(),
cfgFilePath, cfgFileName, sb.toString());
+                if (!result.isSuccess()) {
+                    return new Answer(cmd, false, result.getDetails());
+                }
+
+                result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), VRScripts.VR_CFG,
"-c " + cfgFilePath + cfgFileName);
+                if (!result.isSuccess()) {
+                    return new Answer(cmd, false, result.getDetails());
+                }
+                return new Answer(cmd);
+            } finally {
+                queue.clear();
+                _vrAggregateCommandsSet.remove(routerName);
             }
-            String cfgFilePath = "/var/cache/cloud/";
-            String cfgFileName = "VR-"+ UUID.randomUUID().toString() + ".cfg";
-            ExecutionResult result = _vrDeployer.createFileInVR(cmd.getRouterAccessIp(),
cfgFilePath, cfgFileName, sb.toString());
-            if (!result.isSuccess()) {
-                return new Answer(cmd, false, result.getDetails());
+        } else if (action == Action.Cleanup) {
+            assert (_vrAggregateCommandsSet.containsKey(routerName));
+            Queue<NetworkElementCommand> queue = _vrAggregateCommandsSet.get(routerName);
+            if (queue != null) {
+                queue.clear();
             }
+            _vrAggregateCommandsSet.remove(routerName);
 
-            result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), VRScripts.VR_CFG, "-c
" + cfgFilePath + cfgFileName);
-            if (!result.isSuccess()) {
-                return new Answer(cmd, false, result.getDetails());
-            }
             return new Answer(cmd);
-        } finally {
-            queue.clear();
-            _vrAggregateCommandsSet.remove(routerName);
         }
+        return new Answer(cmd, false, "Fail to recongize aggregation action " + action.toString());
     }
-
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f45de30d/core/test/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResourceTest.java
----------------------------------------------------------------------
diff --git a/core/test/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResourceTest.java
b/core/test/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResourceTest.java
index 4737019..48da1bb 100644
--- a/core/test/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResourceTest.java
+++ b/core/test/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResourceTest.java
@@ -19,11 +19,12 @@ package com.cloud.agent.resource.virtualnetwork;
 import com.cloud.agent.api.Answer;
 import com.cloud.agent.api.BumpUpPriorityCommand;
 import com.cloud.agent.api.SetupGuestNetworkCommand;
+import com.cloud.agent.api.routing.AggregationControlCommand;
+import com.cloud.agent.api.routing.AggregationControlCommand.Action;
 import com.cloud.agent.api.routing.CreateIpAliasCommand;
 import com.cloud.agent.api.routing.DeleteIpAliasCommand;
 import com.cloud.agent.api.routing.DhcpEntryCommand;
 import com.cloud.agent.api.routing.DnsMasqConfigCommand;
-import com.cloud.agent.api.routing.FinishAggregationCommand;
 import com.cloud.agent.api.routing.GroupAnswer;
 import com.cloud.agent.api.routing.IpAliasTO;
 import com.cloud.agent.api.routing.IpAssocCommand;
@@ -41,7 +42,6 @@ import com.cloud.agent.api.routing.SetSourceNatCommand;
 import com.cloud.agent.api.routing.SetStaticNatRulesCommand;
 import com.cloud.agent.api.routing.SetStaticRouteCommand;
 import com.cloud.agent.api.routing.Site2SiteVpnCfgCommand;
-import com.cloud.agent.api.routing.StartAggregationCommand;
 import com.cloud.agent.api.routing.VmDataCommand;
 import com.cloud.agent.api.routing.VpnUsersCfgCommand;
 import com.cloud.agent.api.to.DhcpTO;
@@ -84,7 +84,6 @@ public class VirtualRoutingResourceTest implements VirtualRouterDeployer
{
     NetworkElementCommand _currentCmd;
     int _count;
     String _file;
-    boolean _aggregated = false;
 
     String ROUTERIP = "169.254.3.4";
     String ROUTERGUESTIP = "10.200.1.1";
@@ -138,8 +137,8 @@ public class VirtualRoutingResourceTest implements VirtualRouterDeployer
{
     }
 
     private void verifyFile(NetworkElementCommand cmd, String path, String filename, String
content) {
-        if (cmd instanceof FinishAggregationCommand) {
-            verifyFile((FinishAggregationCommand)cmd, path, filename, content);
+        if (cmd instanceof AggregationControlCommand) {
+            verifyFile((AggregationControlCommand)cmd, path, filename, content);
         } else if (cmd instanceof LoadBalancerConfigCommand) {
             verifyFile((LoadBalancerConfigCommand)cmd, path, filename, content);
         }
@@ -190,10 +189,8 @@ public class VirtualRoutingResourceTest implements VirtualRouterDeployer
{
             verifyArgs((IpAssocCommand)cmd, script, args);
         }
 
-        if (cmd instanceof StartAggregationCommand) {
-            return;
-        } else if (cmd instanceof FinishAggregationCommand) {
-            verifyArgs((FinishAggregationCommand)cmd, script, args);
+        if (cmd instanceof AggregationControlCommand) {
+            verifyArgs((AggregationControlCommand)cmd, script, args);
         }
     }
 
@@ -948,7 +945,7 @@ public class VirtualRoutingResourceTest implements VirtualRouterDeployer
{
     @Test
     public void testAggregationCommands() {
         List<NetworkElementCommand> cmds = new LinkedList<>();
-        StartAggregationCommand startCmd = new StartAggregationCommand(ROUTERNAME, ROUTERIP,
ROUTERGUESTIP);
+        AggregationControlCommand startCmd = new AggregationControlCommand(Action.Start,
ROUTERNAME, ROUTERIP, ROUTERGUESTIP);
         cmds.add(startCmd);
         cmds.add(generateIpAssocCommand());
         cmds.add(generateIpAssocVpcCommand());
@@ -979,26 +976,22 @@ public class VirtualRoutingResourceTest implements VirtualRouterDeployer
{
         cmds.add(generateSavePasswordCommand());
         cmds.add(generateVmDataCommand());
 
-        FinishAggregationCommand finishCmd = new FinishAggregationCommand(ROUTERNAME, ROUTERIP,
ROUTERGUESTIP);
+        AggregationControlCommand finishCmd = new AggregationControlCommand(Action.Finish,
ROUTERNAME, ROUTERIP, ROUTERGUESTIP);
         cmds.add(finishCmd);
 
         for (NetworkElementCommand cmd : cmds) {
             Answer answer = _resource.executeRequest(cmd);
-            if (!(cmd instanceof FinishAggregationCommand)) {
-                assertTrue(answer.getResult());
-            } else {
-
-            }
+            assertTrue(answer.getResult());
         }
     }
 
-    private void verifyArgs(FinishAggregationCommand cmd, String script, String args) {
+    private void verifyArgs(AggregationControlCommand cmd, String script, String args) {
         assertEquals(script, VRScripts.VR_CFG);
         assertTrue(args.startsWith("-c /var/cache/cloud/VR-"));
         assertTrue(args.endsWith(".cfg"));
     }
 
-    protected void verifyFile(FinishAggregationCommand cmd, String path, String filename,
String content) {
+    protected void verifyFile(AggregationControlCommand cmd, String path, String filename,
String content) {
         assertEquals(path, "/var/cache/cloud/");
         assertTrue(filename.startsWith("VR-"));
         assertTrue(filename.endsWith(".cfg"));

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f45de30d/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java
b/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java
index 7853c3b..e36dc62 100755
--- a/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java
+++ b/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java
@@ -16,37 +16,6 @@
 // under the License.
 package org.apache.cloudstack.engine.orchestration;
 
-import java.net.URI;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.UUID;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.TimeUnit;
-
-import javax.ejb.Local;
-import javax.inject.Inject;
-import javax.naming.ConfigurationException;
-
-import org.apache.cloudstack.acl.ControlledEntity.ACLType;
-import org.apache.cloudstack.context.CallContext;
-import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
-import org.apache.cloudstack.framework.config.ConfigDepot;
-import org.apache.cloudstack.framework.config.ConfigKey;
-import org.apache.cloudstack.framework.config.Configurable;
-import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
-import org.apache.cloudstack.managed.context.ManagedContextRunnable;
-import org.apache.cloudstack.region.PortableIpDao;
-import org.apache.log4j.Logger;
-
 import com.cloud.agent.AgentManager;
 import com.cloud.agent.Listener;
 import com.cloud.agent.api.AgentControlAnswer;
@@ -127,6 +96,7 @@ import com.cloud.network.dao.PhysicalNetworkServiceProviderDao;
 import com.cloud.network.dao.PhysicalNetworkTrafficTypeDao;
 import com.cloud.network.dao.PhysicalNetworkTrafficTypeVO;
 import com.cloud.network.dao.PhysicalNetworkVO;
+import com.cloud.network.element.AggregatedCommandExecutor;
 import com.cloud.network.element.DhcpServiceProvider;
 import com.cloud.network.element.IpDeployer;
 import com.cloud.network.element.LoadBalancingServiceProvider;
@@ -199,6 +169,35 @@ import com.cloud.vm.dao.NicSecondaryIpDao;
 import com.cloud.vm.dao.NicSecondaryIpVO;
 import com.cloud.vm.dao.UserVmDao;
 import com.cloud.vm.dao.VMInstanceDao;
+import org.apache.cloudstack.acl.ControlledEntity.ACLType;
+import org.apache.cloudstack.context.CallContext;
+import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
+import org.apache.cloudstack.framework.config.ConfigDepot;
+import org.apache.cloudstack.framework.config.ConfigKey;
+import org.apache.cloudstack.framework.config.Configurable;
+import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
+import org.apache.cloudstack.managed.context.ManagedContextRunnable;
+import org.apache.cloudstack.region.PortableIpDao;
+import org.apache.log4j.Logger;
+
+import javax.ejb.Local;
+import javax.inject.Inject;
+import javax.naming.ConfigurationException;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
 
 /**
  * NetworkManagerImpl implements NetworkManager.
@@ -1068,15 +1067,41 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
             }
         }
 
-        // reapply all the firewall/staticNat/lb rules
-        s_logger.debug("Reprogramming network " + network + " as a part of network implement");
-        if (!reprogramNetworkRules(network.getId(), CallContext.current().getCallingAccount(),
network)) {
-            s_logger.warn("Failed to re-program the network as a part of network " + network
+ " implement");
-            // see DataCenterVO.java
-            ResourceUnavailableException ex = new ResourceUnavailableException("Unable to
apply network rules as a part of network " + network + " implement", DataCenter.class,
-                    network.getDataCenterId());
-            ex.addProxyObject(_entityMgr.findById(DataCenter.class, network.getDataCenterId()).getUuid());
-            throw ex;
+        for (NetworkElement element : networkElements) {
+            if ((element instanceof AggregatedCommandExecutor) && (providersToImplement.contains(element.getProvider())))
{
+                ((AggregatedCommandExecutor)element).prepareAggregatedExecution(network,
dest);
+            }
+        }
+
+        try {
+            // reapply all the firewall/staticNat/lb rules
+            s_logger.debug("Reprogramming network " + network + " as a part of network implement");
+            if (!reprogramNetworkRules(network.getId(), CallContext.current().getCallingAccount(),
network)) {
+                s_logger.warn("Failed to re-program the network as a part of network " +
network + " implement");
+                // see DataCenterVO.java
+                ResourceUnavailableException ex = new ResourceUnavailableException("Unable
to apply network rules as a part of network " + network + " implement", DataCenter.class,
+                        network.getDataCenterId());
+                ex.addProxyObject(_entityMgr.findById(DataCenter.class, network.getDataCenterId()).getUuid());
+                throw ex;
+            }
+            for (NetworkElement element : networkElements) {
+                if ((element instanceof AggregatedCommandExecutor) && (providersToImplement.contains(element.getProvider())))
{
+                    if (!((AggregatedCommandExecutor)element).completeAggregatedExecution(network,
dest)) {
+                        s_logger.warn("Failed to re-program the network as a part of network
" + network + " implement due to aggregated commands execution failure!");
+                        // see DataCenterVO.java
+                        ResourceUnavailableException ex = new ResourceUnavailableException("Unable
to apply network rules as a part of network " + network + " implement", DataCenter.class,
+                                network.getDataCenterId());
+                        ex.addProxyObject(_entityMgr.findById(DataCenter.class, network.getDataCenterId()).getUuid());
+                        throw ex;
+                    }
+                }
+            }
+        } finally {
+            for (NetworkElement element : networkElements) {
+                if ((element instanceof AggregatedCommandExecutor) && (providersToImplement.contains(element.getProvider())))
{
+                    ((AggregatedCommandExecutor)element).cleanupAggregatedExecution(network,
dest);
+                }
+            }
         }
     }
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f45de30d/server/src/com/cloud/network/element/VirtualRouterElement.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/element/VirtualRouterElement.java b/server/src/com/cloud/network/element/VirtualRouterElement.java
index 455e75f..3f4ba5b 100755
--- a/server/src/com/cloud/network/element/VirtualRouterElement.java
+++ b/server/src/com/cloud/network/element/VirtualRouterElement.java
@@ -16,26 +16,6 @@
 // under the License.
 package com.cloud.network.element;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import javax.ejb.Local;
-import javax.inject.Inject;
-
-import org.apache.log4j.Logger;
-
-import com.google.gson.Gson;
-
-import org.apache.cloudstack.api.command.admin.router.ConfigureOvsElementCmd;
-import org.apache.cloudstack.api.command.admin.router.ConfigureVirtualRouterElementCmd;
-import org.apache.cloudstack.api.command.admin.router.CreateVirtualRouterElementCmd;
-import org.apache.cloudstack.api.command.admin.router.ListOvsElementsCmd;
-import org.apache.cloudstack.api.command.admin.router.ListVirtualRouterElementsCmd;
-import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
-
 import com.cloud.agent.api.to.LoadBalancerTO;
 import com.cloud.configuration.ConfigurationManager;
 import com.cloud.dc.DataCenter;
@@ -101,6 +81,22 @@ import com.cloud.vm.VirtualMachine.State;
 import com.cloud.vm.VirtualMachineProfile;
 import com.cloud.vm.dao.DomainRouterDao;
 import com.cloud.vm.dao.UserVmDao;
+import com.google.gson.Gson;
+import org.apache.cloudstack.api.command.admin.router.ConfigureOvsElementCmd;
+import org.apache.cloudstack.api.command.admin.router.ConfigureVirtualRouterElementCmd;
+import org.apache.cloudstack.api.command.admin.router.CreateVirtualRouterElementCmd;
+import org.apache.cloudstack.api.command.admin.router.ListOvsElementsCmd;
+import org.apache.cloudstack.api.command.admin.router.ListVirtualRouterElementsCmd;
+import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
+import org.apache.log4j.Logger;
+
+import javax.ejb.Local;
+import javax.inject.Inject;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 @Local(value = {NetworkElement.class, FirewallServiceProvider.class,
     DhcpServiceProvider.class, UserDataServiceProvider.class,
@@ -110,7 +106,7 @@ import com.cloud.vm.dao.UserVmDao;
 public class VirtualRouterElement extends AdapterBase implements VirtualRouterElementService,
DhcpServiceProvider,
         UserDataServiceProvider, SourceNatServiceProvider, StaticNatServiceProvider, FirewallServiceProvider,
         LoadBalancingServiceProvider, PortForwardingServiceProvider, RemoteAccessVPNServiceProvider,
IpDeployer,
-        NetworkMigrationResponder {
+        NetworkMigrationResponder, AggregatedCommandExecutor {
     private static final Logger s_logger = Logger.getLogger(VirtualRouterElement.class);
     public static final AutoScaleCounterType AutoScaleCounterCpu = new AutoScaleCounterType("cpu");
     public static final AutoScaleCounterType AutoScaleCounterMemory = new AutoScaleCounterType("memory");
@@ -1091,4 +1087,37 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl
             _userVmMgr.setupVmForPvlan(true, userVm.getHostId(), nic);
         }
     }
+
+    @Override
+    public boolean prepareAggregatedExecution(Network network, DeployDestination dest) throws
ResourceUnavailableException {
+        List<DomainRouterVO> routers = getRouters(network, dest);
+
+        if ((routers == null) || (routers.size() == 0)) {
+            throw new ResourceUnavailableException("Can't find at least one router!", DataCenter.class,
network.getDataCenterId());
+        }
+
+        return _routerMgr.prepareAggregatedExecution(network, routers);
+    }
+
+    @Override
+    public boolean completeAggregatedExecution(Network network, DeployDestination dest) throws
ResourceUnavailableException {
+        List<DomainRouterVO> routers = getRouters(network, dest);
+
+        if ((routers == null) || (routers.size() == 0)) {
+            throw new ResourceUnavailableException("Can't find at least one router!", DataCenter.class,
network.getDataCenterId());
+        }
+
+        return _routerMgr.completeAggregatedExecution(network, routers);
+    }
+
+    @Override
+    public boolean cleanupAggregatedExecution(Network network, DeployDestination dest) throws
ResourceUnavailableException {
+        List<DomainRouterVO> routers = getRouters(network, dest);
+
+        if ((routers == null) || (routers.size() == 0)) {
+            throw new ResourceUnavailableException("Can't find at least one router!", DataCenter.class,
network.getDataCenterId());
+        }
+
+        return _routerMgr.cleanupAggregatedExecution(network, routers);
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f45de30d/server/src/com/cloud/network/router/VirtualNetworkApplianceManager.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/router/VirtualNetworkApplianceManager.java b/server/src/com/cloud/network/router/VirtualNetworkApplianceManager.java
index 9097b87..e3597ac 100644
--- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManager.java
+++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManager.java
@@ -16,12 +16,8 @@
 // under the License.
 package com.cloud.network.router;
 
-import java.util.List;
-import java.util.Map;
-
-import org.apache.cloudstack.framework.config.ConfigKey;
-
 import com.cloud.deploy.DeployDestination;
+import com.cloud.exception.AgentUnavailableException;
 import com.cloud.exception.ConcurrentOperationException;
 import com.cloud.exception.InsufficientCapacityException;
 import com.cloud.exception.ResourceUnavailableException;
@@ -39,6 +35,10 @@ import com.cloud.utils.component.Manager;
 import com.cloud.vm.DomainRouterVO;
 import com.cloud.vm.NicProfile;
 import com.cloud.vm.VirtualMachineProfile;
+import org.apache.cloudstack.framework.config.ConfigKey;
+
+import java.util.List;
+import java.util.Map;
 
 /**
  * NetworkManager manages the network for the different end users.
@@ -129,4 +129,10 @@ public interface VirtualNetworkApplianceManager extends Manager, VirtualNetworkA
     boolean removeDhcpSupportForSubnet(Network network, List<DomainRouterVO> routers)
throws ResourceUnavailableException;
 
     boolean setupDhcpForPvlan(boolean add, DomainRouterVO router, Long hostId, NicProfile
nic);
+
+    public boolean prepareAggregatedExecution(Network network, List<DomainRouterVO>
routers) throws AgentUnavailableException;
+
+    public boolean completeAggregatedExecution(Network network, List<DomainRouterVO>
routers) throws AgentUnavailableException;
+
+    public boolean cleanupAggregatedExecution(Network network, List<DomainRouterVO>
routers) throws AgentUnavailableException;
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f45de30d/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
index 3c99867..74cfd74 100755
--- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
+++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
@@ -17,47 +17,6 @@
 
 package com.cloud.network.router;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Calendar;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.TimeZone;
-import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.TimeUnit;
-
-import javax.ejb.Local;
-import javax.inject.Inject;
-import javax.naming.ConfigurationException;
-
-import org.apache.cloudstack.api.command.admin.router.RebootRouterCmd;
-import org.apache.cloudstack.api.command.admin.router.UpgradeRouterCmd;
-import org.apache.cloudstack.api.command.admin.router.UpgradeRouterTemplateCmd;
-import org.apache.cloudstack.config.ApiServiceConfiguration;
-import org.apache.cloudstack.context.CallContext;
-import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
-import org.apache.cloudstack.framework.config.ConfigDepot;
-import org.apache.cloudstack.framework.config.ConfigKey;
-import org.apache.cloudstack.framework.config.Configurable;
-import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
-import org.apache.cloudstack.framework.jobs.AsyncJobManager;
-import org.apache.cloudstack.framework.jobs.impl.AsyncJobVO;
-import org.apache.cloudstack.managed.context.ManagedContextRunnable;
-import org.apache.cloudstack.utils.identity.ManagementServerNode;
-import org.apache.log4j.Logger;
-
 import com.cloud.agent.AgentManager;
 import com.cloud.agent.Listener;
 import com.cloud.agent.api.AgentControlAnswer;
@@ -78,6 +37,8 @@ import com.cloud.agent.api.PvlanSetupCommand;
 import com.cloud.agent.api.StartupCommand;
 import com.cloud.agent.api.check.CheckSshAnswer;
 import com.cloud.agent.api.check.CheckSshCommand;
+import com.cloud.agent.api.routing.AggregationControlCommand;
+import com.cloud.agent.api.routing.AggregationControlCommand.Action;
 import com.cloud.agent.api.routing.CreateIpAliasCommand;
 import com.cloud.agent.api.routing.DeleteIpAliasCommand;
 import com.cloud.agent.api.routing.DhcpEntryCommand;
@@ -277,6 +238,45 @@ import com.cloud.vm.dao.NicIpAliasVO;
 import com.cloud.vm.dao.UserVmDao;
 import com.cloud.vm.dao.UserVmDetailsDao;
 import com.cloud.vm.dao.VMInstanceDao;
+import org.apache.cloudstack.api.command.admin.router.RebootRouterCmd;
+import org.apache.cloudstack.api.command.admin.router.UpgradeRouterCmd;
+import org.apache.cloudstack.api.command.admin.router.UpgradeRouterTemplateCmd;
+import org.apache.cloudstack.config.ApiServiceConfiguration;
+import org.apache.cloudstack.context.CallContext;
+import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
+import org.apache.cloudstack.framework.config.ConfigDepot;
+import org.apache.cloudstack.framework.config.ConfigKey;
+import org.apache.cloudstack.framework.config.Configurable;
+import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
+import org.apache.cloudstack.framework.jobs.AsyncJobManager;
+import org.apache.cloudstack.framework.jobs.impl.AsyncJobVO;
+import org.apache.cloudstack.managed.context.ManagedContextRunnable;
+import org.apache.cloudstack.utils.identity.ManagementServerNode;
+import org.apache.log4j.Logger;
+
+import javax.ejb.Local;
+import javax.inject.Inject;
+import javax.naming.ConfigurationException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Calendar;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TimeZone;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
 
 /**
  * VirtualNetworkApplianceManagerImpl manages the different types of virtual network appliances
available in the Cloud Stack.
@@ -2320,12 +2320,20 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase
implements V
 
         final List<Long> routerGuestNtwkIds = _routerDao.getRouterNetworks(router.getId());
         for (final Long guestNetworkId : routerGuestNtwkIds) {
+            AggregationControlCommand startCmd = new AggregationControlCommand(Action.Start,
router.getInstanceName(), controlNic.getIp4Address(),
+                    getRouterIpInNetwork(guestNetworkId, router.getId()));
+            cmds.addCommand(startCmd);
+
             if (reprogramGuestNtwks) {
                 finalizeIpAssocForNetwork(cmds, router, provider, guestNetworkId, null);
                 finalizeNetworkRulesForNetwork(cmds, router, provider, guestNetworkId);
             }
 
             finalizeUserDataAndDhcpOnStart(cmds, router, provider, guestNetworkId);
+
+            AggregationControlCommand finishCmd = new AggregationControlCommand(Action.Finish,
router.getInstanceName(), controlNic.getIp4Address(),
+                    getRouterIpInNetwork(guestNetworkId, router.getId()));
+            cmds.addCommand(finishCmd);
         }
 
 
@@ -2338,8 +2346,6 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase
implements V
             finalizeMonitorServiceOnStrat(cmds, profile, router, provider, routerGuestNtwkIds.get(0),
false);
         }
 
-
-
         return true;
     }
 
@@ -4259,4 +4265,31 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase
implements V
             }
         }
     }
+
+    protected boolean aggregationExecution(AggregationControlCommand.Action action, Network
network, List<DomainRouterVO> routers) throws AgentUnavailableException {
+        for (DomainRouterVO router : routers) {
+            AggregationControlCommand cmd = new AggregationControlCommand(action, router.getInstanceName(),
getRouterControlIp(router.getId()),
+                    getRouterIpInNetwork(network.getId(), router.getId()));
+            Commands cmds = new Commands(cmd);
+            if (!sendCommandsToRouter(router, cmds)) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    @Override
+    public boolean prepareAggregatedExecution(Network network, List<DomainRouterVO>
routers) throws AgentUnavailableException {
+        return aggregationExecution(Action.Start, network, routers);
+    }
+
+    @Override
+    public boolean completeAggregatedExecution(Network network, List<DomainRouterVO>
routers) throws AgentUnavailableException {
+        return aggregationExecution(Action.Finish, network, routers);
+    }
+
+    @Override
+    public boolean cleanupAggregatedExecution(Network network, List<DomainRouterVO>
routers) throws AgentUnavailableException {
+        return aggregationExecution(Action.Cleanup, network, routers);
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f45de30d/server/test/com/cloud/vpc/MockVpcVirtualNetworkApplianceManager.java
----------------------------------------------------------------------
diff --git a/server/test/com/cloud/vpc/MockVpcVirtualNetworkApplianceManager.java b/server/test/com/cloud/vpc/MockVpcVirtualNetworkApplianceManager.java
index e0c599d..cbed4ca 100644
--- a/server/test/com/cloud/vpc/MockVpcVirtualNetworkApplianceManager.java
+++ b/server/test/com/cloud/vpc/MockVpcVirtualNetworkApplianceManager.java
@@ -17,17 +17,8 @@
 
 package com.cloud.vpc;
 
-import java.util.List;
-import java.util.Map;
-
-import javax.ejb.Local;
-import javax.naming.ConfigurationException;
-
-import org.apache.cloudstack.api.command.admin.router.UpgradeRouterCmd;
-import org.apache.cloudstack.api.command.admin.router.UpgradeRouterTemplateCmd;
-import org.springframework.stereotype.Component;
-
 import com.cloud.deploy.DeployDestination;
+import com.cloud.exception.AgentUnavailableException;
 import com.cloud.exception.ConcurrentOperationException;
 import com.cloud.exception.InsufficientCapacityException;
 import com.cloud.exception.ResourceUnavailableException;
@@ -53,6 +44,14 @@ import com.cloud.vm.DomainRouterVO;
 import com.cloud.vm.NicProfile;
 import com.cloud.vm.VirtualMachineProfile;
 import com.cloud.vm.VirtualMachineProfile.Param;
+import org.apache.cloudstack.api.command.admin.router.UpgradeRouterCmd;
+import org.apache.cloudstack.api.command.admin.router.UpgradeRouterTemplateCmd;
+import org.springframework.stereotype.Component;
+
+import javax.ejb.Local;
+import javax.naming.ConfigurationException;
+import java.util.List;
+import java.util.Map;
 
 @Component
 @Local(value = {VpcVirtualNetworkApplianceManager.class, VpcVirtualNetworkApplianceService.class})
@@ -420,6 +419,21 @@ public class MockVpcVirtualNetworkApplianceManager extends ManagerBase
implement
     }
 
     @Override
+    public boolean prepareAggregatedExecution(Network network, List<DomainRouterVO>
routers) throws AgentUnavailableException {
+        return true;  //To change body of implemented methods use File | Settings | File
Templates.
+    }
+
+    @Override
+    public boolean completeAggregatedExecution(Network network, List<DomainRouterVO>
routers) throws AgentUnavailableException {
+        return true;  //To change body of implemented methods use File | Settings | File
Templates.
+    }
+
+    @Override
+    public boolean cleanupAggregatedExecution(Network network, List<DomainRouterVO>
routers) throws AgentUnavailableException {
+        return true;  //To change body of implemented methods use File | Settings | File
Templates.
+    }
+
+    @Override
     public boolean startRemoteAccessVpn(RemoteAccessVpn vpn, VirtualRouter router) throws
ResourceUnavailableException {
         // TODO Auto-generated method stub
         return false;


Mime
View raw message