Previously, virtual machine which contained shareable disks could not be exported because the export command did not recognise shared disks. The export command now accounts for shared disks, so virtual machines with shared disks are exported successfully.
[Storage] Can not export VM with shared disk using collapse snapshot option.
VM that has shared disk can not be exported if "collapse snapshot" option is used. It happens because we are not exporting shared disk (which is correct) but in the flow when collapse snapshot involved we don't filter shared disk and send its ID in getImageInfo which is wrong. Therefore the export fails.
Here is the problematic code:
------------------------------------------------------------------------------
public boolean updateCopyVmInSpm(Guid storagePoolId, VM vm, Guid storageDomainId) {
HashMap<Guid, KeyValuePairCompat<String, List<Guid>>> vmsAndMetaDictionary =
new HashMap<Guid, KeyValuePairCompat<String, List<Guid>>>();
OvfManager ovfManager = new OvfManager();
ArrayList<DiskImage> AllVmImages = new ArrayList<DiskImage>();
VmHandler.updateDisksFromDb(vm);
List<VmNetworkInterface> interfaces = vm.getInterfaces();
if (interfaces != null) {
// TODO remove this when the API changes
interfaces.clear();
interfaces.addAll(DbFacade.getInstance().getVmNetworkInterfaceDao().getAllForVm(vm.getId()));
}
for (Disk disk : vm.getDiskMap().values()) {
if (DiskStorageType.IMAGE == disk.getDiskStorageType()) {
DiskImage diskImage = (DiskImage) disk;
diskImage.setParentId(VmTemplateHandler.BlankVmTemplateId);
diskImage.setit_guid(VmTemplateHandler.BlankVmTemplateId);
diskImage.setstorage_ids(new ArrayList<Guid>(Arrays.asList(storageDomainId)));
DiskImage diskForVolumeInfo = getDiskForVolumeInfo(diskImage);
diskImage.setvolume_format(diskForVolumeInfo.getvolume_format());
diskImage.setvolume_type(diskForVolumeInfo.getvolume_type());
VDSReturnValue vdsReturnValue = Backend
.getInstance()
.getResourceManager()
.RunVdsCommand(
VDSCommandType.GetImageInfo,
new GetImageInfoVDSCommandParameters(storagePoolId, storageDomainId, diskImage
.getId(), diskImage.getImageId()));
if (vdsReturnValue != null && vdsReturnValue.getSucceeded()) {
DiskImage fromVdsm = (DiskImage) vdsReturnValue.getReturnValue();
diskImage.setactual_size(fromVdsm.get
--------------------------------------------------------------------------------
How to reproduce:
1.Create VM with 2 or more disks when one of the disks is shared disk.
2.Create export domain.
3.Try to export VM to export domain (check option collpase snapshot).
You will get the following error in the engine.log
---------------------------------------------------
2012-12-09 14:50:54,535 INFO [org.ovirt.engine.core.vdsbroker.irsbroker.GetImageInfoVDSCommand] (pool-3-thread-41) START, GetImageInfoVDSCommand( storagePoolId = c4584f01-cbbb-4e9e-8672-3deb841127a3, ignoreFailoverLimit = false, compata
bilityVersion = null, storageDomainId = 72ec1321-a114-451f-bee1-6790cbca1bc6, imageGroupId = 89ec86a6-ef6b-4337-8fb3-b17f988228fd, imageId = 31318ef0-b9c4-47a4-88fb-b5ab021cea68), log id: 77768cf8
2012-12-09 14:50:54,572 ERROR [org.ovirt.engine.core.vdsbroker.irsbroker.GetImageInfoVDSCommand] (pool-3-thread-41) IrsBroker::getImageInfo::Failed getting image info imageId = 31318ef0-b9c4-47a4-88fb-b5ab021cea68 does not exist on domai
nName = New_Export , domainId = 72ec1321-a114-451f-bee1-6790cbca1bc6, error code: ImagePathError, message: Image path does not exist or cannot be accessed/created: ('/rhev/data-center/c4584f01-cbbb-4e9e-8672-3deb841127a3/72ec1321-a114-4
51f-bee1-6790cbca1bc6/images/89ec86a6-ef6b-4337-8fb3-b17f988228fd',)
2012-12-09 14:50:54,573 INFO [org.ovirt.engine.core.vdsbroker.vdsbroker.BrokerCommandBase] (pool-3-thread-41) Command org.ovirt.engine.core.vdsbroker.irsbroker.GetImageInfoVDSCommand return value
Class Name: org.ovirt.engine.core.vdsbroker.irsbroker.OneImageInfoReturnForXmlRpc
mInfo Null
mStatus Class Name: org.ovirt.engine.core.vdsbroker.vdsbroker.StatusForXmlRpc
mCode 254
mMessage Image path does not exist or cannot be accessed/created: ('/rhev/data-center/c4584f01-cbbb-4e9e-8672-3deb841127a3/72ec1321-a114-451f-bee1-6790cbca1bc6/images/89ec86a6-ef6b-4337-8fb3-b17f988228fd',)
----------------------------------------------------------------------------
Reproduces:
100%.
[Storage] Can not export VM with shared disk using collapse snapshot option. VM that has shared disk can not be exported if "collapse snapshot" option is used. It happens because we are not exporting shared disk (which is correct) but in the flow when collapse snapshot involved we don't filter shared disk and send its ID in getImageInfo which is wrong. Therefore the export fails. Here is the problematic code: ------------------------------------------------------------------------------ public boolean updateCopyVmInSpm(Guid storagePoolId, VM vm, Guid storageDomainId) { HashMap<Guid, KeyValuePairCompat<String, List<Guid>>> vmsAndMetaDictionary = new HashMap<Guid, KeyValuePairCompat<String, List<Guid>>>(); OvfManager ovfManager = new OvfManager(); ArrayList<DiskImage> AllVmImages = new ArrayList<DiskImage>(); VmHandler.updateDisksFromDb(vm); List<VmNetworkInterface> interfaces = vm.getInterfaces(); if (interfaces != null) { // TODO remove this when the API changes interfaces.clear(); interfaces.addAll(DbFacade.getInstance().getVmNetworkInterfaceDao().getAllForVm(vm.getId())); } for (Disk disk : vm.getDiskMap().values()) { if (DiskStorageType.IMAGE == disk.getDiskStorageType()) { DiskImage diskImage = (DiskImage) disk; diskImage.setParentId(VmTemplateHandler.BlankVmTemplateId); diskImage.setit_guid(VmTemplateHandler.BlankVmTemplateId); diskImage.setstorage_ids(new ArrayList<Guid>(Arrays.asList(storageDomainId))); DiskImage diskForVolumeInfo = getDiskForVolumeInfo(diskImage); diskImage.setvolume_format(diskForVolumeInfo.getvolume_format()); diskImage.setvolume_type(diskForVolumeInfo.getvolume_type()); VDSReturnValue vdsReturnValue = Backend .getInstance() .getResourceManager() .RunVdsCommand( VDSCommandType.GetImageInfo, new GetImageInfoVDSCommandParameters(storagePoolId, storageDomainId, diskImage .getId(), diskImage.getImageId())); if (vdsReturnValue != null && vdsReturnValue.getSucceeded()) { DiskImage fromVdsm = (DiskImage) vdsReturnValue.getReturnValue(); diskImage.setactual_size(fromVdsm.get -------------------------------------------------------------------------------- How to reproduce: 1.Create VM with 2 or more disks when one of the disks is shared disk. 2.Create export domain. 3.Try to export VM to export domain (check option collpase snapshot). You will get the following error in the engine.log --------------------------------------------------- 2012-12-09 14:50:54,535 INFO [org.ovirt.engine.core.vdsbroker.irsbroker.GetImageInfoVDSCommand] (pool-3-thread-41) START, GetImageInfoVDSCommand( storagePoolId = c4584f01-cbbb-4e9e-8672-3deb841127a3, ignoreFailoverLimit = false, compata bilityVersion = null, storageDomainId = 72ec1321-a114-451f-bee1-6790cbca1bc6, imageGroupId = 89ec86a6-ef6b-4337-8fb3-b17f988228fd, imageId = 31318ef0-b9c4-47a4-88fb-b5ab021cea68), log id: 77768cf8 2012-12-09 14:50:54,572 ERROR [org.ovirt.engine.core.vdsbroker.irsbroker.GetImageInfoVDSCommand] (pool-3-thread-41) IrsBroker::getImageInfo::Failed getting image info imageId = 31318ef0-b9c4-47a4-88fb-b5ab021cea68 does not exist on domai nName = New_Export , domainId = 72ec1321-a114-451f-bee1-6790cbca1bc6, error code: ImagePathError, message: Image path does not exist or cannot be accessed/created: ('/rhev/data-center/c4584f01-cbbb-4e9e-8672-3deb841127a3/72ec1321-a114-4 51f-bee1-6790cbca1bc6/images/89ec86a6-ef6b-4337-8fb3-b17f988228fd',) 2012-12-09 14:50:54,573 INFO [org.ovirt.engine.core.vdsbroker.vdsbroker.BrokerCommandBase] (pool-3-thread-41) Command org.ovirt.engine.core.vdsbroker.irsbroker.GetImageInfoVDSCommand return value Class Name: org.ovirt.engine.core.vdsbroker.irsbroker.OneImageInfoReturnForXmlRpc mInfo Null mStatus Class Name: org.ovirt.engine.core.vdsbroker.vdsbroker.StatusForXmlRpc mCode 254 mMessage Image path does not exist or cannot be accessed/created: ('/rhev/data-center/c4584f01-cbbb-4e9e-8672-3deb841127a3/72ec1321-a114-451f-bee1-6790cbca1bc6/images/89ec86a6-ef6b-4337-8fb3-b17f988228fd',) ---------------------------------------------------------------------------- Reproduces: 100%.