CLOUDSTACK-7315: Set LXC volumes format as DIR. Use rm command to delete LXC volumes. Libvirt delete volume does not handle directories

This commit is contained in:
Kishan Kavala 2014-08-26 13:57:14 +05:30
parent 9ab78b7eb2
commit 30ecf935e8
9 changed files with 22 additions and 13 deletions

View File

@ -32,7 +32,8 @@ public class Storage {
BAREMETAL(false, false, false, "BAREMETAL"), BAREMETAL(false, false, false, "BAREMETAL"),
VMDK(true, true, false, "vmdk"), VMDK(true, true, false, "vmdk"),
VDI(true, true, false, "vdi"), VDI(true, true, false, "vdi"),
TAR(false, false, false, "tar"); TAR(false, false, false, "tar"),
DIR(false, false, false, "dir");
private final boolean supportThinProvisioning; private final boolean supportThinProvisioning;
private final boolean supportSparse; private final boolean supportSparse;

View File

@ -1908,10 +1908,9 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
public Answer execute(DestroyCommand cmd) { public Answer execute(DestroyCommand cmd) {
VolumeTO vol = cmd.getVolume(); VolumeTO vol = cmd.getVolume();
try { try {
KVMStoragePool pool = _storagePoolMgr.getStoragePool(vol.getPoolType(), vol.getPoolUuid()); KVMStoragePool pool = _storagePoolMgr.getStoragePool(vol.getPoolType(), vol.getPoolUuid());
pool.deletePhysicalDisk(vol.getPath()); pool.deletePhysicalDisk(vol.getPath(), null);
return new Answer(cmd, true, "Success"); return new Answer(cmd, true, "Success");
} catch (CloudRuntimeException e) { } catch (CloudRuntimeException e) {
s_logger.debug("Failed to delete volume: " + e.toString()); s_logger.debug("Failed to delete volume: " + e.toString());

View File

@ -327,7 +327,7 @@ public class IscsiAdmStorageAdaptor implements StorageAdaptor {
} }
@Override @Override
public boolean deletePhysicalDisk(String volumeUuid, KVMStoragePool pool) { public boolean deletePhysicalDisk(String volumeUuid, KVMStoragePool pool, Storage.ImageFormat format) {
throw new UnsupportedOperationException("Deleting a physical disk is not supported."); throw new UnsupportedOperationException("Deleting a physical disk is not supported.");
} }

View File

@ -115,8 +115,8 @@ public class IscsiAdmStoragePool implements KVMStoragePool {
} }
@Override @Override
public boolean deletePhysicalDisk(String volumeUuid) { public boolean deletePhysicalDisk(String volumeUuid, Storage.ImageFormat format) {
return this._storageAdaptor.deletePhysicalDisk(volumeUuid, this); return this._storageAdaptor.deletePhysicalDisk(volumeUuid, this, format);
} }
// does not apply for iScsiAdmStoragePool // does not apply for iScsiAdmStoragePool

View File

@ -35,7 +35,7 @@ public interface KVMStoragePool {
public boolean disconnectPhysicalDisk(String volumeUuid); public boolean disconnectPhysicalDisk(String volumeUuid);
public boolean deletePhysicalDisk(String volumeUuid); public boolean deletePhysicalDisk(String volumeUuid, Storage.ImageFormat format);
public List<KVMPhysicalDisk> listPhysicalDisks(); public List<KVMPhysicalDisk> listPhysicalDisks();

View File

@ -347,6 +347,8 @@ public class KVMStorageProcessor implements StorageProcessor {
newVol.setFormat(ImageFormat.RAW); newVol.setFormat(ImageFormat.RAW);
} else if (vol.getFormat() == PhysicalDiskFormat.QCOW2) { } else if (vol.getFormat() == PhysicalDiskFormat.QCOW2) {
newVol.setFormat(ImageFormat.QCOW2); newVol.setFormat(ImageFormat.QCOW2);
} else if (vol.getFormat() == PhysicalDiskFormat.DIR) {
newVol.setFormat(ImageFormat.DIR);
} }
return new CopyCmdAnswer(newVol); return new CopyCmdAnswer(newVol);
@ -1203,7 +1205,7 @@ public class KVMStorageProcessor implements StorageProcessor {
s_logger.debug("can't find volume: " + vol.getPath() + ", return true"); s_logger.debug("can't find volume: " + vol.getPath() + ", return true");
return new Answer(null); return new Answer(null);
} }
pool.deletePhysicalDisk(vol.getPath()); pool.deletePhysicalDisk(vol.getPath(), vol.getFormat());
return new Answer(null); return new Answer(null);
} catch (CloudRuntimeException e) { } catch (CloudRuntimeException e) {
s_logger.debug("Failed to delete volume: ", e); s_logger.debug("Failed to delete volume: ", e);

View File

@ -796,7 +796,7 @@ public class LibvirtStorageAdaptor implements StorageAdaptor {
} }
@Override @Override
public boolean deletePhysicalDisk(String uuid, KVMStoragePool pool) { public boolean deletePhysicalDisk(String uuid, KVMStoragePool pool, Storage.ImageFormat format) {
s_logger.info("Attempting to remove volume " + uuid + " from pool " + pool.getUuid()); s_logger.info("Attempting to remove volume " + uuid + " from pool " + pool.getUuid());
@ -849,7 +849,11 @@ public class LibvirtStorageAdaptor implements StorageAdaptor {
try { try {
StorageVol vol = getVolume(libvirtPool.getPool(), uuid); StorageVol vol = getVolume(libvirtPool.getPool(), uuid);
s_logger.debug("Instructing libvirt to remove volume " + uuid + " from pool " + pool.getUuid()); s_logger.debug("Instructing libvirt to remove volume " + uuid + " from pool " + pool.getUuid());
if(Storage.ImageFormat.DIR.equals(format)){
deleteDirVol(libvirtPool, vol);
} else {
deleteVol(libvirtPool, vol); deleteVol(libvirtPool, vol);
}
vol.free(); vol.free();
return true; return true;
} catch (LibvirtException e) { } catch (LibvirtException e) {
@ -1315,4 +1319,7 @@ public class LibvirtStorageAdaptor implements StorageAdaptor {
vol.delete(0); vol.delete(0);
} }
private void deleteDirVol(LibvirtStoragePool pool, StorageVol vol) throws LibvirtException {
Script.runSimpleBashScript("rm -r --interactive=never " + vol.getPath());
}
} }

View File

@ -171,8 +171,8 @@ public class LibvirtStoragePool implements KVMStoragePool {
} }
@Override @Override
public boolean deletePhysicalDisk(String uuid) { public boolean deletePhysicalDisk(String uuid, Storage.ImageFormat format) {
return this._storageAdaptor.deletePhysicalDisk(uuid, this); return this._storageAdaptor.deletePhysicalDisk(uuid, this, format);
} }
@Override @Override

View File

@ -49,7 +49,7 @@ public interface StorageAdaptor {
// handled by your adaptor, return false if not. 2) clean up device, return true // handled by your adaptor, return false if not. 2) clean up device, return true
public boolean disconnectPhysicalDiskByPath(String localPath); public boolean disconnectPhysicalDiskByPath(String localPath);
public boolean deletePhysicalDisk(String uuid, KVMStoragePool pool); public boolean deletePhysicalDisk(String uuid, KVMStoragePool pool, Storage.ImageFormat format);
public KVMPhysicalDisk createDiskFromTemplate(KVMPhysicalDisk template, public KVMPhysicalDisk createDiskFromTemplate(KVMPhysicalDisk template,
String name, PhysicalDiskFormat format, Storage.ProvisioningType provisioningType, long size, String name, PhysicalDiskFormat format, Storage.ProvisioningType provisioningType, long size,