refactor apis

This commit is contained in:
Edison Su 2012-11-13 16:34:44 -08:00
parent 2251d5bb40
commit a06eb4557e
34 changed files with 849 additions and 294 deletions

View File

@ -18,12 +18,12 @@
*/
package org.apache.cloudstack.engine.cloud.entity.api;
import org.apache.cloudstack.engine.datacenter.entity.api.StorageEntity;
import org.apache.cloudstack.engine.entity.api.CloudStackEntity;
import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStore;
import org.apache.cloudstack.engine.subsystem.api.storage.disktype.VolumeDiskType;
import org.apache.cloudstack.engine.subsystem.api.storage.type.VolumeType;
import org.apache.cloudstack.storage.datastore.PrimaryDataStore;
import com.cloud.storage.Volume;
public interface VolumeEntity extends CloudStackEntity {
@ -81,6 +81,6 @@ public interface VolumeEntity extends CloudStackEntity {
String getTemplateUuid();
VolumeDiskType getDiskType();
VolumeType getType();
PrimaryDataStore getDataStore();
void setUuid(String uuid);
StorageEntity getDataStore();
void setPath(String path);
}

View File

@ -16,7 +16,9 @@
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.cloudstack.storage.image;
package org.apache.cloudstack.engine.subsystem.api.storage;
import org.apache.cloudstack.engine.cloud.entity.api.TemplateEntity;
public interface ImageService {
boolean registerTemplate(long templateId, long imageStoreId);
@ -27,4 +29,5 @@ public interface ImageService {
boolean revokeTemplateAccess(long templateId, long endpointId);
String grantIsoAccess(long isoId, long endpointId);
boolean revokeIsoAccess(long isoId, long endpointId);
TemplateEntity getTemplateEntity(long templateId);
}

View File

@ -0,0 +1,9 @@
package org.apache.cloudstack.engine.subsystem.api.storage;
import org.apache.cloudstack.storage.datastore.PrimaryDataStore;
public interface PrimaryDataStoreProvider {
public PrimaryDataStore getDataStore(long dataStoreId);
public PrimaryDataStoreInfo getDataStoreInfo(long dataStoreId);
}

View File

@ -16,10 +16,15 @@
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.cloudstack.storage;
package org.apache.cloudstack.engine.subsystem.api.storage;
import java.util.List;
import org.apache.cloudstack.engine.cloud.entity.api.TemplateEntity;
import org.apache.cloudstack.engine.cloud.entity.api.VolumeEntity;
import org.apache.cloudstack.engine.subsystem.api.storage.disktype.VolumeDiskType;
import org.apache.cloudstack.engine.subsystem.api.storage.type.VolumeType;
import com.cloud.deploy.DeploymentPlan;
public interface StorageOrchestrator {
@ -56,4 +61,8 @@ public interface StorageOrchestrator {
* If attaching a volume in allocated state to a running vm, need to create this volume
*/
void prepareAttachDiskToVM(long diskId, long vmId, String reservationId);
boolean createVolume(VolumeEntity volume, long dataStoreId, VolumeDiskType diskType);
boolean createVolumeFromTemplate(VolumeEntity volume, long dataStoreId, VolumeDiskType dis, TemplateEntity template);
VolumeEntity allocateVolumeInDb(long size, VolumeType type,String volName, Long templateId);
}

View File

@ -0,0 +1,42 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.cloudstack.engine.subsystem.api.storage;
import java.util.Date;
import org.apache.cloudstack.engine.subsystem.api.storage.disktype.VolumeDiskType;
import org.apache.cloudstack.engine.subsystem.api.storage.type.VolumeType;
import com.cloud.storage.Volume;
public interface VolumeInfo {
public long getSize();
public String getUuid();
public String getPath();
public PrimaryDataStoreInfo getDataStore() ;
public String getTemplateUuid();
public String getTemplatePath() ;
public VolumeType getType();
public VolumeDiskType getDiskType();
public long getId();
public Volume.State getCurrentState();
public Volume.State getDesiredState();
public Date getCreatedData();
}

View File

@ -25,10 +25,10 @@ import org.apache.cloudstack.engine.subsystem.api.storage.disktype.VolumeDiskTyp
public interface PrimaryDataStore {
VolumeEntity getVolume(long id);
VolumeEntity getVolume(String id);
List<VolumeEntity> getVolumes();
boolean deleteVolume(long id);
VolumeEntity createVolume(long id, VolumeDiskType diskType);
boolean deleteVolume(VolumeEntity id);
VolumeEntity createVolume(String id, VolumeDiskType diskType);
List<EndPoint> getEndPoints();
PrimaryDataStoreInfo getDataStoreInfo();
}

View File

@ -21,16 +21,27 @@ package org.apache.cloudstack.storage;
import java.util.ArrayList;
import java.util.List;
import org.apache.cloudstack.engine.cloud.entity.api.TemplateEntity;
import org.apache.cloudstack.engine.cloud.entity.api.VolumeEntity;
import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectBackupStorageOperationState;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
import org.apache.cloudstack.engine.subsystem.api.storage.StorageOrchestrator;
import org.apache.cloudstack.engine.subsystem.api.storage.StorageProvider;
import org.apache.cloudstack.engine.subsystem.api.storage.TemplateProfile;
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeProfile;
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeStrategy;
import org.apache.cloudstack.engine.subsystem.api.storage.disktype.VolumeDiskType;
import org.apache.cloudstack.engine.subsystem.api.storage.type.VolumeType;
import org.apache.cloudstack.storage.datastore.PrimaryDataStore;
import org.apache.cloudstack.storage.datastore.manager.PrimaryDataStoreManager;
import org.apache.cloudstack.storage.image.ImageManager;
import org.apache.cloudstack.storage.manager.BackupStorageManager;
import org.apache.cloudstack.storage.manager.SecondaryStorageManager;
import org.apache.cloudstack.storage.volume.VolumeEntityImpl;
import org.apache.cloudstack.storage.volume.VolumeManager;
import org.apache.cloudstack.storage.volume.VolumeObject;
import org.apache.cloudstack.storage.volume.VolumeService;
import org.apache.log4j.Logger;
import com.cloud.deploy.DeploymentPlan;
@ -78,6 +89,10 @@ public class StorageOrchestratorImpl implements StorageOrchestrator {
ImageManager _templateMgr;
@Inject
VMTemplateDao _templateDao;
@Inject
VolumeService volumeService;
@Inject
PrimaryDataStoreManager primaryStorageMgr;
@DB
protected Volume copyVolumeFromBackupStorage(VolumeVO volume, DataStore destStore, String reservationId) throws NoTransitionException {
@ -312,4 +327,29 @@ public class StorageOrchestratorImpl implements StorageOrchestrator {
volume.setInstanceId(vmId);
_volumeDao.update(volume.getId(), volume);
}
@Override
public boolean createVolume(VolumeEntity volume, long dataStoreId, VolumeDiskType diskType) {
VolumeEntityImpl vei = ((VolumeEntityImpl)volume);
VolumeInfo vi = volumeService.createVolume(vei.getVolumeInfo(), dataStoreId, diskType);
vei.setVolumeInfo(vi);
return true;
}
@Override
public VolumeEntity allocateVolumeInDb(long size, VolumeType type, String volName, Long templateId) {
return volumeService.allocateVolumeInDb(size, type, volName, templateId);
}
@Override
public boolean createVolumeFromTemplate(VolumeEntity volume, long dataStoreId, VolumeDiskType diskType, TemplateEntity template) {
PrimaryDataStore pd = primaryStorageMgr.getPrimaryDataStore(dataStoreId);
boolean existsOnPrimaryStorage = pd.templateExists(template.getId());
if (!existsOnPrimaryStorage) {
}
return false;
}
}

View File

@ -18,7 +18,7 @@
*/
package org.apache.cloudstack.storage.command;
import org.apache.cloudstack.storage.volume.VolumeInfo;
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
import com.cloud.agent.api.Command;

View File

@ -8,8 +8,8 @@ import javax.inject.Inject;
import org.apache.cloudstack.engine.cloud.entity.api.VolumeEntity;
import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint;
import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStore;
import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreInfo;
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
import org.apache.cloudstack.engine.subsystem.api.storage.disktype.VolumeDiskType;
import org.apache.cloudstack.storage.HypervisorHostEndPoint;
import org.apache.cloudstack.storage.datastore.db.DataStoreVO;
@ -17,6 +17,7 @@ import org.apache.cloudstack.storage.datastore.driver.PrimaryDataStoreDriver;
import org.apache.cloudstack.storage.volume.VolumeEntityImpl;
import org.apache.cloudstack.storage.volume.VolumeEvent;
import org.apache.cloudstack.storage.volume.VolumeObject;
import org.apache.cloudstack.storage.volume.db.VolumeDao;
import org.apache.cloudstack.storage.volume.db.VolumeVO;
@ -24,6 +25,7 @@ import org.apache.log4j.Logger;
import com.cloud.host.HostVO;
import com.cloud.host.dao.HostDao;
import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.utils.component.ComponentInject;
import com.cloud.utils.exception.CloudRuntimeException;
@ -45,14 +47,14 @@ public class DefaultPrimaryDataStoreImpl implements PrimaryDataStore {
}
@Override
public VolumeEntity getVolume(long id) {
public VolumeInfo getVolume(long id) {
VolumeVO volumeVO = volumeDao.findById(id);
VolumeEntity vol = new VolumeEntityImpl(this, volumeVO);
VolumeObject vol = new VolumeObject(this, volumeVO);
return vol;
}
@Override
public List<VolumeEntity> getVolumes() {
public List<VolumeInfo> getVolumes() {
// TODO Auto-generated method stub
return null;
}
@ -64,39 +66,10 @@ public class DefaultPrimaryDataStoreImpl implements PrimaryDataStore {
}
@Override
public VolumeEntity createVolume(long id, VolumeDiskType diskType) {
/*
VolumeEntity vol = this.getVolume(id);
if (vol == null) {
return null;
}
public VolumeInfo createVolume(VolumeInfo vol, VolumeDiskType diskType) {
if (!pdsInfo.isVolumeDiskTypeSupported(diskType)) {
return null;
}
boolean result = vol.stateTransit(VolumeEvent.CreateRequested);
if (!result) {
return null;
}
try {
vol.setVolumeDiskType(diskType);
result = this.driver.createVolume(vol);
vol.update();
return vol;
} catch (Exception e) {
result = false;
s_logger.debug("Failed to create volume: " + e.toString());
throw new CloudRuntimeException(e.toString());
} finally {
if (result == true) {
vol.stateTransit(VolumeEvent.OperationSucceeded);
} else {
vol.stateTransit(VolumeEvent.OperationFailed);
}
}*/
return null;
}
@Override
@ -121,4 +94,51 @@ public class DefaultPrimaryDataStoreImpl implements PrimaryDataStore {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean isHypervisorSupported(HypervisorType hypervisor) {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean isLocalStorageSupported() {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean isVolumeDiskTypeSupported(VolumeDiskType diskType) {
// TODO Auto-generated method stub
return false;
}
@Override
public long getCapacity() {
// TODO Auto-generated method stub
return 0;
}
@Override
public long getAvailableCapacity() {
// TODO Auto-generated method stub
return 0;
}
@Override
public VolumeObject createVolume(VolumeObject vo, VolumeDiskType diskType) {
if (!pdsInfo.isVolumeDiskTypeSupported(diskType)) {
return null;
}
vo.setVolumeDiskType(diskType);
this.driver.createVolume(vo);
return vo;
}
@Override
public boolean exists(VolumeInfo vi) {
// TODO Auto-generated method stub
return false;
}
}

View File

@ -0,0 +1,40 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.cloudstack.storage.datastore;
import java.util.List;
import org.apache.cloudstack.engine.cloud.entity.api.VolumeEntity;
import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint;
import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreInfo;
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
import org.apache.cloudstack.engine.subsystem.api.storage.disktype.VolumeDiskType;
import org.apache.cloudstack.storage.volume.VolumeObject;
public interface PrimaryDataStore extends PrimaryDataStoreInfo {
VolumeInfo getVolume(long id);
List<VolumeInfo> getVolumes();
boolean deleteVolume(long id);
VolumeObject createVolume(VolumeObject vo, VolumeDiskType diskType);
List<EndPoint> getEndPoints();
PrimaryDataStoreInfo getDataStoreInfo();
boolean exists(VolumeInfo vi);
boolean templateExists(long templateId);
}

View File

@ -4,9 +4,10 @@ import java.util.List;
import org.apache.cloudstack.engine.cloud.entity.api.VolumeEntity;
import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint;
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
import org.apache.cloudstack.storage.command.CreateVolumeAnswer;
import org.apache.cloudstack.storage.command.CreateVolumeCommand;
import org.apache.cloudstack.storage.volume.VolumeInfo;
import org.apache.cloudstack.storage.volume.VolumeObject;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;
@ -17,11 +18,11 @@ public class DefaultPrimaryDataStoreDriverImpl implements
PrimaryDataStoreDriver {
private static final Logger s_logger = Logger.getLogger(DefaultPrimaryDataStoreDriverImpl.class);
@Override
public boolean createVolume(VolumeEntity vol) {
public boolean createVolume(VolumeObject vol) {
//The default driver will send createvolume command to one of hosts which can access its datastore
List<EndPoint> endPoints = vol.getDataStore().getEndPoints();
int retries = 3;
VolumeInfo volInfo = new VolumeInfo(vol);
VolumeInfo volInfo = vol;
CreateVolumeCommand createCmd = new CreateVolumeCommand(volInfo);
Answer answer = null;
int i = 0;
@ -36,7 +37,7 @@ public class DefaultPrimaryDataStoreDriverImpl implements
i++;
} else {
CreateVolumeAnswer volAnswer = (CreateVolumeAnswer)answer;
vol.setUuid(volAnswer.getVolumeUuid());
vol.setPath(volAnswer.getVolumeUuid());
result = true;
}
}
@ -45,19 +46,19 @@ public class DefaultPrimaryDataStoreDriverImpl implements
}
@Override
public boolean deleteVolume(VolumeEntity vo) {
public boolean deleteVolume(VolumeObject vo) {
// TODO Auto-generated method stub
return false;
}
@Override
public String grantAccess(VolumeEntity vol, EndPoint ep) {
public String grantAccess(VolumeObject vol, EndPoint ep) {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean revokeAccess(VolumeEntity vol, EndPoint ep) {
public boolean revokeAccess(VolumeObject vol, EndPoint ep) {
// TODO Auto-generated method stub
return false;
}

View File

@ -2,11 +2,12 @@ package org.apache.cloudstack.storage.datastore.driver;
import org.apache.cloudstack.engine.cloud.entity.api.VolumeEntity;
import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint;
import org.apache.cloudstack.storage.volume.VolumeObject;
public interface PrimaryDataStoreDriver {
boolean createVolume(VolumeEntity vol);
boolean deleteVolume(VolumeEntity vo);
String grantAccess(VolumeEntity vol, EndPoint ep);
boolean revokeAccess(VolumeEntity vol, EndPoint ep);
boolean createVolume(VolumeObject vol);
boolean deleteVolume(VolumeObject vo);
String grantAccess(VolumeObject vol, EndPoint ep);
boolean revokeAccess(VolumeObject vol, EndPoint ep);
}

View File

@ -20,12 +20,12 @@ package org.apache.cloudstack.storage.datastore.manager;
import javax.inject.Inject;
import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStore;
import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreProvider;
import org.apache.cloudstack.storage.datastore.PrimaryDataStore;
import org.apache.cloudstack.storage.datastore.db.DataStoreVO;
import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreProviderDao;
import org.apache.cloudstack.storage.datastore.lifecycle.PrimaryDataStoreLifeCycle;
import org.apache.cloudstack.storage.datastore.provider.PrimaryDataStoreProvider;
import org.apache.cloudstack.storage.datastore.provider.PrimaryDataStoreProviderManager;
import org.springframework.stereotype.Component;

View File

@ -18,7 +18,7 @@
*/
package org.apache.cloudstack.storage.datastore.manager;
import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStore;
import org.apache.cloudstack.storage.datastore.PrimaryDataStore;
import org.apache.cloudstack.storage.datastore.lifecycle.PrimaryDataStoreLifeCycle;
public interface PrimaryDataStoreManager {

View File

@ -2,9 +2,10 @@ package org.apache.cloudstack.storage.datastore.provider;
import javax.inject.Inject;
import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStore;
import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreInfo;
import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreProvider;
import org.apache.cloudstack.storage.datastore.DefaultPrimaryDataStoreImpl;
import org.apache.cloudstack.storage.datastore.PrimaryDataStore;
import org.apache.cloudstack.storage.datastore.db.DataStoreVO;
import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
import org.apache.cloudstack.storage.datastore.driver.DefaultPrimaryDataStoreDriverImpl;

View File

@ -1,9 +0,0 @@
package org.apache.cloudstack.storage.datastore.provider;
import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStore;
import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreInfo;
public interface PrimaryDataStoreProvider {
public PrimaryDataStore getDataStore(long dataStoreId);
public PrimaryDataStoreInfo getDataStoreInfo(long dataStoreId);
}

View File

@ -1,5 +1,7 @@
package org.apache.cloudstack.storage.datastore.provider;
import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreProvider;
public interface PrimaryDataStoreProviderManager {
public PrimaryDataStoreProvider getDataStoreProvider(Long providerId);
}

View File

@ -18,6 +18,7 @@
*/
package org.apache.cloudstack.storage.datastore.provider;
import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreProvider;
import org.springframework.stereotype.Component;
@Component

View File

@ -20,6 +20,8 @@ package org.apache.cloudstack.storage.image;
import javax.inject.Inject;
import org.apache.cloudstack.engine.cloud.entity.api.TemplateEntity;
import org.apache.cloudstack.engine.subsystem.api.storage.ImageService;
import org.apache.cloudstack.storage.image.downloader.ImageDownloader;
import org.apache.cloudstack.storage.image.manager.ImageDataStoreManager;
import org.apache.cloudstack.storage.image.provider.ImageDataStoreProviderManager;
@ -29,10 +31,12 @@ public class ImageServiceImpl implements ImageService {
@Inject
ImageDataStoreProviderManager imageStoreProviderMgr;
@Inject
@Override
public boolean registerTemplate(long templateId, long imageStoreId) {
ImageDataStore ids = imageStoreProviderMgr.getDataStore(imageStoreId);
Template template = ids.registerTemplate(templateId);
TemplateInfo template = ids.registerTemplate(templateId);
if (ids.needDownloadToCacheStorage()) {
ImageDownloader imageDl = ids.getImageDownloader();
imageDl.downloadImage(template);
@ -82,4 +86,9 @@ public class ImageServiceImpl implements ImageService {
return false;
}
@Override
public TemplateEntity getTemplateEntity(long templateId) {
TemplateObject to = imageStoreProviderMgr.getTemplate(templateId);
return new TemplateEntityImpl(to);
}
}

View File

@ -0,0 +1,278 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.cloudstack.storage.image;
import java.lang.reflect.Method;
import java.util.Date;
import java.util.List;
import java.util.Map;
import org.apache.cloudstack.engine.cloud.entity.api.TemplateEntity;
import org.apache.cloudstack.storage.image.db.ImageDataVO;
import org.apache.cloudstack.storage.image.store.ImageDataStore;
import org.apache.cloudstack.storage.image.store.ImageDataStoreInfo;
import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.storage.Storage.ImageFormat;
import com.cloud.storage.Storage.TemplateType;
public class TemplateEntityImpl implements TemplateEntity {
protected TemplateInfo templateInfo;
public TemplateEntityImpl(TemplateInfo templateInfo) {
this.templateInfo = templateInfo;
}
public ImageDataStoreInfo getImageDataStore() {
return templateInfo.getImageDataStore();
}
public long getImageDataStoreId() {
return getImageDataStore().getImageDataStoreId();
}
@Override
public String getUuid() {
// TODO Auto-generated method stub
return null;
}
@Override
public long getId() {
// TODO Auto-generated method stub
return 0;
}
@Override
public String getExternalId() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getCurrentState() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getDesiredState() {
// TODO Auto-generated method stub
return null;
}
@Override
public Date getCreatedTime() {
// TODO Auto-generated method stub
return null;
}
@Override
public Date getLastUpdatedTime() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getOwner() {
// TODO Auto-generated method stub
return null;
}
@Override
public Map<String, String> getDetails(String source) {
// TODO Auto-generated method stub
return null;
}
@Override
public List<String> getDetailSources() {
// TODO Auto-generated method stub
return null;
}
@Override
public void addDetail(String source, String name, String value) {
// TODO Auto-generated method stub
}
@Override
public void delDetail(String source, String name, String value) {
// TODO Auto-generated method stub
}
@Override
public void updateDetail(String source, String name, String value) {
// TODO Auto-generated method stub
}
@Override
public List<Method> getApplicableActions() {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean isFeatured() {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean isPublicTemplate() {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean isExtractable() {
// TODO Auto-generated method stub
return false;
}
@Override
public String getName() {
// TODO Auto-generated method stub
return null;
}
@Override
public ImageFormat getFormat() {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean isRequiresHvm() {
// TODO Auto-generated method stub
return false;
}
@Override
public String getDisplayText() {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean getEnablePassword() {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean getEnableSshKey() {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean isCrossZones() {
// TODO Auto-generated method stub
return false;
}
@Override
public Date getCreated() {
// TODO Auto-generated method stub
return null;
}
@Override
public long getGuestOSId() {
// TODO Auto-generated method stub
return 0;
}
@Override
public boolean isBootable() {
// TODO Auto-generated method stub
return false;
}
@Override
public TemplateType getTemplateType() {
// TODO Auto-generated method stub
return null;
}
@Override
public HypervisorType getHypervisorType() {
// TODO Auto-generated method stub
return null;
}
@Override
public int getBits() {
// TODO Auto-generated method stub
return 0;
}
@Override
public String getUniqueName() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getUrl() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getChecksum() {
// TODO Auto-generated method stub
return null;
}
@Override
public Long getSourceTemplateId() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getTemplateTag() {
// TODO Auto-generated method stub
return null;
}
@Override
public Map getDetails() {
// TODO Auto-generated method stub
return null;
}
@Override
public long getAccountId() {
// TODO Auto-generated method stub
return 0;
}
@Override
public long getDomainId() {
// TODO Auto-generated method stub
return 0;
}
}

View File

@ -18,27 +18,8 @@
*/
package org.apache.cloudstack.storage.image;
import org.apache.cloudstack.storage.image.db.ImageDataVO;
import org.apache.cloudstack.storage.image.store.ImageDataStore;
public class Template {
protected ImageDataVO imageVO;
protected ImageDataStore dataStore;
public Template(ImageDataStore dataStore, ImageDataVO imageVO) {
this.dataStore = dataStore;
this.imageVO = imageVO;
}
public ImageDataStore getImageDataStore() {
return this.dataStore;
}
public void setImageDataStoreId(long dataStoreId) {
imageVO.setImageDataStoreId(dataStoreId);
}
public long getImageDataStoreId() {
return imageVO.getImageDataStoreId();
}
import org.apache.cloudstack.storage.image.store.ImageDataStoreInfo;
public interface TemplateInfo {
ImageDataStoreInfo getImageDataStore();
}

View File

@ -0,0 +1,23 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.cloudstack.storage.image;
public class TemplateObject implements TemplateInfo {
}

View File

@ -18,8 +18,8 @@
*/
package org.apache.cloudstack.storage.image.downloader;
import org.apache.cloudstack.storage.image.Template;
import org.apache.cloudstack.storage.image.TemplateInfo;
public interface ImageDownloader {
public void downloadImage(Template template);
public void downloadImage(TemplateInfo template);
}

View File

@ -18,10 +18,12 @@
*/
package org.apache.cloudstack.storage.image.provider;
import org.apache.cloudstack.storage.image.TemplateObject;
import org.apache.cloudstack.storage.image.store.ImageDataStore;
public interface ImageDataStoreProviderManager {
public ImageDataStoreProvider getProvider(long providerId);
public ImageDataStore getDataStore(long dataStoreId);
public ImageDataStore getDataStoreFromTemplateId(long templateId);
public TemplateObject getTemplate(long templateId);
}

View File

@ -18,11 +18,11 @@
*/
package org.apache.cloudstack.storage.image.store;
import org.apache.cloudstack.storage.image.Template;
import org.apache.cloudstack.storage.image.TemplateInfo;
import org.apache.cloudstack.storage.image.downloader.ImageDownloader;
public interface ImageDataStore {
Template registerTemplate(long templateId);
public interface ImageDataStore extends ImageDataStoreInfo {
TemplateInfo registerTemplate(long templateId);
String grantAccess(long templateId, long endPointId);
boolean revokeAccess(long templateId, long endPointId);
boolean deleteTemplate(long templateId);

View File

@ -0,0 +1,23 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.cloudstack.storage.image.store;
public interface ImageDataStoreInfo {
public long getImageDataStoreId();
}

View File

@ -21,7 +21,7 @@ package org.apache.cloudstack.storage.manager;
import java.util.List;
import java.util.Map;
import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStore;
import org.apache.cloudstack.storage.datastore.PrimaryDataStore;
import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.storage.StoragePool;

View File

@ -24,9 +24,9 @@ import java.util.Map;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreLifeCycle;
import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStore;
import org.apache.cloudstack.engine.subsystem.api.storage.StorageProvider;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore.StoreType;
import org.apache.cloudstack.storage.datastore.PrimaryDataStore;
import com.cloud.dc.ClusterVO;
import com.cloud.dc.DataCenterVO;

View File

@ -1,3 +1,21 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.cloudstack.storage.volume;
import java.lang.reflect.Method;
@ -5,113 +23,36 @@ import java.util.Date;
import java.util.List;
import java.util.Map;
import javax.inject.Inject;
import org.apache.cloudstack.engine.cloud.entity.api.SnapshotEntity;
import org.apache.cloudstack.engine.cloud.entity.api.VolumeEntity;
import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStore;
import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreInfo;
import org.apache.cloudstack.engine.datacenter.entity.api.StorageEntity;
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
import org.apache.cloudstack.engine.subsystem.api.storage.disktype.VolumeDiskType;
import org.apache.cloudstack.engine.subsystem.api.storage.disktype.VolumeDiskTypeHelper;
import org.apache.cloudstack.engine.subsystem.api.storage.type.VolumeType;
import org.apache.cloudstack.engine.subsystem.api.storage.type.VolumeTypeHelper;
import org.apache.cloudstack.storage.volume.db.VolumeDao;
import org.apache.cloudstack.storage.volume.db.VolumeVO;
import org.apache.log4j.Logger;
import com.cloud.storage.Volume;
import com.cloud.utils.fsm.NoTransitionException;
import com.cloud.utils.fsm.StateMachine2;
public class VolumeEntityImpl implements VolumeEntity {
private static final Logger s_logger = Logger.getLogger(VolumeEntityImpl.class);
protected VolumeVO volumeVO;
private StateMachine2<Volume.State, VolumeEvent, VolumeVO> _volStateMachine;
protected PrimaryDataStore dataStore;
@Inject
VolumeDiskTypeHelper diskTypeHelper;
@Inject
VolumeTypeHelper volumeTypeHelper;
@Inject
VolumeDao volumeDao;
private VolumeInfo volumeInfo;
public VolumeEntityImpl(PrimaryDataStore dataStore, VolumeVO volumeVO) {
this.volumeVO = volumeVO;
this.dataStore = dataStore;
public VolumeEntityImpl(VolumeInfo volumeObject) {
this.volumeInfo = volumeObject;
}
public VolumeInfo getVolumeInfo() {
return volumeInfo;
}
public void setVolumeInfo(VolumeInfo vi) {
this.volumeInfo = vi;
}
@Override
public String getUuid() {
return volumeVO.getUuid();
}
public void setUuid(String uuid) {
volumeVO.setUuid(uuid);
}
public String getPath() {
return volumeVO.getPath();
}
public String getTemplateUuid() {
return null;
}
public String getTemplatePath() {
return null;
}
public PrimaryDataStoreInfo getDataStoreInfo() {
return dataStore.getDataStoreInfo();
}
public Volume.State getState() {
return volumeVO.getState();
}
public PrimaryDataStore getDataStore() {
return dataStore;
}
public long getSize() {
return volumeVO.getSize();
}
public VolumeDiskType getDiskType() {
return diskTypeHelper.getDiskType(volumeVO.getDiskType());
}
public VolumeType getType() {
return volumeTypeHelper.getType(volumeVO.getVolumeType());
}
public long getVolumeId() {
return volumeVO.getId();
}
public void setVolumeDiskType(VolumeDiskType type) {
volumeVO.setDiskType(type.toString());
}
public boolean stateTransit(VolumeEvent event) {
boolean result = false;
try {
result = _volStateMachine.transitTo(volumeVO, event, null, volumeDao);
} catch (NoTransitionException e) {
s_logger.debug("Failed to transit volume: " + this.getVolumeId() + ", due to: " + e.toString());
}
return result;
}
public void update() {
volumeDao.update(volumeVO.getId(), volumeVO);
volumeVO = volumeDao.findById(volumeVO.getId());
return volumeInfo.getUuid();
}
@Override
public long getId() {
// TODO Auto-generated method stub
return 0;
return volumeInfo.getId();
}
@Override
@ -122,20 +63,17 @@ public class VolumeEntityImpl implements VolumeEntity {
@Override
public String getCurrentState() {
// TODO Auto-generated method stub
return null;
return volumeInfo.getCurrentState().toString();
}
@Override
public String getDesiredState() {
// TODO Auto-generated method stub
return null;
return volumeInfo.getDesiredState().toString();
}
@Override
public Date getCreatedTime() {
// TODO Auto-generated method stub
return null;
return volumeInfo.getCreatedData();
}
@Override
@ -165,19 +103,19 @@ public class VolumeEntityImpl implements VolumeEntity {
@Override
public void addDetail(String source, String name, String value) {
// TODO Auto-generated method stub
}
@Override
public void delDetail(String source, String name, String value) {
// TODO Auto-generated method stub
}
@Override
public void updateDetail(String source, String name, String value) {
// TODO Auto-generated method stub
}
@Override
@ -201,7 +139,7 @@ public class VolumeEntityImpl implements VolumeEntity {
@Override
public void migrate(String reservationToken) {
// TODO Auto-generated method stub
}
@Override
@ -213,24 +151,67 @@ public class VolumeEntityImpl implements VolumeEntity {
@Override
public void copy(VolumeEntity dest) {
// TODO Auto-generated method stub
}
@Override
public void attachTo(String vm, long deviceId) {
// TODO Auto-generated method stub
}
@Override
public void detachFrom() {
// TODO Auto-generated method stub
}
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public long getSize() {
// TODO Auto-generated method stub
return 0;
}
@Override
public String getTemplatePath() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getTemplateUuid() {
// TODO Auto-generated method stub
return null;
}
@Override
public VolumeDiskType getDiskType() {
// TODO Auto-generated method stub
return null;
}
@Override
public VolumeType getType() {
// TODO Auto-generated method stub
return null;
}
@Override
public StorageEntity getDataStore() {
// TODO Auto-generated method stub
return null;
}
@Override
public void setPath(String path) {
// TODO Auto-generated method stub
}
}

View File

@ -1,77 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.cloudstack.storage.volume;
import org.apache.cloudstack.engine.cloud.entity.api.VolumeEntity;
import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreInfo;
import org.apache.cloudstack.engine.subsystem.api.storage.disktype.VolumeDiskType;
import org.apache.cloudstack.engine.subsystem.api.storage.type.VolumeType;
public class VolumeInfo {
private long size;
private String uuid;
private String path;
private PrimaryDataStoreInfo dataStoreInfo;
private String baseTemplateUuid;
private String baseTemplatePath;
private VolumeType type;
private VolumeDiskType diskType;
public VolumeInfo(VolumeEntity volume) {
this.size = volume.getSize();
this.uuid = volume.getUuid();
this.baseTemplatePath = volume.getTemplatePath();
this.baseTemplateUuid = volume.getTemplateUuid();
//this.dataStoreInfo = volume.getDataStoreInfo();
this.diskType = volume.getDiskType();
this.type = volume.getType();
}
public long getSize() {
return this.size;
}
public String getUuid() {
return this.uuid;
}
public String getPath() {
return this.path;
}
public PrimaryDataStoreInfo getDataStore() {
return this.dataStoreInfo;
}
public String getTemplateUuid() {
return this.baseTemplateUuid;
}
public String getTemplatePath() {
return this.baseTemplatePath;
}
public VolumeType getType() {
return this.type;
}
public VolumeDiskType getDiskType() {
return this.diskType;
}
}

View File

@ -0,0 +1,135 @@
package org.apache.cloudstack.storage.volume;
import java.util.Date;
import javax.inject.Inject;
import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreInfo;
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
import org.apache.cloudstack.engine.subsystem.api.storage.disktype.VolumeDiskType;
import org.apache.cloudstack.engine.subsystem.api.storage.disktype.VolumeDiskTypeHelper;
import org.apache.cloudstack.engine.subsystem.api.storage.type.VolumeType;
import org.apache.cloudstack.engine.subsystem.api.storage.type.VolumeTypeHelper;
import org.apache.cloudstack.storage.datastore.PrimaryDataStore;
import org.apache.cloudstack.storage.volume.db.VolumeDao;
import org.apache.cloudstack.storage.volume.db.VolumeVO;
import org.apache.log4j.Logger;
import com.cloud.storage.Volume;
import com.cloud.storage.Volume.State;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.fsm.NoTransitionException;
import com.cloud.utils.fsm.StateMachine2;
public class VolumeObject implements VolumeInfo {
private static final Logger s_logger = Logger.getLogger(VolumeObject.class);
protected VolumeVO volumeVO;
private StateMachine2<Volume.State, VolumeEvent, VolumeVO> _volStateMachine;
protected PrimaryDataStore dataStore;
@Inject
VolumeDiskTypeHelper diskTypeHelper;
@Inject
VolumeTypeHelper volumeTypeHelper;
@Inject
VolumeDao volumeDao;
public VolumeObject(PrimaryDataStore dataStore, VolumeVO volumeVO) {
this.volumeVO = volumeVO;
this.dataStore = dataStore;
}
public String getUuid() {
return volumeVO.getUuid();
}
public void setPath(String uuid) {
volumeVO.setUuid(uuid);
}
public String getPath() {
return volumeVO.getPath();
}
public String getTemplateUuid() {
return null;
}
public String getTemplatePath() {
return null;
}
public PrimaryDataStoreInfo getDataStoreInfo() {
return dataStore.getDataStoreInfo();
}
public Volume.State getState() {
return volumeVO.getState();
}
public PrimaryDataStore getDataStore() {
return dataStore;
}
public long getSize() {
return volumeVO.getSize();
}
public VolumeDiskType getDiskType() {
return diskTypeHelper.getDiskType(volumeVO.getDiskType());
}
public VolumeType getType() {
return volumeTypeHelper.getType(volumeVO.getVolumeType());
}
public long getVolumeId() {
return volumeVO.getId();
}
public void setVolumeDiskType(VolumeDiskType type) {
volumeVO.setDiskType(type.toString());
}
public boolean stateTransit(VolumeEvent event) {
boolean result = false;
try {
result = _volStateMachine.transitTo(volumeVO, event, null, volumeDao);
} catch (NoTransitionException e) {
String errorMessage = "Failed to transit volume: " + this.getVolumeId() + ", due to: " + e.toString();
s_logger.debug(errorMessage);
throw new CloudRuntimeException(errorMessage);
}
return result;
}
public void update() {
volumeDao.update(volumeVO.getId(), volumeVO);
volumeVO = volumeDao.findById(volumeVO.getId());
}
@Override
public long getId() {
// TODO Auto-generated method stub
return 0;
}
@Override
public State getCurrentState() {
// TODO Auto-generated method stub
return null;
}
@Override
public State getDesiredState() {
// TODO Auto-generated method stub
return null;
}
@Override
public Date getCreatedData() {
// TODO Auto-generated method stub
return null;
}
}

View File

@ -16,15 +16,15 @@
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.cloudstack.engine.subsystem.api.storage;
package org.apache.cloudstack.storage.volume;
import org.apache.cloudstack.engine.cloud.entity.api.VolumeEntity;
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
import org.apache.cloudstack.engine.subsystem.api.storage.disktype.VolumeDiskType;
import org.apache.cloudstack.engine.subsystem.api.storage.type.VolumeType;
public interface VolumeService {
/**
*
*/
@ -37,7 +37,7 @@ public interface VolumeService {
*
* @return the volume object
*/
VolumeEntity createVolume(long volumeId, long dataStoreId, VolumeDiskType diskType);
VolumeInfo createVolume(VolumeInfo volume, long dataStoreId, VolumeDiskType diskType);
/**
* Delete volume
@ -66,4 +66,6 @@ public interface VolumeService {
*
*/
boolean rokeAccess(long volumeId, long endpointId);
VolumeEntity getVolumeEntity(long volumeId);
}

View File

@ -21,16 +21,22 @@ package org.apache.cloudstack.storage.volume;
import javax.inject.Inject;
import org.apache.cloudstack.engine.cloud.entity.api.VolumeEntity;
import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStore;
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeService;
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
import org.apache.cloudstack.engine.subsystem.api.storage.disktype.VolumeDiskType;
import org.apache.cloudstack.engine.subsystem.api.storage.type.VolumeType;
import org.apache.cloudstack.storage.datastore.PrimaryDataStore;
import org.apache.cloudstack.storage.datastore.manager.PrimaryDataStoreManager;
import org.apache.cloudstack.storage.volume.db.VolumeDao;
import org.apache.cloudstack.storage.volume.db.VolumeVO;
import org.springframework.stereotype.Service;
import com.cloud.storage.Volume;
import com.cloud.utils.db.DB;
import com.cloud.utils.exception.CloudRuntimeException;
//1. change volume state
//2. orchestrator of volume, control most of the information of volume, storage pool id, voluem state, scope etc.
@Service
public class VolumeServiceImpl implements VolumeService {
@ -39,9 +45,27 @@ public class VolumeServiceImpl implements VolumeService {
@Inject
PrimaryDataStoreManager dataStoreMgr;
@Override
public VolumeEntity createVolume(long volumeId, long dataStoreId, VolumeDiskType diskType) {
public VolumeInfo createVolume(VolumeInfo volume, long dataStoreId, VolumeDiskType diskType) {
PrimaryDataStore dataStore = dataStoreMgr.getPrimaryDataStore(dataStoreId);
return dataStore.createVolume(volumeId, diskType);
if (dataStore == null) {
throw new CloudRuntimeException("Can't find dataStoreId: " + dataStoreId);
}
if (dataStore.exists(volume)) {
return volume;
}
VolumeObject vo = (VolumeObject)volume;
vo.stateTransit(VolumeEvent.CreateRequested);
try {
VolumeInfo vi = dataStore.createVolume(vo, diskType);
vo.stateTransit(VolumeEvent.OperationSucceeded);
return vi;
} catch (Exception e) {
vo.stateTransit(VolumeEvent.OperationFailed);
throw new CloudRuntimeException(e.toString());
}
}
@DB
@ -76,8 +100,22 @@ public class VolumeServiceImpl implements VolumeService {
@Override
public VolumeEntity allocateVolumeInDb(long size, VolumeType type, String volName, Long templateId) {
volDao.allocVolume(size, type, volName, templateId);
return null;
VolumeVO vo = volDao.allocVolume(size, type, volName, templateId);
return new VolumeEntityImpl(new VolumeObject(null, vo));
}
@Override
public VolumeEntity getVolumeEntity(long volumeId) {
VolumeVO vo = volDao.findById(volumeId);
if (vo == null) {
return null;
}
if (vo.getPoolId() == null) {
return new VolumeEntityImpl(new VolumeObject(null, vo));
} else {
PrimaryDataStore dataStore = dataStoreMgr.getPrimaryDataStore(vo.getPoolId());
return new VolumeEntityImpl(dataStore.getVolume(volumeId));
}
}
}

View File

@ -27,7 +27,7 @@ import java.util.concurrent.Executors;
import javax.inject.Inject;
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeService;
import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreProvider;
import org.apache.cloudstack.engine.subsystem.api.storage.disktype.QCOW2;
import org.apache.cloudstack.engine.subsystem.api.storage.disktype.VHD;
import org.apache.cloudstack.engine.subsystem.api.storage.disktype.VMDK;
@ -36,13 +36,13 @@ import org.apache.cloudstack.engine.subsystem.api.storage.disktype.VolumeDiskTyp
import org.apache.cloudstack.engine.subsystem.api.storage.type.VolumeTypeHelper;
import org.apache.cloudstack.storage.datastore.DefaultPrimaryDataStoreImpl;
import org.apache.cloudstack.storage.datastore.provider.DefaultPrimaryDatastoreProviderImpl;
import org.apache.cloudstack.storage.datastore.provider.PrimaryDataStoreProvider;
import org.apache.cloudstack.storage.image.format.ISO;
import org.apache.cloudstack.storage.image.format.ImageFormat;
import org.apache.cloudstack.storage.image.format.ImageFormatHelper;
import org.apache.cloudstack.storage.image.format.OVA;
import org.apache.cloudstack.storage.image.format.Unknown;
import org.apache.cloudstack.storage.volume.VolumeMotionService;
import org.apache.cloudstack.storage.volume.VolumeService;
import org.apache.cloudstack.storage.volume.db.VolumeDao;
import org.junit.Before;