diff --git a/engine/api/src/org/apache/cloudstack/engine/cloud/entity/api/VolumeEntity.java b/engine/api/src/org/apache/cloudstack/engine/cloud/entity/api/VolumeEntity.java index e8c0e75ed17..e30fdc8e05e 100755 --- a/engine/api/src/org/apache/cloudstack/engine/cloud/entity/api/VolumeEntity.java +++ b/engine/api/src/org/apache/cloudstack/engine/cloud/entity/api/VolumeEntity.java @@ -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); } diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/ImageService.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/ImageService.java similarity index 87% rename from engine/storage/src/org/apache/cloudstack/storage/image/ImageService.java rename to engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/ImageService.java index ebdc594f151..a3dba2669f1 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/image/ImageService.java +++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/ImageService.java @@ -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); } diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStoreProvider.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStoreProvider.java new file mode 100644 index 00000000000..e8fd0593847 --- /dev/null +++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStoreProvider.java @@ -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); +} diff --git a/engine/storage/src/org/apache/cloudstack/storage/StorageOrchestrator.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/StorageOrchestrator.java similarity index 72% rename from engine/storage/src/org/apache/cloudstack/storage/StorageOrchestrator.java rename to engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/StorageOrchestrator.java index 691c413b793..c1c1e901c66 100755 --- a/engine/storage/src/org/apache/cloudstack/storage/StorageOrchestrator.java +++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/StorageOrchestrator.java @@ -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); } 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 new file mode 100644 index 00000000000..8785bc553fc --- /dev/null +++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/VolumeInfo.java @@ -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(); +} diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStore.java b/engine/components-api/PrimaryDataStore.java similarity index 89% rename from engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStore.java rename to engine/components-api/PrimaryDataStore.java index 3f8bae037ae..87aee25bb4d 100644 --- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStore.java +++ b/engine/components-api/PrimaryDataStore.java @@ -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 getVolumes(); - boolean deleteVolume(long id); - VolumeEntity createVolume(long id, VolumeDiskType diskType); + boolean deleteVolume(VolumeEntity id); + VolumeEntity createVolume(String id, VolumeDiskType diskType); List getEndPoints(); PrimaryDataStoreInfo getDataStoreInfo(); } diff --git a/engine/storage/src/org/apache/cloudstack/storage/StorageOrchestratorImpl.java b/engine/storage/src/org/apache/cloudstack/storage/StorageOrchestratorImpl.java index 2118afbe179..eb3b1e0b870 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/StorageOrchestratorImpl.java +++ b/engine/storage/src/org/apache/cloudstack/storage/StorageOrchestratorImpl.java @@ -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; + } } diff --git a/engine/storage/src/org/apache/cloudstack/storage/command/CreateVolumeCommand.java b/engine/storage/src/org/apache/cloudstack/storage/command/CreateVolumeCommand.java index 243e0167da1..e7ae083df06 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/command/CreateVolumeCommand.java +++ b/engine/storage/src/org/apache/cloudstack/storage/command/CreateVolumeCommand.java @@ -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; diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/DefaultPrimaryDataStoreImpl.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/DefaultPrimaryDataStoreImpl.java index 1dc86f73e7f..bafd280b0bf 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/datastore/DefaultPrimaryDataStoreImpl.java +++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/DefaultPrimaryDataStoreImpl.java @@ -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 getVolumes() { + public List 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; + } } diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/PrimaryDataStore.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/PrimaryDataStore.java new file mode 100644 index 00000000000..dd9be51e65e --- /dev/null +++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/PrimaryDataStore.java @@ -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 getVolumes(); + boolean deleteVolume(long id); + VolumeObject createVolume(VolumeObject vo, VolumeDiskType diskType); + List getEndPoints(); + PrimaryDataStoreInfo getDataStoreInfo(); + boolean exists(VolumeInfo vi); + boolean templateExists(long templateId); +} diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/driver/DefaultPrimaryDataStoreDriverImpl.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/driver/DefaultPrimaryDataStoreDriverImpl.java index 16c54ae2e4e..1bb6ee72ce1 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/datastore/driver/DefaultPrimaryDataStoreDriverImpl.java +++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/driver/DefaultPrimaryDataStoreDriverImpl.java @@ -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 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; } diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/driver/PrimaryDataStoreDriver.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/driver/PrimaryDataStoreDriver.java index 006c0d5c869..d000b49a27c 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/datastore/driver/PrimaryDataStoreDriver.java +++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/driver/PrimaryDataStoreDriver.java @@ -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); } diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/manager/DefaultPrimaryDataStoreManagerImpl.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/manager/DefaultPrimaryDataStoreManagerImpl.java index 4095acb68d0..22011e40514 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/datastore/manager/DefaultPrimaryDataStoreManagerImpl.java +++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/manager/DefaultPrimaryDataStoreManagerImpl.java @@ -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; diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/manager/PrimaryDataStoreManager.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/manager/PrimaryDataStoreManager.java index 33fac990256..b6ac34d3d76 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/datastore/manager/PrimaryDataStoreManager.java +++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/manager/PrimaryDataStoreManager.java @@ -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 { diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/provider/DefaultPrimaryDatastoreProviderImpl.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/provider/DefaultPrimaryDatastoreProviderImpl.java index bd65752069a..af10693f297 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/datastore/provider/DefaultPrimaryDatastoreProviderImpl.java +++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/provider/DefaultPrimaryDatastoreProviderImpl.java @@ -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; diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/provider/PrimaryDataStoreProvider.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/provider/PrimaryDataStoreProvider.java deleted file mode 100644 index 9c9a8307c65..00000000000 --- a/engine/storage/src/org/apache/cloudstack/storage/datastore/provider/PrimaryDataStoreProvider.java +++ /dev/null @@ -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); -} diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/provider/PrimaryDataStoreProviderManager.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/provider/PrimaryDataStoreProviderManager.java index 4ef9a5c75ee..03b67b1d169 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/datastore/provider/PrimaryDataStoreProviderManager.java +++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/provider/PrimaryDataStoreProviderManager.java @@ -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); } diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/provider/PrimaryDataStoreProviderManagerImpl.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/provider/PrimaryDataStoreProviderManagerImpl.java index 08755530c11..63723a486ff 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/datastore/provider/PrimaryDataStoreProviderManagerImpl.java +++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/provider/PrimaryDataStoreProviderManagerImpl.java @@ -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 diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/ImageServiceImpl.java b/engine/storage/src/org/apache/cloudstack/storage/image/ImageServiceImpl.java index 7fabffa8e5b..1f765fcfbce 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/image/ImageServiceImpl.java +++ b/engine/storage/src/org/apache/cloudstack/storage/image/ImageServiceImpl.java @@ -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); + } } diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/TemplateEntityImpl.java b/engine/storage/src/org/apache/cloudstack/storage/image/TemplateEntityImpl.java new file mode 100644 index 00000000000..f514fab3e5a --- /dev/null +++ b/engine/storage/src/org/apache/cloudstack/storage/image/TemplateEntityImpl.java @@ -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 getDetails(String source) { + // TODO Auto-generated method stub + return null; + } + + @Override + public List 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 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; + } + +} diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/Template.java b/engine/storage/src/org/apache/cloudstack/storage/image/TemplateInfo.java similarity index 56% rename from engine/storage/src/org/apache/cloudstack/storage/image/Template.java rename to engine/storage/src/org/apache/cloudstack/storage/image/TemplateInfo.java index ae12e0c8e59..312aa7b5749 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/image/Template.java +++ b/engine/storage/src/org/apache/cloudstack/storage/image/TemplateInfo.java @@ -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(); } diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/TemplateObject.java b/engine/storage/src/org/apache/cloudstack/storage/image/TemplateObject.java new file mode 100644 index 00000000000..f1181dba591 --- /dev/null +++ b/engine/storage/src/org/apache/cloudstack/storage/image/TemplateObject.java @@ -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 { + +} diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/downloader/ImageDownloader.java b/engine/storage/src/org/apache/cloudstack/storage/image/downloader/ImageDownloader.java index 123df61e48c..ef9bc3f1465 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/image/downloader/ImageDownloader.java +++ b/engine/storage/src/org/apache/cloudstack/storage/image/downloader/ImageDownloader.java @@ -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); } diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/provider/ImageDataStoreProviderManager.java b/engine/storage/src/org/apache/cloudstack/storage/image/provider/ImageDataStoreProviderManager.java index dd98a7a107c..407a64455f1 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/image/provider/ImageDataStoreProviderManager.java +++ b/engine/storage/src/org/apache/cloudstack/storage/image/provider/ImageDataStoreProviderManager.java @@ -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); } diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/store/ImageDataStore.java b/engine/storage/src/org/apache/cloudstack/storage/image/store/ImageDataStore.java index d712acc813c..5422bad5a61 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/image/store/ImageDataStore.java +++ b/engine/storage/src/org/apache/cloudstack/storage/image/store/ImageDataStore.java @@ -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); diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/store/ImageDataStoreInfo.java b/engine/storage/src/org/apache/cloudstack/storage/image/store/ImageDataStoreInfo.java new file mode 100644 index 00000000000..7be4da0f784 --- /dev/null +++ b/engine/storage/src/org/apache/cloudstack/storage/image/store/ImageDataStoreInfo.java @@ -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(); +} diff --git a/engine/storage/src/org/apache/cloudstack/storage/manager/PrimaryDataStoreManager.java b/engine/storage/src/org/apache/cloudstack/storage/manager/PrimaryDataStoreManager.java index 4b7142f8d0a..6292ab8b553 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/manager/PrimaryDataStoreManager.java +++ b/engine/storage/src/org/apache/cloudstack/storage/manager/PrimaryDataStoreManager.java @@ -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; diff --git a/engine/storage/src/org/apache/cloudstack/storage/manager/PrimaryDataStoreManagerImpl.java b/engine/storage/src/org/apache/cloudstack/storage/manager/PrimaryDataStoreManagerImpl.java index 24ae5ea37ef..2af2ef0324f 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/manager/PrimaryDataStoreManagerImpl.java +++ b/engine/storage/src/org/apache/cloudstack/storage/manager/PrimaryDataStoreManagerImpl.java @@ -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; diff --git a/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeEntityImpl.java b/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeEntityImpl.java index 13308e8c862..e79614c99d0 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeEntityImpl.java +++ b/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeEntityImpl.java @@ -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 _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 + + } + } diff --git a/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeInfo.java b/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeInfo.java deleted file mode 100644 index bc8fbe5f500..00000000000 --- a/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeInfo.java +++ /dev/null @@ -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; - } -} diff --git a/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeObject.java b/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeObject.java new file mode 100644 index 00000000000..d495c3518aa --- /dev/null +++ b/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeObject.java @@ -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 _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; + } +} diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/VolumeService.java b/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeService.java similarity index 87% rename from engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/VolumeService.java rename to engine/storage/src/org/apache/cloudstack/storage/volume/VolumeService.java index 290a74c3eca..fe4aba076b4 100644 --- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/VolumeService.java +++ b/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeService.java @@ -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); } diff --git a/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java b/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java index 83b98315ff9..40c270fea4c 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java +++ b/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java @@ -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)); + } + } } diff --git a/engine/storage/test/org/apache/cloudstack/storage/test/volumeServiceTest.java b/engine/storage/test/org/apache/cloudstack/storage/test/volumeServiceTest.java index 74967dfc0af..cf7f7128286 100644 --- a/engine/storage/test/org/apache/cloudstack/storage/test/volumeServiceTest.java +++ b/engine/storage/test/org/apache/cloudstack/storage/test/volumeServiceTest.java @@ -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;