From f9bea27d0ba9776a38fea1827f05e6f45dd96bcd Mon Sep 17 00:00:00 2001 From: Kelven Yang Date: Thu, 10 Nov 2011 10:54:11 -0800 Subject: [PATCH] bug 11940: apply disk controller selection only to ROOT disks Reviewed-by: Annothy Xu --- .../vmware/resource/VmwareResource.java | 785 +++++++++--------- 1 file changed, 395 insertions(+), 390 deletions(-) diff --git a/core/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java b/core/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java index f8a61a0ae2a..3187ee563c2 100755 --- a/core/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java +++ b/core/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java @@ -227,7 +227,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa protected final long _ops_timeout = 900000; // 15 minutes time out to time protected final int _shutdown_waitMs = 300000; // wait up to 5 minutes for shutdown - + // out an operation protected final int _retry = 24; protected final int _sleep = 10000; @@ -249,7 +249,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa protected float _cpuOverprovisioningFactor = 1; protected boolean _reserveCpu = false; - + protected float _memOverprovisioningFactor = 1; protected boolean _reserveMem = false; protected DiskControllerType _rootDiskController = DiskControllerType.ide; @@ -279,9 +279,9 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa @Override public Answer executeRequest(Command cmd) { - if(s_logger.isTraceEnabled()) - s_logger.trace("Begin executeRequest(), cmd: " + cmd.getClass().getSimpleName()); - + if(s_logger.isTraceEnabled()) + s_logger.trace("Begin executeRequest(), cmd: " + cmd.getClass().getSimpleName()); + Answer answer = null; NDC.push(_hostName != null ? _hostName : _guid + "(" + ComponentLocator.class.getPackage().getImplementationVersion() + ")"); try { @@ -392,7 +392,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa } else if (cmd instanceof CheckRouterCommand) { answer = execute((CheckRouterCommand) cmd); } else if (cmd instanceof SetFirewallRulesCommand) { - answer = execute((SetFirewallRulesCommand)cmd); + answer = execute((SetFirewallRulesCommand)cmd); } else if (cmd instanceof BumpUpPriorityCommand) { answer = execute((BumpUpPriorityCommand)cmd); } else { @@ -419,8 +419,8 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa JmxUtil.unregisterMBean("VMware " + _morHyperHost.get_value(), "Command " + mbeanToRemove.getProp("Sequence") + "-" + mbeanToRemove.getProp("Name")); } } catch (Exception e) { - if(s_logger.isTraceEnabled()) - s_logger.trace("Unable to register JMX monitoring due to exception " + ExceptionUtil.toString(e)); + if(s_logger.isTraceEnabled()) + s_logger.trace("Unable to register JMX monitoring due to exception " + ExceptionUtil.toString(e)); } } @@ -428,12 +428,12 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa NDC.pop(); } - if(s_logger.isTraceEnabled()) - s_logger.trace("End executeRequest(), cmd: " + cmd.getClass().getSimpleName()); - + if(s_logger.isTraceEnabled()) + s_logger.trace("End executeRequest(), cmd: " + cmd.getClass().getSimpleName()); + return answer; } - + protected Answer execute(NetworkUsageCommand cmd) { if (s_logger.isInfoEnabled()) { s_logger.info("Executing resource NetworkUsageCommand " + _gson.toJson(cmd)); @@ -454,7 +454,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa String args = ""; String[] results = new String[cmd.getRules().length]; int i = 0; - + boolean endResult = true; for (PortForwardingRuleTO rule : cmd.getRules()) { args += rule.revoked() ? " -D " : " -A "; @@ -487,58 +487,58 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa return new SetPortForwardingRulesAnswer(cmd, results, endResult); } - + protected SetFirewallRulesAnswer execute(SetFirewallRulesCommand cmd) { - String controlIp = getRouterSshControlIp(cmd); - String[] results = new String[cmd.getRules().length]; + String controlIp = getRouterSshControlIp(cmd); + String[] results = new String[cmd.getRules().length]; - String[][] rules = cmd.generateFwRules(); - String args = ""; - args += " -F "; - StringBuilder sb = new StringBuilder(); - String[] fwRules = rules[0]; - if (fwRules.length > 0) { - for (int i = 0; i < fwRules.length; i++) { - sb.append(fwRules[i]).append(','); - } - args += " -a " + sb.toString(); - } + String[][] rules = cmd.generateFwRules(); + String args = ""; + args += " -F "; + StringBuilder sb = new StringBuilder(); + String[] fwRules = rules[0]; + if (fwRules.length > 0) { + for (int i = 0; i < fwRules.length; i++) { + sb.append(fwRules[i]).append(','); + } + args += " -a " + sb.toString(); + } - try { - VmwareManager mgr = getServiceContext().getStockObject( - VmwareManager.CONTEXT_STOCK_NAME); - Pair result = SshHelper.sshExecute(controlIp, - DEFAULT_DOMR_SSHPORT, "root", mgr.getSystemVMKeyFile(), - null, "/root/firewall_rule.sh " + args); + try { + VmwareManager mgr = getServiceContext().getStockObject( + VmwareManager.CONTEXT_STOCK_NAME); + Pair result = SshHelper.sshExecute(controlIp, + DEFAULT_DOMR_SSHPORT, "root", mgr.getSystemVMKeyFile(), + null, "/root/firewall_rule.sh " + args); - if (s_logger.isDebugEnabled()) - s_logger.debug("Executing script on domain router " + controlIp - + ": /root/firewall_rule.sh " + args); + if (s_logger.isDebugEnabled()) + s_logger.debug("Executing script on domain router " + controlIp + + ": /root/firewall_rule.sh " + args); - if (!result.first()) { - s_logger.error("SetFirewallRulesCommand failure on setting one rule. args: " - + args); - //FIXME - in the future we have to process each rule separately; now we temporarily set every rule to be false if single rule fails - for (int i=0; i < results.length; i++) { - results[i] = "Failed"; - } - - return new SetFirewallRulesAnswer(cmd, false, results); - } - } catch (Throwable e) { - s_logger.error("SetFirewallRulesCommand(args: " + args - + ") failed on setting one rule due to " - + VmwareHelper.getExceptionMessage(e)); - //FIXME - in the future we have to process each rule separately; now we temporarily set every rule to be false if single rule fails + if (!result.first()) { + s_logger.error("SetFirewallRulesCommand failure on setting one rule. args: " + + args); + //FIXME - in the future we have to process each rule separately; now we temporarily set every rule to be false if single rule fails + for (int i=0; i < results.length; i++) { + results[i] = "Failed"; + } + + return new SetFirewallRulesAnswer(cmd, false, results); + } + } catch (Throwable e) { + s_logger.error("SetFirewallRulesCommand(args: " + args + + ") failed on setting one rule due to " + + VmwareHelper.getExceptionMessage(e)); + //FIXME - in the future we have to process each rule separately; now we temporarily set every rule to be false if single rule fails for (int i=0; i < results.length; i++) { results[i] = "Failed"; } - return new SetFirewallRulesAnswer(cmd, false, results); - } + return new SetFirewallRulesAnswer(cmd, false, results); + } - return new SetFirewallRulesAnswer(cmd, true, results); + return new SetFirewallRulesAnswer(cmd, true, results); } - + protected Answer execute(SetStaticNatRulesCommand cmd) { if (s_logger.isInfoEnabled()) { s_logger.info("Executing resource SetFirewallRuleCommand: " + _gson.toJson(cmd)); @@ -554,11 +554,11 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa args += " -l " + rule.getSrcIp(); args += " -r " + rule.getDstIp(); - + if (rule.getProtocol() != null) { args += " -P " + rule.getProtocol().toLowerCase(); } - + args += " -d " + rule.getStringSrcPortRange(); args += " -G "; @@ -592,7 +592,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa String routerIp = cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP); String controlIp = getRouterSshControlIp(cmd); - + assert(controlIp != null); LoadBalancerConfigurator cfgtr = new HAProxyConfigurator(); @@ -643,7 +643,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa args += " -s " + sb.toString(); } - + Pair result = SshHelper.sshExecute(controlIp, DEFAULT_DOMR_SSHPORT, "root", mgr.getSystemVMKeyFile(), null, "scp " + tmpCfgFilePath + " /etc/haproxy/haproxy.cfg.new"); if (!result.first()) { @@ -755,12 +755,12 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa } if (removeVif) { - - String nicMasksStr = vmMo.getCustomFieldValue(CustomFieldConstants.CLOUD_NIC_MASK); - int nicMasks = Integer.parseInt(nicMasksStr); - nicMasks &= ~(1 << publicNicInfo.first().intValue()); - vmMo.setCustomFieldValue(CustomFieldConstants.CLOUD_NIC_MASK, String.valueOf(nicMasks)); - + + String nicMasksStr = vmMo.getCustomFieldValue(CustomFieldConstants.CLOUD_NIC_MASK); + int nicMasks = Integer.parseInt(nicMasksStr); + nicMasks &= ~(1 << publicNicInfo.first().intValue()); + vmMo.setCustomFieldValue(CustomFieldConstants.CLOUD_NIC_MASK, String.valueOf(nicMasks)); + HostMO hostMo = vmMo.getRunningHost(); List networks = vmMo.getNetworksWithDetails(); for (NetworkDetails netDetails : networks) { @@ -780,59 +780,59 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa private void plugPublicNic(VirtualMachineMO vmMo, final String vlanId, final String vifMacAddress) throws Exception { // TODO : probably need to set traffic shaping Pair networkInfo = HypervisorHostHelper.preparePublicNetwork(this._publicNetworkVSwitchName, - vmMo.getRunningHost(), vlanId, null, null, this._ops_timeout, true); - + vmMo.getRunningHost(), vlanId, null, null, this._ops_timeout, true); + int nicIndex = allocPublicNicIndex(vmMo); - + try { - VirtualDevice[] nicDevices = vmMo.getNicDevices(); - - VirtualEthernetCard device = (VirtualEthernetCard)nicDevices[nicIndex]; - - VirtualEthernetCardNetworkBackingInfo nicBacking = new VirtualEthernetCardNetworkBackingInfo(); - nicBacking.setDeviceName(networkInfo.second()); - nicBacking.setNetwork(networkInfo.first()); - device.setBacking(nicBacking); - + VirtualDevice[] nicDevices = vmMo.getNicDevices(); + + VirtualEthernetCard device = (VirtualEthernetCard)nicDevices[nicIndex]; + + VirtualEthernetCardNetworkBackingInfo nicBacking = new VirtualEthernetCardNetworkBackingInfo(); + nicBacking.setDeviceName(networkInfo.second()); + nicBacking.setNetwork(networkInfo.first()); + device.setBacking(nicBacking); + VirtualMachineConfigSpec vmConfigSpec = new VirtualMachineConfigSpec(); VirtualDeviceConfigSpec[] deviceConfigSpecArray = new VirtualDeviceConfigSpec[1]; deviceConfigSpecArray[0] = new VirtualDeviceConfigSpec(); deviceConfigSpecArray[0].setDevice(device); deviceConfigSpecArray[0].setOperation(VirtualDeviceConfigSpecOperation.edit); - + vmConfigSpec.setDeviceChange(deviceConfigSpecArray); if(!vmMo.configureVm(vmConfigSpec)) { throw new Exception("Failed to configure devices when plugPublicNic"); } } catch(Exception e) { - - // restore allocation mask in case of exceptions - String nicMasksStr = vmMo.getCustomFieldValue(CustomFieldConstants.CLOUD_NIC_MASK); - int nicMasks = Integer.parseInt(nicMasksStr); - nicMasks &= ~(1 << nicIndex); - vmMo.setCustomFieldValue(CustomFieldConstants.CLOUD_NIC_MASK, String.valueOf(nicMasks)); - - throw e; + + // restore allocation mask in case of exceptions + String nicMasksStr = vmMo.getCustomFieldValue(CustomFieldConstants.CLOUD_NIC_MASK); + int nicMasks = Integer.parseInt(nicMasksStr); + nicMasks &= ~(1 << nicIndex); + vmMo.setCustomFieldValue(CustomFieldConstants.CLOUD_NIC_MASK, String.valueOf(nicMasks)); + + throw e; } } - + private int allocPublicNicIndex(VirtualMachineMO vmMo) throws Exception { - String nicMasksStr = vmMo.getCustomFieldValue(CustomFieldConstants.CLOUD_NIC_MASK); - if(nicMasksStr == null || nicMasksStr.isEmpty()) { - throw new Exception("Could not find NIC allocation info"); - } - - int nicMasks = Integer.parseInt(nicMasksStr); - VirtualDevice[] nicDevices = vmMo.getNicDevices(); - for(int i = 3; i < nicDevices.length; i++) { - if((nicMasks & (1 << i)) == 0) { - nicMasks |= (1 << i); - vmMo.setCustomFieldValue(CustomFieldConstants.CLOUD_NIC_MASK, String.valueOf(nicMasks)); - return i; - } - } - - throw new Exception("Could not allocate a free public NIC"); + String nicMasksStr = vmMo.getCustomFieldValue(CustomFieldConstants.CLOUD_NIC_MASK); + if(nicMasksStr == null || nicMasksStr.isEmpty()) { + throw new Exception("Could not find NIC allocation info"); + } + + int nicMasks = Integer.parseInt(nicMasksStr); + VirtualDevice[] nicDevices = vmMo.getNicDevices(); + for(int i = 3; i < nicDevices.length; i++) { + if((nicMasks & (1 << i)) == 0) { + nicMasks |= (1 << i); + vmMo.setCustomFieldValue(CustomFieldConstants.CLOUD_NIC_MASK, String.valueOf(nicMasks)); + return i; + } + } + + throw new Exception("Could not allocate a free public NIC"); } protected Answer execute(IpAssocCommand cmd) { @@ -877,7 +877,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa protected Answer execute(SavePasswordCommand cmd) { if (s_logger.isInfoEnabled()) { s_logger.info("Executing resource SavePasswordCommand. vmName: " + cmd.getVmName() + ", vmIp: " + cmd.getVmIpAddress() + ", password: " - + StringUtils.getMaskedPasswordForDisplay(cmd.getPassword())); + + StringUtils.getMaskedPasswordForDisplay(cmd.getPassword())); } String controlIp = getRouterSshControlIp(cmd); @@ -890,7 +890,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa if (s_logger.isDebugEnabled()) { s_logger.debug("Run command on domain router " + controlIp + ", /root/savepassword.sh " + args + " -p " + StringUtils.getMaskedPasswordForDisplay(cmd.getPassword())); } - + args += " -p " + password; @@ -953,7 +953,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa return new Answer(cmd); } - + protected Answer execute(CheckRouterCommand cmd) { if (s_logger.isDebugEnabled()) { s_logger.debug("Executing resource CheckRouterCommand: " + _gson.toJson(cmd)); @@ -964,7 +964,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa try { VmwareManager mgr = getServiceContext().getStockObject(VmwareManager.CONTEXT_STOCK_NAME); result = SshHelper.sshExecute(cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP), DEFAULT_DOMR_SSHPORT, "root", mgr.getSystemVMKeyFile(), null, - "/root/checkrouter.sh "); + "/root/checkrouter.sh "); if (!result.first()) { s_logger.error("check router command on domR " + cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP) + " failed, message: " + result.second()); @@ -982,7 +982,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa } return new CheckRouterAnswer(cmd, result.second(), true); } - + protected Answer execute(BumpUpPriorityCommand cmd) { if (s_logger.isDebugEnabled()) { s_logger.debug("Executing resource BumpUpPriorityCommand: " + _gson.toJson(cmd)); @@ -993,7 +993,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa try { VmwareManager mgr = getServiceContext().getStockObject(VmwareManager.CONTEXT_STOCK_NAME); result = SshHelper.sshExecute(cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP), DEFAULT_DOMR_SSHPORT, "root", mgr.getSystemVMKeyFile(), null, - "/root/bumpup_priority.sh "); + "/root/bumpup_priority.sh "); if (!result.first()) { s_logger.error("BumpUpPriority command on domR " + cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP) + " failed, message: " + result.second()); @@ -1022,7 +1022,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa String routerPrivateIpAddress = cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP); String controlIp = getRouterSshControlIp(cmd); - + String vmIpAddress = cmd.getVmIpAddress(); List vmData = cmd.getVmData(); String[] vmDataArgs = new String[vmData.size() * 2 + 4]; @@ -1148,7 +1148,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa VirtualMachineTO vmSpec = cmd.getVirtualMachine(); String vmName = vmSpec.getName(); - + State state = State.Stopped; VmwareContext context = getServiceContext(); try { @@ -1161,8 +1161,8 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa VirtualEthernetCardType nicDeviceType = VirtualEthernetCardType.valueOf(vmSpec.getDetails().get(VmDetailConstants.NIC_ADAPTER)); if(s_logger.isDebugEnabled()) - s_logger.debug("VM " + vmName + " will be started with NIC device type: " + nicDeviceType); - + s_logger.debug("VM " + vmName + " will be started with NIC device type: " + nicDeviceType); + VmwareHypervisorHost hyperHost = getHyperHost(context); VolumeTO[] disks = validateDisks(vmSpec.getDisks()); assert (disks.length > 0); @@ -1203,14 +1203,14 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa Pair rootDiskDataStoreDetails = null; for (VolumeTO vol : disks) { if (vol.getType() == Volume.Type.ROOT) { - rootDiskDataStoreDetails = dataStoresDetails.get(vol.getPoolUuid()); + rootDiskDataStoreDetails = dataStoresDetails.get(vol.getPoolUuid()); } } assert (vmSpec.getSpeed() != null) && (rootDiskDataStoreDetails != null); if (!hyperHost.createBlankVm(vmName, vmSpec.getCpus(), vmSpec.getSpeed().intValue(), - getReserveCpuMHz(vmSpec.getSpeed().intValue()), vmSpec.getLimitCpuUse(), ramMb, getReserveMemMB(ramMb), - translateGuestOsIdentifier(vmSpec.getArch(), vmSpec.getOs()).toString(), rootDiskDataStoreDetails.first(), false)) { + getReserveCpuMHz(vmSpec.getSpeed().intValue()), vmSpec.getLimitCpuUse(), ramMb, getReserveMemMB(ramMb), + translateGuestOsIdentifier(vmSpec.getArch(), vmSpec.getOs()).toString(), rootDiskDataStoreDetails.first(), false)) { throw new Exception("Failed to create VM. vmName: " + vmName); } } @@ -1241,9 +1241,9 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa VirtualMachineConfigSpec vmConfigSpec = new VirtualMachineConfigSpec(); int ramMb = (int) (vmSpec.getMinRam() / (1024 * 1024)); VmwareHelper.setBasicVmConfig(vmConfigSpec, vmSpec.getCpus(), vmSpec.getSpeed().intValue(), - getReserveCpuMHz(vmSpec.getSpeed().intValue()), ramMb, getReserveMemMB(ramMb), - translateGuestOsIdentifier(vmSpec.getArch(), vmSpec.getOs()).toString(), vmSpec.getLimitCpuUse()); - + getReserveCpuMHz(vmSpec.getSpeed().intValue()), ramMb, getReserveMemMB(ramMb), + translateGuestOsIdentifier(vmSpec.getArch(), vmSpec.getOs()).toString(), vmSpec.getLimitCpuUse()); + VirtualDeviceConfigSpec[] deviceConfigSpecArray = new VirtualDeviceConfigSpec[totalChangeDevices]; int i = 0; int ideControllerKey = vmMo.getIDEDeviceControllerKey(); @@ -1260,7 +1260,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa throw new Exception(msg); } mgr.prepareSecondaryStorageStore(secStoreUrl); - + ManagedObjectReference morSecDs = prepareSecondaryDatastoreOnHost(secStoreUrl); if (morSecDs == null) { String msg = "Failed to prepare secondary storage on host, secondary store url: " + secStoreUrl; @@ -1270,15 +1270,15 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa deviceConfigSpecArray[i] = new VirtualDeviceConfigSpec(); Pair isoInfo = VmwareHelper.prepareIsoDevice(vmMo, String.format("[%s] systemvm/%s", secDsMo.getName(), mgr.getSystemVMIsoFileNameOnDatastore()), - secDsMo.getMor(), true, true, i, i + 1); + secDsMo.getMor(), true, true, i, i + 1); deviceConfigSpecArray[i].setDevice(isoInfo.first()); if (isoInfo.second()) { - if(s_logger.isDebugEnabled()) - s_logger.debug("Prepare ISO volume at new device " + _gson.toJson(isoInfo.first())); + if(s_logger.isDebugEnabled()) + s_logger.debug("Prepare ISO volume at new device " + _gson.toJson(isoInfo.first())); deviceConfigSpecArray[i].setOperation(VirtualDeviceConfigSpecOperation.add); } else { - if(s_logger.isDebugEnabled()) - s_logger.debug("Prepare ISO volume at existing device " + _gson.toJson(isoInfo.first())); + if(s_logger.isDebugEnabled()) + s_logger.debug("Prepare ISO volume at existing device " + _gson.toJson(isoInfo.first())); deviceConfigSpecArray[i].setOperation(VirtualDeviceConfigSpecOperation.edit); } i++; @@ -1293,12 +1293,12 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa Pair isoInfo = VmwareHelper.prepareIsoDevice(vmMo, isoDatastoreInfo.first(), isoDatastoreInfo.second(), true, true, i, i + 1); deviceConfigSpecArray[i].setDevice(isoInfo.first()); if (isoInfo.second()) { - if(s_logger.isDebugEnabled()) - s_logger.debug("Prepare ISO volume at new device " + _gson.toJson(isoInfo.first())); - deviceConfigSpecArray[i].setOperation(VirtualDeviceConfigSpecOperation.add); + if(s_logger.isDebugEnabled()) + s_logger.debug("Prepare ISO volume at new device " + _gson.toJson(isoInfo.first())); + deviceConfigSpecArray[i].setOperation(VirtualDeviceConfigSpecOperation.add); } else { - if(s_logger.isDebugEnabled()) - s_logger.debug("Prepare ISO volume at existing device " + _gson.toJson(isoInfo.first())); + if(s_logger.isDebugEnabled()) + s_logger.debug("Prepare ISO volume at existing device " + _gson.toJson(isoInfo.first())); deviceConfigSpecArray[i].setOperation(VirtualDeviceConfigSpecOperation.edit); } } else { @@ -1306,14 +1306,14 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa Pair isoInfo = VmwareHelper.prepareIsoDevice(vmMo, null, null, true, true, i, i + 1); deviceConfigSpecArray[i].setDevice(isoInfo.first()); if (isoInfo.second()) { - if(s_logger.isDebugEnabled()) - s_logger.debug("Prepare ISO volume at existing device " + _gson.toJson(isoInfo.first())); - + if(s_logger.isDebugEnabled()) + s_logger.debug("Prepare ISO volume at existing device " + _gson.toJson(isoInfo.first())); + deviceConfigSpecArray[i].setOperation(VirtualDeviceConfigSpecOperation.add); } else { - if(s_logger.isDebugEnabled()) - s_logger.debug("Prepare ISO volume at existing device " + _gson.toJson(isoInfo.first())); - + if(s_logger.isDebugEnabled()) + s_logger.debug("Prepare ISO volume at existing device " + _gson.toJson(isoInfo.first())); + deviceConfigSpecArray[i].setOperation(VirtualDeviceConfigSpecOperation.edit); } } @@ -1326,24 +1326,29 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa if (vol.getType() == Volume.Type.ISO) { controllerKey = ideControllerKey; } else { - if(vmSpec.getDetails() != null && vmSpec.getDetails().get("root.disk.controller") != null) - { - if(vmSpec.getDetails().get("root.disk.controller").equalsIgnoreCase("scsi")) - controllerKey = scsiControllerKey; - else - controllerKey = ideControllerKey; - } else { - if(_rootDiskController == DiskControllerType.scsi) - controllerKey = scsiControllerKey; - else - controllerKey = ideControllerKey; - } + if(vol.getType() == Volume.Type.ROOT) { + if(vmSpec.getDetails() != null && vmSpec.getDetails().get("root.disk.controller") != null) + { + if(vmSpec.getDetails().get("root.disk.controller").equalsIgnoreCase("scsi")) + controllerKey = scsiControllerKey; + else + controllerKey = ideControllerKey; + } else { + if(_rootDiskController == DiskControllerType.scsi) + controllerKey = scsiControllerKey; + else + controllerKey = ideControllerKey; + } + } else { + // data volume always uses SCSI + controllerKey = scsiControllerKey; + } } if (vol.getType() != Volume.Type.ISO) { Pair volumeDsDetails = dataStoresDetails.get(vol.getPoolUuid()); assert (volumeDsDetails != null); - VirtualDevice device; + VirtualDevice device; datastoreDiskPath = String.format("[%s] %s.vmdk", volumeDsDetails.second().getName(), vol.getPath()); String chainInfo = vol.getChainInfo(); @@ -1366,9 +1371,9 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa deviceConfigSpecArray[i].setDevice(device); deviceConfigSpecArray[i].setOperation(VirtualDeviceConfigSpecOperation.add); - if(s_logger.isDebugEnabled()) - s_logger.debug("Prepare volume at new device " + _gson.toJson(device)); - + if(s_logger.isDebugEnabled()) + s_logger.debug("Prepare volume at new device " + _gson.toJson(device)); + i++; } } @@ -1380,19 +1385,19 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa s_logger.info("Prepare NIC device based on NicTO: " + _gson.toJson(nicTo)); Pair networkInfo = prepareNetworkFromNicInfo(vmMo.getRunningHost(), nicTo); - + nic = VmwareHelper.prepareNicDevice(vmMo, networkInfo.first(), nicDeviceType, networkInfo.second(), nicTo.getMac(), i, i + 1, true, true); deviceConfigSpecArray[i] = new VirtualDeviceConfigSpec(); deviceConfigSpecArray[i].setDevice(nic); deviceConfigSpecArray[i].setOperation(VirtualDeviceConfigSpecOperation.add); - - if(s_logger.isDebugEnabled()) - s_logger.debug("Prepare NIC at new device " + _gson.toJson(deviceConfigSpecArray[i])); - - // this is really a hacking for DomR, upon DomR startup, we will reset all the NIC allocation after eth3 + + if(s_logger.isDebugEnabled()) + s_logger.debug("Prepare NIC at new device " + _gson.toJson(deviceConfigSpecArray[i])); + + // this is really a hacking for DomR, upon DomR startup, we will reset all the NIC allocation after eth3 if(nicCount < 3) - nicMask |= (1 << nicCount); - + nicMask |= (1 << nicCount); + i++; nicCount++; } @@ -1400,34 +1405,34 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa vmConfigSpec.setDeviceChange(deviceConfigSpecArray); // pass boot arguments through machine.id & perform customized options to VMX - + Map vmDetailOptions = validateVmDetails(vmSpec.getDetails()); OptionValue[] extraOptions = new OptionValue[2 + vmDetailOptions.size()]; extraOptions[0] = new OptionValue(); extraOptions[0].setKey("machine.id"); extraOptions[0].setValue(vmSpec.getBootArgs()); - + extraOptions[1] = new OptionValue(); extraOptions[1].setKey("devices.hotplug"); extraOptions[1].setValue("true"); int j = 2; for(Map.Entry entry : vmDetailOptions.entrySet()) { - extraOptions[j] = new OptionValue(); - extraOptions[j].setKey(entry.getKey()); - extraOptions[j].setValue(entry.getValue()); - j++; + extraOptions[j] = new OptionValue(); + extraOptions[j].setKey(entry.getKey()); + extraOptions[j].setValue(entry.getValue()); + j++; } - + String keyboardLayout = null; if(vmSpec.getDetails() != null) - keyboardLayout = vmSpec.getDetails().get(VmDetailConstants.KEYBOARD); + keyboardLayout = vmSpec.getDetails().get(VmDetailConstants.KEYBOARD); vmConfigSpec.setExtraConfig(configureVnc(extraOptions, hyperHost, vmName, vmSpec.getVncPassword(), keyboardLayout)); if (!vmMo.configureVm(vmConfigSpec)) { throw new Exception("Failed to configure VM before start. vmName: " + vmName); } - + vmMo.setCustomFieldValue(CustomFieldConstants.CLOUD_NIC_MASK, String.valueOf(nicMask)); if (!vmMo.powerOn()) { @@ -1455,47 +1460,47 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa } } } - + private Map validateVmDetails(Map vmDetails) { - Map validatedDetails = new HashMap(); - - if(vmDetails != null && vmDetails.size() > 0) { - for(Map.Entry entry : vmDetails.entrySet()) { - if("machine.id".equalsIgnoreCase(entry.getKey())) - continue; - else if("devices.hotplug".equalsIgnoreCase(entry.getKey())) - continue; - else if("RemoteDisplay.vnc.enabled".equalsIgnoreCase(entry.getKey())) - continue; - else if("RemoteDisplay.vnc.password".equalsIgnoreCase(entry.getKey())) - continue; - else if("RemoteDisplay.vnc.port".equalsIgnoreCase(entry.getKey())) - continue; - else if("RemoteDisplay.vnc.keymap".equalsIgnoreCase(entry.getKey())) - continue; - else - validatedDetails.put(entry.getKey(), entry.getValue()); - } - } - return validatedDetails; + Map validatedDetails = new HashMap(); + + if(vmDetails != null && vmDetails.size() > 0) { + for(Map.Entry entry : vmDetails.entrySet()) { + if("machine.id".equalsIgnoreCase(entry.getKey())) + continue; + else if("devices.hotplug".equalsIgnoreCase(entry.getKey())) + continue; + else if("RemoteDisplay.vnc.enabled".equalsIgnoreCase(entry.getKey())) + continue; + else if("RemoteDisplay.vnc.password".equalsIgnoreCase(entry.getKey())) + continue; + else if("RemoteDisplay.vnc.port".equalsIgnoreCase(entry.getKey())) + continue; + else if("RemoteDisplay.vnc.keymap".equalsIgnoreCase(entry.getKey())) + continue; + else + validatedDetails.put(entry.getKey(), entry.getValue()); + } + } + return validatedDetails; } private int getReserveCpuMHz(int cpuMHz) { - if(this._reserveCpu) { - return (int)(cpuMHz / this._cpuOverprovisioningFactor); - } - - return 0; + if(this._reserveCpu) { + return (int)(cpuMHz / this._cpuOverprovisioningFactor); + } + + return 0; } - + private int getReserveMemMB(int memMB) { - if(this._reserveMem) { - return (int)(memMB / this._memOverprovisioningFactor); - } - - return 0; + if(this._reserveMem) { + return (int)(memMB / this._memOverprovisioningFactor); + } + + return 0; } - + private NicTO[] sortNicsByDeviceId(NicTO[] nics) { List listForSort = new ArrayList(); @@ -1711,18 +1716,18 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa if (s_logger.isInfoEnabled()) { s_logger.info("Executing resource ReadyCommand: " + _gson.toJson(cmd)); } - + try { - VmwareContext context = getServiceContext(); - VmwareHypervisorHost hyperHost = getHyperHost(context); - if(hyperHost.isHyperHostConnected()) { + VmwareContext context = getServiceContext(); + VmwareHypervisorHost hyperHost = getHyperHost(context); + if(hyperHost.isHyperHostConnected()) { return new ReadyAnswer(cmd); - } else { - return new ReadyAnswer(cmd, "Host is not in connect state"); - } + } else { + return new ReadyAnswer(cmd, "Host is not in connect state"); + } } catch(Exception e) { - s_logger.error("Unexpected exception: ", e); - return new ReadyAnswer(cmd, VmwareHelper.getExceptionMessage(e)); + s_logger.error("Unexpected exception: ", e); + return new ReadyAnswer(cmd, VmwareHelper.getExceptionMessage(e)); } } @@ -1733,14 +1738,14 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa VmwareContext context = getServiceContext(); VmwareHypervisorHost hyperHost = getHyperHost(context); - + HostStatsEntry hostStats = new HostStatsEntry(cmd.getHostId(), 0, 0, 0, "host", 0, 0, 0, 0); Answer answer = new GetHostStatsAnswer(cmd, hostStats); try { HostStatsEntry entry = getHyperHostStats(hyperHost); if(entry != null) { - entry.setHostId(cmd.getHostId()); - answer = new GetHostStatsAnswer(cmd, entry); + entry.setHostId(cmd.getHostId()); + answer = new GetHostStatsAnswer(cmd, entry); } } catch (Exception e) { if (e instanceof RemoteException) { @@ -1774,9 +1779,9 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa if (requestedVmNames != null) { for (String vmName : requestedVmNames) { - if (newStates.get(vmName) != null) { - vmNames.add(vmName); - } + if (newStates.get(vmName) != null) { + vmNames.add(vmName); + } } } @@ -1840,7 +1845,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa try { vmMo.setCustomFieldValue(CustomFieldConstants.CLOUD_NIC_MASK, "0"); - + if (getVmState(vmMo) != State.Stopped) { Long bytesSent = 0L; Long bytesRcvd = 0L; @@ -1852,7 +1857,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa bytesRcvd = stats[1]; } } - + // before we stop VM, remove all possible snapshots on the VM to let // disk chain be collapsed s_logger.info("Remove all snapshot before stopping VM " + cmd.getVmName()); @@ -1861,8 +1866,8 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa state = State.Stopped; return new StopAnswer(cmd, "Stop VM " + cmd.getVmName() + " Succeed", 0, bytesSent, bytesRcvd); } else { - String msg = "Have problem in powering off VM " + cmd.getVmName() + ", let the process continue"; - s_logger.warn(msg); + 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); } } else { @@ -2109,9 +2114,9 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa } private VmwareHypervisorHost getTargetHyperHost(DatacenterMO dcMo, String destIp) throws Exception { - + VmwareManager mgr = dcMo.getContext().getStockObject(VmwareManager.CONTEXT_STOCK_NAME); - + ObjectContent[] ocs = dcMo.getHostPropertiesOnDatacenterHostFolder(new String[] { "name", "parent" }); if (ocs != null && ocs.length > 0) { for (ObjectContent oc : ocs) { @@ -2171,9 +2176,9 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa StorageFilerTO pool = cmd.getPool(); try { - // We will leave datastore cleanup management to vCenter. Since for cluster VMFS datastore, it will always - // be mounted by vCenter. - + // We will leave datastore cleanup management to vCenter. Since for cluster VMFS datastore, it will always + // be mounted by vCenter. + // VmwareHypervisorHost hyperHost = this.getHyperHost(getServiceContext()); // hyperHost.unmountDatastore(pool.getUuid()); Answer answer = new Answer(cmd, true, "success"); @@ -2222,7 +2227,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa if (cmd.getAttach()) { vmMo.attachDisk(new String[] { datastoreVolumePath }, morDs); } else { - vmMo.removeAllSnapshots(); + vmMo.removeAllSnapshots(); vmMo.detachDisk(datastoreVolumePath, false); } @@ -2301,14 +2306,14 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa } if(cmd.isAttach()) { - String msg = "AttachIsoCommand(attach) failed due to " + VmwareHelper.getExceptionMessage(e); - s_logger.error(msg); - return new Answer(cmd, false, msg); + String msg = "AttachIsoCommand(attach) failed due to " + VmwareHelper.getExceptionMessage(e); + s_logger.error(msg); + return new Answer(cmd, false, msg); } else { - String msg = "AttachIsoCommand(detach) failed due to " + VmwareHelper.getExceptionMessage(e); - s_logger.warn(msg); - s_logger.warn("For detachment failure, we will eventually continue on to allow deassociating it from CloudStack DB"); - return new Answer(cmd); + String msg = "AttachIsoCommand(detach) failed due to " + VmwareHelper.getExceptionMessage(e); + s_logger.warn(msg); + s_logger.warn("For detachment failure, we will eventually continue on to allow deassociating it from CloudStack DB"); + return new Answer(cmd); } } } @@ -2582,7 +2587,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa throw new Exception("Unable to find VM in vSphere, vm: " + cmd.getName()); } } - + Pair portInfo = vmMo.getVncPort(mgr.getManagementPortGroupByHost((HostMO)hyperHost)); if (s_logger.isTraceEnabled()) { @@ -2707,7 +2712,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa ManagedObjectReference morDc = hyperHost.getHyperHostDatacenter(); ManagedObjectReference morCluster = hyperHost.getHyperHostCluster(); ClusterMO clusterMo = new ClusterMO(context, morCluster); - + if (cmd.getVolume().getType() == Volume.Type.ROOT) { String vmName = cmd.getVmName(); if (vmName != null) { @@ -2719,13 +2724,13 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa HostMO hostMo = vmMo.getRunningHost(); List networks = vmMo.getNetworksWithDetails(); - + // tear down all devices first before we destroy the VM to avoid accidently delete disk backing files if (getVmState(vmMo) != State.Stopped) - vmMo.safePowerOff(_shutdown_waitMs); + vmMo.safePowerOff(_shutdown_waitMs); vmMo.tearDownDevices(new Class[] { VirtualDisk.class, VirtualEthernetCard.class }); vmMo.destroy(); - + for (NetworkDetails netDetails : networks) { if (netDetails.getGCTag() != null && netDetails.getGCTag().equalsIgnoreCase("true")) { if (netDetails.getVMMorsOnNetwork() == null || netDetails.getVMMorsOnNetwork().length == 1) { @@ -2734,14 +2739,14 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa } } } - + if (s_logger.isInfoEnabled()) s_logger.info("Destroy volume by original name: " + cmd.getVolume().getPath() + ".vmdk"); dsMo.deleteFile(cmd.getVolume().getPath() + ".vmdk", morDc, true); - + // root volume may be created via linked-clone, delete the delta disk as well if (s_logger.isInfoEnabled()) - s_logger.info("Destroy volume by derived name: " + cmd.getVolume().getPath() + "-delta.vmdk"); + s_logger.info("Destroy volume by derived name: " + cmd.getVolume().getPath() + "-delta.vmdk"); dsMo.deleteFile(cmd.getVolume().getPath() + "-delta.vmdk", morDc, true); return new Answer(cmd, true, "Success"); } @@ -2750,13 +2755,13 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa s_logger.info("Destroy root volume directly from datastore"); } } else { - // evitTemplate will be converted into DestroyCommand, test if we are running in this case + // evitTemplate will be converted into DestroyCommand, test if we are running in this case VirtualMachineMO vmMo = clusterMo.findVmOnHyperHost(cmd.getVolume().getPath()); if (vmMo != null) { if (s_logger.isInfoEnabled()) s_logger.info("Destroy template volume " + cmd.getVolume().getPath()); - - vmMo.destroy(); + + vmMo.destroy(); return new Answer(cmd, true, "Success"); } } @@ -2778,9 +2783,9 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa s_logger.info("Empty disk chain info, fall back to try to delete by original backing file name"); } dsMo.deleteFile(cmd.getVolume().getPath() + ".vmdk", morDc, true); - + if (s_logger.isInfoEnabled()) { - s_logger.info("Destroy volume by derived name: " + cmd.getVolume().getPath() + "-flat.vmdk"); + s_logger.info("Destroy volume by derived name: " + cmd.getVolume().getPath() + "-flat.vmdk"); } dsMo.deleteFile(cmd.getVolume().getPath() + "-flat.vmdk", morDc, true); } @@ -2789,9 +2794,9 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa s_logger.info("Destroy volume by original name: " + cmd.getVolume().getPath() + ".vmdk"); } dsMo.deleteFile(cmd.getVolume().getPath() + ".vmdk", morDc, true); - + if (s_logger.isInfoEnabled()) { - s_logger.info("Destroy volume by derived name: " + cmd.getVolume().getPath() + "-flat.vmdk"); + s_logger.info("Destroy volume by derived name: " + cmd.getVolume().getPath() + "-flat.vmdk"); } dsMo.deleteFile(cmd.getVolume().getPath() + "-flat.vmdk", morDc, true); } @@ -2901,7 +2906,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa s_logger.warn("Template host in vSphere is not in connected state, request template reload"); return new CreateAnswer(cmd, "Template host in vSphere is not in connected state, request template reload", true); } - + ManagedObjectReference morPool = hyperHost.getHyperHostOwnerResourcePool(); ManagedObjectReference morCluster = hyperHost.getHyperHostCluster(); ManagedObjectReference morBaseSnapshot = vmTemplate.getSnapshotMor("cloud.template.base"); @@ -2913,7 +2918,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa String name = cmd.getDiskCharacteristics().getName(); if(dsMo.folderExists(String.format("[%s]", dsMo.getName()), name)) - dsMo.deleteFile(String.format("[%s] %s/", dsMo.getName(), name), dcMo.getMor(), false); + dsMo.deleteFile(String.format("[%s] %s/", dsMo.getName(), name), dcMo.getMor(), false); s_logger.info("create linked clone from template"); if (!vmTemplate.createLinkedClone(name, morBaseSnapshot, dcMo.getVmFolder(), morPool, morDatastore)) { @@ -2929,12 +2934,12 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa // to move files s_logger.info("Move volume out of volume-wrapper VM "); dsMo.moveDatastoreFile(String.format("[%s] %s/%s.vmdk", dsMo.getName(), name, name), - dcMo.getMor(), dsMo.getMor(), - String.format("[%s] %s.vmdk", dsMo.getName(), name), dcMo.getMor(), true); - + dcMo.getMor(), dsMo.getMor(), + String.format("[%s] %s.vmdk", dsMo.getName(), name), dcMo.getMor(), true); + dsMo.moveDatastoreFile(String.format("[%s] %s/%s-delta.vmdk", dsMo.getName(), name, name), - dcMo.getMor(), dsMo.getMor(), - String.format("[%s] %s-delta.vmdk", dsMo.getName(), name), dcMo.getMor(), true); + dcMo.getMor(), dsMo.getMor(), + String.format("[%s] %s-delta.vmdk", dsMo.getName(), name), dcMo.getMor(), true); s_logger.info("detach disks from volume-wrapper VM " + name); vmMo.detachAllDisks(); @@ -3038,12 +3043,12 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa VmwareContext context = getServiceContext(); VmwareHypervisorHost hyperHost = getHyperHost(context); VmwareManager mgr = hyperHost.getContext().getStockObject(VmwareManager.CONTEXT_STOCK_NAME); - + if(hyperHost.isHyperHostConnected()) { - mgr.gcLeftOverVMs(context); + mgr.gcLeftOverVMs(context); } else { s_logger.error("Host is no longer connected."); - return null; + return null; } } catch (Throwable e) { if (e instanceof RemoteException) { @@ -3068,8 +3073,8 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa VmwareHypervisorHost hyperHost = getHyperHost(context); assert(hyperHost instanceof HostMO); if(!((HostMO)hyperHost).isHyperHostConnected()) { - s_logger.info("Host " + hyperHost.getHyperHostName() + " is not in connected state"); - return null; + s_logger.info("Host " + hyperHost.getHyperHostName() + " is not in connected state"); + return null; } } catch (Exception e) { String msg = "VmwareResource intialize() failed due to : " + VmwareHelper.getExceptionMessage(e); @@ -3077,7 +3082,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa invalidateServiceContext(); return null; } - + StartupRoutingCommand cmd = new StartupRoutingCommand(); fillHostInfo(cmd); @@ -3202,10 +3207,10 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa try { VmwareHypervisorHost hyperHost = getHyperHost(getServiceContext()); - + assert(hyperHost instanceof HostMO); VmwareManager mgr = hyperHost.getContext().getStockObject(VmwareManager.CONTEXT_STOCK_NAME); - + VmwareHypervisorHostNetworkSummary summary = hyperHost.getHyperHostNetworkSummary(mgr.getManagementPortGroupByHost((HostMO)hyperHost)); if (summary == null) { throw new Exception("No ESX(i) host found"); @@ -3305,12 +3310,12 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa if (s_logger.isDebugEnabled()) { s_logger.debug("VM " + vm + " is now missing from host report but we detected that it might be migrated to other host by vCenter"); } - + if(oldState != State.Starting && oldState != State.Migrating) { s_logger.debug("VM " + vm + " is now missing from host report and VM is not at starting/migrating state, remove it from host VM-sync map, oldState: " + oldState); - _vms.remove(vm); + _vms.remove(vm); } else { - s_logger.debug("VM " + vm + " is missing from host report, but we will ignore VM " + vm + " in transition state " + oldState); + s_logger.debug("VM " + vm + " is missing from host report, but we will ignore VM " + vm + " in transition state " + oldState); } continue; } @@ -3353,76 +3358,76 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa } protected OptionValue[] configureVnc(OptionValue[] optionsToMerge, VmwareHypervisorHost hyperHost, String vmName, - String vncPassword, String keyboardLayout) throws Exception { - + String vncPassword, String keyboardLayout) throws Exception { + VirtualMachineMO vmMo = hyperHost.findVmOnHyperHost(vmName); VmwareManager mgr = hyperHost.getContext().getStockObject(VmwareManager.CONTEXT_STOCK_NAME); if(!mgr.beginExclusiveOperation(600)) - throw new Exception("Unable to begin exclusive operation, lock time out"); - + throw new Exception("Unable to begin exclusive operation, lock time out"); + try { - int maxVncPorts = 64; - int vncPort = 0; - Random random = new Random(); - - HostMO vmOwnerHost = vmMo.getRunningHost(); - - ManagedObjectReference morParent = vmOwnerHost.getParentMor(); - HashMap portInfo; - if(morParent.getType().equalsIgnoreCase("ClusterComputeResource")) { - ClusterMO clusterMo = new ClusterMO(vmOwnerHost.getContext(), morParent); - portInfo = clusterMo.getVmVncPortsOnCluster(); - } else { - portInfo = vmOwnerHost.getVmVncPortsOnHost(); - } - - // allocate first at 5900 - 5964 range - Collection existingPorts = portInfo.values(); - int val = random.nextInt(maxVncPorts); - int startVal = val; - do { - if (!existingPorts.contains(5900 + val)) { - vncPort = 5900 + val; - break; - } - - val = (++val) % maxVncPorts; - } while (val != startVal); - - if(vncPort == 0) { - s_logger.info("we've run out of range for ports between 5900-5964 for the cluster, we will try port range at 59000-60000"); + int maxVncPorts = 64; + int vncPort = 0; + Random random = new Random(); + + HostMO vmOwnerHost = vmMo.getRunningHost(); + + ManagedObjectReference morParent = vmOwnerHost.getParentMor(); + HashMap portInfo; + if(morParent.getType().equalsIgnoreCase("ClusterComputeResource")) { + ClusterMO clusterMo = new ClusterMO(vmOwnerHost.getContext(), morParent); + portInfo = clusterMo.getVmVncPortsOnCluster(); + } else { + portInfo = vmOwnerHost.getVmVncPortsOnHost(); + } + + // allocate first at 5900 - 5964 range + Collection existingPorts = portInfo.values(); + int val = random.nextInt(maxVncPorts); + int startVal = val; + do { + if (!existingPorts.contains(5900 + val)) { + vncPort = 5900 + val; + break; + } + + val = (++val) % maxVncPorts; + } while (val != startVal); + + if(vncPort == 0) { + s_logger.info("we've run out of range for ports between 5900-5964 for the cluster, we will try port range at 59000-60000"); - Pair additionalRange = mgr.getAddiionalVncPortRange(); - maxVncPorts = additionalRange.second(); - val = random.nextInt(maxVncPorts); - startVal = val; - do { - if (!existingPorts.contains(additionalRange.first() + val)) { - vncPort = additionalRange.first() + val; - break; - } - - val = (++val) % maxVncPorts; - } while (val != startVal); - } - - if (vncPort == 0) { - throw new Exception("Unable to find an available VNC port on host"); - } - - if (s_logger.isInfoEnabled()) { - s_logger.info("Configure VNC port for VM " + vmName + ", port: " + vncPort + ", host: " + vmOwnerHost.getHyperHostName()); - } - - return VmwareHelper.composeVncOptions(optionsToMerge, true, vncPassword, vncPort, keyboardLayout); + Pair additionalRange = mgr.getAddiionalVncPortRange(); + maxVncPorts = additionalRange.second(); + val = random.nextInt(maxVncPorts); + startVal = val; + do { + if (!existingPorts.contains(additionalRange.first() + val)) { + vncPort = additionalRange.first() + val; + break; + } + + val = (++val) % maxVncPorts; + } while (val != startVal); + } + + if (vncPort == 0) { + throw new Exception("Unable to find an available VNC port on host"); + } + + if (s_logger.isInfoEnabled()) { + s_logger.info("Configure VNC port for VM " + vmName + ", port: " + vncPort + ", host: " + vmOwnerHost.getHyperHostName()); + } + + return VmwareHelper.composeVncOptions(optionsToMerge, true, vncPassword, vncPort, keyboardLayout); } finally { - try { - mgr.endExclusiveOperation(); - } catch(Throwable e) { - assert(false); - s_logger.error("Unexpected exception ", e); - } + try { + mgr.endExclusiveOperation(); + } catch(Throwable e) { + assert(false); + s_logger.error("Unexpected exception ", e); + } } } @@ -3444,7 +3449,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa } private synchronized Pair prepareGuestNetwork(HostMO hostMo, String vlanId, Integer networkRateMbps, Integer networkRateMulticastMbps) - throws Exception { + throws Exception { return HypervisorHostHelper.prepareGuestNetwork(_guestNetworkVSwitchName, hostMo, vlanId, networkRateMbps, networkRateMulticastMbps, _ops_timeout, true); @@ -3578,11 +3583,11 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa for (DynamicProperty objProp : objProps) { if (objProp.getName().equals("name")) { - name = objProp.getVal().toString(); + name = objProp.getVal().toString(); } else if (objProp.getName().equals("summary.config.numCpu")) { - numberCPUs = objProp.getVal().toString(); + numberCPUs = objProp.getVal().toString(); } else if (objProp.getName().equals("summary.quickStats.overallCpuUsage")) { - maxCpuUsage = objProp.getVal().toString(); + maxCpuUsage = objProp.getVal().toString(); } } @@ -3597,12 +3602,12 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa // get all the metrics from the available sample period PerfMetricId[] perfMetrics = service.queryAvailablePerfMetric(perfMgr, vmMor, null, null, null); if(perfMetrics != null) { - for(int index=0; index < perfMetrics.length; ++index) { - if ( ((rxPerfCounterInfo != null) && (perfMetrics[index].getCounterId() == rxPerfCounterInfo.getKey())) || - ((txPerfCounterInfo != null) && (perfMetrics[index].getCounterId() == txPerfCounterInfo.getKey())) ) { - vmNetworkMetrics.add(perfMetrics[index]); - } - } + for(int index=0; index < perfMetrics.length; ++index) { + if ( ((rxPerfCounterInfo != null) && (perfMetrics[index].getCounterId() == rxPerfCounterInfo.getKey())) || + ((txPerfCounterInfo != null) && (perfMetrics[index].getCounterId() == txPerfCounterInfo.getKey())) ) { + vmNetworkMetrics.add(perfMetrics[index]); + } + } } double networkReadKBs=0; @@ -3631,9 +3636,9 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa if (vals[vi].getId().getCounterId() == txPerfCounterInfo.getKey()) { networkWriteKBs = sampleDuration * perfValues[3];//get the average TX rate multiplied by sampled duration } - } + } } - } + } } vmResponseMap.put(name, new VmStatsEntry(Integer.parseInt(maxCpuUsage), networkReadKBs, networkWriteKBs, Integer.parseInt(numberCPUs), "vm")); } @@ -3762,8 +3767,8 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa private static HostStatsEntry getHyperHostStats(VmwareHypervisorHost hyperHost) throws Exception { ComputeResourceSummary hardwareSummary = hyperHost.getHyperHostHardwareSummary(); if(hardwareSummary == null) - return null; - + return null; + HostStatsEntry entry = new HostStatsEntry(); entry.setEntityType("host"); @@ -3774,22 +3779,22 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa return entry; } - + private static String getRouterSshControlIp(NetworkElementCommand cmd) { - String routerIp = cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP); - String routerGuestIp = cmd.getAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP); - String zoneNetworkType = cmd.getAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE); - - if(routerGuestIp != null && zoneNetworkType != null && NetworkType.valueOf(zoneNetworkType) == NetworkType.Basic) { - if(s_logger.isDebugEnabled()) - s_logger.debug("In Basic zone mode, use router's guest IP for SSH control. guest IP : " + routerGuestIp); - - return routerGuestIp; - } - - if(s_logger.isDebugEnabled()) - s_logger.debug("Use router's private IP for SSH control. IP : " + routerIp); - return routerIp; + String routerIp = cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP); + String routerGuestIp = cmd.getAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP); + String zoneNetworkType = cmd.getAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE); + + if(routerGuestIp != null && zoneNetworkType != null && NetworkType.valueOf(zoneNetworkType) == NetworkType.Basic) { + if(s_logger.isDebugEnabled()) + s_logger.debug("In Basic zone mode, use router's guest IP for SSH control. guest IP : " + routerGuestIp); + + return routerGuestIp; + } + + if(s_logger.isDebugEnabled()) + s_logger.debug("Use router's private IP for SSH control. IP : " + routerIp); + return routerIp; } @Override @@ -3807,30 +3812,30 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa _pod = (String) params.get("pod"); _cluster = (String) params.get("cluster"); _guid = (String) params.get("guid"); - + String value = (String) params.get("cpu.overprovisioning.factor"); if(value != null) - _cpuOverprovisioningFactor = Float.parseFloat(value); - + _cpuOverprovisioningFactor = Float.parseFloat(value); + value = (String) params.get("vmware.reserve.cpu"); if(value != null && value.equalsIgnoreCase("true")) - _reserveCpu = true; - + _reserveCpu = true; + value = (String) params.get("mem.overprovisioning.factor"); if(value != null) - _memOverprovisioningFactor = Float.parseFloat(value); - + _memOverprovisioningFactor = Float.parseFloat(value); + value = (String) params.get("vmware.reserve.mem"); if(value != null && value.equalsIgnoreCase("true")) - _reserveMem = true; - + _reserveMem = true; + String[] tokens = _guid.split("@"); _vCenterAddress = tokens[1]; _morHyperHost = new ManagedObjectReference(); String[] hostTokens = tokens[0].split(":"); _morHyperHost.setType(hostTokens[0]); _morHyperHost.set_value(hostTokens[1]); - + VmwareContext context = getServiceContext(); try { VmwareManager mgr = context.getStockObject(VmwareManager.CONTEXT_STOCK_NAME); @@ -3851,12 +3856,12 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa _privateNetworkVSwitchName = (String) params.get("private.network.vswitch.name"); _publicNetworkVSwitchName = (String) params.get("public.network.vswitch.name"); _guestNetworkVSwitchName = (String) params.get("guest.network.vswitch.name"); - + value = (String)params.get("vmware.root.disk.controller"); if(value != null && value.equalsIgnoreCase("scsi")) - _rootDiskController = DiskControllerType.scsi; + _rootDiskController = DiskControllerType.scsi; else - _rootDiskController = DiskControllerType.ide; + _rootDiskController = DiskControllerType.ide; s_logger.info("VmwareResource network configuration info. private vSwitch: " + _privateNetworkVSwitchName + ", public vSwitch: " + _publicNetworkVSwitchName + ", guest network: " + _guestNetworkVSwitchName); @@ -3898,25 +3903,25 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa _serviceContext = VmwareContextFactory.create(_vCenterAddress, _username, _password); VmwareHypervisorHost hyperHost = getHyperHost(_serviceContext, cmd); assert(hyperHost instanceof HostMO); - + HostFirewallSystemMO firewallMo = ((HostMO)hyperHost).getHostFirewallSystemMO(); boolean bRefresh = false; if(firewallMo != null) { - HostFirewallInfo firewallInfo = firewallMo.getFirewallInfo(); - if(firewallInfo != null) { - for(HostFirewallRuleset rule : firewallInfo.getRuleset()) { - if("vncServer".equalsIgnoreCase(rule.getKey())) { - bRefresh = true; - firewallMo.enableRuleset("vncServer"); - } else if("gdbserver".equalsIgnoreCase(rule.getKey())) { - bRefresh = true; - firewallMo.enableRuleset("gdbserver"); - } - } - } - - if(bRefresh) - firewallMo.refreshFirewall(); + HostFirewallInfo firewallInfo = firewallMo.getFirewallInfo(); + if(firewallInfo != null) { + for(HostFirewallRuleset rule : firewallInfo.getRuleset()) { + if("vncServer".equalsIgnoreCase(rule.getKey())) { + bRefresh = true; + firewallMo.enableRuleset("vncServer"); + } else if("gdbserver".equalsIgnoreCase(rule.getKey())) { + bRefresh = true; + firewallMo.enableRuleset("gdbserver"); + } + } + } + + if(bRefresh) + firewallMo.refreshFirewall(); } } catch (Exception e) { s_logger.error("Unable to connect to vSphere server: " + _vCenterAddress, e); @@ -3938,7 +3943,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa @Override public VmwareHypervisorHost getHyperHost(VmwareContext context, Command cmd) { if (_morHyperHost.getType().equalsIgnoreCase("HostSystem")) { - return new HostMO(context, _morHyperHost); + return new HostMO(context, _morHyperHost); } return new ClusterMO(context, _morHyperHost); }