You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by mu...@apache.org on 2014/01/28 10:26:33 UTC

[02/17] git commit: updated refs/heads/regionvpc to cf18fe1

CLOUDSTACK-5779: Generalize calling to execute or create file for Xen


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

Branch: refs/heads/regionvpc
Commit: 2d100f1269e44de927be32faed32e31c62afa57b
Parents: 417b8e0
Author: Sheng Yang <sh...@citrix.com>
Authored: Fri Jan 24 14:54:11 2014 -0800
Committer: Sheng Yang <sh...@citrix.com>
Committed: Fri Jan 24 18:27:55 2014 -0800

----------------------------------------------------------------------
 .../virtualnetwork/VirtualRoutingResource.java  |  58 +++---
 .../vmware/resource/VmwareResource.java         |  38 ++--
 .../xen/resource/CitrixResourceBase.java        | 206 ++++++++++---------
 .../xen/resource/XenServer56Resource.java       |  44 ++--
 scripts/vm/hypervisor/xenserver/vmops           |  15 +-
 utils/src/com/cloud/utils/ExecutionResult.java  |  44 ++++
 6 files changed, 221 insertions(+), 184 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2d100f12/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 732d7b4..b27ed55 100755
--- a/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java
+++ b/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java
@@ -177,7 +177,7 @@ public class VirtualRoutingResource implements Manager {
                 args += "-u ";
                 args += userpwd.getUsernamePassword();
             }
-            String result = routerProxy("vpn_l2tp.sh", cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP), args);
+            String result = executeInVR(cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP), "vpn_l2tp.sh", args);
             if (result != null) {
                 return new Answer(cmd, false, "Configure VPN user failed for user " + userpwd.getUsername());
             }
@@ -204,7 +204,7 @@ public class VirtualRoutingResource implements Manager {
         }
         args += " -C " + cmd.getLocalCidr();
         args += " -i " + cmd.getPublicInterface();
-        String result = routerProxy("vpn_l2tp.sh", cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP), args);
+        String result = executeInVR(cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP), "vpn_l2tp.sh", args);
         if (result != null) {
             return new Answer(cmd, false, "Configure VPN failed");
         }
