This is an automated email from the ASF dual-hosted git repository.

pearl11594 pushed a commit to branch test-opt
in repository https://gitbox.apache.org/repos/asf/cloudstack.git

commit 4481c9925adb975963e564f9da16eb47c49775f3
Author: Pearl Dsilva <[email protected]>
AuthorDate: Tue Dec 14 13:16:09 2021 +0530

    The following commit:
    - refactors logic added to support SystemVM deployment on KVM
    - Adds support to copy specific files (required for patching) to the hosts 
on Xenserver
    - Modifies vmops method - createFileInDomr to take cleanup param
    - Adds configuratble sleep param to CitrixResourceBase::connect() used to 
verify if telnet to specifc port is possible (if sleep is 0, then default to 
_sleep = 10000ms)
    - Adds Command/Answer for patch systemVMs on XenServer/Xcp
---
 .../java/com/cloud/resource/ServerResource.java    |  8 +++
 .../com/cloud/resource/ServerResourceBase.java     | 12 ++++
 .../kvm/resource/LibvirtComputingResource.java     |  5 --
 .../LibvirtPatchSystemVmCommandWrapper.java        | 35 +----------
 .../wrapper/LibvirtStartCommandWrapper.java        | 12 +---
 .../xenserver/resource/CitrixResourceBase.java     | 45 +++++++++++---
 .../xenbase/CitrixCheckSshCommandWrapper.java      |  2 +-
 .../CitrixPatchSystemVmCommandWrapper.java}        | 72 +++++++---------------
 .../xenbase/CitrixRebootRouterCommandWrapper.java  |  2 +-
 .../wrapper/xenbase/CitrixStartCommandWrapper.java | 24 ++++++++
 scripts/vm/hypervisor/xenserver/vmops              |  4 +-
 scripts/vm/hypervisor/xenserver/xcposs/patch       |  3 +
 scripts/vm/hypervisor/xenserver/xcpserver/patch    |  5 +-
 scripts/vm/hypervisor/xenserver/xenserver56/patch  |  3 +
 .../vm/hypervisor/xenserver/xenserver56fp1/patch   |  3 +
 scripts/vm/hypervisor/xenserver/xenserver60/patch  |  3 +
 scripts/vm/hypervisor/xenserver/xenserver62/patch  |  3 +
 scripts/vm/hypervisor/xenserver/xenserver65/patch  |  3 +
 tools/appliance/build.sh                           |  6 +-
 utils/src/main/java/com/cloud/utils/FileUtil.java  | 23 +++++++
 20 files changed, 161 insertions(+), 112 deletions(-)

diff --git a/core/src/main/java/com/cloud/resource/ServerResource.java 
b/core/src/main/java/com/cloud/resource/ServerResource.java
index 16ac00e..5571f33 100644
--- a/core/src/main/java/com/cloud/resource/ServerResource.java
+++ b/core/src/main/java/com/cloud/resource/ServerResource.java
@@ -27,11 +27,19 @@ import com.cloud.agent.api.StartupCommand;
 import com.cloud.host.Host;
 import com.cloud.utils.component.Manager;
 
