You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by mc...@apache.org on 2013/04/06 02:35:19 UTC
[46/57] [abbrv] Move previous AncientImageDataStore provider and
DefaultImageDataStore provider code into plugins.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a5416797/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<DataObject> listObjects(DataStore store) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public void createAsync(DataObject data,
+ AsyncCompletionCallback<CreateCmdResult> 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<CommandResult> 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<CopyCommandResult> callback) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void resize(DataObject data,
+ AsyncCompletionCallback<CreateCmdResult> callback) {
+ // TODO Auto-generated method stub
+
+ }
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a5416797/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<String, Object> 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/a5416797/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<String, Object> params) {
+ lifeCycle = ComponentContext.inject(SampleImageDataStoreLifeCycle.class);
+ driver = ComponentContext.inject(SampleImageDataStoreDriverImpl.class);
+
+ storeMgr.registerDriver(this.getName(), driver);
+ return true;
+ }
+
+ @Override
+ public Set<DataStoreProviderType> getTypes() {
+ Set<DataStoreProviderType> types = new HashSet<DataStoreProviderType>();
+ 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/a5416797/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<DataStoreProviderType> getTypes() {
Set<DataStoreProviderType> types = new HashSet<DataStoreProviderType>();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a5416797/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 @@
+<!-- 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. -->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <artifactId>cloud-plugin-storage-volume-sample</artifactId>
+ <name>Apache CloudStack Plugin - Storage Volume sample provider</name>
+ <parent>
+ <groupId>org.apache.cloudstack</groupId>
+ <artifactId>cloudstack-plugins</artifactId>
+ <version>4.2.0-SNAPSHOT</version>
+ <relativePath>../../../pom.xml</relativePath>
+ </parent>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.cloudstack</groupId>
+ <artifactId>cloud-engine-storage-volume</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>mysql</groupId>
+ <artifactId>mysql-connector-java</artifactId>
+ <version>${cs.mysql.version}</version>
+ <scope>provided</scope>
+ </dependency>
+ </dependencies>
+ <build>
+ <defaultGoal>install</defaultGoal>
+ <sourceDirectory>src</sourceDirectory>
+ <testSourceDirectory>test</testSourceDirectory>
+ <plugins>
+ <plugin>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <configuration>
+ <skipTests>true</skipTests>
+ </configuration>
+ <executions>
+ <execution>
+ <phase>integration-test</phase>
+ <goals>
+ <goal>test</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+</project>
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a5416797/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<T> extends AsyncRpcConext<T> {
+ private final DataObject volume;
+ /**
+ * @param callback
+ */
+ public CreateVolumeContext(AsyncCompletionCallback<T> callback, DataObject volume) {
+ super(callback);
+ this.volume = volume;
+ }
+
+ public DataObject getVolume() {
+ return this.volume;
+ }
+
+ }
+
+ public Void createAsyncCallback(AsyncCallbackDispatcher<SamplePrimaryDataStoreDriverImpl, Answer> callback, CreateVolumeContext<CreateCmdResult> 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<CommandResult> callback) {
+ DeleteCommand cmd = new DeleteCommand(vo.getUri());
+
+ EndPoint ep = selector.select(vo);
+ AsyncRpcConext<CommandResult> context = new AsyncRpcConext<CommandResult>(callback);
+ AsyncCallbackDispatcher<SamplePrimaryDataStoreDriverImpl, Answer> caller = AsyncCallbackDispatcher.create(this);
+ caller.setCallback(caller.getTarget().deleteCallback(null, null))
+ .setContext(context);
+ ep.sendMessageAsync(cmd, caller);
+ }
+
+ public Void deleteCallback(AsyncCallbackDispatcher<SamplePrimaryDataStoreDriverImpl, Answer> callback, AsyncRpcConext<CommandResult> 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<T> extends AsyncRpcConext<T> {
+ private final VolumeObject volume;
+
+ public CreateVolumeFromBaseImageContext(AsyncCompletionCallback<T> callback, VolumeObject volume) {
+ super(callback);
+ this.volume = volume;
+ }
+
+ public VolumeObject getVolume() {
+ return this.volume;
+ }
+
+ }
+
+ @Override
+ public void createVolumeFromBaseImageAsync(VolumeObject volume, TemplateInfo template, AsyncCompletionCallback<CommandResult> callback) {
+ VolumeTO vol = this.dataStore.getVolumeTO(volume);
+ List<EndPoint> endPoints = this.dataStore.getEndPoints();
+ EndPoint ep = endPoints.get(0);
+ String templateUri = template.getDataStore().grantAccess(template, ep);
+ CreateVolumeFromBaseImageCommand cmd = new CreateVolumeFromBaseImageCommand(vol, templateUri);
+
+ CreateVolumeFromBaseImageContext<CommandResult> context = new CreateVolumeFromBaseImageContext<CommandResult>(callback, volume);
+ AsyncCallbackDispatcher<DefaultPrimaryDataStoreDriverImpl, Answer> caller = AsyncCallbackDispatcher.create(this);
+ caller.setContext(context)
+ .setCallback(caller.getTarget().createVolumeFromBaseImageAsyncCallback(null, null));
+
+ ep.sendMessageAsync(cmd, caller);
+ }*/
+ /*
+ public Object createVolumeFromBaseImageAsyncCallback(AsyncCallbackDispatcher<DefaultPrimaryDataStoreDriverImpl, Answer> callback, CreateVolumeFromBaseImageContext<CommandResult> 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<CommandResult> parentCall = context.getParentCallback();
+ parentCall.complete(result);
+ return null;
+ }*/
+
+ @Override
+ public void createAsync(DataObject vol,
+ AsyncCompletionCallback<CreateCmdResult> callback) {
+ EndPoint ep = selector.select(vol);
+ CreateObjectCommand createCmd = new CreateObjectCommand(vol.getUri());
+
+ CreateVolumeContext<CreateCmdResult> context = new CreateVolumeContext<CreateCmdResult>(callback, vol);
+ AsyncCallbackDispatcher<SamplePrimaryDataStoreDriverImpl, Answer> 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<DataObject> listObjects(DataStore store) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public void revertSnapshot(SnapshotInfo snapshot,
+ AsyncCompletionCallback<CommandResult> 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<CopyCommandResult> callback) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void resize(DataObject data,
+ AsyncCompletionCallback<CreateCmdResult> callback) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void takeSnapshot(SnapshotInfo snapshot,
+ AsyncCompletionCallback<CreateCmdResult> callback) {
+ // TODO Auto-generated method stub
+
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a5416797/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<String, Object> 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<EndPoint> 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/a5416797/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<String, Object> 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<DataStoreProviderType> getTypes() {
+ Set<DataStoreProviderType> types = new HashSet<DataStoreProviderType>();
+ types.add(DataStoreProviderType.PRIMARY);
+ return types;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a5416797/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<String, Object> params) {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ @Override
+ public Set<DataStoreProviderType> getTypes() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+
}