@@ -252,9 +252,9 @@ public class VirtualRoutingResource implements Manager {
         String result = null;
 
         if (trafficType == FirewallRule.TrafficType.Egress) {
-            result = routerProxy("firewall_egress.sh", routerIp, args);
+            result = executeInVR(routerIp, "firewall_egress.sh", args);
         } else {
-            result = routerProxy("firewall_ingress.sh", routerIp, args);
+            result = executeInVR(routerIp, "firewall_ingress.sh", args);
         }
 
         if (result != null) {
@@ -278,7 +278,7 @@ public class VirtualRoutingResource implements Manager {
             args.append(" -r ").append(rule.getDstIp());
             args.append(" -d ").append(rule.getStringDstPortRange());
 
-            String result = routerProxy("firewall_nat.sh", routerIp, args.toString());
+            String result = executeInVR(routerIp, "firewall_nat.sh", args.toString());
 
             if (result == null || result.isEmpty()) {
                 results[i++] = "Failed";
@@ -302,7 +302,7 @@ public class VirtualRoutingResource implements Manager {
             args += " -l " + rule.getSrcIp();
             args += " -r " + rule.getDstIp();
 
-            String result = routerProxy("vpc_staticnat.sh", routerIp, args);
+            String result = executeInVR(routerIp, "vpc_staticnat.sh", args);
 
             if (result == null) {
                 results[i++] = null;
@@ -337,7 +337,7 @@ public class VirtualRoutingResource implements Manager {
             args.append(" -d ").append(rule.getStringSrcPortRange());
             args.append(" -G ");
 
-            String result = routerProxy("firewall_nat.sh", routerIp, args.toString());
+            String result = executeInVR(routerIp, "firewall_nat.sh", args.toString());
 
             if (result == null || result.isEmpty()) {
                 results[i++] = "Failed";
@@ -420,10 +420,10 @@ public class VirtualRoutingResource implements Manager {
 
             if (cmd.getVpcId() == null) {
                 args = " -i " + routerIp + args;
-                result = routerProxy("loadbalancer.sh", routerIp, args);
+                result = executeInVR(routerIp, "loadbalancer.sh", args);
             } else {
                 args = " -i " + cmd.getNic().getIp() + args;
-                result = routerProxy("vpc_loadbalancer.sh", routerIp, args);
+                result = executeInVR(routerIp, "vpc_loadbalancer.sh", args);
             }
 
             if (result != null) {
@@ -449,7 +449,7 @@ public class VirtualRoutingResource implements Manager {
 
         String args = "-d " + json;
 
-        final String result = routerProxy("vmdata.py", routerIp, args);
+        final String result = executeInVR(routerIp, "vmdata.py", args);
         if (result != null) {
             return new Answer(cmd, false, "VmDataCommand failed, check agent logs");
         }
@@ -485,7 +485,7 @@ public class VirtualRoutingResource implements Manager {
         String args = "-v " + vmIpAddress;
         args += " -p " + password;
 
-        String result = routerProxy("savepassword.sh", routerPrivateIPAddress, args);
+        String result = executeInVR(routerPrivateIPAddress, "savepassword.sh", args);
         if (result != null) {
             return new Answer(cmd, false, "Unable to save password to DomR.");
         }
@@ -520,7 +520,7 @@ public class VirtualRoutingResource implements Manager {
             args += " -N";
         }
 
-        final String result = routerProxy("edithosts.sh", cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP), args);
+        final String result = executeInVR(cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP), "edithosts.sh", args);
         return new Answer(cmd, result == null, result);
     }
 
@@ -531,7 +531,7 @@ public class VirtualRoutingResource implements Manager {
         for (IpAliasTO ipaliasto : ipAliasTOs) {
             args = args + ipaliasto.getAlias_count() + ":" + ipaliasto.getRouterip() + ":" + ipaliasto.getNetmask() + "-";
         }
-        final String result = routerProxy("createipAlias.sh", routerIp, args);
+        final String result = executeInVR(routerIp, "createipAlias.sh", args);
         return new Answer(cmd, result == null, result);
     }
 
@@ -547,7 +547,7 @@ public class VirtualRoutingResource implements Manager {
         for (IpAliasTO ipAliasTO : activeIpAliasTOs) {
             args = args + ipAliasTO.getAlias_count() + ":" + ipAliasTO.getRouterip() + ":" + ipAliasTO.getNetmask() + "-";
         }
-        final String result = routerProxy("deleteipAlias.sh", routerIp, args);
+        final String result = executeInVR(routerIp, "deleteipAlias.sh", args);
         return new Answer(cmd, result == null, result);
     }
 
@@ -558,7 +558,7 @@ public class VirtualRoutingResource implements Manager {
         for (DhcpTO dhcpTo : dhcpTos) {
             args = args + dhcpTo.getRouterIp() + ":" + dhcpTo.getGateway() + ":" + dhcpTo.getNetmask() + ":" + dhcpTo.getStartIpOfSubnet() + "-";
         }
-        final String result = routerProxy("dnsmasq.sh", routerIp, args);
+        final String result = executeInVR(routerIp, "dnsmasq.sh", args);
         return new Answer(cmd, result == null, result);
     }
 
@@ -589,14 +589,14 @@ public class VirtualRoutingResource implements Manager {
             args += " " + ip;
         }
 
-        final String result = routerProxy("checkbatchs2svpn.sh", routerIP, args);
+        final String result = executeInVR(routerIP, "checkbatchs2svpn.sh", args);
         if (result == null || result.isEmpty()) {
             return new CheckS2SVpnConnectionsAnswer(cmd, false, "CheckS2SVpnConneciontsCommand failed");
         }
         return new CheckS2SVpnConnectionsAnswer(cmd, true, result);
     }
 
-    public String routerProxy(String script, String routerIP, String args) {
+    public String executeInVR(String routerIP, String script, String args) {
         final Script command = new Script(_routerProxyPath, _timeout, s_logger);
         command.add(script);
         command.add(routerIP);
@@ -617,7 +617,7 @@ public class VirtualRoutingResource implements Manager {
     }
 
     protected Answer execute(BumpUpPriorityCommand cmd) {
-        String result = routerProxy("bumpup_priority.sh", cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP), null);
+        String result = executeInVR(cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP), "bumpup_priority.sh", null);
         if (result != null) {
             return new Answer(cmd, false, "BumpUpPriorityCommand failed due to " + result);
         }
@@ -692,7 +692,7 @@ public class VirtualRoutingResource implements Manager {
             args += " -N ";
             args += cmd.getPeerGuestCidrList();
         }
-        String result = routerProxy("ipsectunnel.sh", cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP), args);
+        String result = executeInVR(cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP), "ipsectunnel.sh", args);
         if (result != null) {
             return new Answer(cmd, false, "Configure site to site VPN failed due to " + result);
         }
@@ -740,7 +740,7 @@ public class VirtualRoutingResource implements Manager {
     public String configureMonitor(final String routerIP, final String config) {
 
         String args = " -c " + config;
-        return routerProxy("monitor_service.sh", routerIP, args);
+        return executeInVR(routerIP, "monitor_service.sh", args);
     }
 
     public String assignGuestNetwork(final String dev, final String routerIP, final String routerGIP, final String gateway, final String cidr, final String netmask,
@@ -758,19 +758,19 @@ public class VirtualRoutingResource implements Manager {
         if (domainName != null && !domainName.isEmpty()) {
             args += " -e " + domainName;
         }
-        return routerProxy("vpc_guestnw.sh", routerIP, args);
+        return executeInVR(routerIP, "vpc_guestnw.sh", args);
     }
 
     public String assignNetworkACL(final String routerIP, final String dev, final String routerGIP, final String netmask, final String rule, String privateGw) {
         String args = " -d " + dev;
         if (privateGw != null) {
             args += " -a " + rule;
-            return routerProxy("vpc_privategw_acl.sh", routerIP, args);
+            return executeInVR(routerIP, "vpc_privategw_acl.sh", args);
         } else {
             args += " -i " + routerGIP;
             args += " -m " + netmask;
             args += " -a " + rule;
-            return routerProxy("vpc_acl.sh", routerIP, args);
+            return executeInVR(routerIP, "vpc_acl.sh", args);
         }
     }
 
@@ -780,7 +780,7 @@ public class VirtualRoutingResource implements Manager {
         args += pubIP;
         args += " -c ";
         args += dev;
-        return routerProxy("vpc_snat.sh", routerIP, args);
+        return executeInVR(routerIP, "vpc_snat.sh", args);
     }
 
     private SetPortForwardingRulesAnswer execute(SetPortForwardingRulesVpcCommand cmd) {
@@ -797,7 +797,7 @@ public class VirtualRoutingResource implements Manager {
             args += " -r " + rule.getDstIp();
             args += " -d " + rule.getStringDstPortRange().replace(":", "-");
 
-            String result = routerProxy("vpc_portforwarding.sh", routerIp, args);
+            String result = executeInVR(routerIp, "vpc_portforwarding.sh", args);
 
             if (result != null) {
                 results[i++] = "Failed";
@@ -833,7 +833,7 @@ public class VirtualRoutingResource implements Manager {
         args += " -n ";
         args += subnet;
 
-        String result = routerProxy("vpc_ipassoc.sh", routerIP, args);
+        String result = executeInVR(routerIP, "vpc_ipassoc.sh", args);
         if (result != null) {
             throw new InternalErrorException("KVM plugin \"vpc_ipassoc\" failed:" + result);
         }
@@ -841,7 +841,7 @@ public class VirtualRoutingResource implements Manager {
             snatArgs += " -l " + pubIP;
             snatArgs += " -c " + nicname;
 
-            result = routerProxy("vpc_privateGateway.sh", routerIP, snatArgs);
+            result = executeInVR(routerIP, "vpc_privateGateway.sh", snatArgs);
             if (result != null) {
                 throw new InternalErrorException("KVM plugin \"vpc_privateGateway\" failed:" + result);
             }
@@ -862,7 +862,7 @@ public class VirtualRoutingResource implements Manager {
             }
 
             String args = " -a " + sb.toString();
-            String result = routerProxy("vpc_staticroute.sh", routerIP, args);
+            String result = executeInVR(routerIP, "vpc_staticroute.sh", args);
 
             if (result != null) {
                 for (int i = 0; i < results.length; i++) {
@@ -923,7 +923,7 @@ public class VirtualRoutingResource implements Manager {
             args += " -n";
         }
 
-        return routerProxy("ipassoc.sh", privateIpAddress, args);
+        return executeInVR(privateIpAddress, "ipassoc.sh", args);
     }
 
     private void deleteBridge(String brName) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2d100f12/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 a6baa02..982031b 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
@@ -1954,6 +1954,19 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
         return new IpAssocAnswer(cmd, results);
     }
 
+    protected Pair<Boolean, String> executeInVR(String script, String routerIP, String args) {
+        Pair<Boolean, String> result;
+        try {
+            VmwareManager mgr = getServiceContext().getStockObject(VmwareManager.CONTEXT_STOCK_NAME);
+            result = SshHelper.sshExecute(routerIP, DefaultDomRSshPort, "root", mgr.getSystemVMKeyFile(), null, "/opt/cloud/bin/" + script + " " + args);
+        } catch (Exception e) {
+            String msg = "Command failed due to " + VmwareHelper.getExceptionMessage(e);
+            s_logger.error(msg);
+            result = new Pair<Boolean, String>(false, msg);
+        }
+        return result;
+    }
+
     protected Answer execute(SavePasswordCommand cmd) {
         if (s_logger.isInfoEnabled()) {
 
@@ -1975,27 +1988,12 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
 
         args += " -p " + password;
 
-        try {
-            VmwareManager mgr = getServiceContext().getStockObject(VmwareManager.CONTEXT_STOCK_NAME);
-            Pair<Boolean, String> result =
-                    SshHelper.sshExecute(controlIp, DefaultDomRSshPort, "root", mgr.getSystemVMKeyFile(), null, "/opt/cloud/bin/savepassword.sh " + args);
-
-            if (!result.first()) {
-                s_logger.error("savepassword command on domain router " + controlIp + " failed, message: " + result.second());
-
-                return new Answer(cmd, false, "SavePassword failed due to " + result.second());
-            }
-
-            if (s_logger.isInfoEnabled()) {
-                s_logger.info("savepassword command on domain router " + controlIp + " completed");
-            }
-
-        } catch (Throwable e) {
-            String msg = "SavePasswordCommand failed due to " + VmwareHelper.getExceptionMessage(e);
-            s_logger.error(msg, e);
-            return new Answer(cmd, false, msg);
+        Pair<Boolean, String> result = executeInVR("savepassword.sh", controlIp, args);
+        if (!result.first()) {
+            s_logger.error("savepassword command on domain router " + controlIp + " failed, message: " + result.second());
+            return new Answer(cmd, false, "SavePassword failed due to " + result.second());
         }
-        return new Answer(cmd);
+    return new Answer(cmd);
     }
 
     protected Answer execute(DhcpEntryCommand cmd) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2d100f12/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 811d056..05311b8 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
@@ -264,6 +264,7 @@ import com.cloud.storage.resource.StorageSubsystemCommandHandler;
 import com.cloud.storage.resource.StorageSubsystemCommandHandlerBase;
 import com.cloud.storage.template.TemplateProp;
 import com.cloud.template.VirtualMachineTemplate.BootloaderType;
+import com.cloud.utils.ExecutionResult;
 import com.cloud.utils.NumbersUtil;
 import com.cloud.utils.Pair;
 import com.cloud.utils.StringUtils;
@@ -614,12 +615,21 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
         }
     }
 
-    public String routerProxy(String script, String routerIP, String args) {
+    public ExecutionResult executeInVR(String routerIP, String script, String args) {
         Connection conn = getConnection();
-        String proxyArgs = script + " " + routerIP + " " + args;
-        return callHostPlugin(conn, "vmops", "routerProxy", "args", proxyArgs);
+        String rc = callHostPlugin(conn, "vmops", "routerProxy", "args", script + " " + routerIP + " " + args);
+        // Fail case would be start with "fail#"
+        return new ExecutionResult(rc.startsWith("succ#"), rc.substring(5));
     }
 
+    protected ExecutionResult createFileInVR(String routerIp, String path, String content) {
+        Connection conn = getConnection();
+        String rc = callHostPlugin(conn, "vmops", "createFileInDomr", "domrip", routerIp, "filepath", path, "filecontents", content);
+        // Fail case would be start with "fail#"
+        return new ExecutionResult(rc.startsWith("succ#"), rc.substring(5));
+    }
+
+
     private Answer execute(PerformanceMonitorCommand cmd) {
         Connection conn = getConnection();
         String perfMon = getPerfMon(conn, cmd.getParams(), cmd.getWait());
@@ -1968,31 +1978,31 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
         for (String ip : cmd.getVpnIps()) {
             args += ip + " ";
         }
-        String result = routerProxy("checkbatchs2svpn.sh", cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP), args);
-        if (result == null || result.isEmpty()) {
+        ExecutionResult result = executeInVR(cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP), "checkbatchs2svpn.sh", args);
+        if (!result.isSuccess()) {
             return new CheckS2SVpnConnectionsAnswer(cmd, false, "CheckS2SVpnConneciontsCommand failed");
         }
-        return new CheckS2SVpnConnectionsAnswer(cmd, true, result);
+        return new CheckS2SVpnConnectionsAnswer(cmd, true, result.getDetails());
     }
 
     private CheckRouterAnswer execute(CheckRouterCommand cmd) {
-        String result = routerProxy("checkrouter.sh", cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP), null);
-        if (result == null || result.isEmpty()) {
+        ExecutionResult result = executeInVR(cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP), "checkrouter.sh", null);
+        if (!result.isSuccess()) {
             return new CheckRouterAnswer(cmd, "CheckRouterCommand failed");
         }
-        return new CheckRouterAnswer(cmd, result, true);
+        return new CheckRouterAnswer(cmd, result.getDetails(), true);
     }
 
     private GetDomRVersionAnswer execute(GetDomRVersionCmd cmd) {
-        String result = routerProxy("get_template_version.sh", cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP), null);
-        if (result == null || result.isEmpty()) {
+        ExecutionResult result = executeInVR(cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP), "get_template_version.sh", null);
+        if (!result.isSuccess()) {
             return new GetDomRVersionAnswer(cmd, "getDomRVersionCmd failed");
         }
-        String[] lines = result.split("&");
+        String[] lines = result.getDetails().split("&");
         if (lines.length != 2) {
-            return new GetDomRVersionAnswer(cmd, result);
+            return new GetDomRVersionAnswer(cmd, result.getDetails());
         }
-        return new GetDomRVersionAnswer(cmd, result, lines[0], lines[1]);
+        return new GetDomRVersionAnswer(cmd, result.getDetails(), lines[0], lines[1]);
     }
 
     private Answer execute(BumpUpPriorityCommand cmd) {
@@ -2032,7 +2042,6 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
 
     protected SetPortForwardingRulesAnswer execute(SetPortForwardingRulesCommand cmd) {
         getConnection();
-
         String routerIp = cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP);
         String[] results = new String[cmd.getRules().length];
         int i = 0;
@@ -2047,10 +2056,10 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
             args.append(" -r ").append(rule.getDstIp());
             args.append(" -d ").append(rule.getStringDstPortRange());
 
-            String result = routerProxy("firewall_nat.sh", routerIp, args.toString());
+            ExecutionResult result = executeInVR(routerIp, "firewall_nat.sh", args.toString());
 
-            if (result == null || result.isEmpty()) {
-                results[i++] = "Failed";
+            if (!result.isSuccess()) {
+                results[i++] = "Failed: " + result.getDetails();
                 endResult = false;
             } else {
                 results[i++] = null;
@@ -2069,10 +2078,10 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
             String args = rule.revoked() ? "-D" : "-A";
             args += " -l " + rule.getSrcIp();
             args += " -r " + rule.getDstIp();
-            String result = routerProxy("vpc_staticnat.sh", cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP), args);
+            ExecutionResult result = executeInVR(cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP), "vpc_staticnat.sh", args);
 
-            if (result == null || result.isEmpty()) {
-                results[i++] = "Failed";
+            if (!result.isSuccess()) {
+                results[i++] = "Failed: " + result.getDetails();
                 endResult = false;
             } else {
                 results[i++] = null;
@@ -2105,10 +2114,10 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
             args.append(" -d ").append(rule.getStringSrcPortRange());
             args.append(" -G ");
 
-            String result = routerProxy("firewall_nat.sh", routerIp, args.toString());
+            ExecutionResult result = executeInVR(routerIp, "firewall_nat.sh", args.toString());
 
-            if (result == null || result.isEmpty()) {
-                results[i++] = "Failed";
+            if (!result.isSuccess()) {
+                results[i++] = "Failed:" + result.getDetails();
                 endResult = false;
             } else {
                 results[i++] = null;
@@ -2125,9 +2134,9 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
         for (IpAliasTO ipaliasto : ipAliasTOs) {
             args = args + ipaliasto.getAlias_count() + ":" + ipaliasto.getRouterip() + ":" + ipaliasto.getNetmask() + "-";
         }
-        String result = routerProxy("createipAlias.sh", routerIp, args);
-        if (result == null || result.isEmpty()) {
-            return new Answer(cmd, false, "CreateIPAliasCommand failed\n");
+        ExecutionResult result = executeInVR(routerIp, "createipAlias.sh", args);
+        if (!result.isSuccess()) {
+            return new Answer(cmd, false, "CreateIPAliasCommand failed due to " + result.getDetails());
         }
 
         return new Answer(cmd);
@@ -2146,9 +2155,9 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
         for (IpAliasTO ipAliasTO : activeIpAliasTOs) {
             args = args + ipAliasTO.getAlias_count() + ":" + ipAliasTO.getRouterip() + ":" + ipAliasTO.getNetmask() + "-";
         }
-        String result = routerProxy("deleteipAlias", routerIp, args);
-        if (result == null || result.isEmpty()) {
-            return new Answer(cmd, false, "DeleteipAliasCommand failed\n");
+        ExecutionResult result = executeInVR(routerIp, "deleteipAlias", args);
+        if (!result.isSuccess()) {
+            return new Answer(cmd, false, "DeleteipAliasCommand failed due to " + result.getDetails());
         }
 
         return new Answer(cmd);
@@ -2162,19 +2171,13 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
             args = args + dhcpTo.getRouterIp() + ":" + dhcpTo.getGateway() + ":" + dhcpTo.getNetmask() + ":" + dhcpTo.getStartIpOfSubnet() + "-";
         }
 
-        String result = routerProxy("dnsmasq.sh", routerIp, args);
+        ExecutionResult result = executeInVR(routerIp, "dnsmasq.sh", args);
 
-        if (result == null || result.isEmpty()) {
-            return new Answer(cmd, false, "DnsMasqconfigCommand failed");
+        if (!result.isSuccess()) {
+            return new Answer(cmd, false, "DnsMasqconfigCommand failed due to " + result.getDetails());
         }
 
         return new Answer(cmd);
-
-    }
-
-    protected String createFileInVR(String routerIp, String path, String content) {
-        Connection conn = getConnection();
-        return callHostPlugin(conn, "vmops", "createFileInDomr", "domrip", routerIp, "filepath", path, "filecontents", content);
     }
 
     protected Answer execute(final LoadBalancerConfigCommand cmd) {
@@ -2192,10 +2195,10 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
             tmpCfgFileContents += "\n";
         }
         String tmpCfgFilePath = "/etc/haproxy/haproxy.cfg.new";
-        String result = createFileInVR(routerIp, tmpCfgFilePath, tmpCfgFileContents);
+        ExecutionResult result = createFileInVR(routerIp, tmpCfgFilePath, tmpCfgFileContents);
 
-        if (result == null || result.isEmpty()) {
-            return new Answer(cmd, false, "LoadBalancerConfigCommand failed to create HA proxy cfg file.");
+        if (!result.isSuccess()) {
+            return new Answer(cmd, false, "LoadBalancerConfigCommand failed to create HA proxy cfg file: " + result.getDetails());
         }
 
         String[][] rules = cfgtr.generateFwRules(cmd);
@@ -2235,14 +2238,14 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
 
         if (cmd.getVpcId() == null) {
             args = " -i " + routerIp + args;
-            result = routerProxy("loadbalancer.sh", routerIp, args);
+            result = executeInVR(routerIp, "loadbalancer.sh", args);
         } else {
             args = " -i " + cmd.getNic().getIp() + args;
-            result = routerProxy("vpc_loadbalancer.sh", routerIp, args);
+            result = executeInVR(routerIp, "vpc_loadbalancer.sh", args);
         }
 
-        if (result == null || result.isEmpty()) {
-            return new Answer(cmd, false, "LoadBalancerConfigCommand failed");
+        if (!result.isSuccess()) {
+            return new Answer(cmd, false, "LoadBalancerConfigCommand failed: " + result.getDetails());
         }
         return new Answer(cmd);
     }
@@ -2275,9 +2278,9 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
             args += " -N";
         }
 
-        String result = routerProxy("edithosts.sh", cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP), args);
-        if (result == null || result.isEmpty()) {
-            return new Answer(cmd, false, "DhcpEntry failed");
+        ExecutionResult result = executeInVR(cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP), "edithosts.sh", args);
+        if (!result.isSuccess()) {
+            return new Answer(cmd, false, "DhcpEntry failed: " + result.getDetails());
         }
         return new Answer(cmd);
     }
@@ -2296,9 +2299,9 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
         }
         args += " -C " + cmd.getLocalCidr();
         args += " -i " + cmd.getPublicInterface();
-        String result = routerProxy("vpn_l2tp.sh", cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP), args);
-        if (result == null || result.isEmpty()) {
-            return new Answer(cmd, false, "Configure VPN failed");
+        ExecutionResult result = executeInVR(cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP), "vpn_l2tp.sh", args);
+        if (!result.isSuccess()) {
+            return new Answer(cmd, false, "Configure VPN failed" + result.getDetails());
         }
         return new Answer(cmd);
     }
@@ -2311,9 +2314,9 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
             } else {
                 args += " -u " + userpwd.getUsernamePassword();
             }
-            String result = routerProxy("vpn_l2tp.sh", cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP), args);
-            if (result == null || result.isEmpty()) {
-                return new Answer(cmd, false, "Configure VPN user failed for user " + userpwd.getUsername());
+            ExecutionResult result = executeInVR(cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP), "vpn_l2tp.sh", args);
+            if (!result.isSuccess()) {
+                return new Answer(cmd, false, "Configure VPN user failed for user " + userpwd.getUsername() + ":" + result.getDetails());
             }
         }
 
@@ -2328,10 +2331,10 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
 
         String args = "-d " + json;
 
-        String result = routerProxy("vmdata.py", cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP), args);
+        ExecutionResult result = executeInVR(cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP), "vmdata.py", args);
 
-        if (result == null || result.isEmpty()) {
-            return new Answer(cmd, false, "vm_data failed");
+        if (!result.isSuccess()) {
+            return new Answer(cmd, false, "vm_data failed:" + result.getDetails());
         } else {
             return new Answer(cmd);
         }
@@ -2344,10 +2347,10 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
 
         String args = " -v " + vmIpAddress;
         args += " -p " + password;
-        String result = routerProxy("savepassword.sh", cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP), args);
+        ExecutionResult result = executeInVR(cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP), "savepassword.sh", args);
 
-        if (result == null || result.isEmpty()) {
-            return new Answer(cmd, false, "savePassword failed");
+        if (!result.isSuccess()) {
+            return new Answer(cmd, false, "savePassword failed:" + result.getDetails());
         }
         return new Answer(cmd);
     }
@@ -2439,10 +2442,10 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
                 args += " -n";
             }
 
-            String result = routerProxy("ipassoc.sh", privateIpAddress, args);
+            ExecutionResult result = executeInVR(privateIpAddress, "ipassoc.sh", args);
 
-            if (result == null || result.isEmpty()) {
-                throw new InternalErrorException("Xen plugin \"ipassoc\" failed.");
+            if (!result.isSuccess()) {
+                throw new InternalErrorException("Xen plugin \"ipassoc\" failed." + result.getDetails());
             }
 
             if (removeVif) {
@@ -2511,18 +2514,18 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
             args += " -n ";
             args += NetUtils.getSubNet(ip.getPublicIp(), ip.getVlanNetmask());
 
-            String result = routerProxy("vpc_ipassoc.sh", routerIp, args);
-            if (result == null || result.isEmpty()) {
-                throw new InternalErrorException("Xen plugin \"vpc_ipassoc\" failed.");
+            ExecutionResult result = executeInVR(routerIp, "vpc_ipassoc.sh", args);
+            if (!result.isSuccess()) {
+                throw new InternalErrorException("Xen plugin \"vpc_ipassoc\" failed." + result.getDetails());
             }
 
             if (ip.isSourceNat()) {
                 snatArgs += " -l " + ip.getPublicIp();
                 snatArgs += " -c " + "eth" + correctVif.getDevice(conn);
 
-                result = routerProxy("vpc_privateGateway.sh", routerIp, snatArgs);
-                if (result == null || result.isEmpty()) {
-                    throw new InternalErrorException("Xen plugin \"vpc_privateGateway\" failed.");
+                result = executeInVR(routerIp, "vpc_privateGateway.sh", snatArgs);
+                if (!result.isSuccess()) {
+                    throw new InternalErrorException("Xen plugin \"vpc_privateGateway\" failed." + result.getDetails());
                 }
             }
 
@@ -7493,9 +7496,9 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
 
         String args = " -c " + config;
 
-        String result = routerProxy("monitor_service.sh", cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP), args);
-        if (result == null || result.isEmpty()) {
-            return new Answer(cmd, false, "SetMonitorServiceCommand failed to create cfg file.");
+        ExecutionResult result = executeInVR(cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP), "monitor_service.sh", args);
+        if (!result.isSuccess()) {
+            return new Answer(cmd, false, "SetMonitorServiceCommand failed to create cfg file." + result.getDetails());
         }
 
         return new Answer(cmd, success, "");
@@ -7504,8 +7507,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
 
     protected SetFirewallRulesAnswer execute(SetFirewallRulesCommand cmd) {
         String[] results = new String[cmd.getRules().length];
-        String callResult;
-        getConnection();
+        ExecutionResult callResult;
         String routerIp = cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP);
         String egressDefault = cmd.getAccessDetail(NetworkElementCommand.FIREWALL_EGRESS_DEFAULT);
         FirewallRuleTO[] allrules = cmd.getRules();
@@ -7536,15 +7538,15 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
         }
 
         if (trafficType == FirewallRule.TrafficType.Egress) {
-            callResult = routerProxy("firewall_egress.sh", routerIp, args);
+            callResult = executeInVR(routerIp, "firewall_egress.sh", args);
         } else {
-            callResult = routerProxy("firewall_ingress.sh", routerIp, args);
+            callResult = executeInVR(routerIp, "firewall_ingress.sh", args);
         }
 
-        if (callResult == null || callResult.isEmpty()) {
+        if (!callResult.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";
+                results[i] = "Failed: " + callResult.getDetails();
             }
             return new SetFirewallRulesAnswer(cmd, false, results);
         }
@@ -7844,9 +7846,9 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
             if (domainName != null && !domainName.isEmpty()) {
                 args += " -e " + domainName;
             }
-            String result = routerProxy("vpc_guestnw.sh", cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP), args);
-            if (result == null || result.isEmpty()) {
-                return new SetupGuestNetworkAnswer(cmd, false, "creating guest network failed due to " + ((result == null) ? "null" : result));
+            ExecutionResult result = executeInVR(cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP), "vpc_guestnw.sh", args);
+            if (!result.isSuccess()) {
+                return new SetupGuestNetworkAnswer(cmd, false, "creating guest network failed due to " + result.getDetails());
             }
             return new SetupGuestNetworkAnswer(cmd, true, "success");
         } catch (Exception e) {
@@ -7919,9 +7921,9 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
             args += " -N ";
             args += cmd.getPeerGuestCidrList();
         }
-        String result = routerProxy("ipsectunnel.sh", cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP), args);
-        if (result == null || result.isEmpty()) {
-            return new Answer(cmd, false, "Configure site to site VPN failed! ");
+        ExecutionResult result = executeInVR(cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP), "ipsectunnel.sh", args);
+        if (!result.isSuccess()) {
+            return new Answer(cmd, false, "Configure site to site VPN failed! " + result.getDetails());
         }
         return new Answer(cmd);
     }
@@ -7944,9 +7946,9 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
             args += " -c ";
             args += "eth" + correctVif.getDevice(conn);
 
-            String result = routerProxy("vpc_snat.sh", cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP), args);
-            if (result == null || result.isEmpty()) {
-                throw new InternalErrorException("Xen plugin \"vpc_snat\" failed.");
+            ExecutionResult result = executeInVR(cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP), "vpc_snat.sh", args);
+            if (!result.isSuccess()) {
+                throw new InternalErrorException("Xen plugin \"vpc_snat\" failed." + result.getDetails());
             }
             return new SetSourceNatAnswer(cmd, true, "success");
         } catch (Exception e) {
@@ -7958,7 +7960,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
 
     private SetNetworkACLAnswer execute(SetNetworkACLCommand cmd) {
         String[] results = new String[cmd.getRules().length];
-        String callResult;
+        ExecutionResult callResult;
         Connection conn = getConnection();
         String routerName = cmd.getAccessDetail(NetworkElementCommand.ROUTER_NAME);
         String privateGw = cmd.getAccessDetail(NetworkElementCommand.VPC_PRIVATE_GATEWAY);
@@ -7985,11 +7987,11 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
                 args += " -d " + "eth" + vif.getDevice(conn);
                 args += " -a " + sb.toString();
 
-                callResult = routerProxy("vpc_privategw_acl.sh", cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP), args);
-                if (callResult == null || callResult.isEmpty()) {
+                callResult = executeInVR(cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP), "vpc_privategw_acl.sh", args);
+                if (!callResult.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";
+                        results[i] = "Failed:" + callResult.getDetails();
                     }
                     return new SetNetworkACLAnswer(cmd, false, results);
                 }
@@ -8000,11 +8002,11 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
                 args += " -m " + Long.toString(NetUtils.getCidrSize(nic.getNetmask()));
                 args += " -a " + sb.toString();
 
-                callResult = routerProxy("vpc_acl.sh", cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP), args);
-                if (callResult == null || callResult.isEmpty()) {
+                callResult = executeInVR(cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP), "vpc_acl.sh", args);
+                if (!callResult.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";
+                        results[i] = "Failed:" + callResult.getDetails();
                     }
                     return new SetNetworkACLAnswer(cmd, false, results);
                 }
