diff --git a/api/src/com/cloud/agent/api/GetDomRVersionAnswer.java b/api/src/com/cloud/agent/api/GetDomRVersionAnswer.java new file mode 100644 index 00000000000..016425551fc --- /dev/null +++ b/api/src/com/cloud/agent/api/GetDomRVersionAnswer.java @@ -0,0 +1,46 @@ +/** + * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +package com.cloud.agent.api; + +public class GetDomRVersionAnswer extends Answer { + public static final String ROUTER_NAME = "router.name"; + public static final String ROUTER_IP = "router.ip"; + String templateVersion; + String scriptsVersion; + + protected GetDomRVersionAnswer() { + } + + public GetDomRVersionAnswer(GetDomRVersionCmd cmd, String details, String templateVersion, String scriptsVersion) { + super(cmd, true, details); + this.templateVersion = templateVersion; + this.scriptsVersion = scriptsVersion; + } + + public GetDomRVersionAnswer(GetDomRVersionCmd cmd, String details) { + super(cmd, false, details); + } + + public String getTemplateVersion() { + return this.templateVersion; + } + + public String getScriptsVersion() { + return this.scriptsVersion; + } +} diff --git a/api/src/com/cloud/agent/api/GetDomRVersionCmd.java b/api/src/com/cloud/agent/api/GetDomRVersionCmd.java new file mode 100644 index 00000000000..f1cd128cf17 --- /dev/null +++ b/api/src/com/cloud/agent/api/GetDomRVersionCmd.java @@ -0,0 +1,31 @@ +/** + * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +package com.cloud.agent.api; + +import com.cloud.agent.api.routing.NetworkElementCommand; + +public class GetDomRVersionCmd extends NetworkElementCommand { + @Override + public boolean executeInSequence() { + return false; + } + + public GetDomRVersionCmd() { + super(); + } +} diff --git a/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java b/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java index e2de1702403..ab7c5a42825 100755 --- a/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java +++ b/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java @@ -44,6 +44,8 @@ import com.cloud.agent.api.BumpUpPriorityCommand; import com.cloud.agent.api.CheckRouterAnswer; import com.cloud.agent.api.CheckRouterCommand; import com.cloud.agent.api.Command; +import com.cloud.agent.api.GetDomRVersionAnswer; +import com.cloud.agent.api.GetDomRVersionCmd; import com.cloud.agent.api.proxy.CheckConsoleProxyLoadCommand; import com.cloud.agent.api.proxy.ConsoleProxyLoadAnswer; import com.cloud.agent.api.proxy.WatchConsoleProxyLoadCommand; @@ -96,6 +98,7 @@ public class VirtualRoutingResource implements Manager { private String _getRouterStatusPath; private String _bumpUpPriorityPath; private String _l2tpVpnPath; + private String _getDomRVersionPath; private int _timeout; @@ -136,6 +139,8 @@ public class VirtualRoutingResource implements Manager { return execute((RemoteAccessVpnCfgCommand)cmd); } else if (cmd instanceof VpnUsersCfgCommand) { return execute((VpnUsersCfgCommand)cmd); + } else if (cmd instanceof GetDomRVersionCmd) { + return execute((GetDomRVersionCmd)cmd); } else { return Answer.createUnsupportedCommandAnswer(cmd); @@ -495,6 +500,31 @@ public class VirtualRoutingResource implements Manager { return new Answer(cmd, true, null); } + protected String getDomRVersion(String routerIP) { + final Script command = new Script(_getDomRVersionPath, _timeout, s_logger); + final OutputInterpreter.OneLineParser parser = new OutputInterpreter.OneLineParser(); + command.add(routerIP); + String result = command.execute(parser); + if (result == null) { + return parser.getLine(); + } + return null; + } + + protected Answer execute(GetDomRVersionCmd cmd) { + final String routerPrivateIPAddress = cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP); + + final String result = getDomRVersion(routerPrivateIPAddress); + if (result == null || result.isEmpty()) { + return new GetDomRVersionAnswer(cmd, "GetDomRVersionCmd failed"); + } + String[] lines = result.split("&"); + if (lines.length != 2) { + return new GetDomRVersionAnswer(cmd, result); + } + return new GetDomRVersionAnswer(cmd, result, lines[0], lines[1]); + } + protected Answer execute(final CheckConsoleProxyLoadCommand cmd) { return executeProxyLoadScan(cmd, cmd.getProxyVmId(), cmd.getProxyVmName(), cmd.getProxyManagementIp(), cmd.getProxyCmdPort()); } @@ -826,6 +856,11 @@ public class VirtualRoutingResource implements Manager { throw new ConfigurationException("Unable to find l2tp_vpn.sh"); } + _getDomRVersionPath = findScript("getDomRVersion.sh"); + if(_getDomRVersionPath == null) { + throw new ConfigurationException("Unable to find getRouterStatus.sh"); + } + return true; } diff --git a/core/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java b/core/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java index 01801469037..50e485f69ab 100755 --- a/core/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java +++ b/core/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java @@ -54,6 +54,8 @@ import com.cloud.agent.api.DeleteSnapshotBackupAnswer; import com.cloud.agent.api.DeleteSnapshotBackupCommand; import com.cloud.agent.api.DeleteSnapshotsDirCommand; import com.cloud.agent.api.DeleteStoragePoolCommand; +import com.cloud.agent.api.GetDomRVersionAnswer; +import com.cloud.agent.api.GetDomRVersionCmd; import com.cloud.agent.api.GetHostStatsAnswer; import com.cloud.agent.api.GetHostStatsCommand; import com.cloud.agent.api.GetStorageStatsAnswer; @@ -393,6 +395,8 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa answer = execute((SetFirewallRulesCommand)cmd); } else if (cmd instanceof BumpUpPriorityCommand) { answer = execute((BumpUpPriorityCommand)cmd); + } else if (cmd instanceof GetDomRVersionCmd) { + answer = execute((GetDomRVersionCmd)cmd); } else { answer = Answer.createUnsupportedCommandAnswer(cmd); } @@ -935,6 +939,39 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa return new CheckRouterAnswer(cmd, result.second(), true); } + protected Answer execute(GetDomRVersionCmd cmd) { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Executing resource GetDomRVersionCmd: " + _gson.toJson(cmd)); + s_logger.debug("Run command on domR " + cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP) + ", /opt/cloud/bin/get_template_version.sh "); + } + + Pair result; + try { + VmwareManager mgr = getServiceContext().getStockObject(VmwareManager.CONTEXT_STOCK_NAME); + result = SshHelper.sshExecute(cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP), DEFAULT_DOMR_SSHPORT, "root", mgr.getSystemVMKeyFile(), null, + "/opt/cloud/bin/get_template_version.sh "); + + if (!result.first()) { + s_logger.error("GetDomRVersionCmd on domR " + cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP) + " failed, message: " + result.second()); + + return new GetDomRVersionAnswer(cmd, "GetDomRVersionCmd failed due to " + result.second()); + } + + if (s_logger.isDebugEnabled()) { + s_logger.debug("GetDomRVersionCmd on domain router " + cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP) + " completed"); + } + } catch (Throwable e) { + String msg = "GetDomRVersionCmd failed due to " + VmwareHelper.getExceptionMessage(e); + s_logger.error(msg); + return new GetDomRVersionAnswer(cmd, msg); + } + String[] lines = result.second().split("&"); + if (lines.length != 2) { + return new GetDomRVersionAnswer(cmd, result.second()); + } + return new GetDomRVersionAnswer(cmd, result.second(), lines[0], lines[1]); + } + protected Answer execute(BumpUpPriorityCommand cmd) { if (s_logger.isDebugEnabled()) { s_logger.debug("Executing resource BumpUpPriorityCommand: " + _gson.toJson(cmd)); diff --git a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java index a8d0228054c..0895baa4f71 100755 --- a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java +++ b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java @@ -89,6 +89,8 @@ import com.cloud.agent.api.GetVmStatsAnswer; import com.cloud.agent.api.GetVmStatsCommand; import com.cloud.agent.api.GetVncPortAnswer; import com.cloud.agent.api.GetVncPortCommand; +import com.cloud.agent.api.GetDomRVersionCmd; +import com.cloud.agent.api.GetDomRVersionAnswer; import com.cloud.agent.api.HostStatsEntry; import com.cloud.agent.api.ClusterSyncAnswer; import com.cloud.agent.api.ClusterSyncCommand; @@ -509,6 +511,8 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe return execute((BumpUpPriorityCommand)cmd); } else if (cmd instanceof ClusterSyncCommand) { return execute((ClusterSyncCommand)cmd); + } else if (cmd instanceof GetDomRVersionCmd) { + return execute((GetDomRVersionCmd)cmd); } else { return Answer.createUnsupportedCommandAnswer(cmd); } @@ -1228,6 +1232,20 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe return new CheckRouterAnswer(cmd, result, true); } + private GetDomRVersionAnswer execute(GetDomRVersionCmd cmd) { + Connection conn = getConnection(); + String args = cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP); + String result = callHostPlugin(conn, "vmops", "getDomRVersion", "args", args); + if (result == null || result.isEmpty()) { + return new GetDomRVersionAnswer(cmd, "getDomRVersionCmd failed"); + } + String[] lines = result.split("&"); + if (lines.length != 2) { + return new GetDomRVersionAnswer(cmd, result); + } + return new GetDomRVersionAnswer(cmd, result, lines[0], lines[1]); + } + private Answer execute(BumpUpPriorityCommand cmd) { Connection conn = getConnection(); String args = cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP); diff --git a/patches/systemvm/debian/config/opt/cloud/bin/get_template_version.sh b/patches/systemvm/debian/config/opt/cloud/bin/get_template_version.sh new file mode 100755 index 00000000000..4a5c3bce612 --- /dev/null +++ b/patches/systemvm/debian/config/opt/cloud/bin/get_template_version.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +echo -n `cat /etc/cloudstack-release`'&' +cat /var/cache/cloud/cloud-scripts-signature diff --git a/scripts/network/domr/getDomRVersion.sh b/scripts/network/domr/getDomRVersion.sh new file mode 100755 index 00000000000..127d697ff38 --- /dev/null +++ b/scripts/network/domr/getDomRVersion.sh @@ -0,0 +1,32 @@ +#!/bin/bash + +usage() { + printf "Usage:\n %s \n" $(basename $0) >&2 + printf " %s \n" $(basename $0) >&2 +} + +cert="/root/.ssh/id_rsa.cloud" +domRIp=$1 +shift + +# check if gateway domain is up and running +check_gw() { + ping -c 1 -n -q $1 > /dev/null + if [ $? -gt 0 ] + then + sleep 1 + ping -c 1 -n -q $1 > /dev/null + fi + return $?; +} + + +# Check if DomR is up and running. If not, exit with error code 1. +check_gw "$domRIp" +if [ $? -gt 0 ] +then + exit 1 +fi + +ssh -p 3922 -q -o StrictHostKeyChecking=no -i $cert root@$domRIp "/opt/cloud/bin/get_template_version.sh" +exit $? diff --git a/scripts/network/domr/getRouterStatus.sh b/scripts/network/domr/getRouterStatus.sh old mode 100644 new mode 100755 diff --git a/scripts/vm/hypervisor/xenserver/vmops b/scripts/vm/hypervisor/xenserver/vmops index ad570f9644a..db2955e614f 100755 --- a/scripts/vm/hypervisor/xenserver/vmops +++ b/scripts/vm/hypervisor/xenserver/vmops @@ -1140,6 +1140,20 @@ def bumpUpPriority(session, args): return txt +@echo +def getDomRVersion(session, args): + sargs = args['args'] + cmd = sargs.split(' ') + cmd.insert(0, "/opt/xensource/bin/getDomRVersion.sh") + cmd.insert(0, "/bin/bash") + try: + txt = util.pread2(cmd) + except: + util.SMlog(" get domR version fail! ") + txt = '' + + return txt + if __name__ == "__main__": XenAPIPlugin.dispatch({"pingtest": pingtest, "setup_iscsi":setup_iscsi, "gethostvmstats": gethostvmstats, "getvncport": getvncport, "getgateway": getgateway, "preparemigration": preparemigration, @@ -1154,4 +1168,4 @@ if __name__ == "__main__": "get_rule_logs_for_vms":get_rule_logs_for_vms, "setLinkLocalIP":setLinkLocalIP, "lt2p_vpn":lt2p_vpn, "cleanup_rules":cleanup_rules, "checkRouter":checkRouter, - "bumpUpPriority":bumpUpPriority }) + "bumpUpPriority":bumpUpPriority, "getDomRVersion":getDomRVersion }) diff --git a/scripts/vm/hypervisor/xenserver/xenserver56/patch b/scripts/vm/hypervisor/xenserver/xenserver56/patch index 414aa462aa0..29650fb305d 100644 --- a/scripts/vm/hypervisor/xenserver/xenserver56/patch +++ b/scripts/vm/hypervisor/xenserver/xenserver56/patch @@ -47,3 +47,4 @@ cloud-clean-vlan.sh=..,0755,/opt/xensource/bin cloud-prepare-upgrade.sh=..,0755,/opt/xensource/bin getRouterStatus.sh=../../../../network/domr/,0755,/opt/xensource/bin bumpUpPriority.sh=../../../../network/domr/,0755,/opt/xensource/bin +getDomRVersion.sh=../../../../network/domr/,0755,/opt/xensource/bin diff --git a/scripts/vm/hypervisor/xenserver/xenserver56fp1/patch b/scripts/vm/hypervisor/xenserver/xenserver56fp1/patch index 69458dd7e52..3d756351d30 100644 --- a/scripts/vm/hypervisor/xenserver/xenserver56fp1/patch +++ b/scripts/vm/hypervisor/xenserver/xenserver56fp1/patch @@ -47,3 +47,4 @@ cloud-clean-vlan.sh=..,0755,/opt/xensource/bin cloud-prepare-upgrade.sh=..,0755,/opt/xensource/bin getRouterStatus.sh=../../../../network/domr/,0755,/opt/xensource/bin bumpUpPriority.sh=../../../../network/domr/,0755,/opt/xensource/bin +getDomRVersion.sh=../../../../network/domr/,0755,/opt/xensource/bin