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); + } + } }
