diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/VolumeInfo.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/VolumeInfo.java index 347ae6ce1a1..00e8eb0cd19 100644 --- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/VolumeInfo.java +++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/VolumeInfo.java @@ -41,4 +41,5 @@ public interface VolumeInfo { public Date getCreatedDate(); public Date getUpdatedDate(); public String getOwner(); + public String getName(); } diff --git a/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/volumeServiceTest.java b/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/volumeServiceTest.java index 7451f362396..f1610b49e92 100644 --- a/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/volumeServiceTest.java +++ b/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/volumeServiceTest.java @@ -270,8 +270,9 @@ public class volumeServiceTest extends CloudStackTestNGBase { } } - private VolumeVO createVolume(long templateId) { + private VolumeVO createVolume(long templateId, long dataStoreId) { VolumeVO volume = new VolumeVO(1000, new RootDisk().toString(), UUID.randomUUID().toString(), templateId); + volume.setPoolId(dataStoreId); volume = volumeDao.persist(volume); return volume; @@ -281,12 +282,12 @@ public class volumeServiceTest extends CloudStackTestNGBase { public void createVolumeFromTemplate() { TemplateEntity te = createTemplate(); PrimaryDataStoreInfo dataStoreInfo = createPrimaryDataStore(); - VolumeVO volume = createVolume(te.getId()); + VolumeVO volume = createVolume(te.getId(), dataStoreInfo.getId()); VolumeEntity ve = volumeService.getVolumeEntity(volume.getId()); ve.createVolumeFromTemplate(dataStoreInfo.getId(), new VHD(), te); } - @Test(priority=3) + //@Test(priority=3) public void tearDown() { List ds = primaryStoreDao.findPoolByName(this.primaryName); for (int i = 0; i < ds.size(); i++) { diff --git a/engine/storage/src/org/apache/cloudstack/storage/to/VolumeTO.java b/engine/storage/src/org/apache/cloudstack/storage/to/VolumeTO.java index ed7f2be7b9a..6b8ab759f50 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/to/VolumeTO.java +++ b/engine/storage/src/org/apache/cloudstack/storage/to/VolumeTO.java @@ -9,7 +9,8 @@ public class VolumeTO { private final String path; private final VolumeType volumeType; private final VolumeDiskType diskType; - private final PrimaryDataStoreTO dataStore; + private PrimaryDataStoreTO dataStore; + private final String name; public VolumeTO(VolumeInfo volume) { this.uuid = volume.getUuid(); this.path = volume.getPath(); @@ -20,6 +21,7 @@ public class VolumeTO { } else { this.dataStore = null; } + this.name = volume.getName(); } public String getUuid() { @@ -41,4 +43,12 @@ public class VolumeTO { public PrimaryDataStoreTO getDataStore() { return this.dataStore; } + + public void setDataStore(PrimaryDataStoreTO dataStore) { + this.dataStore = dataStore; + } + + public String getName() { + return this.name; + } } diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/kvm/KvmCLVMConfigurator.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/kvm/KvmCLVMConfigurator.java index b5e9db3d167..f0b581f17e9 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/kvm/KvmCLVMConfigurator.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/kvm/KvmCLVMConfigurator.java @@ -18,7 +18,7 @@ */ package org.apache.cloudstack.storage.datastore.configurator.kvm; -import org.apache.cloudstack.storage.datastore.configurator.validator.CLVMValidator; +import org.apache.cloudstack.storage.datastore.configurator.validator.CLVMProtocolTransformer; import org.apache.cloudstack.storage.datastore.configurator.validator.StorageProtocolTransformer; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; @@ -34,7 +34,7 @@ public class KvmCLVMConfigurator extends AbstractKvmConfigurator { @Override public StorageProtocolTransformer getProtocolTransformer() { - return new CLVMValidator(); + return new CLVMProtocolTransformer(); } @Override diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/validator/CLVMValidator.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/validator/CLVMProtocolTransformer.java similarity index 95% rename from engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/validator/CLVMValidator.java rename to engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/validator/CLVMProtocolTransformer.java index ea259913f52..4dd19d260ab 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/validator/CLVMValidator.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/validator/CLVMProtocolTransformer.java @@ -26,7 +26,7 @@ import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo; import org.apache.cloudstack.storage.to.PrimaryDataStoreTO; import org.apache.cloudstack.storage.to.VolumeTO; -public class CLVMValidator implements StorageProtocolTransformer { +public class CLVMProtocolTransformer implements StorageProtocolTransformer { @Override public boolean normalizeUserInput(Map params) { diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/validator/ISCSIValiator.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/validator/ISCSIProtocolTransformer.java similarity index 95% rename from engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/validator/ISCSIValiator.java rename to engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/validator/ISCSIProtocolTransformer.java index 9e56058a758..44bdba9e0c1 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/validator/ISCSIValiator.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/validator/ISCSIProtocolTransformer.java @@ -26,7 +26,7 @@ import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo; import org.apache.cloudstack.storage.to.PrimaryDataStoreTO; import org.apache.cloudstack.storage.to.VolumeTO; -public class ISCSIValiator implements StorageProtocolTransformer { +public class ISCSIProtocolTransformer implements StorageProtocolTransformer { @Override public List getInputParamNames() { diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/validator/NfsProtocolTransformer.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/validator/NfsProtocolTransformer.java index f812ffb99f1..67ec5e8dbdf 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/validator/NfsProtocolTransformer.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/validator/NfsProtocolTransformer.java @@ -88,8 +88,9 @@ public class NfsProtocolTransformer implements StorageProtocolTransformer { @Override public VolumeTO getVolumeTO(VolumeInfo volume) { - // TODO Auto-generated method stub - return null; + VolumeTO vol = new VolumeTO(volume); + vol.setDataStore(this.getDataStoreTO(volume.getDataStore())); + return vol; } } diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/vmware/VmwareIsciConfigurator.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/vmware/VmwareIsciConfigurator.java index 2a47e03ff37..4e596560034 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/vmware/VmwareIsciConfigurator.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/vmware/VmwareIsciConfigurator.java @@ -18,7 +18,7 @@ */ package org.apache.cloudstack.storage.datastore.configurator.vmware; -import org.apache.cloudstack.storage.datastore.configurator.validator.ISCSIValiator; +import org.apache.cloudstack.storage.datastore.configurator.validator.ISCSIProtocolTransformer; import org.apache.cloudstack.storage.datastore.configurator.validator.StorageProtocolTransformer; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; @@ -33,7 +33,7 @@ public class VmwareIsciConfigurator extends AbstractVmwareConfigurator { @Override public StorageProtocolTransformer getProtocolTransformer() { - return new ISCSIValiator(); + return new ISCSIProtocolTransformer(); } @Override diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/xen/XenIscsiConfigurator.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/xen/XenIscsiConfigurator.java index a4477560cc5..1120ec2e743 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/xen/XenIscsiConfigurator.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/xen/XenIscsiConfigurator.java @@ -18,7 +18,7 @@ */ package org.apache.cloudstack.storage.datastore.configurator.xen; -import org.apache.cloudstack.storage.datastore.configurator.validator.ISCSIValiator; +import org.apache.cloudstack.storage.datastore.configurator.validator.ISCSIProtocolTransformer; import org.apache.cloudstack.storage.datastore.configurator.validator.StorageProtocolTransformer; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; @@ -34,7 +34,7 @@ public class XenIscsiConfigurator extends AbstractXenConfigurator { @Override public StorageProtocolTransformer getProtocolTransformer() { - return new ISCSIValiator(); + return new ISCSIProtocolTransformer(); } protected boolean isLocalStorageSupported() { diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/driver/DefaultPrimaryDataStoreDriverImpl.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/driver/DefaultPrimaryDataStoreDriverImpl.java index 012d00674c3..9506d7cc3ad 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/driver/DefaultPrimaryDataStoreDriverImpl.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/driver/DefaultPrimaryDataStoreDriverImpl.java @@ -118,7 +118,7 @@ public class DefaultPrimaryDataStoreDriverImpl implements PrimaryDataStoreDriver } @Override public void createVolumeFromBaseImageAsync(VolumeObject volume, TemplateOnPrimaryDataStoreInfo template, AsyncCompletionCallback callback) { - VolumeTO vol = new VolumeTO(volume); + VolumeTO vol = this.dataStore.getVolumeTO(volume); ImageOnPrimayDataStoreTO image = new ImageOnPrimayDataStoreTO(template); CreateVolumeFromBaseImageCommand cmd = new CreateVolumeFromBaseImageCommand(vol, image); List endPoints = template.getPrimaryDataStore().getEndPoints(); diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeObject.java b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeObject.java index 38cc1593f50..e25dd87538c 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeObject.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeObject.java @@ -153,4 +153,9 @@ public class VolumeObject implements VolumeInfo { // TODO Auto-generated method stub return null; } + + @Override + public String getName() { + return this.volumeVO.getName(); + } } diff --git a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerStorageResource.java b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerStorageResource.java index af6f80d8f5c..031d0e00e76 100644 --- a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerStorageResource.java +++ b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerStorageResource.java @@ -42,6 +42,7 @@ import org.apache.cloudstack.storage.to.ImageOnPrimayDataStoreTO; import org.apache.cloudstack.storage.to.NfsPrimaryDataStoreTO; import org.apache.cloudstack.storage.to.PrimaryDataStoreTO; import org.apache.cloudstack.storage.to.TemplateTO; +import org.apache.cloudstack.storage.to.VolumeTO; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpException; import org.apache.commons.httpclient.HttpStatus; @@ -97,7 +98,22 @@ public class XenServerStorageResource { } public Answer execute(CreateVolumeFromBaseImageCommand cmd) { - return new CreateVolumeAnswer(cmd, UUID.randomUUID().toString()); + VolumeTO volume = cmd.getVolume(); + ImageOnPrimayDataStoreTO baseImage = cmd.getImage(); + Connection conn = hypervisorResource.getConnection(); + + try { + VDI baseVdi = VDI.getByUuid(conn, baseImage.getPathOnPrimaryDataStore()); + VDI newVol = baseVdi.createClone(conn, new HashMap()); + newVol.setNameLabel(conn, volume.getName()); + return new CreateVolumeAnswer(cmd, newVol.getUuid(conn)); + } catch (BadServerResponse e) { + return new Answer(cmd, false, e.toString()); + } catch (XenAPIException e) { + return new Answer(cmd, false, e.toString()); + } catch (XmlRpcException e) { + return new Answer(cmd, false, e.toString()); + } } protected SR getNfsSR(Connection conn, NfsPrimaryDataStoreTO pool) {