You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ed...@apache.org on 2012/12/19 03:34:42 UTC
git commit: add xenserver backend code: download template from http
directly
Updated Branches:
refs/heads/javelin 644b78311 -> 0581ea763
add xenserver backend code: download template from http directly
Project: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/commit/0581ea76
Tree: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/tree/0581ea76
Diff: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/diff/0581ea76
Branch: refs/heads/javelin
Commit: 0581ea763ae3d2e6449d29859ba30e2b23b7f858
Parents: 644b783
Author: Edison Su <su...@gmail.com>
Authored: Tue Dec 18 18:34:13 2012 -0800
Committer: Edison Su <su...@gmail.com>
Committed: Tue Dec 18 18:34:13 2012 -0800
----------------------------------------------------------------------
.../api/storage/PrimaryDataStoreInfo.java | 3 +-
.../engine/subsystem/api/storage/VolumeInfo.java | 2 +-
.../storage/image/store/ImageDataStoreImpl.java | 12 +
.../image/motion/DefaultImageMotionStrategy.java | 6 +-
.../test/MockHypervsiorHostEndPointRpcServer.java | 4 +-
.../command/CopyTemplateToPrimaryStorage.java | 28 ---
.../command/CopyTemplateToPrimaryStorageCmd.java | 30 +++
.../command/CreateVolumeFromBaseImageCommand.java | 14 +-
.../storage/command/StorageSubSystemCommand.java | 23 ++
.../cloudstack/storage/image/TemplateInfo.java | 2 +
.../storage/image/store/ImageDataStoreInfo.java | 2 +
.../cloudstack/storage/to/ImageDataStoreTO.java | 13 +-
.../storage/to/ImageOnPrimayDataStoreTO.java | 19 ++-
.../cloudstack/storage/to/PrimaryDataStoreTO.java | 19 ++-
.../apache/cloudstack/storage/to/TemplateTO.java | 32 +++-
.../org/apache/cloudstack/storage/to/VolumeTO.java | 33 +++-
.../storage/datastore/DefaultPrimaryDataStore.java | 9 +-
.../storage/volume/test/TestConfiguration.java | 8 +-
plugins/hypervisors/xen/pom.xml | 44 ++--
.../xen/resource/CitrixResourceBase.java | 10 +
.../xen/resource/XenServerStorageResource.java | 187 +++++++++++++++
21 files changed, 426 insertions(+), 74 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/0581ea76/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStoreInfo.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStoreInfo.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStoreInfo.java
index f756626..c818522 100644
--- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStoreInfo.java
+++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStoreInfo.java
@@ -19,6 +19,7 @@
package org.apache.cloudstack.engine.subsystem.api.storage;
+import org.apache.cloudstack.engine.datacenter.entity.api.DataCenterResourceEntity;
import org.apache.cloudstack.engine.subsystem.api.storage.disktype.VolumeDiskType;
@@ -35,7 +36,7 @@ public interface PrimaryDataStoreInfo {
public long getId();
public String getUuid();
- public Volume.State getManagedState();
+ public DataCenterResourceEntity.State getManagedState();
public String getName();
public String getType();
public PrimaryDataStoreLifeCycle getLifeCycle();
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/0581ea76/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/VolumeInfo.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/VolumeInfo.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/VolumeInfo.java
index 0370d20..347ae6c 100644
--- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/VolumeInfo.java
+++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/VolumeInfo.java
@@ -32,7 +32,7 @@ public interface VolumeInfo {
public String getPath();
public PrimaryDataStoreInfo getDataStore() ;
public String getTemplateUuid();
- public String getTemplatePath() ;
+ public String getTemplatePath();
public VolumeType getType();
public VolumeDiskType getDiskType();
public long getId();
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/0581ea76/engine/storage/image/src/org/apache/cloudstack/storage/image/store/ImageDataStoreImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/store/ImageDataStoreImpl.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/store/ImageDataStoreImpl.java
index 6eef23d..68ad317 100644
--- a/engine/storage/image/src/org/apache/cloudstack/storage/image/store/ImageDataStoreImpl.java
+++ b/engine/storage/image/src/org/apache/cloudstack/storage/image/store/ImageDataStoreImpl.java
@@ -91,4 +91,16 @@ public class ImageDataStoreImpl implements ImageDataStore {
return to;
}
+ @Override
+ public String getType() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public String getUri() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/0581ea76/engine/storage/imagemotion/src/org/apache/cloudstack/storage/image/motion/DefaultImageMotionStrategy.java
----------------------------------------------------------------------
diff --git a/engine/storage/imagemotion/src/org/apache/cloudstack/storage/image/motion/DefaultImageMotionStrategy.java b/engine/storage/imagemotion/src/org/apache/cloudstack/storage/image/motion/DefaultImageMotionStrategy.java
index 8ebe8fd..f9c0388 100644
--- a/engine/storage/imagemotion/src/org/apache/cloudstack/storage/image/motion/DefaultImageMotionStrategy.java
+++ b/engine/storage/imagemotion/src/org/apache/cloudstack/storage/image/motion/DefaultImageMotionStrategy.java
@@ -23,7 +23,7 @@ import org.apache.cloudstack.framework.async.AsyncCallbackHandler;
import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
import org.apache.cloudstack.storage.EndPoint;
import org.apache.cloudstack.storage.command.CommandResult;
-import org.apache.cloudstack.storage.command.CopyTemplateToPrimaryStorage;
+import org.apache.cloudstack.storage.command.CopyTemplateToPrimaryStorageCmd;
import org.apache.cloudstack.storage.command.CopyTemplateToPrimaryStorageAnswer;
import org.apache.cloudstack.storage.datastore.PrimaryDataStore;
import org.apache.cloudstack.storage.to.ImageOnPrimayDataStoreTO;
@@ -48,7 +48,7 @@ public class DefaultImageMotionStrategy implements ImageMotionStrategy {
@Override
public boolean copyTemplate(TemplateOnPrimaryDataStoreInfo templateStore, EndPoint ep) {
ImageOnPrimayDataStoreTO imageTo = new ImageOnPrimayDataStoreTO(templateStore);
- CopyTemplateToPrimaryStorage copyCommand = new CopyTemplateToPrimaryStorage(imageTo);
+ CopyTemplateToPrimaryStorageCmd copyCommand = new CopyTemplateToPrimaryStorageCmd(imageTo);
ep.sendMessage(copyCommand);
return true;
}
@@ -56,7 +56,7 @@ public class DefaultImageMotionStrategy implements ImageMotionStrategy {
@Override
public void copyTemplateAsync(TemplateOnPrimaryDataStoreInfo templateStore, EndPoint ep, AsyncCompletionCallback<CommandResult> callback) {
ImageOnPrimayDataStoreTO imageTo = new ImageOnPrimayDataStoreTO(templateStore);
- CopyTemplateToPrimaryStorage copyCommand = new CopyTemplateToPrimaryStorage(imageTo);
+ CopyTemplateToPrimaryStorageCmd copyCommand = new CopyTemplateToPrimaryStorageCmd(imageTo);
AsyncCallbackDispatcher caller = new AsyncCallbackDispatcher(this).setParentCallback(callback)
.setOperationName("defaultImageStrategy.copytemplate.callback")
.setContextParam("templateStore", templateStore);
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/0581ea76/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/MockHypervsiorHostEndPointRpcServer.java
----------------------------------------------------------------------
diff --git a/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/MockHypervsiorHostEndPointRpcServer.java b/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/MockHypervsiorHostEndPointRpcServer.java
index 6142c3e..35b5bb1 100644
--- a/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/MockHypervsiorHostEndPointRpcServer.java
+++ b/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/MockHypervsiorHostEndPointRpcServer.java
@@ -25,7 +25,7 @@ import java.util.concurrent.TimeUnit;
import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
import org.apache.cloudstack.storage.HostEndpointRpcServer;
-import org.apache.cloudstack.storage.command.CopyTemplateToPrimaryStorage;
+import org.apache.cloudstack.storage.command.CopyTemplateToPrimaryStorageCmd;
import org.apache.cloudstack.storage.command.CopyTemplateToPrimaryStorageAnswer;
import org.apache.cloudstack.storage.command.CreateVolumeAnswer;
import org.apache.cloudstack.storage.command.CreateVolumeFromBaseImageCommand;
@@ -50,7 +50,7 @@ public class MockHypervsiorHostEndPointRpcServer implements HostEndpointRpcServe
public void run() {
try {
Answer answer = new Answer(cmd, false, "unknown command");
- if (cmd instanceof CopyTemplateToPrimaryStorage) {
+ if (cmd instanceof CopyTemplateToPrimaryStorageCmd) {
answer = new CopyTemplateToPrimaryStorageAnswer(cmd, UUID.randomUUID().toString());
} else if (cmd instanceof CreateVolumeFromBaseImageCommand) {
answer = new CreateVolumeAnswer(cmd, UUID.randomUUID().toString());
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/0581ea76/engine/storage/src/org/apache/cloudstack/storage/command/CopyTemplateToPrimaryStorage.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/command/CopyTemplateToPrimaryStorage.java b/engine/storage/src/org/apache/cloudstack/storage/command/CopyTemplateToPrimaryStorage.java
deleted file mode 100644
index d092e9e..0000000
--- a/engine/storage/src/org/apache/cloudstack/storage/command/CopyTemplateToPrimaryStorage.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package org.apache.cloudstack.storage.command;
-
-import org.apache.cloudstack.storage.to.ImageOnPrimayDataStoreTO;
-import org.apache.cloudstack.storage.to.TemplateTO;
-import org.apache.cloudstack.storage.to.VolumeTO;
-
-import com.cloud.agent.api.Command;
-
-public class CopyTemplateToPrimaryStorage extends Command {
-
- private ImageOnPrimayDataStoreTO imageTO;
-
- protected CopyTemplateToPrimaryStorage() {
- super();
- }
-
- public CopyTemplateToPrimaryStorage(ImageOnPrimayDataStoreTO image) {
- super();
- this.imageTO = image;
- }
-
- @Override
- public boolean executeInSequence() {
- // TODO Auto-generated method stub
- return false;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/0581ea76/engine/storage/src/org/apache/cloudstack/storage/command/CopyTemplateToPrimaryStorageCmd.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/command/CopyTemplateToPrimaryStorageCmd.java b/engine/storage/src/org/apache/cloudstack/storage/command/CopyTemplateToPrimaryStorageCmd.java
new file mode 100644
index 0000000..dd2030d
--- /dev/null
+++ b/engine/storage/src/org/apache/cloudstack/storage/command/CopyTemplateToPrimaryStorageCmd.java
@@ -0,0 +1,30 @@
+package org.apache.cloudstack.storage.command;
+
+import org.apache.cloudstack.storage.to.ImageOnPrimayDataStoreTO;
+
+import com.cloud.agent.api.Command;
+
+public class CopyTemplateToPrimaryStorageCmd extends Command implements StorageSubSystemCommand {
+
+ private ImageOnPrimayDataStoreTO imageTO;
+
+ protected CopyTemplateToPrimaryStorageCmd() {
+ super();
+ }
+
+ public CopyTemplateToPrimaryStorageCmd(ImageOnPrimayDataStoreTO image) {
+ super();
+ this.imageTO = image;
+ }
+
+ public ImageOnPrimayDataStoreTO getImage() {
+ return this.imageTO;
+ }
+
+ @Override
+ public boolean executeInSequence() {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/0581ea76/engine/storage/src/org/apache/cloudstack/storage/command/CreateVolumeFromBaseImageCommand.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/command/CreateVolumeFromBaseImageCommand.java b/engine/storage/src/org/apache/cloudstack/storage/command/CreateVolumeFromBaseImageCommand.java
index 0042c95..4780e00 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/command/CreateVolumeFromBaseImageCommand.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/command/CreateVolumeFromBaseImageCommand.java
@@ -23,14 +23,22 @@ import org.apache.cloudstack.storage.to.VolumeTO;
import com.cloud.agent.api.Command;
-public class CreateVolumeFromBaseImageCommand extends Command {
- private VolumeTO volume;
- private ImageOnPrimayDataStoreTO image;
+public class CreateVolumeFromBaseImageCommand extends Command implements StorageSubSystemCommand {
+ private final VolumeTO volume;
+ private final ImageOnPrimayDataStoreTO image;
public CreateVolumeFromBaseImageCommand(VolumeTO volume, ImageOnPrimayDataStoreTO image) {
this.volume = volume;
this.image = image;
}
+
+ public VolumeTO getVolume() {
+ return this.volume;
+ }
+
+ public ImageOnPrimayDataStoreTO getImage() {
+ return this.image;
+ }
@Override
public boolean executeInSequence() {
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/0581ea76/engine/storage/src/org/apache/cloudstack/storage/command/StorageSubSystemCommand.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/command/StorageSubSystemCommand.java b/engine/storage/src/org/apache/cloudstack/storage/command/StorageSubSystemCommand.java
new file mode 100644
index 0000000..d14161a
--- /dev/null
+++ b/engine/storage/src/org/apache/cloudstack/storage/command/StorageSubSystemCommand.java
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.cloudstack.storage.command;
+
+public interface StorageSubSystemCommand {
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/0581ea76/engine/storage/src/org/apache/cloudstack/storage/image/TemplateInfo.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/TemplateInfo.java b/engine/storage/src/org/apache/cloudstack/storage/image/TemplateInfo.java
index 0e11f3e..71e6e3a 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/image/TemplateInfo.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/image/TemplateInfo.java
@@ -31,4 +31,6 @@ public interface TemplateInfo {
String getPath();
String getUuid();
+
+ long getVirtualSize();
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/0581ea76/engine/storage/src/org/apache/cloudstack/storage/image/store/ImageDataStoreInfo.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/store/ImageDataStoreInfo.java b/engine/storage/src/org/apache/cloudstack/storage/image/store/ImageDataStoreInfo.java
index a5d3d0f..1756477 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/image/store/ImageDataStoreInfo.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/image/store/ImageDataStoreInfo.java
@@ -20,4 +20,6 @@ package org.apache.cloudstack.storage.image.store;
public interface ImageDataStoreInfo {
public long getImageDataStoreId();
+ public String getType();
+ public String getUri();
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/0581ea76/engine/storage/src/org/apache/cloudstack/storage/to/ImageDataStoreTO.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/to/ImageDataStoreTO.java b/engine/storage/src/org/apache/cloudstack/storage/to/ImageDataStoreTO.java
index ca1e9b7..9fd335a 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/to/ImageDataStoreTO.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/to/ImageDataStoreTO.java
@@ -3,7 +3,18 @@ package org.apache.cloudstack.storage.to;
import org.apache.cloudstack.storage.image.store.ImageDataStoreInfo;
public class ImageDataStoreTO {
+ private final String type;
+ private final String uri;
public ImageDataStoreTO(ImageDataStoreInfo dataStore) {
-
+ this.type = dataStore.getType();
+ this.uri = dataStore.getUri();
+ }
+
+ public String getType() {
+ return this.type;
+ }
+
+ public String getUri() {
+ return this.uri;
}
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/0581ea76/engine/storage/src/org/apache/cloudstack/storage/to/ImageOnPrimayDataStoreTO.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/to/ImageOnPrimayDataStoreTO.java b/engine/storage/src/org/apache/cloudstack/storage/to/ImageOnPrimayDataStoreTO.java
index cc31bc7..4c040f4 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/to/ImageOnPrimayDataStoreTO.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/to/ImageOnPrimayDataStoreTO.java
@@ -21,7 +21,24 @@ package org.apache.cloudstack.storage.to;
import org.apache.cloudstack.storage.volume.TemplateOnPrimaryDataStoreInfo;
public class ImageOnPrimayDataStoreTO {
+ private final String pathOnPrimaryDataStore;
+ private final PrimaryDataStoreTO dataStore;
+ private final TemplateTO template;
public ImageOnPrimayDataStoreTO(TemplateOnPrimaryDataStoreInfo template) {
-
+ this.pathOnPrimaryDataStore = template.getPath();
+ this.dataStore = new PrimaryDataStoreTO(template.getPrimaryDataStore());
+ this.template = new TemplateTO(template.getTemplate());
+ }
+
+ public String getPathOnPrimaryDataStore() {
+ return this.pathOnPrimaryDataStore;
+ }
+
+ public PrimaryDataStoreTO getPrimaryDataStore() {
+ return this.dataStore;
+ }
+
+ public TemplateTO getTemplate() {
+ return this.template;
}
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/0581ea76/engine/storage/src/org/apache/cloudstack/storage/to/PrimaryDataStoreTO.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/to/PrimaryDataStoreTO.java b/engine/storage/src/org/apache/cloudstack/storage/to/PrimaryDataStoreTO.java
index bd97dda..7708621 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/to/PrimaryDataStoreTO.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/to/PrimaryDataStoreTO.java
@@ -3,7 +3,24 @@ package org.apache.cloudstack.storage.to;
import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreInfo;
public class PrimaryDataStoreTO {
+ private final String uuid;
+ private final String name;
+ private final String type;
public PrimaryDataStoreTO(PrimaryDataStoreInfo dataStore) {
-
+ this.uuid = dataStore.getUuid();
+ this.name = dataStore.getName();
+ this.type = dataStore.getType();
+ }
+
+ public String getUuid() {
+ return this.uuid;
+ }
+
+ public String getName() {
+ return this.name;
+ }
+
+ public String getType() {
+ return this.type;
}
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/0581ea76/engine/storage/src/org/apache/cloudstack/storage/to/TemplateTO.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/to/TemplateTO.java b/engine/storage/src/org/apache/cloudstack/storage/to/TemplateTO.java
index d5f9d09..704f36e 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/to/TemplateTO.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/to/TemplateTO.java
@@ -1,9 +1,39 @@
package org.apache.cloudstack.storage.to;
+import org.apache.cloudstack.engine.subsystem.api.storage.disktype.VolumeDiskType;
import org.apache.cloudstack.storage.image.TemplateInfo;
public class TemplateTO {
+ private final String path;
+ private final String uuid;
+ private final VolumeDiskType diskType;
+ private final ImageDataStoreTO imageDataStore;
+ private final long size;
public TemplateTO(TemplateInfo template) {
-
+ this.path = template.getPath();
+ this.uuid = template.getUuid();
+ this.diskType = template.getDiskType();
+ this.imageDataStore = new ImageDataStoreTO(template.getImageDataStore());
+ this.size = template.getVirtualSize();
+ }
+
+ public String getPath() {
+ return this.path;
+ }
+
+ public String getUuid() {
+ return this.uuid;
+ }
+
+ public VolumeDiskType getDiskType() {
+ return this.diskType;
+ }
+
+ public ImageDataStoreTO getImageDataStore() {
+ return this.imageDataStore;
+ }
+
+ public long getSize() {
+ return this.size;
}
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/0581ea76/engine/storage/src/org/apache/cloudstack/storage/to/VolumeTO.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/to/VolumeTO.java b/engine/storage/src/org/apache/cloudstack/storage/to/VolumeTO.java
index eff22f0..d507eb4 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/to/VolumeTO.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/to/VolumeTO.java
@@ -1,9 +1,40 @@
package org.apache.cloudstack.storage.to;
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
+import org.apache.cloudstack.engine.subsystem.api.storage.disktype.VolumeDiskType;
+import org.apache.cloudstack.engine.subsystem.api.storage.type.VolumeType;
public class VolumeTO {
+ private final String uuid;
+ private final String path;
+ private final VolumeType volumeType;
+ private final VolumeDiskType diskType;
+ private final PrimaryDataStoreTO dataStore;
public VolumeTO(VolumeInfo volume) {
-
+ this.uuid = volume.getUuid();
+ this.path = volume.getPath();
+ this.volumeType = volume.getType();
+ this.diskType = volume.getDiskType();
+ this.dataStore = new PrimaryDataStoreTO(volume.getDataStore());
+ }
+
+ public String getUuid() {
+ return this.uuid;
+ }
+
+ public String getPath() {
+ return this.path;
+ }
+
+ public VolumeType getVolumeType() {
+ return this.volumeType;
+ }
+
+ public VolumeDiskType getDiskType() {
+ return this.diskType;
+ }
+
+ public PrimaryDataStoreTO getDataStore() {
+ return this.dataStore;
}
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/0581ea76/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/DefaultPrimaryDataStore.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/DefaultPrimaryDataStore.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/DefaultPrimaryDataStore.java
index 267e977..a9781e1 100644
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/DefaultPrimaryDataStore.java
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/DefaultPrimaryDataStore.java
@@ -5,6 +5,7 @@ import java.util.List;
import javax.inject.Inject;
+import org.apache.cloudstack.engine.datacenter.entity.api.DataCenterResourceEntity;
import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreInfo;
import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreLifeCycle;
import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreProvider;
@@ -196,14 +197,14 @@ public class DefaultPrimaryDataStore implements PrimaryDataStore {
public void createVoluemFromBaseImageAsync(VolumeInfo volume, TemplateOnPrimaryDataStoreInfo templateStore, AsyncCompletionCallback<CommandResult> callback) {
VolumeObject vo = (VolumeObject) volume;
vo.setVolumeDiskType(templateStore.getTemplate().getDiskType());
- AsyncCallbackDispatcher caller = new AsyncCallbackDispatcher(this)
- .setParentCallback(callback)
+ AsyncCallbackDispatcher<DefaultPrimaryDataStore> caller = new AsyncCallbackDispatcher<DefaultPrimaryDataStore>(this);
+ caller.setCallback(caller.getTarget().createVoluemFromBaseImageAsyncCallback(null, null))
.setOperationName("primarydatastore.createvolumefrombaseImage");
this.driver.createVolumeFromBaseImageAsync(vo, templateStore, caller);
}
@AsyncCallbackHandler(operationName="primarydatastore.createvolumefrombaseImage")
- public void createVoluemFromBaseImageAsyncCallback(AsyncCallbackDispatcher callback) {
+ public Object createVoluemFromBaseImageAsyncCallback(AsyncCallbackDispatcher callback, Object parames) {
AsyncCallbackDispatcher parent = callback.getParentCallback();
CommandResult result = callback.getResult();
parent.complete(result);
@@ -222,7 +223,7 @@ public class DefaultPrimaryDataStore implements PrimaryDataStore {
}
@Override
- public Volume.State getManagedState() {
+ public DataCenterResourceEntity.State getManagedState() {
// TODO Auto-generated method stub
return null;
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/0581ea76/engine/storage/volume/test/org/apache/cloudstack/storage/volume/test/TestConfiguration.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/test/org/apache/cloudstack/storage/volume/test/TestConfiguration.java b/engine/storage/volume/test/org/apache/cloudstack/storage/volume/test/TestConfiguration.java
index fff6ead..d519071 100644
--- a/engine/storage/volume/test/org/apache/cloudstack/storage/volume/test/TestConfiguration.java
+++ b/engine/storage/volume/test/org/apache/cloudstack/storage/volume/test/TestConfiguration.java
@@ -18,9 +18,8 @@
*/
package org.apache.cloudstack.storage.volume.test;
-import org.apache.cloudstack.storage.HostEndpointRpcServer;
import org.apache.cloudstack.storage.image.motion.ImageMotionService;
-import org.apache.cloudstack.storage.test.MockHypervsiorHostEndPointRpcServer;
+
import org.mockito.Mockito;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -40,9 +39,4 @@ public class TestConfiguration {
public ClusterDao clusterDao() {
return Mockito.mock(ClusterDaoImpl.class);
}
-
- @Bean
- public HostEndpointRpcServer rpcServer() {
- return new MockHypervsiorHostEndPointRpcServer();
- }
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/0581ea76/plugins/hypervisors/xen/pom.xml
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xen/pom.xml b/plugins/hypervisors/xen/pom.xml
index 959c972..0a57afc 100644
--- a/plugins/hypervisors/xen/pom.xml
+++ b/plugins/hypervisors/xen/pom.xml
@@ -1,22 +1,15 @@
-<!--
- 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">
+<!-- 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-hypervisor-xen</artifactId>
<name>Apache CloudStack Plugin - Hypervisor Xen</name>
@@ -29,10 +22,21 @@
<dependencies>
<dependency>
<groupId>org.apache.cloudstack</groupId>
+ <artifactId>cloud-engine-storage</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.cloudstack</groupId>
<artifactId>cloud-plugin-network-ovs</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
+ <groupId>org.apache.httpcomponents</groupId>
+ <artifactId>httpclient</artifactId>
+ <version>4.2.2</version>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
<groupId>org.apache.cloudstack</groupId>
<artifactId>xapi</artifactId>
<version>${cs.xapi.version}</version>
@@ -42,6 +46,6 @@
<groupId>junit</groupId>
</exclusion>
</exclusions>
- </dependency>
+ </dependency>
</dependencies>
</project>
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/0581ea76/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
index d2db85c..a0066c8 100644
--- a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
+++ b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
@@ -176,6 +176,7 @@ import com.cloud.agent.api.storage.CreatePrivateTemplateAnswer;
import com.cloud.agent.api.storage.DestroyCommand;
import com.cloud.agent.api.storage.PrimaryStorageDownloadAnswer;
import com.cloud.agent.api.storage.PrimaryStorageDownloadCommand;
+import com.cloud.agent.api.storage.StorageCommand;
import com.cloud.agent.api.to.IpAddressTO;
import com.cloud.agent.api.to.NicTO;
import com.cloud.agent.api.to.PortForwardingRuleTO;
@@ -305,6 +306,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
protected boolean _canBridgeFirewall = false;
protected boolean _isOvs = false;
protected List<VIF> _tmpDom0Vif = new ArrayList<VIF>();
+ protected XenServerStorageResource storageResource;
public enum SRType {
NFS, LVM, ISCSI, ISO, LVMOISCSI, LVMOHBA, EXT, FILE;
@@ -557,6 +559,8 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
return execute((Site2SiteVpnCfgCommand) cmd);
} else if (clazz == CheckS2SVpnConnectionsCommand.class) {
return execute((CheckS2SVpnConnectionsCommand) cmd);
+ } else if (clazz == StorageCommand.class) {
+ return this.storageResource.handleStorageCommands((StorageCommand)cmd);
} else {
return Answer.createUnsupportedCommandAnswer(cmd);
}
@@ -5528,9 +5532,15 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
CheckXenHostInfo();
+
+ this.storageResource = getStorageResource();
return true;
}
+
+ protected XenServerStorageResource getStorageResource() {
+ return new XenServerStorageResource(this);
+ }
private void CheckXenHostInfo() throws ConfigurationException {
Connection conn = _connPool.slaveConnect(_host.ip, _username, _password);
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/0581ea76/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerStorageResource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerStorageResource.java b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerStorageResource.java
new file mode 100644
index 0000000..b80b5d9
--- /dev/null
+++ b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerStorageResource.java
@@ -0,0 +1,187 @@
+/*
+ * 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 com.cloud.hypervisor.xen.resource;
+
+import java.io.IOException;
+import java.net.URI;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
+
+import org.apache.cloudstack.storage.command.CopyTemplateToPrimaryStorageCmd;
+import org.apache.cloudstack.storage.command.CopyTemplateToPrimaryStorageAnswer;
+import org.apache.cloudstack.storage.command.StorageSubSystemCommand;
+import org.apache.cloudstack.storage.to.ImageDataStoreTO;
+import org.apache.cloudstack.storage.to.ImageOnPrimayDataStoreTO;
+import org.apache.cloudstack.storage.to.PrimaryDataStoreTO;
+import org.apache.cloudstack.storage.to.TemplateTO;
+import org.apache.commons.httpclient.HttpClient;
+import org.apache.commons.httpclient.HttpException;
+import org.apache.commons.httpclient.HttpStatus;
+import org.apache.commons.httpclient.methods.GetMethod;
+import org.apache.log4j.Logger;
+import org.apache.xmlrpc.XmlRpcException;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.Command;
+import com.cloud.agent.api.storage.PrimaryStorageDownloadAnswer;
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.xensource.xenapi.Connection;
+import com.xensource.xenapi.PBD;
+import com.xensource.xenapi.SR;
+import com.xensource.xenapi.Types;
+import com.xensource.xenapi.Types.BadServerResponse;
+import com.xensource.xenapi.Types.XenAPIException;
+import com.xensource.xenapi.VDI;
+
+public class XenServerStorageResource {
+ private static final Logger s_logger = Logger.getLogger(XenServerStorageResource.class);
+ protected CitrixResourceBase hypervisorResource;
+
+ public XenServerStorageResource(CitrixResourceBase resource) {
+ this.hypervisorResource = resource;
+ }
+
+ public Answer handleStorageCommands(StorageSubSystemCommand command) {
+ if (command instanceof CopyTemplateToPrimaryStorageCmd) {
+ return this.execute((CopyTemplateToPrimaryStorageCmd)command);
+ }
+ return new Answer((Command)command, false, "not implemented yet");
+ }
+
+ private long getTemplateSize(String url) {
+ HttpGet method = new HttpGet(url);
+ HttpClient client = new HttpClient();
+ try {
+ int responseCode = client.executeMethod(method);
+ if (responseCode != HttpStatus.SC_OK) {
+ throw new CloudRuntimeException("http get returns error code:" + responseCode);
+ }
+ method.get
+ } catch (HttpException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+
+ protected Answer directDownloadHttpTemplate(TemplateTO template, PrimaryDataStoreTO primarDataStore) {
+ String primaryStoreUuid = primarDataStore.getUuid();
+ Connection conn = hypervisorResource.getConnection();
+ SR poolsr = null;
+ VDI vdi = null;
+ try {
+
+ Set<SR> srs = SR.getByNameLabel(conn, primaryStoreUuid);
+ if (srs.size() != 1) {
+ throw new CloudRuntimeException("storage uuid: " + primaryStoreUuid + " is not unique");
+ }
+ poolsr = srs.iterator().next();
+ VDI.Record vdir = new VDI.Record();
+ vdir.nameLabel = "Base-Image-" + UUID.randomUUID().toString();
+ vdir.SR = poolsr;
+ vdir.type = Types.VdiType.USER;
+
+ vdir.virtualSize = template.getSize();
+ vdi = VDI.create(conn, vdir);
+
+ vdir = vdi.getRecord(conn);
+ String vdiLocation = vdir.location;
+ Set<PBD> pbds = poolsr.getPBDs(conn);
+ if (pbds.size() != 1) {
+ throw new CloudRuntimeException("Don't how to handle multiple pbds:" + pbds.size() + " for sr: " + poolsr.getUuid(conn));
+ }
+ PBD pbd = pbds.iterator().next();
+ PBD.Record pbdRec = pbd.getRecord(conn);
+ Map<String, String> deviceCfg = pbd.getDeviceConfig(conn);
+ String pbdLocation = deviceCfg.get("location");
+ if (pbdLocation == null) {
+ throw new CloudRuntimeException("Can't get pbd: " + pbd.getUuid(conn) + " location");
+ }
+
+ String vdiPath = pbdLocation + "/" + vdiLocation;
+ //download a url into vdipath
+
+ } catch (BadServerResponse e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (XenAPIException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (XmlRpcException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+
+ protected Answer execute(CopyTemplateToPrimaryStorageCmd cmd) {
+ ImageOnPrimayDataStoreTO imageTO = cmd.getImage();
+ TemplateTO template = imageTO.getTemplate();
+ ImageDataStoreTO imageStore = template.getImageDataStore();
+ if (imageStore.getType().equalsIgnoreCase("http")) {
+ return directDownloadHttpTemplate(template, imageTO.getPrimaryDataStore());
+ } else {
+ return new Answer(cmd, false, "not implemented yet");
+ /*
+ String tmplturl = cmd.getUrl();
+ String poolName = cmd.getPoolUuid();
+ int wait = cmd.getWait();
+ try {
+ URI uri = new URI(tmplturl);
+ String tmplpath = uri.getHost() + ":" + uri.getPath();
+ Connection conn = hypervisorResource.getConnection();
+ SR poolsr = null;
+ Set<SR> srs = SR.getByNameLabel(conn, poolName);
+ if (srs.size() != 1) {
+ String msg = "There are " + srs.size() + " SRs with same name: " + poolName;
+ s_logger.warn(msg);
+ return new PrimaryStorageDownloadAnswer(msg);
+ } else {
+ poolsr = srs.iterator().next();
+ }
+ String pUuid = poolsr.getUuid(conn);
+ boolean isISCSI = IsISCSI(poolsr.getType(conn));
+ String uuid = copy_vhd_from_secondarystorage(conn, tmplpath, pUuid, wait);
+ VDI tmpl = getVDIbyUuid(conn, uuid);
+ VDI snapshotvdi = tmpl.snapshot(conn, new HashMap<String, String>());
+ String snapshotUuid = snapshotvdi.getUuid(conn);
+ snapshotvdi.setNameLabel(conn, "Template " + cmd.getName());
+ String parentuuid = getVhdParent(conn, pUuid, snapshotUuid, isISCSI);
+ VDI parent = getVDIbyUuid(conn, parentuuid);
+ Long phySize = parent.getPhysicalUtilisation(conn);
+ tmpl.destroy(conn);
+ poolsr.scan(conn);
+ try{
+ Thread.sleep(5000);
+ } catch (Exception e) {
+ }
+ return new PrimaryStorageDownloadAnswer(snapshotvdi.getUuid(conn), phySize);
+ } catch (Exception e) {
+ String msg = "Catch Exception " + e.getClass().getName() + " on host:" + _host.uuid + " for template: "
+ + tmplturl + " due to " + e.toString();
+ s_logger.warn(msg, e);
+ return new PrimaryStorageDownloadAnswer(msg);
+ }*/
+ }
+
+ }
+}