From ddc53771bf61ce3b10a7628d60cc218cf52d076d Mon Sep 17 00:00:00 2001 From: Edison Su Date: Thu, 17 Jan 2013 18:49:34 -0800 Subject: [PATCH] implement toURI --- .../storage/image/ImageDataFactoryImpl.java | 2 +- .../manager/ImageDataStoreManagerImpl.java | 11 +++--- ...aStoreImpl.java => HttpDataStoreImpl.java} | 38 +++++++++++-------- .../storage/image/store/TemplateObject.java | 20 +++++++++- .../datastore/DefaultPrimaryDataStore.java | 5 ++- .../DefaultPrimaryDataStoreDriverImpl.java | 5 +-- .../storage/volume/VolumeObject.java | 24 ++++++++---- .../SolidfirePrimaryDataStoreDriver.java | 34 ++++++----------- 8 files changed, 80 insertions(+), 59 deletions(-) rename engine/storage/image/src/org/apache/cloudstack/storage/image/store/{ImageDataStoreImpl.java => HttpDataStoreImpl.java} (70%) diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/ImageDataFactoryImpl.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/ImageDataFactoryImpl.java index 2fbe616fd1e..ea25b7cf452 100644 --- a/engine/storage/image/src/org/apache/cloudstack/storage/image/ImageDataFactoryImpl.java +++ b/engine/storage/image/src/org/apache/cloudstack/storage/image/ImageDataFactoryImpl.java @@ -45,7 +45,7 @@ public class ImageDataFactoryImpl implements ImageDataFactory { return null; } ImageDataVO templ = imageDataDao.findById(templateId); - TemplateObject tmpl = new TemplateObject(templ, store); + TemplateObject tmpl = TemplateObject.getTemplate(templ, store); return tmpl; } } diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/manager/ImageDataStoreManagerImpl.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/manager/ImageDataStoreManagerImpl.java index 2a24f9b5f04..68a2770c549 100644 --- a/engine/storage/image/src/org/apache/cloudstack/storage/image/manager/ImageDataStoreManagerImpl.java +++ b/engine/storage/image/src/org/apache/cloudstack/storage/image/manager/ImageDataStoreManagerImpl.java @@ -23,16 +23,15 @@ import java.util.Map; import javax.inject.Inject; -import org.apache.cloudstack.storage.datastore.provider.DataStoreProvider; import org.apache.cloudstack.storage.datastore.provider.DataStoreProviderManager; +import org.apache.cloudstack.storage.datastore.provider.ImageDataStoreProvider; import org.apache.cloudstack.storage.image.ImageDataStoreDriver; import org.apache.cloudstack.storage.image.datastore.ImageDataStore; import org.apache.cloudstack.storage.image.datastore.ImageDataStoreManager; import org.apache.cloudstack.storage.image.db.ImageDataDao; import org.apache.cloudstack.storage.image.db.ImageDataStoreDao; import org.apache.cloudstack.storage.image.db.ImageDataStoreVO; -import org.apache.cloudstack.storage.image.store.ImageDataStoreImpl; -import org.apache.cloudstack.storage.volume.PrimaryDataStoreDriver; +import org.apache.cloudstack.storage.image.store.HttpDataStoreImpl; import org.springframework.stereotype.Component; @Component @@ -49,9 +48,9 @@ public class ImageDataStoreManagerImpl implements ImageDataStoreManager { public ImageDataStore getImageDataStore(long dataStoreId) { ImageDataStoreVO dataStore = dataStoreDao.findById(dataStoreId); long providerId = dataStore.getProvider(); - DataStoreProvider provider = providerManager.getDataStoreProviderById(providerId); - ImageDataStore imgStore = new ImageDataStoreImpl(dataStore, - driverMaps.get(provider.getUuid()) + ImageDataStoreProvider provider = (ImageDataStoreProvider)providerManager.getDataStoreProviderById(providerId); + ImageDataStore imgStore = HttpDataStoreImpl.getDataStore(dataStore, + driverMaps.get(provider.getUuid()), provider ); // TODO Auto-generated method stub return imgStore; diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/store/ImageDataStoreImpl.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/store/HttpDataStoreImpl.java similarity index 70% rename from engine/storage/image/src/org/apache/cloudstack/storage/image/store/ImageDataStoreImpl.java rename to engine/storage/image/src/org/apache/cloudstack/storage/image/store/HttpDataStoreImpl.java index 014d61feabd..1c135a87ed2 100644 --- a/engine/storage/image/src/org/apache/cloudstack/storage/image/store/ImageDataStoreImpl.java +++ b/engine/storage/image/src/org/apache/cloudstack/storage/image/store/HttpDataStoreImpl.java @@ -25,32 +25,43 @@ import javax.inject.Inject; import org.apache.cloudstack.engine.subsystem.api.storage.DataObject; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreDriver; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreRole; -import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint; import org.apache.cloudstack.engine.subsystem.api.storage.Scope; import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo; import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope; +import org.apache.cloudstack.storage.datastore.ObjectInDataStoreManager; +import org.apache.cloudstack.storage.datastore.provider.ImageDataStoreProvider; import org.apache.cloudstack.storage.image.ImageDataStoreDriver; import org.apache.cloudstack.storage.image.TemplateInfo; import org.apache.cloudstack.storage.image.datastore.ImageDataStore; import org.apache.cloudstack.storage.image.db.ImageDataDao; import org.apache.cloudstack.storage.image.db.ImageDataStoreVO; -import org.apache.cloudstack.storage.image.db.ImageDataVO; import org.apache.cloudstack.storage.snapshot.SnapshotInfo; +import com.cloud.utils.component.ComponentContext; -public class ImageDataStoreImpl implements ImageDataStore { + +public class HttpDataStoreImpl implements ImageDataStore { @Inject ImageDataDao imageDao; + @Inject + private ObjectInDataStoreManager objectInStoreMgr; ImageDataStoreDriver driver; ImageDataStoreVO imageDataStoreVO; + ImageDataStoreProvider provider; boolean needDownloadToCacheStorage = false; - public ImageDataStoreImpl(ImageDataStoreVO dataStoreVO, ImageDataStoreDriver imageDataStoreDriver) { + private HttpDataStoreImpl(ImageDataStoreVO dataStoreVO, ImageDataStoreDriver imageDataStoreDriver, + ImageDataStoreProvider provider) { this.driver = imageDataStoreDriver; this.imageDataStoreVO = dataStoreVO; + this.provider = provider; } - + public static HttpDataStoreImpl getDataStore(ImageDataStoreVO dataStoreVO, ImageDataStoreDriver imageDataStoreDriver, + ImageDataStoreProvider provider) { + HttpDataStoreImpl instance = new HttpDataStoreImpl(dataStoreVO, imageDataStoreDriver, provider); + return ComponentContext.inject(instance); + } @Override public Set listTemplates() { @@ -58,12 +69,10 @@ public class ImageDataStoreImpl implements ImageDataStore { return null; } - - @Override public DataStoreDriver getDriver() { // TODO Auto-generated method stub - return null; + return this.driver; } @@ -71,7 +80,7 @@ public class ImageDataStoreImpl implements ImageDataStore { @Override public DataStoreRole getRole() { // TODO Auto-generated method stub - return null; + return DataStoreRole.Image; } @@ -79,15 +88,14 @@ public class ImageDataStoreImpl implements ImageDataStore { @Override public long getId() { // TODO Auto-generated method stub - return 0; + return this.imageDataStoreVO.getId(); } @Override public String getUri() { - // TODO Auto-generated method stub - return null; + return this.imageDataStoreVO.getProtocol() + "://" + "?role=" + this.getRole(); } @@ -95,7 +103,7 @@ public class ImageDataStoreImpl implements ImageDataStore { @Override public Scope getScope() { // TODO Auto-generated method stub - return null; + return new ZoneScope(imageDataStoreVO.getDcId()); } @@ -126,7 +134,7 @@ public class ImageDataStoreImpl implements ImageDataStore { @Override public boolean exists(DataObject object) { - // TODO Auto-generated method stub - return false; + return (objectInStoreMgr.findObject(object.getId(), object.getType(), + this.getId(), this.getRole()) != null) ? true : false; } } diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/store/TemplateObject.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/store/TemplateObject.java index 18cde7b27f3..edc194c0e1f 100644 --- a/engine/storage/image/src/org/apache/cloudstack/storage/image/store/TemplateObject.java +++ b/engine/storage/image/src/org/apache/cloudstack/storage/image/store/TemplateObject.java @@ -18,16 +18,21 @@ */ package org.apache.cloudstack.storage.image.store; +import java.io.File; + import javax.inject.Inject; import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectType; import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; import org.apache.cloudstack.engine.subsystem.api.storage.disktype.DiskFormat; +import org.apache.cloudstack.storage.datastore.ObjectInDataStoreManager; +import org.apache.cloudstack.storage.db.ObjectInDataStoreVO; import org.apache.cloudstack.storage.image.TemplateEvent; import org.apache.cloudstack.storage.image.TemplateInfo; import org.apache.cloudstack.storage.image.db.ImageDataDao; import org.apache.cloudstack.storage.image.db.ImageDataVO; import org.apache.cloudstack.storage.image.manager.ImageDataManager; +import org.apache.cloudstack.storage.volume.ObjectInDataStoreStateMachine; import org.apache.log4j.Logger; import com.cloud.utils.component.ComponentContext; @@ -41,8 +46,10 @@ public class TemplateObject implements TemplateInfo { ImageDataManager imageMgr; @Inject ImageDataDao imageDao; + @Inject + ObjectInDataStoreManager ojbectInStoreMgr; - public TemplateObject(ImageDataVO template, DataStore dataStore) { + private TemplateObject(ImageDataVO template, DataStore dataStore) { this.imageVO = template; this.dataStore = dataStore; } @@ -78,7 +85,16 @@ public class TemplateObject implements TemplateInfo { @Override public String getUri() { - return this.dataStore.getUri() + "template/" + this.imageVO.getUrl(); + if (this.dataStore == null) { + return this.imageVO.getUrl(); + } else { + ObjectInDataStoreVO obj = ojbectInStoreMgr.findObject(this.imageVO.getId(), DataObjectType.TEMPLATE, this.dataStore.getId(), this.dataStore.getRole()); + if (obj.getState() != ObjectInDataStoreStateMachine.State.Ready) { + return this.dataStore.getUri() + File.separator + "?type=" + DataObjectType.TEMPLATE + "&size=" + this.imageVO.getSize(); + } else { + return this.dataStore.getUri() + File.separator + "?type=" + DataObjectType.TEMPLATE + "&path=" + obj.getInstallPath(); + } + } } @Override diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/DefaultPrimaryDataStore.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/DefaultPrimaryDataStore.java index c1ce4b3e64c..ba5b1f58a14 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/DefaultPrimaryDataStore.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/DefaultPrimaryDataStore.java @@ -54,6 +54,7 @@ public class DefaultPrimaryDataStore implements PrimaryDataStore { protected PrimaryDataStoreDriver driver; protected PrimaryDataStoreVO pdsv; protected PrimaryDataStoreLifeCycle lifeCycle; + @Inject private ObjectInDataStoreManager objectInStoreMgr; @Inject ImageDataFactory imageDataFactory; @@ -118,8 +119,8 @@ public class DefaultPrimaryDataStore implements PrimaryDataStore { public String getUri() { return this.pdsv.getPoolType() + File.separator + this.pdsv.getHostAddress() + File.separator - + this.pdsv.getPath(); - + + this.pdsv.getPath() + File.separator + + "?role=" + this.getRole(); } @Override 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 10b37138a3a..3cf5697ee9c 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 @@ -167,9 +167,8 @@ public class DefaultPrimaryDataStoreDriverImpl implements PrimaryDataStoreDriver } @Override - public String grantAccess(DataObject vol, EndPoint ep) { - // TODO Auto-generated method stub - return null; + public String grantAccess(DataObject object, EndPoint ep) { + return object.getUri(); } @Override 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 9acd4864895..f656e59d2cb 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 @@ -24,6 +24,8 @@ import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectType; import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo; import org.apache.cloudstack.engine.subsystem.api.storage.disktype.DiskFormat; +import org.apache.cloudstack.storage.datastore.ObjectInDataStoreManager; +import org.apache.cloudstack.storage.db.ObjectInDataStoreVO; import org.apache.cloudstack.storage.volume.db.VolumeDao2; import org.apache.cloudstack.storage.volume.db.VolumeVO; import org.apache.log4j.Logger; @@ -43,14 +45,15 @@ public class VolumeObject implements VolumeInfo { VolumeDao2 volumeDao; @Inject VolumeManager volumeMgr; + @Inject + ObjectInDataStoreManager ojbectInStoreMgr; private VolumeObject(DataStore dataStore, VolumeVO volumeVO) { this.volumeVO = volumeVO; this.dataStore = dataStore; } - public static VolumeObject getVolumeObject(DataStore dataStore, - VolumeVO volumeVO) { + public static VolumeObject getVolumeObject(DataStore dataStore, VolumeVO volumeVO) { VolumeObject vo = new VolumeObject(dataStore, volumeVO); vo = ComponentContext.inject(vo); return vo; @@ -87,11 +90,9 @@ public class VolumeObject implements VolumeInfo { boolean result = false; _volStateMachine = volumeMgr.getStateMachine(); try { - result = _volStateMachine.transitTo(volumeVO, event, null, - volumeDao); + result = _volStateMachine.transitTo(volumeVO, event, null, volumeDao); } catch (NoTransitionException e) { - String errorMessage = "Failed to transit volume: " - + this.getVolumeId() + ", due to: " + e.toString(); + String errorMessage = "Failed to transit volume: " + this.getVolumeId() + ", due to: " + e.toString(); s_logger.debug(errorMessage); throw new CloudRuntimeException(errorMessage); } @@ -115,8 +116,15 @@ public class VolumeObject implements VolumeInfo { @Override public String getUri() { - return this.dataStore.getUri() + File.separator + "?type=volume&path=" - + this.volumeVO.getPath(); + if (this.dataStore == null) { + throw new CloudRuntimeException("datastore must be set before using this object"); + } + ObjectInDataStoreVO obj = ojbectInStoreMgr.findObject(this.volumeVO.getId(), DataObjectType.VOLUME, this.dataStore.getId(), this.dataStore.getRole()); + if (obj.getState() != ObjectInDataStoreStateMachine.State.Ready) { + return this.dataStore.getUri() + File.separator + "&objType=" + DataObjectType.VOLUME + "&size=" + this.volumeVO.getSize(); + } else { + return this.dataStore.getUri() + File.separator + "&objType=" + DataObjectType.VOLUME + "&path=" + obj.getInstallPath(); + } } @Override diff --git a/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/driver/SolidfirePrimaryDataStoreDriver.java b/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/driver/SolidfirePrimaryDataStoreDriver.java index b1b316889ca..3244c7aa4ed 100644 --- a/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/driver/SolidfirePrimaryDataStoreDriver.java +++ b/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/driver/SolidfirePrimaryDataStoreDriver.java @@ -18,10 +18,12 @@ package org.apache.cloudstack.storage.datastore.driver; import java.util.Set; +import org.apache.cloudstack.engine.subsystem.api.storage.CommandResult; import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult; import org.apache.cloudstack.engine.subsystem.api.storage.CreateCmdResult; -import org.apache.cloudstack.engine.subsystem.api.storage.DataStream; +import org.apache.cloudstack.engine.subsystem.api.storage.DataObject; import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; +import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint; import org.apache.cloudstack.framework.async.AsyncCompletionCallback; import org.apache.cloudstack.storage.snapshot.SnapshotInfo; import org.apache.cloudstack.storage.volume.PrimaryDataStoreDriver; @@ -29,70 +31,58 @@ import org.apache.cloudstack.storage.volume.PrimaryDataStoreDriver; public class SolidfirePrimaryDataStoreDriver implements PrimaryDataStoreDriver { @Override - public String grantAccess(DataStream data, - org.apache.cloudstack.engine.subsystem.api.storage.EndPoint ep) { + public String grantAccess(DataObject data, EndPoint ep) { // TODO Auto-generated method stub return null; } @Override - public boolean revokeAccess(DataStream data, - org.apache.cloudstack.engine.subsystem.api.storage.EndPoint ep) { + public boolean revokeAccess(DataObject data, EndPoint ep) { // TODO Auto-generated method stub return false; } @Override - public Set listObjects(DataStore store) { + public Set listObjects(DataStore store) { // TODO Auto-generated method stub return null; } @Override - public void createAsync(DataStream data, - AsyncCompletionCallback callback) { + public void createAsync(DataObject data, AsyncCompletionCallback callback) { // TODO Auto-generated method stub } @Override - public void deleteAsync( - DataStream data, - AsyncCompletionCallback callback) { + public void deleteAsync(DataObject data, AsyncCompletionCallback callback) { // TODO Auto-generated method stub } @Override - public void copyAsync(DataStream srcdata, DataStream destData, - AsyncCompletionCallback callback) { + public void copyAsync(DataObject srcdata, DataObject destData, AsyncCompletionCallback callback) { // TODO Auto-generated method stub } @Override - public boolean canCopy(DataStream srcData, DataStream destData) { + public boolean canCopy(DataObject srcData, DataObject destData) { // TODO Auto-generated method stub return false; } @Override - public void takeSnapshot( - SnapshotInfo snapshot, - AsyncCompletionCallback callback) { + public void takeSnapshot(SnapshotInfo snapshot, AsyncCompletionCallback callback) { // TODO Auto-generated method stub } @Override - public void revertSnapshot( - SnapshotInfo snapshot, - AsyncCompletionCallback callback) { + public void revertSnapshot(SnapshotInfo snapshot, AsyncCompletionCallback callback) { // TODO Auto-generated method stub } - - }