mirror of https://github.com/apache/cloudstack.git
Add Functionality Enum to HypervisorType (#481)
* Commit for PR https://github.com/shapeblue/cloudstack-apple/pull/471 This PR adds a flag (customType) to HypervisorType to differentiate if a hypervisor plugin is built-in or customized. With the customType flag, we can isolate conditional checks for allow the customized hypervisor plugin to proceed. * Add customType field to HypervisorType to differentiate if the plugin is a customized type * Address @shwstppr's comments * Define a enum in HypervisorType to indicate specific functionalities of a hypervisor plugin type * Refactoring to define if the hypervisor supports the operation during initialization of the HypervisorType. * Remove ROOT_DISK_SIZE_OVERRIDE_SUPPORTING_HYPERVISORS --------- Co-authored-by: Annie Li <ji_li@apple.com>
This commit is contained in:
parent
51fea012ef
commit
9f3380c4be
|
|
@ -23,34 +23,52 @@ import java.util.LinkedHashMap;
|
|||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.EnumSet;
|
||||
|
||||
public class Hypervisor {
|
||||
public static class HypervisorType {
|
||||
public static enum Functionality {
|
||||
DirectDownloadTemplate,
|
||||
RootDiskSizeOverride;
|
||||
}
|
||||
|
||||
private static final Map<String, HypervisorType> hypervisorTypeMap = new LinkedHashMap<>();
|
||||
public static final HypervisorType None = new HypervisorType("None"); //for storage hosts
|
||||
public static final HypervisorType XenServer = new HypervisorType("XenServer", ImageFormat.VHD);
|
||||
public static final HypervisorType KVM = new HypervisorType("KVM", ImageFormat.QCOW2);
|
||||
public static final HypervisorType VMware = new HypervisorType("VMware", ImageFormat.OVA);
|
||||
public static final HypervisorType XenServer = new HypervisorType("XenServer", ImageFormat.VHD,
|
||||
EnumSet.of(Functionality.RootDiskSizeOverride));
|
||||
public static final HypervisorType KVM = new HypervisorType("KVM", ImageFormat.QCOW2,
|
||||
EnumSet.of(Functionality.DirectDownloadTemplate, Functionality.RootDiskSizeOverride));
|
||||
public static final HypervisorType VMware = new HypervisorType("VMware", ImageFormat.OVA,
|
||||
EnumSet.of(Functionality.RootDiskSizeOverride));
|
||||
public static final HypervisorType Hyperv = new HypervisorType("Hyperv");
|
||||
public static final HypervisorType VirtualBox = new HypervisorType("VirtualBox");
|
||||
public static final HypervisorType Parralels = new HypervisorType("Parralels");
|
||||
public static final HypervisorType BareMetal = new HypervisorType("BareMetal");
|
||||
public static final HypervisorType Simulator = new HypervisorType("Simulator");
|
||||
public static final HypervisorType Simulator = new HypervisorType("Simulator", null,
|
||||
EnumSet.of(Functionality.RootDiskSizeOverride));
|
||||
public static final HypervisorType Ovm = new HypervisorType("Ovm", ImageFormat.RAW);
|
||||
public static final HypervisorType Ovm3 = new HypervisorType("Ovm3", ImageFormat.RAW);
|
||||
public static final HypervisorType LXC = new HypervisorType("LXC");
|
||||
public static final HypervisorType Custom = new HypervisorType("Custom");
|
||||
public static final HypervisorType Custom = new HypervisorType("Custom", null,
|
||||
EnumSet.of(Functionality.RootDiskSizeOverride));
|
||||
public static final HypervisorType Any = new HypervisorType("Any"); /*If you don't care about the hypervisor type*/
|
||||
private final String name;
|
||||
private final ImageFormat imageFormat;
|
||||
private final Set<Functionality> supportedFunctionalities;
|
||||
|
||||
public HypervisorType(String name) {
|
||||
this(name, null);
|
||||
this(name, null, EnumSet.noneOf(Functionality.class));
|
||||
}
|
||||
|
||||
public HypervisorType(String name, ImageFormat imageFormat) {
|
||||
this(name, imageFormat, EnumSet.noneOf(Functionality.class));
|
||||
}
|
||||
|
||||
public HypervisorType(String name, ImageFormat imageFormat, Set<Functionality> supportedFunctionalities) {
|
||||
this.name = name;
|
||||
this.imageFormat = imageFormat;
|
||||
this.supportedFunctionalities = supportedFunctionalities;
|
||||
if (name.equals("Parralels")){ // typo in the original code
|
||||
hypervisorTypeMap.put("parallels", this);
|
||||
} else {
|
||||
|
|
@ -102,6 +120,15 @@ public class Hypervisor {
|
|||
return name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Make this method to be part of the properties of the hypervisor type itself.
|
||||
*
|
||||
* @return true if the hypervisor plugin support the specified functionality
|
||||
*/
|
||||
public boolean isFunctionalitySupported(Functionality functionality) {
|
||||
return supportedFunctionalities.contains(functionality);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(name);
|
||||
|
|
|
|||
|
|
@ -344,7 +344,9 @@ public class RegisterTemplateCmd extends BaseCmd implements UserCmd {
|
|||
"Parameter zoneids cannot combine all zones (-1) option with other zones");
|
||||
|
||||
String customHypervisor = HypervisorGuru.HypervisorCustomDisplayName.value();
|
||||
if (isDirectDownload() && !(getHypervisor().equalsIgnoreCase(Hypervisor.HypervisorType.KVM.toString())
|
||||
if (isDirectDownload() &&
|
||||
!(Hypervisor.HypervisorType.getType(getHypervisor())
|
||||
.isFunctionalitySupported(Hypervisor.HypervisorType.Functionality.DirectDownloadTemplate)
|
||||
|| getHypervisor().equalsIgnoreCase(customHypervisor))) {
|
||||
throw new ServerApiException(ApiErrorCode.PARAM_ERROR, String.format("Parameter directdownload " +
|
||||
"is only allowed for KVM or %s templates", customHypervisor));
|
||||
|
|
|
|||
|
|
@ -659,14 +659,6 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
|
|||
HypervisorType.Simulator
|
||||
));
|
||||
|
||||
protected static final List<HypervisorType> ROOT_DISK_SIZE_OVERRIDE_SUPPORTING_HYPERVISORS = Arrays.asList(
|
||||
HypervisorType.KVM,
|
||||
HypervisorType.XenServer,
|
||||
HypervisorType.VMware,
|
||||
HypervisorType.Simulator,
|
||||
HypervisorType.Custom
|
||||
);
|
||||
|
||||
private static final List<HypervisorType> HYPERVISORS_THAT_CAN_DO_STORAGE_MIGRATION_ON_NON_USER_VMS = Arrays.asList(HypervisorType.KVM, HypervisorType.VMware);
|
||||
|
||||
@Override
|
||||
|
|
@ -4396,7 +4388,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
|
|||
* @throws InvalidParameterValueException if the hypervisor does not support rootdisksize override
|
||||
*/
|
||||
protected void verifyIfHypervisorSupportsRootdiskSizeOverride(HypervisorType hypervisorType) {
|
||||
if (!ROOT_DISK_SIZE_OVERRIDE_SUPPORTING_HYPERVISORS.contains(hypervisorType)) {
|
||||
if (!hypervisorType.isFunctionalitySupported(HypervisorType.Functionality.RootDiskSizeOverride)) {
|
||||
throw new InvalidParameterValueException("Hypervisor " + hypervisorType + " does not support rootdisksize override");
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -654,7 +654,7 @@ public class UserVmManagerImplTest {
|
|||
int expectedExceptionCounter = hypervisorTypeArray.length - 5;
|
||||
|
||||
for(int i = 0; i < hypervisorTypeArray.length; i++) {
|
||||
if (UserVmManagerImpl.ROOT_DISK_SIZE_OVERRIDE_SUPPORTING_HYPERVISORS.contains(hypervisorTypeArray[i])) {
|
||||
if (hypervisorTypeArray[i].isFunctionalitySupported(Hypervisor.HypervisorType.Functionality.RootDiskSizeOverride)) {
|
||||
userVmManagerImpl.verifyIfHypervisorSupportsRootdiskSizeOverride(hypervisorTypeArray[i]);
|
||||
} else {
|
||||
try {
|
||||
|
|
|
|||
Loading…
Reference in New Issue