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/02/20 04:47:44 UTC

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

Repository: cloudstack
Updated Branches:
  refs/heads/master c171e2c3e -> 3bbbda887


CLOUDSTACK-6047: Make sure every commands to VR resource is NetworkElementCommand


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

Branch: refs/heads/master
Commit: 5332f67ae87b87af352db92355ca328de6df29dd
Parents: c171e2c
Author: Sheng Yang <sh...@citrix.com>
Authored: Wed Feb 19 19:12:06 2014 -0800
Committer: Sheng Yang <sh...@citrix.com>
Committed: Wed Feb 19 19:46:49 2014 -0800

----------------------------------------------------------------------
 .../agent/resource/virtualnetwork/VirtualRoutingResource.java | 7 +++----
 .../hypervisor/kvm/resource/LibvirtComputingResource.java     | 2 +-
 .../com/cloud/hypervisor/vmware/resource/VmwareResource.java  | 2 +-
 .../com/cloud/hypervisor/xen/resource/CitrixResourceBase.java | 2 +-
 4 files changed, 6 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5332f67a/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 9ecbe7f..2ac6f4f 100755
--- a/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java
+++ b/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java
@@ -22,7 +22,6 @@ import com.cloud.agent.api.CheckRouterAnswer;
 import com.cloud.agent.api.CheckRouterCommand;
 import com.cloud.agent.api.CheckS2SVpnConnectionsAnswer;
 import com.cloud.agent.api.CheckS2SVpnConnectionsCommand;
-import com.cloud.agent.api.Command;
 import com.cloud.agent.api.GetDomRVersionAnswer;
 import com.cloud.agent.api.GetDomRVersionCmd;
 import com.cloud.agent.api.SetupGuestNetworkCommand;
@@ -130,9 +129,9 @@ public class VirtualRoutingResource {
         this._vrDeployer = deployer;
     }
 
