From 077ca1489c01ba30426501c4dec3bc41984df57e Mon Sep 17 00:00:00 2001 From: kishan Date: Thu, 28 Jun 2012 18:06:30 -0700 Subject: [PATCH] bug CS-15389: Added prepareStop to Virtualmachine manager and moved network usage collection into prepareStop of VR manager --- .../agent/manager/MockVmManagerImpl.java | 4 +- .../cloud/resource/AgentRoutingResource.java | 4 +- .../CloudZonesComputingResource.java | 9 +- .../computing/FakeComputingResource.java | 11 +- .../computing/LibvirtComputingResource.java | 25 +--- api/src/com/cloud/agent/api/RebootAnswer.java | 33 +---- api/src/com/cloud/agent/api/StopAnswer.java | 8 +- api/src/com/cloud/agent/api/StopCommand.java | 10 -- .../vmware/resource/VmwareResource.java | 41 ++---- .../xen/resource/CitrixResourceBase.java | 44 ++---- .../cloud/ovm/hypervisor/OvmResourceBase.java | 10 +- .../baremetal/BareMetalResourceBase.java | 6 +- .../AgentBasedConsoleProxyManager.java | 4 + .../consoleproxy/ConsoleProxyManagerImpl.java | 4 + .../lb/ElasticLoadBalancerManagerImpl.java | 6 + .../VirtualNetworkApplianceManagerImpl.java | 125 ++++++++++++++---- .../SecondaryStorageManagerImpl.java | 5 + .../src/com/cloud/vm/UserVmManagerImpl.java | 4 + .../src/com/cloud/vm/VirtualMachineGuru.java | 7 + .../cloud/vm/VirtualMachineManagerImpl.java | 9 +- 20 files changed, 187 insertions(+), 182 deletions(-) diff --git a/agent-simulator/src/com/cloud/agent/manager/MockVmManagerImpl.java b/agent-simulator/src/com/cloud/agent/manager/MockVmManagerImpl.java index b1b370a8598..cc98cf9371e 100644 --- a/agent-simulator/src/com/cloud/agent/manager/MockVmManagerImpl.java +++ b/agent-simulator/src/com/cloud/agent/manager/MockVmManagerImpl.java @@ -348,12 +348,12 @@ public class MockVmManagerImpl implements MockVmManager { _mockAgentMgr.handleSystemVMStop(vm.getId()); } - return new StopAnswer(cmd, null, new Integer(0), new Long(100), new Long(200)); + return new StopAnswer(cmd, null, new Integer(0), true); } @Override public Answer rebootVM(RebootCommand cmd) { - return new RebootAnswer(cmd, "Rebooted "+cmd.getVmName()); + return new RebootAnswer(cmd, "Rebooted "+cmd.getVmName(), false); } @Override diff --git a/agent-simulator/src/com/cloud/resource/AgentRoutingResource.java b/agent-simulator/src/com/cloud/resource/AgentRoutingResource.java index 55bcc2909bc..fe4534f681a 100644 --- a/agent-simulator/src/com/cloud/resource/AgentRoutingResource.java +++ b/agent-simulator/src/com/cloud/resource/AgentRoutingResource.java @@ -229,10 +229,10 @@ public class AgentRoutingResource extends AgentStorageResource { Answer result = _simMgr.simulate(cmd, hostGuid); if (!result.getResult()) { - return new StopAnswer(cmd, result.getDetails()); + return new StopAnswer(cmd, result.getDetails(), false); } - answer = new StopAnswer(cmd, null, 0, new Long(100), new Long(200)); + answer = new StopAnswer(cmd, null, 0, true); Pair data = _runningVms.get(vmName); if (data != null) { this.usedCpu -= data.first(); diff --git a/agent/src/com/cloud/agent/resource/computing/CloudZonesComputingResource.java b/agent/src/com/cloud/agent/resource/computing/CloudZonesComputingResource.java index 49763107f11..12541fbd3ac 100644 --- a/agent/src/com/cloud/agent/resource/computing/CloudZonesComputingResource.java +++ b/agent/src/com/cloud/agent/resource/computing/CloudZonesComputingResource.java @@ -215,9 +215,6 @@ public class CloudZonesComputingResource extends LibvirtComputingResource { protected Answer execute(StopCommand cmd) { final String vmName = cmd.getVmName(); - Long bytesReceived = new Long(0); - Long bytesSent = new Long(0); - State state = null; synchronized (_vms) { state = _vms.get(vmName); @@ -231,7 +228,7 @@ public class CloudZonesComputingResource extends LibvirtComputingResource { .nameUUIDFromBytes(vmName.getBytes())); } catch (LibvirtException e) { state = State.Stopped; - return new StopAnswer(cmd, null, 0, bytesSent, bytesReceived); + return new StopAnswer(cmd, null, 0, true); } String macAddress = null; @@ -254,9 +251,9 @@ public class CloudZonesComputingResource extends LibvirtComputingResource { } state = State.Stopped; - return new StopAnswer(cmd, result, 0, bytesSent, bytesReceived); + return new StopAnswer(cmd, result, 0, true); } catch (LibvirtException e) { - return new StopAnswer(cmd, e.getMessage()); + return new StopAnswer(cmd, e.getMessage(), false); } finally { synchronized (_vms) { if (state != null) { diff --git a/agent/src/com/cloud/agent/resource/computing/FakeComputingResource.java b/agent/src/com/cloud/agent/resource/computing/FakeComputingResource.java index 0c1e2926b52..5f659301960 100644 --- a/agent/src/com/cloud/agent/resource/computing/FakeComputingResource.java +++ b/agent/src/com/cloud/agent/resource/computing/FakeComputingResource.java @@ -439,8 +439,6 @@ public class FakeComputingResource extends ServerResourceBase implements String vmName = cmd.getVmName(); Integer port = vmMgr.getVncPort(vmName); - Long bytesReceived = null; - Long bytesSent = null; State state = null; synchronized (_vms) { @@ -458,17 +456,16 @@ public class FakeComputingResource extends ServerResourceBase implements s_logger.warn("Couldn't stop " + vmName); if (result != null) { - return new StopAnswer(cmd, result); + return new StopAnswer(cmd, result, false); } } - answer = new StopAnswer(cmd, null, port, bytesSent, bytesReceived); + answer = new StopAnswer(cmd, null, port, true); String result2 = vmMgr.cleanupVnet(cmd.getVnet()); if (result2 != null) { result = result2 + (result != null ? ("\n" + result) : ""); - answer = new StopAnswer(cmd, result, port, bytesSent, - bytesReceived); + answer = new StopAnswer(cmd, result, port, true); } _dhcpSnooper.cleanup(vmName, null); @@ -494,7 +491,7 @@ public class FakeComputingResource extends ServerResourceBase implements protected Answer execute(RebootCommand cmd) { VmMgr vmMgr = getVmManager(); vmMgr.rebootVM(cmd.getVmName()); - return new RebootAnswer(cmd, "success", 0L, 0L); + return new RebootAnswer(cmd, "success", true); } private Answer execute(PingTestCommand cmd) { diff --git a/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java b/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java index 26cb3dcc719..2bab8c2717c 100755 --- a/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java +++ b/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java @@ -2221,8 +2221,6 @@ public class LibvirtComputingResource extends ServerResourceBase implements } private Answer execute(RebootCommand cmd) { - Long bytesReceived = null; - Long bytesSent = null; synchronized (_vms) { _vms.put(cmd.getVmName(), State.Starting); @@ -2239,13 +2237,12 @@ public class LibvirtComputingResource extends ServerResourceBase implements } get_rule_logs_for_vms(); - return new RebootAnswer(cmd, null, bytesSent, bytesReceived, - vncPort); + return new RebootAnswer(cmd, null, vncPort); } else { - return new RebootAnswer(cmd, result); + return new RebootAnswer(cmd, result, false); } } catch (LibvirtException e) { - return new RebootAnswer(cmd, e.getMessage()); + return new RebootAnswer(cmd, e.getMessage(), false); } finally { synchronized (_vms) { _vms.put(cmd.getVmName(), State.Running); @@ -2254,16 +2251,7 @@ public class LibvirtComputingResource extends ServerResourceBase implements } protected Answer execute(RebootRouterCommand cmd) { - Long bytesSent = 0L; - Long bytesRcvd = 0L; - if (VirtualMachineName.isValidRouterName(cmd.getVmName())) { - long[] stats = getNetworkStats(cmd.getPrivateIpAddress()); - bytesSent = stats[0]; - bytesRcvd = stats[1]; - } RebootAnswer answer = (RebootAnswer) execute((RebootCommand) cmd); - answer.setBytesSent(bytesSent); - answer.setBytesReceived(bytesRcvd); String result = _virtRouterResource.connect(cmd.getPrivateIpAddress()); if (result == null) { networkUsage(cmd.getPrivateIpAddress(), "create", null); @@ -2296,9 +2284,6 @@ public class LibvirtComputingResource extends ServerResourceBase implements protected Answer execute(StopCommand cmd) { final String vmName = cmd.getVmName(); - Long bytesReceived = new Long(0); - Long bytesSent = new Long(0); - State state = null; synchronized (_vms) { state = _vms.get(vmName); @@ -2324,9 +2309,9 @@ public class LibvirtComputingResource extends ServerResourceBase implements result = result2 + result; } state = State.Stopped; - return new StopAnswer(cmd, result, 0, bytesSent, bytesReceived); + return new StopAnswer(cmd, result, 0, true); } catch (LibvirtException e) { - return new StopAnswer(cmd, e.getMessage()); + return new StopAnswer(cmd, e.getMessage(), false); } finally { synchronized (_vms) { if (state != null) { diff --git a/api/src/com/cloud/agent/api/RebootAnswer.java b/api/src/com/cloud/agent/api/RebootAnswer.java index 2900fb3b3ef..a4eabad4c2f 100644 --- a/api/src/com/cloud/agent/api/RebootAnswer.java +++ b/api/src/com/cloud/agent/api/RebootAnswer.java @@ -13,52 +13,25 @@ package com.cloud.agent.api; public class RebootAnswer extends Answer { - Long bytesSent; - Long bytesReceived; Integer vncPort; protected RebootAnswer() { } - public RebootAnswer(RebootCommand cmd, String details, Long bytesSent, Long bytesReceived, Integer vncport) { + public RebootAnswer(RebootCommand cmd, String details, Integer vncport) { super(cmd, true, details); - this.bytesReceived = bytesReceived; - this.bytesSent = bytesSent; this.vncPort = vncport; } - public RebootAnswer(RebootCommand cmd, String details, Long bytesSent, Long bytesReceived) { - super(cmd, true, details); - this.bytesReceived = bytesReceived; - this.bytesSent = bytesSent; + public RebootAnswer(RebootCommand cmd, String details, boolean success) { + super(cmd, success, details); this.vncPort = null; } - public RebootAnswer(RebootCommand cmd, String details) { - super(cmd, false, details); - bytesSent = null; - bytesReceived = null; - } - public RebootAnswer(RebootCommand cmd, Exception e) { super(cmd, e); } - public void setBytesReceived(Long bytesReceived) { - this.bytesReceived = bytesReceived; - } - - public Long getBytesReceived() { - return bytesReceived; - } - - public void setBytesSent(Long bytesSent) { - this.bytesSent = bytesSent; - } - - public Long getBytesSent() { - return bytesSent; - } public Integer getVncPort() { return vncPort; } diff --git a/api/src/com/cloud/agent/api/StopAnswer.java b/api/src/com/cloud/agent/api/StopAnswer.java index f32089cff9d..cb20a8247d1 100755 --- a/api/src/com/cloud/agent/api/StopAnswer.java +++ b/api/src/com/cloud/agent/api/StopAnswer.java @@ -18,13 +18,13 @@ public class StopAnswer extends RebootAnswer { protected StopAnswer() { } - public StopAnswer(StopCommand cmd, String details, Integer vncPort, Long bytesSent, Long bytesReceived) { - super(cmd, details, bytesSent, bytesReceived); + public StopAnswer(StopCommand cmd, String details, Integer vncPort, boolean success) { + super(cmd, details, success); this.vncPort = vncPort; } - public StopAnswer(StopCommand cmd, String details) { - super(cmd, details); + public StopAnswer(StopCommand cmd, String details, boolean success) { + super(cmd, details, success); vncPort = null; } diff --git a/api/src/com/cloud/agent/api/StopCommand.java b/api/src/com/cloud/agent/api/StopCommand.java index 0bbced8f92a..63ba9e071aa 100755 --- a/api/src/com/cloud/agent/api/StopCommand.java +++ b/api/src/com/cloud/agent/api/StopCommand.java @@ -19,7 +19,6 @@ public class StopCommand extends RebootCommand { private boolean isProxy=false; private String urlPort=null; private String publicConsoleProxyIpAddress=null; - private String privateRouterIpAddress=null; protected StopCommand() { } @@ -41,12 +40,6 @@ public class StopCommand extends RebootCommand { this.vnet = vnet; } - public StopCommand(VirtualMachine vm, String vmName, String vnet, String privateRouterIpAddress) { - super(vmName); - this.vnet = vnet; - this.privateRouterIpAddress = privateRouterIpAddress; - } - public StopCommand(String vmName) { super(vmName); } @@ -72,7 +65,4 @@ public class StopCommand extends RebootCommand { return this.publicConsoleProxyIpAddress; } - public String getPrivateRouterIpAddress() { - return privateRouterIpAddress; - } } diff --git a/core/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java b/core/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java index 19e90cb3531..3668930f6b9 100755 --- a/core/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java +++ b/core/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java @@ -2314,17 +2314,6 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa vmMo.setCustomFieldValue(CustomFieldConstants.CLOUD_NIC_MASK, "0"); if (getVmState(vmMo) != State.Stopped) { - Long bytesSent = 0L; - Long bytesRcvd = 0L; - - if (VirtualMachineName.isValidRouterName(cmd.getVmName())) { - //Private IP is 0.0.0.0 for Direct Network virtual router and network usage is not metered for Direct network from Virtual Router - if (cmd.getPrivateRouterIpAddress() != null && !"0.0.0.0".equals(cmd.getPrivateRouterIpAddress())) { - long[] stats = getNetworkStats(cmd.getPrivateRouterIpAddress()); - bytesSent = stats[0]; - bytesRcvd = stats[1]; - } - } // before we stop VM, remove all possible snapshots on the VM to let // disk chain be collapsed @@ -2332,11 +2321,11 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa vmMo.removeAllSnapshots(); if (vmMo.safePowerOff(_shutdown_waitMs)) { state = State.Stopped; - return new StopAnswer(cmd, "Stop VM " + cmd.getVmName() + " Succeed", 0, bytesSent, bytesRcvd); + return new StopAnswer(cmd, "Stop VM " + cmd.getVmName() + " Succeed", 0, true); } else { String msg = "Have problem in powering off VM " + cmd.getVmName() + ", let the process continue"; s_logger.warn(msg); - return new StopAnswer(cmd, msg, 0, 0L, 0L); + return new StopAnswer(cmd, msg, 0, true); } } else { state = State.Stopped; @@ -2344,7 +2333,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa String msg = "VM " + cmd.getVmName() + " is already in stopped state"; s_logger.info(msg); - return new StopAnswer(cmd, msg, 0, 0L, 0L); + return new StopAnswer(cmd, msg, 0, true); } finally { synchronized (_vms) { _vms.put(cmd.getVmName(), state); @@ -2357,7 +2346,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa String msg = "VM " + cmd.getVmName() + " is no longer in vSphere"; s_logger.info(msg); - return new StopAnswer(cmd, msg, 0, 0L, 0L); + return new StopAnswer(cmd, msg, 0, true); } } catch (Exception e) { if (e instanceof RemoteException) { @@ -2367,7 +2356,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa String msg = "StopCommand failed due to " + VmwareHelper.getExceptionMessage(e); s_logger.error(msg); - return new StopAnswer(cmd, msg); + return new StopAnswer(cmd, msg, false); } } @@ -2376,17 +2365,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa s_logger.info("Executing resource RebootRouterCommand: " + _gson.toJson(cmd)); } - Long bytesSent = 0L; - Long bytesRcvd = 0L; - if (VirtualMachineName.isValidRouterName(cmd.getVmName())) { - long[] stats = getNetworkStats(cmd.getPrivateIpAddress()); - bytesSent = stats[0]; - bytesRcvd = stats[1]; - } - RebootAnswer answer = (RebootAnswer) execute((RebootCommand) cmd); - answer.setBytesSent(bytesSent); - answer.setBytesReceived(bytesRcvd); if (answer.getResult()) { String connectResult = connect(cmd.getVmName(), cmd.getPrivateIpAddress()); @@ -2412,7 +2391,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa if (vmMo != null) { try { vmMo.rebootGuest(); - return new RebootAnswer(cmd, "reboot succeeded", null, null); + return new RebootAnswer(cmd, "reboot succeeded", true); } catch(ToolsUnavailable e) { s_logger.warn("VMware tools is not installed at guest OS, we will perform hard reset for reboot"); } catch(Exception e) { @@ -2421,16 +2400,16 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa // continue to try with hard-reset if (vmMo.reset()) { - return new RebootAnswer(cmd, "reboot succeeded", null, null); + return new RebootAnswer(cmd, "reboot succeeded", true); } String msg = "Reboot failed in vSphere. vm: " + cmd.getVmName(); s_logger.warn(msg); - return new RebootAnswer(cmd, msg); + return new RebootAnswer(cmd, msg, false); } else { String msg = "Unable to find the VM in vSphere to reboot. vm: " + cmd.getVmName(); s_logger.warn(msg); - return new RebootAnswer(cmd, msg); + return new RebootAnswer(cmd, msg, false); } } catch (Exception e) { if (e instanceof RemoteException) { @@ -2440,7 +2419,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa String msg = "RebootCommand failed due to " + VmwareHelper.getExceptionMessage(e); s_logger.error(msg); - return new RebootAnswer(cmd, msg); + return new RebootAnswer(cmd, msg, false); } } diff --git a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java index 9b23d6b3cc8..4a700cd9177 100644 --- a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java +++ b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java @@ -217,7 +217,6 @@ import com.cloud.utils.net.NetUtils; import com.cloud.vm.DiskProfile; import com.cloud.vm.VirtualMachine; import com.cloud.vm.VirtualMachine.State; -import com.cloud.vm.VirtualMachineName; import com.trilead.ssh2.SCPClient; import com.xensource.xenapi.Bond; import com.xensource.xenapi.Connection; @@ -2981,10 +2980,10 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe vms = VM.getByNameLabel(conn, cmd.getVmName()); } catch (XenAPIException e0) { s_logger.debug("getByNameLabel failed " + e0.toString()); - return new RebootAnswer(cmd, "getByNameLabel failed " + e0.toString()); + return new RebootAnswer(cmd, "getByNameLabel failed " + e0.toString(), false); } catch (Exception e0) { s_logger.debug("getByNameLabel failed " + e0.getMessage()); - return new RebootAnswer(cmd, "getByNameLabel failed"); + return new RebootAnswer(cmd, "getByNameLabel failed", false); } for (VM vm : vms) { try { @@ -2992,10 +2991,10 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe } catch (Exception e) { String msg = e.toString(); s_logger.warn(msg, e); - return new RebootAnswer(cmd, msg); + return new RebootAnswer(cmd, msg, false); } } - return new RebootAnswer(cmd, "reboot succeeded", null, null); + return new RebootAnswer(cmd, "reboot succeeded", true); } finally { synchronized (_cluster.intern()) { s_vms.put(_cluster, _name, cmd.getVmName(), State.Running); @@ -3006,16 +3005,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe protected Answer execute(RebootRouterCommand cmd) { Connection conn = getConnection(); - Long bytesSent = 0L; - Long bytesRcvd = 0L; - if (VirtualMachineName.isValidRouterName(cmd.getVmName())) { - long[] stats = getNetworkStats(conn, cmd.getPrivateIpAddress()); - bytesSent = stats[0]; - bytesRcvd = stats[1]; - } RebootAnswer answer = execute((RebootCommand) cmd); - answer.setBytesSent(bytesSent); - answer.setBytesReceived(bytesRcvd); if (answer.getResult()) { String cnct = connect(conn, cmd.getVmName(), cmd.getPrivateIpAddress()); networkUsage(conn, cmd.getPrivateIpAddress(), "create", null); @@ -3478,23 +3468,21 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe s_logger.info("VM does not exist on XenServer" + _host.uuid); s_vms.remove(_cluster, _name, vmName); } - return new StopAnswer(cmd, "VM does not exist", 0 , 0L, 0L); + return new StopAnswer(cmd, "VM does not exist", 0 , true); } - Long bytesSent = 0L; - Long bytesRcvd = 0L; for (VM vm : vms) { VM.Record vmr = vm.getRecord(conn); if (vmr.isControlDomain) { String msg = "Tring to Shutdown control domain"; s_logger.warn(msg); - return new StopAnswer(cmd, msg); + return new StopAnswer(cmd, msg, false); } if (vmr.powerState == VmPowerState.RUNNING && !isRefNull(vmr.residentOn) && !vmr.residentOn.getUuid(conn).equals(_host.uuid)) { String msg = "Stop Vm " + vmName + " failed due to this vm is not running on this host: " + _host.uuid + " but host:" + vmr.residentOn.getUuid(conn); s_logger.warn(msg); - return new StopAnswer(cmd, msg); + return new StopAnswer(cmd, msg, false); } State state = s_vms.getState(_cluster, vmName); @@ -3508,13 +3496,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe if (vmr.powerState == VmPowerState.RUNNING) { /* when stop a vm, set affinity to current xenserver */ vm.setAffinity(conn, vm.getResidentOn(conn)); - if (VirtualMachineName.isValidRouterName(vmName)) { - if (cmd.getPrivateRouterIpAddress() != null) { - long[] stats = getNetworkStats(conn, cmd.getPrivateRouterIpAddress()); - bytesSent = stats[0]; - bytesRcvd = stats[1]; - } - } + if (_canBridgeFirewall) { String result = callHostPlugin(conn, "vmops", "destroy_network_rules_for_vm", "vmName", cmd .getVmName()); @@ -3529,7 +3511,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe } catch (Exception e) { String msg = "Catch exception " + e.getClass().getName() + " when stop VM:" + cmd.getVmName() + " due to " + e.toString(); s_logger.debug(msg); - return new StopAnswer(cmd, msg); + return new StopAnswer(cmd, msg, false); } finally { try { @@ -3554,7 +3536,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe disableVlanNetwork(conn, network); } } - return new StopAnswer(cmd, "Stop VM " + vmName + " Succeed", 0, bytesSent, bytesRcvd); + return new StopAnswer(cmd, "Stop VM " + vmName + " Succeed", 0, true); } } catch (XenAPIException e) { String msg = "VM destroy failed in Stop " + vmName + " Command due to " + e.toString(); @@ -3574,16 +3556,16 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe } catch (XenAPIException e) { String msg = "Stop Vm " + vmName + " fail due to " + e.toString(); s_logger.warn(msg, e); - return new StopAnswer(cmd, msg); + return new StopAnswer(cmd, msg, false); } catch (XmlRpcException e) { String msg = "Stop Vm " + vmName + " fail due to " + e.getMessage(); s_logger.warn(msg, e); - return new StopAnswer(cmd, msg); + return new StopAnswer(cmd, msg, false); } catch (Exception e) { s_logger.warn("Unable to stop " + vmName + " due to ", e); return new StopAnswer(cmd, e); } - return new StopAnswer(cmd, "Stop VM failed"); + return new StopAnswer(cmd, "Stop VM failed", false); } private List getVdis(Connection conn, VM vm) { diff --git a/ovm/src/com/cloud/ovm/hypervisor/OvmResourceBase.java b/ovm/src/com/cloud/ovm/hypervisor/OvmResourceBase.java index 8232112ab5a..6def28f5dd6 100755 --- a/ovm/src/com/cloud/ovm/hypervisor/OvmResourceBase.java +++ b/ovm/src/com/cloud/ovm/hypervisor/OvmResourceBase.java @@ -712,7 +712,7 @@ public class OvmResourceBase implements ServerResource, HypervisorResource { vm = OvmVm.getDetails(_conn, vmName); } catch (XmlRpcException e) { s_logger.debug("Unable to get details of vm: " + vmName + ", treating it as stopped", e); - return new StopAnswer(cmd, "success", 0, 0L, 0L); + return new StopAnswer(cmd, "success", 0, true); } deleteAllNetworkRulesForVm(vmName); @@ -720,10 +720,10 @@ public class OvmResourceBase implements ServerResource, HypervisorResource { cleanup(vm); state = State.Stopped; - return new StopAnswer(cmd, "success", 0, 0L, 0L); + return new StopAnswer(cmd, "success", 0, true); } catch (Exception e) { s_logger.debug("Stop " + vmName + "failed", e); - return new StopAnswer(cmd, e.getMessage()); + return new StopAnswer(cmd, e.getMessage(), false); } finally { synchronized(_vms) { if (state != null) { @@ -745,10 +745,10 @@ public class OvmResourceBase implements ServerResource, HypervisorResource { try { Map res = OvmVm.reboot(_conn, vmName); Integer vncPort = Integer.parseInt(res.get("vncPort")); - return new RebootAnswer(cmd, null, null, null, vncPort); + return new RebootAnswer(cmd, null, vncPort); } catch (Exception e) { s_logger.debug("Reboot " + vmName + " failed", e); - return new RebootAnswer(cmd, e.getMessage()); + return new RebootAnswer(cmd, e.getMessage(), false); } finally { synchronized(_vms) { _vms.put(cmd.getVmName(), State.Running); diff --git a/server/src/com/cloud/baremetal/BareMetalResourceBase.java b/server/src/com/cloud/baremetal/BareMetalResourceBase.java index 7b4556c4f1b..76ba08cb3ce 100755 --- a/server/src/com/cloud/baremetal/BareMetalResourceBase.java +++ b/server/src/com/cloud/baremetal/BareMetalResourceBase.java @@ -425,10 +425,10 @@ public class BareMetalResourceBase implements ServerResource { protected RebootAnswer execute(final RebootCommand cmd) { if (!doScript(_rebootCommand)) { - return new RebootAnswer(cmd, "IPMI reboot failed"); + return new RebootAnswer(cmd, "IPMI reboot failed", false); } - return new RebootAnswer(cmd, "reboot succeeded", null, null); + return new RebootAnswer(cmd, "reboot succeeded", true); } protected StopAnswer execute(final StopCommand cmd) { @@ -463,7 +463,7 @@ public class BareMetalResourceBase implements ServerResource { count++; } - return success ? new StopAnswer(cmd, "Success", null, Long.valueOf(0), Long.valueOf(0)) : new StopAnswer(cmd, "IPMI power off failed"); + return success ? new StopAnswer(cmd, "Success", null, true) : new StopAnswer(cmd, "IPMI power off failed", false); } protected StartAnswer execute(StartCommand cmd) { diff --git a/server/src/com/cloud/consoleproxy/AgentBasedConsoleProxyManager.java b/server/src/com/cloud/consoleproxy/AgentBasedConsoleProxyManager.java index 983e90932c3..3c6716ca64d 100755 --- a/server/src/com/cloud/consoleproxy/AgentBasedConsoleProxyManager.java +++ b/server/src/com/cloud/consoleproxy/AgentBasedConsoleProxyManager.java @@ -363,4 +363,8 @@ public class AgentBasedConsoleProxyManager implements ConsoleProxyManager, Virtu //not supported throw new UnsupportedOperationException("Unplug nic is not supported for vm of type " + vm.getType()); } + + @Override + public void prepareStop(VirtualMachineProfile profile) { + } } diff --git a/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java b/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java index 492b05f2bbe..61d6cd4c920 100755 --- a/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java +++ b/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java @@ -2006,4 +2006,8 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx //not supported throw new UnsupportedOperationException("Unplug nic is not supported for vm of type " + vm.getType()); } + + @Override + public void prepareStop(VirtualMachineProfile profile) { + } } diff --git a/server/src/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java b/server/src/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java index 704d400a3fa..793698a6e1b 100644 --- a/server/src/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java +++ b/server/src/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java @@ -1020,4 +1020,10 @@ public class ElasticLoadBalancerManagerImpl implements //not supported throw new UnsupportedOperationException("Unplug nic is not supported for vm of type " + vm.getType()); } + + + @Override + public void prepareStop(VirtualMachineProfile profile) { + + } } diff --git a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java index d400742ae39..6bbc24cc546 100755 --- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java +++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java @@ -502,34 +502,13 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian final UserStatisticsVO userStats = _userStatsDao.lock(router.getAccountId(), router.getDataCenterIdToDeployIn(), guestNtwkId, null, router.getId(), router.getType().toString()); if (userStats != null) { - final RebootAnswer sa = (RebootAnswer) answer; - final Long received = sa.getBytesReceived(); - long netBytes = 0; - if (received != null) { - if (received.longValue() >= userStats.getCurrentBytesReceived()) { - netBytes = received.longValue(); - } else { - netBytes = userStats.getCurrentBytesReceived() + received; - } - } else { - netBytes = userStats.getCurrentBytesReceived(); - } + final long currentBytesRcvd = userStats.getCurrentBytesReceived(); userStats.setCurrentBytesReceived(0); - userStats.setNetBytesReceived(userStats.getNetBytesReceived() + netBytes); + userStats.setNetBytesReceived(userStats.getNetBytesReceived() + currentBytesRcvd); - final Long sent = sa.getBytesSent(); - - if (sent != null) { - if (sent.longValue() >= userStats.getCurrentBytesSent()) { - netBytes = sent.longValue(); - } else { - netBytes = userStats.getCurrentBytesSent() + sent; - } - } else { - netBytes = userStats.getCurrentBytesSent(); - } - userStats.setNetBytesSent(userStats.getNetBytesSent() + netBytes); + final long currentBytesSent = userStats.getCurrentBytesSent(); userStats.setCurrentBytesSent(0); + userStats.setNetBytesSent(userStats.getNetBytesSent() + currentBytesSent); _userStatsDao.update(userStats.getId(), userStats); s_logger.debug("Successfully updated user statistics as a part of domR " + router + " reboot/stop"); } else { @@ -540,7 +519,7 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian txn.commit(); } catch (final Exception e) { txn.rollback(); - throw new CloudRuntimeException("Problem getting stats after reboot/stop ", e); + throw new CloudRuntimeException("Problem updating stats after reboot/stop ", e); } } @@ -3210,4 +3189,98 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian throw new UnsupportedOperationException("Unplug nic is not supported for vm of type " + vm.getType()); } + @Override + public void prepareStop(VirtualMachineProfile profile){ + //Collect network usage before stopping Vm + VMInstanceVO vm = profile.getVirtualMachine(); + DomainRouterVO router = _routerDao.findById(vm.getId()); + if(router == null){ + return; + } + String privateIP = router.getPrivateIpAddress(); + + if (privateIP != null) { + List routerGuestNtwkIds = _routerDao.getRouterNetworks(router.getId()); + + for (Long guestNtwkId : routerGuestNtwkIds) { + boolean forVpc = router.getVpcId() != null; + Network guestNtwk = _networkMgr.getNetwork(guestNtwkId); + Nic guestNic = _nicDao.findByInstanceIdAndNetworkId(guestNtwk.getId(), router.getId()); + NicProfile guestNicProfile = new NicProfile(guestNic, guestNtwk, guestNic.getBroadcastUri(), + guestNic.getIsolationUri(), _networkMgr.getNetworkRate(guestNtwk.getId(), router.getId()), + _networkMgr.isSecurityGroupSupportedInNetwork(guestNtwk), + _networkMgr.getNetworkTag(router.getHypervisorType(), guestNtwk)); + final NetworkUsageCommand usageCmd = new NetworkUsageCommand(privateIP, router.getHostName(), + forVpc, _itMgr.toNicTO(guestNicProfile, router.getHypervisorType())); + UserStatisticsVO previousStats = _statsDao.findBy(router.getAccountId(), + router.getDataCenterIdToDeployIn(), guestNtwkId, null, router.getId(), router.getType().toString()); + NetworkUsageAnswer answer = null; + try { + answer = (NetworkUsageAnswer) _agentMgr.easySend(router.getHostId(), usageCmd); + } catch (Exception e) { + s_logger.warn("Error while collecting network stats from router: "+router.getInstanceName()+" from host: "+router.getHostId(), e); + continue; + } + + if (answer != null) { + if (!answer.getResult()) { + s_logger.warn("Error while collecting network stats from router: "+router.getInstanceName()+" from host: "+router.getHostId() + "; details: " + answer.getDetails()); + continue; + } + Transaction txn = Transaction.open(Transaction.CLOUD_DB); + try { + if ((answer.getBytesReceived() == 0) && (answer.getBytesSent() == 0)) { + s_logger.debug("Recieved and Sent bytes are both 0. Not updating user_statistics"); + continue; + } + txn.start(); + UserStatisticsVO stats = _statsDao.lock(router.getAccountId(), + router.getDataCenterIdToDeployIn(), guestNtwkId, null, router.getId(), router.getType().toString()); + if (stats == null) { + s_logger.warn("unable to find stats for account: " + router.getAccountId()); + continue; + } + + if(previousStats != null + && ((previousStats.getCurrentBytesReceived() != stats.getCurrentBytesReceived()) + || (previousStats.getCurrentBytesSent() != stats.getCurrentBytesSent()))){ + s_logger.debug("Router stats changed from the time NetworkUsageCommand was sent. " + + "Ignoring current answer. Router: "+answer.getRouterName()+" Rcvd: " + + answer.getBytesReceived()+ "Sent: " +answer.getBytesSent()); + continue; + } + + if (stats.getCurrentBytesReceived() > answer.getBytesReceived()) { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Received # of bytes that's less than the last one. " + + "Assuming something went wrong and persisting it. Router: " + + answer.getRouterName()+" Reported: " + answer.getBytesReceived() + + " Stored: " + stats.getCurrentBytesReceived()); + } + stats.setNetBytesReceived(stats.getNetBytesReceived() + stats.getCurrentBytesReceived()); + } + stats.setCurrentBytesReceived(answer.getBytesReceived()); + if (stats.getCurrentBytesSent() > answer.getBytesSent()) { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Received # of bytes that's less than the last one. " + + "Assuming something went wrong and persisting it. Router: " + + answer.getRouterName()+" Reported: " + answer.getBytesSent() + + " Stored: " + stats.getCurrentBytesSent()); + } + stats.setNetBytesSent(stats.getNetBytesSent() + stats.getCurrentBytesSent()); + } + stats.setCurrentBytesSent(answer.getBytesSent()); + _statsDao.update(stats.getId(), stats); + txn.commit(); + } catch (Exception e) { + txn.rollback(); + s_logger.warn("Unable to update user statistics for account: " + router.getAccountId() + + " Rx: " + answer.getBytesReceived() + "; Tx: " + answer.getBytesSent()); + } finally { + txn.close(); + } + } + } + } + } } diff --git a/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java b/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java index 8a54f235b71..e93be77d8ef 100755 --- a/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java +++ b/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java @@ -1462,4 +1462,9 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V //not supported throw new UnsupportedOperationException("Unplug nic is not supported for vm of type " + vm.getType()); } + + @Override + public void prepareStop(VirtualMachineProfile profile) { + + } } diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index 40fac710cd9..a21f9fdf604 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -3614,5 +3614,9 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager //not supported throw new UnsupportedOperationException("Unplug nic is not supported for vm of type " + vm.getType()); } + + @Override + public void prepareStop(VirtualMachineProfile profile) { + } } diff --git a/server/src/com/cloud/vm/VirtualMachineGuru.java b/server/src/com/cloud/vm/VirtualMachineGuru.java index f8355f580cf..82e42dd2af7 100644 --- a/server/src/com/cloud/vm/VirtualMachineGuru.java +++ b/server/src/com/cloud/vm/VirtualMachineGuru.java @@ -104,4 +104,11 @@ public interface VirtualMachineGuru { */ boolean unplugNic(Network network, NicTO nic, VirtualMachineTO vm, ReservationContext context, DeployDestination dest) throws ConcurrentOperationException, ResourceUnavailableException; + + /** + * Prepare Vm for Stop + * @param profile + * @return + */ + void prepareStop(VirtualMachineProfile profile); } diff --git a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java index 9cad3d1e26a..54d72d95e11 100755 --- a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java +++ b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java @@ -1063,11 +1063,10 @@ public class VirtualMachineManagerImpl implements VirtualMachineManager, Listene if (vm.getState() != State.Stopping) { throw new CloudRuntimeException("We cannot proceed with stop VM " + vm + " since it is not in 'Stopping' state, current state: " + vm.getState()); } - String routerPrivateIp = null; - if (vm.getType() == VirtualMachine.Type.DomainRouter) { - routerPrivateIp = vm.getPrivateIpAddress(); - } - StopCommand stop = new StopCommand(vm, vm.getInstanceName(), null, routerPrivateIp); + + vmGuru.prepareStop(profile); + + StopCommand stop = new StopCommand(vm, vm.getInstanceName(), null); boolean stopped = false; StopAnswer answer = null; try {