mirror of https://github.com/apache/cloudstack.git
bug 11362: Make VM network adapter device type be selectable based on VM-specific details
This commit is contained in:
parent
31c8cc8dc7
commit
905df61aac
|
|
@ -32,8 +32,6 @@ import com.cloud.utils.fsm.StateObject;
|
|||
*/
|
||||
public interface VirtualMachine extends RunningOn, ControlledEntity, StateObject<VirtualMachine.State> {
|
||||
|
||||
public static final String PARAM_KEY_KEYBOARD = "keyboard";
|
||||
|
||||
public enum State {
|
||||
Starting(true, "VM is being started. At this state, you should find host id filled which means it's being started on that host."),
|
||||
Running(false, "VM is running. host id has the host that it is running on."),
|
||||
|
|
|
|||
|
|
@ -146,6 +146,7 @@ import com.cloud.hypervisor.vmware.mo.HostMO;
|
|||
import com.cloud.hypervisor.vmware.mo.HostVirtualNicType;
|
||||
import com.cloud.hypervisor.vmware.mo.HypervisorHostHelper;
|
||||
import com.cloud.hypervisor.vmware.mo.NetworkDetails;
|
||||
import com.cloud.hypervisor.vmware.mo.VirtualEthernetCardType;
|
||||
import com.cloud.hypervisor.vmware.mo.VirtualMachineMO;
|
||||
import com.cloud.hypervisor.vmware.mo.VmwareHypervisorHost;
|
||||
import com.cloud.hypervisor.vmware.mo.VmwareHypervisorHostNetworkSummary;
|
||||
|
|
@ -178,6 +179,7 @@ import com.cloud.vm.DiskProfile;
|
|||
import com.cloud.vm.VirtualMachine;
|
||||
import com.cloud.vm.VirtualMachine.State;
|
||||
import com.cloud.vm.VirtualMachineName;
|
||||
import com.cloud.vm.VmDetailConstants;
|
||||
import com.google.gson.Gson;
|
||||
import com.vmware.vim25.ClusterDasConfigInfo;
|
||||
import com.vmware.vim25.ComputeResourceSummary;
|
||||
|
|
@ -770,8 +772,9 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
|
|||
vmMo.getRunningHost(), vlanId, null, null, this._ops_timeout, true);
|
||||
|
||||
VmwareManager mgr = getServiceContext().getStockObject(VmwareManager.CONTEXT_STOCK_NAME);
|
||||
|
||||
VirtualDevice nic = VmwareHelper.prepareNicDevice(vmMo, networkInfo.first(), mgr.getGuestNicDeviceType(),
|
||||
|
||||
// Note: public NIC is plugged inside system VM
|
||||
VirtualDevice nic = VmwareHelper.prepareNicDevice(vmMo, networkInfo.first(), VirtualEthernetCardType.Vmxnet3,
|
||||
networkInfo.second(), vifMacAddress, -1, 1, true, true);
|
||||
vmMo.plugDevice(nic);
|
||||
}
|
||||
|
|
@ -1057,8 +1060,8 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
|
|||
}
|
||||
|
||||
VirtualMachineTO vmSpec = cmd.getVirtualMachine();
|
||||
String vmName = vmSpec.getName();
|
||||
|
||||
String vmName = vmSpec.getName();
|
||||
|
||||
State state = State.Stopped;
|
||||
VmwareContext context = getServiceContext();
|
||||
try {
|
||||
|
|
@ -1068,7 +1071,11 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
|
|||
synchronized (_vms) {
|
||||
_vms.put(vmName, State.Starting);
|
||||
}
|
||||
|
||||
|
||||
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);
|
||||
|
||||
VmwareHypervisorHost hyperHost = getHyperHost(context);
|
||||
VolumeTO[] disks = validateDisks(vmSpec.getDisks());
|
||||
assert (disks.length > 0);
|
||||
|
|
@ -1274,7 +1281,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
|
|||
|
||||
Pair<ManagedObjectReference, String> networkInfo = prepareNetworkFromNicInfo(vmMo.getRunningHost(), nicTo);
|
||||
|
||||
nic = VmwareHelper.prepareNicDevice(vmMo, networkInfo.first(), mgr.getGuestNicDeviceType(), networkInfo.second(), nicTo.getMac(), i, i + 1, true, true);
|
||||
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);
|
||||
|
|
@ -1295,7 +1302,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
|
|||
|
||||
String keyboardLayout = null;
|
||||
if(vmSpec.getDetails() != null)
|
||||
keyboardLayout = vmSpec.getDetails().get(VirtualMachine.PARAM_KEY_KEYBOARD);
|
||||
keyboardLayout = vmSpec.getDetails().get(VmDetailConstants.KEYBOARD);
|
||||
vmConfigSpec.setExtraConfig(configureVnc(machineIdOptions, hyperHost, vmName, vmSpec.getVncPassword(), keyboardLayout));
|
||||
|
||||
if (!vmMo.configureVm(vmConfigSpec)) {
|
||||
|
|
|
|||
|
|
@ -0,0 +1,23 @@
|
|||
/**
|
||||
* Copyright (C) 2010 Cloud.com, Inc. All rights reserved.
|
||||
*
|
||||
* This software is licensed under the GNU General Public License v3 or later.
|
||||
*
|
||||
* It is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or any later version.
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
package com.cloud.vm;
|
||||
|
||||
public interface VmDetailConstants {
|
||||
public static final String KEYBOARD = "keyboard";
|
||||
public static final String NIC_ADAPTER = "nic_adapter";
|
||||
}
|
||||
|
|
@ -3,6 +3,7 @@
|
|||
*/
|
||||
package com.cloud.hypervisor.guru;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.ejb.Local;
|
||||
|
|
@ -29,6 +30,7 @@ import com.cloud.hypervisor.HypervisorGuru;
|
|||
import com.cloud.hypervisor.HypervisorGuruBase;
|
||||
import com.cloud.hypervisor.vmware.VmwareCleanupMaid;
|
||||
import com.cloud.hypervisor.vmware.manager.VmwareManager;
|
||||
import com.cloud.hypervisor.vmware.mo.VirtualEthernetCardType;
|
||||
import com.cloud.secstorage.CommandExecLogDao;
|
||||
import com.cloud.secstorage.CommandExecLogVO;
|
||||
import com.cloud.storage.GuestOSVO;
|
||||
|
|
@ -39,9 +41,12 @@ import com.cloud.utils.Pair;
|
|||
import com.cloud.utils.component.Inject;
|
||||
import com.cloud.utils.db.DB;
|
||||
import com.cloud.utils.net.NetUtils;
|
||||
import com.cloud.vm.ConsoleProxyVO;
|
||||
import com.cloud.vm.DomainRouterVO;
|
||||
import com.cloud.vm.SecondaryStorageVmVO;
|
||||
import com.cloud.vm.VirtualMachine;
|
||||
import com.cloud.vm.VirtualMachineProfile;
|
||||
import com.cloud.vm.VmDetailConstants;
|
||||
|
||||
@Local(value=HypervisorGuru.class)
|
||||
public class VMwareGuru extends HypervisorGuruBase implements HypervisorGuru {
|
||||
|
|
@ -66,9 +71,43 @@ public class VMwareGuru extends HypervisorGuruBase implements HypervisorGuru {
|
|||
}
|
||||
|
||||
@Override
|
||||
public <T extends VirtualMachine> VirtualMachineTO implement(VirtualMachineProfile<T> vm) {
|
||||
public <T extends VirtualMachine> VirtualMachineTO implement(VirtualMachineProfile<T> vm) {
|
||||
VirtualMachineTO to = toVirtualMachineTO(vm);
|
||||
to.setBootloader(BootloaderType.HVM);
|
||||
to.setBootloader(BootloaderType.HVM);
|
||||
|
||||
Map<String, String> details = to.getDetails();
|
||||
if(details == null)
|
||||
details = new HashMap<String, String>();
|
||||
|
||||
String nicDeviceType = details.get(VmDetailConstants.NIC_ADAPTER);
|
||||
if(vm.getVirtualMachine() instanceof DomainRouterVO || vm.getVirtualMachine() instanceof ConsoleProxyVO
|
||||
|| vm.getVirtualMachine() instanceof SecondaryStorageVmVO) {
|
||||
|
||||
// for system VMs, use Vmxnet3 as default
|
||||
if(nicDeviceType == null) {
|
||||
details.put(VmDetailConstants.NIC_ADAPTER, VirtualEthernetCardType.Vmxnet3.toString());
|
||||
} else {
|
||||
try {
|
||||
VirtualEthernetCardType.valueOf(nicDeviceType);
|
||||
} catch (Exception e) {
|
||||
s_logger.warn("Invalid NIC device type " + nicDeviceType + " is specified in VM details, switch to default E1000");
|
||||
details.put(VmDetailConstants.NIC_ADAPTER, VirtualEthernetCardType.E1000.toString());
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// for user-VM, use E1000 as default
|
||||
if(nicDeviceType == null) {
|
||||
details.put(VmDetailConstants.NIC_ADAPTER, VirtualEthernetCardType.E1000.toString());
|
||||
} else {
|
||||
try {
|
||||
VirtualEthernetCardType.valueOf(nicDeviceType);
|
||||
} catch (Exception e) {
|
||||
s_logger.warn("Invalid NIC device type " + nicDeviceType + " is specified in VM details, switch to default E1000");
|
||||
details.put(VmDetailConstants.NIC_ADAPTER, VirtualEthernetCardType.E1000.toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
to.setDetails(details);
|
||||
|
||||
// Determine the VM's OS description
|
||||
GuestOSVO guestOS = _guestOsDao.findById(vm.getVirtualMachine().getGuestOSId());
|
||||
|
|
|
|||
|
|
@ -192,6 +192,7 @@ import com.cloud.vm.VirtualMachineManager;
|
|||
import com.cloud.vm.VirtualMachineName;
|
||||
import com.cloud.vm.VirtualMachineProfile;
|
||||
import com.cloud.vm.VirtualMachineProfile.Param;
|
||||
import com.cloud.vm.VmDetailConstants;
|
||||
import com.cloud.vm.dao.DomainRouterDao;
|
||||
import com.cloud.vm.dao.NicDao;
|
||||
import com.cloud.vm.dao.UserVmDao;
|
||||
|
|
@ -1217,7 +1218,6 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian
|
|||
DomainRouterVO router = profile.getVirtualMachine();
|
||||
Map<String, String> details = _vmDetailsDao.findDetails(router.getId());
|
||||
router.setDetails(details);
|
||||
|
||||
NetworkVO network = _networkDao.findById(router.getNetworkId());
|
||||
|
||||
String type = null;
|
||||
|
|
|
|||
|
|
@ -2522,7 +2522,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager
|
|||
}
|
||||
|
||||
if(keyboard != null && !keyboard.isEmpty())
|
||||
vm.setDetail(VirtualMachine.PARAM_KEY_KEYBOARD, keyboard);
|
||||
vm.setDetail(VmDetailConstants.KEYBOARD, keyboard);
|
||||
|
||||
if (isIso) {
|
||||
vm.setIsoId(template.getId());
|
||||
|
|
|
|||
Loading…
Reference in New Issue