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 34C0BF242 for ; Fri, 29 Mar 2013 23:36:03 +0000 (UTC) Received: (qmail 64992 invoked by uid 500); 29 Mar 2013 23:35:53 -0000 Delivered-To: apmail-cloudstack-commits-archive@cloudstack.apache.org Received: (qmail 64941 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 64064 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 756C883436E; 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:24 -0000 Message-Id: In-Reply-To: <074bb17f95a142908f6b8dcf07bc1cd4@git.apache.org> References: <074bb17f95a142908f6b8dcf07bc1cd4@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [34/35] Move previous AncientImageDataStore provider and DefaultImageDataStore provider code into plugins. http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e64030a3/plugins/storage/image/sample/src/org/apache/cloudstack/storage/datastore/driver/SampleImageDataStoreDriverImpl.java ---------------------------------------------------------------------- diff --git a/plugins/storage/image/sample/src/org/apache/cloudstack/storage/datastore/driver/SampleImageDataStoreDriverImpl.java b/plugins/storage/image/sample/src/org/apache/cloudstack/storage/datastore/driver/SampleImageDataStoreDriverImpl.java new file mode 100644 index 0000000..cf42ac3 --- /dev/null +++ b/plugins/storage/image/sample/src/org/apache/cloudstack/storage/datastore/driver/SampleImageDataStoreDriverImpl.java @@ -0,0 +1,126 @@ +/* + * 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.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 SampleImageDataStoreDriverImpl implements ImageDataStoreDriver { + @Inject + EndPointSelector selector; + @Inject + VMTemplateDao imageDataDao; + public SampleImageDataStoreDriverImpl() { + } + + @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/plugins/storage/image/sample/src/org/apache/cloudstack/storage/datastore/lifecycle/SampleImageDataStoreLifeCycle.java ---------------------------------------------------------------------- diff --git a/plugins/storage/image/sample/src/org/apache/cloudstack/storage/datastore/lifecycle/SampleImageDataStoreLifeCycle.java b/plugins/storage/image/sample/src/org/apache/cloudstack/storage/datastore/lifecycle/SampleImageDataStoreLifeCycle.java new file mode 100644 index 0000000..0af5afb --- /dev/null +++ b/plugins/storage/image/sample/src/org/apache/cloudstack/storage/datastore/lifecycle/SampleImageDataStoreLifeCycle.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 SampleImageDataStoreLifeCycle implements ImageDataStoreLifeCycle { + @Inject + protected ImageDataStoreDao imageStoreDao; + @Inject + ImageDataStoreHelper imageStoreHelper; + @Inject + ImageDataStoreManager imageStoreMgr; + public SampleImageDataStoreLifeCycle() { + } + + + @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/sample/src/org/apache/cloudstack/storage/datastore/provider/SampleImageDataStoreProvider.java ---------------------------------------------------------------------- diff --git a/plugins/storage/image/sample/src/org/apache/cloudstack/storage/datastore/provider/SampleImageDataStoreProvider.java b/plugins/storage/image/sample/src/org/apache/cloudstack/storage/datastore/provider/SampleImageDataStoreProvider.java new file mode 100644 index 0000000..c6a8e0a --- /dev/null +++ b/plugins/storage/image/sample/src/org/apache/cloudstack/storage/datastore/provider/SampleImageDataStoreProvider.java @@ -0,0 +1,82 @@ +/* + * 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.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.datastore.driver.SampleImageDataStoreDriverImpl; +import org.apache.cloudstack.storage.datastore.lifecycle.SampleImageDataStoreLifeCycle; +import org.apache.cloudstack.storage.image.ImageDataStoreDriver; +import org.apache.cloudstack.storage.image.datastore.ImageDataStoreManager; +import org.apache.cloudstack.storage.image.store.lifecycle.ImageDataStoreLifeCycle; + +import com.cloud.utils.component.ComponentContext; + +public class SampleImageDataStoreProvider implements ImageDataStoreProvider { + private final String name = "sample image data store provider"; + 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(SampleImageDataStoreLifeCycle.class); + driver = ComponentContext.inject(SampleImageDataStoreDriverImpl.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/plugins/storage/volume/default/src/org/apache/cloudstack/storage/datastore/provider/CloudStackPrimaryDataStoreProviderImpl.java ---------------------------------------------------------------------- diff --git a/plugins/storage/volume/default/src/org/apache/cloudstack/storage/datastore/provider/CloudStackPrimaryDataStoreProviderImpl.java b/plugins/storage/volume/default/src/org/apache/cloudstack/storage/datastore/provider/CloudStackPrimaryDataStoreProviderImpl.java index 4d46d99..af1d0c4 100644 --- a/plugins/storage/volume/default/src/org/apache/cloudstack/storage/datastore/provider/CloudStackPrimaryDataStoreProviderImpl.java +++ b/plugins/storage/volume/default/src/org/apache/cloudstack/storage/datastore/provider/CloudStackPrimaryDataStoreProviderImpl.java @@ -34,15 +34,15 @@ import com.cloud.utils.component.ComponentContext; public class CloudStackPrimaryDataStoreProviderImpl implements PrimaryDataStoreProvider { - private final String providerName = "ancient primary data store provider"; + private final String providerName = "cloudstack primary data store provider"; protected PrimaryDataStoreDriver driver; protected HypervisorHostListener listener; protected DataStoreLifeCycle lifecyle; CloudStackPrimaryDataStoreProviderImpl() { - + } - + @Override public String getName() { return providerName; @@ -70,7 +70,7 @@ public class CloudStackPrimaryDataStoreProviderImpl implements public HypervisorHostListener getHostListener() { return this.listener; } - + @Override public Set getTypes() { Set types = new HashSet(); http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e64030a3/plugins/storage/volume/sample/pom.xml ---------------------------------------------------------------------- diff --git a/plugins/storage/volume/sample/pom.xml b/plugins/storage/volume/sample/pom.xml new file mode 100644 index 0000000..2e2fdb5 --- /dev/null +++ b/plugins/storage/volume/sample/pom.xml @@ -0,0 +1,56 @@ + + + 4.0.0 + cloud-plugin-storage-volume-sample + Apache CloudStack Plugin - Storage Volume sample provider + + org.apache.cloudstack + cloudstack-plugins + 4.2.0-SNAPSHOT + ../../../pom.xml + + + + org.apache.cloudstack + cloud-engine-storage-volume + ${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/volume/sample/src/org/apache/cloudstack/storage/datastore/driver/SamplePrimaryDataStoreDriverImpl.java ---------------------------------------------------------------------- diff --git a/plugins/storage/volume/sample/src/org/apache/cloudstack/storage/datastore/driver/SamplePrimaryDataStoreDriverImpl.java b/plugins/storage/volume/sample/src/org/apache/cloudstack/storage/datastore/driver/SamplePrimaryDataStoreDriverImpl.java new file mode 100644 index 0000000..67e9843 --- /dev/null +++ b/plugins/storage/volume/sample/src/org/apache/cloudstack/storage/datastore/driver/SamplePrimaryDataStoreDriverImpl.java @@ -0,0 +1,249 @@ +// 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 SamplePrimaryDataStoreDriverImpl implements PrimaryDataStoreDriver { + private static final Logger s_logger = Logger.getLogger(SamplePrimaryDataStoreDriverImpl.class); + @Inject + EndPointSelector selector; + @Inject + StoragePoolHostDao storeHostDao; + @Inject + DataObjectManager dataObjMgr; + public SamplePrimaryDataStoreDriverImpl() { + + } + + 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/plugins/storage/volume/sample/src/org/apache/cloudstack/storage/datastore/lifecycle/SamplePrimaryDataStoreLifeCycleImpl.java ---------------------------------------------------------------------- diff --git a/plugins/storage/volume/sample/src/org/apache/cloudstack/storage/datastore/lifecycle/SamplePrimaryDataStoreLifeCycleImpl.java b/plugins/storage/volume/sample/src/org/apache/cloudstack/storage/datastore/lifecycle/SamplePrimaryDataStoreLifeCycleImpl.java new file mode 100644 index 0000000..15bf8c1 --- /dev/null +++ b/plugins/storage/volume/sample/src/org/apache/cloudstack/storage/datastore/lifecycle/SamplePrimaryDataStoreLifeCycleImpl.java @@ -0,0 +1,147 @@ +/* + * 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 SamplePrimaryDataStoreLifeCycleImpl implements PrimaryDataStoreLifeCycle { + @Inject + EndPointSelector selector; + @Inject + PrimaryDataStoreDao dataStoreDao; + @Inject + HostDao hostDao; + @Inject + PrimaryDataStoreHelper primaryStoreHelper; + @Inject + PrimaryDataStoreProviderManager providerMgr; + public SamplePrimaryDataStoreLifeCycleImpl() { + } + + @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/plugins/storage/volume/sample/src/org/apache/cloudstack/storage/datastore/provider/SamplePrimaryDatastoreProviderImpl.java ---------------------------------------------------------------------- diff --git a/plugins/storage/volume/sample/src/org/apache/cloudstack/storage/datastore/provider/SamplePrimaryDatastoreProviderImpl.java b/plugins/storage/volume/sample/src/org/apache/cloudstack/storage/datastore/provider/SamplePrimaryDatastoreProviderImpl.java new file mode 100644 index 0000000..8f6cb1b --- /dev/null +++ b/plugins/storage/volume/sample/src/org/apache/cloudstack/storage/datastore/provider/SamplePrimaryDatastoreProviderImpl.java @@ -0,0 +1,83 @@ +// 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.SamplePrimaryDataStoreDriverImpl; +import org.apache.cloudstack.storage.datastore.lifecycle.SamplePrimaryDataStoreLifeCycleImpl; + +import com.cloud.utils.component.ComponentContext; + + +public class SamplePrimaryDatastoreProviderImpl implements PrimaryDataStoreProvider { + private final String providerName = "sample 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(SamplePrimaryDataStoreLifeCycleImpl.class); + driver = ComponentContext.inject(SamplePrimaryDataStoreDriverImpl.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/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/provider/SolidfirePrimaryDataStoreProvider.java ---------------------------------------------------------------------- diff --git a/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/provider/SolidfirePrimaryDataStoreProvider.java b/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/provider/SolidfirePrimaryDataStoreProvider.java index 650cac8..39adf9f 100644 --- a/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/provider/SolidfirePrimaryDataStoreProvider.java +++ b/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/provider/SolidfirePrimaryDataStoreProvider.java @@ -16,24 +16,60 @@ // under the License. package org.apache.cloudstack.storage.datastore.provider; +import java.util.Map; +import java.util.Set; + +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.PrimaryDataStoreProvider; import org.springframework.stereotype.Component; @Component -public class SolidfirePrimaryDataStoreProvider extends - DefaultPrimaryDatastoreProviderImpl { - private final String name = "Solidfre Primary Data Store Provider"; +public class SolidfirePrimaryDataStoreProvider implements PrimaryDataStoreProvider { + private final String name = "Solidfire Primary Data Store Provider"; public SolidfirePrimaryDataStoreProvider() { - - + + // TODO Auto-generated constructor stub } - + @Override public String getName() { return name; } - - + + @Override + public DataStoreLifeCycle getDataStoreLifeCycle() { + // TODO Auto-generated method stub + return null; + } + + @Override + public DataStoreDriver getDataStoreDriver() { + // TODO Auto-generated method stub + return null; + } + + @Override + public HypervisorHostListener getHostListener() { + // TODO Auto-generated method stub + return null; + } + + @Override + public boolean configure(Map params) { + // TODO Auto-generated method stub + return false; + } + + @Override + public Set getTypes() { + // TODO Auto-generated method stub + return null; + } + + }