diff --git a/core/src/com/cloud/agent/api/StopCommand.java b/core/src/com/cloud/agent/api/StopCommand.java index b723d746cc3b..be68eefe1d55 100644 --- a/core/src/com/cloud/agent/api/StopCommand.java +++ b/core/src/com/cloud/agent/api/StopCommand.java @@ -28,6 +28,7 @@ public class StopCommand extends RebootCommand { private String publicConsoleProxyIpAddress = null; private GPUDeviceTO gpuDevice; boolean checkBeforeCleanup = false; + String controlIp = null; protected StopCommand() { } @@ -82,4 +83,12 @@ public void setGpuDevice(GPUDeviceTO gpuDevice) { public boolean checkBeforeCleanup() { return this.checkBeforeCleanup; } + + public String getControlIp(){ + return controlIp; + } + + public void setControlIp(String controlIp){ + this.controlIp =controlIp; + } } diff --git a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java index d19aaf372cc0..51d9d25faaab 100755 --- a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java +++ b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java @@ -1072,8 +1072,9 @@ public void orchestrateStart(final String vmUuid, final Map { List listByNetworkIdTypeAndGatewayAndBroadcastUri(long networkId, VirtualMachine.Type vmType, String gateway, URI broadcastUri); int countNicsForStartingVms(long networkId); + + NicVO getControlNicForVM(long vmId); } diff --git a/engine/schema/src/com/cloud/vm/dao/NicDaoImpl.java b/engine/schema/src/com/cloud/vm/dao/NicDaoImpl.java index f27088a44570..218c50aab07c 100644 --- a/engine/schema/src/com/cloud/vm/dao/NicDaoImpl.java +++ b/engine/schema/src/com/cloud/vm/dao/NicDaoImpl.java @@ -66,6 +66,7 @@ protected void init() { AllFieldsSearch.and("secondaryip", AllFieldsSearch.entity().getSecondaryIp(), Op.EQ); AllFieldsSearch.and("nicid", AllFieldsSearch.entity().getId(), Op.EQ); AllFieldsSearch.and("strategy", AllFieldsSearch.entity().getReservationStrategy(), Op.EQ); + AllFieldsSearch.and("reserverName",AllFieldsSearch.entity().getReserver(),Op.EQ); AllFieldsSearch.done(); IpSearch = createSearchBuilder(String.class); @@ -198,6 +199,14 @@ public NicVO findDefaultNicForVM(long instanceId) { return findOneBy(sc); } + @Override + public NicVO getControlNicForVM(long vmId){ + SearchCriteria sc = AllFieldsSearch.create(); + sc.setParameters("instance", vmId); + sc.setParameters("reserverName", "ControlNetworkGuru"); + return findOneBy(sc); + } + @Override public NicVO findNonReleasedByInstanceIdAndNetworkId(long networkId, long instanceId) { SearchCriteria sc = NonReleasedSearch.create(); diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtStopCommandWrapper.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtStopCommandWrapper.java index f7e088bfd23a..a9eb3934fad7 100644 --- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtStopCommandWrapper.java +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtStopCommandWrapper.java @@ -20,12 +20,14 @@ package com.cloud.hypervisor.kvm.resource.wrapper; import java.util.List; +import java.io.File; +import com.cloud.utils.Pair; +import com.cloud.utils.ssh.SshHelper; import org.apache.log4j.Logger; import org.libvirt.Connect; import org.libvirt.Domain; import org.libvirt.DomainInfo.DomainState; -import org.libvirt.LibvirtException; import com.cloud.agent.api.Answer; import com.cloud.agent.api.StopAnswer; @@ -36,11 +38,14 @@ import com.cloud.hypervisor.kvm.resource.VifDriver; import com.cloud.resource.CommandWrapper; import com.cloud.resource.ResourceWrapper; +import org.libvirt.LibvirtException; @ResourceWrapper(handles = StopCommand.class) public final class LibvirtStopCommandWrapper extends CommandWrapper { private static final Logger s_logger = Logger.getLogger(LibvirtStopCommandWrapper.class); + private static final String CMDLINE_PATH = "/var/cache/cloud/cmdline"; + private static final String CMDLINE_BACKUP_PATH = "/var/cache/cloud/cmdline.backup"; @Override public Answer execute(final StopCommand command, final LibvirtComputingResource libvirtComputingResource) { @@ -59,8 +64,21 @@ public Answer execute(final StopCommand command, final LibvirtComputingResource s_logger.debug("Failed to get vm status in case of checkboforecleanup is true", e); } } - + File pemFile = new File(LibvirtComputingResource.SSHPRVKEYPATH); try { + if(vmName.startsWith("s-") || vmName.startsWith("v-")){ + //move the command line file to backup. + s_logger.debug("backing up the cmdline"); + try{ + Pair ret = SshHelper.sshExecute(command.getControlIp(), 3922, "root", pemFile, null,"mv -f "+CMDLINE_PATH+" "+CMDLINE_BACKUP_PATH); + if(!ret.first()){ + s_logger.debug("Failed to backup cmdline file due to "+ret.second()); + } + } catch (Exception e){ + s_logger.debug("Failed to backup cmdline file due to "+e.getMessage()); + } + } + final Connect conn = libvirtUtilitiesHelper.getConnectionByVmName(vmName); final List disks = libvirtComputingResource.getDisks(conn, vmName); @@ -83,7 +101,18 @@ public Answer execute(final StopCommand command, final LibvirtComputingResource return new StopAnswer(command, result, true); } catch (final LibvirtException e) { + s_logger.debug("unable to stop VM:"+vmName+" due to"+e.getMessage()); + try{ + if(vmName.startsWith("s-") || vmName.startsWith("v-")) + s_logger.debug("restoring cmdline file from backup"); + Pair ret = SshHelper.sshExecute(command.getControlIp(), 3922, "root", pemFile, null, "mv "+CMDLINE_BACKUP_PATH+" "+CMDLINE_PATH); + if(!ret.first()){ + s_logger.debug("unable to restore cmdline due to "+ret.second()); + } + }catch (final Exception ex){ + s_logger.debug("unable to restore cmdline due to:"+ex.getMessage()); + } return new StopAnswer(command, e.getMessage(), false); } } -} \ No newline at end of file +}