Skip to content

Commit 58e4f62

Browse files
sureshanapartidhslove
authored andcommitted
[VMware to KVM Migration] Fix for converted instance npe issue when source vmware instance ovf is exported from management server (apache#11003)
1 parent 41d5e7d commit 58e4f62

File tree

5 files changed

+20
-59
lines changed

5 files changed

+20
-59
lines changed

api/src/main/java/com/cloud/storage/VolumeApiService.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,14 @@ Snapshot takeSnapshot(Long volumeId, Long policyId, Long snapshotId, Account acc
169169
* </body>
170170
* </table>
171171
*/
172+
boolean doesStoragePoolSupportDiskOffering(StoragePool destPool, DiskOffering diskOffering);
173+
174+
/**
175+
* Checks if the storage pool supports the required disk offering tags
176+
* destPool the storage pool to check the disk offering tags
177+
* diskOfferingTags the tags that should be supported
178+
* return whether the tags are supported in the storage pool
179+
*/
172180
boolean doesStoragePoolSupportDiskOfferingTags(StoragePool destPool, String diskOfferingTags);
173181

174182
Volume destroyVolume(long volumeId, Account caller, boolean expunge, boolean forceExpunge);

core/src/main/java/com/cloud/agent/api/ConvertInstanceAnswer.java

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -16,25 +16,13 @@
1616
// under the License.
1717
package com.cloud.agent.api;
1818

19-
import org.apache.cloudstack.vm.UnmanagedInstanceTO;
20-
2119
public class ConvertInstanceAnswer extends Answer {
2220

2321
private String temporaryConvertUuid;
2422

2523
public ConvertInstanceAnswer() {
2624
super();
2725
}
28-
private UnmanagedInstanceTO convertedInstance;
29-
30-
public ConvertInstanceAnswer(Command command, boolean success, String details) {
31-
super(command, success, details);
32-
}
33-
34-
public ConvertInstanceAnswer(Command command, UnmanagedInstanceTO convertedInstance) {
35-
super(command, true, "");
36-
this.convertedInstance = convertedInstance;
37-
}
3826

3927
public ConvertInstanceAnswer(Command command, String temporaryConvertUuid) {
4028
super(command, true, "");
@@ -44,8 +32,4 @@ public ConvertInstanceAnswer(Command command, String temporaryConvertUuid) {
4432
public String getTemporaryConvertUuid() {
4533
return temporaryConvertUuid;
4634
}
47-
48-
public UnmanagedInstanceTO getConvertedInstance() {
49-
return convertedInstance;
50-
}
51-
}
35+
}

plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtConvertInstanceCommandWrapper.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@
1818
//
1919
package com.cloud.hypervisor.kvm.resource.wrapper;
2020

21-
2221
import java.net.URLEncoder;
2322
import java.nio.charset.Charset;
2423
import java.util.List;
2524
import java.util.UUID;
25+
2626
import org.apache.cloudstack.storage.to.PrimaryDataStoreTO;
2727
import org.apache.commons.lang3.StringUtils;
2828

@@ -62,15 +62,15 @@ public Answer execute(ConvertInstanceCommand cmd, LibvirtComputingResource serve
6262
String msg = String.format("Cannot convert the instance %s from VMware as the virt-v2v binary is not found. " +
6363
"Please install virt-v2v%s on the host before attempting the instance conversion.", sourceInstanceName, serverResource.isUbuntuHost()? ", nbdkit" : "");
6464
logger.info(msg);
65-
return new ConvertInstanceAnswer(cmd, false, msg);
65+
return new Answer(cmd, false, msg);
6666
}
6767

6868
if (!areSourceAndDestinationHypervisorsSupported(sourceHypervisorType, destinationHypervisorType)) {
6969
String err = destinationHypervisorType != Hypervisor.HypervisorType.KVM ?
7070
String.format("The destination hypervisor type is %s, KVM was expected, cannot handle it", destinationHypervisorType) :
7171
String.format("The source hypervisor type %s is not supported for KVM conversion", sourceHypervisorType);
7272
logger.error(err);
73-
return new ConvertInstanceAnswer(cmd, false, err);
73+
return new Answer(cmd, false, err);
7474
}
7575

7676
final KVMStoragePoolManager storagePoolMgr = serverResource.getStoragePoolMgr();
@@ -88,7 +88,7 @@ public Answer execute(ConvertInstanceCommand cmd, LibvirtComputingResource serve
8888
if (StringUtils.isBlank(exportInstanceOVAUrl)) {
8989
String err = String.format("Couldn't export OVA for the VM %s, due to empty url", sourceInstanceName);
9090
logger.error(err);
91-
return new ConvertInstanceAnswer(cmd, false, err);
91+
return new Answer(cmd, false, err);
9292
}
9393

9494
int noOfThreads = cmd.getThreadsCountToExportOvf();
@@ -102,7 +102,7 @@ public Answer execute(ConvertInstanceCommand cmd, LibvirtComputingResource serve
102102
if (!ovfExported) {
103103
String err = String.format("Export OVA for the VM %s failed", sourceInstanceName);
104104
logger.error(err);
105-
return new ConvertInstanceAnswer(cmd, false, err);
105+
return new Answer(cmd, false, err);
106106
}
107107
sourceOVFDirPath = String.format("%s%s/", sourceOVFDirPath, sourceInstanceName);
108108
} else {
@@ -124,14 +124,15 @@ public Answer execute(ConvertInstanceCommand cmd, LibvirtComputingResource serve
124124
"has a different virt-v2v version.",
125125
ovfTemplateDirOnConversionLocation);
126126
logger.error(err);
127-
return new ConvertInstanceAnswer(cmd, false, err);
127+
return new Answer(cmd, false, err);
128128
}
129129
return new ConvertInstanceAnswer(cmd, temporaryConvertUuid);
130130
} catch (Exception e) {
131131
String error = String.format("Error converting instance %s from %s, due to: %s",
132132
sourceInstanceName, sourceHypervisorType, e.getMessage());
133133
logger.error(error, e);
134-
return new ConvertInstanceAnswer(cmd, false, error);
134+
cleanupSecondaryStorage = true;
135+
return new Answer(cmd, false, error);
135136
} finally {
136137
if (ovfExported && StringUtils.isNotBlank(ovfTemplateDirOnConversionLocation)) {
137138
String sourceOVFDir = String.format("%s/%s", temporaryConvertPath, ovfTemplateDirOnConversionLocation);

server/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImpl.java

Lines changed: 2 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -2091,39 +2091,8 @@ private List<StoragePoolVO> findInstanceConversionStoragePoolsInCluster(
20912091
logger.error(msg);
20922092
throw new CloudRuntimeException(msg);
20932093
}
2094-
diskOfferingTags.add(diskOffering.getTags());
2095-
}
2096-
if (serviceOffering.getDiskOfferingId() != null) {
2097-
DiskOfferingVO diskOffering = diskOfferingDao.findById(serviceOffering.getDiskOfferingId());
2098-
if (diskOffering != null) {
2099-
diskOfferingTags.add(diskOffering.getTags());
2100-
}
2101-
}
2102-
2103-
pools = getPoolsWithMatchingTags(pools, diskOfferingTags);
2104-
if (pools.isEmpty()) {
2105-
String msg = String.format("Cannot find suitable storage pools in cluster %s for the conversion", destinationCluster);
2106-
logger.error(msg);
2107-
throw new CloudRuntimeException(msg);
2108-
}
2109-
return pools;
2110-
}
2111-
2112-
private List<StoragePoolVO> getPoolsWithMatchingTags(List<StoragePoolVO> pools, List<String> diskOfferingTags) {
2113-
if (diskOfferingTags.isEmpty()) {
2114-
return pools;
2115-
}
2116-
List<StoragePoolVO> poolsSupportingTags = new ArrayList<>(pools);
2117-
for (String tags : diskOfferingTags) {
2118-
boolean tagsMatched = false;
2119-
for (StoragePoolVO pool : pools) {
2120-
if (volumeApiService.doesTargetStorageSupportDiskOffering(pool, tags)) {
2121-
poolsSupportingTags.add(pool);
2122-
tagsMatched = true;
2123-
}
2124-
}
2125-
if (!tagsMatched) {
2126-
String msg = String.format("Cannot find suitable storage pools for the conversion with disk offering tags %s", tags);
2094+
if (getStoragePoolWithTags(pools, diskOffering.getTags()) == null) {
2095+
String msg = String.format("Cannot find suitable storage pool for disk offering %s", diskOffering.getName());
21272096
logger.error(msg);
21282097
throw new CloudRuntimeException(msg);
21292098
}

server/src/test/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImplTest.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -704,11 +704,10 @@ private void baseTestImportVmFromVmwareToKvm(VcenterParameter vcenterParameter,
704704
when(agentManager.send(Mockito.eq(convertHostId), Mockito.any(CheckConvertInstanceCommand.class))).thenReturn(checkConvertInstanceAnswer);
705705
}
706706

707-
when(volumeApiService.doesStoragePoolSupportDiskOfferingTags(any(StoragePool.class), any())).thenReturn(true);
707+
when(volumeApiService.doesStoragePoolSupportDiskOffering(any(StoragePool.class), any(DiskOffering.class))).thenReturn(true);
708708

709709
ConvertInstanceAnswer convertInstanceAnswer = mock(ConvertInstanceAnswer.class);
710710
ImportConvertedInstanceAnswer convertImportedInstanceAnswer = mock(ImportConvertedInstanceAnswer.class);
711-
when(convertInstanceAnswer.getConvertedInstance()).thenReturn(instance);
712711
when(convertInstanceAnswer.getResult()).thenReturn(vcenterParameter != VcenterParameter.CONVERT_FAILURE);
713712
Mockito.lenient().when(convertImportedInstanceAnswer.getConvertedInstance()).thenReturn(instance);
714713
Mockito.lenient().when(convertImportedInstanceAnswer.getResult()).thenReturn(vcenterParameter != VcenterParameter.CONVERT_FAILURE);

0 commit comments

Comments
 (0)