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/09/02 02:40:42 UTC
git commit: continue addding new files
Updated Branches:
refs/heads/javelin 83e2b7ad6 -> 7d92c1dc2
continue addding new files
Project: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/commit/7d92c1dc
Tree: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/tree/7d92c1dc
Diff: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/diff/7d92c1dc
Branch: refs/heads/javelin
Commit: 7d92c1dc2780da5999158dccdf60185e07871fff
Parents: 83e2b7a
Author: Edison Su <su...@gmail.com>
Authored: Sat Sep 1 17:38:50 2012 -0700
Committer: Edison Su <su...@gmail.com>
Committed: Sat Sep 1 17:38:50 2012 -0700
----------------------------------------------------------------------
api/src/com/cloud/vm/DiskProfile.java | 17 +++
.../platform/subsystem/api/storage/DataStore.java | 10 ++-
.../subsystem/api/storage/DataStoreDriver.java | 3 +
.../subsystem/api/storage/DataStoreEndPoint.java | 7 +
.../api/storage/DataStoreEndPointSelector.java | 2 +-
.../subsystem/api/storage/StorageEvent.java | 24 ++++
.../subsystem/api/storage/TemplateProfile.java | 46 +++++++
.../subsystem/api/storage/TemplateStrategy.java | 4 +-
.../subsystem/api/storage/VolumeProfile.java | 8 ++
.../subsystem/api/storage/VolumeStrategy.java | 14 +-
.../storage/StorageOrchestratorImpl.java | 25 ++--
.../storage/datastore/DefaultDataStore.java | 10 ++
.../storage/datastore/XenDataStoreDriver.java | 43 -------
.../XenNfsDataStoreConfigurator.java | 3 +-
.../storage/driver/AbstractStorageDriver.java | 69 ++++++++++
.../storage/driver/XenServerStorageDriver.java | 69 ++++++++++
.../cloudstack/storage/manager/ImageManager.java | 34 -----
.../storage/manager/ImageManagerImpl.java | 23 ----
.../storage/manager/SecondaryStorageManager.java | 10 ++-
.../storage/manager/TemplateManager.java | 33 +++++
.../storage/manager/TemplateManagerImpl.java | 91 +++++++++++++
.../storage/strategy/DefaultTemplateStratey.java | 98 +++++++++++++++
.../storage/strategy/DefaultVolumeStrategy.java | 62 +++++++--
.../cloudstack/storage/volume/VolumeManager.java | 5 +
24 files changed, 571 insertions(+), 139 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7d92c1dc/api/src/com/cloud/vm/DiskProfile.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/vm/DiskProfile.java b/api/src/com/cloud/vm/DiskProfile.java
index bb74d84..e34a334 100644
--- a/api/src/com/cloud/vm/DiskProfile.java
+++ b/api/src/com/cloud/vm/DiskProfile.java
@@ -34,6 +34,7 @@ public class DiskProfile {
private long diskOfferingId;
private Long templateId;
private long volumeId;
+ private String path;
private HypervisorType hyperType;
@@ -56,6 +57,10 @@ public class DiskProfile {
this(vol.getId(), vol.getVolumeType(), vol.getName(), offering.getId(), vol.getSize(), offering.getTagsArray(), offering.getUseLocalStorage(), offering.isCustomized(), null);
this.hyperType = hyperType;
}
+
+ public DiskProfile(DiskProfile dp) {
+
+ }
/**
* @return size of the disk requested in bytes.
@@ -137,4 +142,16 @@ public class DiskProfile {
public HypervisorType getHypersorType() {
return this.hyperType;
}
+
+ public void setPath(String path) {
+ this.path = path;
+ }
+
+ public String getPath() {
+ return this.path;
+ }
+
+ public void setSize(long size) {
+ this.size = size;
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7d92c1dc/platform/api/src/org/apache/cloudstack/platform/subsystem/api/storage/DataStore.java
----------------------------------------------------------------------
diff --git a/platform/api/src/org/apache/cloudstack/platform/subsystem/api/storage/DataStore.java b/platform/api/src/org/apache/cloudstack/platform/subsystem/api/storage/DataStore.java
index b8d4e95..20a16e5 100644
--- a/platform/api/src/org/apache/cloudstack/platform/subsystem/api/storage/DataStore.java
+++ b/platform/api/src/org/apache/cloudstack/platform/subsystem/api/storage/DataStore.java
@@ -18,7 +18,9 @@
*/
package org.apache.cloudstack.platform.subsystem.api.storage;
+import com.cloud.agent.api.to.StorageFilerTO;
import com.cloud.storage.Snapshot;
+import com.cloud.storage.Storage.StoragePoolType;
import com.cloud.storage.Volume;
import com.cloud.template.VirtualMachineTemplate;
@@ -46,7 +48,9 @@ public interface DataStore {
long getCluterId();
long getPodId();
long getZoneId();
+ String getPath();
StoreType getType();
+ StoragePoolType getPoolType();
StoreScope getScope();
boolean isSharedStorage();
Long getId();
@@ -56,6 +60,7 @@ public interface DataStore {
VolumeStrategy getVolumeStrategy();
SnapshotStrategy getSnapshotStrategy();
BackupStrategy getBackupStrategy();
+ TemplateStrategy getTemplateStrategy();
DataStoreLifeCycle getLifeCycle();
VolumeProfile prepareVolume(Volume volume, DataStore destStore);
@@ -63,6 +68,7 @@ public interface DataStore {
TemplateProfile prepareTemplate(VirtualMachineTemplate template, DataStore destStore);
boolean contains(Volume volume);
boolean contains(Snapshot snapshot);
- boolean contains(VirtualMachineTemplate template);
- TemplateProfile get(VirtualMachineTemplate template);
+ boolean contains(TemplateProfile template);
+ TemplateProfile get(TemplateProfile template);
+ StorageFilerTO getTO();
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7d92c1dc/platform/api/src/org/apache/cloudstack/platform/subsystem/api/storage/DataStoreDriver.java
----------------------------------------------------------------------
diff --git a/platform/api/src/org/apache/cloudstack/platform/subsystem/api/storage/DataStoreDriver.java b/platform/api/src/org/apache/cloudstack/platform/subsystem/api/storage/DataStoreDriver.java
index 1b285bb..61ff967 100644
--- a/platform/api/src/org/apache/cloudstack/platform/subsystem/api/storage/DataStoreDriver.java
+++ b/platform/api/src/org/apache/cloudstack/platform/subsystem/api/storage/DataStoreDriver.java
@@ -20,9 +20,12 @@ package org.apache.cloudstack.platform.subsystem.api.storage;
import com.cloud.agent.api.Answer;
import com.cloud.agent.api.Command;
+import com.cloud.vm.DiskProfile;
public interface DataStoreDriver {
String getDriverType();
+ TemplateProfile install(TemplateProfile tp, DataStoreEndPoint ep);
+ DiskProfile createVolumeFromTemplate(DiskProfile volProfile, TemplateProfile tp, DataStoreEndPoint ep);
DataObject create(DataObject obj);
DataObject copy(DataObject src, DataStore dest);
DataObject copy(DataObject src, DataObject dest);
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7d92c1dc/platform/api/src/org/apache/cloudstack/platform/subsystem/api/storage/DataStoreEndPoint.java
----------------------------------------------------------------------
diff --git a/platform/api/src/org/apache/cloudstack/platform/subsystem/api/storage/DataStoreEndPoint.java b/platform/api/src/org/apache/cloudstack/platform/subsystem/api/storage/DataStoreEndPoint.java
index 92f431a..8029424 100644
--- a/platform/api/src/org/apache/cloudstack/platform/subsystem/api/storage/DataStoreEndPoint.java
+++ b/platform/api/src/org/apache/cloudstack/platform/subsystem/api/storage/DataStoreEndPoint.java
@@ -1,5 +1,8 @@
package org.apache.cloudstack.platform.subsystem.api.storage;
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.Command;
+
public class DataStoreEndPoint {
protected long hostId;
protected String privIp;
@@ -16,4 +19,8 @@ public class DataStoreEndPoint {
public String getPrivateIp() {
return privIp;
}
+
+ public Answer sendCommand(Command cmd) {
+ return new Answer(cmd);
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7d92c1dc/platform/api/src/org/apache/cloudstack/platform/subsystem/api/storage/DataStoreEndPointSelector.java
----------------------------------------------------------------------
diff --git a/platform/api/src/org/apache/cloudstack/platform/subsystem/api/storage/DataStoreEndPointSelector.java b/platform/api/src/org/apache/cloudstack/platform/subsystem/api/storage/DataStoreEndPointSelector.java
index df6d96c..30b597c 100644
--- a/platform/api/src/org/apache/cloudstack/platform/subsystem/api/storage/DataStoreEndPointSelector.java
+++ b/platform/api/src/org/apache/cloudstack/platform/subsystem/api/storage/DataStoreEndPointSelector.java
@@ -3,5 +3,5 @@ package org.apache.cloudstack.platform.subsystem.api.storage;
import java.util.List;
public interface DataStoreEndPointSelector {
- List<DataStoreEndPoint> getEndPoints();
+ List<DataStoreEndPoint> getEndPoints(StorageEvent event);
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7d92c1dc/platform/api/src/org/apache/cloudstack/platform/subsystem/api/storage/StorageEvent.java
----------------------------------------------------------------------
diff --git a/platform/api/src/org/apache/cloudstack/platform/subsystem/api/storage/StorageEvent.java b/platform/api/src/org/apache/cloudstack/platform/subsystem/api/storage/StorageEvent.java
new file mode 100644
index 0000000..7ff4a76
--- /dev/null
+++ b/platform/api/src/org/apache/cloudstack/platform/subsystem/api/storage/StorageEvent.java
@@ -0,0 +1,24 @@
+/*
+ * 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.platform.subsystem.api.storage;
+
+public enum StorageEvent {
+ DownloadTemplateToPrimary,
+ CreateVolumeFromTemplate;
+}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7d92c1dc/platform/api/src/org/apache/cloudstack/platform/subsystem/api/storage/TemplateProfile.java
----------------------------------------------------------------------
diff --git a/platform/api/src/org/apache/cloudstack/platform/subsystem/api/storage/TemplateProfile.java b/platform/api/src/org/apache/cloudstack/platform/subsystem/api/storage/TemplateProfile.java
index fec5de7..39da9d3 100644
--- a/platform/api/src/org/apache/cloudstack/platform/subsystem/api/storage/TemplateProfile.java
+++ b/platform/api/src/org/apache/cloudstack/platform/subsystem/api/storage/TemplateProfile.java
@@ -18,9 +18,55 @@
*/
package org.apache.cloudstack.platform.subsystem.api.storage;
+import com.cloud.storage.Storage;
+
public class TemplateProfile {
private String _uri;
+ private String _imageStorageUri;
+ private String _localPath;
+ private long _id;
+ private long _templatePoolRefId;
public String getURI() {
return _uri;
}
+
+ public long getId() {
+ return _id;
+ }
+
+ public String getLocalPath() {
+ return _localPath;
+ }
+
+ public void setLocalPath(String path) {
+ _localPath = path;
+ }
+
+ public void setTemplatePoolRefId(long id) {
+ this._templatePoolRefId = id;
+ }
+
+ public long getTemplatePoolRefId() {
+ return this._templatePoolRefId;
+ }
+
+ public String getImageStorageUri() {
+ return _imageStorageUri;
+ }
+
+ public String getUniqueName() {
+ return null;
+ }
+
+ public Storage.ImageFormat getFormat() {
+ return null;
+ }
+
+ public String getInstallPath() {
+ return null;
+ }
+
+ public long getTemplateSize() {
+ return 0;
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7d92c1dc/platform/api/src/org/apache/cloudstack/platform/subsystem/api/storage/TemplateStrategy.java
----------------------------------------------------------------------
diff --git a/platform/api/src/org/apache/cloudstack/platform/subsystem/api/storage/TemplateStrategy.java b/platform/api/src/org/apache/cloudstack/platform/subsystem/api/storage/TemplateStrategy.java
index 01e90c5..a76f17d 100644
--- a/platform/api/src/org/apache/cloudstack/platform/subsystem/api/storage/TemplateStrategy.java
+++ b/platform/api/src/org/apache/cloudstack/platform/subsystem/api/storage/TemplateStrategy.java
@@ -1,5 +1,7 @@
package org.apache.cloudstack.platform.subsystem.api.storage;
public interface TemplateStrategy {
-
+ TemplateProfile install(TemplateProfile tp);
+ TemplateProfile get(long templateId);
+ int getDownloadWait();
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7d92c1dc/platform/api/src/org/apache/cloudstack/platform/subsystem/api/storage/VolumeProfile.java
----------------------------------------------------------------------
diff --git a/platform/api/src/org/apache/cloudstack/platform/subsystem/api/storage/VolumeProfile.java b/platform/api/src/org/apache/cloudstack/platform/subsystem/api/storage/VolumeProfile.java
index 8af9bc5..236ebf5 100644
--- a/platform/api/src/org/apache/cloudstack/platform/subsystem/api/storage/VolumeProfile.java
+++ b/platform/api/src/org/apache/cloudstack/platform/subsystem/api/storage/VolumeProfile.java
@@ -23,4 +23,12 @@ public class VolumeProfile {
public String getURI() {
return _uri;
}
+
+ public String getPath() {
+ return null;
+ }
+
+ public long getSize() {
+ return 0;
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7d92c1dc/platform/api/src/org/apache/cloudstack/platform/subsystem/api/storage/VolumeStrategy.java
----------------------------------------------------------------------
diff --git a/platform/api/src/org/apache/cloudstack/platform/subsystem/api/storage/VolumeStrategy.java b/platform/api/src/org/apache/cloudstack/platform/subsystem/api/storage/VolumeStrategy.java
index deea0d4..207bbba 100644
--- a/platform/api/src/org/apache/cloudstack/platform/subsystem/api/storage/VolumeStrategy.java
+++ b/platform/api/src/org/apache/cloudstack/platform/subsystem/api/storage/VolumeStrategy.java
@@ -5,12 +5,12 @@ import com.cloud.storage.Volume;
public interface VolumeStrategy {
Volume createVolume(Volume vol);
- Volume createDataVolume(Volume vol, DataStore store);
- Volume copyVolumeFromBackup(VolumeProfile srcVol, Volume destVol, DataStore destStore);
- Volume createVolumeFromSnapshot(SnapshotProfile snapshot, Volume vol, DataStore destStore);
- Volume createVolumeFromTemplate(TemplateProfile template, Volume vol, DataStore destStore);
- Volume migrateVolume(Volume srcVol, DataStore srcStore, Volume destVol, DataStore destStore);
- TemplateProfile createBaseVolume(TemplateProfile tp, DataStore destStore);
- Volume createVolumeFromBaseTemplate(TemplateProfile tp, DataStore destStore);
+ Volume createDataVolume(Volume vol);
+ Volume copyVolumeFromBackup(VolumeProfile srcVol, Volume destVol);
+ Volume createVolumeFromSnapshot(SnapshotProfile snapshot, Volume vol);
+ Volume createVolumeFromTemplate(TemplateProfile template, Volume vol);
+ Volume migrateVolume(Volume srcVol, Volume destVol, DataStore destStore);
+ Volume createVolumeFromBaseTemplate(Volume destVol, TemplateProfile tp);
boolean deleteVolume(Volume vol);
+ VolumeProfile get(long volumeId);
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7d92c1dc/platform/storage/src/org/apache/cloudstack/storage/StorageOrchestratorImpl.java
----------------------------------------------------------------------
diff --git a/platform/storage/src/org/apache/cloudstack/storage/StorageOrchestratorImpl.java b/platform/storage/src/org/apache/cloudstack/storage/StorageOrchestratorImpl.java
index 9b5ceff..e53cb0b 100644
--- a/platform/storage/src/org/apache/cloudstack/storage/StorageOrchestratorImpl.java
+++ b/platform/storage/src/org/apache/cloudstack/storage/StorageOrchestratorImpl.java
@@ -29,7 +29,7 @@ import org.apache.cloudstack.platform.subsystem.api.storage.VolumeProfile;
import org.apache.cloudstack.platform.subsystem.api.storage.VolumeStrategy;
import org.apache.cloudstack.storage.db.VolumeHostVO;
import org.apache.cloudstack.storage.manager.BackupStorageManager;
-import org.apache.cloudstack.storage.manager.ImageManager;
+import org.apache.cloudstack.storage.manager.TemplateManager;
import org.apache.cloudstack.storage.manager.SecondaryStorageManager;
import org.apache.cloudstack.storage.volume.VolumeManager;
import org.apache.log4j.Logger;
@@ -76,13 +76,13 @@ public class StorageOrchestratorImpl implements StorageOrchestrator {
@Inject
SecondaryStorageManager _secondaryStorageMgr;
@Inject
- ImageManager _imageMgr;
+ TemplateManager _templateMgr;
@Inject
VMTemplateDao _templateDao;
@DB
protected Volume copyVolumeFromBackupStorage(VolumeVO volume, DataStore destStore, String reservationId) throws NoTransitionException {
- DataStore ds = _secondaryStorageMgr.getBackupDataStore(volume);
+ DataStore ds = _secondaryStorageMgr.getStore(volume);
if (!ds.contains(volume)) {
throw new CloudRuntimeException("volume: " + volume + "doesn't exist on backup storage");
}
@@ -98,7 +98,7 @@ public class StorageOrchestratorImpl implements StorageOrchestrator {
destVolume = _volumeMgr.processEvent(destVolume, Volume.Event.CreateRequested);
txn.commit();
- vs.copyVolumeFromBackup(vp, destVolume, destStore);
+ vs.copyVolumeFromBackup(vp, destVolume);
txn.start();
volume = _volumeMgr.processEvent(volume, Volume.Event.OperationSucceeded);
@@ -119,7 +119,7 @@ public class StorageOrchestratorImpl implements StorageOrchestrator {
txn.commit();
VolumeStrategy vs = srcStore.getVolumeStrategy();
- vs.migrateVolume(volume, srcStore, destVolume, destStore);
+ vs.migrateVolume(volume, destVolume, destStore);
txn.start();
volume = _volumeMgr.processEvent(volume, Volume.Event.OperationSucceeded);
@@ -147,7 +147,7 @@ public class StorageOrchestratorImpl implements StorageOrchestrator {
DataStore srcStore = _storageProviderMgr.getDataStore(srcVolume.getPoolId());
VolumeStrategy vs = srcStore.getVolumeStrategy();
- vs.migrateVolume(srcVolume, srcStore, destVolume, destStore);
+ vs.migrateVolume(srcVolume, destVolume, destStore);
txn.start();
srcVolume = _volumeMgr.processEvent(srcVolume, Volume.Event.OperationSucceeded);
@@ -170,16 +170,17 @@ public class StorageOrchestratorImpl implements StorageOrchestrator {
if (volume.getTemplateId() != null) {
VirtualMachineTemplate template = _templateDao.findById(volume.getTemplateId());
- DataStore ds = _secondaryStorageMgr.getBackupDataStore(template);
+ DataStore ds = _secondaryStorageMgr.getImageStore(destStore);
TemplateProfile tp = ds.prepareTemplate(template, destStore);
- if (!destStore.contains(template)) {
- tp = vs.createBaseVolume(tp, destStore);
+ if (!destStore.contains(tp)) {
+ tp = _templateMgr.AssociateTemplateStoragePool(tp, destStore);
+ tp = destStore.getTemplateStrategy().install(tp);
} else {
- tp = destStore.get(template);
+ tp = destStore.getTemplateStrategy().get(tp.getId());
}
- volume = vs.createVolumeFromBaseTemplate(tp, destStore);
+ volume = vs.createVolumeFromBaseTemplate(volume, tp);
} else {
- volume = vs.createDataVolume(volume, destStore);
+ volume = vs.createDataVolume(volume);
}
volume = _volumeMgr.processEvent(volume, Volume.Event.OperationSucceeded);
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7d92c1dc/platform/storage/src/org/apache/cloudstack/storage/datastore/DefaultDataStore.java
----------------------------------------------------------------------
diff --git a/platform/storage/src/org/apache/cloudstack/storage/datastore/DefaultDataStore.java b/platform/storage/src/org/apache/cloudstack/storage/datastore/DefaultDataStore.java
index a3e52cf..81c7608 100644
--- a/platform/storage/src/org/apache/cloudstack/storage/datastore/DefaultDataStore.java
+++ b/platform/storage/src/org/apache/cloudstack/storage/datastore/DefaultDataStore.java
@@ -7,12 +7,14 @@ import org.apache.cloudstack.platform.subsystem.api.storage.DataStoreEndPointSel
import org.apache.cloudstack.platform.subsystem.api.storage.DataStoreLifeCycle;
import org.apache.cloudstack.platform.subsystem.api.storage.FileSystem;
import org.apache.cloudstack.platform.subsystem.api.storage.SnapshotStrategy;
+import org.apache.cloudstack.platform.subsystem.api.storage.TemplateStrategy;
import org.apache.cloudstack.platform.subsystem.api.storage.VolumeStrategy;
public class DefaultDataStore implements DataStore {
protected VolumeStrategy _volumeStrategy;
protected SnapshotStrategy _snapshotStrategy;
protected BackupStrategy _backupStrategy;
+ protected TemplateStrategy _templateStrategy;
protected String _uri;
protected String _uuid;
protected StoreType _type;
@@ -119,6 +121,14 @@ public class DefaultDataStore implements DataStore {
public void setBackupStrategy(BackupStrategy bs) {
this._backupSt = bs;
}
+
+ public TemplateStrategy getTemplateStrategy() {
+ return this._templateStrategy;
+ }
+
+ public void setTemplateStrategy(TemplateStrategy ts) {
+ this._templateStrategy = ts;
+ }
public DataStoreLifeCycle getLifeCycle() {
return this._dslf;
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7d92c1dc/platform/storage/src/org/apache/cloudstack/storage/datastore/XenDataStoreDriver.java
----------------------------------------------------------------------
diff --git a/platform/storage/src/org/apache/cloudstack/storage/datastore/XenDataStoreDriver.java b/platform/storage/src/org/apache/cloudstack/storage/datastore/XenDataStoreDriver.java
deleted file mode 100644
index 0c2ee37..0000000
--- a/platform/storage/src/org/apache/cloudstack/storage/datastore/XenDataStoreDriver.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package org.apache.cloudstack.storage.datastore;
-
-import org.apache.cloudstack.platform.subsystem.api.storage.DataObject;
-import org.apache.cloudstack.platform.subsystem.api.storage.DataStore;
-import org.apache.cloudstack.platform.subsystem.api.storage.DataStoreDriver;
-
-public class XenDataStoreDriver implements DataStoreDriver {
- protected DataStore _ds;
- public XenDataStoreDriver(DataStore ds) {
- _ds = ds;
- }
-
- public String getDriverType() {
- // TODO Auto-generated method stub
- return null;
- }
-
- public DataObject create(DataObject obj) {
- // TODO Auto-generated method stub
- return null;
- }
-
- public DataObject copy(DataObject src, DataStore dest) {
- // TODO Auto-generated method stub
- return null;
- }
-
- public DataObject copy(DataObject src, DataObject dest) {
- // TODO Auto-generated method stub
- return null;
- }
-
- public DataObject move(DataObject src, DataObject dest) {
- // TODO Auto-generated method stub
- return null;
- }
-
- public boolean delete(DataObject obj) {
- // TODO Auto-generated method stub
- return false;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7d92c1dc/platform/storage/src/org/apache/cloudstack/storage/datastoreconfigurator/XenNfsDataStoreConfigurator.java
----------------------------------------------------------------------
diff --git a/platform/storage/src/org/apache/cloudstack/storage/datastoreconfigurator/XenNfsDataStoreConfigurator.java b/platform/storage/src/org/apache/cloudstack/storage/datastoreconfigurator/XenNfsDataStoreConfigurator.java
index 8f49934..8d872a8 100644
--- a/platform/storage/src/org/apache/cloudstack/storage/datastoreconfigurator/XenNfsDataStoreConfigurator.java
+++ b/platform/storage/src/org/apache/cloudstack/storage/datastoreconfigurator/XenNfsDataStoreConfigurator.java
@@ -6,6 +6,7 @@ import org.apache.cloudstack.platform.subsystem.api.storage.DataStore;
import org.apache.cloudstack.platform.subsystem.api.storage.DataStore.StoreType;
import org.apache.cloudstack.storage.datastore.DefaultDataStore;
import org.apache.cloudstack.storage.datastore.XenDataStoreDriver;
+import org.apache.cloudstack.storage.driver.XenServerStorageDriver;
import org.apache.cloudstack.storage.epselector.DefaultPrimaryEndpointSelector;
import org.apache.cloudstack.storage.filesystem.DefaultFileSystem;
import org.apache.cloudstack.storage.lifecycle.DefaultPrimaryDataStoreLifeCycle;
@@ -24,7 +25,7 @@ public class XenNfsDataStoreConfigurator extends NfsDataStoreConfigurator {
ds.setType(StoreType.Primary);
ds.setURI(pool.getHostAddress() + "/" + pool.getPath());
ds.setUUID(pool.getUuid());
- ds.setDataStoreDriver(new XenDataStoreDriver(ds));
+ ds.setDataStoreDriver(new XenServerStorageDriver(ds));
ds.setBackupStrategy(new XenBackupStrategy(ds));
ds.setVolumeStrategy(new DefaultVolumeStrategy(ds));
ds.setSnapshotStrategy(new XenSnapshotStrategy(ds));
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7d92c1dc/platform/storage/src/org/apache/cloudstack/storage/driver/AbstractStorageDriver.java
----------------------------------------------------------------------
diff --git a/platform/storage/src/org/apache/cloudstack/storage/driver/AbstractStorageDriver.java b/platform/storage/src/org/apache/cloudstack/storage/driver/AbstractStorageDriver.java
new file mode 100644
index 0000000..10b39c0
--- /dev/null
+++ b/platform/storage/src/org/apache/cloudstack/storage/driver/AbstractStorageDriver.java
@@ -0,0 +1,69 @@
+/*
+ * 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.driver;
+
+import org.apache.cloudstack.platform.subsystem.api.storage.DataStore;
+import org.apache.cloudstack.platform.subsystem.api.storage.DataStoreDriver;
+import org.apache.cloudstack.platform.subsystem.api.storage.DataStoreEndPoint;
+import org.apache.cloudstack.platform.subsystem.api.storage.VolumeProfile;
+
+import org.apache.cloudstack.platform.subsystem.api.storage.TemplateProfile;
+import org.apache.cloudstack.platform.subsystem.api.storage.TemplateStrategy;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.storage.CreateAnswer;
+import com.cloud.agent.api.storage.CreateCommand;
+import com.cloud.agent.api.storage.PrimaryStorageDownloadCommand;
+import com.cloud.agent.api.to.VolumeTO;
+import com.cloud.vm.DiskProfile;
+
+
+
+public abstract class AbstractStorageDriver implements DataStoreDriver {
+ protected DataStore _ds;
+ protected TemplateStrategy _ts;
+
+ public AbstractStorageDriver(DataStore ds) {
+ _ds = ds;
+ _ts = ds.getTemplateStrategy();
+ }
+
+ public TemplateProfile install(TemplateProfile tp, DataStoreEndPoint ep) {
+ PrimaryStorageDownloadCommand dcmd = new PrimaryStorageDownloadCommand(tp.getUniqueName(), tp.getURI(), tp.getFormat(),
+ 0, _ds.getId(), _ds.getUUID(), _ts.getDownloadWait());
+ dcmd.setSecondaryStorageUrl(tp.getImageStorageUri());
+ dcmd.setPrimaryStorageUrl(_ds.getURI());
+ Answer asw = ep.sendCommand(dcmd);
+
+ TemplateProfile tpn = new TemplateProfile();
+ tpn.setLocalPath("/mnt/test");
+ tpn.setTemplatePoolRefId(tp.getTemplatePoolRefId());
+ return tpn;
+ }
+
+ public DiskProfile createVolumeFromTemplate(DiskProfile volProfile, TemplateProfile tp, DataStoreEndPoint ep) {
+ CreateCommand cmd = new CreateCommand(volProfile, tp.getLocalPath(), _ds.getTO());
+ CreateAnswer ans = (CreateAnswer)ep.sendCommand(cmd);
+ VolumeTO created = ans.getVolume();
+ DiskProfile diskProfile = new DiskProfile(volProfile);
+ diskProfile.setPath(created.getPath());
+ diskProfile.setSize(created.getSize());
+ return diskProfile;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7d92c1dc/platform/storage/src/org/apache/cloudstack/storage/driver/XenServerStorageDriver.java
----------------------------------------------------------------------
diff --git a/platform/storage/src/org/apache/cloudstack/storage/driver/XenServerStorageDriver.java b/platform/storage/src/org/apache/cloudstack/storage/driver/XenServerStorageDriver.java
new file mode 100644
index 0000000..eb50f11
--- /dev/null
+++ b/platform/storage/src/org/apache/cloudstack/storage/driver/XenServerStorageDriver.java
@@ -0,0 +1,69 @@
+/*
+ * 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.driver;
+
+import org.apache.cloudstack.platform.subsystem.api.storage.DataObject;
+import org.apache.cloudstack.platform.subsystem.api.storage.DataStore;
+import org.apache.cloudstack.platform.subsystem.api.storage.DataStoreEndPoint;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.Command;
+
+public class XenServerStorageDriver extends AbstractStorageDriver {
+ protected DataStore _ds;
+ public XenServerStorageDriver(DataStore ds) {
+ _ds = ds;
+ }
+
+ public String getDriverType() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public DataObject create(DataObject obj) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public DataObject copy(DataObject src, DataStore dest) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public DataObject copy(DataObject src, DataObject dest) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public DataObject move(DataObject src, DataObject dest) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public Answer sendMessage(DataStoreEndPoint dsep, Command cmd) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public boolean delete(DataObject obj) {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7d92c1dc/platform/storage/src/org/apache/cloudstack/storage/manager/ImageManager.java
----------------------------------------------------------------------
diff --git a/platform/storage/src/org/apache/cloudstack/storage/manager/ImageManager.java b/platform/storage/src/org/apache/cloudstack/storage/manager/ImageManager.java
deleted file mode 100644
index 81fe391..0000000
--- a/platform/storage/src/org/apache/cloudstack/storage/manager/ImageManager.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.cloudstack.storage.manager;
-
-import org.apache.cloudstack.platform.subsystem.api.storage.DataStore;
-import org.apache.cloudstack.platform.subsystem.api.storage.SnapshotProfile;
-import org.apache.cloudstack.platform.subsystem.api.storage.TemplateProfile;
-import org.apache.cloudstack.platform.subsystem.api.storage.VolumeProfile;
-
-import com.cloud.storage.Snapshot;
-import com.cloud.storage.Volume;
-import com.cloud.template.VirtualMachineTemplate;
-
-public interface ImageManager {
- VolumeProfile prepareVolume(Volume volume, DataStore destStore);
- SnapshotProfile prepareSnapshot(Snapshot snapshot, DataStore destStore);
- TemplateProfile prepareTemplate(VirtualMachineTemplate template, DataStore destStore);
-}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7d92c1dc/platform/storage/src/org/apache/cloudstack/storage/manager/ImageManagerImpl.java
----------------------------------------------------------------------
diff --git a/platform/storage/src/org/apache/cloudstack/storage/manager/ImageManagerImpl.java b/platform/storage/src/org/apache/cloudstack/storage/manager/ImageManagerImpl.java
deleted file mode 100644
index ade59f0..0000000
--- a/platform/storage/src/org/apache/cloudstack/storage/manager/ImageManagerImpl.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.cloudstack.storage.manager;
-
-public class ImageManagerImpl implements ImageManager {
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7d92c1dc/platform/storage/src/org/apache/cloudstack/storage/manager/SecondaryStorageManager.java
----------------------------------------------------------------------
diff --git a/platform/storage/src/org/apache/cloudstack/storage/manager/SecondaryStorageManager.java b/platform/storage/src/org/apache/cloudstack/storage/manager/SecondaryStorageManager.java
index 8fa1a95..2a80a96 100644
--- a/platform/storage/src/org/apache/cloudstack/storage/manager/SecondaryStorageManager.java
+++ b/platform/storage/src/org/apache/cloudstack/storage/manager/SecondaryStorageManager.java
@@ -18,6 +18,14 @@
*/
package org.apache.cloudstack.storage.manager;
-public interface SecondaryStorageManager {
+import org.apache.cloudstack.platform.subsystem.api.storage.DataStore;
+
+import com.cloud.storage.Snapshot;
+import com.cloud.storage.Volume;
+import com.cloud.template.VirtualMachineTemplate;
+public interface SecondaryStorageManager {
+ DataStore getStore(Volume volume);
+ DataStore getImageStore(DataStore destStore);
+ DataStore getStore(Snapshot snapshot);
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7d92c1dc/platform/storage/src/org/apache/cloudstack/storage/manager/TemplateManager.java
----------------------------------------------------------------------
diff --git a/platform/storage/src/org/apache/cloudstack/storage/manager/TemplateManager.java b/platform/storage/src/org/apache/cloudstack/storage/manager/TemplateManager.java
new file mode 100644
index 0000000..916d795
--- /dev/null
+++ b/platform/storage/src/org/apache/cloudstack/storage/manager/TemplateManager.java
@@ -0,0 +1,33 @@
+/*
+ * 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.manager;
+
+import org.apache.cloudstack.platform.subsystem.api.storage.DataStore;
+import org.apache.cloudstack.platform.subsystem.api.storage.SnapshotProfile;
+import org.apache.cloudstack.platform.subsystem.api.storage.TemplateProfile;
+import org.apache.cloudstack.platform.subsystem.api.storage.VolumeProfile;
+
+import com.cloud.storage.Snapshot;
+import com.cloud.storage.Volume;
+import com.cloud.template.VirtualMachineTemplate;
+
+public interface TemplateManager {
+ TemplateProfile AssociateTemplateStoragePool(TemplateProfile tp, DataStore ds);
+ TemplateProfile getProfile(long templateId);
+}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7d92c1dc/platform/storage/src/org/apache/cloudstack/storage/manager/TemplateManagerImpl.java
----------------------------------------------------------------------
diff --git a/platform/storage/src/org/apache/cloudstack/storage/manager/TemplateManagerImpl.java b/platform/storage/src/org/apache/cloudstack/storage/manager/TemplateManagerImpl.java
new file mode 100644
index 0000000..ba9cf0f
--- /dev/null
+++ b/platform/storage/src/org/apache/cloudstack/storage/manager/TemplateManagerImpl.java
@@ -0,0 +1,91 @@
+/*
+ * 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.manager;
+
+import org.apache.cloudstack.platform.subsystem.api.storage.DataStore;
+import org.apache.cloudstack.platform.subsystem.api.storage.TemplateProfile;
+import org.apache.log4j.Logger;
+
+import com.cloud.storage.VMTemplateHostVO;
+import com.cloud.storage.VMTemplateStoragePoolVO;
+import com.cloud.storage.VMTemplateStorageResourceAssoc.Status;
+import com.cloud.storage.VMTemplateVO;
+import com.cloud.storage.dao.VMTemplateDao;
+import com.cloud.storage.dao.VMTemplatePoolDao;
+import com.cloud.template.VirtualMachineTemplate;
+import com.cloud.utils.component.Inject;
+import com.cloud.utils.exception.CloudRuntimeException;
+
+public class TemplateManagerImpl implements TemplateManager {
+ private static final Logger s_logger = Logger.getLogger(TemplateManagerImpl.class);
+ @Inject
+ VMTemplateDao _templateDao;
+ @Inject
+ VMTemplatePoolDao _templatePoolDao;
+
+ public boolean contains(VirtualMachineTemplate template, DataStore ds) {
+ long templateId = template.getId();
+ long poolId = ds.getId();
+ VMTemplateStoragePoolVO templateStoragePoolRef = null;
+ templateStoragePoolRef = _templatePoolDao.findByPoolTemplate(poolId, templateId);
+ return templateStoragePoolRef == null ? false : true;
+ }
+
+ public TemplateProfile AssociateTemplateStoragePool(TemplateProfile tp, DataStore ds) {
+ long templateId = tp.getId();
+ long poolId = ds.getId();
+ VMTemplateStoragePoolVO templateStoragePoolRef = null;
+ long templateStoragePoolRefId;
+
+ templateStoragePoolRef = _templatePoolDao.findByPoolTemplate(poolId, templateId);
+ if (templateStoragePoolRef != null) {
+ templateStoragePoolRef.setMarkedForGC(false);
+ _templatePoolDao.update(templateStoragePoolRef.getId(), templateStoragePoolRef);
+
+ if (templateStoragePoolRef.getDownloadState() == Status.DOWNLOADED) {
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Template " + templateId + " has already been downloaded to pool " + poolId);
+ }
+
+ tp.setLocalPath(templateStoragePoolRef.getInstallPath());
+ tp.setTemplatePoolRefId(templateStoragePoolRef.getId());
+ return tp;
+ }
+ }
+
+ if (templateStoragePoolRef == null) {
+ templateStoragePoolRef = new VMTemplateStoragePoolVO(poolId, templateId);
+ try {
+ templateStoragePoolRef = _templatePoolDao.persist(templateStoragePoolRef);
+ templateStoragePoolRefId = templateStoragePoolRef.getId();
+ } catch (Exception e) {
+ s_logger.debug("Assuming we're in a race condition: " + e.getMessage());
+ templateStoragePoolRef = _templatePoolDao.findByPoolTemplate(poolId, templateId);
+ if (templateStoragePoolRef == null) {
+ throw new CloudRuntimeException("Unable to persist a reference for pool " + poolId + " and template " + templateId);
+ }
+ templateStoragePoolRefId = templateStoragePoolRef.getId();
+ }
+ } else {
+ templateStoragePoolRefId = templateStoragePoolRef.getId();
+ }
+ tp.setTemplatePoolRefId(templateStoragePoolRefId);
+ return tp;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7d92c1dc/platform/storage/src/org/apache/cloudstack/storage/strategy/DefaultTemplateStratey.java
----------------------------------------------------------------------
diff --git a/platform/storage/src/org/apache/cloudstack/storage/strategy/DefaultTemplateStratey.java b/platform/storage/src/org/apache/cloudstack/storage/strategy/DefaultTemplateStratey.java
new file mode 100644
index 0000000..e5701a1
--- /dev/null
+++ b/platform/storage/src/org/apache/cloudstack/storage/strategy/DefaultTemplateStratey.java
@@ -0,0 +1,98 @@
+/*
+ * 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.strategy;
+
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.cloudstack.platform.subsystem.api.storage.DataStore;
+import org.apache.cloudstack.platform.subsystem.api.storage.DataStoreDriver;
+import org.apache.cloudstack.platform.subsystem.api.storage.DataStoreEndPoint;
+import org.apache.cloudstack.platform.subsystem.api.storage.DataStoreEndPointSelector;
+import org.apache.cloudstack.platform.subsystem.api.storage.StorageEvent;
+import org.apache.cloudstack.platform.subsystem.api.storage.TemplateProfile;
+import org.apache.cloudstack.platform.subsystem.api.storage.TemplateStrategy;
+import org.apache.cloudstack.storage.manager.TemplateManager;
+import org.apache.log4j.Logger;
+
+import com.cloud.storage.VMTemplateStoragePoolVO;
+import com.cloud.storage.VMTemplateStorageResourceAssoc.Status;
+import com.cloud.storage.dao.VMTemplatePoolDao;
+import com.cloud.utils.component.Inject;
+import com.cloud.utils.exception.CloudRuntimeException;
+
+public class DefaultTemplateStratey implements TemplateStrategy {
+ private static final Logger s_logger = Logger.getLogger(DefaultTemplateStratey.class);
+ protected DataStore _ds;
+ protected DataStoreDriver _driver;
+ protected int _primaryStorageDownloadWait;
+ protected int _installTries = 3;
+ protected int _storagePoolMaxWaitSeconds = 3600;
+ @Inject
+ VMTemplatePoolDao _templatePoolDao;
+ @Inject
+ TemplateManager _templateMgr;
+
+ public TemplateProfile get(long templateId) {
+ return _templateMgr.getProfile(templateId);
+ }
+
+ public TemplateProfile install(TemplateProfile tp) {
+ DataStoreEndPointSelector dseps = _ds.getEndPointSelector();
+ List<DataStoreEndPoint> eps = dseps.getEndPoints(StorageEvent.DownloadTemplateToPrimary);
+ int tries = Math.min(eps.size(), _installTries);
+
+ VMTemplateStoragePoolVO templateStoragePoolRef = _templatePoolDao.acquireInLockTable(tp.getTemplatePoolRefId(), _storagePoolMaxWaitSeconds);
+ if (templateStoragePoolRef == null) {
+ throw new CloudRuntimeException("Unable to acquire lock on VMTemplateStoragePool: " + tp.getTemplatePoolRefId());
+ }
+
+ try {
+ for (int retry = 0; retry < tries; retry++) {
+ Collections.shuffle(eps);
+ DataStoreEndPoint ep = eps.get(0);
+ try {
+ tp = _driver.install(tp, ep);
+ templateStoragePoolRef.setDownloadPercent(100);
+ templateStoragePoolRef.setDownloadState(Status.DOWNLOADED);
+ templateStoragePoolRef.setLocalDownloadPath(tp.getInstallPath());
+ templateStoragePoolRef.setInstallPath(tp.getInstallPath());
+ templateStoragePoolRef.setTemplateSize(tp.getTemplateSize());
+ _templatePoolDao.update(templateStoragePoolRef.getId(), templateStoragePoolRef);
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Template " + tp.getId() + " is installed via " + ep.getHostId());
+ }
+ return get(tp.getId());
+ } catch (CloudRuntimeException e) {
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Template " + tp.getId() + " download to pool " + _ds.getId() + " failed due to " + e.toString());
+ }
+ }
+ }
+ } finally {
+ _templatePoolDao.releaseFromLockTable(tp.getTemplatePoolRefId());
+ }
+
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Template " + tp.getId() + " is not found on and can not be downloaded to pool " + _ds.getId());
+ }
+ return null;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7d92c1dc/platform/storage/src/org/apache/cloudstack/storage/strategy/DefaultVolumeStrategy.java
----------------------------------------------------------------------
diff --git a/platform/storage/src/org/apache/cloudstack/storage/strategy/DefaultVolumeStrategy.java b/platform/storage/src/org/apache/cloudstack/storage/strategy/DefaultVolumeStrategy.java
index 9e11b44..35e284f 100644
--- a/platform/storage/src/org/apache/cloudstack/storage/strategy/DefaultVolumeStrategy.java
+++ b/platform/storage/src/org/apache/cloudstack/storage/strategy/DefaultVolumeStrategy.java
@@ -1,56 +1,90 @@
package org.apache.cloudstack.storage.strategy;
+import java.util.List;
+
import org.apache.cloudstack.platform.subsystem.api.storage.DataStore;
+import org.apache.cloudstack.platform.subsystem.api.storage.DataStoreDriver;
+
+import org.apache.cloudstack.platform.subsystem.api.storage.DataStoreEndPoint;
+import org.apache.cloudstack.platform.subsystem.api.storage.DataStoreEndPointSelector;
import org.apache.cloudstack.platform.subsystem.api.storage.SnapshotProfile;
+import org.apache.cloudstack.platform.subsystem.api.storage.StorageEvent;
import org.apache.cloudstack.platform.subsystem.api.storage.TemplateProfile;
import org.apache.cloudstack.platform.subsystem.api.storage.VolumeProfile;
import org.apache.cloudstack.platform.subsystem.api.storage.VolumeStrategy;
+import org.apache.cloudstack.storage.volume.VolumeManager;
+
+import org.apache.log4j.Logger;
+
import com.cloud.storage.Volume;
+import com.cloud.storage.VolumeVO;
+import com.cloud.utils.component.Inject;
+
public class DefaultVolumeStrategy implements VolumeStrategy {
+ private static final Logger s_logger = Logger.getLogger(DefaultVolumeStrategy.class);
protected DataStore _ds;
+ protected DataStoreDriver _driver;
+ @Inject
+ VolumeManager _volumeMgr;
+
+ public VolumeProfile get(long volumeId) {
+ return _volumeMgr.getProfile(volumeId);
+ }
+
public DefaultVolumeStrategy(DataStore ds) {
_ds = ds;
}
-
public Volume createVolume(Volume vol) {
// TODO Auto-generated method stub
return null;
}
- public Volume createDataVolume(Volume vol, DataStore store) {
+ public Volume createDataVolume(Volume vol) {
// TODO Auto-generated method stub
return null;
}
- public Volume copyVolumeFromBackup(VolumeProfile srcVol, Volume destVol, DataStore destStore) {
+ public Volume copyVolumeFromBackup(VolumeProfile srcVol, Volume destVol) {
// TODO Auto-generated method stub
return null;
}
- public Volume createVolumeFromSnapshot(SnapshotProfile snapshot, Volume vol, DataStore destStore) {
+ public Volume createVolumeFromSnapshot(SnapshotProfile snapshot, Volume vol) {
// TODO Auto-generated method stub
return null;
}
- public Volume createVolumeFromTemplate(TemplateProfile template, Volume vol, DataStore destStore) {
+ public Volume createVolumeFromTemplate(TemplateProfile template, Volume vol) {
// TODO Auto-generated method stub
return null;
}
- public Volume migrateVolume(Volume srcVol, DataStore srcStore, Volume destVol, DataStore destStore) {
+ public Volume migrateVolume(Volume srcVol, Volume destVol, DataStore destStore) {
// TODO Auto-generated method stub
return null;
}
- public TemplateProfile createBaseVolume(TemplateProfile tp, DataStore destStore) {
- // TODO Auto-generated method stub
- return null;
- }
- public Volume createVolumeFromBaseTemplate(TemplateProfile tp, DataStore destStore) {
- // TODO Auto-generated method stub
- return null;
+
+ public Volume createVolumeFromBaseTemplate(Volume volume, TemplateProfile tp) {
+ DataStoreEndPointSelector dsep = _ds.getEndPointSelector();
+ List<DataStoreEndPoint> dseps = dsep.getEndPoints(StorageEvent.CreateVolumeFromTemplate);
+ DataStoreEndPoint dp = dseps.get(0);
+
+ VolumeProfile vp = _driver.createVolumeFromTemplate(get(volume.getId()), tp, dp);
+
+ VolumeVO vlvo = _volumeMgr.getVolume(volume.getId());
+
+ vlvo.setFolder(_ds.getPath());
+ vlvo.setPath(vp.getPath());
+ vlvo.setSize(vp.getSize());
+ vlvo.setPoolType(_ds.getPoolType());
+ vlvo.setPoolId(_ds.getId());
+ vlvo.setPodId(_ds.getPodId());
+
+ return _volumeMgr.updateVolume(vlvo);
}
public boolean deleteVolume(Volume vol) {
// TODO Auto-generated method stub
return false;
}
-
+
+
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7d92c1dc/platform/storage/src/org/apache/cloudstack/storage/volume/VolumeManager.java
----------------------------------------------------------------------
diff --git a/platform/storage/src/org/apache/cloudstack/storage/volume/VolumeManager.java b/platform/storage/src/org/apache/cloudstack/storage/volume/VolumeManager.java
index 625f305..1b4bc93 100644
--- a/platform/storage/src/org/apache/cloudstack/storage/volume/VolumeManager.java
+++ b/platform/storage/src/org/apache/cloudstack/storage/volume/VolumeManager.java
@@ -18,6 +18,8 @@
*/
package org.apache.cloudstack.storage.volume;
+import org.apache.cloudstack.platform.subsystem.api.storage.VolumeProfile;
+
import com.cloud.storage.Volume;
import com.cloud.storage.VolumeVO;
import com.cloud.utils.fsm.NoTransitionException;
@@ -25,4 +27,7 @@ import com.cloud.utils.fsm.NoTransitionException;
public interface VolumeManager {
VolumeVO allocateDuplicateVolume(VolumeVO oldVol);
VolumeVO processEvent(Volume vol, Volume.Event event) throws NoTransitionException;
+ VolumeProfile getProfile(long volumeId);
+ VolumeVO getVolume(long volumeId);
+ VolumeVO updateVolume(VolumeVO volume);
}