Return-Path: X-Original-To: apmail-cloudstack-commits-archive@www.apache.org Delivered-To: apmail-cloudstack-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 36666F243 for ; Fri, 29 Mar 2013 23:36:03 +0000 (UTC) Received: (qmail 65026 invoked by uid 500); 29 Mar 2013 23:35:53 -0000 Delivered-To: apmail-cloudstack-commits-archive@cloudstack.apache.org Received: (qmail 64970 invoked by uid 500); 29 Mar 2013 23:35:53 -0000 Mailing-List: contact commits-help@cloudstack.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@cloudstack.apache.org Delivered-To: mailing list commits@cloudstack.apache.org Received: (qmail 64184 invoked by uid 99); 29 Mar 2013 23:35:52 -0000 Received: from tyr.zones.apache.org (HELO tyr.zones.apache.org) (140.211.11.114) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 29 Mar 2013 23:35:52 +0000 Received: by tyr.zones.apache.org (Postfix, from userid 65534) id A2DBD834370; Fri, 29 Mar 2013 23:35:52 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: mchen@apache.org To: commits@cloudstack.apache.org Date: Fri, 29 Mar 2013 23:36:25 -0000 Message-Id: <1556400e2d9848ac9c103788d474730d@git.apache.org> In-Reply-To: <074bb17f95a142908f6b8dcf07bc1cd4@git.apache.org> References: <074bb17f95a142908f6b8dcf07bc1cd4@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [35/35] git commit: updated refs/heads/object_store to e64030a Move previous AncientImageDataStore provider and DefaultImageDataStore provider code into plugins. Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/e64030a3 Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/e64030a3 Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/e64030a3 Branch: refs/heads/object_store Commit: e64030a30d82a3b8bc16457467fbb30c152c3731 Parents: 2fb5358 Author: Min Chen Authored: Fri Mar 29 16:35:13 2013 -0700 Committer: Min Chen Committed: Fri Mar 29 16:35:13 2013 -0700 ---------------------------------------------------------------------- .../driver/AncientImageDataStoreDriverImpl.java | 250 --------------- .../driver/DefaultImageDataStoreDriverImpl.java | 126 -------- .../image/store/AncientImageDataStoreProvider.java | 101 ------ .../image/store/DefaultImageDataStoreProvider.java | 82 ----- .../lifecycle/DefaultImageDataStoreLifeCycle.java | 107 ------ .../storage/allocator/StorageAllocatorTest.java | 4 +- .../cloudstack/storage/test/volumeServiceTest.java | 8 +- .../provider/DataStoreProviderManagerImpl.java | 2 +- .../driver/DefaultPrimaryDataStoreDriverImpl.java | 249 -------------- .../DefaultPrimaryDataStoreLifeCycleImpl.java | 147 --------- .../DefaultPrimaryDatastoreProviderImpl.java | 83 ----- .../storage/volume/test/ConfiguratorTest.java | 4 +- plugins/pom.xml | 3 + plugins/storage/image/default/pom.xml | 56 ++++ .../driver/CloudStackImageDataStoreDriverImpl.java | 250 +++++++++++++++ .../CloudStackImageDataStoreLifeCycle.java | 108 +++++++ .../provider/CloudStackImageDataStoreProvider.java | 101 ++++++ plugins/storage/image/sample/pom.xml | 56 ++++ .../driver/SampleImageDataStoreDriverImpl.java | 126 ++++++++ .../lifecycle/SampleImageDataStoreLifeCycle.java | 108 +++++++ .../provider/SampleImageDataStoreProvider.java | 82 +++++ .../CloudStackPrimaryDataStoreProviderImpl.java | 8 +- plugins/storage/volume/sample/pom.xml | 56 ++++ .../driver/SamplePrimaryDataStoreDriverImpl.java | 249 ++++++++++++++ .../SamplePrimaryDataStoreLifeCycleImpl.java | 147 +++++++++ .../SamplePrimaryDatastoreProviderImpl.java | 83 +++++ .../SolidfirePrimaryDataStoreProvider.java | 52 +++- 27 files changed, 1482 insertions(+), 1166 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e64030a3/engine/storage/image/src/org/apache/cloudstack/storage/image/driver/AncientImageDataStoreDriverImpl.java ---------------------------------------------------------------------- diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/driver/AncientImageDataStoreDriverImpl.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/driver/AncientImageDataStoreDriverImpl.java deleted file mode 100644 index 97ea6c4..0000000 --- a/engine/storage/image/src/org/apache/cloudstack/storage/image/driver/AncientImageDataStoreDriverImpl.java +++ /dev/null @@ -1,250 +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.driver; - -import java.util.List; -import java.util.Set; - -import javax.inject.Inject; - -import org.apache.cloudstack.engine.subsystem.api.storage.CommandResult; -import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult; -import org.apache.cloudstack.engine.subsystem.api.storage.CreateCmdResult; -import org.apache.cloudstack.engine.subsystem.api.storage.DataObject; -import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectType; -import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; -import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint; -import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo; -import org.apache.cloudstack.framework.async.AsyncCompletionCallback; -import org.apache.cloudstack.framework.async.AsyncRpcConext; -import org.apache.cloudstack.storage.image.ImageDataStoreDriver; -import org.apache.log4j.Logger; - -import com.cloud.agent.AgentManager; -import com.cloud.agent.api.Answer; -import com.cloud.agent.api.DeleteSnapshotBackupCommand; -import com.cloud.agent.api.storage.DeleteVolumeCommand; -import com.cloud.agent.api.to.S3TO; -import com.cloud.agent.api.to.SwiftTO; -import com.cloud.host.HostVO; -import com.cloud.host.dao.HostDao; -import com.cloud.storage.RegisterVolumePayload; -import com.cloud.storage.Storage.ImageFormat; -import com.cloud.storage.SnapshotVO; -import com.cloud.storage.VMTemplateStorageResourceAssoc; -import com.cloud.storage.VMTemplateVO; -import com.cloud.storage.VMTemplateZoneVO; -import com.cloud.storage.VolumeHostVO; -import com.cloud.storage.VolumeVO; -import com.cloud.storage.dao.SnapshotDao; -import com.cloud.storage.dao.VMTemplateDao; -import com.cloud.storage.dao.VMTemplateHostDao; -import com.cloud.storage.dao.VMTemplateZoneDao; -import com.cloud.storage.dao.VolumeDao; -import com.cloud.storage.dao.VolumeHostDao; -import com.cloud.storage.download.DownloadMonitor; -import com.cloud.storage.s3.S3Manager; -import com.cloud.storage.snapshot.SnapshotManager; -import com.cloud.storage.swift.SwiftManager; -import com.cloud.utils.exception.CloudRuntimeException; - -public class AncientImageDataStoreDriverImpl implements ImageDataStoreDriver { - private static final Logger s_logger = Logger - .getLogger(AncientImageDataStoreDriverImpl.class); - @Inject - VMTemplateZoneDao templateZoneDao; - @Inject - VMTemplateDao templateDao; - @Inject DownloadMonitor _downloadMonitor; - @Inject - VMTemplateHostDao _vmTemplateHostDao; - @Inject VolumeDao volumeDao; - @Inject VolumeHostDao volumeHostDao; - @Inject HostDao hostDao; - @Inject SnapshotDao snapshotDao; - @Inject AgentManager agentMgr; - @Inject SnapshotManager snapshotMgr; - @Inject - private SwiftManager _swiftMgr; - @Inject - private S3Manager _s3Mgr; - @Override - public String grantAccess(DataObject data, EndPoint ep) { - // TODO Auto-generated method stub - return null; - } - - @Override - public boolean revokeAccess(DataObject data, EndPoint ep) { - // TODO Auto-generated method stub - return false; - } - - @Override - public Set listObjects(DataStore store) { - // TODO Auto-generated method stub - return null; - } - - class CreateContext extends AsyncRpcConext { - final DataObject data; - public CreateContext(AsyncCompletionCallback callback, DataObject data) { - super(callback); - this.data = data; - } - } - - @Override - public void createAsync(DataObject data, - AsyncCompletionCallback callback) { - if (data.getType() == DataObjectType.TEMPLATE) { - List templateZones = this.templateZoneDao.listByTemplateId(data.getId()); - for (VMTemplateZoneVO templateZone : templateZones) { - VMTemplateVO template = this.templateDao.findById(data.getId()); - _downloadMonitor.downloadTemplateToStorage(template, templateZone.getZoneId()); - } - } else if (data.getType() == DataObjectType.VOLUME) { - VolumeVO vol = this.volumeDao.findById(data.getId()); - VolumeInfo volInfo = (VolumeInfo)data; - RegisterVolumePayload payload = (RegisterVolumePayload)volInfo.getpayload(); - _downloadMonitor.downloadVolumeToStorage(vol, vol.getDataCenterId(), payload.getUrl(), - payload.getChecksum(), ImageFormat.valueOf(payload.getFormat().toUpperCase())); - } - - CreateCmdResult result = new CreateCmdResult(null, null); - callback.complete(result); - } - - private void deleteVolume(DataObject data, AsyncCompletionCallback callback) { - // TODO Auto-generated method stub - VolumeVO vol = volumeDao.findById(data.getId()); - if (s_logger.isDebugEnabled()) { - s_logger.debug("Expunging " + vol); - } - - // Find out if the volume is present on secondary storage - VolumeHostVO volumeHost = volumeHostDao.findByVolumeId(vol.getId()); - if (volumeHost != null) { - if (volumeHost.getDownloadState() == VMTemplateStorageResourceAssoc.Status.DOWNLOADED) { - HostVO ssHost = hostDao.findById(volumeHost.getHostId()); - DeleteVolumeCommand dtCommand = new DeleteVolumeCommand( - ssHost.getStorageUrl(), volumeHost.getInstallPath()); - Answer answer = agentMgr.sendToSecStorage(ssHost, dtCommand); - if (answer == null || !answer.getResult()) { - s_logger.debug("Failed to delete " - + volumeHost - + " due to " - + ((answer == null) ? "answer is null" : answer - .getDetails())); - return; - } - } else if (volumeHost.getDownloadState() == VMTemplateStorageResourceAssoc.Status.DOWNLOAD_IN_PROGRESS) { - s_logger.debug("Volume: " + vol.getName() - + " is currently being uploaded; cant' delete it."); - throw new CloudRuntimeException( - "Please specify a volume that is not currently being uploaded."); - } - volumeHostDao.remove(volumeHost.getId()); - volumeDao.remove(vol.getId()); - CommandResult result = new CommandResult(); - callback.complete(result); - return; - } - } - - private void deleteTemplate(DataObject data, AsyncCompletionCallback callback) { - - } - - private void deleteSnapshot(DataObject data, AsyncCompletionCallback callback) { - Long snapshotId = data.getId(); - SnapshotVO snapshot = this.snapshotDao.findByIdIncludingRemoved(snapshotId); - CommandResult result = new CommandResult(); - if (snapshot == null) { - s_logger.debug("Destroying snapshot " + snapshotId + " backup failed due to unable to find snapshot "); - result.setResult("Unable to find snapshot: " + snapshotId); - callback.complete(result); - return; - } - - try { - String secondaryStoragePoolUrl = this.snapshotMgr.getSecondaryStorageURL(snapshot); - Long dcId = snapshot.getDataCenterId(); - Long accountId = snapshot.getAccountId(); - Long volumeId = snapshot.getVolumeId(); - - String backupOfSnapshot = snapshot.getBackupSnapshotId(); - if (backupOfSnapshot == null) { - callback.complete(result); - return; - } - SwiftTO swift = _swiftMgr.getSwiftTO(snapshot.getSwiftId()); - S3TO s3 = _s3Mgr.getS3TO(); - - DeleteSnapshotBackupCommand cmd = new DeleteSnapshotBackupCommand( - swift, s3, secondaryStoragePoolUrl, dcId, accountId, volumeId, - backupOfSnapshot, false); - Answer answer = agentMgr.sendToSSVM(dcId, cmd); - - if ((answer != null) && answer.getResult()) { - snapshot.setBackupSnapshotId(null); - snapshotDao.update(snapshotId, snapshot); - } else if (answer != null) { - result.setResult(answer.getDetails()); - } - } catch (Exception e) { - s_logger.debug("failed to delete snapshot: " + snapshotId + ": " + e.toString()); - result.setResult(e.toString()); - } - callback.complete(result); - } - - @Override - public void deleteAsync(DataObject data, - AsyncCompletionCallback callback) { - if (data.getType() == DataObjectType.VOLUME) { - deleteVolume(data, callback); - } else if (data.getType() == DataObjectType.TEMPLATE) { - deleteTemplate(data, callback); - } else if (data.getType() == DataObjectType.SNAPSHOT) { - deleteSnapshot(data, callback); - } - } - - @Override - public void copyAsync(DataObject srcdata, DataObject destData, - AsyncCompletionCallback callback) { - // TODO Auto-generated method stub - - } - - @Override - public boolean canCopy(DataObject srcData, DataObject destData) { - // TODO Auto-generated method stub - return false; - } - - @Override - public void resize(DataObject data, - AsyncCompletionCallback callback) { - // TODO Auto-generated method stub - - } - -} http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e64030a3/engine/storage/image/src/org/apache/cloudstack/storage/image/driver/DefaultImageDataStoreDriverImpl.java ---------------------------------------------------------------------- diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/driver/DefaultImageDataStoreDriverImpl.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/driver/DefaultImageDataStoreDriverImpl.java deleted file mode 100644 index 3d46c73..0000000 --- a/engine/storage/image/src/org/apache/cloudstack/storage/image/driver/DefaultImageDataStoreDriverImpl.java +++ /dev/null @@ -1,126 +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.driver; - -import java.util.Set; - -import javax.inject.Inject; - -import org.apache.cloudstack.engine.subsystem.api.storage.CommandResult; -import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult; -import org.apache.cloudstack.engine.subsystem.api.storage.CreateCmdResult; -import org.apache.cloudstack.engine.subsystem.api.storage.DataObject; -import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectType; -import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; -import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint; -import org.apache.cloudstack.framework.async.AsyncCompletionCallback; -import org.apache.cloudstack.storage.command.CreateObjectAnswer; -import org.apache.cloudstack.storage.command.CreateObjectCommand; -import org.apache.cloudstack.storage.endpoint.EndPointSelector; -import org.apache.cloudstack.storage.image.ImageDataStoreDriver; - -import com.cloud.storage.dao.VMTemplateDao; - -//http-read-only based image store -public class DefaultImageDataStoreDriverImpl implements ImageDataStoreDriver { - @Inject - EndPointSelector selector; - @Inject - VMTemplateDao imageDataDao; - public DefaultImageDataStoreDriverImpl() { - } - - @Override - public String grantAccess(DataObject data, EndPoint ep) { - return data.getUri(); - } - - @Override - public boolean revokeAccess(DataObject data, EndPoint ep) { - // TODO Auto-generated method stub - return true; - } - - @Override - public Set listObjects(DataStore store) { - // TODO Auto-generated method stub - return null; - } - - @Override - public void createAsync(DataObject data, - AsyncCompletionCallback callback) { - //for default http data store, can create http based template/iso - CreateCmdResult result = new CreateCmdResult("", null); - if (!data.getUri().startsWith("http")) { - result.setResult("can't register an image which is not a http link"); - callback.complete(result); - return; - } - - if (data.getSize() == null && data.getType() == DataObjectType.TEMPLATE) { - //the template size is unknown during registration, need to find out the size of template - EndPoint ep = selector.select(data); - if (ep == null) { - result.setResult("can't find storage client for:" + data.getId() + "," + data.getType()); - callback.complete(result); - return; - } - CreateObjectCommand createCmd = new CreateObjectCommand(data.getUri()); - CreateObjectAnswer answer = (CreateObjectAnswer)ep.sendMessage(createCmd); - if (answer.getResult()) { - //update imagestorevo - - result = new CreateCmdResult(answer.getPath(), answer.getSize()); - } else { - result.setResult(answer.getDetails()); - } - - } - - callback.complete(result); - } - - @Override - public void deleteAsync(DataObject data, - AsyncCompletionCallback callback) { - CommandResult result = new CommandResult(); - callback.complete(result); - } - - @Override - public boolean canCopy(DataObject srcData, DataObject destData) { - // TODO Auto-generated method stub - return false; - } - - @Override - public void copyAsync(DataObject srcdata, DataObject destData, - AsyncCompletionCallback callback) { - // TODO Auto-generated method stub - - } - - @Override - public void resize(DataObject data, - AsyncCompletionCallback callback) { - // TODO Auto-generated method stub - - } -} http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e64030a3/engine/storage/image/src/org/apache/cloudstack/storage/image/store/AncientImageDataStoreProvider.java ---------------------------------------------------------------------- diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/store/AncientImageDataStoreProvider.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/store/AncientImageDataStoreProvider.java deleted file mode 100644 index 2715dc7..0000000 --- a/engine/storage/image/src/org/apache/cloudstack/storage/image/store/AncientImageDataStoreProvider.java +++ /dev/null @@ -1,101 +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.store; - -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; -import java.util.UUID; - -import javax.inject.Inject; - -import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreDriver; -import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreLifeCycle; -import org.apache.cloudstack.engine.subsystem.api.storage.HypervisorHostListener; -import org.apache.cloudstack.engine.subsystem.api.storage.ImageDataStoreProvider; -import org.apache.cloudstack.engine.subsystem.api.storage.ScopeType; -import org.apache.cloudstack.storage.image.ImageDataStoreDriver; -import org.apache.cloudstack.storage.image.datastore.ImageDataStoreHelper; -import org.apache.cloudstack.storage.image.datastore.ImageDataStoreManager; -import org.apache.cloudstack.storage.image.driver.AncientImageDataStoreDriverImpl; -import org.apache.cloudstack.storage.image.store.lifecycle.DefaultImageDataStoreLifeCycle; -import org.apache.cloudstack.storage.image.store.lifecycle.ImageDataStoreLifeCycle; -import org.springframework.stereotype.Component; - -import com.cloud.utils.component.ComponentContext; - -@Component -public class AncientImageDataStoreProvider implements ImageDataStoreProvider { - - private final String name = "ancient image data store"; - protected ImageDataStoreLifeCycle lifeCycle; - protected ImageDataStoreDriver driver; - @Inject - ImageDataStoreManager storeMgr; - @Inject - ImageDataStoreHelper helper; - - @Override - public DataStoreLifeCycle getDataStoreLifeCycle() { - return lifeCycle; - } - - @Override - public String getName() { - return this.name; - } - - @Override - public boolean configure(Map params) { - lifeCycle = ComponentContext.inject(DefaultImageDataStoreLifeCycle.class); - driver = ComponentContext.inject(AncientImageDataStoreDriverImpl.class); - - storeMgr.registerDriver(this.getName(), driver); - - Map infos = new HashMap(); - String dataStoreName = UUID.nameUUIDFromBytes(this.name.getBytes()).toString(); - infos.put("name", dataStoreName); - infos.put("uuid", dataStoreName); - infos.put("protocol", "http"); - infos.put("scope", ScopeType.GLOBAL); - infos.put("providerName", this.getName()); - DataStoreLifeCycle lifeCycle = this.getDataStoreLifeCycle(); - lifeCycle.initialize(infos); - return true; - } - - @Override - public DataStoreDriver getDataStoreDriver() { - return this.driver; - } - - @Override - public HypervisorHostListener getHostListener() { - return null; - } - - @Override - public Set getTypes() { - Set types = new HashSet(); - types.add(DataStoreProviderType.IMAGE); - return types; - } - -} http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e64030a3/engine/storage/image/src/org/apache/cloudstack/storage/image/store/DefaultImageDataStoreProvider.java ---------------------------------------------------------------------- diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/store/DefaultImageDataStoreProvider.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/store/DefaultImageDataStoreProvider.java deleted file mode 100644 index 0b5de85..0000000 --- a/engine/storage/image/src/org/apache/cloudstack/storage/image/store/DefaultImageDataStoreProvider.java +++ /dev/null @@ -1,82 +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.store; - -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - -import javax.inject.Inject; - -import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreDriver; -import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreLifeCycle; -import org.apache.cloudstack.engine.subsystem.api.storage.HypervisorHostListener; -import org.apache.cloudstack.engine.subsystem.api.storage.ImageDataStoreProvider; -import org.apache.cloudstack.storage.image.ImageDataStoreDriver; -import org.apache.cloudstack.storage.image.datastore.ImageDataStoreManager; -import org.apache.cloudstack.storage.image.driver.DefaultImageDataStoreDriverImpl; -import org.apache.cloudstack.storage.image.store.lifecycle.DefaultImageDataStoreLifeCycle; -import org.apache.cloudstack.storage.image.store.lifecycle.ImageDataStoreLifeCycle; - -import com.cloud.utils.component.ComponentContext; - -public class DefaultImageDataStoreProvider implements ImageDataStoreProvider { - private final String name = "default image data store"; - protected ImageDataStoreLifeCycle lifeCycle; - protected ImageDataStoreDriver driver; - @Inject - ImageDataStoreManager storeMgr; - long id; - String uuid; - @Override - public DataStoreLifeCycle getDataStoreLifeCycle() { - return lifeCycle; - } - - @Override - public String getName() { - return this.name; - } - - @Override - public boolean configure(Map params) { - lifeCycle = ComponentContext.inject(DefaultImageDataStoreLifeCycle.class); - driver = ComponentContext.inject(DefaultImageDataStoreDriverImpl.class); - - storeMgr.registerDriver(this.getName(), driver); - return true; - } - - @Override - public Set getTypes() { - Set types = new HashSet(); - types.add(DataStoreProviderType.IMAGE); - return types; - } - - @Override - public DataStoreDriver getDataStoreDriver() { - return this.driver; - } - - @Override - public HypervisorHostListener getHostListener() { - return null; - } -} http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e64030a3/engine/storage/image/src/org/apache/cloudstack/storage/image/store/lifecycle/DefaultImageDataStoreLifeCycle.java ---------------------------------------------------------------------- diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/store/lifecycle/DefaultImageDataStoreLifeCycle.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/store/lifecycle/DefaultImageDataStoreLifeCycle.java deleted file mode 100644 index ba29c1a..0000000 --- a/engine/storage/image/src/org/apache/cloudstack/storage/image/store/lifecycle/DefaultImageDataStoreLifeCycle.java +++ /dev/null @@ -1,107 +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.store.lifecycle; - -import java.util.Map; - -import javax.inject.Inject; - -import org.apache.cloudstack.engine.subsystem.api.storage.ClusterScope; -import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; -import org.apache.cloudstack.engine.subsystem.api.storage.HostScope; -import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope; -import org.apache.cloudstack.storage.image.datastore.ImageDataStoreHelper; -import org.apache.cloudstack.storage.image.datastore.ImageDataStoreManager; -import org.apache.cloudstack.storage.image.db.ImageDataStoreDao; -import org.apache.cloudstack.storage.image.db.ImageDataStoreVO; - -import com.cloud.agent.api.StoragePoolInfo; - -public class DefaultImageDataStoreLifeCycle implements ImageDataStoreLifeCycle { - @Inject - protected ImageDataStoreDao imageStoreDao; - @Inject - ImageDataStoreHelper imageStoreHelper; - @Inject - ImageDataStoreManager imageStoreMgr; - public DefaultImageDataStoreLifeCycle() { - } - - - @Override - public DataStore initialize(Map dsInfos) { - ImageDataStoreVO ids = imageStoreHelper.createImageDataStore(dsInfos); - return imageStoreMgr.getImageDataStore(ids.getId()); - } - - - @Override - public boolean attachCluster(DataStore store, ClusterScope scope) { - // TODO Auto-generated method stub - return false; - } - - - @Override - public boolean attachHost(DataStore store, HostScope scope, - StoragePoolInfo existingInfo) { - // TODO Auto-generated method stub - return false; - } - - - @Override - public boolean attachZone(DataStore dataStore, ZoneScope scope) { - // TODO Auto-generated method stub - return false; - } - - - @Override - public boolean dettach() { - // TODO Auto-generated method stub - return false; - } - - - @Override - public boolean unmanaged() { - // TODO Auto-generated method stub - return false; - } - - - @Override - public boolean maintain(DataStore store) { - // TODO Auto-generated method stub - return false; - } - - - @Override - public boolean cancelMaintain(DataStore store) { - // TODO Auto-generated method stub - return false; - } - - - @Override - public boolean deleteDataStore(DataStore store) { - // TODO Auto-generated method stub - return false; - } -} http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e64030a3/engine/storage/integration-test/test/org/apache/cloudstack/storage/allocator/StorageAllocatorTest.java ---------------------------------------------------------------------- diff --git a/engine/storage/integration-test/test/org/apache/cloudstack/storage/allocator/StorageAllocatorTest.java b/engine/storage/integration-test/test/org/apache/cloudstack/storage/allocator/StorageAllocatorTest.java index 9444fa5..c6ebf2e 100644 --- a/engine/storage/integration-test/test/org/apache/cloudstack/storage/allocator/StorageAllocatorTest.java +++ b/engine/storage/integration-test/test/org/apache/cloudstack/storage/allocator/StorageAllocatorTest.java @@ -121,7 +121,7 @@ public class StorageAllocatorTest { cluster = clusterDao.persist(cluster); clusterId = cluster.getId(); - DataStoreProvider provider = providerMgr.getDataStoreProvider("ancient primary data store provider"); + DataStoreProvider provider = providerMgr.getDataStoreProvider("cloudstack primary data store provider"); storage = new StoragePoolVO(); storage.setDataCenterId(dcId); storage.setPodId(podId); @@ -164,7 +164,7 @@ public class StorageAllocatorTest { try { createDb(); - DataStoreProvider provider = providerMgr.getDataStoreProvider("ancient primary data store provider"); + DataStoreProvider provider = providerMgr.getDataStoreProvider("cloudstack primary data store provider"); storage = new StoragePoolVO(); storage.setDataCenterId(dcId); storage.setPodId(podId); http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e64030a3/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/volumeServiceTest.java ---------------------------------------------------------------------- diff --git a/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/volumeServiceTest.java b/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/volumeServiceTest.java index 35a1790..b542e85 100644 --- a/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/volumeServiceTest.java +++ b/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/volumeServiceTest.java @@ -262,7 +262,7 @@ public class volumeServiceTest extends CloudStackTestNGBase { @Test public void testCreatePrimaryStorage() { - DataStoreProvider provider = dataStoreProviderMgr.getDataStoreProvider("default primary data store provider"); + DataStoreProvider provider = dataStoreProviderMgr.getDataStoreProvider("sample primary data store provider"); Map params = new HashMap(); URI uri = null; try { @@ -290,7 +290,7 @@ public class volumeServiceTest extends CloudStackTestNGBase { } private DataStore createImageStore() { - DataStoreProvider provider = dataStoreProviderMgr.getDataStoreProvider("default image data store"); + DataStoreProvider provider = dataStoreProviderMgr.getDataStoreProvider("sample image data store provider"); Map params = new HashMap(); String name = UUID.randomUUID().toString(); params.put("name", name); @@ -310,7 +310,7 @@ public class volumeServiceTest extends CloudStackTestNGBase { public DataStore createPrimaryDataStore() { try { - DataStoreProvider provider = dataStoreProviderMgr.getDataStoreProvider("default primary data store provider"); + DataStoreProvider provider = dataStoreProviderMgr.getDataStoreProvider("sample primary data store provider"); Map params = new HashMap(); URI uri = new URI(this.getPrimaryStorageUrl()); params.put("url", this.getPrimaryStorageUrl()); @@ -331,7 +331,7 @@ public class volumeServiceTest extends CloudStackTestNGBase { lifeCycle.attachCluster(store, scope); /* - PrimaryDataStoreProvider provider = primaryDataStoreProviderMgr.getDataStoreProvider("default primary data store provider"); + PrimaryDataStoreProvider provider = primaryDataStoreProviderMgr.getDataStoreProvider("sample primary data store provider"); primaryDataStoreProviderMgr.configure("primary data store mgr", new HashMap()); List ds = primaryStoreDao.findPoolByName(this.primaryName); http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e64030a3/engine/storage/src/org/apache/cloudstack/storage/datastore/provider/DataStoreProviderManagerImpl.java ---------------------------------------------------------------------- diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/provider/DataStoreProviderManagerImpl.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/provider/DataStoreProviderManagerImpl.java index 91b6c63..f7d7167 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/datastore/provider/DataStoreProviderManagerImpl.java +++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/provider/DataStoreProviderManagerImpl.java @@ -129,7 +129,7 @@ public class DataStoreProviderManagerImpl extends ManagerBase implements DataSto @Override public DataStoreProvider getDefaultPrimaryDataStoreProvider() { - return this.getDataStoreProvider("ancient primary data store provider"); + return this.getDataStoreProvider("cloudstack primary data store provider"); } @Override http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e64030a3/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/driver/DefaultPrimaryDataStoreDriverImpl.java ---------------------------------------------------------------------- diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/driver/DefaultPrimaryDataStoreDriverImpl.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/driver/DefaultPrimaryDataStoreDriverImpl.java deleted file mode 100644 index 6d0c2c6..0000000 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/driver/DefaultPrimaryDataStoreDriverImpl.java +++ /dev/null @@ -1,249 +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.datastore.driver; - -import java.net.URISyntaxException; -import java.util.Set; - -import javax.inject.Inject; - -import org.apache.cloudstack.engine.subsystem.api.storage.CommandResult; -import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult; -import org.apache.cloudstack.engine.subsystem.api.storage.CreateCmdResult; -import org.apache.cloudstack.engine.subsystem.api.storage.DataObject; -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.PrimaryDataStoreDriver; -import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotInfo; -import org.apache.cloudstack.framework.async.AsyncCallbackDispatcher; -import org.apache.cloudstack.framework.async.AsyncCompletionCallback; -import org.apache.cloudstack.framework.async.AsyncRpcConext; -import org.apache.cloudstack.storage.command.CreateObjectAnswer; -import org.apache.cloudstack.storage.command.CreateObjectCommand; -import org.apache.cloudstack.storage.command.DeleteCommand; -import org.apache.cloudstack.storage.datastore.DataObjectManager; -import org.apache.cloudstack.storage.endpoint.EndPointSelector; -import org.apache.log4j.Logger; - -import com.cloud.agent.api.Answer; -import com.cloud.storage.dao.StoragePoolHostDao; -import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.utils.storage.encoding.DecodedDataObject; -import com.cloud.utils.storage.encoding.Decoder; - - -public class DefaultPrimaryDataStoreDriverImpl implements PrimaryDataStoreDriver { - private static final Logger s_logger = Logger.getLogger(DefaultPrimaryDataStoreDriverImpl.class); - @Inject - EndPointSelector selector; - @Inject - StoragePoolHostDao storeHostDao; - @Inject - DataObjectManager dataObjMgr; - public DefaultPrimaryDataStoreDriverImpl() { - - } - - private class CreateVolumeContext extends AsyncRpcConext { - private final DataObject volume; - /** - * @param callback - */ - public CreateVolumeContext(AsyncCompletionCallback callback, DataObject volume) { - super(callback); - this.volume = volume; - } - - public DataObject getVolume() { - return this.volume; - } - - } - - public Void createAsyncCallback(AsyncCallbackDispatcher callback, CreateVolumeContext context) { - CreateCmdResult result = null; - CreateObjectAnswer volAnswer = (CreateObjectAnswer) callback.getResult(); - if (volAnswer.getResult()) { - result = new CreateCmdResult(volAnswer.getPath(), volAnswer.getSize()); - } else { - result = new CreateCmdResult("", null); - result.setResult(volAnswer.getDetails()); - } - - context.getParentCallback().complete(result); - return null; - } - - @Override - public void deleteAsync(DataObject vo, AsyncCompletionCallback callback) { - DeleteCommand cmd = new DeleteCommand(vo.getUri()); - - EndPoint ep = selector.select(vo); - AsyncRpcConext context = new AsyncRpcConext(callback); - AsyncCallbackDispatcher caller = AsyncCallbackDispatcher.create(this); - caller.setCallback(caller.getTarget().deleteCallback(null, null)) - .setContext(context); - ep.sendMessageAsync(cmd, caller); - } - - public Void deleteCallback(AsyncCallbackDispatcher callback, AsyncRpcConext context) { - CommandResult result = new CommandResult(); - Answer answer = callback.getResult(); - if (!answer.getResult()) { - result.setResult(answer.getDetails()); - } - context.getParentCallback().complete(result); - return null; - } - /* - private class CreateVolumeFromBaseImageContext extends AsyncRpcConext { - private final VolumeObject volume; - - public CreateVolumeFromBaseImageContext(AsyncCompletionCallback callback, VolumeObject volume) { - super(callback); - this.volume = volume; - } - - public VolumeObject getVolume() { - return this.volume; - } - - } - - @Override - public void createVolumeFromBaseImageAsync(VolumeObject volume, TemplateInfo template, AsyncCompletionCallback callback) { - VolumeTO vol = this.dataStore.getVolumeTO(volume); - List endPoints = this.dataStore.getEndPoints(); - EndPoint ep = endPoints.get(0); - String templateUri = template.getDataStore().grantAccess(template, ep); - CreateVolumeFromBaseImageCommand cmd = new CreateVolumeFromBaseImageCommand(vol, templateUri); - - CreateVolumeFromBaseImageContext context = new CreateVolumeFromBaseImageContext(callback, volume); - AsyncCallbackDispatcher caller = AsyncCallbackDispatcher.create(this); - caller.setContext(context) - .setCallback(caller.getTarget().createVolumeFromBaseImageAsyncCallback(null, null)); - - ep.sendMessageAsync(cmd, caller); - }*/ - /* - public Object createVolumeFromBaseImageAsyncCallback(AsyncCallbackDispatcher callback, CreateVolumeFromBaseImageContext context) { - CreateVolumeAnswer answer = (CreateVolumeAnswer)callback.getResult(); - CommandResult result = new CommandResult(); - if (answer == null || answer.getDetails() != null) { - result.setSucess(false); - if (answer != null) { - result.setResult(answer.getDetails()); - } - } else { - result.setSucess(true); - VolumeObject volume = context.getVolume(); - volume.setPath(answer.getVolumeUuid()); - } - AsyncCompletionCallback parentCall = context.getParentCallback(); - parentCall.complete(result); - return null; - }*/ - - @Override - public void createAsync(DataObject vol, - AsyncCompletionCallback callback) { - EndPoint ep = selector.select(vol); - CreateObjectCommand createCmd = new CreateObjectCommand(vol.getUri()); - - CreateVolumeContext context = new CreateVolumeContext(callback, vol); - AsyncCallbackDispatcher caller = AsyncCallbackDispatcher.create(this); - caller.setContext(context) - .setCallback(caller.getTarget().createAsyncCallback(null, null)); - - ep.sendMessageAsync(createCmd, caller); - } - - @Override - public String grantAccess(DataObject object, EndPoint ep) { - //StoragePoolHostVO poolHost = storeHostDao.findByPoolHost(object.getDataStore().getId(), ep.getId()); - - String uri = object.getUri(); - try { - DecodedDataObject obj = Decoder.decode(uri); - if (obj.getPath() == null) { - //create an obj - EndPoint newEp = selector.select(object); - CreateObjectCommand createCmd = new CreateObjectCommand(uri); - CreateObjectAnswer answer = (CreateObjectAnswer)ep.sendMessage(createCmd); - if (answer.getResult()) { - dataObjMgr.update(object, answer.getPath(), answer.getSize()); - } else { - s_logger.debug("failed to create object" + answer.getDetails()); - throw new CloudRuntimeException("failed to create object" + answer.getDetails()); - } - } - - return object.getUri(); - } catch (URISyntaxException e) { - throw new CloudRuntimeException("uri parsed error", e); - } - } - - @Override - public boolean revokeAccess(DataObject vol, EndPoint ep) { - // TODO Auto-generated method stub - return false; - } - - @Override - public Set listObjects(DataStore store) { - // TODO Auto-generated method stub - return null; - } - - @Override - public void revertSnapshot(SnapshotInfo snapshot, - AsyncCompletionCallback callback) { - // TODO Auto-generated method stub - - } - - - - @Override - public boolean canCopy(DataObject srcData, DataObject destData) { - // TODO Auto-generated method stub - return false; - } - - @Override - public void copyAsync(DataObject srcdata, DataObject destData, - AsyncCompletionCallback callback) { - // TODO Auto-generated method stub - - } - - @Override - public void resize(DataObject data, - AsyncCompletionCallback callback) { - // TODO Auto-generated method stub - - } - - @Override - public void takeSnapshot(SnapshotInfo snapshot, - AsyncCompletionCallback callback) { - // TODO Auto-generated method stub - - } - -} http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e64030a3/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/lifecycle/DefaultPrimaryDataStoreLifeCycleImpl.java ---------------------------------------------------------------------- diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/lifecycle/DefaultPrimaryDataStoreLifeCycleImpl.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/lifecycle/DefaultPrimaryDataStoreLifeCycleImpl.java deleted file mode 100644 index fea02e8..0000000 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/lifecycle/DefaultPrimaryDataStoreLifeCycleImpl.java +++ /dev/null @@ -1,147 +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.datastore.lifecycle; - -import java.util.List; -import java.util.Map; - -import javax.inject.Inject; - -import org.apache.cloudstack.engine.subsystem.api.storage.ClusterScope; -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.HostScope; -import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreLifeCycle; -import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope; -import org.apache.cloudstack.storage.command.AttachPrimaryDataStoreCmd; -import org.apache.cloudstack.storage.command.CreatePrimaryDataStoreCmd; -import org.apache.cloudstack.storage.datastore.PrimaryDataStoreProviderManager; -import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; -import org.apache.cloudstack.storage.datastore.db.StoragePoolVO; -import org.apache.cloudstack.storage.endpoint.EndPointSelector; -import org.apache.cloudstack.storage.volume.datastore.PrimaryDataStoreHelper; - -import com.cloud.agent.api.StoragePoolInfo; -import com.cloud.host.HostVO; -import com.cloud.host.dao.HostDao; -import com.cloud.hypervisor.Hypervisor.HypervisorType; -import com.cloud.storage.StoragePoolStatus; - -public class DefaultPrimaryDataStoreLifeCycleImpl implements PrimaryDataStoreLifeCycle { - @Inject - EndPointSelector selector; - @Inject - PrimaryDataStoreDao dataStoreDao; - @Inject - HostDao hostDao; - @Inject - PrimaryDataStoreHelper primaryStoreHelper; - @Inject - PrimaryDataStoreProviderManager providerMgr; - public DefaultPrimaryDataStoreLifeCycleImpl() { - } - - @Override - public DataStore initialize(Map dsInfos) { - - DataStore store = primaryStoreHelper.createPrimaryDataStore(null); - return providerMgr.getPrimaryDataStore(store.getId()); - } - - protected void attachCluster(DataStore store) { - //send down AttachPrimaryDataStoreCmd command to all the hosts in the cluster - List endPoints = selector.selectAll(store); - CreatePrimaryDataStoreCmd createCmd = new CreatePrimaryDataStoreCmd(store.getUri()); - EndPoint ep = endPoints.get(0); - HostVO host = hostDao.findById(ep.getId()); - if (host.getHypervisorType() == HypervisorType.XenServer) { - ep.sendMessage(createCmd); - } - - endPoints.get(0).sendMessage(createCmd); - AttachPrimaryDataStoreCmd cmd = new AttachPrimaryDataStoreCmd(store.getUri()); - for (EndPoint endp : endPoints) { - endp.sendMessage(cmd); - } - } - - @Override - public boolean attachCluster(DataStore dataStore, ClusterScope scope) { - StoragePoolVO dataStoreVO = dataStoreDao.findById(dataStore.getId()); - dataStoreVO.setDataCenterId(scope.getZoneId()); - dataStoreVO.setPodId(scope.getPodId()); - dataStoreVO.setClusterId(scope.getScopeId()); - dataStoreVO.setStatus(StoragePoolStatus.Attaching); - dataStoreVO.setScope(scope.getScopeType()); - dataStoreDao.update(dataStoreVO.getId(), dataStoreVO); - - - attachCluster(dataStore); - - dataStoreVO = dataStoreDao.findById(dataStore.getId()); - dataStoreVO.setStatus(StoragePoolStatus.Up); - dataStoreDao.update(dataStoreVO.getId(), dataStoreVO); - - return true; - } - - @Override - public boolean dettach() { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean unmanaged() { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean attachZone(DataStore dataStore, ZoneScope scope) { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean attachHost(DataStore store, HostScope scope, - StoragePoolInfo existingInfo) { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean maintain(DataStore store) { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean cancelMaintain(DataStore store) { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean deleteDataStore(DataStore store) { - // TODO Auto-generated method stub - return false; - } - -} http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e64030a3/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/provider/DefaultPrimaryDatastoreProviderImpl.java ---------------------------------------------------------------------- diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/provider/DefaultPrimaryDatastoreProviderImpl.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/provider/DefaultPrimaryDatastoreProviderImpl.java deleted file mode 100644 index 46fa738..0000000 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/provider/DefaultPrimaryDatastoreProviderImpl.java +++ /dev/null @@ -1,83 +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.datastore.provider; - -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - -import javax.inject.Inject; - -import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreLifeCycle; -import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreProvider; -import org.apache.cloudstack.engine.subsystem.api.storage.HypervisorHostListener; -import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreDriver; -import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreProvider; -import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreProvider.DataStoreProviderType; -import org.apache.cloudstack.storage.datastore.PrimaryDataStoreProviderManager; -import org.apache.cloudstack.storage.datastore.driver.DefaultPrimaryDataStoreDriverImpl; -import org.apache.cloudstack.storage.datastore.lifecycle.DefaultPrimaryDataStoreLifeCycleImpl; - -import com.cloud.utils.component.ComponentContext; - - -public class DefaultPrimaryDatastoreProviderImpl implements PrimaryDataStoreProvider { - private final String providerName = "default primary data store provider"; - protected PrimaryDataStoreDriver driver; - protected HypervisorHostListener listener; - @Inject - PrimaryDataStoreProviderManager storeMgr; - - protected DataStoreLifeCycle lifecyle; - protected String uuid; - protected long id; - @Override - public String getName() { - return providerName; - } - - @Override - public DataStoreLifeCycle getDataStoreLifeCycle() { - return this.lifecyle; - } - - @Override - public boolean configure(Map params) { - lifecyle = ComponentContext.inject(DefaultPrimaryDataStoreLifeCycleImpl.class); - driver = ComponentContext.inject(DefaultPrimaryDataStoreDriverImpl.class); - listener = ComponentContext.inject(DefaultHostListener.class); - return true; - } - - @Override - public PrimaryDataStoreDriver getDataStoreDriver() { - return this.driver; - } - - @Override - public HypervisorHostListener getHostListener() { - return this.listener; - } - - @Override - public Set getTypes() { - Set types = new HashSet(); - types.add(DataStoreProviderType.PRIMARY); - return types; - } - -} http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e64030a3/engine/storage/volume/test/org/apache/cloudstack/storage/volume/test/ConfiguratorTest.java ---------------------------------------------------------------------- diff --git a/engine/storage/volume/test/org/apache/cloudstack/storage/volume/test/ConfiguratorTest.java b/engine/storage/volume/test/org/apache/cloudstack/storage/volume/test/ConfiguratorTest.java index 122c353..6ad951a 100644 --- a/engine/storage/volume/test/org/apache/cloudstack/storage/volume/test/ConfiguratorTest.java +++ b/engine/storage/volume/test/org/apache/cloudstack/storage/volume/test/ConfiguratorTest.java @@ -79,12 +79,12 @@ public class ConfiguratorTest { @Test public void getProvider() { - // assertNotNull(providerMgr.getDataStoreProvider("default primary data store provider")); + // assertNotNull(providerMgr.getDataStoreProvider("sample primary data store provider")); } @Test public void createDataStore() { - /*PrimaryDataStoreProvider provider = providerMgr.getDataStoreProvider("default primary data store provider"); + /*PrimaryDataStoreProvider provider = providerMgr.getDataStoreProvider("sample primary data store provider"); Map params = new HashMap(); params.put("url", "nfs://localhost/mnt"); params.put("clusterId", "1"); http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e64030a3/plugins/pom.xml ---------------------------------------------------------------------- diff --git a/plugins/pom.xml b/plugins/pom.xml index d7e8deb..bb738d1 100755 --- a/plugins/pom.xml +++ b/plugins/pom.xml @@ -56,8 +56,11 @@ user-authenticators/sha256salted network-elements/dns-notifier storage/image/s3 + storage/image/default + storage/image/sample storage/volume/solidfire storage/volume/default + storage/volume/sample alert-handlers/snmp-alerts alert-handlers/syslog-alerts http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e64030a3/plugins/storage/image/default/pom.xml ---------------------------------------------------------------------- diff --git a/plugins/storage/image/default/pom.xml b/plugins/storage/image/default/pom.xml new file mode 100644 index 0000000..e84eab4 --- /dev/null +++ b/plugins/storage/image/default/pom.xml @@ -0,0 +1,56 @@ + + + 4.0.0 + cloud-plugin-storage-image-default + Apache CloudStack Plugin - Storage Image default provider + + org.apache.cloudstack + cloudstack-plugins + 4.2.0-SNAPSHOT + ../../../pom.xml + + + + org.apache.cloudstack + cloud-engine-storage-image + ${project.version} + + + mysql + mysql-connector-java + ${cs.mysql.version} + provided + + + + install + src + test + + + maven-surefire-plugin + + true + + + + integration-test + + test + + + + + + + http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e64030a3/plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/driver/CloudStackImageDataStoreDriverImpl.java ---------------------------------------------------------------------- diff --git a/plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/driver/CloudStackImageDataStoreDriverImpl.java b/plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/driver/CloudStackImageDataStoreDriverImpl.java new file mode 100644 index 0000000..1ff395c --- /dev/null +++ b/plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/driver/CloudStackImageDataStoreDriverImpl.java @@ -0,0 +1,250 @@ +/* + * 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.driver; + +import java.util.List; +import java.util.Set; + +import javax.inject.Inject; + +import org.apache.cloudstack.engine.subsystem.api.storage.CommandResult; +import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult; +import org.apache.cloudstack.engine.subsystem.api.storage.CreateCmdResult; +import org.apache.cloudstack.engine.subsystem.api.storage.DataObject; +import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectType; +import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; +import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint; +import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo; +import org.apache.cloudstack.framework.async.AsyncCompletionCallback; +import org.apache.cloudstack.framework.async.AsyncRpcConext; +import org.apache.cloudstack.storage.image.ImageDataStoreDriver; +import org.apache.log4j.Logger; + +import com.cloud.agent.AgentManager; +import com.cloud.agent.api.Answer; +import com.cloud.agent.api.DeleteSnapshotBackupCommand; +import com.cloud.agent.api.storage.DeleteVolumeCommand; +import com.cloud.agent.api.to.S3TO; +import com.cloud.agent.api.to.SwiftTO; +import com.cloud.host.HostVO; +import com.cloud.host.dao.HostDao; +import com.cloud.storage.RegisterVolumePayload; +import com.cloud.storage.Storage.ImageFormat; +import com.cloud.storage.SnapshotVO; +import com.cloud.storage.VMTemplateStorageResourceAssoc; +import com.cloud.storage.VMTemplateVO; +import com.cloud.storage.VMTemplateZoneVO; +import com.cloud.storage.VolumeHostVO; +import com.cloud.storage.VolumeVO; +import com.cloud.storage.dao.SnapshotDao; +import com.cloud.storage.dao.VMTemplateDao; +import com.cloud.storage.dao.VMTemplateHostDao; +import com.cloud.storage.dao.VMTemplateZoneDao; +import com.cloud.storage.dao.VolumeDao; +import com.cloud.storage.dao.VolumeHostDao; +import com.cloud.storage.download.DownloadMonitor; +import com.cloud.storage.s3.S3Manager; +import com.cloud.storage.snapshot.SnapshotManager; +import com.cloud.storage.swift.SwiftManager; +import com.cloud.utils.exception.CloudRuntimeException; + +public class CloudStackImageDataStoreDriverImpl implements ImageDataStoreDriver { + private static final Logger s_logger = Logger + .getLogger(CloudStackImageDataStoreDriverImpl.class); + @Inject + VMTemplateZoneDao templateZoneDao; + @Inject + VMTemplateDao templateDao; + @Inject DownloadMonitor _downloadMonitor; + @Inject + VMTemplateHostDao _vmTemplateHostDao; + @Inject VolumeDao volumeDao; + @Inject VolumeHostDao volumeHostDao; + @Inject HostDao hostDao; + @Inject SnapshotDao snapshotDao; + @Inject AgentManager agentMgr; + @Inject SnapshotManager snapshotMgr; + @Inject + private SwiftManager _swiftMgr; + @Inject + private S3Manager _s3Mgr; + @Override + public String grantAccess(DataObject data, EndPoint ep) { + // TODO Auto-generated method stub + return null; + } + + @Override + public boolean revokeAccess(DataObject data, EndPoint ep) { + // TODO Auto-generated method stub + return false; + } + + @Override + public Set listObjects(DataStore store) { + // TODO Auto-generated method stub + return null; + } + + class CreateContext extends AsyncRpcConext { + final DataObject data; + public CreateContext(AsyncCompletionCallback callback, DataObject data) { + super(callback); + this.data = data; + } + } + + @Override + public void createAsync(DataObject data, + AsyncCompletionCallback callback) { + if (data.getType() == DataObjectType.TEMPLATE) { + List templateZones = this.templateZoneDao.listByTemplateId(data.getId()); + for (VMTemplateZoneVO templateZone : templateZones) { + VMTemplateVO template = this.templateDao.findById(data.getId()); + _downloadMonitor.downloadTemplateToStorage(template, templateZone.getZoneId()); + } + } else if (data.getType() == DataObjectType.VOLUME) { + VolumeVO vol = this.volumeDao.findById(data.getId()); + VolumeInfo volInfo = (VolumeInfo)data; + RegisterVolumePayload payload = (RegisterVolumePayload)volInfo.getpayload(); + _downloadMonitor.downloadVolumeToStorage(vol, vol.getDataCenterId(), payload.getUrl(), + payload.getChecksum(), ImageFormat.valueOf(payload.getFormat().toUpperCase())); + } + + CreateCmdResult result = new CreateCmdResult(null, null); + callback.complete(result); + } + + private void deleteVolume(DataObject data, AsyncCompletionCallback callback) { + // TODO Auto-generated method stub + VolumeVO vol = volumeDao.findById(data.getId()); + if (s_logger.isDebugEnabled()) { + s_logger.debug("Expunging " + vol); + } + + // Find out if the volume is present on secondary storage + VolumeHostVO volumeHost = volumeHostDao.findByVolumeId(vol.getId()); + if (volumeHost != null) { + if (volumeHost.getDownloadState() == VMTemplateStorageResourceAssoc.Status.DOWNLOADED) { + HostVO ssHost = hostDao.findById(volumeHost.getHostId()); + DeleteVolumeCommand dtCommand = new DeleteVolumeCommand( + ssHost.getStorageUrl(), volumeHost.getInstallPath()); + Answer answer = agentMgr.sendToSecStorage(ssHost, dtCommand); + if (answer == null || !answer.getResult()) { + s_logger.debug("Failed to delete " + + volumeHost + + " due to " + + ((answer == null) ? "answer is null" : answer + .getDetails())); + return; + } + } else if (volumeHost.getDownloadState() == VMTemplateStorageResourceAssoc.Status.DOWNLOAD_IN_PROGRESS) { + s_logger.debug("Volume: " + vol.getName() + + " is currently being uploaded; cant' delete it."); + throw new CloudRuntimeException( + "Please specify a volume that is not currently being uploaded."); + } + volumeHostDao.remove(volumeHost.getId()); + volumeDao.remove(vol.getId()); + CommandResult result = new CommandResult(); + callback.complete(result); + return; + } + } + + private void deleteTemplate(DataObject data, AsyncCompletionCallback callback) { + + } + + private void deleteSnapshot(DataObject data, AsyncCompletionCallback callback) { + Long snapshotId = data.getId(); + SnapshotVO snapshot = this.snapshotDao.findByIdIncludingRemoved(snapshotId); + CommandResult result = new CommandResult(); + if (snapshot == null) { + s_logger.debug("Destroying snapshot " + snapshotId + " backup failed due to unable to find snapshot "); + result.setResult("Unable to find snapshot: " + snapshotId); + callback.complete(result); + return; + } + + try { + String secondaryStoragePoolUrl = this.snapshotMgr.getSecondaryStorageURL(snapshot); + Long dcId = snapshot.getDataCenterId(); + Long accountId = snapshot.getAccountId(); + Long volumeId = snapshot.getVolumeId(); + + String backupOfSnapshot = snapshot.getBackupSnapshotId(); + if (backupOfSnapshot == null) { + callback.complete(result); + return; + } + SwiftTO swift = _swiftMgr.getSwiftTO(snapshot.getSwiftId()); + S3TO s3 = _s3Mgr.getS3TO(); + + DeleteSnapshotBackupCommand cmd = new DeleteSnapshotBackupCommand( + swift, s3, secondaryStoragePoolUrl, dcId, accountId, volumeId, + backupOfSnapshot, false); + Answer answer = agentMgr.sendToSSVM(dcId, cmd); + + if ((answer != null) && answer.getResult()) { + snapshot.setBackupSnapshotId(null); + snapshotDao.update(snapshotId, snapshot); + } else if (answer != null) { + result.setResult(answer.getDetails()); + } + } catch (Exception e) { + s_logger.debug("failed to delete snapshot: " + snapshotId + ": " + e.toString()); + result.setResult(e.toString()); + } + callback.complete(result); + } + + @Override + public void deleteAsync(DataObject data, + AsyncCompletionCallback callback) { + if (data.getType() == DataObjectType.VOLUME) { + deleteVolume(data, callback); + } else if (data.getType() == DataObjectType.TEMPLATE) { + deleteTemplate(data, callback); + } else if (data.getType() == DataObjectType.SNAPSHOT) { + deleteSnapshot(data, callback); + } + } + + @Override + public void copyAsync(DataObject srcdata, DataObject destData, + AsyncCompletionCallback callback) { + // TODO Auto-generated method stub + + } + + @Override + public boolean canCopy(DataObject srcData, DataObject destData) { + // TODO Auto-generated method stub + return false; + } + + @Override + public void resize(DataObject data, + AsyncCompletionCallback callback) { + // TODO Auto-generated method stub + + } + +} http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e64030a3/plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackImageDataStoreLifeCycle.java ---------------------------------------------------------------------- diff --git a/plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackImageDataStoreLifeCycle.java b/plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackImageDataStoreLifeCycle.java new file mode 100644 index 0000000..d896517 --- /dev/null +++ b/plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackImageDataStoreLifeCycle.java @@ -0,0 +1,108 @@ +// 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.lifecycle; + +import java.util.Map; + +import javax.inject.Inject; + +import org.apache.cloudstack.engine.subsystem.api.storage.ClusterScope; +import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; +import org.apache.cloudstack.engine.subsystem.api.storage.HostScope; +import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope; +import org.apache.cloudstack.storage.image.datastore.ImageDataStoreHelper; +import org.apache.cloudstack.storage.image.datastore.ImageDataStoreManager; +import org.apache.cloudstack.storage.image.db.ImageDataStoreDao; +import org.apache.cloudstack.storage.image.db.ImageDataStoreVO; +import org.apache.cloudstack.storage.image.store.lifecycle.ImageDataStoreLifeCycle; + +import com.cloud.agent.api.StoragePoolInfo; + +public class CloudStackImageDataStoreLifeCycle implements ImageDataStoreLifeCycle { + @Inject + protected ImageDataStoreDao imageStoreDao; + @Inject + ImageDataStoreHelper imageStoreHelper; + @Inject + ImageDataStoreManager imageStoreMgr; + public CloudStackImageDataStoreLifeCycle() { + } + + + @Override + public DataStore initialize(Map dsInfos) { + ImageDataStoreVO ids = imageStoreHelper.createImageDataStore(dsInfos); + return imageStoreMgr.getImageDataStore(ids.getId()); + } + + + @Override + public boolean attachCluster(DataStore store, ClusterScope scope) { + // TODO Auto-generated method stub + return false; + } + + + @Override + public boolean attachHost(DataStore store, HostScope scope, + StoragePoolInfo existingInfo) { + // TODO Auto-generated method stub + return false; + } + + + @Override + public boolean attachZone(DataStore dataStore, ZoneScope scope) { + // TODO Auto-generated method stub + return false; + } + + + @Override + public boolean dettach() { + // TODO Auto-generated method stub + return false; + } + + + @Override + public boolean unmanaged() { + // TODO Auto-generated method stub + return false; + } + + + @Override + public boolean maintain(DataStore store) { + // TODO Auto-generated method stub + return false; + } + + + @Override + public boolean cancelMaintain(DataStore store) { + // TODO Auto-generated method stub + return false; + } + + + @Override + public boolean deleteDataStore(DataStore store) { + // TODO Auto-generated method stub + return false; + } +} http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e64030a3/plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/provider/CloudStackImageDataStoreProvider.java ---------------------------------------------------------------------- diff --git a/plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/provider/CloudStackImageDataStoreProvider.java b/plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/provider/CloudStackImageDataStoreProvider.java new file mode 100644 index 0000000..1358c9f --- /dev/null +++ b/plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/provider/CloudStackImageDataStoreProvider.java @@ -0,0 +1,101 @@ +/* + * 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.provider; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.UUID; + +import javax.inject.Inject; + +import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreDriver; +import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreLifeCycle; +import org.apache.cloudstack.engine.subsystem.api.storage.HypervisorHostListener; +import org.apache.cloudstack.engine.subsystem.api.storage.ImageDataStoreProvider; +import org.apache.cloudstack.engine.subsystem.api.storage.ScopeType; +import org.apache.cloudstack.storage.datastore.driver.CloudStackImageDataStoreDriverImpl; +import org.apache.cloudstack.storage.datastore.lifecycle.CloudStackImageDataStoreLifeCycle; +import org.apache.cloudstack.storage.image.ImageDataStoreDriver; +import org.apache.cloudstack.storage.image.datastore.ImageDataStoreHelper; +import org.apache.cloudstack.storage.image.datastore.ImageDataStoreManager; +import org.apache.cloudstack.storage.image.store.lifecycle.ImageDataStoreLifeCycle; +import org.springframework.stereotype.Component; + +import com.cloud.utils.component.ComponentContext; + +@Component +public class CloudStackImageDataStoreProvider implements ImageDataStoreProvider { + + private final String name = "cloudstack image data store provider"; + protected ImageDataStoreLifeCycle lifeCycle; + protected ImageDataStoreDriver driver; + @Inject + ImageDataStoreManager storeMgr; + @Inject + ImageDataStoreHelper helper; + + @Override + public DataStoreLifeCycle getDataStoreLifeCycle() { + return lifeCycle; + } + + @Override + public String getName() { + return this.name; + } + + @Override + public boolean configure(Map params) { + lifeCycle = ComponentContext.inject(CloudStackImageDataStoreLifeCycle.class); + driver = ComponentContext.inject(CloudStackImageDataStoreDriverImpl.class); + + storeMgr.registerDriver(this.getName(), driver); + + Map infos = new HashMap(); + String dataStoreName = UUID.nameUUIDFromBytes(this.name.getBytes()).toString(); + infos.put("name", dataStoreName); + infos.put("uuid", dataStoreName); + infos.put("protocol", "http"); + infos.put("scope", ScopeType.GLOBAL); + infos.put("providerName", this.getName()); + DataStoreLifeCycle lifeCycle = this.getDataStoreLifeCycle(); + lifeCycle.initialize(infos); + return true; + } + + @Override + public DataStoreDriver getDataStoreDriver() { + return this.driver; + } + + @Override + public HypervisorHostListener getHostListener() { + return null; + } + + @Override + public Set getTypes() { + Set types = new HashSet(); + types.add(DataStoreProviderType.IMAGE); + return types; + } + +} http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e64030a3/plugins/storage/image/sample/pom.xml ---------------------------------------------------------------------- diff --git a/plugins/storage/image/sample/pom.xml b/plugins/storage/image/sample/pom.xml new file mode 100644 index 0000000..e4d5ac2 --- /dev/null +++ b/plugins/storage/image/sample/pom.xml @@ -0,0 +1,56 @@ + + + 4.0.0 + cloud-plugin-storage-image-sample + Apache CloudStack Plugin - Storage Image sample provider + + org.apache.cloudstack + cloudstack-plugins + 4.2.0-SNAPSHOT + ../../../pom.xml + + + + org.apache.cloudstack + cloud-engine-storage-image + ${project.version} + + + mysql + mysql-connector-java + ${cs.mysql.version} + provided + + + + install + src + test + + + maven-surefire-plugin + + true + + + + integration-test + + test + + + + + + +