179179import org .apache .cloudstack .utils .volume .VirtualMachineDiskInfo ;
180180import org .apache .commons .collections .CollectionUtils ;
181181import org .apache .commons .collections .MapUtils ;
182+ import org .apache .commons .lang3 .BooleanUtils ;
182183import org .apache .commons .lang3 .StringUtils ;
183184import org .apache .logging .log4j .LogManager ;
184185import org .apache .logging .log4j .Logger ;
@@ -1406,6 +1407,7 @@ private UserVmResponse baseImportInstance(ImportUnmanagedInstanceCmd cmd) {
14061407 throw new CloudRuntimeException ("Please provide an import source for importing the VM" );
14071408 }
14081409 String source = importVmCmd .getImportSource ().toUpperCase ();
1410+ String extraParams = ((ImportVmCmd ) cmd ).getExtraParams ();
14091411 ImportSource importSource = Enum .valueOf (ImportSource .class , source );
14101412 if (ImportSource .VMWARE == importSource ) {
14111413 userVm = importUnmanagedInstanceFromVmwareToKvm (zone , cluster ,
@@ -1434,6 +1436,16 @@ private UserVmResponse baseImportInstance(ImportUnmanagedInstanceCmd cmd) {
14341436 return responseGenerator .createUserVmResponse (ResponseObject .ResponseView .Full , "virtualmachine" , userVm ).get (0 );
14351437 }
14361438
1439+ private void checkExtraParamsAllowed (String extraParams ) {
1440+ if (StringUtils .isBlank (extraParams )) {
1441+ return ;
1442+ }
1443+ if (BooleanUtils .isFalse (ConvertVmwareInstanceToKvmExtraParamsAllowed .value ())) {
1444+ throw new ServerApiException (ApiErrorCode .PARAM_ERROR ,
1445+ "Extra parameters for Vmware to KVM conversion are disabled by the administrator" );
1446+ }
1447+ }
1448+
14371449 private long getUserIdForImportInstance (Account owner ) {
14381450 long userId = CallContext .current ().getCallingUserId ();
14391451 List <UserVO > userVOs = userDao .listByAccount (owner .getAccountId ());
@@ -1529,6 +1541,7 @@ public UserVmResponse importVm(ImportVmCmd cmd) {
15291541 String source = cmd .getImportSource ().toUpperCase ();
15301542 ImportSource importSource = Enum .valueOf (ImportSource .class , source );
15311543 if (ImportSource .VMWARE == importSource || ImportSource .UNMANAGED == importSource ) {
1544+ checkExtraParamsAllowed (cmd .getExtraParams ());
15321545 return baseImportInstance (cmd );
15331546 } else {
15341547 return importKvmInstance (cmd );
@@ -1689,6 +1702,7 @@ protected UserVm importUnmanagedInstanceFromVmwareToKvm(DataCenter zone, Cluster
16891702 Long convertInstanceHostId = cmd .getConvertInstanceHostId ();
16901703 Long importInstanceHostId = cmd .getImportInstanceHostId ();
16911704 Long convertStoragePoolId = cmd .getConvertStoragePoolId ();
1705+ String extraParams = cmd .getExtraParams ();
16921706
16931707 if ((existingVcenterId == null && vcenter == null ) || (existingVcenterId != null && vcenter != null )) {
16941708 throw new ServerApiException (ApiErrorCode .PARAM_ERROR ,
@@ -1699,6 +1713,8 @@ protected UserVm importUnmanagedInstanceFromVmwareToKvm(DataCenter zone, Cluster
16991713 "Please set all the information for a vCenter IP/Name, datacenter, username and password" );
17001714 }
17011715
1716+ checkExtraParamsAllowed (extraParams );
1717+
17021718 if (existingVcenterId != null ) {
17031719 VmwareDatacenterVO existingDC = vmwareDatacenterDao .findById (existingVcenterId );
17041720 if (existingDC == null ) {
@@ -1752,14 +1768,14 @@ protected UserVm importUnmanagedInstanceFromVmwareToKvm(DataCenter zone, Cluster
17521768 convertedInstance = convertVmwareInstanceToKVMWithOVFOnConvertLocation (sourceVMName ,
17531769 sourceVMwareInstance , convertHost , importHost , convertStoragePools ,
17541770 serviceOffering , dataDiskOfferingMap , temporaryConvertLocation ,
1755- ovfTemplateOnConvertLocation );
1771+ ovfTemplateOnConvertLocation , extraParams );
17561772 } else {
17571773 // Uses KVM Host for OVF export to temporary conversion location, through ovftool
17581774 updateImportVMTaskStep (importVMTaskVO , zone , owner , convertHost , importHost , ConvertingInstance );
17591775 convertedInstance = convertVmwareInstanceToKVMAfterExportingOVFToConvertLocation (
17601776 sourceVMName , sourceVMwareInstance , convertHost , importHost ,
17611777 convertStoragePools , serviceOffering , dataDiskOfferingMap ,
1762- temporaryConvertLocation , vcenter , username , password , datacenterName );
1778+ temporaryConvertLocation , vcenter , username , password , datacenterName , extraParams );
17631779 }
17641780
17651781 sanitizeConvertedInstance (convertedInstance , sourceVMwareInstance );
@@ -2041,15 +2057,17 @@ private UnmanagedInstanceTO convertVmwareInstanceToKVMWithOVFOnConvertLocation(
20412057 String sourceVM , UnmanagedInstanceTO sourceVMwareInstance , HostVO convertHost ,
20422058 HostVO importHost , List <StoragePoolVO > convertStoragePools ,
20432059 ServiceOfferingVO serviceOffering , Map <String , Long > dataDiskOfferingMap ,
2044- DataStoreTO temporaryConvertLocation , String ovfTemplateDirConvertLocation
2045- ) {
2060+ DataStoreTO temporaryConvertLocation , String ovfTemplateDirConvertLocation , String extraParams ) {
20462061 logger .debug ("Delegating the conversion of instance {} from VMware to KVM to the host {} using OVF {} on conversion datastore" ,
20472062 sourceVM , convertHost , ovfTemplateDirConvertLocation );
20482063
20492064 RemoteInstanceTO remoteInstanceTO = new RemoteInstanceTO (sourceVM );
20502065 List <String > destinationStoragePools = selectInstanceConversionStoragePools (convertStoragePools , sourceVMwareInstance .getDisks (), serviceOffering , dataDiskOfferingMap );
20512066 ConvertInstanceCommand cmd = new ConvertInstanceCommand (remoteInstanceTO ,
20522067 Hypervisor .HypervisorType .KVM , temporaryConvertLocation , ovfTemplateDirConvertLocation , false , false );
2068+ if (StringUtils .isNotBlank (extraParams )) {
2069+ cmd .setExtraParams (extraParams );
2070+ }
20532071 int timeoutSeconds = UnmanagedVMsManager .ConvertVmwareInstanceToKvmTimeout .value () * 60 * 60 ;
20542072 cmd .setWait (timeoutSeconds );
20552073
@@ -2062,8 +2080,7 @@ private UnmanagedInstanceTO convertVmwareInstanceToKVMAfterExportingOVFToConvert
20622080 HostVO importHost , List <StoragePoolVO > convertStoragePools ,
20632081 ServiceOfferingVO serviceOffering , Map <String , Long > dataDiskOfferingMap ,
20642082 DataStoreTO temporaryConvertLocation , String vcenterHost , String vcenterUsername ,
2065- String vcenterPassword , String datacenterName
2066- ) {
2083+ String vcenterPassword , String datacenterName , String extraParams ) {
20672084 logger .debug ("Delegating the conversion of instance {} from VMware to KVM to the host {} after OVF export through ovftool" , sourceVM , convertHost );
20682085
20692086 RemoteInstanceTO remoteInstanceTO = new RemoteInstanceTO (sourceVMwareInstance .getName (), sourceVMwareInstance .getPath (), vcenterHost , vcenterUsername , vcenterPassword , datacenterName );
@@ -2078,7 +2095,9 @@ private UnmanagedInstanceTO convertVmwareInstanceToKVMAfterExportingOVFToConvert
20782095 noOfThreads = sourceVMwareInstance .getDisks ().size ();
20792096 }
20802097 cmd .setThreadsCountToExportOvf (noOfThreads );
2081-
2098+ if (StringUtils .isNotBlank (extraParams )) {
2099+ cmd .setExtraParams (extraParams );
2100+ }
20822101 return convertAndImportToKVM (cmd , convertHost , importHost , sourceVM ,
20832102 remoteInstanceTO , destinationStoragePools , temporaryConvertLocation );
20842103 }
@@ -3064,7 +3083,8 @@ public ConfigKey<?>[] getConfigKeys() {
30643083 RemoteKvmInstanceDisksCopyTimeout ,
30653084 ConvertVmwareInstanceToKvmTimeout ,
30663085 ThreadsOnMSToImportVMwareVMFiles ,
3067- ThreadsOnKVMHostToImportVMwareVMFiles
3086+ ThreadsOnKVMHostToImportVMwareVMFiles ,
3087+ ConvertVmwareInstanceToKvmExtraParamsAllowed
30683088 };
30693089 }
30703090}
0 commit comments