@@ -8031,10 +8033,10 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
             args += " -r " + rule.getDstIp();
             args += " -d " + rule.getStringDstPortRange().replace(":", "-");
 
-            String result = routerProxy("vpc_portforwarding.sh", cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP), args);
+            ExecutionResult result = executeInVR(cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP), "vpc_portforwarding.sh", args);
 
-            if (result == null || result.isEmpty()) {
-                results[i++] = "Failed";
+            if (!result.isSuccess()) {
+                results[i++] = "Failed:" + result.getDetails();
                 endResult = false;
             } else {
                 results[i++] = null;
@@ -8044,7 +8046,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
     }
 
     private SetStaticRouteAnswer execute(SetStaticRouteCommand cmd) {
-        String callResult;
+        ExecutionResult callResult;
         try {
             String[] results = new String[cmd.getStaticRoutes().length];
             String[][] rules = cmd.generateSRouteRules();
@@ -8054,11 +8056,11 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
                 sb.append(srRules[i]).append(',');
             }
             String args = "-a " + sb.toString();
-            callResult = routerProxy("vpc_staticroute.sh", cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP), args);
-            if (callResult == null || callResult.isEmpty()) {
+            callResult = executeInVR(cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP), "vpc_staticroute.sh", args);
+            if (!callResult.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";
+                    results[i] = "Failed:" + callResult.getDetails();
                 }
                 return new SetStaticRouteAnswer(cmd, false, results);
             }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2d100f12/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServer56Resource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServer56Resource.java b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServer56Resource.java
