From 23a35db95266ecaa42ed120408d4e0a05c674b95 Mon Sep 17 00:00:00 2001 From: Edison Su Date: Thu, 15 Nov 2012 17:52:30 -0800 Subject: [PATCH] add image motion interface --- .../cloud/entity/api/TemplateEntity.java | 3 +- .../api/storage/PrimaryDataStoreInfo.java | 3 + .../subsystem/api/storage/type/BaseImage.java | 7 +++ .../storage/StorageOrchestratorImpl.java | 28 +++++++++- .../command/CopyTemplateToPrimaryStorage.java | 29 ++++++++++ .../CopyTemplateToPrimaryStorageAnswer.java | 7 +++ .../storage/command/CreateVolumeCommand.java | 6 +- .../DefaultPrimaryDataStoreImpl.java | 16 ++++-- .../storage/datastore/PrimaryDataStore.java | 6 +- .../datastore/PrimaryDataStoreInfoImpl.java | 7 +++ .../DefaultPrimaryDataStoreDriverImpl.java | 3 +- .../storage/image}/ImageService.java | 6 +- .../storage/image/ImageServiceImpl.java | 14 ++--- .../storage/image/TemplateEntityImpl.java | 16 ++++++ .../motion/DefaultImageMotionStrategy.java | 56 +++++++++++++++++++ .../image/motion/ImageMotionProvider.java | 26 --------- .../image/motion/ImageMotionService.java | 5 +- .../image/motion/ImageMotionServiceImpl.java | 39 +++++++++++-- ...Provider.java => ImageMotionStrategy.java} | 15 +++-- .../storage/to/ImageDataStoreTO.java | 9 +++ .../storage/to/PrimaryDataStoreTO.java | 9 +++ .../cloudstack/storage/to/TemplateTO.java | 9 +++ .../cloudstack/storage/to/VolumeTO.java | 9 +++ .../storage/volume/VolumeService.java | 7 ++- .../storage/volume/VolumeServiceImpl.java | 31 ++++++++-- 25 files changed, 298 insertions(+), 68 deletions(-) create mode 100644 engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/type/BaseImage.java create mode 100644 engine/storage/src/org/apache/cloudstack/storage/command/CopyTemplateToPrimaryStorage.java create mode 100644 engine/storage/src/org/apache/cloudstack/storage/command/CopyTemplateToPrimaryStorageAnswer.java rename engine/{api/src/org/apache/cloudstack/engine/subsystem/api/storage => storage/src/org/apache/cloudstack/storage/image}/ImageService.java (87%) create mode 100644 engine/storage/src/org/apache/cloudstack/storage/image/motion/DefaultImageMotionStrategy.java delete mode 100644 engine/storage/src/org/apache/cloudstack/storage/image/motion/ImageMotionProvider.java rename engine/storage/src/org/apache/cloudstack/storage/image/motion/{DefaultImageMotionProvider.java => ImageMotionStrategy.java} (67%) create mode 100644 engine/storage/src/org/apache/cloudstack/storage/to/ImageDataStoreTO.java create mode 100644 engine/storage/src/org/apache/cloudstack/storage/to/PrimaryDataStoreTO.java create mode 100644 engine/storage/src/org/apache/cloudstack/storage/to/TemplateTO.java create mode 100644 engine/storage/src/org/apache/cloudstack/storage/to/VolumeTO.java diff --git a/engine/api/src/org/apache/cloudstack/engine/cloud/entity/api/TemplateEntity.java b/engine/api/src/org/apache/cloudstack/engine/cloud/entity/api/TemplateEntity.java index ac01bded20d..f10ba5ef17f 100755 --- a/engine/api/src/org/apache/cloudstack/engine/cloud/entity/api/TemplateEntity.java +++ b/engine/api/src/org/apache/cloudstack/engine/cloud/entity/api/TemplateEntity.java @@ -23,5 +23,6 @@ import org.apache.cloudstack.engine.entity.api.CloudStackEntity; import com.cloud.template.VirtualMachineTemplate; public interface TemplateEntity extends CloudStackEntity, VirtualMachineTemplate { - + public long getPhysicalSize(); + public long getVirtualSize(); } diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStoreInfo.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStoreInfo.java index 549a76e1168..88405ce14e3 100644 --- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStoreInfo.java +++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStoreInfo.java @@ -19,6 +19,8 @@ package org.apache.cloudstack.engine.subsystem.api.storage; +import java.util.List; + import org.apache.cloudstack.engine.subsystem.api.storage.disktype.VolumeDiskType; import com.cloud.hypervisor.Hypervisor.HypervisorType; @@ -29,4 +31,5 @@ public interface PrimaryDataStoreInfo { public boolean isVolumeDiskTypeSupported(VolumeDiskType diskType); public long getCapacity(); public long getAvailableCapacity(); + public List getEndPoints(); } diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/type/BaseImage.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/type/BaseImage.java new file mode 100644 index 00000000000..633a6d54cf1 --- /dev/null +++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/type/BaseImage.java @@ -0,0 +1,7 @@ +package org.apache.cloudstack.engine.subsystem.api.storage.type; + +public class BaseImage extends VolumeTypeBase { + public BaseImage() { + this.type = "BaseImage"; + } +} diff --git a/engine/storage/src/org/apache/cloudstack/storage/StorageOrchestratorImpl.java b/engine/storage/src/org/apache/cloudstack/storage/StorageOrchestratorImpl.java index 8d3c920b94f..692234239a1 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/StorageOrchestratorImpl.java +++ b/engine/storage/src/org/apache/cloudstack/storage/StorageOrchestratorImpl.java @@ -25,6 +25,7 @@ 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.EndPoint; 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; @@ -32,10 +33,15 @@ 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.BaseImage; 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.image.ImageService; +import org.apache.cloudstack.storage.image.TemplateEntityImpl; +import org.apache.cloudstack.storage.image.TemplateInfo; +import org.apache.cloudstack.storage.image.motion.ImageMotionService; import org.apache.cloudstack.storage.manager.BackupStorageManager; import org.apache.cloudstack.storage.manager.SecondaryStorageManager; import org.apache.cloudstack.storage.volume.VolumeEntityImpl; @@ -92,6 +98,10 @@ public class StorageOrchestratorImpl implements StorageOrchestrator { @Inject VolumeService volumeService; @Inject + ImageMotionService imageMotionService; + @Inject + ImageService imageService; + @Inject PrimaryDataStoreManager primaryStorageMgr; @DB @@ -343,12 +353,28 @@ public class StorageOrchestratorImpl implements StorageOrchestrator { return volumeService.allocateVolumeInDb(size, type, volName, templateId); } + protected VolumeInfo getVolumeInfo(VolumeEntity volume) { + VolumeEntityImpl vei = (VolumeEntityImpl)volume; + return vei.getVolumeInfo(); + } + @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) { - //pd.installTemplate(template); + TemplateInfo ti = ((TemplateEntityImpl)template).getTemplateInfo(); + //TODO: hold lock + VolumeEntity baseImage = volumeService.allocateVolumeInDb(template.getVirtualSize(), new BaseImage(), "BaseImage-" + template.getName(), template.getId()); + VolumeInfo vi = pd.createVolume(getVolumeInfo(baseImage), pd.getDefaultDiskType()); + volumeService.startCopying(vi); + + boolean copyResult = imageMotionService.copyTemplate(ti, vi); + if (copyResult) { + volumeService.copyingSucceed(vi); + } else { + volumeService.copyingFailed(vi); + } } return false; } diff --git a/engine/storage/src/org/apache/cloudstack/storage/command/CopyTemplateToPrimaryStorage.java b/engine/storage/src/org/apache/cloudstack/storage/command/CopyTemplateToPrimaryStorage.java new file mode 100644 index 00000000000..02ab73a87c7 --- /dev/null +++ b/engine/storage/src/org/apache/cloudstack/storage/command/CopyTemplateToPrimaryStorage.java @@ -0,0 +1,29 @@ +package org.apache.cloudstack.storage.command; + +import org.apache.cloudstack.storage.to.TemplateTO; +import org.apache.cloudstack.storage.to.VolumeTO; + +import com.cloud.agent.api.Command; + +public class CopyTemplateToPrimaryStorage extends Command { + + private VolumeTO volume; + private TemplateTO template; + + protected CopyTemplateToPrimaryStorage() { + super(); + } + + public CopyTemplateToPrimaryStorage(TemplateTO template, VolumeTO volume) { + super(); + this.volume = volume; + this.template = template; + } + + @Override + public boolean executeInSequence() { + // TODO Auto-generated method stub + return false; + } + +} diff --git a/engine/storage/src/org/apache/cloudstack/storage/command/CopyTemplateToPrimaryStorageAnswer.java b/engine/storage/src/org/apache/cloudstack/storage/command/CopyTemplateToPrimaryStorageAnswer.java new file mode 100644 index 00000000000..5a91117d386 --- /dev/null +++ b/engine/storage/src/org/apache/cloudstack/storage/command/CopyTemplateToPrimaryStorageAnswer.java @@ -0,0 +1,7 @@ +package org.apache.cloudstack.storage.command; + +import com.cloud.agent.api.Answer; + +public class CopyTemplateToPrimaryStorageAnswer extends Answer { + +} 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 e7ae083df06..70d1611687d 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/command/CreateVolumeCommand.java +++ b/engine/storage/src/org/apache/cloudstack/storage/command/CreateVolumeCommand.java @@ -18,13 +18,13 @@ */ package org.apache.cloudstack.storage.command; -import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo; +import org.apache.cloudstack.storage.to.VolumeTO; import com.cloud.agent.api.Command; public class CreateVolumeCommand extends Command { - protected VolumeInfo volumeInfo; - public CreateVolumeCommand(VolumeInfo volumeInfo) { + protected VolumeTO volumeInfo; + public CreateVolumeCommand(VolumeTO volumeInfo) { super(); this.volumeInfo = volumeInfo; } 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 0ca35651314..13584e735f0 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/datastore/DefaultPrimaryDataStoreImpl.java +++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/DefaultPrimaryDataStoreImpl.java @@ -14,6 +14,7 @@ import org.apache.cloudstack.engine.subsystem.api.storage.disktype.VolumeDiskTyp import org.apache.cloudstack.storage.HypervisorHostEndPoint; import org.apache.cloudstack.storage.datastore.db.DataStoreVO; import org.apache.cloudstack.storage.datastore.driver.PrimaryDataStoreDriver; +import org.apache.cloudstack.storage.image.TemplateInfo; import org.apache.cloudstack.storage.image.TemplateObject; import org.apache.cloudstack.storage.volume.VolumeEntityImpl; @@ -120,11 +121,11 @@ public class DefaultPrimaryDataStoreImpl implements PrimaryDataStore { } @Override - public VolumeObject createVolume(VolumeObject vo, VolumeDiskType diskType) { + public VolumeObject createVolume(VolumeInfo vi, VolumeDiskType diskType) { if (!pdsInfo.isVolumeDiskTypeSupported(diskType)) { return null; } - + VolumeObject vo = (VolumeObject)vi; vo.setVolumeDiskType(diskType); this.driver.createVolume(vo); return vo; @@ -143,8 +144,15 @@ public class DefaultPrimaryDataStoreImpl implements PrimaryDataStore { } @Override - public boolean installTemplate(TemplateObject template) { - // TODO Auto-generated method stub + public boolean installTemplate(TemplateInfo template) { + + return false; } + + @Override + public VolumeDiskType getDefaultDiskType() { + // TODO Auto-generated method stub + return null; + } } diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/PrimaryDataStore.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/PrimaryDataStore.java index 4917fc3633f..1f05b0feaea 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/datastore/PrimaryDataStore.java +++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/PrimaryDataStore.java @@ -25,6 +25,7 @@ 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.image.TemplateInfo; import org.apache.cloudstack.storage.image.TemplateObject; import org.apache.cloudstack.storage.volume.VolumeObject; @@ -33,10 +34,11 @@ public interface PrimaryDataStore extends PrimaryDataStoreInfo { VolumeInfo getVolume(long id); List getVolumes(); boolean deleteVolume(long id); - VolumeObject createVolume(VolumeObject vo, VolumeDiskType diskType); + VolumeInfo createVolume(VolumeInfo vo, VolumeDiskType diskType); List getEndPoints(); PrimaryDataStoreInfo getDataStoreInfo(); boolean exists(VolumeInfo vi); boolean templateExists(long templateId); - boolean installTemplate(TemplateObject template); + boolean installTemplate(TemplateInfo template); + VolumeDiskType getDefaultDiskType(); } diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/PrimaryDataStoreInfoImpl.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/PrimaryDataStoreInfoImpl.java index b11e9227746..283d1ae48e7 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/datastore/PrimaryDataStoreInfoImpl.java +++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/PrimaryDataStoreInfoImpl.java @@ -20,6 +20,7 @@ package org.apache.cloudstack.storage.datastore; import java.util.List; +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.disktype.VolumeDiskType; @@ -65,4 +66,10 @@ public class PrimaryDataStoreInfoImpl implements PrimaryDataStoreInfo { public long getAvailableCapacity() { return this.avail; } + + @Override + public List getEndPoints() { + // TODO Auto-generated method stub + return null; + } } 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 1bb6ee72ce1..66d79679a15 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 @@ -7,6 +7,7 @@ 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.to.VolumeTO; import org.apache.cloudstack.storage.volume.VolumeObject; import org.apache.log4j.Logger; import org.springframework.stereotype.Component; @@ -23,7 +24,7 @@ public class DefaultPrimaryDataStoreDriverImpl implements List endPoints = vol.getDataStore().getEndPoints(); int retries = 3; VolumeInfo volInfo = vol; - CreateVolumeCommand createCmd = new CreateVolumeCommand(volInfo); + CreateVolumeCommand createCmd = new CreateVolumeCommand(new VolumeTO(volInfo)); Answer answer = null; int i = 0; boolean result = false; diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/ImageService.java b/engine/storage/src/org/apache/cloudstack/storage/image/ImageService.java similarity index 87% rename from engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/ImageService.java rename to engine/storage/src/org/apache/cloudstack/storage/image/ImageService.java index a3dba2669f1..78153f1a010 100644 --- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/ImageService.java +++ b/engine/storage/src/org/apache/cloudstack/storage/image/ImageService.java @@ -16,16 +16,18 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.cloudstack.engine.subsystem.api.storage; +package org.apache.cloudstack.storage.image; import org.apache.cloudstack.engine.cloud.entity.api.TemplateEntity; +import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint; + public interface ImageService { boolean registerTemplate(long templateId, long imageStoreId); boolean deleteTemplate(long templateId); long registerIso(String isoUrl, long accountId); boolean deleteIso(long isoId); - String grantTemplateAccess(long templateId, long endpointId); + String grantTemplateAccess(TemplateInfo template, EndPoint endpointId); boolean revokeTemplateAccess(long templateId, long endpointId); String grantIsoAccess(long isoId, long endpointId); boolean revokeIsoAccess(long isoId, long endpointId); 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 1f765fcfbce..35f77b2b4bb 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/image/ImageServiceImpl.java +++ b/engine/storage/src/org/apache/cloudstack/storage/image/ImageServiceImpl.java @@ -21,7 +21,7 @@ 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.engine.subsystem.api.storage.EndPoint; import org.apache.cloudstack.storage.image.downloader.ImageDownloader; import org.apache.cloudstack.storage.image.manager.ImageDataStoreManager; import org.apache.cloudstack.storage.image.provider.ImageDataStoreProviderManager; @@ -62,12 +62,6 @@ public class ImageServiceImpl implements ImageService { return false; } - @Override - public String grantTemplateAccess(long templateId, long endpointId) { - ImageDataStore ids = imageStoreProviderMgr.getDataStoreFromTemplateId(templateId); - return ids.grantAccess(templateId, endpointId); - } - @Override public boolean revokeTemplateAccess(long templateId, long endpointId) { // TODO Auto-generated method stub @@ -91,4 +85,10 @@ public class ImageServiceImpl implements ImageService { TemplateObject to = imageStoreProviderMgr.getTemplate(templateId); return new TemplateEntityImpl(to); } + + @Override + public String grantTemplateAccess(TemplateInfo template, EndPoint endpointId) { + // TODO Auto-generated method stub + return null; + } } diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/TemplateEntityImpl.java b/engine/storage/src/org/apache/cloudstack/storage/image/TemplateEntityImpl.java index f514fab3e5a..8783804ef69 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/image/TemplateEntityImpl.java +++ b/engine/storage/src/org/apache/cloudstack/storage/image/TemplateEntityImpl.java @@ -46,6 +46,10 @@ public class TemplateEntityImpl implements TemplateEntity { public long getImageDataStoreId() { return getImageDataStore().getImageDataStoreId(); } + + public TemplateInfo getTemplateInfo() { + return this.templateInfo; + } @Override public String getUuid() { @@ -275,4 +279,16 @@ public class TemplateEntityImpl implements TemplateEntity { return 0; } + @Override + public long getPhysicalSize() { + // TODO Auto-generated method stub + return 0; + } + + @Override + public long getVirtualSize() { + // TODO Auto-generated method stub + return 0; + } + } diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/motion/DefaultImageMotionStrategy.java b/engine/storage/src/org/apache/cloudstack/storage/image/motion/DefaultImageMotionStrategy.java new file mode 100644 index 00000000000..d4671dbecb5 --- /dev/null +++ b/engine/storage/src/org/apache/cloudstack/storage/image/motion/DefaultImageMotionStrategy.java @@ -0,0 +1,56 @@ +/* + * 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.motion; + +import org.apache.cloudstack.engine.cloud.entity.api.TemplateEntity; +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.storage.command.CopyTemplateToPrimaryStorage; +import org.apache.cloudstack.storage.datastore.PrimaryDataStore; +import org.apache.cloudstack.storage.image.TemplateInfo; +import org.apache.cloudstack.storage.to.TemplateTO; +import org.apache.cloudstack.storage.to.VolumeTO; + +public class DefaultImageMotionStrategy implements ImageMotionStrategy { + + @Override + public boolean canHandle(TemplateInfo template, VolumeInfo volume) { + // TODO Auto-generated method stub + return true; + } + + //For default strategy, we will use one of endpoint in volume's datastore + @Override + public EndPoint getEndPoint(TemplateInfo template, VolumeInfo volume) { + PrimaryDataStoreInfo pdi = volume.getDataStore(); + return pdi.getEndPoints().get(0); + } + + @Override + public boolean copyTemplate(TemplateInfo template, VolumeInfo volume, + EndPoint ep) { + VolumeTO vt = new VolumeTO(volume); + TemplateTO tt = new TemplateTO(template); + CopyTemplateToPrimaryStorage copyCommand = new CopyTemplateToPrimaryStorage(tt, vt); + ep.sendMessage(copyCommand); + return true; + } + +} diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/motion/ImageMotionProvider.java b/engine/storage/src/org/apache/cloudstack/storage/image/motion/ImageMotionProvider.java deleted file mode 100644 index 342ebe6021c..00000000000 --- a/engine/storage/src/org/apache/cloudstack/storage/image/motion/ImageMotionProvider.java +++ /dev/null @@ -1,26 +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.image.motion; - -import org.apache.cloudstack.engine.cloud.entity.api.TemplateEntity; -import org.apache.cloudstack.storage.datastore.PrimaryDataStore; - -public interface ImageMotionProvider { - public boolean canHandle(TemplateEntity template, PrimaryDataStore dataStoe); -} diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/motion/ImageMotionService.java b/engine/storage/src/org/apache/cloudstack/storage/image/motion/ImageMotionService.java index a98be67e34b..5baf84cb374 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/image/motion/ImageMotionService.java +++ b/engine/storage/src/org/apache/cloudstack/storage/image/motion/ImageMotionService.java @@ -19,9 +19,12 @@ package org.apache.cloudstack.storage.image.motion; import org.apache.cloudstack.engine.cloud.entity.api.TemplateEntity; +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.storage.image.TemplateInfo; public interface ImageMotionService { - boolean copyTemplate(TemplateEntity template, PrimaryDataStoreInfo dataStore); + boolean copyTemplate(TemplateInfo template, VolumeInfo baseImage); boolean copyIso(String isoUri, String destIsoUri); } diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/motion/ImageMotionServiceImpl.java b/engine/storage/src/org/apache/cloudstack/storage/image/motion/ImageMotionServiceImpl.java index 1b4db5827be..ddea4c04283 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/image/motion/ImageMotionServiceImpl.java +++ b/engine/storage/src/org/apache/cloudstack/storage/image/motion/ImageMotionServiceImpl.java @@ -18,11 +18,28 @@ */ package org.apache.cloudstack.storage.image.motion; +import java.util.List; + +import javax.inject.Inject; + import org.apache.cloudstack.engine.cloud.entity.api.TemplateEntity; +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.storage.datastore.PrimaryDataStore; +import org.apache.cloudstack.storage.image.ImageService; +import org.apache.cloudstack.storage.image.TemplateInfo; +import org.apache.cloudstack.storage.volume.VolumeService; + +import com.cloud.utils.exception.CloudRuntimeException; public class ImageMotionServiceImpl implements ImageMotionService { + @Inject + List motionStrategies; + @Inject + VolumeService volumeService; + @Inject + ImageService imageService; @Override public boolean copyIso(String isoUri, String destIsoUri) { // TODO Auto-generated method stub @@ -30,9 +47,23 @@ public class ImageMotionServiceImpl implements ImageMotionService { } @Override - public boolean copyTemplate(TemplateEntity template, PrimaryDataStoreInfo dataStore) { - // TODO Auto-generated method stub - return false; + public boolean copyTemplate(TemplateInfo template, VolumeInfo volume) { + ImageMotionStrategy ims = null; + for (ImageMotionStrategy strategy : motionStrategies) { + if (strategy.canHandle(template, volume)) { + ims = strategy; + break; + } + } + + if (ims == null) { + throw new CloudRuntimeException("Can't find proper image motion strategy"); + } + + EndPoint ep = ims.getEndPoint(template, volume); + + volumeService.grantAccess(volume, ep); + imageService.grantTemplateAccess(template, ep); + return ims.copyTemplate(template, volume, ep); } - } diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/motion/DefaultImageMotionProvider.java b/engine/storage/src/org/apache/cloudstack/storage/image/motion/ImageMotionStrategy.java similarity index 67% rename from engine/storage/src/org/apache/cloudstack/storage/image/motion/DefaultImageMotionProvider.java rename to engine/storage/src/org/apache/cloudstack/storage/image/motion/ImageMotionStrategy.java index 3fddd74ec2a..d072fff2c5d 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/image/motion/DefaultImageMotionProvider.java +++ b/engine/storage/src/org/apache/cloudstack/storage/image/motion/ImageMotionStrategy.java @@ -19,14 +19,13 @@ package org.apache.cloudstack.storage.image.motion; import org.apache.cloudstack.engine.cloud.entity.api.TemplateEntity; +import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint; +import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo; import org.apache.cloudstack.storage.datastore.PrimaryDataStore; +import org.apache.cloudstack.storage.image.TemplateInfo; -public class DefaultImageMotionProvider implements ImageMotionProvider { - - @Override - public boolean canHandle(TemplateEntity template, PrimaryDataStore dataStoe) { - // TODO Auto-generated method stub - return false; - } - +public interface ImageMotionStrategy { + public boolean canHandle(TemplateInfo template, VolumeInfo volume); + public EndPoint getEndPoint(TemplateInfo template, VolumeInfo volume); + public boolean copyTemplate(TemplateInfo template, VolumeInfo volume, EndPoint ep); } diff --git a/engine/storage/src/org/apache/cloudstack/storage/to/ImageDataStoreTO.java b/engine/storage/src/org/apache/cloudstack/storage/to/ImageDataStoreTO.java new file mode 100644 index 00000000000..1b4c083f802 --- /dev/null +++ b/engine/storage/src/org/apache/cloudstack/storage/to/ImageDataStoreTO.java @@ -0,0 +1,9 @@ +package org.apache.cloudstack.storage.to; + +import org.apache.cloudstack.storage.image.store.ImageDataStoreInfo; + +public class ImageDataStoreTO { + public ImageDataStoreTO(ImageDataStoreInfo dataStore) { + + } +} diff --git a/engine/storage/src/org/apache/cloudstack/storage/to/PrimaryDataStoreTO.java b/engine/storage/src/org/apache/cloudstack/storage/to/PrimaryDataStoreTO.java new file mode 100644 index 00000000000..bb264df5b2d --- /dev/null +++ b/engine/storage/src/org/apache/cloudstack/storage/to/PrimaryDataStoreTO.java @@ -0,0 +1,9 @@ +package org.apache.cloudstack.storage.to; + +import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreInfo; + +public class PrimaryDataStoreTO { + public PrimaryDataStoreTO(PrimaryDataStoreInfo dataStore) { + + } +} diff --git a/engine/storage/src/org/apache/cloudstack/storage/to/TemplateTO.java b/engine/storage/src/org/apache/cloudstack/storage/to/TemplateTO.java new file mode 100644 index 00000000000..0c9d53f6203 --- /dev/null +++ b/engine/storage/src/org/apache/cloudstack/storage/to/TemplateTO.java @@ -0,0 +1,9 @@ +package org.apache.cloudstack.storage.to; + +import org.apache.cloudstack.storage.image.TemplateInfo; + +public class TemplateTO { + public TemplateTO(TemplateInfo template) { + + } +} diff --git a/engine/storage/src/org/apache/cloudstack/storage/to/VolumeTO.java b/engine/storage/src/org/apache/cloudstack/storage/to/VolumeTO.java new file mode 100644 index 00000000000..28150f143c2 --- /dev/null +++ b/engine/storage/src/org/apache/cloudstack/storage/to/VolumeTO.java @@ -0,0 +1,9 @@ +package org.apache.cloudstack.storage.to; + +import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo; + +public class VolumeTO { + public VolumeTO(VolumeInfo volume) { + + } +} diff --git a/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeService.java b/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeService.java index fe4aba076b4..2037966cb37 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeService.java +++ b/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeService.java @@ -19,6 +19,7 @@ package org.apache.cloudstack.storage.volume; 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.engine.subsystem.api.storage.disktype.VolumeDiskType; import org.apache.cloudstack.engine.subsystem.api.storage.type.VolumeType; @@ -60,12 +61,14 @@ public interface VolumeService { /** * */ - String grantAccess(long volumeId, long endpointId); + String grantAccess(VolumeInfo volume, EndPoint endpointId); /** * */ boolean rokeAccess(long volumeId, long endpointId); - + VolumeInfo startCopying(VolumeInfo volume); + VolumeInfo copyingSucceed(VolumeInfo volume); + VolumeInfo copyingFailed(VolumeInfo volume); 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 40c270fea4c..16dfe3f85a9 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java +++ b/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java @@ -21,6 +21,7 @@ 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.EndPoint; 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; @@ -86,12 +87,6 @@ public class VolumeServiceImpl implements VolumeService { return false; } - @Override - public String grantAccess(long volumeId, long endpointId) { - // TODO Auto-generated method stub - return null; - } - @Override public boolean rokeAccess(long volumeId, long endpointId) { // TODO Auto-generated method stub @@ -118,4 +113,28 @@ public class VolumeServiceImpl implements VolumeService { return new VolumeEntityImpl(dataStore.getVolume(volumeId)); } } + + @Override + public String grantAccess(VolumeInfo volume, EndPoint endpointId) { + // TODO Auto-generated method stub + return null; + } + + @Override + public VolumeInfo startCopying(VolumeInfo volume) { + // TODO Auto-generated method stub + return null; + } + + @Override + public VolumeInfo copyingSucceed(VolumeInfo volume) { + // TODO Auto-generated method stub + return null; + } + + @Override + public VolumeInfo copyingFailed(VolumeInfo volume) { + // TODO Auto-generated method stub + return null; + } }