implement toURI

This commit is contained in:
Edison Su 2013-01-17 18:49:34 -08:00
parent c4a11b9979
commit ddc53771bf
8 changed files with 80 additions and 59 deletions

View File

@ -45,7 +45,7 @@ public class ImageDataFactoryImpl implements ImageDataFactory {
return null; return null;
} }
ImageDataVO templ = imageDataDao.findById(templateId); ImageDataVO templ = imageDataDao.findById(templateId);
TemplateObject tmpl = new TemplateObject(templ, store); TemplateObject tmpl = TemplateObject.getTemplate(templ, store);
return tmpl; return tmpl;
} }
} }

View File

@ -23,16 +23,15 @@ import java.util.Map;
import javax.inject.Inject; 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.DataStoreProviderManager;
import org.apache.cloudstack.storage.datastore.provider.ImageDataStoreProvider;
import org.apache.cloudstack.storage.image.ImageDataStoreDriver; import org.apache.cloudstack.storage.image.ImageDataStoreDriver;
import org.apache.cloudstack.storage.image.datastore.ImageDataStore; import org.apache.cloudstack.storage.image.datastore.ImageDataStore;
import org.apache.cloudstack.storage.image.datastore.ImageDataStoreManager; import org.apache.cloudstack.storage.image.datastore.ImageDataStoreManager;
import org.apache.cloudstack.storage.image.db.ImageDataDao; import org.apache.cloudstack.storage.image.db.ImageDataDao;
import org.apache.cloudstack.storage.image.db.ImageDataStoreDao; import org.apache.cloudstack.storage.image.db.ImageDataStoreDao;
import org.apache.cloudstack.storage.image.db.ImageDataStoreVO; import org.apache.cloudstack.storage.image.db.ImageDataStoreVO;
import org.apache.cloudstack.storage.image.store.ImageDataStoreImpl; import org.apache.cloudstack.storage.image.store.HttpDataStoreImpl;
import org.apache.cloudstack.storage.volume.PrimaryDataStoreDriver;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@Component @Component
@ -49,9 +48,9 @@ public class ImageDataStoreManagerImpl implements ImageDataStoreManager {
public ImageDataStore getImageDataStore(long dataStoreId) { public ImageDataStore getImageDataStore(long dataStoreId) {
ImageDataStoreVO dataStore = dataStoreDao.findById(dataStoreId); ImageDataStoreVO dataStore = dataStoreDao.findById(dataStoreId);
long providerId = dataStore.getProvider(); long providerId = dataStore.getProvider();
DataStoreProvider provider = providerManager.getDataStoreProviderById(providerId); ImageDataStoreProvider provider = (ImageDataStoreProvider)providerManager.getDataStoreProviderById(providerId);
ImageDataStore imgStore = new ImageDataStoreImpl(dataStore, ImageDataStore imgStore = HttpDataStoreImpl.getDataStore(dataStore,
driverMaps.get(provider.getUuid()) driverMaps.get(provider.getUuid()), provider
); );
// TODO Auto-generated method stub // TODO Auto-generated method stub
return imgStore; return imgStore;

View File

@ -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.DataObject;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreDriver; 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.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.Scope;
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo; import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope; 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.ImageDataStoreDriver;
import org.apache.cloudstack.storage.image.TemplateInfo; import org.apache.cloudstack.storage.image.TemplateInfo;
import org.apache.cloudstack.storage.image.datastore.ImageDataStore; import org.apache.cloudstack.storage.image.datastore.ImageDataStore;
import org.apache.cloudstack.storage.image.db.ImageDataDao; import org.apache.cloudstack.storage.image.db.ImageDataDao;
import org.apache.cloudstack.storage.image.db.ImageDataStoreVO; import org.apache.cloudstack.storage.image.db.ImageDataStoreVO;
import org.apache.cloudstack.storage.image.db.ImageDataVO;
import org.apache.cloudstack.storage.snapshot.SnapshotInfo; import org.apache.cloudstack.storage.snapshot.SnapshotInfo;
import com.cloud.utils.component.ComponentContext;
public class ImageDataStoreImpl implements ImageDataStore {
public class HttpDataStoreImpl implements ImageDataStore {
@Inject @Inject
ImageDataDao imageDao; ImageDataDao imageDao;
@Inject
private ObjectInDataStoreManager objectInStoreMgr;
ImageDataStoreDriver driver; ImageDataStoreDriver driver;
ImageDataStoreVO imageDataStoreVO; ImageDataStoreVO imageDataStoreVO;
ImageDataStoreProvider provider;
boolean needDownloadToCacheStorage = false; boolean needDownloadToCacheStorage = false;
public ImageDataStoreImpl(ImageDataStoreVO dataStoreVO, ImageDataStoreDriver imageDataStoreDriver) { private HttpDataStoreImpl(ImageDataStoreVO dataStoreVO, ImageDataStoreDriver imageDataStoreDriver,
ImageDataStoreProvider provider) {
this.driver = imageDataStoreDriver; this.driver = imageDataStoreDriver;
this.imageDataStoreVO = dataStoreVO; 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 @Override
public Set<TemplateInfo> listTemplates() { public Set<TemplateInfo> listTemplates() {
@ -58,12 +69,10 @@ public class ImageDataStoreImpl implements ImageDataStore {
return null; return null;
} }
@Override @Override
public DataStoreDriver getDriver() { public DataStoreDriver getDriver() {
// TODO Auto-generated method stub // TODO Auto-generated method stub
return null; return this.driver;
} }
@ -71,7 +80,7 @@ public class ImageDataStoreImpl implements ImageDataStore {
@Override @Override
public DataStoreRole getRole() { public DataStoreRole getRole() {
// TODO Auto-generated method stub // TODO Auto-generated method stub
return null; return DataStoreRole.Image;
} }
@ -79,15 +88,14 @@ public class ImageDataStoreImpl implements ImageDataStore {
@Override @Override
public long getId() { public long getId() {
// TODO Auto-generated method stub // TODO Auto-generated method stub
return 0; return this.imageDataStoreVO.getId();
} }
@Override @Override
public String getUri() { public String getUri() {
// TODO Auto-generated method stub return this.imageDataStoreVO.getProtocol() + "://" + "?role=" + this.getRole();
return null;
} }
@ -95,7 +103,7 @@ public class ImageDataStoreImpl implements ImageDataStore {
@Override @Override
public Scope getScope() { public Scope getScope() {
// TODO Auto-generated method stub // TODO Auto-generated method stub
return null; return new ZoneScope(imageDataStoreVO.getDcId());
} }
@ -126,7 +134,7 @@ public class ImageDataStoreImpl implements ImageDataStore {
@Override @Override
public boolean exists(DataObject object) { public boolean exists(DataObject object) {
// TODO Auto-generated method stub return (objectInStoreMgr.findObject(object.getId(), object.getType(),
return false; this.getId(), this.getRole()) != null) ? true : false;
} }
} }

View File

@ -18,16 +18,21 @@
*/ */
package org.apache.cloudstack.storage.image.store; package org.apache.cloudstack.storage.image.store;
import java.io.File;
import javax.inject.Inject; import javax.inject.Inject;
import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectType; 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.DataStore;
import org.apache.cloudstack.engine.subsystem.api.storage.disktype.DiskFormat; 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.TemplateEvent;
import org.apache.cloudstack.storage.image.TemplateInfo; import org.apache.cloudstack.storage.image.TemplateInfo;
import org.apache.cloudstack.storage.image.db.ImageDataDao; import org.apache.cloudstack.storage.image.db.ImageDataDao;
import org.apache.cloudstack.storage.image.db.ImageDataVO; import org.apache.cloudstack.storage.image.db.ImageDataVO;
import org.apache.cloudstack.storage.image.manager.ImageDataManager; import org.apache.cloudstack.storage.image.manager.ImageDataManager;
import org.apache.cloudstack.storage.volume.ObjectInDataStoreStateMachine;
import org.apache.log4j.Logger; import org.apache.log4j.Logger;
import com.cloud.utils.component.ComponentContext; import com.cloud.utils.component.ComponentContext;
@ -41,8 +46,10 @@ public class TemplateObject implements TemplateInfo {
ImageDataManager imageMgr; ImageDataManager imageMgr;
@Inject @Inject
ImageDataDao imageDao; ImageDataDao imageDao;
@Inject
ObjectInDataStoreManager ojbectInStoreMgr;
public TemplateObject(ImageDataVO template, DataStore dataStore) { private TemplateObject(ImageDataVO template, DataStore dataStore) {
this.imageVO = template; this.imageVO = template;
this.dataStore = dataStore; this.dataStore = dataStore;
} }
@ -78,7 +85,16 @@ public class TemplateObject implements TemplateInfo {
@Override @Override
public String getUri() { 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 @Override

View File

@ -54,6 +54,7 @@ public class DefaultPrimaryDataStore implements PrimaryDataStore {
protected PrimaryDataStoreDriver driver; protected PrimaryDataStoreDriver driver;
protected PrimaryDataStoreVO pdsv; protected PrimaryDataStoreVO pdsv;
protected PrimaryDataStoreLifeCycle lifeCycle; protected PrimaryDataStoreLifeCycle lifeCycle;
@Inject
private ObjectInDataStoreManager objectInStoreMgr; private ObjectInDataStoreManager objectInStoreMgr;
@Inject @Inject
ImageDataFactory imageDataFactory; ImageDataFactory imageDataFactory;
@ -118,8 +119,8 @@ public class DefaultPrimaryDataStore implements PrimaryDataStore {
public String getUri() { public String getUri() {
return this.pdsv.getPoolType() + File.separator return this.pdsv.getPoolType() + File.separator
+ this.pdsv.getHostAddress() + File.separator + this.pdsv.getHostAddress() + File.separator
+ this.pdsv.getPath(); + this.pdsv.getPath() + File.separator
+ "?role=" + this.getRole();
} }
@Override @Override

View File

@ -167,9 +167,8 @@ public class DefaultPrimaryDataStoreDriverImpl implements PrimaryDataStoreDriver
} }
@Override @Override
public String grantAccess(DataObject vol, EndPoint ep) { public String grantAccess(DataObject object, EndPoint ep) {
// TODO Auto-generated method stub return object.getUri();
return null;
} }
@Override @Override

View File

@ -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.DataStore;
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo; import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
import org.apache.cloudstack.engine.subsystem.api.storage.disktype.DiskFormat; 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.VolumeDao2;
import org.apache.cloudstack.storage.volume.db.VolumeVO; import org.apache.cloudstack.storage.volume.db.VolumeVO;
import org.apache.log4j.Logger; import org.apache.log4j.Logger;
@ -43,14 +45,15 @@ public class VolumeObject implements VolumeInfo {
VolumeDao2 volumeDao; VolumeDao2 volumeDao;
@Inject @Inject
VolumeManager volumeMgr; VolumeManager volumeMgr;
@Inject
ObjectInDataStoreManager ojbectInStoreMgr;
private VolumeObject(DataStore dataStore, VolumeVO volumeVO) { private VolumeObject(DataStore dataStore, VolumeVO volumeVO) {
this.volumeVO = volumeVO; this.volumeVO = volumeVO;
this.dataStore = dataStore; this.dataStore = dataStore;
} }
public static VolumeObject getVolumeObject(DataStore dataStore, public static VolumeObject getVolumeObject(DataStore dataStore, VolumeVO volumeVO) {
VolumeVO volumeVO) {
VolumeObject vo = new VolumeObject(dataStore, volumeVO); VolumeObject vo = new VolumeObject(dataStore, volumeVO);
vo = ComponentContext.inject(vo); vo = ComponentContext.inject(vo);
return vo; return vo;
@ -87,11 +90,9 @@ public class VolumeObject implements VolumeInfo {
boolean result = false; boolean result = false;
_volStateMachine = volumeMgr.getStateMachine(); _volStateMachine = volumeMgr.getStateMachine();
try { try {
result = _volStateMachine.transitTo(volumeVO, event, null, result = _volStateMachine.transitTo(volumeVO, event, null, volumeDao);
volumeDao);
} catch (NoTransitionException e) { } catch (NoTransitionException e) {
String errorMessage = "Failed to transit volume: " String errorMessage = "Failed to transit volume: " + this.getVolumeId() + ", due to: " + e.toString();
+ this.getVolumeId() + ", due to: " + e.toString();
s_logger.debug(errorMessage); s_logger.debug(errorMessage);
throw new CloudRuntimeException(errorMessage); throw new CloudRuntimeException(errorMessage);
} }
@ -115,8 +116,15 @@ public class VolumeObject implements VolumeInfo {
@Override @Override
public String getUri() { public String getUri() {
return this.dataStore.getUri() + File.separator + "?type=volume&path=" if (this.dataStore == null) {
+ this.volumeVO.getPath(); 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 @Override

View File

@ -18,10 +18,12 @@ package org.apache.cloudstack.storage.datastore.driver;
import java.util.Set; 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.CopyCommandResult;
import org.apache.cloudstack.engine.subsystem.api.storage.CreateCmdResult; 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.DataStore;
import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint;
import org.apache.cloudstack.framework.async.AsyncCompletionCallback; import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
import org.apache.cloudstack.storage.snapshot.SnapshotInfo; import org.apache.cloudstack.storage.snapshot.SnapshotInfo;
import org.apache.cloudstack.storage.volume.PrimaryDataStoreDriver; import org.apache.cloudstack.storage.volume.PrimaryDataStoreDriver;
@ -29,70 +31,58 @@ import org.apache.cloudstack.storage.volume.PrimaryDataStoreDriver;
public class SolidfirePrimaryDataStoreDriver implements PrimaryDataStoreDriver { public class SolidfirePrimaryDataStoreDriver implements PrimaryDataStoreDriver {
@Override @Override
public String grantAccess(DataStream data, public String grantAccess(DataObject data, EndPoint ep) {
org.apache.cloudstack.engine.subsystem.api.storage.EndPoint ep) {
// TODO Auto-generated method stub // TODO Auto-generated method stub
return null; return null;
} }
@Override @Override
public boolean revokeAccess(DataStream data, public boolean revokeAccess(DataObject data, EndPoint ep) {
org.apache.cloudstack.engine.subsystem.api.storage.EndPoint ep) {
// TODO Auto-generated method stub // TODO Auto-generated method stub
return false; return false;
} }
@Override @Override
public Set<DataStream> listObjects(DataStore store) { public Set<DataObject> listObjects(DataStore store) {
// TODO Auto-generated method stub // TODO Auto-generated method stub
return null; return null;
} }
@Override @Override
public void createAsync(DataStream data, public void createAsync(DataObject data, AsyncCompletionCallback<CreateCmdResult> callback) {
AsyncCompletionCallback<CreateCmdResult> callback) {
// TODO Auto-generated method stub // TODO Auto-generated method stub
} }
@Override @Override
public void deleteAsync( public void deleteAsync(DataObject data, AsyncCompletionCallback<CommandResult> callback) {
DataStream data,
AsyncCompletionCallback<org.apache.cloudstack.engine.subsystem.api.storage.CommandResult> callback) {
// TODO Auto-generated method stub // TODO Auto-generated method stub
} }
@Override @Override
public void copyAsync(DataStream srcdata, DataStream destData, public void copyAsync(DataObject srcdata, DataObject destData, AsyncCompletionCallback<CopyCommandResult> callback) {
AsyncCompletionCallback<CopyCommandResult> callback) {
// TODO Auto-generated method stub // TODO Auto-generated method stub
} }
@Override @Override
public boolean canCopy(DataStream srcData, DataStream destData) { public boolean canCopy(DataObject srcData, DataObject destData) {
// TODO Auto-generated method stub // TODO Auto-generated method stub
return false; return false;
} }
@Override @Override
public void takeSnapshot( public void takeSnapshot(SnapshotInfo snapshot, AsyncCompletionCallback<CommandResult> callback) {
SnapshotInfo snapshot,
AsyncCompletionCallback<org.apache.cloudstack.engine.subsystem.api.storage.CommandResult> callback) {
// TODO Auto-generated method stub // TODO Auto-generated method stub
} }
@Override @Override
public void revertSnapshot( public void revertSnapshot(SnapshotInfo snapshot, AsyncCompletionCallback<CommandResult> callback) {
SnapshotInfo snapshot,
AsyncCompletionCallback<org.apache.cloudstack.engine.subsystem.api.storage.CommandResult> callback) {
// TODO Auto-generated method stub // TODO Auto-generated method stub
} }
} }