-    public Answer executeRequest(final Command cmd) {
+    public Answer executeRequest(final NetworkElementCommand cmd) {
         try {
-            ExecutionResult rc = _vrDeployer.prepareCommand((NetworkElementCommand)cmd);
+            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());
@@ -194,7 +193,7 @@ public class VirtualRoutingResource {
         } catch (final IllegalArgumentException e) {
             return new Answer(cmd, false, e.getMessage());
         } finally {
-            ExecutionResult rc = _vrDeployer.cleanupCommand((NetworkElementCommand)cmd);
+            ExecutionResult rc = _vrDeployer.cleanupCommand(cmd);
             if (!rc.isSuccess()) {
                 s_logger.error("Failed to cleanup VR command due to " + rc.getDetails());
             }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5332f67a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
index d63b643..f624379 100755
--- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
+++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
@@ -1313,7 +1313,7 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
             } else if (cmd instanceof UnPlugNicCommand) {
                 return execute((UnPlugNicCommand)cmd);
             } else if (cmd instanceof NetworkElementCommand) {
-                return _virtRouterResource.executeRequest(cmd);
+                return _virtRouterResource.executeRequest((NetworkElementCommand)cmd);
             } else if (cmd instanceof CheckSshCommand) {
                 return execute((CheckSshCommand)cmd);
             } else if (cmd instanceof NetworkUsageCommand) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5332f67a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
index c74a278..60c5909 100755
--- a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
+++ b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
@@ -395,7 +395,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
             if (clz == CreateCommand.class) {
                 answer = execute((CreateCommand)cmd);
             } else if (cmd instanceof NetworkElementCommand) {
-                return _vrResource.executeRequest(cmd);
+                return _vrResource.executeRequest((NetworkElementCommand)cmd);
             } else if (clz == ReadyCommand.class) {
                 answer = execute((ReadyCommand)cmd);
             } else if (clz == GetHostStatsCommand.class) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5332f67a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
index e463072..48ae3ea 100644
--- a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
+++ b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
@@ -412,7 +412,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
         if (clazz == CreateCommand.class) {
             return execute((CreateCommand)cmd);
         } else if (cmd instanceof NetworkElementCommand) {
-            return _vrResource.executeRequest(cmd);
+            return _vrResource.executeRequest((NetworkElementCommand)cmd);
         } else if (clazz == CheckConsoleProxyLoadCommand.class) {
             return execute((CheckConsoleProxyLoadCommand)cmd);
         } else if (clazz == WatchConsoleProxyLoadCommand.class) {


[5/7] git commit: updated refs/heads/master to 3bbbda8

Posted by ya...@apache.org.
CLOUDSTACK-6047: Add generic wrapper for group answer needed commands


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

Branch: refs/heads/master
Commit: 8b341b0639b1947a71df29d409948eb96e238499
Parents: 43b4144
Author: Sheng Yang <sh...@citrix.com>
Authored: Wed Feb 19 19:12:07 2014 -0800
Committer: Sheng Yang <sh...@citrix.com>
Committed: Wed Feb 19 19:47:09 2014 -0800

----------------------------------------------------------------------
 .../cloud/agent/api/routing/GroupAnswer.java    |   2 +-
 .../cloud/agent/api/routing/IpAssocCommand.java |   4 +
 .../agent/api/routing/IpAssocVpcCommand.java    |   6 +
 .../api/routing/NetworkElementCommand.java      |   4 +
 .../api/routing/SetFirewallRulesCommand.java    |   9 +-
 .../agent/api/routing/SetNetworkACLCommand.java |  11 +-
 .../routing/SetPortForwardingRulesCommand.java  |  10 +-
 .../SetPortForwardingRulesVpcCommand.java       |   4 +-
 .../api/routing/SetStaticNatRulesCommand.java   |   9 +-
 .../api/routing/SetStaticRouteCommand.java      |  13 +-
 .../virtualnetwork/VirtualRoutingResource.java  | 216 ++++++-------------
 11 files changed, 117 insertions(+), 171 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8b341b06/core/src/com/cloud/agent/api/routing/GroupAnswer.java
----------------------------------------------------------------------
diff --git a/core/src/com/cloud/agent/api/routing/GroupAnswer.java b/core/src/com/cloud/agent/api/routing/GroupAnswer.java
index 0917a7b..293934b 100644
--- a/core/src/com/cloud/agent/api/routing/GroupAnswer.java
+++ b/core/src/com/cloud/agent/api/routing/GroupAnswer.java
@@ -34,7 +34,7 @@ public class GroupAnswer extends Answer {
         this.results = results;
     }
 
-    String[] getResults() {
+    public String[] getResults() {
         return results;
     }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8b341b06/core/src/com/cloud/agent/api/routing/IpAssocCommand.java
----------------------------------------------------------------------
diff --git a/core/src/com/cloud/agent/api/routing/IpAssocCommand.java b/core/src/com/cloud/agent/api/routing/IpAssocCommand.java
index df5d54a..fe6ab6f 100644
--- a/core/src/com/cloud/agent/api/routing/IpAssocCommand.java
+++ b/core/src/com/cloud/agent/api/routing/IpAssocCommand.java
@@ -38,4 +38,8 @@ public class IpAssocCommand extends NetworkElementCommand {
         return ipAddresses;
     }
 
+    @Override
+    public int getAnswersCount() {
+        return ipAddresses.length;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8b341b06/core/src/com/cloud/agent/api/routing/IpAssocVpcCommand.java
----------------------------------------------------------------------
diff --git a/core/src/com/cloud/agent/api/routing/IpAssocVpcCommand.java b/core/src/com/cloud/agent/api/routing/IpAssocVpcCommand.java
index 3e5566a..d4996a5 100644
--- a/core/src/com/cloud/agent/api/routing/IpAssocVpcCommand.java
+++ b/core/src/com/cloud/agent/api/routing/IpAssocVpcCommand.java
@@ -26,4 +26,10 @@ public class IpAssocVpcCommand extends IpAssocCommand {
     public IpAssocVpcCommand(IpAddressTO[] ips) {
         super(ips);
     }
+
+    @Override
+    public int getAnswersCount() {
+        //Count private gateway to maximum value
+        return ipAddresses.length * 2;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8b341b06/core/src/com/cloud/agent/api/routing/NetworkElementCommand.java
----------------------------------------------------------------------
diff --git a/core/src/com/cloud/agent/api/routing/NetworkElementCommand.java b/core/src/com/cloud/agent/api/routing/NetworkElementCommand.java
index 205784b..f13037c 100644
--- a/core/src/com/cloud/agent/api/routing/NetworkElementCommand.java
+++ b/core/src/com/cloud/agent/api/routing/NetworkElementCommand.java
@@ -62,4 +62,8 @@ public abstract class NetworkElementCommand extends Command {
     public void setRouterAccessIp(String routerAccessIp) {
         this.routerAccessIp = routerAccessIp;
     }
+
+    public int getAnswersCount() {
+        return 1;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8b341b06/core/src/com/cloud/agent/api/routing/SetFirewallRulesCommand.java
----------------------------------------------------------------------
diff --git a/core/src/com/cloud/agent/api/routing/SetFirewallRulesCommand.java b/core/src/com/cloud/agent/api/routing/SetFirewallRulesCommand.java
index f7ac052..36771b9 100644
--- a/core/src/com/cloud/agent/api/routing/SetFirewallRulesCommand.java
+++ b/core/src/com/cloud/agent/api/routing/SetFirewallRulesCommand.java
@@ -16,12 +16,12 @@
 // under the License.
 package com.cloud.agent.api.routing;
 
+import com.cloud.agent.api.to.FirewallRuleTO;
+
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
-import com.cloud.agent.api.to.FirewallRuleTO;
-
 /**
  *
  * AccessDetails allow different components to put in information about
@@ -92,4 +92,9 @@ public class SetFirewallRulesCommand extends NetworkElementCommand {
 
         return result;
     }
+
+    @Override
+    public int getAnswersCount() {
+        return rules.length;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8b341b06/core/src/com/cloud/agent/api/routing/SetNetworkACLCommand.java
----------------------------------------------------------------------
diff --git a/core/src/com/cloud/agent/api/routing/SetNetworkACLCommand.java b/core/src/com/cloud/agent/api/routing/SetNetworkACLCommand.java
index 7edcdf3..0b9fec5 100644
--- a/core/src/com/cloud/agent/api/routing/SetNetworkACLCommand.java
+++ b/core/src/com/cloud/agent/api/routing/SetNetworkACLCommand.java
@@ -17,14 +17,14 @@
 
 package com.cloud.agent.api.routing;
 
+import com.cloud.agent.api.to.NetworkACLTO;
+import com.cloud.agent.api.to.NicTO;
+
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.List;
 
-import com.cloud.agent.api.to.NetworkACLTO;
-import com.cloud.agent.api.to.NicTO;
-
 public class SetNetworkACLCommand extends NetworkElementCommand {
     NetworkACLTO[] rules;
     NicTO nic;
@@ -97,4 +97,9 @@ public class SetNetworkACLCommand extends NetworkElementCommand {
     public NicTO getNic() {
         return nic;
     }
+
+    @Override
+    public int getAnswersCount() {
+        return rules.length;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8b341b06/core/src/com/cloud/agent/api/routing/SetPortForwardingRulesCommand.java
----------------------------------------------------------------------
diff --git a/core/src/com/cloud/agent/api/routing/SetPortForwardingRulesCommand.java b/core/src/com/cloud/agent/api/routing/SetPortForwardingRulesCommand.java
index a7bf37f..d93ccaf 100644
--- a/core/src/com/cloud/agent/api/routing/SetPortForwardingRulesCommand.java
+++ b/core/src/com/cloud/agent/api/routing/SetPortForwardingRulesCommand.java
@@ -16,10 +16,10 @@
 // under the License.
 package com.cloud.agent.api.routing;
 
-import java.util.List;
-
 import com.cloud.agent.api.to.PortForwardingRuleTO;
 
+import java.util.List;
+
 public class SetPortForwardingRulesCommand extends NetworkElementCommand {
     PortForwardingRuleTO[] rules;
 
@@ -37,4 +37,10 @@ public class SetPortForwardingRulesCommand extends NetworkElementCommand {
     public PortForwardingRuleTO[] getRules() {
         return rules;
     }
+
+    @Override
+    public int getAnswersCount() {
+        return rules.length;
+    }
 }
+

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8b341b06/core/src/com/cloud/agent/api/routing/SetPortForwardingRulesVpcCommand.java
----------------------------------------------------------------------
diff --git a/core/src/com/cloud/agent/api/routing/SetPortForwardingRulesVpcCommand.java b/core/src/com/cloud/agent/api/routing/SetPortForwardingRulesVpcCommand.java
index 613ae5d..1bce50d 100644
--- a/core/src/com/cloud/agent/api/routing/SetPortForwardingRulesVpcCommand.java
+++ b/core/src/com/cloud/agent/api/routing/SetPortForwardingRulesVpcCommand.java
@@ -16,10 +16,10 @@
 // under the License.
 package com.cloud.agent.api.routing;
 
-import java.util.List;
-
 import com.cloud.agent.api.to.PortForwardingRuleTO;
 
+import java.util.List;
+
 public class SetPortForwardingRulesVpcCommand extends SetPortForwardingRulesCommand {
     protected SetPortForwardingRulesVpcCommand() {
     }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8b341b06/core/src/com/cloud/agent/api/routing/SetStaticNatRulesCommand.java
----------------------------------------------------------------------
diff --git a/core/src/com/cloud/agent/api/routing/SetStaticNatRulesCommand.java b/core/src/com/cloud/agent/api/routing/SetStaticNatRulesCommand.java
index a38bf5f..64c7660 100644
--- a/core/src/com/cloud/agent/api/routing/SetStaticNatRulesCommand.java
+++ b/core/src/com/cloud/agent/api/routing/SetStaticNatRulesCommand.java
@@ -16,10 +16,10 @@
 // under the License.
 package com.cloud.agent.api.routing;
 
-import java.util.List;
-
 import com.cloud.agent.api.to.StaticNatRuleTO;
 
+import java.util.List;
+
 public class SetStaticNatRulesCommand extends NetworkElementCommand {
 
     StaticNatRuleTO[] rules;
@@ -44,4 +44,9 @@ public class SetStaticNatRulesCommand extends NetworkElementCommand {
     public Long getVpcId() {
         return vpcId;
     }
+
+    @Override
+    public int getAnswersCount() {
+        return rules.length;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8b341b06/core/src/com/cloud/agent/api/routing/SetStaticRouteCommand.java
----------------------------------------------------------------------
diff --git a/core/src/com/cloud/agent/api/routing/SetStaticRouteCommand.java b/core/src/com/cloud/agent/api/routing/SetStaticRouteCommand.java
index 26800a1..1e4f0c8 100644
--- a/core/src/com/cloud/agent/api/routing/SetStaticRouteCommand.java
+++ b/core/src/com/cloud/agent/api/routing/SetStaticRouteCommand.java
@@ -17,14 +17,14 @@
 
 package com.cloud.agent.api.routing;
 
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
 import com.cloud.network.vpc.StaticRoute;
 import com.cloud.network.vpc.StaticRouteProfile;
 import com.cloud.utils.net.NetUtils;
 
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
 public class SetStaticRouteCommand extends NetworkElementCommand {
     StaticRouteProfile[] staticRoutes;
 
@@ -59,4 +59,9 @@ public class SetStaticRouteCommand extends NetworkElementCommand {
         result[0] = toAdd.toArray(new String[toAdd.size()]);
         return result;
     }
+
+    @Override
+    public int getAnswersCount() {
+        return staticRoutes.length;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8b341b06/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 f66b030..49a5c0a 100755
--- a/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java
+++ b/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java
@@ -231,14 +231,44 @@ public class VirtualRoutingResource {
         }
     }
 
-    private Answer applyConfigSingle(NetworkElementCommand cmd, List<ConfigItem> cfg) {
-        for (ConfigItem c : cfg) {
+    private Answer applyConfig(NetworkElementCommand cmd, List<ConfigItem> cfg) {
+        int answersCount = cmd.getAnswersCount();
+        assert (cfg.size() <= answersCount) : "Why there are more commands than answers?";
+
+        if (cfg.size() == 1 && answersCount == 1) {
+            ConfigItem c = cfg.get(0);
             ExecutionResult result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), c.getScript(), c.getArgs());
-            if (!result.isSuccess()) {
-                return new Answer(cmd, false, result.getDetails());
+            return new Answer(cmd, result.isSuccess(), result.getDetails());
+        }
+
+        ExecutionResult[] results = new ExecutionResult[answersCount];
+        String[] resultsString = new String[answersCount];
+        boolean finalResult = true;
+        int i = 0, j;
+        for (ConfigItem c : cfg) {
+            results[i] = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), c.getScript(), c.getArgs());
+            if (c.getInfo() != null) {
+                if (results[i].isSuccess()) {
+                    results[i].setDetails(c.getInfo() + " - success: " + results[i].getDetails());
+                } else {
+                    results[i].setDetails(c.getInfo() + " - failed: " + results[i].getDetails());
+                }
             }
+            i ++;
         }
-        return new Answer(cmd);
+        i = 0; j = 0;
+        while (j < answersCount) {
+            resultsString[j] = results[i].getDetails();
+            if (!results[i].isSuccess()) {
+                finalResult = false;
+            }
+            // Fill the resultsString with the last result of execution, mostly in 1:n
+            if (i < cfg.size() - 1) {
+                i ++;
+            }
+            j ++;
+        }
+        return new GroupAnswer(cmd, finalResult, answersCount, resultsString);
     }
 
     private List<ConfigItem> generateConfig(VpnUsersCfgCommand cmd) {
@@ -259,7 +289,7 @@ public class VirtualRoutingResource {
 
     private Answer execute(VpnUsersCfgCommand cmd) {
         List<ConfigItem> cfg = generateConfig(cmd);
-        return applyConfigSingle(cmd, cfg);
+        return applyConfig(cmd, cfg);
     }
 
     private List<ConfigItem> generateConfig(RemoteAccessVpnCfgCommand cmd) {
@@ -288,7 +318,7 @@ public class VirtualRoutingResource {
 
     private Answer execute(RemoteAccessVpnCfgCommand cmd) {
         List<ConfigItem> cfg = generateConfig(cmd);
-        return applyConfigSingle(cmd, cfg);
+        return applyConfig(cmd, cfg);
     }
 
     private List<ConfigItem> generateConfig(SetFirewallRulesCommand cmd) {
@@ -332,27 +362,8 @@ public class VirtualRoutingResource {
     }
 
     private Answer execute(SetFirewallRulesCommand cmd) {
-        int rulesCount = cmd.getRules().length;
-        String[] results = new String[rulesCount];
-        String routerAccessIp = cmd.getRouterAccessIp();
-
-        if (routerAccessIp == null) {
-            return new GroupAnswer(cmd, false, rulesCount, results);
-        }
-
         List<ConfigItem> cfg = generateConfig(cmd);
-        ConfigItem c = cfg.get(0);
-        ExecutionResult result = _vrDeployer.executeInVR(routerAccessIp, c.getScript(), c.getArgs());
-
-        if (!result.isSuccess()) {
-            //FIXME - in the future we have to process each rule separately; now we temporarily set every rule to be false if single rule fails
-            for (int i = 0; i < results.length; i++) {
-                results[i] = "Failed: " + result.getDetails();
-            }
-            return new GroupAnswer(cmd, false, rulesCount, results);
-        }
-        return new GroupAnswer(cmd, true, rulesCount, results);
-
+        return applyConfig(cmd, cfg);
     }
 
     private List<ConfigItem> generateConfig(SetPortForwardingRulesCommand cmd) {
@@ -373,24 +384,8 @@ public class VirtualRoutingResource {
     }
 
     private Answer execute(SetPortForwardingRulesCommand cmd) {
-        int rulesCount = cmd.getRules().length;
-        String[] results = new String[rulesCount];
-        int i = 0;
-        boolean endResult = true;
         List<ConfigItem> cfg = generateConfig(cmd);
-
-        for (ConfigItem c : cfg) {
-            ExecutionResult result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), c.getScript(), c.getArgs());
-
-            if (!result.isSuccess()) {
-                results[i++] = "Failed";
-                endResult = false;
-            } else {
-                results[i++] = null;
-            }
-        }
-
-        return new GroupAnswer(cmd, endResult, rulesCount, results);
+        return applyConfig(cmd, cfg);
     }
 
     private List<ConfigItem> generateConfig(SetStaticNatRulesCommand cmd) {
@@ -424,24 +419,9 @@ public class VirtualRoutingResource {
         return cfg;
     }
 
-    private GroupAnswer execute(SetStaticNatRulesCommand cmd) {
-        String[] results = new String[cmd.getRules().length];
-        int i = 0;
-        boolean endResult = true;
-
+    private Answer execute(SetStaticNatRulesCommand cmd) {
         List<ConfigItem> cfg = generateConfig(cmd);
-        for (ConfigItem c : cfg) {
-            ExecutionResult result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), c.getScript(), c.getArgs());
-
-            if (!result.isSuccess()) {
-                results[i++] = "Failed";
-                endResult = false;
-            } else {
-                results[i++] = null;
-            }
-        }
-
-        return new GroupAnswer(cmd, endResult, cmd.getRules().length, results);
+        return applyConfig(cmd, cfg);
     }
 
     private List<ConfigItem> generateConfig(LoadBalancerConfigCommand cmd) {
@@ -542,7 +522,7 @@ public class VirtualRoutingResource {
 
     protected Answer execute(VmDataCommand cmd) {
         List<ConfigItem> cfg = generateConfig(cmd);
-        return applyConfigSingle(cmd, cfg);
+        return applyConfig(cmd, cfg);
     }
 
     private List<ConfigItem> generateConfig(SavePasswordCommand cmd) {
@@ -560,7 +540,7 @@ public class VirtualRoutingResource {
 
     protected Answer execute(final SavePasswordCommand cmd) {
         List<ConfigItem> cfg = generateConfig(cmd);
-        return applyConfigSingle(cmd, cfg);
+        return applyConfig(cmd, cfg);
     }
 
     private List<ConfigItem> generateConfig(DhcpEntryCommand cmd) {
@@ -599,7 +579,7 @@ public class VirtualRoutingResource {
 
     protected Answer execute(final DhcpEntryCommand cmd) {
         List<ConfigItem> cfg = generateConfig(cmd);
-        return applyConfigSingle(cmd, cfg);
+        return applyConfig(cmd, cfg);
     }
 
     private List<ConfigItem> generateConfig(CreateIpAliasCommand cmd) {
@@ -617,7 +597,7 @@ public class VirtualRoutingResource {
 
     protected Answer execute(final CreateIpAliasCommand cmd) {
         List<ConfigItem> cfg = generateConfig(cmd);
-        return applyConfigSingle(cmd, cfg);
+        return applyConfig(cmd, cfg);
     }
 
     private List<ConfigItem> generateConfig(DeleteIpAliasCommand cmd) {
@@ -641,7 +621,7 @@ public class VirtualRoutingResource {
 
     protected Answer execute(final DeleteIpAliasCommand cmd) {
         List<ConfigItem> cfg = generateConfig(cmd);
-        return applyConfigSingle(cmd, cfg);
+        return applyConfig(cmd, cfg);
     }
 
     private List<ConfigItem> generateConfig(DnsMasqConfigCommand cmd) {
@@ -659,7 +639,7 @@ public class VirtualRoutingResource {
 
     protected Answer execute(final DnsMasqConfigCommand cmd) {
         List<ConfigItem> cfg = generateConfig(cmd);
-        return applyConfigSingle(cmd, cfg);
+        return applyConfig(cmd, cfg);
     }
 
     private CheckS2SVpnConnectionsAnswer execute(CheckS2SVpnConnectionsCommand cmd) {
@@ -688,7 +668,7 @@ public class VirtualRoutingResource {
 
     protected Answer execute(BumpUpPriorityCommand cmd) {
         List<ConfigItem> cfg = generateConfig(cmd);
-        return applyConfigSingle(cmd, cfg);
+        return applyConfig(cmd, cfg);
     }
 
     protected Answer execute(GetDomRVersionCmd cmd) {
@@ -754,7 +734,7 @@ public class VirtualRoutingResource {
 
     protected Answer execute(Site2SiteVpnCfgCommand cmd) {
         List<ConfigItem> cfg = generateConfig(cmd);
-        return applyConfigSingle(cmd, cfg);
+        return applyConfig(cmd, cfg);
     }
 
     protected List<ConfigItem> generateConfig(SetMonitorServiceCommand cmd) {
@@ -774,7 +754,7 @@ public class VirtualRoutingResource {
 
     protected Answer execute(SetMonitorServiceCommand cmd) {
         List<ConfigItem> cfg = generateConfig(cmd);
-        return applyConfigSingle(cmd, cfg);
+        return applyConfig(cmd, cfg);
     }
 
     protected List<ConfigItem> generateConfig(SetupGuestNetworkCommand cmd) {
@@ -819,7 +799,7 @@ public class VirtualRoutingResource {
 
     protected Answer execute(SetupGuestNetworkCommand cmd) {
         List<ConfigItem> cfg = generateConfig(cmd);
-        return applyConfigSingle(cmd, cfg);
+        return applyConfig(cmd, cfg);
     }
 
     protected List<ConfigItem> generateConfig(SetNetworkACLCommand cmd) {
@@ -856,22 +836,9 @@ public class VirtualRoutingResource {
         return cfg;
     }
 
-    private GroupAnswer execute(SetNetworkACLCommand cmd) {
-        int rulesCount = cmd.getRules().length;
-        String[] results = new String[rulesCount];
-
+    private Answer execute(SetNetworkACLCommand cmd) {
         List<ConfigItem> cfg = generateConfig(cmd);
-        ConfigItem c = cfg.get(0);
-        final ExecutionResult result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), c.getScript(), c.getArgs());
-
-        if (!result.isSuccess()) {
-            for (int i = 0; i < results.length; i++) {
-                results[i] = "Failed";
-            }
-            return new GroupAnswer(cmd, false, rulesCount, results);
-        }
-
-        return new GroupAnswer(cmd, true, rulesCount, results);
+        return applyConfig(cmd, cfg);
     }
 
     protected List<ConfigItem> generateConfig(SetSourceNatCommand cmd) {
@@ -891,7 +858,7 @@ public class VirtualRoutingResource {
 
     protected Answer execute(SetSourceNatCommand cmd) {
         List<ConfigItem> cfg = generateConfig(cmd);
-        return applyConfigSingle(cmd, cfg);
+        return applyConfig(cmd, cfg);
     }
 
     protected List<ConfigItem> generateConfig(SetPortForwardingRulesVpcCommand cmd) {
@@ -911,45 +878,14 @@ public class VirtualRoutingResource {
         return cfg;
     }
 
-    private GroupAnswer execute(SetPortForwardingRulesVpcCommand cmd) {
-        String[] results = new String[cmd.getRules().length];
-        int i = 0;
-
-        boolean endResult = true;
+    private Answer execute(SetPortForwardingRulesVpcCommand cmd) {
         List<ConfigItem> cfg = generateConfig(cmd);
-        for (ConfigItem c : cfg) {
-            ExecutionResult result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), c.getScript(), c.getArgs());
-
-            if (!result.isSuccess()) {
-                results[i++] = "Failed";
-                endResult = false;
-            } else {
-                results[i++] = null;
-            }
-        }
-        return new GroupAnswer(cmd, endResult, cmd.getRules().length, results);
+        return applyConfig(cmd, cfg);
     }
 
-    public GroupAnswer execute(IpAssocVpcCommand cmd) {
-        boolean finalResult = true;
-        String[] results = new String[cmd.getIpAddresses().length];
-        for (int i = 0; i < cmd.getIpAddresses().length; i ++) {
-            results[i] = "Failed";
-        }
-
-        int i = 0;
+    public Answer execute(IpAssocVpcCommand cmd) {
         List<ConfigItem> cfg = generateConfig(cmd);
-        for (ConfigItem c : cfg) {
-            ExecutionResult result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), c.getScript(), c.getArgs());
-            if (!result.isSuccess()) {
-                results[i++] = c.getInfo() + " failed: " + result.getDetails();
-                finalResult = false;
-                break;
-            }
-
-            results[i++] = c.getInfo() + " - success ";
-        }
-        return new GroupAnswer(cmd, finalResult, cmd.getIpAddresses().length, results);
+        return applyConfig(cmd, cfg);
     }
 
     protected List<ConfigItem> generateConfig(SetStaticRouteCommand cmd) {
@@ -969,22 +905,9 @@ public class VirtualRoutingResource {
         return cfg;
     }
 
-    private GroupAnswer execute(SetStaticRouteCommand cmd) {
-        int rulesCount = cmd.getStaticRoutes().length;
-        String[] results = new String[rulesCount];
-
+    private Answer execute(SetStaticRouteCommand cmd) {
         List<ConfigItem> cfg = generateConfig(cmd);
-        ConfigItem c = cfg.get(0);
-        final ExecutionResult result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), c.getScript(), c.getArgs());
-
-        if (!result.isSuccess()) {
-            for (int i = 0; i < results.length; i++) {
-                results[i] = "Failed";
-            }
-            return new GroupAnswer(cmd, false, rulesCount, results);
-        }
-
-        return new GroupAnswer(cmd, true, rulesCount, results);
+        return applyConfig(cmd, cfg);
     }
 
     protected List<ConfigItem> generateConfig(IpAssocCommand cmd) {
@@ -1067,25 +990,8 @@ public class VirtualRoutingResource {
     }
 
     public Answer execute(IpAssocCommand cmd) {
-        boolean finalResult = true;
-        String[] results = new String[cmd.getIpAddresses().length];
-        for (int i = 0; i < results.length; i++) {
-            results[i] = "Failed";
-        }
-
-        int i = 0;
         List<ConfigItem> cfg = generateConfig(cmd);
-        for (ConfigItem c : cfg) {
-            ExecutionResult result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), c.getScript(), c.getArgs());
-            if (result.isSuccess()) {
-                results[i++] = c.getInfo() + " - success";
-            } else {
-                results[i++] = c.getInfo() + " - failed:" + result.getDetails();
-                finalResult = false;
-                break;
-            }
-        }
-        return new GroupAnswer(cmd, finalResult, cmd.getIpAddresses().length, results);
+        return applyConfig(cmd, cfg);
     }
 
     public boolean configure(final String name, final Map<String, Object> params) throws ConfigurationException {


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

Posted by ya...@apache.org.
CLOUDSTACK-6047: Introduce VR resource unit test


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

Branch: refs/heads/master
Commit: 3bbbda887f182443c266a43e21cf2b6918acf08f
Parents: 711b308
Author: Sheng Yang <sh...@citrix.com>
Authored: Wed Feb 19 19:12:07 2014 -0800
Committer: Sheng Yang <sh...@citrix.com>
Committed: Wed Feb 19 19:47:20 2014 -0800

----------------------------------------------------------------------
 .../virtualnetwork/VirtualRoutingResource.java  |   8 +-
 .../VirtualRoutingResourceTest.java             | 783 +++++++++++++++++++
 2 files changed, 788 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3bbbda88/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 7845da0..48ff421 100755
--- a/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java
+++ b/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java
@@ -133,6 +133,8 @@ public class VirtualRoutingResource {
                 return new Answer(cmd, false, rc.getDetails());
             }
 
+            assert cmd.getRouterAccessIp() != null : "Why there is no access IP for VR?";
+
             if (cmd.isQuery()) {
                 return executeQueryCommand(cmd);
             }
@@ -421,7 +423,7 @@ public class VirtualRoutingResource {
 
         for (PortForwardingRuleTO rule : cmd.getRules()) {
             StringBuilder args = new StringBuilder();
-            args.append(rule.revoked() ? " -D " : " -A ");
+            args.append(rule.revoked() ? "-D" : "-A");
             args.append(" -P ").append(rule.getProtocol().toLowerCase());
             args.append(" -l ").append(rule.getSrcIp());
             args.append(" -p ").append(rule.getStringSrcPortRange());
@@ -812,7 +814,7 @@ public class VirtualRoutingResource {
 
         IpAddressTO pubIP = cmd.getIpAddress();
         String dev = "eth" + pubIP.getNicDevId();
-        String args = " -A ";
+        String args = "-A";
         args += " -l ";
         args += pubIP.getPublicIp();
         args += " -c ";
@@ -826,7 +828,7 @@ public class VirtualRoutingResource {
         LinkedList<ConfigItem> cfg = new LinkedList<>();
 
         for (PortForwardingRuleTO rule : cmd.getRules()) {
-            String args = rule.revoked() ? " -D" : " -A";
+            String args = rule.revoked() ? "-D" : "-A";
             args += " -P " + rule.getProtocol().toLowerCase();
             args += " -l " + rule.getSrcIp();
             args += " -p " + rule.getStringSrcPortRange();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3bbbda88/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
new file mode 100644
index 0000000..f961530
--- /dev/null
+++ b/core/test/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResourceTest.java
@@ -0,0 +1,783 @@
+// 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.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.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.GroupAnswer;
+import com.cloud.agent.api.routing.IpAliasTO;
+import com.cloud.agent.api.routing.IpAssocCommand;
+import com.cloud.agent.api.routing.IpAssocVpcCommand;
+import com.cloud.agent.api.routing.LoadBalancerConfigCommand;
+import com.cloud.agent.api.routing.NetworkElementCommand;
+import com.cloud.agent.api.routing.RemoteAccessVpnCfgCommand;
+import com.cloud.agent.api.routing.SavePasswordCommand;
+import com.cloud.agent.api.routing.SetFirewallRulesCommand;
+import com.cloud.agent.api.routing.SetMonitorServiceCommand;
+import com.cloud.agent.api.routing.SetNetworkACLCommand;
+import com.cloud.agent.api.routing.SetPortForwardingRulesCommand;
+import com.cloud.agent.api.routing.SetPortForwardingRulesVpcCommand;
+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.VmDataCommand;
+import com.cloud.agent.api.routing.VpnUsersCfgCommand;
+import com.cloud.agent.api.to.DhcpTO;
+import com.cloud.agent.api.to.FirewallRuleTO;
+import com.cloud.agent.api.to.IpAddressTO;
+import com.cloud.agent.api.to.LoadBalancerTO;
+import com.cloud.agent.api.to.MonitorServiceTO;
+import com.cloud.agent.api.to.NetworkACLTO;
+import com.cloud.agent.api.to.NicTO;
+import com.cloud.agent.api.to.PortForwardingRuleTO;
+import com.cloud.agent.resource.virtualnetwork.VirtualRoutingResource.VRScripts;
+import com.cloud.network.lb.LoadBalancingRule.LbDestination;
+import com.cloud.network.rules.FirewallRule.Purpose;
+import com.cloud.network.vpc.NetworkACLItem.TrafficType;
+import com.cloud.network.vpc.VpcGateway;
+import com.cloud.utils.ExecutionResult;
+import com.cloud.utils.net.NetUtils;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.test.context.support.AnnotationConfigContextLoader;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(loader = AnnotationConfigContextLoader.class)
+public class VirtualRoutingResourceTest implements VirtualRouterDeployer {
+    VirtualRoutingResource _resource;
+    NetworkElementCommand _currentCmd;
+    int _count;
+
+    String ROUTERIP = "10.2.3.4";
+
+    @Override
+    public ExecutionResult executeInVR(String routerIp, String script, String args) {
+        assertEquals(routerIp, ROUTERIP);
+        verifyCommand(_currentCmd, script, args);
+        return new ExecutionResult(true, null);
+    }
+
+    @Override
+    public ExecutionResult createFileInVR(String routerIp, String path, String filename, String content) {
+        assertEquals(routerIp, ROUTERIP);
+        verifyFile(_currentCmd, path, filename, content);
+        return new ExecutionResult(true, null);
+    }
+
+    @Override
+    public ExecutionResult prepareCommand(NetworkElementCommand cmd) {
+        cmd.setRouterAccessIp(ROUTERIP);
+        _currentCmd = cmd;
+        if (cmd instanceof IpAssocVpcCommand) {
+            return prepareNetworkElementCommand((IpAssocVpcCommand)cmd);
+        } else if (cmd instanceof IpAssocCommand) {
+            return prepareNetworkElementCommand((IpAssocCommand)cmd);
+        } else if (cmd instanceof SetupGuestNetworkCommand) {
+            return prepareNetworkElementCommand((SetupGuestNetworkCommand)cmd);
+        } else if (cmd instanceof SetSourceNatCommand) {
+            return prepareNetworkElementCommand((SetSourceNatCommand)cmd);
+        } else if (cmd instanceof SetNetworkACLCommand) {
+            return prepareNetworkElementCommand((SetNetworkACLCommand)cmd);
+        }
+        return new ExecutionResult(true, null);
+    }
+
+    @Override
+    public ExecutionResult cleanupCommand(NetworkElementCommand cmd) {
+        return new ExecutionResult(true, null);
+    }
+
+    @Before
+    public void setup() {
+        _resource = new VirtualRoutingResource(this);
+    }
+
+    protected void verifyCommand(NetworkElementCommand cmd, String script, String args) {
+        if (cmd instanceof SetPortForwardingRulesVpcCommand) {
+            verifyArgs((SetPortForwardingRulesVpcCommand) cmd, script, args);
+        } else if (cmd instanceof SetPortForwardingRulesCommand) {
+            verifyArgs((SetPortForwardingRulesCommand) cmd, script, args);
+        } else if (cmd instanceof SetStaticRouteCommand) {
+            verifyArgs((SetStaticRouteCommand) cmd, script, args);
+        } else if (cmd instanceof SetStaticNatRulesCommand) {
+            verifyArgs((SetStaticNatRulesCommand) cmd, script, args);
+        } else if (cmd instanceof LoadBalancerConfigCommand) {
+            verifyArgs((LoadBalancerConfigCommand) cmd, script, args);
+        } else if (cmd instanceof SavePasswordCommand) {
+            verifyArgs((SavePasswordCommand)cmd, script, args);
+        } else if (cmd instanceof DhcpEntryCommand) {
+            verifyArgs((DhcpEntryCommand)cmd, script, args);
+        } else if (cmd instanceof CreateIpAliasCommand) {
+            verifyArgs((CreateIpAliasCommand)cmd, script, args);
+        } else if (cmd instanceof DnsMasqConfigCommand) {
+            verifyArgs((DnsMasqConfigCommand)cmd, script, args);
+        } else if (cmd instanceof DeleteIpAliasCommand) {
+            verifyArgs((DeleteIpAliasCommand)cmd, script, args);
+        } else if (cmd instanceof VmDataCommand) {
+            verifyArgs((VmDataCommand)cmd, script, args);
+        } else if (cmd instanceof SetFirewallRulesCommand) {
+            verifyArgs((SetFirewallRulesCommand)cmd, script, args);
+        } else if (cmd instanceof BumpUpPriorityCommand) {
+            verifyArgs((BumpUpPriorityCommand)cmd, script, args);
+        } else if (cmd instanceof RemoteAccessVpnCfgCommand) {
+            verifyArgs((RemoteAccessVpnCfgCommand)cmd, script, args);
+        } else if (cmd instanceof VpnUsersCfgCommand) {
+            verifyArgs((VpnUsersCfgCommand)cmd, script, args);
+        } else if (cmd instanceof Site2SiteVpnCfgCommand) {
+            verifyArgs((Site2SiteVpnCfgCommand)cmd, script, args);
+        } else if (cmd instanceof SetMonitorServiceCommand) {
+            verifyArgs((SetMonitorServiceCommand)cmd, script, args);
+        } else if (cmd instanceof SetupGuestNetworkCommand) {
+            verifyArgs((SetupGuestNetworkCommand)cmd, script, args);
+        } else if (cmd instanceof SetNetworkACLCommand) {
+            verifyArgs((SetNetworkACLCommand)cmd, script, args);
+        } else if (cmd instanceof SetSourceNatCommand) {
+            verifyArgs((SetSourceNatCommand)cmd, script, args);
+        } else if (cmd instanceof IpAssocCommand) {
+            verifyArgs((IpAssocCommand)cmd, script, args);
+        }
+    }
+
+    private void verifyArgs(VpnUsersCfgCommand cmd, String script, String args) {
+        //To change body of created methods use File | Settings | File Templates.
+    }
+
+    private void verifyArgs(SetStaticRouteCommand cmd, String script, String args) {
+        //To change body of created methods use File | Settings | File Templates.
+    }
+
+    private void verifyArgs(SetStaticNatRulesCommand cmd, String script, String args) {
+        //To change body of created methods use File | Settings | File Templates.
+    }
+
+    @Test
+    public void testBumpUpCommand() {
+        BumpUpPriorityCommand cmd = new BumpUpPriorityCommand();
+        Answer answer = _resource.executeRequest(cmd);
+        assertTrue(answer.getResult());
+    }
+
+    private void verifyArgs(BumpUpPriorityCommand cmd, String script, String args) {
+        assertEquals(script, VRScripts.RVR_BUMPUP_PRI);
+        assertEquals(args, null);
+    }
+
+    @Test
+    public void testSetPortForwardingRulesVpcCommand() {
+        List<PortForwardingRuleTO> pfRules = new ArrayList<>();
+        pfRules.add(new PortForwardingRuleTO(1, "64.1.1.10", 22, 80, "10.10.1.10", 22, 80, "TCP", false, false));
+        pfRules.add(new PortForwardingRuleTO(2, "64.1.1.11", 8080, 8080, "10.10.1.11", 8080, 8080, "UDP", true, false));
+        SetPortForwardingRulesVpcCommand cmd = new SetPortForwardingRulesVpcCommand(pfRules);
+        assertEquals(cmd.getAnswersCount(), 2);
+
+        // Reset rule check count
+        _count = 0;
+
+        Answer answer = _resource.executeRequest(cmd);
+        assertTrue(answer instanceof GroupAnswer);
+        assertEquals(((GroupAnswer) answer).getResults().length, 2);
+        assertTrue(answer.getResult());
+    }
+
+    private void verifyArgs(SetPortForwardingRulesVpcCommand cmd, String script, String args) {
+        assertTrue(script.equals(VRScripts.VPC_PORTFORWARDING));
+        _count ++;
+        switch (_count) {
+            case 1:
+                assertEquals(args, "-A -P tcp -l 64.1.1.10 -p 22:80 -r 10.10.1.10 -d 22-80");
+                break;
+            case 2:
+                assertEquals(args, "-D -P udp -l 64.1.1.11 -p 8080:8080 -r 10.10.1.11 -d 8080-8080");
+                break;
+            default:
+                fail("Failed to recongize the match!");
+        }
+    }
+
+    @Test
+    public void testSetPortForwardingRulesCommand() {
+        List<PortForwardingRuleTO> pfRules = new ArrayList<>();
+        pfRules.add(new PortForwardingRuleTO(1, "64.1.1.10", 22, 80, "10.10.1.10", 22, 80, "TCP", false, false));
+        pfRules.add(new PortForwardingRuleTO(2, "64.1.1.11", 8080, 8080, "10.10.1.11", 8080, 8080, "UDP", true, false));
+        SetPortForwardingRulesCommand cmd = new SetPortForwardingRulesCommand(pfRules);
+        assertEquals(cmd.getAnswersCount(), 2);
+
+        // Reset rule check count
+        _count = 0;
+
+        Answer answer = _resource.executeRequest(cmd);
+        assertTrue(answer instanceof GroupAnswer);
+        assertEquals(((GroupAnswer) answer).getResults().length, 2);
+        assertTrue(answer.getResult());
+    }
+
+    private void verifyArgs(SetPortForwardingRulesCommand cmd, String script, String args) {
+        assertTrue(script.equals(VRScripts.FIREWALL_NAT));
+        _count ++;
+        switch (_count) {
+            case 1:
+                assertEquals(args, "-A -P tcp -l 64.1.1.10 -p 22:80 -r 10.10.1.10 -d 22:80");
+                break;
+            case 2:
+                assertEquals(args, "-D -P udp -l 64.1.1.11 -p 8080:8080 -r 10.10.1.11 -d 8080:8080");
+                break;
+            default:
+                fail("Failed to recongize the match!");
+        }
+    }
+
+    @Test
+    public void testIpAssocCommand() {
+        List<IpAddressTO> ips = new ArrayList<IpAddressTO>();
+        ips.add(new IpAddressTO(1, "64.1.1.10", true, true, true, "vlan://64", "64.1.1.1", "255.255.255.0", "01:23:45:67:89:AB", 1000, false));
+        ips.add(new IpAddressTO(2, "64.1.1.11", false, false, false, "vlan://64", "64.1.1.1", "255.255.255.0", "01:23:45:67:89:AB", 1000, false));
+        ips.add(new IpAddressTO(3, "65.1.1.11", true, false, false, "vlan://65", "65.1.1.1", "255.255.255.0", "11:23:45:67:89:AB", 1000, false));
+        IpAddressTO[] ipArray = ips.toArray(new IpAddressTO[ips.size()]);
+        IpAssocCommand cmd = new IpAssocCommand(ipArray);
+        assertEquals(cmd.getAnswersCount(), 3);
+
+        _count = 0;
+
+        Answer answer = _resource.executeRequest(cmd);
+        assertTrue(answer instanceof GroupAnswer);
+        assertEquals(((GroupAnswer) answer).getResults().length, 3);
+        assertTrue(answer.getResult());
+
+    }
+
+    private ExecutionResult prepareNetworkElementCommand(IpAssocCommand cmd) {
+        IpAddressTO[] ips = cmd.getIpAddresses();
+        for (IpAddressTO ip : ips) {
+            ip.setNicDevId(2);
+        }
+        return new ExecutionResult(true, null);
+    }
+
+    @Test
+    public void testIpAssocVpcCommand() {
+        List<IpAddressTO> ips = new ArrayList<IpAddressTO>();
+        ips.add(new IpAddressTO(1, "64.1.1.10", true, true, true, "vlan://64", "64.1.1.1", "255.255.255.0", "01:23:45:67:89:AB", 1000, false));
+        ips.add(new IpAddressTO(2, "64.1.1.11", false, false, true, "vlan://64", "64.1.1.1", "255.255.255.0", "01:23:45:67:89:AB", 1000, false));
+        ips.add(new IpAddressTO(3, "65.1.1.11", true, false, false, "vlan://65", "65.1.1.1", "255.255.255.0", "11:23:45:67:89:AB", 1000, false));
+        IpAddressTO[] ipArray = ips.toArray(new IpAddressTO[ips.size()]);
+        IpAssocVpcCommand cmd = new IpAssocVpcCommand(ipArray);
+        assertEquals(cmd.getAnswersCount(), 6);
+
+        _count = 0;
+
+        Answer answer = _resource.executeRequest(cmd);
+        assertTrue(answer instanceof GroupAnswer);
+        assertEquals(((GroupAnswer) answer).getResults().length, 6);
+        assertTrue(answer.getResult());
+
+    }
+
+    private ExecutionResult prepareNetworkElementCommand(IpAssocVpcCommand cmd) {
+        IpAddressTO[] ips = cmd.getIpAddresses();
+        for (IpAddressTO ip : ips) {
+            ip.setNicDevId(2);
+        }
+        return new ExecutionResult(true, null);
+    }
+
+    private void verifyArgs(IpAssocCommand cmd, String script, String args) {
+        if (cmd instanceof IpAssocVpcCommand) {
+            _count ++;
+            switch (_count) {
+                case 1:
+                    assertEquals(script, VRScripts.VPC_IPASSOC);
+                    assertEquals(args, " -A  -l 64.1.1.10 -c eth2 -g 64.1.1.1 -m 24 -n 64.1.1.0");
+                    break;
+                case 2:
+                    assertEquals(script, VRScripts.VPC_PRIVATEGW);
+                    assertEquals(args, " -A  -l 64.1.1.10 -c eth2");
+                    break;
+                case 3:
+                    assertEquals(script, VRScripts.VPC_IPASSOC);
+                    assertEquals(args, " -D  -l 64.1.1.11 -c eth2 -g 64.1.1.1 -m 24 -n 64.1.1.0");
+                    break;
+                case 4:
+                    assertEquals(script, VRScripts.VPC_PRIVATEGW);
+                    assertEquals(args, " -D  -l 64.1.1.11 -c eth2");
+                    break;
+                case 5:
+                    assertEquals(script, VRScripts.VPC_IPASSOC);
+                    assertEquals(args, " -A  -l 65.1.1.11 -c eth2 -g 65.1.1.1 -m 24 -n 65.1.1.0");
+                    break;
+                default:
+                    fail("Failed to recongize the match!");
+            }
+        } else {
+            assertEquals(script, VRScripts.IPASSOC);
+            _count ++;
+            switch (_count) {
+                case 1:
+                    assertEquals(args, "-A -s -f -l 64.1.1.10/24 -c eth2 -g 64.1.1.1");
+                    break;
+                case 2:
+                    assertEquals(args, "-D -l 64.1.1.11/24 -c eth2 -g 64.1.1.1");
+                    break;
+                case 3:
+                    assertEquals(args, "-A -l 65.1.1.11/24 -c eth2 -g 65.1.1.1");
+                    break;
+                default:
+                    fail("Failed to recongize the match!");
+            }
+        }
+    }
+
+    @Test
+    public void testSourceNatCommand() {
+        IpAddressTO ip = new IpAddressTO(1, "64.1.1.10", true, true, true, "vlan://64", "64.1.1.1", "255.255.255.0", "01:23:45:67:89:AB", 1000, false);
+        SetSourceNatCommand cmd = new SetSourceNatCommand(ip, true);
+        Answer answer = _resource.executeRequest(cmd);
+        assertTrue(answer.getResult());
+    }
+
+    private ExecutionResult prepareNetworkElementCommand(SetSourceNatCommand cmd) {
+        IpAddressTO ip = cmd.getIpAddress();
+        ip.setNicDevId(1);
+        return new ExecutionResult(true, null);
+    }
+
+    private void verifyArgs(SetSourceNatCommand cmd, String script, String args) {
+        assertEquals(script, VRScripts.VPC_SOURCE_NAT);
+        assertEquals(args, "-A -l 64.1.1.10 -c eth1");
+    }
+
+    @Test
+    public void testNetworkACLCommand() {
+        List<NetworkACLTO> acls = new ArrayList<>();
+        List<String> cidrs = new ArrayList<>();
+        cidrs.add("192.168.0.1/24");
+        cidrs.add("192.168.0.2/24");
+        acls.add(new NetworkACLTO(1, "64", "TCP", 20, 80, false, false, cidrs, 0, 0, TrafficType.Ingress, true, 1));
+        acls.add(new NetworkACLTO(2, "64", "ICMP", 0, 0, false, false, cidrs, -1, -1, TrafficType.Ingress, false, 2));
+        acls.add(new NetworkACLTO(3, "65", "ALL", 0, 0, false, false, cidrs, -1, -1, TrafficType.Egress, true, 3));
+        NicTO nic = new NicTO();
+        nic.setMac("01:23:45:67:89:AB");
+        nic.setIp("192.168.1.1");
+        nic.setNetmask("255.255.255.0");
+
+        _count = 0;
+
+        SetNetworkACLCommand cmd = new SetNetworkACLCommand(acls, nic);
+        Answer answer = _resource.executeRequest(cmd);
+        assertTrue(answer.getResult());
+
+        cmd.setAccessDetail(NetworkElementCommand.VPC_PRIVATE_GATEWAY, String.valueOf(VpcGateway.Type.Private));
+        answer = _resource.executeRequest(cmd);
+        assertTrue(answer.getResult());
+    }
+
+    private void verifyArgs(SetNetworkACLCommand cmd, String script, String args) {
+        _count ++;
+        switch (_count) {
+            case 1:
+                assertEquals(script, VRScripts.VPC_ACL);
+                assertEquals(args, " -d eth3 -M 01:23:45:67:89:AB -i 192.168.1.1 -m 24 -a Egress:ALL:0:0:192.168.0.1/24-192.168.0.2/24:ACCEPT:," +
+                        "Ingress:ICMP:0:0:192.168.0.1/24-192.168.0.2/24:DROP:,Ingress:TCP:20:80:192.168.0.1/24-192.168.0.2/24:ACCEPT:,");
+                break;
+            case 2:
+                assertEquals(script, VRScripts.VPC_PRIVATEGW_ACL);
+                assertEquals(args, " -d eth3 -M 01:23:45:67:89:AB -a Egress:ALL:0:0:192.168.0.1/24-192.168.0.2/24:ACCEPT:," +
+                        "Ingress:ICMP:0:0:192.168.0.1/24-192.168.0.2/24:DROP:,Ingress:TCP:20:80:192.168.0.1/24-192.168.0.2/24:ACCEPT:,");
+                break;
+            default:
+                fail();
+        }
+    }
+
+    private ExecutionResult prepareNetworkElementCommand(SetNetworkACLCommand cmd) {
+        NicTO nic = cmd.getNic();
+        nic.setDeviceId(3);
+        return new ExecutionResult(true, null);
+    }
+
+    @Test
+    public void testSetupGuestNetworkCommand() {
+        NicTO nic = new NicTO();
+        nic.setMac("01:23:45:67:89:AB");
+        nic.setIp("10.1.1.1");
+        nic.setNetmask("255.255.255.0");
+
+        SetupGuestNetworkCommand cmd = new SetupGuestNetworkCommand("10.1.1.10-10.1.1.20", "cloud.test", false, 0, "8.8.8.8", "8.8.4.4", true, nic);
+        cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, "10.1.1.2");
+        cmd.setAccessDetail(NetworkElementCommand.GUEST_NETWORK_GATEWAY, "10.1.1.1");
+
+        Answer answer = _resource.executeRequest(cmd);
+        assertTrue(answer.getResult());
+
+    }
+
+    private ExecutionResult prepareNetworkElementCommand(SetupGuestNetworkCommand cmd) {
+        NicTO nic = cmd.getNic();
+        nic.setDeviceId(4);
+        return new ExecutionResult(true, null);
+    }
+
+    private void verifyArgs(SetupGuestNetworkCommand cmd, String script, String args) {
+        assertEquals(script, VRScripts.VPC_GUEST_NETWORK);
+        assertEquals(args, " -C -M 01:23:45:67:89:AB -d eth4 -i 10.1.1.2 -g 10.1.1.1 -m 24 -n 10.1.1.0 -s 8.8.8.8,8.8.4.4 -e cloud.test");
+    }
+
+    @Test
+    public void testSetMonitorServiceCommand() {
+        List<MonitorServiceTO> services = new ArrayList<>();
+        services.add(new MonitorServiceTO("service", "process", "name", "path", "file", true));
+        services.add(new MonitorServiceTO("service_2", "process_2", "name_2", "path_2", "file_2", false));
+
+        SetMonitorServiceCommand cmd = new SetMonitorServiceCommand(services);
+        Answer answer = _resource.executeRequest(cmd);
+        assertTrue(answer.getResult());
+    }
+
+    private void verifyArgs(SetMonitorServiceCommand cmd, String script, String args) {
+        assertEquals(script, VRScripts.MONITOR_SERVICE);
+        assertEquals(args, " -c [service]:processname=process:servicename=name:pidfile=file:,[service_2]:processname=process_2:servicename=name_2:pidfile=file_2:,");
+    }
+
+    @Test
+    public void testSite2SiteVpnCfgCommand() {
+        _count = 0;
+
+        Site2SiteVpnCfgCommand cmd = new Site2SiteVpnCfgCommand(true, "64.10.1.10", "64.10.1.1", "192.168.1.1/16", "124.10.1.10", "192.168.100.1/24", "3des-sha1,aes128-sha1;modp1536", "3des-sha1,aes128-md5", "psk", Long.valueOf(1800), Long.valueOf(1800), true, false);
+        Answer answer = _resource.executeRequest(cmd);
+        assertTrue(answer.getResult());
+
+        cmd = new Site2SiteVpnCfgCommand(true, "64.10.1.10", "64.10.1.1", "192.168.1.1/16", "124.10.1.10", "192.168.100.1/24", "3des-sha1,aes128-sha1;modp1536", "3des-sha1,aes128-md5", "psk", Long.valueOf(1800), Long.valueOf(1800), false, true);
+        answer = _resource.executeRequest(cmd);
+        assertTrue(answer.getResult());
+
+        cmd = new Site2SiteVpnCfgCommand(false, "64.10.1.10", "64.10.1.1", "192.168.1.1/16", "124.10.1.10", "192.168.100.1/24", "3des-sha1,aes128-sha1;modp1536", "3des-sha1,aes128-md5", "psk", Long.valueOf(1800), Long.valueOf(1800), false, true);
+        answer = _resource.executeRequest(cmd);
+        assertTrue(answer.getResult());
+    }
+
+    private void verifyArgs(Site2SiteVpnCfgCommand cmd, String script, String args) {
+        _count ++;
+
+        assertEquals(script, VRScripts.S2SVPN_IPSEC);
+        switch (_count) {
+            case 1:
+                assertEquals(args, "-A -l 64.10.1.10 -n 192.168.1.1/16 -g 64.10.1.1 -r 124.10.1.10 -N 192.168.100.1/24 -e \"3des-sha1,aes128-md5\" -i \"3des-sha1,aes128-sha1;modp1536\" -t 1800 -T 1800 -s \"psk\" -d 1");
+                break;
+            case 2:
+                assertEquals(args, "-A -l 64.10.1.10 -n 192.168.1.1/16 -g 64.10.1.1 -r 124.10.1.10 -N 192.168.100.1/24 -e \"3des-sha1,aes128-md5\" -i \"3des-sha1,aes128-sha1;modp1536\" -t 1800 -T 1800 -s \"psk\" -d 0 -p ");
+                break;
+            case 3:
+                assertEquals(args, "-D -r 124.10.1.10 -n 192.168.1.1/16 -N 192.168.100.1/24");
+                break;
+            default:
+                fail();
+        }
+    }
+
+    @Test
+    public void testRemoteAccessVpnCfgCommand() {
+        _count = 0;
+
+        RemoteAccessVpnCfgCommand cmd = new RemoteAccessVpnCfgCommand(true, "124.10.10.10", "10.10.1.1", "10.10.1.10-10.10.1.20", "sharedkey", false);
+        cmd.setLocalCidr("10.1.1.1/24");
+        Answer answer = _resource.executeRequest(cmd);
+        assertTrue(answer.getResult());
+
+        cmd = new RemoteAccessVpnCfgCommand(false, "124.10.10.10", "10.10.1.1", "10.10.1.10-10.10.1.20", "sharedkey", false);
+        cmd.setLocalCidr("10.1.1.1/24");
+        answer = _resource.executeRequest(cmd);
+        assertTrue(answer.getResult());
+
+        cmd = new RemoteAccessVpnCfgCommand(true, "124.10.10.10", "10.10.1.1", "10.10.1.10-10.10.1.20", "sharedkey", true);
+        cmd.setLocalCidr("10.1.1.1/24");
+        answer = _resource.executeRequest(cmd);
+        assertTrue(answer.getResult());
+    }
+
+    private void verifyArgs(RemoteAccessVpnCfgCommand cmd, String script, String args) {
+        _count ++;
+
+        assertEquals(script, VRScripts.VPN_L2TP);
+        switch (_count) {
+            case 1:
+                assertEquals(args, "-r 10.10.1.10-10.10.1.20 -p sharedkey -s 124.10.10.10 -l 10.10.1.1 -c  -C 10.1.1.1/24 -i eth2");
+                break;
+            case 2:
+                assertEquals(args, "-d  -s 124.10.10.10 -C 10.1.1.1/24 -i eth2");
+                break;
+            case 3:
+                assertEquals(args, "-r 10.10.1.10-10.10.1.20 -p sharedkey -s 124.10.10.10 -l 10.10.1.1 -c  -C 10.1.1.1/24 -i eth1");
+                break;
+            default:
+                fail();
+
+        }
+    }
+
+    @Test
+    public void testFirewallRulesCommand() {
+        _count = 0;
+
+        List<FirewallRuleTO> rules = new ArrayList<>();
+        List<String> sourceCidrs = new ArrayList<>();
+        sourceCidrs.add("10.10.1.1/24");
+        sourceCidrs.add("10.10.1.2/24");
+        rules.add(new FirewallRuleTO(1, "64.10.10.10", "TCP", 22, 80, false, false, Purpose.Firewall, sourceCidrs, 0, 0));
+        rules.add(new FirewallRuleTO(2, "64.10.10.10", "ICMP", 0, 0, false, false, Purpose.Firewall, sourceCidrs, -1, -1));
+        rules.add(new FirewallRuleTO(3, "64.10.10.10", "ICMP", 0, 0, true, true, Purpose.Firewall, sourceCidrs, -1, -1));
+        SetFirewallRulesCommand cmd = new SetFirewallRulesCommand(rules);
+        Answer answer = _resource.executeRequest(cmd);
+        assertTrue(answer.getResult());
+        assertTrue(answer instanceof GroupAnswer);
+        assertEquals(((GroupAnswer) answer).getResults().length, 3);
+
+        //TODO Didn't test egress rule because not able to generate FirewallRuleVO object
+    }
+
+    private void verifyArgs(SetFirewallRulesCommand cmd, String script, String args) {
+        assertEquals(script, VRScripts.FIREWALL_INGRESS);
+        assertEquals(args, " -F -a 64.10.10.10:ICMP:0:0:10.10.1.1/24-10.10.1.2/24:,64.10.10.10:TCP:22:80:10.10.1.1/24-10.10.1.2/24:,64.10.10.10:reverted:0:0:0:,");
+    }
+
+    @Test
+    public void testVmDataCommand() {
+        VmDataCommand cmd = new VmDataCommand("10.1.10.4", "i-4-VM", true);
+        cmd.addVmData("userdata", "user-data", "user-data");
+        cmd.addVmData("metadata", "service-offering", "serviceOffering");
+        cmd.addVmData("metadata", "availability-zone", "zoneName");
+        cmd.addVmData("metadata", "local-ipv4", "10.1.10.4");
+        cmd.addVmData("metadata", "local-hostname", "test-vm");
+        cmd.addVmData("metadata", "public-ipv4", "110.1.10.4");
+        cmd.addVmData("metadata", "public-hostname", "hostname");
+        cmd.addVmData("metadata", "instance-id", "i-4-VM");
+        cmd.addVmData("metadata", "vm-id", "4");
+        cmd.addVmData("metadata", "public-keys", "publickey");
+        cmd.addVmData("metadata", "cloud-identifier", "CloudStack-{test}");
+
+        Answer answer = _resource.executeRequest(cmd);
+        assertTrue(answer.getResult());
+    }
+
+    private void verifyArgs(VmDataCommand cmd, String script, String args) {
+        assertEquals(script, VRScripts.VMDATA);
+        assertEquals(args, "-d eyIxMC4xLjEwLjQiOltbInVzZXJkYXRhIiwidXNlci1kYXRhIiwidXNlci1kYXRhIl0sWyJtZXRhZGF0YSIsInN" +
+                "lcnZpY2Utb2ZmZXJpbmciLCJzZXJ2aWNlT2ZmZXJpbmciXSxbIm1ldGFkYXRhIiwiYXZhaWxhYmlsaXR5LXpvbmUiLCJ6b25lTmFt" +
+                "ZSJdLFsibWV0YWRhdGEiLCJsb2NhbC1pcHY0IiwiMTAuMS4xMC40Il0sWyJtZXRhZGF0YSIsImxvY2FsLWhvc3RuYW1lIiwidGVzd" +
+                "C12bSJdLFsibWV0YWRhdGEiLCJwdWJsaWMtaXB2NCIsIjExMC4xLjEwLjQiXSxbIm1ldGFkYXRhIiwicHVibGljLWhvc3RuYW1lIi" +
+                "wiaG9zdG5hbWUiXSxbIm1ldGFkYXRhIiwiaW5zdGFuY2UtaWQiLCJpLTQtVk0iXSxbIm1ldGFkYXRhIiwidm0taWQiLCI0Il0sWyJ" +
+                "tZXRhZGF0YSIsInB1YmxpYy1rZXlzIiwicHVibGlja2V5Il0sWyJtZXRhZGF0YSIsImNsb3VkLWlkZW50aWZpZXIiLCJDbG91ZFN0YWNrLXt0ZXN0fSJdXX0=");
+    }
+
+    @Test
+    public void testSavePasswordCommand() {
+        SavePasswordCommand cmd = new SavePasswordCommand("123pass", "10.1.10.4", "i-4-VM", true);
+        Answer answer = _resource.executeRequest(cmd);
+        assertTrue(answer.getResult());
+    }
+
+    private void verifyArgs(SavePasswordCommand cmd, String script, String args) {
+        assertEquals(script, VRScripts.PASSWORD);
+        assertEquals(args, "-v 10.1.10.4 -p 123pass");
+    }
+
+    @Test
+    public void testDhcpEntryCommand() {
+        _count = 0;
+        DhcpEntryCommand cmd = new DhcpEntryCommand("12:34:56:78:90:AB", "10.1.10.2", "vm1", null, true);
+        Answer answer = _resource.executeRequest(cmd);
+        assertTrue(answer.getResult());
+
+        cmd = new DhcpEntryCommand("12:34:56:78:90:AB", null, "vm1", "2001:db8:0:0:0:ff00:42:8329", true);
+        cmd.setDuid(NetUtils.getDuidLL(cmd.getVmMac()));
+        answer = _resource.executeRequest(cmd);
+        assertTrue(answer.getResult());
+
+        cmd = new DhcpEntryCommand("12:34:56:78:90:AB", "10.1.10.2", "vm1", "2001:db8:0:0:0:ff00:42:8329", true);
+        cmd.setDuid(NetUtils.getDuidLL(cmd.getVmMac()));
+        answer = _resource.executeRequest(cmd);
+        assertTrue(answer.getResult());
+    }
+
+    private void verifyArgs(DhcpEntryCommand cmd, String script, String args) {
+        _count ++;
+        assertEquals(script, VRScripts.DHCP);
+        switch (_count) {
+            case 1:
+                assertEquals(args, " -m 12:34:56:78:90:AB -4 10.1.10.2 -h vm1");
+                break;
+            case 2:
+                assertEquals(args, " -m 12:34:56:78:90:AB -h vm1 -6 2001:db8:0:0:0:ff00:42:8329 -u 00:03:00:01:12:34:56:78:90:AB");
+                break;
+            case 3:
+                assertEquals(args, " -m 12:34:56:78:90:AB -4 10.1.10.2 -h vm1 -6 2001:db8:0:0:0:ff00:42:8329 -u 00:03:00:01:12:34:56:78:90:AB");
+                break;
+            default:
+                fail();
+        }
+    }
+
+    @Test
+    public void testCreateIpAliasCommand() {
+        List<IpAliasTO> aliases = new ArrayList<>();
+        aliases.add(new IpAliasTO("169.254.3.10", "255.255.255.0", "1"));
+        aliases.add(new IpAliasTO("169.254.3.11", "255.255.255.0", "2"));
+        aliases.add(new IpAliasTO("169.254.3.12", "255.255.255.0", "3"));
+        CreateIpAliasCommand cmd = new CreateIpAliasCommand("169.254.3.10", aliases);
+        Answer answer = _resource.executeRequest(cmd);
+        assertTrue(answer.getResult());
+    }
+
+    private void verifyArgs(CreateIpAliasCommand cmd, String script, String args) {
+        assertEquals(script, VRScripts.IPALIAS_CREATE);
+        assertEquals(args, "1:169.254.3.10:255.255.255.0-2:169.254.3.11:255.255.255.0-3:169.254.3.12:255.255.255.0-");
+    }
+
+    @Test
+    public void testDeleteIpAliasCommand() {
+        List<IpAliasTO> aliases = new ArrayList<>();
+        aliases.add(new IpAliasTO("169.254.3.10", "255.255.255.0", "1"));
+        aliases.add(new IpAliasTO("169.254.3.11", "255.255.255.0", "2"));
+        aliases.add(new IpAliasTO("169.254.3.12", "255.255.255.0", "3"));
+        DeleteIpAliasCommand cmd = new DeleteIpAliasCommand("169.254.10.1", aliases, aliases);
+        Answer answer = _resource.executeRequest(cmd);
+        assertTrue(answer.getResult());
+    }
+
+    private void verifyArgs(DeleteIpAliasCommand cmd, String script, String args) {
+        assertEquals(script, VRScripts.IPALIAS_DELETE);
+        assertEquals(args, "1:169.254.3.10:255.255.255.0-2:169.254.3.11:255.255.255.0-3:169.254.3.12:255.255.255.0-- 1:169.254.3.10:255.255.255.0-2:169.254.3.11:255.255.255.0-3:169.254.3.12:255.255.255.0-");
+    }
+
+    @Test
+    public void testDnsMasqConfigCommand() {
+        List<DhcpTO> dhcps = new ArrayList<DhcpTO>();
+        dhcps.add(new DhcpTO("10.1.20.2", "10.1.20.1", "255.255.255.0", "10.1.20.5"));
+        dhcps.add(new DhcpTO("10.1.21.2", "10.1.21.1", "255.255.255.0", "10.1.21.5"));
+        DnsMasqConfigCommand cmd = new DnsMasqConfigCommand(dhcps);
+        Answer answer = _resource.executeRequest(cmd);
+        assertTrue(answer.getResult());
+    }
+
+    private void verifyArgs(DnsMasqConfigCommand cmd, String script, String args) {
+        assertEquals(script, VRScripts.DNSMASQ_CONFIG);
+        assertEquals(args, "10.1.20.2:10.1.20.1:255.255.255.0:10.1.20.5-10.1.21.2:10.1.21.1:255.255.255.0:10.1.21.5-");
+    }
+
+    @Test
+    public void testLoadBalancerConfigCommand() {
+        _count = 0;
+
+        List<LoadBalancerTO> lbs = new ArrayList<>();
+        List<LbDestination> dests = new ArrayList<>();
+        dests.add(new LbDestination(22, 80, "10.1.10.2", false));
+        dests.add(new LbDestination(22, 80, "10.1.10.2", true));
+        lbs.add(new LoadBalancerTO(UUID.randomUUID().toString(), "64.10.1.10", 80, "tcp", "algo", false, false, false, dests));
+        LoadBalancerTO[] arrayLbs = new LoadBalancerTO[lbs.size()];
+        lbs.toArray(arrayLbs);
+        NicTO nic = new NicTO();
+        LoadBalancerConfigCommand cmd = new LoadBalancerConfigCommand(arrayLbs, "64.10.2.10", "10.1.10.2", "192.168.1.2", nic, null, "1000", true);
+        Answer answer = _resource.executeRequest(cmd);
+        assertTrue(answer.getResult());
+
+        cmd = new LoadBalancerConfigCommand(arrayLbs, "64.10.2.10", "10.1.10.2", "192.168.1.2", nic, Long.valueOf(1), "1000", true);
+        answer = _resource.executeRequest(cmd);
+        assertTrue(answer.getResult());
+    }
+
+    private void verifyFile(NetworkElementCommand cmd, String path, String filename, String content) {
+        if (!(cmd instanceof LoadBalancerConfigCommand)) {
+            fail("Only LB command would call this!");
+        }
+        _count ++;
+        switch (_count) {
+            case 1:
+            case 3:
+                assertEquals(path, "/etc/haproxy/");
+                assertEquals(filename, "haproxy.cfg.new");
+                assertEquals(content, "global\n" +
+                        "\tlog 127.0.0.1:3914   local0 warning\n" +
+                        "\tmaxconn 1000\n" +
+                        "\tmaxpipes 250\n" +
+                        "\tchroot /var/lib/haproxy\n" +
+                        "\tuser haproxy\n" +
+                        "\tgroup haproxy\n" +
+                        "\tdaemon\n" +
+                        "\t \n" +
+                        "defaults\n" +
+                        "\tlog     global\n" +
+                        "\tmode    tcp\n" +
+                        "\toption  dontlognull\n" +
+                        "\tretries 3\n" +
+                        "\toption redispatch\n" +
+                        "\t#no option set here :<\n" +
+                        "\tno option forceclose\n" +
+                        "\ttimeout connect    5000\n" +
+                        "\ttimeout client     50000\n" +
+                        "\ttimeout server     50000\n" +
+                        "\n" +
+                        "listen stats_on_guest 10.1.10.2:8081\n" +
+                        "\tstats enable\n" +
+                        "\tstats uri     /admin?stats\n" +
+                        "\tstats realm   Haproxy\\ Statistics\n" +
+                        "\tstats auth    admin1:AdMiN123\n" +
+                        "\n" +
+                        "\t \n" +
+                        "listen 64_10_1_10-80 64.10.1.10:80\n" +
+                        "\tbalance algo\n" +
+                        "\tserver 64_10_1_10-80_0 10.1.10.2:22 check\n" +
+                        "\t \n" +
+                        "\t \n");
+                break;
+            default:
+                fail();
+        }
+    }
+
+    private void verifyArgs(LoadBalancerConfigCommand cmd, String script, String args) {
+        _count ++;
+        switch (_count) {
+            case 2:
+                assertEquals(script, VRScripts.LB);
+                assertEquals(args, " -i null -a 64.10.1.10:80:, -s 10.1.10.2:8081:0/0:,,");
+                break;
+            case 4:
+                assertEquals(script, VRScripts.VPC_LB);
+                assertEquals(args, " -i null -a 64.10.1.10:80:, -s 10.1.10.2:8081:0/0:,,");
+                break;
+            default:
+                fail();
+        }
+    }
+
+}
+


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

Posted by ya...@apache.org.
CLOUDSTACK-6047: Separate VR command generation and execution


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

Branch: refs/heads/master
Commit: 8fccb8c077c7f228521628edb40313ae0c160af8
Parents: 5332f67
Author: Sheng Yang <sh...@citrix.com>
Authored: Wed Feb 19 19:12:06 2014 -0800
Committer: Sheng Yang <sh...@citrix.com>
Committed: Wed Feb 19 19:46:55 2014 -0800

----------------------------------------------------------------------
 .../virtualnetwork/VirtualRoutingResource.java  | 686 ++++++++++++-------
 1 file changed, 449 insertions(+), 237 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8fccb8c0/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 2ac6f4f..d51e8bb 100755
--- a/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java
+++ b/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java
@@ -74,6 +74,7 @@ import java.io.IOException;
 import java.net.InetSocketAddress;
 import java.nio.channels.SocketChannel;
 import java.util.HashMap;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 
@@ -200,7 +201,43 @@ public class VirtualRoutingResource {
         }
     }
 
-    private Answer execute(VpnUsersCfgCommand cmd) {
+    protected class ConfigItem {
+        private String script;
+        private String args;
+        private String info;
+
+        public ConfigItem(String script, String args) {
+            this.script = script;
+            this.args = args;
+        }
+
+        public String getScript() {
+            return script;
+        }
+
+        public void setScript(String script) {
+            this.script = script;
+        }
+
+        public String getArgs() {
+            return args;
+        }
+
+        public void setArgs(String args) {
+            this.args = args;
+        }
+
+        public String getInfo() {
+            return info;
+        }
+
+        public void setInfo(String info) {
+            this.info = info;
+        }
+    }
+
+    private List<ConfigItem> generateConfig(VpnUsersCfgCommand cmd) {
+        LinkedList<ConfigItem> cfg = new LinkedList<>();
         for (VpnUsersCfgCommand.UsernamePassword userpwd : cmd.getUserpwds()) {
             String args = "";
             if (!userpwd.isAdd()) {
@@ -210,15 +247,24 @@ public class VirtualRoutingResource {
                 args += "-u ";
                 args += userpwd.getUsernamePassword();
             }
-            ExecutionResult result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), VRScripts.VPN_L2TP, args);
+            cfg.add(new ConfigItem(VRScripts.VPN_L2TP, args));
+        }
+        return cfg;
+    }
+
+    private Answer execute(VpnUsersCfgCommand cmd) {
+        List<ConfigItem> cfg = generateConfig(cmd);
+        for (ConfigItem c : cfg) {
+            ExecutionResult result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), c.getScript(), c.getArgs());
             if (!result.isSuccess()) {
-                return new Answer(cmd, false, "Configure VPN user failed for user " + userpwd.getUsername() + ":" + result.getDetails());
+                return new Answer(cmd, false, "Configure VPN user failed: " + result.getDetails());
             }
         }
         return new Answer(cmd);
     }
 
-    private Answer execute(RemoteAccessVpnCfgCommand cmd) {
+    private List<ConfigItem> generateConfig(RemoteAccessVpnCfgCommand cmd) {
+        LinkedList<ConfigItem> cfg = new LinkedList<>();
         String args = "";
         if (cmd.isCreate()) {
             args += "-r ";
@@ -237,18 +283,21 @@ public class VirtualRoutingResource {
         }
         args += " -C " + cmd.getLocalCidr();
         args += " -i " + cmd.getPublicInterface();
-        ExecutionResult result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), VRScripts.VPN_L2TP, args);
+        cfg.add(new ConfigItem(VRScripts.VPN_L2TP, args));
+        return cfg;
+    }
+
+    private Answer execute(RemoteAccessVpnCfgCommand cmd) {
+        List<ConfigItem> cfg = generateConfig(cmd);
+        ConfigItem c = cfg.get(0);
+        ExecutionResult result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), c.getScript(), c.getArgs());
         return new Answer(cmd, result.isSuccess(), result.getDetails());
     }
 
-    private Answer execute(SetFirewallRulesCommand cmd) {
-        String[] results = new String[cmd.getRules().length];
-        String routerAccessIp = cmd.getRouterAccessIp();
-        String egressDefault = cmd.getAccessDetail(NetworkElementCommand.FIREWALL_EGRESS_DEFAULT);
+    private List<ConfigItem> generateConfig(SetFirewallRulesCommand cmd) {
+        LinkedList<ConfigItem> cfg = new LinkedList<>();
 
-        if (routerAccessIp == null) {
-            return new SetFirewallRulesAnswer(cmd, false, results);
-        }
+        String egressDefault = cmd.getAccessDetail(NetworkElementCommand.FIREWALL_EGRESS_DEFAULT);
 
         FirewallRuleTO[] allrules = cmd.getRules();
         FirewallRule.TrafficType trafficType = allrules[0].getTrafficType();
@@ -276,14 +325,27 @@ public class VirtualRoutingResource {
             args += " -a " + sb.toString();
         }
 
-        ExecutionResult result;
-
         if (trafficType == FirewallRule.TrafficType.Egress) {
-            result = _vrDeployer.executeInVR(routerAccessIp, VRScripts.FIREWALL_EGRESS, args);
+            cfg.add(new ConfigItem(VRScripts.FIREWALL_EGRESS, args));
         } else {
-            result = _vrDeployer.executeInVR(routerAccessIp, VRScripts.FIREWALL_INGRESS, args);
+            cfg.add(new ConfigItem(VRScripts.FIREWALL_INGRESS, args));
         }
 
+        return cfg;
+    }
+
+    private Answer execute(SetFirewallRulesCommand cmd) {
+        String[] results = new String[cmd.getRules().length];
+        String routerAccessIp = cmd.getRouterAccessIp();
+
+        if (routerAccessIp == null) {
+            return new SetFirewallRulesAnswer(cmd, false, results);
+        }
+
+        List<ConfigItem> cfg = generateConfig(cmd);
+        ConfigItem c = cfg.get(0);
+        ExecutionResult result = _vrDeployer.executeInVR(routerAccessIp, c.getScript(), c.getArgs());
+
         if (!result.isSuccess()) {
             //FIXME - in the future we have to process each rule separately; now we temporarily set every rule to be false if single rule fails
             for (int i = 0; i < results.length; i++) {
@@ -295,10 +357,9 @@ public class VirtualRoutingResource {
 
     }
 
-    private Answer execute(SetPortForwardingRulesCommand cmd) {
-        String[] results = new String[cmd.getRules().length];
-        int i = 0;
-        boolean endResult = true;
+    private List<ConfigItem> generateConfig(SetPortForwardingRulesCommand cmd) {
+        LinkedList<ConfigItem> cfg = new LinkedList<>();
+
         for (PortForwardingRuleTO rule : cmd.getRules()) {
             StringBuilder args = new StringBuilder();
             args.append(rule.revoked() ? " -D " : " -A ");
@@ -307,8 +368,20 @@ public class VirtualRoutingResource {
             args.append(" -p ").append(rule.getStringSrcPortRange());
             args.append(" -r ").append(rule.getDstIp());
             args.append(" -d ").append(rule.getStringDstPortRange());
+            cfg.add(new ConfigItem(VRScripts.FIREWALL_NAT, args.toString()));
+        }
+
+        return cfg;
+    }
+
+    private Answer execute(SetPortForwardingRulesCommand cmd) {
+        String[] results = new String[cmd.getRules().length];
+        int i = 0;
+        boolean endResult = true;
+        List<ConfigItem> cfg = generateConfig(cmd);
 
-            ExecutionResult result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), VRScripts.FIREWALL_NAT, args.toString());
+        for (ConfigItem c : cfg) {
+            ExecutionResult result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), c.getScript(), c.getArgs());
 
             if (!result.isSuccess()) {
                 results[i++] = "Failed";
@@ -321,51 +394,45 @@ public class VirtualRoutingResource {
         return new SetPortForwardingRulesAnswer(cmd, results, endResult);
     }
 
-    protected SetStaticNatRulesAnswer SetVPCStaticNatRules(SetStaticNatRulesCommand cmd) {
-        String[] results = new String[cmd.getRules().length];
-        int i = 0;
-        boolean endResult = true;
+    private List<ConfigItem> generateConfig(SetStaticNatRulesCommand cmd) {
+        LinkedList<ConfigItem> cfg = new LinkedList<>();
+        if (cmd.getVpcId() != null) {
+            for (StaticNatRuleTO rule : cmd.getRules()) {
+                String args = rule.revoked() ? " -D" : " -A";
+                args += " -l " + rule.getSrcIp();
+                args += " -r " + rule.getDstIp();
 
-        for (StaticNatRuleTO rule : cmd.getRules()) {
-            String args = rule.revoked() ? " -D" : " -A";
-            args += " -l " + rule.getSrcIp();
-            args += " -r " + rule.getDstIp();
+                cfg.add(new ConfigItem(VRScripts.VPC_STATIC_NAT, args));
+            }
+        } else {
+            for (StaticNatRuleTO rule : cmd.getRules()) {
+                //1:1 NAT needs instanceip;publicip;domrip;op
+                StringBuilder args = new StringBuilder();
+                args.append(rule.revoked() ? " -D " : " -A ");
+                args.append(" -l ").append(rule.getSrcIp());
+                args.append(" -r ").append(rule.getDstIp());
+
+                if (rule.getProtocol() != null) {
+                    args.append(" -P ").append(rule.getProtocol().toLowerCase());
+                }
 
-            ExecutionResult result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), VRScripts.VPC_STATIC_NAT, args);
+                args.append(" -d ").append(rule.getStringSrcPortRange());
+                args.append(" -G ");
 
-            if (!result.isSuccess()) {
-                results[i++] = null;
-            } else {
-                results[i++] = "Failed";
-                endResult = false;
+                cfg.add(new ConfigItem(VRScripts.FIREWALL_NAT, args.toString()));
             }
         }
-        return new SetStaticNatRulesAnswer(cmd, results, endResult);
-
+        return cfg;
     }
 
     private SetStaticNatRulesAnswer execute(SetStaticNatRulesCommand cmd) {
-        if (cmd.getVpcId() != null) {
-            return SetVPCStaticNatRules(cmd);
-        }
         String[] results = new String[cmd.getRules().length];
         int i = 0;
         boolean endResult = true;
-        for (StaticNatRuleTO rule : cmd.getRules()) {
-            //1:1 NAT needs instanceip;publicip;domrip;op
-            StringBuilder args = new StringBuilder();
-            args.append(rule.revoked() ? " -D " : " -A ");
-            args.append(" -l ").append(rule.getSrcIp());
-            args.append(" -r ").append(rule.getDstIp());
-
-            if (rule.getProtocol() != null) {
-                args.append(" -P ").append(rule.getProtocol().toLowerCase());
-            }
 
-            args.append(" -d ").append(rule.getStringSrcPortRange());
-            args.append(" -G ");
-
-            ExecutionResult result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), VRScripts.FIREWALL_NAT, args.toString());
+        List<ConfigItem> cfg = generateConfig(cmd);
+        for (ConfigItem c : cfg) {
+            ExecutionResult result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), c.getScript(), c.getArgs());
 
             if (!result.isSuccess()) {
                 results[i++] = "Failed";
@@ -378,29 +445,11 @@ public class VirtualRoutingResource {
         return new SetStaticNatRulesAnswer(cmd, results, endResult);
     }
 
-    private Answer execute(LoadBalancerConfigCommand cmd) {
-        String routerIp = cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP);
-
-        if (routerIp == null) {
-            return new Answer(cmd);
-        }
+    private List<ConfigItem> generateConfig(LoadBalancerConfigCommand cmd) {
+        LinkedList<ConfigItem> cfg = new LinkedList<>();
 
+        String routerIp = cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP);
         LoadBalancerConfigurator cfgtr = new HAProxyConfigurator();
-        String[] config = cfgtr.generateConfiguration(cmd);
-        String tmpCfgFileContents = "";
-        for (int i = 0; i < config.length; i++) {
-            tmpCfgFileContents += config[i];
-            tmpCfgFileContents += "\n";
-        }
-
-        String tmpCfgFilePath = "/etc/haproxy/";
-        String tmpCfgFileName = "haproxy.cfg.new";
-        ExecutionResult result = _vrDeployer.createFileInVR(cmd.getRouterAccessIp(), tmpCfgFilePath, tmpCfgFileName, tmpCfgFileContents);
-
-        if (!result.isSuccess()) {
-            return new Answer(cmd, false, "Fail to copy LB config file to VR");
-        }
-
         String[][] rules = cfgtr.generateFwRules(cmd);
 
         String[] addRules = rules[LoadBalancerConfigurator.ADD];
@@ -436,17 +485,48 @@ public class VirtualRoutingResource {
 
         if (cmd.getVpcId() == null) {
             args = " -i " + routerIp + args;
-            result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), VRScripts.LB, args);
+            cfg.add(new ConfigItem(VRScripts.LB, args));
         } else {
             args = " -i " + cmd.getNic().getIp() + args;
-            result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), VRScripts.VPC_LB, args);
+            cfg.add(new ConfigItem(VRScripts.VPC_LB, args));
         }
 
+        return cfg;
+    }
+
+    private Answer execute(LoadBalancerConfigCommand cmd) {
+        String routerIp = cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP);
+
+        if (routerIp == null) {
+            return new Answer(cmd);
+        }
+
+        LoadBalancerConfigurator cfgtr = new HAProxyConfigurator();
+        String[] config = cfgtr.generateConfiguration(cmd);
+        String tmpCfgFileContents = "";
+        for (int i = 0; i < config.length; i++) {
+            tmpCfgFileContents += config[i];
+            tmpCfgFileContents += "\n";
+        }
+
+        String tmpCfgFilePath = "/etc/haproxy/";
+        String tmpCfgFileName = "haproxy.cfg.new";
+        ExecutionResult result = _vrDeployer.createFileInVR(cmd.getRouterAccessIp(), tmpCfgFilePath, tmpCfgFileName, tmpCfgFileContents);
+
+        if (!result.isSuccess()) {
+            return new Answer(cmd, false, "Fail to copy LB config file to VR");
+        }
+
+        List<ConfigItem> cfg = generateConfig(cmd);
+        ConfigItem c = cfg.get(0);
+        result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), c.getScript(), c.getArgs());
+
         return new Answer(cmd, result.isSuccess(), result.getDetails());
     }
 
 
-    protected Answer execute(VmDataCommand cmd) {
+    private List<ConfigItem> generateConfig(VmDataCommand cmd) {
+        LinkedList<ConfigItem> cfg = new LinkedList<>();
         Map<String, List<String[]>> data = new HashMap<String, List<String[]>>();
         data.put(cmd.getVmIpAddress(), cmd.getVmData());
 
@@ -457,22 +537,40 @@ public class VirtualRoutingResource {
 
         String args = "-d " + json;
 
-        final ExecutionResult result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), VRScripts.VMDATA, args);
+        cfg.add(new ConfigItem(VRScripts.VMDATA, args));
+        return cfg;
+    }
+
+    protected Answer execute(VmDataCommand cmd) {
+        List<ConfigItem> cfg = generateConfig(cmd);
+        ConfigItem c = cfg.get(0);
+        final ExecutionResult result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), c.getScript(), c.getArgs());
         return new Answer(cmd, result.isSuccess(), result.getDetails());
     }
 
-    protected Answer execute(final SavePasswordCommand cmd) {
+    private List<ConfigItem> generateConfig(SavePasswordCommand cmd) {
+        LinkedList<ConfigItem> cfg = new LinkedList<>();
+
         final String password = cmd.getPassword();
         final String vmIpAddress = cmd.getVmIpAddress();
 
         String args = "-v " + vmIpAddress;
         args += " -p " + password;
 
-        ExecutionResult result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), VRScripts.PASSWORD, args);
+        cfg.add(new ConfigItem(VRScripts.PASSWORD, args));
+        return cfg;
+    }
+
+    protected Answer execute(final SavePasswordCommand cmd) {
+        List<ConfigItem> cfg = generateConfig(cmd);
+        ConfigItem c = cfg.get(0);
+        ExecutionResult result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), c.getScript(), c.getArgs());
         return new Answer(cmd, result.isSuccess(), result.getDetails());
     }
 
-    protected Answer execute(final DhcpEntryCommand cmd) {
+    private List<ConfigItem> generateConfig(DhcpEntryCommand cmd) {
+        LinkedList<ConfigItem> cfg = new LinkedList<>();
+
         String args = " -m " + cmd.getVmMac();
         if (cmd.getVmIpAddress() != null) {
             args += " -4 " + cmd.getVmIpAddress();
@@ -499,22 +597,41 @@ public class VirtualRoutingResource {
         if (!cmd.isDefault()) {
             args += " -N";
         }
+        cfg.add(new ConfigItem(VRScripts.DHCP, args));
+
+        return cfg;
+    }
 
-        final ExecutionResult result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), VRScripts.DHCP, args);
+    protected Answer execute(final DhcpEntryCommand cmd) {
+        List<ConfigItem> cfg = generateConfig(cmd);
+        ConfigItem c = cfg.get(0);
+        final ExecutionResult result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), c.getScript(), c.getArgs());
         return new Answer(cmd, result.isSuccess(), result.getDetails());
     }
 
-    protected Answer execute(final CreateIpAliasCommand cmd) {
+    private List<ConfigItem> generateConfig(CreateIpAliasCommand cmd) {
+        LinkedList<ConfigItem> cfg = new LinkedList<>();
+
         List<IpAliasTO> ipAliasTOs = cmd.getIpAliasList();
         String args = "";
         for (IpAliasTO ipaliasto : ipAliasTOs) {
             args = args + ipaliasto.getAlias_count() + ":" + ipaliasto.getRouterip() + ":" + ipaliasto.getNetmask() + "-";
         }
-        final ExecutionResult result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), VRScripts.IPALIAS_CREATE, args);
+
+        cfg.add(new ConfigItem(VRScripts.IPALIAS_CREATE, args));
+        return cfg;
+    }
+
+    protected Answer execute(final CreateIpAliasCommand cmd) {
+        List<ConfigItem> cfg = generateConfig(cmd);
+        ConfigItem c = cfg.get(0);
+        final ExecutionResult result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), c.getScript(), c.getArgs());
         return new Answer(cmd, result.isSuccess(), result.getDetails());
     }
 
-    protected Answer execute(final DeleteIpAliasCommand cmd) {
+    private List<ConfigItem> generateConfig(DeleteIpAliasCommand cmd) {
+        LinkedList<ConfigItem> cfg = new LinkedList<>();
+
         String args = "";
         List<IpAliasTO> revokedIpAliasTOs = cmd.getDeleteIpAliasTos();
         for (IpAliasTO ipAliasTO : revokedIpAliasTOs) {
@@ -526,17 +643,35 @@ public class VirtualRoutingResource {
         for (IpAliasTO ipAliasTO : activeIpAliasTOs) {
             args = args + ipAliasTO.getAlias_count() + ":" + ipAliasTO.getRouterip() + ":" + ipAliasTO.getNetmask() + "-";
         }
-        final ExecutionResult result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), VRScripts.IPALIAS_DELETE, args);
+
+        cfg.add(new ConfigItem(VRScripts.IPALIAS_DELETE, args));
+        return cfg;
+    }
+
+    protected Answer execute(final DeleteIpAliasCommand cmd) {
+        List<ConfigItem> cfg = generateConfig(cmd);
+        ConfigItem c = cfg.get(0);
+        final ExecutionResult result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), c.getScript(), c.getArgs());
         return new Answer(cmd, result.isSuccess(), result.getDetails());
     }
 
-    protected Answer execute(final DnsMasqConfigCommand cmd) {
+    private List<ConfigItem> generateConfig(DnsMasqConfigCommand cmd) {
+        LinkedList<ConfigItem> cfg = new LinkedList<>();
+
         List<DhcpTO> dhcpTos = cmd.getIps();
         String args = "";
         for (DhcpTO dhcpTo : dhcpTos) {
             args = args + dhcpTo.getRouterIp() + ":" + dhcpTo.getGateway() + ":" + dhcpTo.getNetmask() + ":" + dhcpTo.getStartIpOfSubnet() + "-";
         }
-        final ExecutionResult result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), VRScripts.DNSMASQ_CONFIG, args);
+
+        cfg.add(new ConfigItem(VRScripts.DNSMASQ_CONFIG, args));
+        return cfg;
+    }
+
+    protected Answer execute(final DnsMasqConfigCommand cmd) {
+        List<ConfigItem> cfg = generateConfig(cmd);
+        ConfigItem c = cfg.get(0);
+        final ExecutionResult result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), c.getScript(), c.getArgs());
         return new Answer(cmd, result.isSuccess(), result.getDetails());
     }
 
@@ -558,8 +693,16 @@ public class VirtualRoutingResource {
         return new CheckRouterAnswer(cmd, result.getDetails(), true);
     }
 
+    private List<ConfigItem> generateConfig(BumpUpPriorityCommand cmd) {
+        LinkedList<ConfigItem> cfg = new LinkedList<>();
+        cfg.add(new ConfigItem(VRScripts.RVR_BUMPUP_PRI, null));
+        return cfg;
+    }
+
     protected Answer execute(BumpUpPriorityCommand cmd) {
-        ExecutionResult result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), VRScripts.RVR_BUMPUP_PRI, null);
+        List<ConfigItem> cfg = generateConfig(cmd);
+        ConfigItem c = cfg.get(0);
+        final ExecutionResult result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), c.getScript(), c.getArgs());
         return new Answer(cmd, result.isSuccess(), result.getDetails());
     }
 
@@ -575,7 +718,9 @@ public class VirtualRoutingResource {
         return new GetDomRVersionAnswer(cmd, result.getDetails(), lines[0], lines[1]);
     }
 
-    protected Answer execute(Site2SiteVpnCfgCommand cmd) {
+    private List<ConfigItem> generateConfig(Site2SiteVpnCfgCommand cmd) {
+        LinkedList<ConfigItem> cfg = new LinkedList<>();
+
         String args = "";
         if (cmd.isCreate()) {
             args += "-A";
@@ -617,32 +762,43 @@ public class VirtualRoutingResource {
             args += " -N ";
             args += cmd.getPeerGuestCidrList();
         }
-        ExecutionResult result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), VRScripts.S2SVPN_IPSEC, args);
-        if (!result.isSuccess()) {
-            return new Answer(cmd, false, "Configure site to site VPN failed due to " + result.getDetails());
-        }
-        return new Answer(cmd);
+
+        cfg.add(new ConfigItem(VRScripts.S2SVPN_IPSEC, args));
+        return cfg;
     }
 
-    protected Answer execute(SetMonitorServiceCommand cmd) {
+    protected Answer execute(Site2SiteVpnCfgCommand cmd) {
+        List<ConfigItem> cfg = generateConfig(cmd);
+        ConfigItem c = cfg.get(0);
+        final ExecutionResult result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), c.getScript(), c.getArgs());
+        return new Answer(cmd, result.isSuccess(), result.getDetails());
+    }
+
+    protected List<ConfigItem> generateConfig(SetMonitorServiceCommand cmd) {
+        LinkedList<ConfigItem> cfg = new LinkedList<>();
+
         String config = cmd.getConfiguration();
         String disableMonitoring =  cmd.getAccessDetail(NetworkElementCommand.ROUTER_MONITORING_ENABLE);
 
-
         String args = " -c " + config;
         if (disableMonitoring != null) {
             args = args + " -d";
         }
 
-        ExecutionResult result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), VRScripts.MONITOR_SERVICE, args);
+        cfg.add(new ConfigItem(VRScripts.MONITOR_SERVICE, args));
+        return cfg;
+    }
 
-        if (!result.isSuccess()) {
-            return new Answer(cmd, false, result.getDetails());
-        }
-        return new Answer(cmd);
+    protected Answer execute(SetMonitorServiceCommand cmd) {
+        List<ConfigItem> cfg = generateConfig(cmd);
+        ConfigItem c = cfg.get(0);
+        final ExecutionResult result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), c.getScript(), c.getArgs());
+        return new Answer(cmd, result.isSuccess(), result.getDetails());
     }
 
-    protected Answer execute(SetupGuestNetworkCommand cmd) {
+    protected List<ConfigItem> generateConfig(SetupGuestNetworkCommand cmd) {
+        LinkedList<ConfigItem> cfg = new LinkedList<>();
+
         NicTO nic = cmd.getNic();
         String routerGIP = cmd.getAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP);
         String gateway = cmd.getAccessDetail(NetworkElementCommand.GUEST_NETWORK_GATEWAY);
@@ -675,62 +831,72 @@ public class VirtualRoutingResource {
         if (domainName != null && !domainName.isEmpty()) {
             args += " -e " + domainName;
         }
-        ExecutionResult result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), VRScripts.VPC_GUEST_NETWORK, args);
 
-        if (!result.isSuccess()) {
-            return new Answer(cmd, false, "Creating guest network failed due to " + result.getDetails());
-        }
-        return new Answer(cmd, true, "success");
+        cfg.add(new ConfigItem(VRScripts.VPC_GUEST_NETWORK, args));
+        return cfg;
     }
 
-    private SetNetworkACLAnswer execute(SetNetworkACLCommand cmd) {
-        String[] results = new String[cmd.getRules().length];
+    protected Answer execute(SetupGuestNetworkCommand cmd) {
+        List<ConfigItem> cfg = generateConfig(cmd);
+        ConfigItem c = cfg.get(0);
+        final ExecutionResult result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), c.getScript(), c.getArgs());
+        return new Answer(cmd, result.isSuccess(), result.getDetails());
+    }
+
+    protected List<ConfigItem> generateConfig(SetNetworkACLCommand cmd) {
+        LinkedList<ConfigItem> cfg = new LinkedList<>();
 
         String privateGw = cmd.getAccessDetail(NetworkElementCommand.VPC_PRIVATE_GATEWAY);
 
-        try {
-            String[][] rules = cmd.generateFwRules();
-            String[] aclRules = rules[0];
-            NicTO nic = cmd.getNic();
-            String dev = "eth" + nic.getDeviceId();
-            String netmask = Long.toString(NetUtils.getCidrSize(nic.getNetmask()));
-            StringBuilder sb = new StringBuilder();
-
-            for (int i = 0; i < aclRules.length; i++) {
-                sb.append(aclRules[i]).append(',');
-            }
+        String[][] rules = cmd.generateFwRules();
+        String[] aclRules = rules[0];
+        NicTO nic = cmd.getNic();
+        String dev = "eth" + nic.getDeviceId();
+        String netmask = Long.toString(NetUtils.getCidrSize(nic.getNetmask()));
+        StringBuilder sb = new StringBuilder();
 
-            String rule = sb.toString();
-            ExecutionResult result;
+        for (int i = 0; i < aclRules.length; i++) {
+            sb.append(aclRules[i]).append(',');
+        }
 
-            String args = " -d " + dev;
-            args += " -M " + nic.getMac();
-            if (privateGw != null) {
-                args += " -a " + rule;
-                result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), VRScripts.VPC_PRIVATEGW_ACL, args);
-            } else {
-                args += " -i " + nic.getIp();
-                args += " -m " + netmask;
-                args += " -a " + rule;
-                result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), VRScripts.VPC_ACL, args);
-            }
+        String rule = sb.toString();
 
-            if (!result.isSuccess()) {
-                for (int i = 0; i < results.length; i++) {
-                    results[i] = "Failed";
-                }
-                return new SetNetworkACLAnswer(cmd, false, results);
-            }
+        String args = " -d " + dev;
+        args += " -M " + nic.getMac();
+        if (privateGw != null) {
+            args += " -a " + rule;
+
+            cfg.add(new ConfigItem(VRScripts.VPC_PRIVATEGW_ACL, args));
+        } else {
+            args += " -i " + nic.getIp();
+            args += " -m " + netmask;
+            args += " -a " + rule;
+            cfg.add(new ConfigItem(VRScripts.VPC_ACL, args));
+        }
+
+        return cfg;
+    }
 
-            return new SetNetworkACLAnswer(cmd, true, results);
-        } catch (Exception e) {
-            String msg = "SetNetworkACL failed due to " + e.toString();
-            s_logger.error(msg, e);
+    private SetNetworkACLAnswer execute(SetNetworkACLCommand cmd) {
+        String[] results = new String[cmd.getRules().length];
+
+        List<ConfigItem> cfg = generateConfig(cmd);
+        ConfigItem c = cfg.get(0);
+        final ExecutionResult result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), c.getScript(), c.getArgs());
+
+        if (!result.isSuccess()) {
+            for (int i = 0; i < results.length; i++) {
+                results[i] = "Failed";
+            }
             return new SetNetworkACLAnswer(cmd, false, results);
         }
+
+        return new SetNetworkACLAnswer(cmd, true, results);
     }
 
-    protected Answer execute(SetSourceNatCommand cmd) {
+    protected List<ConfigItem> generateConfig(SetSourceNatCommand cmd) {
+        LinkedList<ConfigItem> cfg = new LinkedList<>();
+
         IpAddressTO pubIP = cmd.getIpAddress();
         String dev = "eth" + pubIP.getNicDevId();
         String args = " -A ";
@@ -738,15 +904,21 @@ public class VirtualRoutingResource {
         args += pubIP.getPublicIp();
         args += " -c ";
         args += dev;
-        ExecutionResult result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), VRScripts.VPC_SOURCE_NAT, args);
+
+        cfg.add(new ConfigItem(VRScripts.VPC_SOURCE_NAT, args));
+        return cfg;
+    }
+
+    protected Answer execute(SetSourceNatCommand cmd) {
+        List<ConfigItem> cfg = generateConfig(cmd);
+        ConfigItem c = cfg.get(0);
+        final ExecutionResult result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), c.getScript(), c.getArgs());
         return new Answer(cmd, result.isSuccess(), result.getDetails());
     }
 
-    private SetPortForwardingRulesAnswer execute(SetPortForwardingRulesVpcCommand cmd) {
-        String[] results = new String[cmd.getRules().length];
-        int i = 0;
+    protected List<ConfigItem> generateConfig(SetPortForwardingRulesVpcCommand cmd) {
+        LinkedList<ConfigItem> cfg = new LinkedList<>();
 
-        boolean endResult = true;
         for (PortForwardingRuleTO rule : cmd.getRules()) {
             String args = rule.revoked() ? " -D" : " -A";
             args += " -P " + rule.getProtocol().toLowerCase();
@@ -755,7 +927,20 @@ public class VirtualRoutingResource {
             args += " -r " + rule.getDstIp();
             args += " -d " + rule.getStringDstPortRange().replace(":", "-");
 
-            ExecutionResult result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), VRScripts.VPC_PORTFORWARDING, args);
+            cfg.add(new ConfigItem(VRScripts.VPC_PORTFORWARDING, args));
+        }
+
+        return cfg;
+    }
+
+    private SetPortForwardingRulesAnswer execute(SetPortForwardingRulesVpcCommand cmd) {
+        String[] results = new String[cmd.getRules().length];
+        int i = 0;
+
+        boolean endResult = true;
+        List<ConfigItem> cfg = generateConfig(cmd);
+        for (ConfigItem c : cfg) {
+            ExecutionResult result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), c.getScript(), c.getArgs());
 
             if (!result.isSuccess()) {
                 results[i++] = "Failed";
@@ -769,82 +954,135 @@ public class VirtualRoutingResource {
 
     public IpAssocAnswer execute(IpAssocVpcCommand cmd) {
         String[] results = new String[cmd.getIpAddresses().length];
-        String args = "";
-        String snatArgs = "";
         for (int i = 0; i < cmd.getIpAddresses().length; i ++) {
             results[i] = "Failed";
         }
 
         int i = 0;
-        for (IpAddressTO ip : cmd.getIpAddresses()) {
-            if (ip.isAdd()) {
-                args += " -A ";
-                snatArgs += " -A ";
-            } else {
-                args += " -D ";
-                snatArgs += " -D ";
-            }
-
-            args += " -l ";
-            args += ip.getPublicIp();
-            String nicName = "eth" + ip.getNicDevId();
-            args += " -c ";
-            args += nicName;
-            args += " -g ";
-            args += ip.getVlanGateway();
-            args += " -m ";
-            args += Long.toString(NetUtils.getCidrSize(ip.getVlanNetmask()));
-            args += " -n ";
-            args += NetUtils.getSubNet(ip.getPublicIp(), ip.getVlanNetmask());
-
-            ExecutionResult result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), VRScripts.VPC_IPASSOC, args);
+        List<ConfigItem> cfg = generateConfig(cmd);
+        for (ConfigItem c : cfg) {
+            ExecutionResult result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), c.getScript(), c.getArgs());
             if (!result.isSuccess()) {
-                results[i++] = ip.getPublicIp() + " - vpc_ipassoc failed:" + result.getDetails();
+                results[i++] = c.getInfo() + " failed: " + result.getDetails();
                 break;
             }
 
-            if (ip.isSourceNat()) {
-                snatArgs += " -l " + ip.getPublicIp();
-                snatArgs += " -c " + nicName;
-
-                result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), VRScripts.VPC_PRIVATEGW, snatArgs);
-                if (result != null) {
-                    results[i++] = ip.getPublicIp() + " - vpc_privateGateway failed:" + result.getDetails();
-                    break;
-                }
-            }
-            results[i++] = ip.getPublicIp() + " - success ";
+            results[i++] = c.getInfo() + " - success ";
         }
         return new IpAssocAnswer(cmd, results);
     }
 
+    protected List<ConfigItem> generateConfig(SetStaticRouteCommand cmd) {
+        LinkedList<ConfigItem> cfg = new LinkedList<>();
+
+        String[][] rules = cmd.generateSRouteRules();
+        StringBuilder sb = new StringBuilder();
+        String[] srRules = rules[0];
+
+        for (int i = 0; i < srRules.length; i++) {
+            sb.append(srRules[i]).append(',');
+        }
+
+        String args = " -a " + sb.toString();
+
+        cfg.add(new ConfigItem(VRScripts.VPC_STATIC_ROUTE, args));
+        return cfg;
+    }
+
     private SetStaticRouteAnswer execute(SetStaticRouteCommand cmd) {
-        try {
-            String[] results = new String[cmd.getStaticRoutes().length];
-            String[][] rules = cmd.generateSRouteRules();
-            StringBuilder sb = new StringBuilder();
-            String[] srRules = rules[0];
+        String[] results = new String[cmd.getStaticRoutes().length];
+
+        List<ConfigItem> cfg = generateConfig(cmd);
+        ConfigItem c = cfg.get(0);
+        final ExecutionResult result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), c.getScript(), c.getArgs());
 
-            for (int i = 0; i < srRules.length; i++) {
-                sb.append(srRules[i]).append(',');
+        if (!result.isSuccess()) {
+            for (int i = 0; i < results.length; i++) {
+                results[i] = "Failed";
             }
+            return new SetStaticRouteAnswer(cmd, false, results);
+        }
 
-            String args = " -a " + sb.toString();
-            ExecutionResult result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), VRScripts.VPC_STATIC_ROUTE, args);
+        return new SetStaticRouteAnswer(cmd, true, results);
+    }
 
-            if (!result.isSuccess()) {
-                for (int i = 0; i < results.length; i++) {
-                    results[i] = "Failed";
+    protected List<ConfigItem> generateConfig(IpAssocCommand cmd) {
+        LinkedList<ConfigItem> cfg = new LinkedList<>();
+        ConfigItem c;
+
+        if (cmd instanceof IpAssocVpcCommand) {
+            for (IpAddressTO ip : cmd.getIpAddresses()) {
+                String args = "";
+                String snatArgs = "";
+
+                if (ip.isAdd()) {
+                    args += " -A ";
+                    snatArgs += " -A ";
+                } else {
+                    args += " -D ";
+                    snatArgs += " -D ";
+                }
+
+                args += " -l ";
+                args += ip.getPublicIp();
+                String nicName = "eth" + ip.getNicDevId();
+                args += " -c ";
+                args += nicName;
+                args += " -g ";
+                args += ip.getVlanGateway();
+                args += " -m ";
+                args += Long.toString(NetUtils.getCidrSize(ip.getVlanNetmask()));
+                args += " -n ";
+                args += NetUtils.getSubNet(ip.getPublicIp(), ip.getVlanNetmask());
+
+                c = new ConfigItem(VRScripts.VPC_IPASSOC, args);
+                c.setInfo(ip.getPublicIp() + " - vpc_ipassoc");
+                cfg.add(c);
+
+                if (ip.isSourceNat()) {
+                    snatArgs += " -l " + ip.getPublicIp();
+                    snatArgs += " -c " + nicName;
+
+                    c = new ConfigItem(VRScripts.VPC_PRIVATEGW, snatArgs);
+                    c.setInfo(ip.getPublicIp() + " - vpc_privategateway");
+                    cfg.add(c);
                 }
-                return new SetStaticRouteAnswer(cmd, false, results);
             }
+        } else {
+            for (IpAddressTO ip: cmd.getIpAddresses()) {
+                String args = "";
+                if (ip.isAdd()) {
+                    args += "-A";
+                } else {
+                    args += "-D";
+                }
+                String cidrSize = Long.toString(NetUtils.getCidrSize(ip.getVlanNetmask()));
+                if (ip.isSourceNat()) {
+                    args += " -s";
+                }
+                if (ip.isFirstIP()) {
+                    args += " -f";
+                }
+                args += " -l ";
+                args += ip.getPublicIp() + "/" + cidrSize;
 
-            return new SetStaticRouteAnswer(cmd, true, results);
-        } catch (Exception e) {
-            String msg = "SetStaticRoute failed due to " + e.toString();
-            s_logger.error(msg, e);
-            return new SetStaticRouteAnswer(cmd, false, null);
+                String publicNic = "eth" + ip.getNicDevId();
+                args += " -c ";
+                args += publicNic;
+
+                args += " -g ";
+                args += ip.getVlanGateway();
+
+                if (ip.isNewNic()) {
+                    args += " -n";
+                }
+
+                c = new ConfigItem(VRScripts.IPASSOC, args);
+                c.setInfo(ip.getPublicIp());
+                cfg.add(c);
+            }
         }
+        return cfg;
     }
 
     public Answer execute(IpAssocCommand cmd) {
@@ -854,39 +1092,13 @@ public class VirtualRoutingResource {
         }
 
         int i = 0;
-        for (IpAddressTO ip: cmd.getIpAddresses()) {
-            String args = "";
-            if (ip.isAdd()) {
-                args += "-A";
-            } else {
-                args += "-D";
-            }
-            String cidrSize = Long.toString(NetUtils.getCidrSize(ip.getVlanNetmask()));
-            if (ip.isSourceNat()) {
-                args += " -s";
-            }
-            if (ip.isFirstIP()) {
-                args += " -f";
-            }
-            args += " -l ";
-            args += ip.getPublicIp() + "/" + cidrSize;
-
-            String publicNic = "eth" + ip.getNicDevId();
-            args += " -c ";
-            args += publicNic;
-
-            args += " -g ";
-            args += ip.getVlanGateway();
-
-            if (ip.isNewNic()) {
-                args += " -n";
-            }
-
-            ExecutionResult result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), VRScripts.IPASSOC, args);
+        List<ConfigItem> cfg = generateConfig(cmd);
+        for (ConfigItem c : cfg) {
+            ExecutionResult result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), c.getScript(), c.getArgs());
             if (result.isSuccess()) {
-                results[i++] = ip.getPublicIp() + " - success";
+                results[i++] = c.getInfo() + " - success";
             } else {
-                results[i++] = ip.getPublicIp() + " - failed:" + result.getDetails();
+                results[i++] = c.getInfo() + " - failed:" + result.getDetails();
                 break;
             }
         }


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

Posted by ya...@apache.org.
CLOUDSTACK-6047: Generalize execution in VirtualRoutingResource


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

Branch: refs/heads/master
Commit: ebf7ee40b11cf50c99d7699100ea8d98862fb6e9
Parents: 8fccb8c
Author: Sheng Yang <sh...@citrix.com>
Authored: Wed Feb 19 19:12:07 2014 -0800
Committer: Sheng Yang <sh...@citrix.com>
Committed: Wed Feb 19 19:46:59 2014 -0800

----------------------------------------------------------------------
 .../virtualnetwork/VirtualRoutingResource.java  | 66 +++++++-------------
 1 file changed, 23 insertions(+), 43 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/ebf7ee40/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 d51e8bb..faa826a 100755
--- a/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java
+++ b/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java
@@ -236,6 +236,16 @@ public class VirtualRoutingResource {
         }
     }
 
+    private Answer applyConfigSingle(NetworkElementCommand cmd, List<ConfigItem> cfg) {
+        for (ConfigItem c : cfg) {
+            ExecutionResult result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), c.getScript(), c.getArgs());
+            if (!result.isSuccess()) {
+                return new Answer(cmd, false, result.getDetails());
+            }
+        }
+        return new Answer(cmd);
+    }
+
     private List<ConfigItem> generateConfig(VpnUsersCfgCommand cmd) {
         LinkedList<ConfigItem> cfg = new LinkedList<>();
         for (VpnUsersCfgCommand.UsernamePassword userpwd : cmd.getUserpwds()) {
@@ -254,13 +264,7 @@ public class VirtualRoutingResource {
 
     private Answer execute(VpnUsersCfgCommand cmd) {
         List<ConfigItem> cfg = generateConfig(cmd);
-        for (ConfigItem c : cfg) {
-            ExecutionResult result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), c.getScript(), c.getArgs());
-            if (!result.isSuccess()) {
-                return new Answer(cmd, false, "Configure VPN user failed: " + result.getDetails());
-            }
-        }
-        return new Answer(cmd);
+        return applyConfigSingle(cmd, cfg);
     }
 
     private List<ConfigItem> generateConfig(RemoteAccessVpnCfgCommand cmd) {
@@ -289,9 +293,7 @@ public class VirtualRoutingResource {
 
     private Answer execute(RemoteAccessVpnCfgCommand cmd) {
         List<ConfigItem> cfg = generateConfig(cmd);
-        ConfigItem c = cfg.get(0);
-        ExecutionResult result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), c.getScript(), c.getArgs());
-        return new Answer(cmd, result.isSuccess(), result.getDetails());
+        return applyConfigSingle(cmd, cfg);
     }
 
     private List<ConfigItem> generateConfig(SetFirewallRulesCommand cmd) {
@@ -543,9 +545,7 @@ public class VirtualRoutingResource {
 
     protected Answer execute(VmDataCommand cmd) {
         List<ConfigItem> cfg = generateConfig(cmd);
-        ConfigItem c = cfg.get(0);
-        final ExecutionResult result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), c.getScript(), c.getArgs());
-        return new Answer(cmd, result.isSuccess(), result.getDetails());
+        return applyConfigSingle(cmd, cfg);
     }
 
     private List<ConfigItem> generateConfig(SavePasswordCommand cmd) {
@@ -563,9 +563,7 @@ public class VirtualRoutingResource {
 
     protected Answer execute(final SavePasswordCommand cmd) {
         List<ConfigItem> cfg = generateConfig(cmd);
-        ConfigItem c = cfg.get(0);
-        ExecutionResult result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), c.getScript(), c.getArgs());
-        return new Answer(cmd, result.isSuccess(), result.getDetails());
+        return applyConfigSingle(cmd, cfg);
     }
 
     private List<ConfigItem> generateConfig(DhcpEntryCommand cmd) {
@@ -604,9 +602,7 @@ public class VirtualRoutingResource {
 
     protected Answer execute(final DhcpEntryCommand cmd) {
         List<ConfigItem> cfg = generateConfig(cmd);
-        ConfigItem c = cfg.get(0);
-        final ExecutionResult result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), c.getScript(), c.getArgs());
-        return new Answer(cmd, result.isSuccess(), result.getDetails());
+        return applyConfigSingle(cmd, cfg);
     }
 
     private List<ConfigItem> generateConfig(CreateIpAliasCommand cmd) {
@@ -624,9 +620,7 @@ public class VirtualRoutingResource {
 
     protected Answer execute(final CreateIpAliasCommand cmd) {
         List<ConfigItem> cfg = generateConfig(cmd);
-        ConfigItem c = cfg.get(0);
-        final ExecutionResult result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), c.getScript(), c.getArgs());
-        return new Answer(cmd, result.isSuccess(), result.getDetails());
+        return applyConfigSingle(cmd, cfg);
     }
 
     private List<ConfigItem> generateConfig(DeleteIpAliasCommand cmd) {
@@ -650,9 +644,7 @@ public class VirtualRoutingResource {
 
     protected Answer execute(final DeleteIpAliasCommand cmd) {
         List<ConfigItem> cfg = generateConfig(cmd);
-        ConfigItem c = cfg.get(0);
-        final ExecutionResult result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), c.getScript(), c.getArgs());
-        return new Answer(cmd, result.isSuccess(), result.getDetails());
+        return applyConfigSingle(cmd, cfg);
     }
 
     private List<ConfigItem> generateConfig(DnsMasqConfigCommand cmd) {
@@ -670,9 +662,7 @@ public class VirtualRoutingResource {
 
     protected Answer execute(final DnsMasqConfigCommand cmd) {
         List<ConfigItem> cfg = generateConfig(cmd);
-        ConfigItem c = cfg.get(0);
-        final ExecutionResult result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), c.getScript(), c.getArgs());
-        return new Answer(cmd, result.isSuccess(), result.getDetails());
+        return applyConfigSingle(cmd, cfg);
     }
 
     private CheckS2SVpnConnectionsAnswer execute(CheckS2SVpnConnectionsCommand cmd) {
@@ -701,9 +691,7 @@ public class VirtualRoutingResource {
 
     protected Answer execute(BumpUpPriorityCommand cmd) {
         List<ConfigItem> cfg = generateConfig(cmd);
-        ConfigItem c = cfg.get(0);
-        final ExecutionResult result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), c.getScript(), c.getArgs());
-        return new Answer(cmd, result.isSuccess(), result.getDetails());
+        return applyConfigSingle(cmd, cfg);
     }
 
     protected Answer execute(GetDomRVersionCmd cmd) {
@@ -769,9 +757,7 @@ public class VirtualRoutingResource {
 
     protected Answer execute(Site2SiteVpnCfgCommand cmd) {
         List<ConfigItem> cfg = generateConfig(cmd);
-        ConfigItem c = cfg.get(0);
-        final ExecutionResult result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), c.getScript(), c.getArgs());
-        return new Answer(cmd, result.isSuccess(), result.getDetails());
+        return applyConfigSingle(cmd, cfg);
     }
 
     protected List<ConfigItem> generateConfig(SetMonitorServiceCommand cmd) {
@@ -791,9 +777,7 @@ public class VirtualRoutingResource {
 
     protected Answer execute(SetMonitorServiceCommand cmd) {
         List<ConfigItem> cfg = generateConfig(cmd);
-        ConfigItem c = cfg.get(0);
-        final ExecutionResult result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), c.getScript(), c.getArgs());
-        return new Answer(cmd, result.isSuccess(), result.getDetails());
+        return applyConfigSingle(cmd, cfg);
     }
 
     protected List<ConfigItem> generateConfig(SetupGuestNetworkCommand cmd) {
@@ -838,9 +822,7 @@ public class VirtualRoutingResource {
 
     protected Answer execute(SetupGuestNetworkCommand cmd) {
         List<ConfigItem> cfg = generateConfig(cmd);
-        ConfigItem c = cfg.get(0);
-        final ExecutionResult result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), c.getScript(), c.getArgs());
-        return new Answer(cmd, result.isSuccess(), result.getDetails());
+        return applyConfigSingle(cmd, cfg);
     }
 
     protected List<ConfigItem> generateConfig(SetNetworkACLCommand cmd) {
@@ -911,9 +893,7 @@ public class VirtualRoutingResource {
 
     protected Answer execute(SetSourceNatCommand cmd) {
         List<ConfigItem> cfg = generateConfig(cmd);
-        ConfigItem c = cfg.get(0);
-        final ExecutionResult result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), c.getScript(), c.getArgs());
-        return new Answer(cmd, result.isSuccess(), result.getDetails());
+        return applyConfigSingle(cmd, cfg);
     }
 
     protected List<ConfigItem> generateConfig(SetPortForwardingRulesVpcCommand cmd) {


[6/7] git commit: updated refs/heads/master to 3bbbda8

Posted by ya...@apache.org.
CLOUDSTACK-6047: Introduce QueryCommand

QueryCommand is a kind of command which request the state rather than configure.
QueryCommands need to be executed immediately and cannot be aggregated.


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

Branch: refs/heads/master
Commit: 711b3083701e8b9852714e1817a022f039bf3235
Parents: 8b341b0
Author: Sheng Yang <sh...@citrix.com>
Authored: Wed Feb 19 19:12:07 2014 -0800
Committer: Sheng Yang <sh...@citrix.com>
Committed: Wed Feb 19 19:47:14 2014 -0800

----------------------------------------------------------------------
 .../com/cloud/agent/api/CheckRouterCommand.java |   5 +
 .../api/CheckS2SVpnConnectionsCommand.java      |   9 +-
 .../com/cloud/agent/api/GetDomRVersionCmd.java  |   5 +
 .../api/routing/NetworkElementCommand.java      |   4 +
 .../virtualnetwork/VirtualRoutingResource.java  | 281 ++++++++-----------
 5 files changed, 132 insertions(+), 172 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/711b3083/core/src/com/cloud/agent/api/CheckRouterCommand.java
----------------------------------------------------------------------
diff --git a/core/src/com/cloud/agent/api/CheckRouterCommand.java b/core/src/com/cloud/agent/api/CheckRouterCommand.java
index 6215fc3..c89cdf7 100644
--- a/core/src/com/cloud/agent/api/CheckRouterCommand.java
+++ b/core/src/com/cloud/agent/api/CheckRouterCommand.java
@@ -27,4 +27,9 @@ public class CheckRouterCommand extends NetworkElementCommand {
     public CheckRouterCommand() {
         super();
     }
+
+    @Override
+    public boolean isQuery() {
+        return true;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/711b3083/core/src/com/cloud/agent/api/CheckS2SVpnConnectionsCommand.java
----------------------------------------------------------------------
diff --git a/core/src/com/cloud/agent/api/CheckS2SVpnConnectionsCommand.java b/core/src/com/cloud/agent/api/CheckS2SVpnConnectionsCommand.java
index 9cfb53b..bbd7c5f 100644
--- a/core/src/com/cloud/agent/api/CheckS2SVpnConnectionsCommand.java
+++ b/core/src/com/cloud/agent/api/CheckS2SVpnConnectionsCommand.java
@@ -16,10 +16,10 @@
 // under the License.
 package com.cloud.agent.api;
 
-import java.util.List;
-
 import com.cloud.agent.api.routing.NetworkElementCommand;
 
+import java.util.List;
+
 public class CheckS2SVpnConnectionsCommand extends NetworkElementCommand {
     List<String> vpnIps;
 
@@ -36,4 +36,9 @@ public class CheckS2SVpnConnectionsCommand extends NetworkElementCommand {
     public List<String> getVpnIps() {
         return vpnIps;
     }
+
+    @Override
+    public boolean isQuery() {
+        return true;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/711b3083/core/src/com/cloud/agent/api/GetDomRVersionCmd.java
----------------------------------------------------------------------
diff --git a/core/src/com/cloud/agent/api/GetDomRVersionCmd.java b/core/src/com/cloud/agent/api/GetDomRVersionCmd.java
index 577c386..7a73fac 100644
--- a/core/src/com/cloud/agent/api/GetDomRVersionCmd.java
+++ b/core/src/com/cloud/agent/api/GetDomRVersionCmd.java
@@ -27,4 +27,9 @@ public class GetDomRVersionCmd extends NetworkElementCommand {
     public GetDomRVersionCmd() {
         super();
     }
+
+    @Override
+    public boolean isQuery() {
+        return true;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/711b3083/core/src/com/cloud/agent/api/routing/NetworkElementCommand.java
----------------------------------------------------------------------
diff --git a/core/src/com/cloud/agent/api/routing/NetworkElementCommand.java b/core/src/com/cloud/agent/api/routing/NetworkElementCommand.java
index f13037c..120c717 100644
--- a/core/src/com/cloud/agent/api/routing/NetworkElementCommand.java
+++ b/core/src/com/cloud/agent/api/routing/NetworkElementCommand.java
@@ -66,4 +66,8 @@ public abstract class NetworkElementCommand extends Command {
     public int getAnswersCount() {
         return 1;
     }
+
+    public boolean isQuery() {
+        return false;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/711b3083/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 49a5c0a..7845da0 100755
--- a/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java
+++ b/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java
@@ -133,59 +133,58 @@ public class VirtualRoutingResource {
                 return new Answer(cmd, false, rc.getDetails());
             }
 
+            if (cmd.isQuery()) {
+                return executeQueryCommand(cmd);
+            }
+
+            List<ConfigItem> cfg;
             if (cmd instanceof SetPortForwardingRulesVpcCommand) {
-                return execute((SetPortForwardingRulesVpcCommand)cmd);
+                cfg = generateConfig((SetPortForwardingRulesVpcCommand)cmd);
             } else if (cmd instanceof SetPortForwardingRulesCommand) {
-                return execute((SetPortForwardingRulesCommand)cmd);
+                cfg = generateConfig((SetPortForwardingRulesCommand)cmd);
             } else if (cmd instanceof SetStaticRouteCommand) {
-                return execute((SetStaticRouteCommand)cmd);
+                cfg = generateConfig((SetStaticRouteCommand)cmd);
             } else if (cmd instanceof SetStaticNatRulesCommand) {
-                return execute((SetStaticNatRulesCommand)cmd);
+                cfg = generateConfig((SetStaticNatRulesCommand)cmd);
             } else if (cmd instanceof LoadBalancerConfigCommand) {
-                return execute((LoadBalancerConfigCommand)cmd);
+                cfg = generateConfig((LoadBalancerConfigCommand)cmd);
             } else if (cmd instanceof SavePasswordCommand) {
-                return execute((SavePasswordCommand)cmd);
+                cfg = generateConfig((SavePasswordCommand)cmd);
             } else if (cmd instanceof DhcpEntryCommand) {
-                return execute((DhcpEntryCommand)cmd);
+                cfg = generateConfig((DhcpEntryCommand)cmd);
             } else if (cmd instanceof CreateIpAliasCommand) {
-                return execute((CreateIpAliasCommand)cmd);
+                cfg = generateConfig((CreateIpAliasCommand)cmd);
             } else if (cmd instanceof DnsMasqConfigCommand) {
-                return execute((DnsMasqConfigCommand)cmd);
+                cfg = generateConfig((DnsMasqConfigCommand)cmd);
             } else if (cmd instanceof DeleteIpAliasCommand) {
-                return execute((DeleteIpAliasCommand)cmd);
+                cfg = generateConfig((DeleteIpAliasCommand)cmd);
             } else if (cmd instanceof VmDataCommand) {
-                return execute((VmDataCommand)cmd);
-            } else if (cmd instanceof CheckRouterCommand) {
-                return execute((CheckRouterCommand)cmd);
+                cfg = generateConfig((VmDataCommand)cmd);
             } else if (cmd instanceof SetFirewallRulesCommand) {
-                return execute((SetFirewallRulesCommand)cmd);
+                cfg = generateConfig((SetFirewallRulesCommand)cmd);
             } else if (cmd instanceof BumpUpPriorityCommand) {
-                return execute((BumpUpPriorityCommand)cmd);
+                cfg = generateConfig((BumpUpPriorityCommand)cmd);
             } else if (cmd instanceof RemoteAccessVpnCfgCommand) {
-                return execute((RemoteAccessVpnCfgCommand)cmd);
+                cfg = generateConfig((RemoteAccessVpnCfgCommand)cmd);
             } else if (cmd instanceof VpnUsersCfgCommand) {
-                return execute((VpnUsersCfgCommand)cmd);
-            } else if (cmd instanceof GetDomRVersionCmd) {
-                return execute((GetDomRVersionCmd)cmd);
+                cfg = generateConfig((VpnUsersCfgCommand)cmd);
             } else if (cmd instanceof Site2SiteVpnCfgCommand) {
-                return execute((Site2SiteVpnCfgCommand)cmd);
-            } else if (cmd instanceof CheckS2SVpnConnectionsCommand) {
-                return execute((CheckS2SVpnConnectionsCommand)cmd);
+                cfg = generateConfig((Site2SiteVpnCfgCommand)cmd);
             } else if (cmd instanceof SetMonitorServiceCommand) {
-                return execute((SetMonitorServiceCommand)cmd);
+                cfg = generateConfig((SetMonitorServiceCommand)cmd);
             } else if (cmd instanceof SetupGuestNetworkCommand) {
-                return execute((SetupGuestNetworkCommand)cmd);
+                cfg = generateConfig((SetupGuestNetworkCommand)cmd);
             } else if (cmd instanceof SetNetworkACLCommand) {
-                return execute((SetNetworkACLCommand)cmd);
+                cfg = generateConfig((SetNetworkACLCommand)cmd);
             } else if (cmd instanceof SetSourceNatCommand) {
-                return execute((SetSourceNatCommand)cmd);
-            } else if (cmd instanceof IpAssocVpcCommand) {
-                return execute((IpAssocVpcCommand)cmd);
+                cfg = generateConfig((SetSourceNatCommand)cmd);
             } else if (cmd instanceof IpAssocCommand) {
-                return execute((IpAssocCommand)cmd);
+                cfg = generateConfig((IpAssocCommand)cmd);
             } else {
                 return Answer.createUnsupportedCommandAnswer(cmd);
             }
+
+            return applyConfig(cmd, cfg);
         } catch (final IllegalArgumentException e) {
             return new Answer(cmd, false, e.getMessage());
         } finally {
@@ -200,10 +199,22 @@ public class VirtualRoutingResource {
         private String script;
         private String args;
         private String info;
+        private String filePath;
+        private String fileName;
+        private String fileContents;
+        private boolean isFile;
 
         public ConfigItem(String script, String args) {
             this.script = script;
             this.args = args;
+            this.isFile = false;
+        }
+
+        public ConfigItem(String filePath, String fileName, String fileContents) {
+            this.filePath = filePath;
+            this.fileName = fileName;
+            this.fileContents = fileContents;
+            this.isFile = true;
         }
 
         public String getScript() {
@@ -229,15 +240,69 @@ public class VirtualRoutingResource {
         public void setInfo(String info) {
             this.info = info;
         }
+
+        public String getFilePath() {
+            return filePath;
+        }
+
+        public void setFilePath(String filePath) {
+            this.filePath = filePath;
+        }
+
+        public String getFileName() {
+            return fileName;
+        }
+
+        public void setFileName(String fileName) {
+            this.fileName = fileName;
+        }
+
+        public String getFileContents() {
+            return fileContents;
+        }
+
+        public void setFileContents(String fileContents) {
+            this.fileContents = fileContents;
+        }
+
+        public boolean isFile() {
+            return isFile;
+        }
+    }
+
+    private Answer executeQueryCommand(NetworkElementCommand cmd) {
+        if (cmd instanceof CheckRouterCommand) {
+            return execute((CheckRouterCommand)cmd);
+        } else if (cmd instanceof GetDomRVersionCmd) {
+            return execute((GetDomRVersionCmd)cmd);
+        } else if (cmd instanceof CheckS2SVpnConnectionsCommand) {
+            return execute((CheckS2SVpnConnectionsCommand)cmd);
+        } else {
+            s_logger.error("Unknown query command in VirtualRoutingResource!");
+            return Answer.createUnsupportedCommandAnswer(cmd);
+        }
+    }
+
+    private ExecutionResult applyConfigToVR(NetworkElementCommand cmd, ConfigItem c) {
+        if (c.isFile()) {
+            return _vrDeployer.createFileInVR(cmd.getRouterAccessIp(), c.getFilePath(), c.getFileName(), c.getFileContents());
+        } else {
+            return _vrDeployer.executeInVR(cmd.getRouterAccessIp(), c.getScript(), c.getArgs());
+        }
     }
 
     private Answer applyConfig(NetworkElementCommand cmd, List<ConfigItem> cfg) {
         int answersCount = cmd.getAnswersCount();
-        assert (cfg.size() <= answersCount) : "Why there are more commands than answers?";
 
-        if (cfg.size() == 1 && answersCount == 1) {
-            ConfigItem c = cfg.get(0);
-            ExecutionResult result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), c.getScript(), c.getArgs());
+        // Use the last answer as final answer
+        if (answersCount == 1) {
+            ExecutionResult result = new ExecutionResult(false, "Not executed");
+            for (ConfigItem c : cfg) {
+                result = applyConfigToVR(cmd, c);
+                if (!result.isSuccess()) {
+                    break;
+                }
+            }
             return new Answer(cmd, result.isSuccess(), result.getDetails());
         }
 
@@ -246,7 +311,7 @@ public class VirtualRoutingResource {
         boolean finalResult = true;
         int i = 0, j;
         for (ConfigItem c : cfg) {
-            results[i] = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), c.getScript(), c.getArgs());
+            results[i] = applyConfigToVR(cmd, c);
             if (c.getInfo() != null) {
                 if (results[i].isSuccess()) {
                     results[i].setDetails(c.getInfo() + " - success: " + results[i].getDetails());
@@ -287,11 +352,6 @@ public class VirtualRoutingResource {
         return cfg;
     }
 
-    private Answer execute(VpnUsersCfgCommand cmd) {
-        List<ConfigItem> cfg = generateConfig(cmd);
-        return applyConfig(cmd, cfg);
-    }
-
     private List<ConfigItem> generateConfig(RemoteAccessVpnCfgCommand cmd) {
         LinkedList<ConfigItem> cfg = new LinkedList<>();
         String args = "";
@@ -316,11 +376,6 @@ public class VirtualRoutingResource {
         return cfg;
     }
 
-    private Answer execute(RemoteAccessVpnCfgCommand cmd) {
-        List<ConfigItem> cfg = generateConfig(cmd);
-        return applyConfig(cmd, cfg);
-    }
-
     private List<ConfigItem> generateConfig(SetFirewallRulesCommand cmd) {
         LinkedList<ConfigItem> cfg = new LinkedList<>();
 
@@ -361,11 +416,6 @@ public class VirtualRoutingResource {
         return cfg;
     }
 
-    private Answer execute(SetFirewallRulesCommand cmd) {
-        List<ConfigItem> cfg = generateConfig(cmd);
-        return applyConfig(cmd, cfg);
-    }
-
     private List<ConfigItem> generateConfig(SetPortForwardingRulesCommand cmd) {
         LinkedList<ConfigItem> cfg = new LinkedList<>();
 
@@ -383,11 +433,6 @@ public class VirtualRoutingResource {
         return cfg;
     }
 
-    private Answer execute(SetPortForwardingRulesCommand cmd) {
-        List<ConfigItem> cfg = generateConfig(cmd);
-        return applyConfig(cmd, cfg);
-    }
-
     private List<ConfigItem> generateConfig(SetStaticNatRulesCommand cmd) {
         LinkedList<ConfigItem> cfg = new LinkedList<>();
         if (cmd.getVpcId() != null) {
@@ -419,16 +464,23 @@ public class VirtualRoutingResource {
         return cfg;
     }
 
-    private Answer execute(SetStaticNatRulesCommand cmd) {
-        List<ConfigItem> cfg = generateConfig(cmd);
-        return applyConfig(cmd, cfg);
-    }
-
     private List<ConfigItem> generateConfig(LoadBalancerConfigCommand cmd) {
         LinkedList<ConfigItem> cfg = new LinkedList<>();
 
         String routerIp = cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP);
         LoadBalancerConfigurator cfgtr = new HAProxyConfigurator();
+
+        String[] config = cfgtr.generateConfiguration(cmd);
+        String tmpCfgFileContents = "";
+        for (int i = 0; i < config.length; i++) {
+            tmpCfgFileContents += config[i];
+            tmpCfgFileContents += "\n";
+        }
+
+        String tmpCfgFilePath = "/etc/haproxy/";
+        String tmpCfgFileName = "haproxy.cfg.new";
+        cfg.add(new ConfigItem(tmpCfgFilePath, tmpCfgFileName, tmpCfgFileContents));
+
         String[][] rules = cfgtr.generateFwRules(cmd);
 
         String[] addRules = rules[LoadBalancerConfigurator.ADD];
@@ -473,37 +525,6 @@ public class VirtualRoutingResource {
         return cfg;
     }
 
-    private Answer execute(LoadBalancerConfigCommand cmd) {
-        String routerIp = cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP);
-
-        if (routerIp == null) {
-            return new Answer(cmd);
-        }
-
-        LoadBalancerConfigurator cfgtr = new HAProxyConfigurator();
-        String[] config = cfgtr.generateConfiguration(cmd);
-        String tmpCfgFileContents = "";
-        for (int i = 0; i < config.length; i++) {
-            tmpCfgFileContents += config[i];
-            tmpCfgFileContents += "\n";
-        }
-
-        String tmpCfgFilePath = "/etc/haproxy/";
-        String tmpCfgFileName = "haproxy.cfg.new";
-        ExecutionResult result = _vrDeployer.createFileInVR(cmd.getRouterAccessIp(), tmpCfgFilePath, tmpCfgFileName, tmpCfgFileContents);
-
-        if (!result.isSuccess()) {
-            return new Answer(cmd, false, "Fail to copy LB config file to VR");
-        }
-
-        List<ConfigItem> cfg = generateConfig(cmd);
-        ConfigItem c = cfg.get(0);
-        result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), c.getScript(), c.getArgs());
-
-        return new Answer(cmd, result.isSuccess(), result.getDetails());
-    }
-
-
     private List<ConfigItem> generateConfig(VmDataCommand cmd) {
         LinkedList<ConfigItem> cfg = new LinkedList<>();
         Map<String, List<String[]>> data = new HashMap<String, List<String[]>>();
@@ -520,11 +541,6 @@ public class VirtualRoutingResource {
         return cfg;
     }
 
-    protected Answer execute(VmDataCommand cmd) {
-        List<ConfigItem> cfg = generateConfig(cmd);
-        return applyConfig(cmd, cfg);
-    }
-
     private List<ConfigItem> generateConfig(SavePasswordCommand cmd) {
         LinkedList<ConfigItem> cfg = new LinkedList<>();
 
@@ -538,11 +554,6 @@ public class VirtualRoutingResource {
         return cfg;
     }
 
-    protected Answer execute(final SavePasswordCommand cmd) {
-        List<ConfigItem> cfg = generateConfig(cmd);
-        return applyConfig(cmd, cfg);
-    }
-
     private List<ConfigItem> generateConfig(DhcpEntryCommand cmd) {
         LinkedList<ConfigItem> cfg = new LinkedList<>();
 
@@ -577,11 +588,6 @@ public class VirtualRoutingResource {
         return cfg;
     }
 
-    protected Answer execute(final DhcpEntryCommand cmd) {
-        List<ConfigItem> cfg = generateConfig(cmd);
-        return applyConfig(cmd, cfg);
-    }
-
     private List<ConfigItem> generateConfig(CreateIpAliasCommand cmd) {
         LinkedList<ConfigItem> cfg = new LinkedList<>();
 
@@ -595,11 +601,6 @@ public class VirtualRoutingResource {
         return cfg;
     }
 
-    protected Answer execute(final CreateIpAliasCommand cmd) {
-        List<ConfigItem> cfg = generateConfig(cmd);
-        return applyConfig(cmd, cfg);
-    }
-
     private List<ConfigItem> generateConfig(DeleteIpAliasCommand cmd) {
         LinkedList<ConfigItem> cfg = new LinkedList<>();
 
@@ -619,11 +620,6 @@ public class VirtualRoutingResource {
         return cfg;
     }
 
-    protected Answer execute(final DeleteIpAliasCommand cmd) {
-        List<ConfigItem> cfg = generateConfig(cmd);
-        return applyConfig(cmd, cfg);
-    }
-
     private List<ConfigItem> generateConfig(DnsMasqConfigCommand cmd) {
         LinkedList<ConfigItem> cfg = new LinkedList<>();
 
@@ -637,11 +633,6 @@ public class VirtualRoutingResource {
         return cfg;
     }
 
-    protected Answer execute(final DnsMasqConfigCommand cmd) {
-        List<ConfigItem> cfg = generateConfig(cmd);
-        return applyConfig(cmd, cfg);
-    }
-
     private CheckS2SVpnConnectionsAnswer execute(CheckS2SVpnConnectionsCommand cmd) {
         String args = "";
         for (String ip : cmd.getVpnIps()) {
@@ -666,11 +657,6 @@ public class VirtualRoutingResource {
         return cfg;
     }
 
-    protected Answer execute(BumpUpPriorityCommand cmd) {
-        List<ConfigItem> cfg = generateConfig(cmd);
-        return applyConfig(cmd, cfg);
-    }
-
     protected Answer execute(GetDomRVersionCmd cmd) {
         final ExecutionResult result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), VRScripts.VERSION, null);
         if (!result.isSuccess()) {
@@ -732,11 +718,6 @@ public class VirtualRoutingResource {
         return cfg;
     }
 
-    protected Answer execute(Site2SiteVpnCfgCommand cmd) {
-        List<ConfigItem> cfg = generateConfig(cmd);
-        return applyConfig(cmd, cfg);
-    }
-
     protected List<ConfigItem> generateConfig(SetMonitorServiceCommand cmd) {
         LinkedList<ConfigItem> cfg = new LinkedList<>();
 
@@ -752,11 +733,6 @@ public class VirtualRoutingResource {
         return cfg;
     }
 
-    protected Answer execute(SetMonitorServiceCommand cmd) {
-        List<ConfigItem> cfg = generateConfig(cmd);
-        return applyConfig(cmd, cfg);
-    }
-
     protected List<ConfigItem> generateConfig(SetupGuestNetworkCommand cmd) {
         LinkedList<ConfigItem> cfg = new LinkedList<>();
 
@@ -797,11 +773,6 @@ public class VirtualRoutingResource {
         return cfg;
     }
 
-    protected Answer execute(SetupGuestNetworkCommand cmd) {
-        List<ConfigItem> cfg = generateConfig(cmd);
-        return applyConfig(cmd, cfg);
-    }
-
     protected List<ConfigItem> generateConfig(SetNetworkACLCommand cmd) {
         LinkedList<ConfigItem> cfg = new LinkedList<>();
 
@@ -836,11 +807,6 @@ public class VirtualRoutingResource {
         return cfg;
     }
 
-    private Answer execute(SetNetworkACLCommand cmd) {
-        List<ConfigItem> cfg = generateConfig(cmd);
-        return applyConfig(cmd, cfg);
-    }
-
     protected List<ConfigItem> generateConfig(SetSourceNatCommand cmd) {
         LinkedList<ConfigItem> cfg = new LinkedList<>();
 
@@ -856,11 +822,6 @@ public class VirtualRoutingResource {
         return cfg;
     }
 
-    protected Answer execute(SetSourceNatCommand cmd) {
-        List<ConfigItem> cfg = generateConfig(cmd);
-        return applyConfig(cmd, cfg);
-    }
-
     protected List<ConfigItem> generateConfig(SetPortForwardingRulesVpcCommand cmd) {
         LinkedList<ConfigItem> cfg = new LinkedList<>();
 
@@ -878,16 +839,6 @@ public class VirtualRoutingResource {
         return cfg;
     }
 
-    private Answer execute(SetPortForwardingRulesVpcCommand cmd) {
-        List<ConfigItem> cfg = generateConfig(cmd);
-        return applyConfig(cmd, cfg);
-    }
-
-    public Answer execute(IpAssocVpcCommand cmd) {
-        List<ConfigItem> cfg = generateConfig(cmd);
-        return applyConfig(cmd, cfg);
-    }
-
     protected List<ConfigItem> generateConfig(SetStaticRouteCommand cmd) {
         LinkedList<ConfigItem> cfg = new LinkedList<>();
 
@@ -905,11 +856,6 @@ public class VirtualRoutingResource {
         return cfg;
     }
 
-    private Answer execute(SetStaticRouteCommand cmd) {
-        List<ConfigItem> cfg = generateConfig(cmd);
-        return applyConfig(cmd, cfg);
-    }
-
     protected List<ConfigItem> generateConfig(IpAssocCommand cmd) {
         LinkedList<ConfigItem> cfg = new LinkedList<>();
         ConfigItem c;
@@ -989,11 +935,6 @@ public class VirtualRoutingResource {
         return cfg;
     }
 
-    public Answer execute(IpAssocCommand cmd) {
-        List<ConfigItem> cfg = generateConfig(cmd);
-        return applyConfig(cmd, cfg);
-    }
-
     public boolean configure(final String name, final Map<String, Object> params) throws ConfigurationException {
         _name = name;
 


[4/7] git commit: updated refs/heads/master to 3bbbda8

Posted by ya...@apache.org.
CLOUDSTACK-6047: Introduce GroupedAnswer

In some cases, Network Element need multiple answer in one, then introduced e.g.
IpAssocAnswer, SetFirewallAnswer, etc. But in fact they are basically the same.

So introduce GroupedAnswer for them.


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

Branch: refs/heads/master
Commit: 43b414416c7d25945079d0c105343d83455146f3
Parents: ebf7ee4
Author: Sheng Yang <sh...@citrix.com>
Authored: Wed Feb 19 19:12:07 2014 -0800
Committer: Sheng Yang <sh...@citrix.com>
Committed: Wed Feb 19 19:47:04 2014 -0800

----------------------------------------------------------------------
 .../cloud/agent/api/routing/GroupAnswer.java    | 40 +++++++++++++
 .../virtualnetwork/VirtualRoutingResource.java  | 59 ++++++++++----------
 2 files changed, 71 insertions(+), 28 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/43b41441/core/src/com/cloud/agent/api/routing/GroupAnswer.java
----------------------------------------------------------------------
diff --git a/core/src/com/cloud/agent/api/routing/GroupAnswer.java b/core/src/com/cloud/agent/api/routing/GroupAnswer.java
new file mode 100644
index 0000000..0917a7b
--- /dev/null
+++ b/core/src/com/cloud/agent/api/routing/GroupAnswer.java
@@ -0,0 +1,40 @@
+// 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;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.Command;
+
+public class GroupAnswer extends Answer {
+    String[] results;
+
+    protected GroupAnswer() {
+        super();
+    }
+
+    public GroupAnswer(Command cmd, boolean success, int rulesCount, String[] results) {
+        super(cmd, success, null);
+
+        assert (rulesCount == results.length) : "Results' count should match requests' count!";
+        this.results = results;
+    }
+
+    String[] getResults() {
+        return results;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/43b41441/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 faa826a..f66b030 100755
--- a/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java
+++ b/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java
@@ -29,26 +29,21 @@ 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.GroupAnswer;
 import com.cloud.agent.api.routing.IpAliasTO;
-import com.cloud.agent.api.routing.IpAssocAnswer;
 import com.cloud.agent.api.routing.IpAssocCommand;
 import com.cloud.agent.api.routing.IpAssocVpcCommand;
 import com.cloud.agent.api.routing.LoadBalancerConfigCommand;
 import com.cloud.agent.api.routing.NetworkElementCommand;
 import com.cloud.agent.api.routing.RemoteAccessVpnCfgCommand;
 import com.cloud.agent.api.routing.SavePasswordCommand;
-import com.cloud.agent.api.routing.SetFirewallRulesAnswer;
 import com.cloud.agent.api.routing.SetFirewallRulesCommand;
 import com.cloud.agent.api.routing.SetMonitorServiceCommand;
-import com.cloud.agent.api.routing.SetNetworkACLAnswer;
 import com.cloud.agent.api.routing.SetNetworkACLCommand;
-import com.cloud.agent.api.routing.SetPortForwardingRulesAnswer;
 import com.cloud.agent.api.routing.SetPortForwardingRulesCommand;
 import com.cloud.agent.api.routing.SetPortForwardingRulesVpcCommand;
 import com.cloud.agent.api.routing.SetSourceNatCommand;
-import com.cloud.agent.api.routing.SetStaticNatRulesAnswer;
 import com.cloud.agent.api.routing.SetStaticNatRulesCommand;
-import com.cloud.agent.api.routing.SetStaticRouteAnswer;
 import com.cloud.agent.api.routing.SetStaticRouteCommand;
 import com.cloud.agent.api.routing.Site2SiteVpnCfgCommand;
 import com.cloud.agent.api.routing.VmDataCommand;
@@ -337,11 +332,12 @@ public class VirtualRoutingResource {
     }
 
     private Answer execute(SetFirewallRulesCommand cmd) {
-        String[] results = new String[cmd.getRules().length];
+        int rulesCount = cmd.getRules().length;
+        String[] results = new String[rulesCount];
         String routerAccessIp = cmd.getRouterAccessIp();
 
         if (routerAccessIp == null) {
-            return new SetFirewallRulesAnswer(cmd, false, results);
+            return new GroupAnswer(cmd, false, rulesCount, results);
         }
 
         List<ConfigItem> cfg = generateConfig(cmd);
@@ -353,9 +349,9 @@ public class VirtualRoutingResource {
             for (int i = 0; i < results.length; i++) {
                 results[i] = "Failed: " + result.getDetails();
             }
-            return new SetFirewallRulesAnswer(cmd, false, results);
+            return new GroupAnswer(cmd, false, rulesCount, results);
         }
-        return new SetFirewallRulesAnswer(cmd, true, results);
+        return new GroupAnswer(cmd, true, rulesCount, results);
 
     }
 
@@ -377,7 +373,8 @@ public class VirtualRoutingResource {
     }
 
     private Answer execute(SetPortForwardingRulesCommand cmd) {
-        String[] results = new String[cmd.getRules().length];
+        int rulesCount = cmd.getRules().length;
+        String[] results = new String[rulesCount];
         int i = 0;
         boolean endResult = true;
         List<ConfigItem> cfg = generateConfig(cmd);
@@ -393,7 +390,7 @@ public class VirtualRoutingResource {
             }
         }
 
-        return new SetPortForwardingRulesAnswer(cmd, results, endResult);
+        return new GroupAnswer(cmd, endResult, rulesCount, results);
     }
 
     private List<ConfigItem> generateConfig(SetStaticNatRulesCommand cmd) {
@@ -427,7 +424,7 @@ public class VirtualRoutingResource {
         return cfg;
     }
 
-    private SetStaticNatRulesAnswer execute(SetStaticNatRulesCommand cmd) {
+    private GroupAnswer execute(SetStaticNatRulesCommand cmd) {
         String[] results = new String[cmd.getRules().length];
         int i = 0;
         boolean endResult = true;
@@ -444,7 +441,7 @@ public class VirtualRoutingResource {
             }
         }
 
-        return new SetStaticNatRulesAnswer(cmd, results, endResult);
+        return new GroupAnswer(cmd, endResult, cmd.getRules().length, results);
     }
 
     private List<ConfigItem> generateConfig(LoadBalancerConfigCommand cmd) {
@@ -859,8 +856,9 @@ public class VirtualRoutingResource {
         return cfg;
     }
 
-    private SetNetworkACLAnswer execute(SetNetworkACLCommand cmd) {
-        String[] results = new String[cmd.getRules().length];
+    private GroupAnswer execute(SetNetworkACLCommand cmd) {
+        int rulesCount = cmd.getRules().length;
+        String[] results = new String[rulesCount];
 
         List<ConfigItem> cfg = generateConfig(cmd);
         ConfigItem c = cfg.get(0);
@@ -870,10 +868,10 @@ public class VirtualRoutingResource {
             for (int i = 0; i < results.length; i++) {
                 results[i] = "Failed";
             }
-            return new SetNetworkACLAnswer(cmd, false, results);
+            return new GroupAnswer(cmd, false, rulesCount, results);
         }
 
-        return new SetNetworkACLAnswer(cmd, true, results);
+        return new GroupAnswer(cmd, true, rulesCount, results);
     }
 
     protected List<ConfigItem> generateConfig(SetSourceNatCommand cmd) {
@@ -913,7 +911,7 @@ public class VirtualRoutingResource {
         return cfg;
     }
 
-    private SetPortForwardingRulesAnswer execute(SetPortForwardingRulesVpcCommand cmd) {
+    private GroupAnswer execute(SetPortForwardingRulesVpcCommand cmd) {
         String[] results = new String[cmd.getRules().length];
         int i = 0;
 
@@ -929,10 +927,11 @@ public class VirtualRoutingResource {
                 results[i++] = null;
             }
         }
-        return new SetPortForwardingRulesAnswer(cmd, results, endResult);
+        return new GroupAnswer(cmd, endResult, cmd.getRules().length, results);
     }
 
-    public IpAssocAnswer execute(IpAssocVpcCommand cmd) {
+    public GroupAnswer execute(IpAssocVpcCommand cmd) {
+        boolean finalResult = true;
         String[] results = new String[cmd.getIpAddresses().length];
         for (int i = 0; i < cmd.getIpAddresses().length; i ++) {
             results[i] = "Failed";
@@ -944,12 +943,13 @@ public class VirtualRoutingResource {
             ExecutionResult result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), c.getScript(), c.getArgs());
             if (!result.isSuccess()) {
                 results[i++] = c.getInfo() + " failed: " + result.getDetails();
+                finalResult = false;
                 break;
             }
 
             results[i++] = c.getInfo() + " - success ";
         }
-        return new IpAssocAnswer(cmd, results);
+        return new GroupAnswer(cmd, finalResult, cmd.getIpAddresses().length, results);
     }
 
     protected List<ConfigItem> generateConfig(SetStaticRouteCommand cmd) {
@@ -969,8 +969,9 @@ public class VirtualRoutingResource {
         return cfg;
     }
 
-    private SetStaticRouteAnswer execute(SetStaticRouteCommand cmd) {
-        String[] results = new String[cmd.getStaticRoutes().length];
+    private GroupAnswer execute(SetStaticRouteCommand cmd) {
+        int rulesCount = cmd.getStaticRoutes().length;
+        String[] results = new String[rulesCount];
 
         List<ConfigItem> cfg = generateConfig(cmd);
         ConfigItem c = cfg.get(0);
@@ -980,10 +981,10 @@ public class VirtualRoutingResource {
             for (int i = 0; i < results.length; i++) {
                 results[i] = "Failed";
             }
-            return new SetStaticRouteAnswer(cmd, false, results);
+            return new GroupAnswer(cmd, false, rulesCount, results);
         }
 
-        return new SetStaticRouteAnswer(cmd, true, results);
+        return new GroupAnswer(cmd, true, rulesCount, results);
     }
 
     protected List<ConfigItem> generateConfig(IpAssocCommand cmd) {
@@ -1066,9 +1067,10 @@ public class VirtualRoutingResource {
     }
 
     public Answer execute(IpAssocCommand cmd) {
+        boolean finalResult = true;
         String[] results = new String[cmd.getIpAddresses().length];
         for (int i = 0; i < results.length; i++) {
-            results[i] = IpAssocAnswer.errorResult;
+            results[i] = "Failed";
         }
 
         int i = 0;
@@ -1079,10 +1081,11 @@ public class VirtualRoutingResource {
                 results[i++] = c.getInfo() + " - success";
             } else {
                 results[i++] = c.getInfo() + " - failed:" + result.getDetails();
+                finalResult = false;
                 break;
             }
         }
-        return new IpAssocAnswer(cmd, results);
+        return new GroupAnswer(cmd, finalResult, cmd.getIpAddresses().length, results);
     }
 
     public boolean configure(final String name, final Map<String, Object> params) throws ConfigurationException {