You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by mc...@apache.org on 2013/06/04 22:54:42 UTC
git commit: updated refs/heads/object_store to e92cd6d
Updated Branches:
refs/heads/object_store ef03d5a12 -> e92cd6d63
Move data store specific extract volume logic from VolumeManager to data
store driver.
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/e92cd6d6
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/e92cd6d6
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/e92cd6d6
Branch: refs/heads/object_store
Commit: e92cd6d632ca355edbd22c86cdc9228be9abf8db
Parents: ef03d5a1
Author: Min Chen <mi...@citrix.com>
Authored: Tue Jun 4 13:54:14 2013 -0700
Committer: Min Chen <mi...@citrix.com>
Committed: Tue Jun 4 13:54:14 2013 -0700
----------------------------------------------------------------------
api/src/com/cloud/storage/VolumeApiService.java | 2 +-
.../api/command/user/volume/ExtractVolumeCmd.java | 49 ++---
server/src/com/cloud/api/ApiResponseHelper.java | 4 +-
server/src/com/cloud/storage/VolumeManager.java | 12 +-
.../src/com/cloud/storage/VolumeManagerImpl.java | 188 ++++-----------
5 files changed, 76 insertions(+), 179 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e92cd6d6/api/src/com/cloud/storage/VolumeApiService.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/storage/VolumeApiService.java b/api/src/com/cloud/storage/VolumeApiService.java
index 58bd0fd..95f962d 100644
--- a/api/src/com/cloud/storage/VolumeApiService.java
+++ b/api/src/com/cloud/storage/VolumeApiService.java
@@ -97,5 +97,5 @@ public interface VolumeApiService {
* @throws PermissionDeniedException
*
*/
- Long extractVolume(ExtractVolumeCmd cmd);
+ String extractVolume(ExtractVolumeCmd cmd);
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e92cd6d6/api/src/org/apache/cloudstack/api/command/user/volume/ExtractVolumeCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/user/volume/ExtractVolumeCmd.java b/api/src/org/apache/cloudstack/api/command/user/volume/ExtractVolumeCmd.java
index d2beeff..5fbe106 100644
--- a/api/src/org/apache/cloudstack/api/command/user/volume/ExtractVolumeCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/volume/ExtractVolumeCmd.java
@@ -126,33 +126,26 @@ public class ExtractVolumeCmd extends BaseAsyncCmd {
@Override
public void execute(){
- // try {
- UserContext.current().setEventDetails("Volume Id: "+getId());
- Long uploadId = _volumeService.extractVolume(this);
- if (uploadId != null){
- Upload uploadInfo = _entityMgr.findById(Upload.class, uploadId);
- ExtractResponse response = new ExtractResponse();
- response.setResponseName(getCommandName());
- response.setObjectName("volume");
- Volume vol = _entityMgr.findById(Volume.class, id);
- response.setId(vol.getUuid());
- response.setName(vol.getName());
- DataCenter zone = _entityMgr.findById(DataCenter.class, zoneId);
- response.setZoneId(zone.getUuid());
- response.setZoneName(zone.getName());
- response.setMode(mode);
- response.setUploadId(uploadInfo.getUuid());
- response.setState(uploadInfo.getUploadState().toString());
- Account account = _entityMgr.findById(Account.class, getEntityOwnerId());
- response.setAccountId(account.getUuid());
- response.setUrl(uploadInfo.getUploadUrl());
- this.setResponseObject(response);
- } else {
- throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to extract volume");
- }
- // } catch (URISyntaxException ex) {
- // s_logger.info(ex);
- // throw new ServerApiException(ApiErrorCode.PARAM_ERROR, ex.getMessage());
- // }
+ UserContext.current().setEventDetails("Volume Id: " + getId());
+ String uploadUrl = _volumeService.extractVolume(this);
+ if (uploadUrl != null) {
+ ExtractResponse response = new ExtractResponse();
+ response.setResponseName(getCommandName());
+ response.setObjectName("volume");
+ Volume vol = _entityMgr.findById(Volume.class, id);
+ response.setId(vol.getUuid());
+ response.setName(vol.getName());
+ DataCenter zone = _entityMgr.findById(DataCenter.class, zoneId);
+ response.setZoneId(zone.getUuid());
+ response.setZoneName(zone.getName());
+ response.setMode(mode);
+ response.setState(Upload.Status.DOWNLOAD_URL_CREATED.toString());
+ Account account = _entityMgr.findById(Account.class, getEntityOwnerId());
+ response.setAccountId(account.getUuid());
+ response.setUrl(uploadUrl);
+ this.setResponseObject(response);
+ } else {
+ throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to extract volume");
+ }
}
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e92cd6d6/server/src/com/cloud/api/ApiResponseHelper.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/ApiResponseHelper.java b/server/src/com/cloud/api/ApiResponseHelper.java
index 310b353..cf11b41 100755
--- a/server/src/com/cloud/api/ApiResponseHelper.java
+++ b/server/src/com/cloud/api/ApiResponseHelper.java
@@ -1605,8 +1605,8 @@ public class ApiResponseHelper implements ResponseGenerator {
response.setZoneName(zone.getName());
}
response.setMode(mode);
- response.setUrl(url);
- response.setState(Upload.Status.DOWNLOAD_URL_CREATED.toString());
+ response.setUrl(url);
+ response.setState(Upload.Status.DOWNLOAD_URL_CREATED.toString());
Account account = ApiDBUtils.findAccountById(accountId);
response.setAccountId(account.getUuid());
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e92cd6d6/server/src/com/cloud/storage/VolumeManager.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/storage/VolumeManager.java b/server/src/com/cloud/storage/VolumeManager.java
index 65c56d5..5f533ca 100644
--- a/server/src/com/cloud/storage/VolumeManager.java
+++ b/server/src/com/cloud/storage/VolumeManager.java
@@ -18,13 +18,11 @@
*/
package com.cloud.storage;
-import java.net.URISyntaxException;
import java.util.Map;
import org.apache.cloudstack.api.command.user.volume.AttachVolumeCmd;
import org.apache.cloudstack.api.command.user.volume.CreateVolumeCmd;
import org.apache.cloudstack.api.command.user.volume.DetachVolumeCmd;
-import org.apache.cloudstack.api.command.user.volume.ExtractVolumeCmd;
import org.apache.cloudstack.api.command.user.volume.MigrateVolumeCmd;
import org.apache.cloudstack.api.command.user.volume.ResizeVolumeCmd;
import org.apache.cloudstack.api.command.user.volume.UploadVolumeCmd;
@@ -35,8 +33,6 @@ import com.cloud.agent.api.to.VirtualMachineTO;
import com.cloud.deploy.DeployDestination;
import com.cloud.exception.ConcurrentOperationException;
import com.cloud.exception.InsufficientStorageCapacityException;
-import com.cloud.exception.InternalErrorException;
-import com.cloud.exception.PermissionDeniedException;
import com.cloud.exception.ResourceAllocationException;
import com.cloud.exception.StorageUnavailableException;
import com.cloud.host.Host;
@@ -54,6 +50,7 @@ public interface VolumeManager extends VolumeApiService {
Long destPoolClusterId, HypervisorType dataDiskHyperType)
throws ConcurrentOperationException;
+ @Override
VolumeVO uploadVolume(UploadVolumeCmd cmd)
throws ResourceAllocationException;
@@ -65,28 +62,35 @@ public interface VolumeManager extends VolumeApiService {
String getVmNameOnVolume(Volume volume);
+ @Override
VolumeVO allocVolume(CreateVolumeCmd cmd)
throws ResourceAllocationException;
+ @Override
VolumeVO createVolume(CreateVolumeCmd cmd);
+ @Override
VolumeVO resizeVolume(ResizeVolumeCmd cmd)
throws ResourceAllocationException;
+ @Override
boolean deleteVolume(long volumeId, Account caller)
throws ConcurrentOperationException;
void destroyVolume(VolumeVO volume);
DiskProfile allocateRawVolume(Type type, String name, DiskOfferingVO offering, Long size, VMInstanceVO vm, Account owner);
+ @Override
Volume attachVolumeToVM(AttachVolumeCmd command);
+ @Override
Volume detachVolumeFromVM(DetachVolumeCmd cmmd);
void release(VirtualMachineProfile<? extends VMInstanceVO> profile);
void cleanupVolumes(long vmId) throws ConcurrentOperationException;
+ @Override
Volume migrateVolume(MigrateVolumeCmd cmd);
<T extends VMInstanceVO> void migrateVolumes(T vm, VirtualMachineTO vmTo, Host srcHost, Host destHost,
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e92cd6d6/server/src/com/cloud/storage/VolumeManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/storage/VolumeManagerImpl.java b/server/src/com/cloud/storage/VolumeManagerImpl.java
index fcd714d..5abd432 100644
--- a/server/src/com/cloud/storage/VolumeManagerImpl.java
+++ b/server/src/com/cloud/storage/VolumeManagerImpl.java
@@ -43,10 +43,8 @@ import org.apache.cloudstack.api.command.user.volume.MigrateVolumeCmd;
import org.apache.cloudstack.api.command.user.volume.ResizeVolumeCmd;
import org.apache.cloudstack.api.command.user.volume.UploadVolumeCmd;
-import com.amazonaws.services.s3.model.CannedAccessControlList;
import com.cloud.storage.dao.*;
import org.apache.cloudstack.api.command.user.volume.*;
-import org.apache.cloudstack.api.response.ExtractResponse;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreProviderManager;
@@ -72,23 +70,20 @@ import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao;
import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO;
import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreDao;
import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreVO;
+import org.apache.cloudstack.storage.image.datastore.ImageStoreEntity;
import org.apache.commons.lang.StringUtils;
import com.cloud.agent.AgentManager;
import com.cloud.agent.api.Answer;
import com.cloud.agent.api.storage.CreateVolumeOVAAnswer;
import com.cloud.agent.api.storage.CreateVolumeOVACommand;
-import com.cloud.agent.api.to.DataStoreTO;
import com.cloud.agent.api.to.DataTO;
import com.cloud.agent.api.to.DiskTO;
-import com.cloud.agent.api.to.S3TO;
-import com.cloud.agent.api.to.SwiftTO;
import com.cloud.agent.api.to.VirtualMachineTO;
import com.cloud.alert.AlertManager;
import com.cloud.api.ApiDBUtils;
import com.cloud.async.AsyncJobExecutor;
import com.cloud.async.AsyncJobManager;
-import com.cloud.async.AsyncJobResult;
import com.cloud.async.AsyncJobVO;
import com.cloud.async.BaseAsyncJobExecutor;
import com.cloud.capacity.CapacityManager;
@@ -119,7 +114,6 @@ import com.cloud.exception.InvalidParameterValueException;
import com.cloud.exception.PermissionDeniedException;
import com.cloud.exception.ResourceAllocationException;
import com.cloud.exception.StorageUnavailableException;
-import com.cloud.exception.UnsupportedServiceException;
import com.cloud.host.Host;
import com.cloud.host.HostVO;
import com.cloud.host.dao.HostDao;
@@ -134,7 +128,6 @@ import com.cloud.server.ManagementServer;
import com.cloud.service.ServiceOfferingVO;
import com.cloud.service.dao.ServiceOfferingDao;
import com.cloud.storage.Storage.ImageFormat;
-import com.cloud.storage.Upload.Status;
import com.cloud.storage.Volume.Type;
import com.cloud.storage.dao.DiskOfferingDao;
import com.cloud.storage.dao.SnapshotDao;
@@ -166,7 +159,6 @@ import com.cloud.uservm.UserVm;
import com.cloud.utils.EnumUtils;
import com.cloud.utils.NumbersUtil;
import com.cloud.utils.Pair;
-import com.cloud.utils.S3Utils;
import com.cloud.utils.UriUtils;
import com.cloud.utils.component.ManagerBase;
import com.cloud.utils.db.DB;
@@ -2615,11 +2607,9 @@ public class VolumeManagerImpl extends ManagerBase implements VolumeManager {
@Override
@ActionEvent(eventType = EventTypes.EVENT_VOLUME_EXTRACT, eventDescription = "extracting volume", async = true)
- public Long extractVolume(ExtractVolumeCmd cmd) {
+ public String extractVolume(ExtractVolumeCmd cmd) {
Long volumeId = cmd.getId();
- String url = cmd.getUrl();
Long zoneId = cmd.getZoneId();
- AsyncJobVO job = null; // FIXME: cmd.getJob();
String mode = cmd.getMode();
Account account = UserContext.current().getCaller();
@@ -2654,18 +2644,16 @@ public class VolumeManagerImpl extends ManagerBase implements VolumeManager {
throw ex;
}
- if (volume.getVolumeType() != Volume.Type.DATADISK) { // Datadisk dont
- // have any
- // template
- // dependence.
+ if (volume.getVolumeType() != Volume.Type.DATADISK) {
+ // Datadisk dont have any template dependence.
VMTemplateVO template = ApiDBUtils.findTemplateById(volume.getTemplateId());
if (template != null) { // For ISO based volumes template = null and
// we allow extraction of all ISO based
// volumes
boolean isExtractable = template.isExtractable() && template.getTemplateType() != Storage.TemplateType.SYSTEM;
- if (!isExtractable && account != null && account.getType() != Account.ACCOUNT_TYPE_ADMIN) { // Global
- // admins are always allowed to extract
+ if (!isExtractable && account != null && account.getType() != Account.ACCOUNT_TYPE_ADMIN) {
+ // Global admins are always allowed to extract
PermissionDeniedException ex = new PermissionDeniedException("The volume with specified volumeId is not allowed to be extracted");
ex.addProxyObject(volume, volumeId, "volumeId");
throw ex;
@@ -2680,139 +2668,51 @@ public class VolumeManagerImpl extends ManagerBase implements VolumeManager {
extractMode = mode.equals(Upload.Mode.FTP_UPLOAD.toString()) ? Upload.Mode.FTP_UPLOAD : Upload.Mode.HTTP_DOWNLOAD;
}
- long accountId = volume.getAccountId();
+ // Clean up code to remove all those previous uploadVO and uploadMonitor code. Previous code is trying to fake an async operation purely in
+ // db table with uploadVO and async_job entry, but internal implementation is actually synchronous.
StoragePool srcPool = (StoragePool) this.dataStoreMgr.getPrimaryDataStore(volume.getPoolId());
- DataStore secStore = this.dataStoreMgr.getImageStore(zoneId);
+ ImageStoreEntity secStore = (ImageStoreEntity) this.dataStoreMgr.getImageStore(zoneId);
String secondaryStorageURL = secStore.getUri();
- List<UploadVO> extractURLList = _uploadDao.listByTypeUploadStatus(volumeId, Upload.Type.VOLUME, UploadVO.Status.DOWNLOAD_URL_CREATED);
+ String value = this._configDao.getValue(Config.CopyVolumeWait.toString());
+ int copyvolumewait = NumbersUtil.parseInt(value, Integer.parseInt(Config.CopyVolumeWait.getDefaultValue()));
+ // Copy volume from primary to secondary storage
+ VolumeInfo srcVol = this.volFactory.getVolume(volume.getId());
+ AsyncCallFuture<VolumeApiResult> cvAnswer = this.volService.copyVolume(srcVol, secStore);
+ // Check if you got a valid answer.
+ VolumeApiResult cvResult = null;
+ try {
+ cvResult = cvAnswer.get();
+ } catch (InterruptedException e1) {
+ s_logger.debug("failed copy volume", e1);
+ throw new CloudRuntimeException("Failed to copy volume", e1);
+ } catch (ExecutionException e1) {
+ s_logger.debug("failed copy volume", e1);
+ throw new CloudRuntimeException("Failed to copy volume", e1);
+ }
+ if (cvResult == null || cvResult.isFailed()) {
+ String errorString = "Failed to copy the volume from the source primary storage pool to secondary storage.";
+ throw new CloudRuntimeException(errorString);
+ }
+
+ VolumeInfo vol = cvResult.getVolume();
+ String volumeLocalPath = vol.getPath();
+ String volumeName = StringUtils.substringBeforeLast(StringUtils.substringAfterLast(volumeLocalPath, "/"), ".");
+ // volss, handle the ova special case;
+ if (getFormatForPool(srcPool) == "ova") {
+ // TODO: need to handle this for S3 as secondary storage
+ CreateVolumeOVACommand cvOVACmd = new CreateVolumeOVACommand(secondaryStorageURL, volumeLocalPath, volumeName, srcPool, copyvolumewait);
+ CreateVolumeOVAAnswer OVAanswer = null;
- if (extractMode == Upload.Mode.HTTP_DOWNLOAD && extractURLList.size() > 0) {
- return extractURLList.get(0).getId(); // If download url already
- // Note: volss
- // exists then return
- } else {
- UploadVO uploadJob = _uploadMonitor.createNewUploadEntry(secStore.getId(), volumeId, UploadVO.Status.COPY_IN_PROGRESS,
- Upload.Type.VOLUME, url, extractMode);
- s_logger.debug("Extract Mode - " + uploadJob.getMode());
- uploadJob = _uploadDao.createForUpdate(uploadJob.getId());
-
- // Update the async Job
-
- ExtractResponse resultObj = new ExtractResponse(ApiDBUtils.findVolumeById(volumeId).getUuid(), volume.getName(), ApiDBUtils
- .findAccountById(accountId).getUuid(), UploadVO.Status.COPY_IN_PROGRESS.toString(), uploadJob.getUuid());
- resultObj.setResponseName(cmd.getCommandName());
- AsyncJobExecutor asyncExecutor = BaseAsyncJobExecutor.getCurrentExecutor();
- if (asyncExecutor != null) {
- job = asyncExecutor.getJob();
- _asyncMgr.updateAsyncJobAttachment(job.getId(), Upload.Type.VOLUME.toString(), volumeId);
- _asyncMgr.updateAsyncJobStatus(job.getId(), AsyncJobResult.STATUS_IN_PROGRESS, resultObj);
- }
- //TODO: AncientDataMotionStrategy.copyObject should use different timeout parent for different objects
- String value = this._configDao.getValue(Config.CopyVolumeWait.toString());
- int copyvolumewait = NumbersUtil.parseInt(value, Integer.parseInt(Config.CopyVolumeWait.getDefaultValue()));
- // Copy volume from primary to secondary storage
- VolumeInfo srcVol = this.volFactory.getVolume(volume.getId());
- AsyncCallFuture<VolumeApiResult> cvAnswer = this.volService.copyVolume(srcVol, secStore);
- // Check if you got a valid answer.
- VolumeApiResult cvResult = null;
try {
- cvResult = cvAnswer.get();
- } catch (InterruptedException e1) {
- s_logger.debug("failed copy volume", e1);
- throw new CloudRuntimeException("Failed to copy volume" , e1);
- } catch (ExecutionException e1) {
- s_logger.debug("failed copy volume", e1);
- throw new CloudRuntimeException("Failed to copy volume" , e1);
- }
- if (cvResult == null || cvResult.isFailed()) {
- String errorString = "Failed to copy the volume from the source primary storage pool to secondary storage.";
-
- // Update the async job.
- resultObj.setResultString(errorString);
- resultObj.setUploadStatus(UploadVO.Status.COPY_ERROR.toString());
- if (asyncExecutor != null) {
- _asyncMgr.completeAsyncJob(job.getId(), AsyncJobResult.STATUS_FAILED, 0, resultObj);
- }
-
- // Update the DB that volume couldn't be copied
- uploadJob.setUploadState(UploadVO.Status.COPY_ERROR);
- uploadJob.setErrorString(errorString);
- uploadJob.setLastUpdated(new Date());
- _uploadDao.update(uploadJob.getId(), uploadJob);
-
- throw new CloudRuntimeException(errorString);
- }
-
- VolumeInfo vol = cvResult.getVolume();
- String volumeLocalPath = vol.getPath();
- String volumeName = StringUtils.substringBeforeLast(StringUtils.substringAfterLast(volumeLocalPath, "/"), ".");
- // volss, handle the ova special case;
- if (getFormatForPool(srcPool) == "ova") {
- //TODO: need to handle this for S3 as secondary storage
- CreateVolumeOVACommand cvOVACmd = new CreateVolumeOVACommand(secondaryStorageURL, volumeLocalPath, volumeName, srcPool,
- copyvolumewait);
- CreateVolumeOVAAnswer OVAanswer = null;
-
- try {
- cvOVACmd.setContextParam("hypervisor", HypervisorType.VMware.toString());
- OVAanswer = (CreateVolumeOVAAnswer) storageMgr.sendToPool(srcPool, cvOVACmd); // Fang:
- // for
- // extract
- // volume,
- // create
- // the
- // ova
- // file
- // here;
-
- } catch (StorageUnavailableException e) {
- s_logger.debug("Storage unavailable");
- }
- }
- // Update the DB that volume is copied and volumePath
- uploadJob.setUploadState(UploadVO.Status.COPY_COMPLETE);
- uploadJob.setLastUpdated(new Date());
- uploadJob.setInstallPath(volumeLocalPath);
- _uploadDao.update(uploadJob.getId(), uploadJob);
-
- DataStoreTO volStore = secStore.getTO();
- if (volStore instanceof SwiftTO) {
- throw new UnsupportedServiceException("ExtractVolume is not yet supported for Swift image store provider");
- }
-
- if (volStore instanceof S3TO) {
- // for S3, no need to do anything, just return volume url for
- // extract template. but we need to set object acl as public_read to
- // make the url accessible
- S3TO s3 = (S3TO) volStore;
- String key = vol.getPath();
- try {
- S3Utils.setObjectAcl(s3, s3.getBucketName(), key, CannedAccessControlList.PublicRead);
- } catch (Exception ex) {
- s_logger.error("Failed to set ACL on S3 object " + key + " to PUBLIC_READ", ex);
- throw new CloudRuntimeException("Failed to set ACL on S3 object " + key + " to PUBLIC_READ");
- }
- // construct the url from s3
- StringBuffer s3url = new StringBuffer();
- s3url.append(s3.isHttps() ? "https://" : "http://");
- s3url.append(s3.getEndPoint());
- s3url.append("/");
- s3url.append(s3.getBucketName());
- s3url.append("/");
- s3url.append(key);
-
- UploadVO vo = _uploadDao.createForUpdate();
- vo.setLastUpdated(new Date());
- vo.setUploadUrl(s3url.toString());
- vo.setUploadState(Status.DOWNLOAD_URL_CREATED);
- _uploadDao.update(uploadJob.getId(), vo);
- } else {
- // create a URL.
- _uploadMonitor.createVolumeDownloadURL(volumeId, volumeLocalPath, Upload.Type.VOLUME, zoneId, uploadJob.getId(), volume.getFormat());
+ cvOVACmd.setContextParam("hypervisor", HypervisorType.VMware.toString());
+ // for extract volume, create the ova file here;
+ OVAanswer = (CreateVolumeOVAAnswer) storageMgr.sendToPool(srcPool, cvOVACmd);
+ } catch (StorageUnavailableException e) {
+ s_logger.debug("Storage unavailable");
}
- return uploadJob.getId();
}
+ return secStore.createEntityExtractUrl(vol.getPath(), vol.getFormat());
}
private String getFormatForPool(StoragePool pool) {