You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ya...@apache.org on 2014/03/11 21:24:35 UTC

[1/3] git commit: updated refs/heads/master to 3e097a0

Repository: cloudstack
Updated Branches:
  refs/heads/master 36558e461 -> 3e097a0fb


CLOUDSTACK-6218: Serialize VR commands in VR resource


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

Branch: refs/heads/master
Commit: b399c315a3fceae699fa24dc1ff2bbae191ddd07
Parents: 36558e4
Author: Sheng Yang <sh...@citrix.com>
Authored: Mon Mar 10 12:52:07 2014 -0700
Committer: Sheng Yang <sh...@citrix.com>
Committed: Tue Mar 11 11:58:56 2014 -0700

----------------------------------------------------------------------
 .../virtualnetwork/VirtualRoutingResource.java       | 15 ++++++++++++++-
 1 file changed, 14 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b399c315/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 f22a0db..29a176a 100755
--- a/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java
+++ b/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java
@@ -77,6 +77,8 @@ import java.util.Map;
 import java.util.Queue;
 import java.util.UUID;
 import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
 
 /**
  * VirtualNetworkResource controls and configures virtual networking
@@ -123,6 +125,7 @@ public class VirtualRoutingResource {
     private static final Logger s_logger = Logger.getLogger(VirtualRoutingResource.class);
     private VirtualRouterDeployer _vrDeployer;
     private Map <String, Queue> _vrAggregateCommandsSet;
+    protected Map<String, Lock> _vrLockMap = new HashMap<String, Lock>();
 
     private String _name;
     private int _sleep;
@@ -137,13 +140,22 @@ public class VirtualRoutingResource {
 
     public Answer executeRequest(final NetworkElementCommand cmd) {
         boolean aggregated = false;
+        String routerName = cmd.getAccessDetail(NetworkElementCommand.ROUTER_NAME);
+        Lock lock;
+        if (_vrLockMap.containsKey(routerName)) {
+            lock = _vrLockMap.get(routerName);
+        } else {
+            lock = new ReentrantLock();
+            _vrLockMap.put(routerName, lock);
+        }
+        lock.lock();
+
         try {
             ExecutionResult rc = _vrDeployer.prepareCommand(cmd);
             if (!rc.isSuccess()) {
                 s_logger.error("Failed to prepare VR command due to " + rc.getDetails());
                 return new Answer(cmd, false, rc.getDetails());
             }
-            String routerName = cmd.getAccessDetail(NetworkElementCommand.ROUTER_NAME);
 
             assert cmd.getRouterAccessIp() != null : "Why there is no access IP for VR?";
 
@@ -174,6 +186,7 @@ public class VirtualRoutingResource {
         } catch (final IllegalArgumentException e) {
             return new Answer(cmd, false, e.getMessage());
         } finally {
+            lock.unlock();
             if (!aggregated) {
                 ExecutionResult rc = _vrDeployer.cleanupCommand(cmd);
                 if (!rc.isSuccess()) {


[2/3] git commit: updated refs/heads/master to 3e097a0

Posted by ya...@apache.org.
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/master
Commit: f45de30d1b94df8bb32f9aa724521209f1ae6eb0
Parents: b399c31
Author: Sheng Yang <sh...@citrix.com>
Authored: Thu Mar 6 19:29:20 2014 -0800
Committer: Sheng Yang <sh...@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;


[3/3] git commit: updated refs/heads/master to 3e097a0

Posted by ya...@apache.org.
CLOUDSTACK-5779: Clean up leftover VR script in Xen


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

Branch: refs/heads/master
Commit: 3e097a0fb289971dc2fc509e0ab5ed78b64cf81b
Parents: f45de30
Author: Sheng Yang <sh...@citrix.com>
Authored: Tue Mar 11 13:22:14 2014 -0700
Committer: Sheng Yang <sh...@citrix.com>
Committed: Tue Mar 11 13:22:14 2014 -0700

----------------------------------------------------------------------
 .../vm/hypervisor/xenserver/createipAlias.sh    | 25 --------------------
 .../vm/hypervisor/xenserver/deleteipAlias.sh    | 24 -------------------
 scripts/vm/hypervisor/xenserver/vmops           | 16 -------------
 scripts/vm/hypervisor/xenserver/xcposs/patch    | 12 ----------
 scripts/vm/hypervisor/xenserver/xcpserver/patch |  9 -------
 .../vm/hypervisor/xenserver/xenserver56/patch   |  7 ------
 .../hypervisor/xenserver/xenserver56fp1/patch   |  7 ------
 .../vm/hypervisor/xenserver/xenserver60/patch   |  7 ------
 .../vm/hypervisor/xenserver/xenserver62/patch   |  7 ------
 9 files changed, 114 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3e097a0f/scripts/vm/hypervisor/xenserver/createipAlias.sh
----------------------------------------------------------------------
diff --git a/scripts/vm/hypervisor/xenserver/createipAlias.sh b/scripts/vm/hypervisor/xenserver/createipAlias.sh
deleted file mode 100755
index 4ef6618..0000000
--- a/scripts/vm/hypervisor/xenserver/createipAlias.sh
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/usr/bin/env bash
-# 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.
-
-
-usage() {
-  printf " %s  routerip  <alias_count:ip:netmask;alias_count2:ip2:netmask2;....> \n" $(basename $0) >&2
-}
-
-cert="/root/.ssh/id_rsa.cloud"
-ssh -p 3922 -q -o StrictHostKeyChecking=no -i $cert root@$1 "/root/createIpAlias.sh $2"

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3e097a0f/scripts/vm/hypervisor/xenserver/deleteipAlias.sh
----------------------------------------------------------------------
diff --git a/scripts/vm/hypervisor/xenserver/deleteipAlias.sh b/scripts/vm/hypervisor/xenserver/deleteipAlias.sh
deleted file mode 100644
index 7604172..0000000
--- a/scripts/vm/hypervisor/xenserver/deleteipAlias.sh
+++ /dev/null
@@ -1,24 +0,0 @@
-#!/usr/bin/env bash
-# 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.
-
-usage() {
-  printf " %s  routerip  <alias_count:ip:netmask;alias_count2:ip2:netmask2;....> \n" $(basename $0) >&2
-}
-
-cert="/root/.ssh/id_rsa.cloud"
-ssh -p 3922 -q -o StrictHostKeyChecking=no -i $cert root@$1 "/root/deleteIpAlias.sh $2 $3"

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3e097a0f/scripts/vm/hypervisor/xenserver/vmops
----------------------------------------------------------------------
diff --git a/scripts/vm/hypervisor/xenserver/vmops b/scripts/vm/hypervisor/xenserver/vmops
index 2f0f347..4174ef2 100755
--- a/scripts/vm/hypervisor/xenserver/vmops
+++ b/scripts/vm/hypervisor/xenserver/vmops
@@ -163,21 +163,6 @@ def pingtest(session, args):
     return txt
 
 @echo
-def savePassword(session, args):
-    sargs = args['args']
-    cmd = sargs.split(' ')
-    cmd.insert(0, "/opt/cloud/bin/save_password_to_domr.sh")
-    cmd.insert(0, "/bin/bash")
-    try:
-        txt = util.pread2(cmd)
-        txt = 'success'
-    except:
-        logging.debug("  save password to domr failed "  )
-        txt = '' 
-
-    return txt
-
-@echo
 def setLinkLocalIP(session, args):
     brName = args['brName']
     try:
@@ -1520,7 +1505,6 @@ if __name__ == "__main__":
      XenAPIPlugin.dispatch({"pingtest": pingtest, "setup_iscsi":setup_iscsi, "gethostvmstats": gethostvmstats, 
                             "getgateway": getgateway, "preparemigration": preparemigration, 
                             "setIptables": setIptables, "pingdomr": pingdomr, "pingxenserver": pingxenserver,  
-                            "savePassword": savePassword, 
                             "routerProxy": routerProxy, 
                             "createFile": createFile, "deleteFile": deleteFile,
                             "network_rules":network_rules, 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3e097a0f/scripts/vm/hypervisor/xenserver/xcposs/patch
----------------------------------------------------------------------
diff --git a/scripts/vm/hypervisor/xenserver/xcposs/patch b/scripts/vm/hypervisor/xenserver/xcposs/patch
index 2f902c2..08da883 100644
--- a/scripts/vm/hypervisor/xenserver/xcposs/patch
+++ b/scripts/vm/hypervisor/xenserver/xcposs/patch
@@ -39,13 +39,6 @@ setupxenserver.sh=..,0755,/opt/cloud/bin
 make_migratable.sh=..,0755,/opt/cloud/bin
 setup_iscsi.sh=..,0755,/opt/cloud/bin
 pingtest.sh=../../..,0755,/opt/cloud/bin
-dhcp_entry.sh=../../../../network/domr/,0755,/opt/cloud/bin
-ipassoc.sh=../../../../network/domr/,0755,/opt/cloud/bin
-save_password_to_domr.sh=../../../../network/domr/,0755,/opt/cloud/bin
-networkUsage.sh=../../../../network/domr/,0755,/opt/cloud/bin
-call_firewall.sh=../../../../network/domr/,0755,/opt/cloud/bin
-call_loadbalancer.sh=../../../../network/domr/,0755,/opt/cloud/bin
-l2tp_vpn.sh=../../../../network/domr/,0755,/opt/cloud/bin
 cloud-setup-bonding.sh=..,0755,/opt/cloud/bin
 copy_vhd_to_secondarystorage.sh=..,0755,/opt/cloud/bin
 copy_vhd_from_secondarystorage.sh=..,0755,/opt/cloud/bin
@@ -60,12 +53,7 @@ create_privatetemplate_from_snapshot.sh=..,0755,/opt/cloud/bin
 upgrade_snapshot.sh=..,0755,/opt/cloud/bin
 cloud-clean-vlan.sh=..,0755,/opt/cloud/bin
 cloud-prepare-upgrade.sh=..,0755,/opt/cloud/bin
-getRouterStatus.sh=../../../../network/domr/,0755,/opt/cloud/bin
-bumpUpPriority.sh=../../../../network/domr/,0755,/opt/cloud/bin
-getDomRVersion.sh=../../../../network/domr/,0755,/opt/cloud/bin
 router_proxy.sh=../../../../network/domr/,0755,/opt/cloud/bin
-createipAlias.sh=..,0755,/opt/cloud/bin
-deleteipAlias.sh=..,0755,/opt/cloud/bin
 
 ###add cloudstack plugin script for XCP
 cloudstack_plugins.conf=..,0644,/etc/xensource

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3e097a0f/scripts/vm/hypervisor/xenserver/xcpserver/patch
----------------------------------------------------------------------
diff --git a/scripts/vm/hypervisor/xenserver/xcpserver/patch b/scripts/vm/hypervisor/xenserver/xcpserver/patch
index 01cd73b..2376424 100644
--- a/scripts/vm/hypervisor/xenserver/xcpserver/patch
+++ b/scripts/vm/hypervisor/xenserver/xcpserver/patch
@@ -39,13 +39,7 @@ setupxenserver.sh=..,0755,/opt/cloud/bin
 make_migratable.sh=..,0755,/opt/cloud/bin
 setup_iscsi.sh=..,0755,/opt/cloud/bin
 pingtest.sh=../../..,0755,/opt/cloud/bin
-dhcp_entry.sh=../../../../network/domr/,0755,/opt/cloud/bin
-createipAlias.sh=..,0755,/opt/cloud/bin
-deleteipAlias.sh=..,0755,/opt/cloud/bin
 router_proxy.sh=../../../../network/domr/,0755,/opt/cloud/bin
-save_password_to_domr.sh=../../../../network/domr/,0755,/opt/cloud/bin
-call_firewall.sh=../../../../network/domr/,0755,/opt/cloud/bin
-call_loadbalancer.sh=../../../../network/domr/,0755,/opt/cloud/bin
 cloud-setup-bonding.sh=..,0755,/opt/cloud/bin
 copy_vhd_to_secondarystorage.sh=..,0755,/opt/cloud/bin
 copy_vhd_from_secondarystorage.sh=..,0755,/opt/cloud/bin
@@ -60,9 +54,6 @@ create_privatetemplate_from_snapshot.sh=..,0755,/opt/cloud/bin
 upgrade_snapshot.sh=..,0755,/opt/cloud/bin
 cloud-clean-vlan.sh=..,0755,/opt/cloud/bin
 cloud-prepare-upgrade.sh=..,0755,/opt/cloud/bin
-getRouterStatus.sh=../../../../network/domr/,0755,/opt/cloud/bin
-bumpUpPriority.sh=../../../../network/domr/,0755,/opt/cloud/bin
-getDomRVersion.sh=../../../../network/domr/,0755,/opt/cloud/bin
 add_to_vcpus_params_live.sh=..,0755,/opt/cloud/bin
 
 ###add cloudstack plugin script for XCP

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3e097a0f/scripts/vm/hypervisor/xenserver/xenserver56/patch
----------------------------------------------------------------------
diff --git a/scripts/vm/hypervisor/xenserver/xenserver56/patch b/scripts/vm/hypervisor/xenserver/xenserver56/patch
index 9473bca..16dcb57 100644
--- a/scripts/vm/hypervisor/xenserver/xenserver56/patch
+++ b/scripts/vm/hypervisor/xenserver/xenserver56/patch
@@ -39,12 +39,6 @@ make_migratable.sh=..,0755,/opt/cloud/bin
 setup_iscsi.sh=..,0755,/opt/cloud/bin
 cloud-setup-bonding.sh=..,0755,/opt/cloud/bin
 pingtest.sh=../../..,0755,/opt/cloud/bin
-createipAlias.sh=..,0755,/opt/cloud/bin
-deleteipAlias.sh=..,0755,/opt/cloud/bin
-dhcp_entry.sh=../../../../network/domr/,0755,/opt/cloud/bin
-save_password_to_domr.sh=../../../../network/domr/,0755,/opt/cloud/bin
-call_firewall.sh=../../../../network/domr/,0755,/opt/cloud/bin
-call_loadbalancer.sh=../../../../network/domr/,0755,/opt/cloud/bin
 router_proxy.sh=../../../../network/domr/,0755,/opt/cloud/bin
 copy_vhd_to_secondarystorage.sh=..,0755,/opt/cloud/bin
 copy_vhd_from_secondarystorage.sh=..,0755,/opt/cloud/bin
@@ -61,7 +55,6 @@ create_privatetemplate_from_snapshot.sh=..,0755,/opt/cloud/bin
 upgrade_snapshot.sh=..,0755,/opt/cloud/bin
 cloud-clean-vlan.sh=..,0755,/opt/cloud/bin
 cloud-prepare-upgrade.sh=..,0755,/opt/cloud/bin
-bumpUpPriority.sh=../../../../network/domr/,0755,/opt/cloud/bin
 swift=..,0755,/opt/cloud/bin
 swiftxen=..,0755,/etc/xapi.d/plugins
 s3xen=..,0755,/etc/xapi.d/plugins

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3e097a0f/scripts/vm/hypervisor/xenserver/xenserver56fp1/patch
----------------------------------------------------------------------
diff --git a/scripts/vm/hypervisor/xenserver/xenserver56fp1/patch b/scripts/vm/hypervisor/xenserver/xenserver56fp1/patch
index c91aa73..11bda07 100644
--- a/scripts/vm/hypervisor/xenserver/xenserver56fp1/patch
+++ b/scripts/vm/hypervisor/xenserver/xenserver56fp1/patch
@@ -38,12 +38,6 @@ setupxenserver.sh=..,0755,/opt/cloud/bin
 make_migratable.sh=..,0755,/opt/cloud/bin
 setup_iscsi.sh=..,0755,/opt/cloud/bin
 pingtest.sh=../../..,0755,/opt/cloud/bin
-createipAlias.sh=..,0755,/opt/cloud/bin
-deleteipAlias.sh=..,0755,/opt/cloud/bin
-dhcp_entry.sh=../../../../network/domr/,0755,/opt/cloud/bin
-save_password_to_domr.sh=../../../../network/domr/,0755,/opt/cloud/bin
-call_firewall.sh=../../../../network/domr/,0755,/opt/cloud/bin
-call_loadbalancer.sh=../../../../network/domr/,0755,/opt/cloud/bin
 router_proxy.sh=../../../../network/domr/,0755,/opt/cloud/bin
 cloud-setup-bonding.sh=..,0755,/opt/cloud/bin
 copy_vhd_to_secondarystorage.sh=..,0755,/opt/cloud/bin
@@ -60,7 +54,6 @@ create_privatetemplate_from_snapshot.sh=..,0755,/opt/cloud/bin
 upgrade_snapshot.sh=..,0755,/opt/cloud/bin
 cloud-clean-vlan.sh=..,0755,/opt/cloud/bin
 cloud-prepare-upgrade.sh=..,0755,/opt/cloud/bin
-bumpUpPriority.sh=../../../../network/domr/,0755,/opt/cloud/bin
 swift=..,0755,/opt/cloud/bin
 swiftxen=..,0755,/etc/xapi.d/plugins
 s3xen=..,0755,/etc/xapi.d/plugins

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3e097a0f/scripts/vm/hypervisor/xenserver/xenserver60/patch
----------------------------------------------------------------------
diff --git a/scripts/vm/hypervisor/xenserver/xenserver60/patch b/scripts/vm/hypervisor/xenserver/xenserver60/patch
index 5a648e0..662327b 100644
--- a/scripts/vm/hypervisor/xenserver/xenserver60/patch
+++ b/scripts/vm/hypervisor/xenserver/xenserver60/patch
@@ -40,14 +40,8 @@ id_rsa.cloud=../../../systemvm,0600,/root/.ssh
 network_info.sh=..,0755,/opt/cloud/bin
 setupxenserver.sh=..,0755,/opt/cloud/bin
 make_migratable.sh=..,0755,/opt/cloud/bin
-createipAlias.sh=..,0755,/opt/cloud/bin
-deleteipAlias.sh=..,0755,/opt/cloud/bin
 setup_iscsi.sh=..,0755,/opt/cloud/bin
 pingtest.sh=../../..,0755,/opt/cloud/bin
-dhcp_entry.sh=../../../../network/domr/,0755,/opt/cloud/bin
-save_password_to_domr.sh=../../../../network/domr/,0755,/opt/cloud/bin
-call_firewall.sh=../../../../network/domr/,0755,/opt/cloud/bin
-call_loadbalancer.sh=../../../../network/domr/,0755,/opt/cloud/bin
 router_proxy.sh=../../../../network/domr/,0755,/opt/cloud/bin
 cloud-setup-bonding.sh=..,0755,/opt/cloud/bin
 copy_vhd_to_secondarystorage.sh=..,0755,/opt/cloud/bin
@@ -64,7 +58,6 @@ create_privatetemplate_from_snapshot.sh=..,0755,/opt/cloud/bin
 upgrade_snapshot.sh=..,0755,/opt/cloud/bin
 cloud-clean-vlan.sh=..,0755,/opt/cloud/bin
 cloud-prepare-upgrade.sh=..,0755,/opt/cloud/bin
-bumpUpPriority.sh=../../../../network/domr/,0755,/opt/cloud/bin
 swift=..,0755,/opt/cloud/bin
 swiftxen=..,0755,/etc/xapi.d/plugins
 s3xen=..,0755,/etc/xapi.d/plugins

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3e097a0f/scripts/vm/hypervisor/xenserver/xenserver62/patch
----------------------------------------------------------------------
diff --git a/scripts/vm/hypervisor/xenserver/xenserver62/patch b/scripts/vm/hypervisor/xenserver/xenserver62/patch
index 70b86b4..05c619b 100644
--- a/scripts/vm/hypervisor/xenserver/xenserver62/patch
+++ b/scripts/vm/hypervisor/xenserver/xenserver62/patch
@@ -40,14 +40,8 @@ id_rsa.cloud=../../../systemvm,0600,/root/.ssh
 network_info.sh=..,0755,/opt/cloud/bin
 setupxenserver.sh=..,0755,/opt/cloud/bin
 make_migratable.sh=..,0755,/opt/cloud/bin
-createipAlias.sh=..,0755,/opt/cloud/bin
-deleteipAlias.sh=..,0755,/opt/cloud/bin
 setup_iscsi.sh=..,0755,/opt/cloud/bin
 pingtest.sh=../../..,0755,/opt/cloud/bin
-dhcp_entry.sh=../../../../network/domr/,0755,/opt/cloud/bin
-save_password_to_domr.sh=../../../../network/domr/,0755,/opt/cloud/bin
-call_firewall.sh=../../../../network/domr/,0755,/opt/cloud/bin
-call_loadbalancer.sh=../../../../network/domr/,0755,/opt/cloud/bin
 router_proxy.sh=../../../../network/domr/,0755,/opt/cloud/bin
 cloud-setup-bonding.sh=..,0755,/opt/cloud/bin
 kill_copy_process.sh=..,0755,/opt/cloud/bin
@@ -60,7 +54,6 @@ vhd-util=..,0755,/opt/cloud/bin
 upgrade_snapshot.sh=..,0755,/opt/cloud/bin
 cloud-clean-vlan.sh=..,0755,/opt/cloud/bin
 cloud-prepare-upgrade.sh=..,0755,/opt/cloud/bin
-bumpUpPriority.sh=../../../../network/domr/,0755,/opt/cloud/bin
 swift=..,0755,/opt/cloud/bin
 swiftxen=..,0755,/etc/xapi.d/plugins
 s3xen=..,0755,/etc/xapi.d/plugins