+import java.io.File;
+
 /**
  * ServerResource is a generic container to execute commands sent
  */
 public interface ServerResource extends Manager {
 
+    String[] srcFiles = new String[] { "agent.zip", "cloud-scripts.tgz" };
+    String[] newSrcFiles = new String[] { "agent.zip", "cloud-scripts.tgz", 
"patch-sysvms.sh" };
+
+    String SSHKEYSPATH = "/root/.ssh";
+    String SSHPRVKEYPATH = SSHKEYSPATH + File.separator + "id_rsa.cloud";
+
     /**
      * @return Host.Type type of the computing server we have.
      */
diff --git a/core/src/main/java/com/cloud/resource/ServerResourceBase.java 
b/core/src/main/java/com/cloud/resource/ServerResourceBase.java
index f68bcf4..8005777 100644
--- a/core/src/main/java/com/cloud/resource/ServerResourceBase.java
+++ b/core/src/main/java/com/cloud/resource/ServerResourceBase.java
@@ -19,6 +19,7 @@
 
 package com.cloud.resource;
 
+import java.io.File;
 import java.io.PrintWriter;
 import java.io.StringWriter;
 import java.net.NetworkInterface;
@@ -32,6 +33,8 @@ import java.util.Map;
 
 import javax.naming.ConfigurationException;
 
+import com.cloud.utils.EncryptionUtil;
+import com.cloud.utils.exception.CloudRuntimeException;
 import org.apache.log4j.Logger;
 
 import com.cloud.agent.IAgentControl;
@@ -306,4 +309,13 @@ public abstract class ServerResourceBase implements 
ServerResource {
     public boolean stop() {
         return true;
     }
+
+    public String calculateCurrentChecksum(String name) {
+        String cloudScriptsPath = Script.findScript("", 
"vms/cloud-scripts.tgz");
+        if (cloudScriptsPath == null) {
+            throw new CloudRuntimeException(String.format("Unable to find 
cloudScripts path, cannot update SystemVM %s", name));
+        }
+        String md5sum = EncryptionUtil.calculateChecksum(new 
File(cloudScriptsPath));
+        return md5sum;
+    }
 }
diff --git 
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
 
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
index 4a3f778..0b2db81 100644
--- 
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
+++ 
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
@@ -282,9 +282,6 @@ public class LibvirtComputingResource extends 
ServerResourceBase implements Serv
     public static final String RESIZE_NOTIFY_ONLY = "NOTIFYONLY";
     public static final String BASEPATH = "/usr/share/cloudstack-common/vms/";
 
-    public static String[] srcFiles = new String[] { "agent.zip", 
"cloud-scripts.tgz" };
-    public static String[] newSrcFiles = new String[] { "agent.zip", 
"cloud-scripts.tgz", "patch-sysvms.sh" };
-
     private String _modifyVlanPath;
     private String _versionstringpath;
     private String _patchScriptPath;
@@ -310,8 +307,6 @@ public class LibvirtComputingResource extends 
ServerResourceBase implements Serv
     private static final int NUMMEMSTATS =2;
 
     private KVMHAMonitor _monitor;
-    public static final String SSHKEYSPATH = "/root/.ssh";
-    public static final String SSHPRVKEYPATH = SSHKEYSPATH + File.separator + 
"id_rsa.cloud";
     public static final String SSHPUBKEYPATH = SSHKEYSPATH + File.separator + 
"id_rsa.pub.cloud";
     public static final String DEFAULTDOMRSSHPORT = "3922";
 
diff --git 
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtPatchSystemVmCommandWrapper.java
 
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtPatchSystemVmCommandWrapper.java
index 392ccb6..5fac33e 100644
--- 
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtPatchSystemVmCommandWrapper.java
+++ 
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtPatchSystemVmCommandWrapper.java
@@ -24,19 +24,15 @@ import com.cloud.agent.resource.virtualnetwork.VRScripts;
 import com.cloud.hypervisor.kvm.resource.LibvirtComputingResource;
 import com.cloud.resource.CommandWrapper;
 import com.cloud.resource.ResourceWrapper;
-import com.cloud.utils.EncryptionUtil;
 import com.cloud.utils.ExecutionResult;
+import com.cloud.utils.FileUtil;
 import com.cloud.utils.Pair;
 import com.cloud.utils.exception.CloudRuntimeException;
-import com.cloud.utils.script.Script;
 import com.cloud.utils.ssh.SshHelper;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.log4j.Logger;
 
 import java.io.File;
-import java.util.Arrays;
-import java.util.List;
-import java.util.stream.Collectors;
 
 @ResourceWrapper(handles = PatchSystemVmCommand.class)
 public class LibvirtPatchSystemVmCommandWrapper extends 
CommandWrapper<PatchSystemVmCommand, Answer, LibvirtComputingResource> {
@@ -51,7 +47,7 @@ public class LibvirtPatchSystemVmCommandWrapper extends 
CommandWrapper<PatchSyst
         ExecutionResult result;
         try {
             result = getSystemVmVersionAndChecksum(serverResource, controlIp);
-            scpPatchFiles(controlIp);
+            FileUtil.scpPatchFiles(controlIp, "/home/cloud", sshPort, pemFile, 
serverResource.newSrcFiles, LibvirtComputingResource.BASEPATH);
         } catch (CloudRuntimeException e) {
             return new PatchSystemVmAnswer(cmd, e.getMessage());
         }
@@ -63,7 +59,7 @@ public class LibvirtPatchSystemVmCommandWrapper extends 
CommandWrapper<PatchSyst
         }
 
         String scriptChecksum = lines[1].trim();
-        String checksum = calculateCurrentChecksum(sysVMName).trim();
+        String checksum = 
serverResource.calculateCurrentChecksum(sysVMName).trim();
 
         if (!StringUtils.isEmpty(checksum) && checksum.equals(scriptChecksum)) 
{
             if (!cmd.isForced()) {
@@ -87,15 +83,6 @@ public class LibvirtPatchSystemVmCommandWrapper extends 
CommandWrapper<PatchSyst
         return new PatchSystemVmAnswer(cmd, patchResult.second());
     }
 
-    private String calculateCurrentChecksum(String name) {
-        String cloudScriptsPath = Script.findScript("", 
"vms/cloud-scripts.tgz");
-        if (cloudScriptsPath == null) {
-            throw new CloudRuntimeException(String.format("Unable to find 
cloudScripts path, cannot update SystemVM %s", name));
-        }
-        String md5sum = EncryptionUtil.calculateChecksum(new 
File(cloudScriptsPath));
-        return md5sum;
-    }
-
     private ExecutionResult 
getSystemVmVersionAndChecksum(LibvirtComputingResource serverResource, String 
controlIp) {
         ExecutionResult result;
         try {
@@ -112,21 +99,5 @@ public class LibvirtPatchSystemVmCommandWrapper extends 
CommandWrapper<PatchSyst
         }
         return result;
     }
-
-    private void scpPatchFiles(String controlIp) {
-        try {
-            List<String> srcFiles = 
Arrays.asList(LibvirtComputingResource.newSrcFiles);
-            srcFiles = srcFiles.stream()
-                    .map(file -> LibvirtComputingResource.BASEPATH + file) // 
Using Lambda notation to update the entries
-                    .collect(Collectors.toList());
-            String[] newSrcFiles = srcFiles.toArray(new String[0]);
-            SshHelper.scpTo(controlIp, sshPort, "root", pemFile, null,
-                    "/home/cloud/", newSrcFiles, "0755");
-        } catch (Exception e) {
-            String errMsg = "Failed to scp files to system VM";
-            s_logger.error(errMsg, e);
-            throw new CloudRuntimeException(errMsg, e);
-        }
-    }
 }
 
diff --git 
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtStartCommandWrapper.java
 
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtStartCommandWrapper.java
index b95c163..2ac8bf7 100644
--- 
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtStartCommandWrapper.java
+++ 
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtStartCommandWrapper.java
@@ -21,11 +21,8 @@ package com.cloud.hypervisor.kvm.resource.wrapper;
 
 import java.io.File;
 import java.net.URISyntaxException;
-import java.util.Arrays;
-import java.util.List;
-import java.util.stream.Collectors;
 
-import com.cloud.utils.ssh.SshHelper;
+import com.cloud.utils.FileUtil;
 import org.apache.log4j.Logger;
 import org.libvirt.Connect;
 import org.libvirt.DomainInfo.DomainState;
@@ -122,13 +119,8 @@ public final class LibvirtStartCommandWrapper extends 
CommandWrapper<StartComman
                     }
 
                     try {
-                        List<String> srcFiles = 
Arrays.asList(LibvirtComputingResource.srcFiles);
-                        srcFiles = srcFiles.stream()
-                                .map(file -> LibvirtComputingResource.BASEPATH 
+ file)
-                                .collect(Collectors.toList());
                         File pemFile = new 
File(LibvirtComputingResource.SSHPRVKEYPATH);
-                        SshHelper.scpTo(controlIp, 3922, "root", pemFile, null,
-                                "/home/cloud/", srcFiles.toArray(new 
String[0]), "0755");
+                        FileUtil.scpPatchFiles(controlIp, "/home/cloud", 
Integer.parseInt(LibvirtComputingResource.DEFAULTDOMRSSHPORT), pemFile, 
LibvirtComputingResource.newSrcFiles, LibvirtComputingResource.BASEPATH);
                         // TODO: May want to remove this when cert patching 
logic is moved
                         Thread.sleep(10000);
                     } catch (Exception e) {
diff --git 
a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java
 
b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java
index a971576..90acbed 100644
--- 
a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java
+++ 
b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java
@@ -52,6 +52,7 @@ import javax.naming.ConfigurationException;
 import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.parsers.ParserConfigurationException;
 
+import com.cloud.resource.ServerResourceBase;
 import org.apache.cloudstack.api.ApiConstants;
 import org.apache.cloudstack.diagnostics.CopyToSecondaryStorageAnswer;
 import org.apache.cloudstack.diagnostics.CopyToSecondaryStorageCommand;
@@ -180,7 +181,7 @@ import com.xensource.xenapi.XenAPIObject;
  * before you do any changes in this code here.
  *
  */
-public abstract class CitrixResourceBase implements ServerResource, 
HypervisorResource, VirtualRouterDeployer {
+public abstract class CitrixResourceBase extends ServerResourceBase implements 
ServerResource, HypervisorResource, VirtualRouterDeployer {
     /**
      * used to describe what type of resource a storage device is of
      */
@@ -216,6 +217,7 @@ public abstract class CitrixResourceBase implements 
ServerResource, HypervisorRe
     private final static String VM_NAME_ISO_SUFFIX = "-ISO";
 
     private final static String VM_FILE_ISO_SUFFIX = ".iso";
+    public final static int DEFAULTDOMRSSHPORT = 3922;
 
     private static final XenServerConnectionPool ConnPool = 
XenServerConnectionPool.getInstance();
     // static min values for guests on xenserver
@@ -226,6 +228,7 @@ public abstract class CitrixResourceBase implements 
ServerResource, HypervisorRe
     protected static final HashMap<VmPowerState, PowerState> 
s_powerStatesTable;
 
     public static final String XS_TOOLS_ISO_AFTER_70 = "guest-tools.iso";
+    public static final String BASEPATH = "/opt/xensource/packages/resources/";
 
     static {
         s_powerStatesTable = new HashMap<VmPowerState, PowerState>();
@@ -339,6 +342,11 @@ public abstract class CitrixResourceBase implements 
ServerResource, HypervisorRe
         return new StorageSubsystemCommandHandlerBase(processor);
     }
 
+    @Override
+    protected String getDefaultScriptsDir() {
+        return null;
+    }
+
     public String callHostPlugin(final Connection conn, final String plugin, 
final String cmd, final String... params) {
         final Map<String, String> args = new HashMap<String, String>();
         String msg;
@@ -904,11 +912,15 @@ public abstract class CitrixResourceBase implements 
ServerResource, HypervisorRe
         }
     }
 
-    public String connect(final Connection conn, final String vmname, final 
String ipAddress) {
-        return connect(conn, vmname, ipAddress, 3922);
+    public String connect(final Connection conn, final String vmname, final 
String ipAddress, int sleep) {
+        return connect(conn, vmname, ipAddress, DEFAULTDOMRSSHPORT, sleep);
     }
 
-    public String connect(final Connection conn, final String vmName, final 
String ipAddress, final int port) {
+    public String connect(final Connection conn, final String vmName, final 
String ipAddress, final int port, int sleep) {
+        if (sleep == 0) {
+            sleep = _sleep;
+        }
+
         for (int i = 0; i <= _retry; i++) {
             try {
                 final Set<VM> vms = VM.getByNameLabel(conn, vmName);
@@ -929,7 +941,7 @@ public abstract class CitrixResourceBase implements 
ServerResource, HypervisorRe
                 return null;
             }
             try {
-                Thread.sleep(_sleep);
+                Thread.sleep(sleep);
             } catch (final InterruptedException e) {
             }
         }
@@ -974,8 +986,25 @@ public abstract class CitrixResourceBase implements 
ServerResource, HypervisorRe
             s_logger.warn("scp VR config file into host " + _host.getIp() + " 
failed with exception " + e.getMessage().toString());
         }
 
-        final String rc = callHostPlugin(conn, "vmops", "createFileInDomr", 
"domrip", routerIp, "srcfilepath", hostPath + filename, "dstfilepath", path);
-        s_logger.debug("VR Config file " + filename + " got created in VR, ip 
" + routerIp + " with content \n" + content);
+        final String rc = callHostPlugin(conn, "vmops", "createFileInDomr", 
"domrip", routerIp, "srcfilepath", hostPath + filename, "dstfilepath", path, 
"cleanup", "true");
+        s_logger.debug("VR Config file " + filename + " got created in VR, IP: 
" + routerIp + " with content \n" + content);
+
+        return new ExecutionResult(rc.startsWith("succ#"), rc.substring(5));
+    }
+
+    public ExecutionResult copyPatchFilesToVR(final String routerIp, final 
String path) {
+        final Connection conn = getConnection();
+        final String hostPath = "/opt/xensource/packages/resources/";
+        String rc = "";
+        for (String file: newSrcFiles) {
+            rc = callHostPlugin(conn, "vmops", "createFileInDomr", "domrip", 
routerIp, "srcfilepath", hostPath.concat(file), "dstfilepath", path, "cleanup", 
"false");
+            if (rc.startsWith("fail#")) {
+                s_logger.error(String.format("Failed to scp file %s required 
for patching the systemVM", file));
+                break;
+            }
+        }
+
+        s_logger.debug("VR Config files at " + hostPath + " got created in VR, 
IP: " + routerIp);
 
         return new ExecutionResult(rc.startsWith("succ#"), rc.substring(5));
     }
@@ -4885,7 +4914,7 @@ public abstract class CitrixResourceBase implements 
ServerResource, HypervisorRe
                     throw new CloudRuntimeException("Unable to authenticate");
                 }
 
-                final String cmd = "mkdir -p /opt/cloud/bin /var/log/cloud";
+                final String cmd = "mkdir -p /opt/cloud/bin /var/log/cloud 
/opt/xensource/packages/resources/";
                 if (!SSHCmdHelper.sshExecuteCmd(sshConnection, cmd)) {
                     throw new CloudRuntimeException("Cannot create directory 
/opt/cloud/bin on XenServer hosts");
                 }
diff --git 
a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixCheckSshCommandWrapper.java
 
b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixCheckSshCommandWrapper.java
index cf34a8f..ec7d844 100644
--- 
a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixCheckSshCommandWrapper.java
+++ 
b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixCheckSshCommandWrapper.java
@@ -46,7 +46,7 @@ public final class CitrixCheckSshCommandWrapper extends 
CommandWrapper<CheckSshC
         }
 
         try {
-            final String result = citrixResourceBase.connect(conn, 
command.getName(), privateIp, cmdPort);
+            final String result = citrixResourceBase.connect(conn, 
command.getName(), privateIp, cmdPort, 0);
             if (result != null) {
                 return new CheckSshAnswer(command, "Can not ping System vm " + 
vmName + "due to:" + result);
             }
diff --git 
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtPatchSystemVmCommandWrapper.java
 
b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixPatchSystemVmCommandWrapper.java
similarity index 51%
copy from 
plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtPatchSystemVmCommandWrapper.java
copy to 
plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixPatchSystemVmCommandWrapper.java
index 392ccb6..e27381e 100644
--- 
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtPatchSystemVmCommandWrapper.java
+++ 
b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixPatchSystemVmCommandWrapper.java
@@ -14,89 +14,78 @@
 // KIND, either express or implied.  See the License for the
 // specific language governing permissions and limitations
 // under the License.
-package com.cloud.hypervisor.kvm.resource.wrapper;
+package com.cloud.hypervisor.xenserver.resource.wrapper.xenbase;
 
 import com.cloud.agent.api.Answer;
 import com.cloud.agent.api.PatchSystemVmAnswer;
 import com.cloud.agent.api.PatchSystemVmCommand;
 import com.cloud.agent.api.routing.NetworkElementCommand;
 import com.cloud.agent.resource.virtualnetwork.VRScripts;
-import com.cloud.hypervisor.kvm.resource.LibvirtComputingResource;
+import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
 import com.cloud.resource.CommandWrapper;
 import com.cloud.resource.ResourceWrapper;
-import com.cloud.utils.EncryptionUtil;
 import com.cloud.utils.ExecutionResult;
+import com.cloud.utils.FileUtil;
 import com.cloud.utils.Pair;
 import com.cloud.utils.exception.CloudRuntimeException;
-import com.cloud.utils.script.Script;
 import com.cloud.utils.ssh.SshHelper;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.log4j.Logger;
 
 import java.io.File;
-import java.util.Arrays;
-import java.util.List;
-import java.util.stream.Collectors;
 
 @ResourceWrapper(handles = PatchSystemVmCommand.class)
-public class LibvirtPatchSystemVmCommandWrapper extends 
CommandWrapper<PatchSystemVmCommand, Answer, LibvirtComputingResource> {
-    private static final Logger s_logger = 
Logger.getLogger(LibvirtPatchSystemVmCommandWrapper.class);
-    private static int sshPort = 
Integer.parseInt(LibvirtComputingResource.DEFAULTDOMRSSHPORT);
-    private static File pemFile = new 
File(LibvirtComputingResource.SSHPRVKEYPATH);
+public class CitrixPatchSystemVmCommandWrapper extends 
CommandWrapper<PatchSystemVmCommand, Answer, CitrixResourceBase> {
+    private static final Logger s_logger = 
Logger.getLogger(CitrixPatchSystemVmCommandWrapper.class);
+    private static int sshPort = CitrixResourceBase.DEFAULTDOMRSSHPORT;
+    private static File pemFile = new File(CitrixResourceBase.SSHPRVKEYPATH);
 
     @Override
-    public Answer execute(PatchSystemVmCommand cmd, LibvirtComputingResource 
serverResource) {
-        final String controlIp = 
cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP);
-        final String sysVMName = 
cmd.getAccessDetail(NetworkElementCommand.ROUTER_NAME);
+    public Answer execute(PatchSystemVmCommand command, CitrixResourceBase 
serverResource) {
+        final String controlIp = 
command.getAccessDetail(NetworkElementCommand.ROUTER_IP);
+        final String sysVMName = 
command.getAccessDetail(NetworkElementCommand.ROUTER_NAME);
+
+
         ExecutionResult result;
         try {
             result = getSystemVmVersionAndChecksum(serverResource, controlIp);
-            scpPatchFiles(controlIp);
+            FileUtil.scpPatchFiles(controlIp, "/home/cloud", sshPort, pemFile, 
serverResource.newSrcFiles, CitrixResourceBase.BASEPATH);
         } catch (CloudRuntimeException e) {
-            return new PatchSystemVmAnswer(cmd, e.getMessage());
+            return new PatchSystemVmAnswer(command, e.getMessage());
         }
 
         final String[] lines = result.getDetails().split("&");
         // TODO: do we fail, or patch anyway??
         if (lines.length != 2) {
-            return new PatchSystemVmAnswer(cmd, result.getDetails());
+            return new PatchSystemVmAnswer(command, result.getDetails());
         }
 
         String scriptChecksum = lines[1].trim();
-        String checksum = calculateCurrentChecksum(sysVMName).trim();
+        String checksum = 
serverResource.calculateCurrentChecksum(sysVMName).trim();
 
         if (!StringUtils.isEmpty(checksum) && checksum.equals(scriptChecksum)) 
{
-            if (!cmd.isForced()) {
+            if (!command.isForced()) {
                 String msg = String.format("No change in the scripts checksum, 
not patching systemVM %s", sysVMName);
                 s_logger.info(msg);
-                return new PatchSystemVmAnswer(cmd, msg, lines[0], lines[1]);
+                return new PatchSystemVmAnswer(command, msg, lines[0], 
lines[1]);
             }
         }
-
         Pair<Boolean, String> patchResult = null;
         try {
             patchResult = SshHelper.sshExecute(controlIp, sshPort, "root",
                     pemFile, null, "/home/cloud/patch-sysvms.sh", 10000, 
10000, 60000);
         } catch (Exception e) {
-            return new PatchSystemVmAnswer(cmd, e.getMessage());
+            return new PatchSystemVmAnswer(command, e.getMessage());
         }
 
         if (patchResult.first()) {
-            return new PatchSystemVmAnswer(cmd, String.format("Successfully 
patched systemVM %s ", sysVMName), lines[0], lines[1]);
+            return new PatchSystemVmAnswer(command, 
String.format("Successfully patched systemVM %s ", sysVMName), lines[0], 
lines[1]);
         }
-        return new PatchSystemVmAnswer(cmd, patchResult.second());
-    }
+        return new PatchSystemVmAnswer(command, patchResult.second());
 
-    private String calculateCurrentChecksum(String name) {
-        String cloudScriptsPath = Script.findScript("", 
"vms/cloud-scripts.tgz");
-        if (cloudScriptsPath == null) {
-            throw new CloudRuntimeException(String.format("Unable to find 
cloudScripts path, cannot update SystemVM %s", name));
-        }
-        String md5sum = EncryptionUtil.calculateChecksum(new 
File(cloudScriptsPath));
-        return md5sum;
     }
 
-    private ExecutionResult 
getSystemVmVersionAndChecksum(LibvirtComputingResource serverResource, String 
controlIp) {
+    private ExecutionResult getSystemVmVersionAndChecksum(CitrixResourceBase 
serverResource, String controlIp) {
         ExecutionResult result;
         try {
             result = serverResource.executeInVR(controlIp, VRScripts.VERSION, 
null);
@@ -113,20 +102,5 @@ public class LibvirtPatchSystemVmCommandWrapper extends 
CommandWrapper<PatchSyst
         return result;
     }
 
-    private void scpPatchFiles(String controlIp) {
-        try {
-            List<String> srcFiles = 
Arrays.asList(LibvirtComputingResource.newSrcFiles);
-            srcFiles = srcFiles.stream()
-                    .map(file -> LibvirtComputingResource.BASEPATH + file) // 
Using Lambda notation to update the entries
-                    .collect(Collectors.toList());
-            String[] newSrcFiles = srcFiles.toArray(new String[0]);
-            SshHelper.scpTo(controlIp, sshPort, "root", pemFile, null,
-                    "/home/cloud/", newSrcFiles, "0755");
-        } catch (Exception e) {
-            String errMsg = "Failed to scp files to system VM";
-            s_logger.error(errMsg, e);
-            throw new CloudRuntimeException(errMsg, e);
-        }
-    }
-}
 
+}
diff --git 
a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixRebootRouterCommandWrapper.java
 
b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixRebootRouterCommandWrapper.java
index 236d8db..a874583 100644
--- 
a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixRebootRouterCommandWrapper.java
+++ 
b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixRebootRouterCommandWrapper.java
@@ -40,7 +40,7 @@ public final class CitrixRebootRouterCommandWrapper extends 
CommandWrapper<Reboo
         final Answer answer = wrapper.execute(rebootCommand, 
citrixResourceBase);
 
         if (answer.getResult()) {
-            final String cnct = citrixResourceBase.connect(conn, 
command.getVmName(), command.getPrivateIpAddress());
+            final String cnct = citrixResourceBase.connect(conn, 
command.getVmName(), command.getPrivateIpAddress(), 0);
             citrixResourceBase.networkUsage(conn, 
command.getPrivateIpAddress(), "create", null);
 
             if (cnct == null) {
diff --git 
a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixStartCommandWrapper.java
 
b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixStartCommandWrapper.java
index ecd1b0d..f4ee77c 100644
--- 
a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixStartCommandWrapper.java
+++ 
b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixStartCommandWrapper.java
@@ -25,6 +25,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import org.apache.commons.lang3.StringUtils;
 import org.apache.log4j.Logger;
 
 import com.cloud.agent.api.Answer;
@@ -180,6 +181,29 @@ public final class CitrixStartCommandWrapper extends 
CommandWrapper<StartCommand
 
             state = VmPowerState.RUNNING;
 
+            String controlIp = null;
+            for (final NicTO nic : vmSpec.getNics()) {
+                if (nic.getType() == Networks.TrafficType.Control) {
+                    controlIp = nic.getIp();
+                    break;
+                }
+            }
+
+            String result2 = citrixResourceBase.connect(conn, vmName, 
controlIp, 1000);
+            if (StringUtils.isEmpty(result2)) {
+                s_logger.info(String.format("Connected to SystemVM: %s", 
vmName));
+            }
+
+            try {
+                citrixResourceBase.copyPatchFilesToVR(controlIp, 
"/home/cloud");
+                // TODO: May want to remove this when cert patching logic is 
moved
+                Thread.sleep(10000);
+            } catch (Exception e) {
+                String errMsg = "Failed to scp files to system VM. Patching of 
systemVM failed";
+                s_logger.error(errMsg, e);
+                return new StartAnswer(command, String.format("%s due to: %s", 
errMsg, e.getMessage()));
+            }
+
             final StartAnswer startAnswer = new StartAnswer(command);
 
             startAnswer.setIqnToData(iqnToData);
diff --git a/scripts/vm/hypervisor/xenserver/vmops 
b/scripts/vm/hypervisor/xenserver/vmops
index dd03ded..e5c7e1a 100755
--- a/scripts/vm/hypervisor/xenserver/vmops
+++ b/scripts/vm/hypervisor/xenserver/vmops
@@ -235,11 +235,13 @@ def createFileInDomr(session, args):
     src_filepath = args['srcfilepath']
     dst_path = args['dstfilepath']
     domrip = args['domrip']
+    cleanup = 'true' if 'cleanup' not in args else args['cleanup']
     txt=""
     try:
         target = "root@" + domrip + ":" + dst_path
         txt = 
util.pread2(['scp','-P','3922','-q','-o','StrictHostKeyChecking=no','-i','/root/.ssh/id_rsa.cloud',src_filepath,
 target])
-        util.pread2(['rm',src_filepath])
+        if cleanup == 'true' or not cleanup:
+            util.pread2(['rm',src_filepath])
         txt = 'succ#' + txt
     except:
         logging.debug("failed to copy file " + src_filepath + " from host to 
VR with ip " + domrip)
diff --git a/scripts/vm/hypervisor/xenserver/xcposs/patch 
b/scripts/vm/hypervisor/xenserver/xcposs/patch
index d3c5db0..f855c66 100644
--- a/scripts/vm/hypervisor/xenserver/xcposs/patch
+++ b/scripts/vm/hypervisor/xenserver/xcposs/patch
@@ -32,6 +32,9 @@ ovsgre=..,0755,/usr/lib/xcp/plugins
 ovstunnel=..,0755,/usr/lib/xcp/plugins
 vmopsSnapshot=..,0755,/usr/lib/xcp/plugins
 systemvm.iso=../../../../../vms,0644,/usr/share/xcp/packages/iso/
+agent.zip=../../../../../vms,0644,/opt/xensource/packages/resources/
+cloud-scripts.tgz=../../../../../vms,0644,/opt/xensource/packages/resources/
+patch-sysvms.sh=../../../../../vms,0644,/opt/xensource/packages/resources/
 id_rsa.cloud=../../../systemvm,0600,/root/.ssh
 network_info.sh=..,0755,/opt/cloud/bin
 setupxenserver.sh=..,0755,/opt/cloud/bin
diff --git a/scripts/vm/hypervisor/xenserver/xcpserver/patch 
b/scripts/vm/hypervisor/xenserver/xcpserver/patch
index 32c7c46..9768cba 100644
--- a/scripts/vm/hypervisor/xenserver/xcpserver/patch
+++ b/scripts/vm/hypervisor/xenserver/xcpserver/patch
@@ -32,8 +32,9 @@ vmops=..,0755,/etc/xapi.d/plugins
 ovstunnel=..,0755,/etc/xapi.d/plugins
 vmopsSnapshot=..,0755,/etc/xapi.d/plugins
 systemvm.iso=../../../../../vms,0644,/opt/xensource/packages/iso
-agent.zip=../../../../../vms,0644,/opt/xensource/packages/iso
-cloud-scripts.tgz=../../../../../vms,0644,/opt/xensource/packages/iso
+agent.zip=../../../../../vms,0644,/opt/xensource/packages/resources/
+cloud-scripts.tgz=../../../../../vms,0644,/opt/xensource/packages/resources/
+patch-sysvms.sh=../../../../../vms,0644,/opt/xensource/packages/resources/
 id_rsa.cloud=../../../systemvm,0600,/root/.ssh
 network_info.sh=..,0755,/opt/cloud/bin
 setupxenserver.sh=..,0755,/opt/cloud/bin
diff --git a/scripts/vm/hypervisor/xenserver/xenserver56/patch 
b/scripts/vm/hypervisor/xenserver/xenserver56/patch
index b6f7cdb..8a784ae 100644
--- a/scripts/vm/hypervisor/xenserver/xenserver56/patch
+++ b/scripts/vm/hypervisor/xenserver/xenserver56/patch
@@ -31,6 +31,9 @@ vmops=..,0755,/etc/xapi.d/plugins
 vmopsSnapshot=..,0755,/etc/xapi.d/plugins
 cloudstack_pluginlib.py=..,0755,/etc/xapi.d/plugins
 systemvm.iso=../../../../../vms,0644,/opt/xensource/packages/iso
+agent.zip=../../../../../vms,0644,/opt/xensource/packages/resources/
+cloud-scripts.tgz=../../../../../vms,0644,/opt/xensource/packages/resources/
+patch-sysvms.sh=../../../../../vms,0644,/opt/xensource/packages/resources/
 id_rsa.cloud=../../../systemvm,0600,/root/.ssh
 network_info.sh=..,0755,/opt/cloud/bin
 setupxenserver.sh=..,0755,/opt/cloud/bin
diff --git a/scripts/vm/hypervisor/xenserver/xenserver56fp1/patch 
b/scripts/vm/hypervisor/xenserver/xenserver56fp1/patch
index 4546796..93d2e4d 100644
--- a/scripts/vm/hypervisor/xenserver/xenserver56fp1/patch
+++ b/scripts/vm/hypervisor/xenserver/xenserver56fp1/patch
@@ -31,6 +31,9 @@ vmops=..,0755,/etc/xapi.d/plugins
 vmopsSnapshot=..,0755,/etc/xapi.d/plugins
 cloudstack_pluginlib.py=..,0755,/etc/xapi.d/plugins
 systemvm.iso=../../../../../vms,0644,/opt/xensource/packages/iso
+agent.zip=../../../../../vms,0644,/opt/xensource/packages/resources/
+cloud-scripts.tgz=../../../../../vms,0644,/opt/xensource/packages/resources/
+patch-sysvms.sh=../../../../../vms,0644,/opt/xensource/packages/resources/
 id_rsa.cloud=../../../systemvm,0600,/root/.ssh
 network_info.sh=..,0755,/opt/cloud/bin
 setupxenserver.sh=..,0755,/opt/cloud/bin
diff --git a/scripts/vm/hypervisor/xenserver/xenserver60/patch 
b/scripts/vm/hypervisor/xenserver/xenserver60/patch
index bea0cf9..0271d06 100644
--- a/scripts/vm/hypervisor/xenserver/xenserver60/patch
+++ b/scripts/vm/hypervisor/xenserver/xenserver60/patch
@@ -35,6 +35,9 @@ cloudstack_pluginlib.py=..,0755,/etc/xapi.d/plugins
 ovstunnel=..,0755,/etc/xapi.d/plugins
 vmopsSnapshot=..,0755,/etc/xapi.d/plugins
 systemvm.iso=../../../../../vms,0644,/opt/xensource/packages/iso
+agent.zip=../../../../../vms,0644,/opt/xensource/packages/resources/
+cloud-scripts.tgz=../../../../../vms,0644,/opt/xensource/packages/resources/
+patch-sysvms.sh=../../../../../vms,0644,/opt/xensource/packages/resources/
 id_rsa.cloud=../../../systemvm,0600,/root/.ssh
 network_info.sh=..,0755,/opt/cloud/bin
 setupxenserver.sh=..,0755,/opt/cloud/bin
diff --git a/scripts/vm/hypervisor/xenserver/xenserver62/patch 
b/scripts/vm/hypervisor/xenserver/xenserver62/patch
index db137c9..5fda3af 100644
--- a/scripts/vm/hypervisor/xenserver/xenserver62/patch
+++ b/scripts/vm/hypervisor/xenserver/xenserver62/patch
@@ -36,6 +36,9 @@ cloudstack_pluginlib.py=..,0755,/etc/xapi.d/plugins
 ovstunnel=..,0755,/etc/xapi.d/plugins
 cloud-plugin-storage=..,0755,/etc/xapi.d/plugins
 systemvm.iso=../../../../../vms,0644,/opt/xensource/packages/iso
+agent.zip=../../../../../vms,0644,/opt/xensource/packages/resources/
+cloud-scripts.tgz=../../../../../vms,0644,/opt/xensource/packages/resources/
+patch-sysvms.sh=../../../../../vms,0644,/opt/xensource/packages/resources/
 id_rsa.cloud=../../../systemvm,0600,/root/.ssh
 network_info.sh=..,0755,/opt/cloud/bin
 setupxenserver.sh=..,0755,/opt/cloud/bin
diff --git a/scripts/vm/hypervisor/xenserver/xenserver65/patch 
b/scripts/vm/hypervisor/xenserver/xenserver65/patch
index db137c9..5fda3af 100644
--- a/scripts/vm/hypervisor/xenserver/xenserver65/patch
+++ b/scripts/vm/hypervisor/xenserver/xenserver65/patch
@@ -36,6 +36,9 @@ cloudstack_pluginlib.py=..,0755,/etc/xapi.d/plugins
 ovstunnel=..,0755,/etc/xapi.d/plugins
 cloud-plugin-storage=..,0755,/etc/xapi.d/plugins
 systemvm.iso=../../../../../vms,0644,/opt/xensource/packages/iso
+agent.zip=../../../../../vms,0644,/opt/xensource/packages/resources/
+cloud-scripts.tgz=../../../../../vms,0644,/opt/xensource/packages/resources/
+patch-sysvms.sh=../../../../../vms,0644,/opt/xensource/packages/resources/
 id_rsa.cloud=../../../systemvm,0600,/root/.ssh
 network_info.sh=..,0755,/opt/cloud/bin
 setupxenserver.sh=..,0755,/opt/cloud/bin
diff --git a/tools/appliance/build.sh b/tools/appliance/build.sh
index 79de31a..7075c13 100755
--- a/tools/appliance/build.sh
+++ b/tools/appliance/build.sh
@@ -349,9 +349,9 @@ function main() {
 
   # process the disk at dist
   kvm_export
-#  ovm_export
-#  xen_server_export
-#  vmware_export
+  ovm_export
+  xen_server_export
+  vmware_export
 #  hyperv_export
   rm -f "dist/${appliance}"
   cd dist && chmod +r * && cd ..
diff --git a/utils/src/main/java/com/cloud/utils/FileUtil.java 
b/utils/src/main/java/com/cloud/utils/FileUtil.java
index c55dd74..2121d3a 100644
--- a/utils/src/main/java/com/cloud/utils/FileUtil.java
+++ b/utils/src/main/java/com/cloud/utils/FileUtil.java
@@ -21,12 +21,35 @@ package com.cloud.utils;
 
 import java.io.File;
 import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
 
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.utils.ssh.SshHelper;
 import org.apache.commons.io.FileUtils;
+import org.apache.log4j.Logger;
 
 public class FileUtil {
+    private static final Logger s_logger = Logger.getLogger(FileUtil.class);
 
     public static void copyfile(File source, File destination) throws 
IOException {
         FileUtils.copyFile(source, destination);
     }
+
+    public static void scpPatchFiles(String controlIp, String destPath, int 
sshPort, File pemFile, String[] files, String basePath) {
+        try {
+            List<String> srcFiles = Arrays.asList(files);
+            srcFiles = srcFiles.stream()
+                    .map(file -> basePath + file) // Using Lambda notation to 
update the entries
+                    .collect(Collectors.toList());
+            String[] newSrcFiles = srcFiles.toArray(new String[0]);
+            SshHelper.scpTo(controlIp, sshPort, "root", pemFile, null,
+                    destPath, newSrcFiles, "0755");
+        } catch (Exception e) {
+            String errMsg = "Failed to scp files to system VM";
+            s_logger.error(errMsg, e);
+            throw new CloudRuntimeException(errMsg, e);
+        }
+    }
 }

Reply via email to