index df43430..7e26a5c 100644
--- a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServer56Resource.java
+++ b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServer56Resource.java
@@ -16,25 +16,6 @@
 // under the License.
 package com.cloud.hypervisor.xen.resource;
 
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Set;
-
-import javax.ejb.Local;
-
-import org.apache.log4j.Logger;
-import org.apache.xmlrpc.XmlRpcException;
-
-import com.xensource.xenapi.Connection;
-import com.xensource.xenapi.Host;
-import com.xensource.xenapi.Network;
-import com.xensource.xenapi.PIF;
-import com.xensource.xenapi.Types.IpConfigurationMode;
-import com.xensource.xenapi.Types.XenAPIException;
-import com.xensource.xenapi.VLAN;
-import com.xensource.xenapi.VM;
-
 import com.cloud.agent.api.Answer;
 import com.cloud.agent.api.CheckOnHostAnswer;
 import com.cloud.agent.api.CheckOnHostCommand;
@@ -47,6 +28,22 @@ import com.cloud.agent.api.StartupCommand;
 import com.cloud.resource.ServerResource;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.script.Script;
+import com.xensource.xenapi.Connection;
+import com.xensource.xenapi.Host;
+import com.xensource.xenapi.Network;
+import com.xensource.xenapi.PIF;
+import com.xensource.xenapi.Types.IpConfigurationMode;
+import com.xensource.xenapi.Types.XenAPIException;
+import com.xensource.xenapi.VLAN;
+import com.xensource.xenapi.VM;
+import org.apache.log4j.Logger;
+import org.apache.xmlrpc.XmlRpcException;
+
+import javax.ejb.Local;
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
 
 @Local(value = ServerResource.class)
 public class XenServer56Resource extends CitrixResourceBase {
@@ -127,7 +124,7 @@ public class XenServer56Resource extends CitrixResourceBase {
 
     @Override
     protected String networkUsage(Connection conn, final String privateIpAddress, final String option, final String vif) {
-        String args = "netusage.sh " + privateIpAddress + " ";
+        String args = "";
         if (option.equals("get")) {
             args += "-g";
         } else if (option.equals("create")) {
@@ -142,7 +139,7 @@ public class XenServer56Resource extends CitrixResourceBase {
             args += vif;
         }
 
-        return callHostPlugin(conn, "vmops", "routerProxy", "args", args);
+        return executeInVR(privateIpAddress, "netusage.sh", args).getDetails();
     }
 
     protected NetworkUsageAnswer VPCNetworkUsage(NetworkUsageCommand cmd) {
@@ -151,8 +148,7 @@ public class XenServer56Resource extends CitrixResourceBase {
             String option = cmd.getOption();
             String publicIp = cmd.getGatewayIP();
 
-            String args = "vpc_netusage.sh " + cmd.getPrivateIP();
-            args += " -l " + publicIp + " ";
+            String args = " -l " + publicIp + " ";
             if (option.equals("get")) {
                 args += "-g";
             } else if (option.equals("create")) {
@@ -169,7 +165,7 @@ public class XenServer56Resource extends CitrixResourceBase {
                 return new NetworkUsageAnswer(cmd, "success", 0L, 0L);
             }
 
-            String result = callHostPlugin(conn, "vmops", "routerProxy", "args", args);
+            String result = executeInVR(cmd.getPrivateIP(), "vpc_netusage.sh", args).getDetails();
             if (option.equals("get") || option.equals("vpn")) {
                 long[] stats = new long[2];
                 if (result != null) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2d100f12/scripts/vm/hypervisor/xenserver/vmops
----------------------------------------------------------------------
diff --git a/scripts/vm/hypervisor/xenserver/vmops b/scripts/vm/hypervisor/xenserver/vmops
index 96b7866..2f0f347 100755
--- a/scripts/vm/hypervisor/xenserver/vmops
+++ b/scripts/vm/hypervisor/xenserver/vmops
@@ -230,12 +230,10 @@ def routerProxy(session, args):
     cmd.insert(0, "/bin/bash")
     try:
         txt = util.pread2(cmd)
-        if txt is None or len(txt) == 0 :
-            txt = 'success'
+        txt = 'succ#' + txt
     except:
         logging.debug("routerProxy command " + sargs + " failed "  )
-        txt = '' 
-
+        txt = 'fail#' + txt
     return txt
 
 @echo
@@ -265,13 +263,12 @@ def createFileInDomr(session, args):
         f.write(file_contents)
         f.close()
         target = "root@" + domrip + ":" + file_path
-        util.pread2(['scp','-P','3922','-q','-o','StrictHostKeyChecking=no','-i','/root/.ssh/id_rsa.cloud',tmpfile, target])
+        txt = util.pread2(['scp','-P','3922','-q','-o','StrictHostKeyChecking=no','-i','/root/.ssh/id_rsa.cloud',tmpfile, target])
         util.pread2(['rm',tmpfile])
-        txt = 'success'
+        txt = 'succ#' + txt
     except:
-        logging.debug(" failed to create HA proxy cfg file ")
-        txt = ''
-
+        logging.debug("failed to create file " + file_path + " in VR, contain: " + file_contents)
+        txt = 'fail#' + txt
     return txt
 
 @echo

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2d100f12/utils/src/com/cloud/utils/ExecutionResult.java
----------------------------------------------------------------------
diff --git a/utils/src/com/cloud/utils/ExecutionResult.java b/utils/src/com/cloud/utils/ExecutionResult.java
new file mode 100644
index 0000000..8edb55b
--- /dev/null
+++ b/utils/src/com/cloud/utils/ExecutionResult.java
@@ -0,0 +1,44 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package com.cloud.utils;
+
+public class ExecutionResult {
+    private Boolean success;
+    private String details;
+
+    public ExecutionResult(Boolean success, String details) {
+        this.success = success;
+        this.details = details;
+    }
+
+    public Boolean isSuccess() {
+        return success;
+    }
+
+    public void setSuccess(Boolean success) {
+        this.success = success;
+    }
+
+    public String getDetails() {
+        return details;
+    }
+
+    public void setDetails(String details) {
+        this.details = details;
+    }
+}