You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by da...@apache.org on 2013/10/23 21:44:04 UTC
[47/47] git commit: updated refs/heads/master to c910196
Added StorageStrategyFactory to centralize and deduplicate some logic
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/c9101966
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/c9101966
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/c9101966
Branch: refs/heads/master
Commit: c9101966e0a76abb077556d946e140dc14088eb5
Parents: 81d0136
Author: Darren Shepherd <da...@gmail.com>
Authored: Wed Oct 23 12:40:41 2013 -0700
Committer: Darren Shepherd <da...@gmail.com>
Committed: Wed Oct 23 12:40:41 2013 -0700
----------------------------------------------------------------------
.../api/storage/DataMotionStrategy.java | 4 +-
.../subsystem/api/storage/SnapshotStrategy.java | 2 +-
.../api/storage/StorageStrategyFactory.java | 45 ++++++
.../subsystem/api/storage/StrategyPriority.java | 68 +--------
.../api/storage/StrategyPriorityTest.java | 152 -------------------
...g-engine-storage-datamotion-core-context.xml | 1 -
.../motion/AncientDataMotionStrategy.java | 10 +-
.../storage/motion/DataMotionServiceImpl.java | 21 +--
.../core/spring-engine-storage-core-context.xml | 5 +
.../storage/snapshot/SnapshotObject.java | 5 +-
.../snapshot/XenserverSnapshotStrategy.java | 7 +-
.../helper/StorageStrategyFactoryImpl.java | 139 +++++++++++++++++
.../api/storage/StrategyPriorityTest.java | 122 +++++++++++++++
.../motion/SimulatorDataMotionStrategy.java | 10 +-
.../motion/VmwareStorageMotionStrategy.java | 12 +-
.../motion/VmwareStorageMotionStrategyTest.java | 10 +-
.../motion/XenServerStorageMotionStrategy.java | 12 +-
.../spring-server-core-managers-context.xml | 4 +-
.../storage/snapshot/SnapshotManagerImpl.java | 21 +--
19 files changed, 368 insertions(+), 282 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c9101966/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataMotionStrategy.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataMotionStrategy.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataMotionStrategy.java
index 950f9e2..85fbf73 100644
--- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataMotionStrategy.java
+++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataMotionStrategy.java
@@ -26,9 +26,9 @@ import com.cloud.agent.api.to.VirtualMachineTO;
import com.cloud.host.Host;
public interface DataMotionStrategy {
- StrategyPriority.Priority canHandle(DataObject srcData, DataObject destData);
+ StrategyPriority canHandle(DataObject srcData, DataObject destData);
- StrategyPriority.Priority canHandle(Map<VolumeInfo, DataStore> volumeMap, Host srcHost, Host destHost);
+ StrategyPriority canHandle(Map<VolumeInfo, DataStore> volumeMap, Host srcHost, Host destHost);
Void copyAsync(DataObject srcData, DataObject destData, AsyncCompletionCallback<CopyCommandResult> callback);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c9101966/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/SnapshotStrategy.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/SnapshotStrategy.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/SnapshotStrategy.java
index 3436d16..cf30f59 100644
--- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/SnapshotStrategy.java
+++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/SnapshotStrategy.java
@@ -34,5 +34,5 @@ public interface SnapshotStrategy {
boolean revertSnapshot(Long snapshotId);
- StrategyPriority.Priority canHandle(Snapshot snapshot, SnapshotOperation op);
+ StrategyPriority canHandle(Snapshot snapshot, SnapshotOperation op);
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c9101966/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/StorageStrategyFactory.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/StorageStrategyFactory.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/StorageStrategyFactory.java
new file mode 100644
index 0000000..3a73cd0
--- /dev/null
+++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/StorageStrategyFactory.java
@@ -0,0 +1,45 @@
+/*
+ * 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.engine.subsystem.api.storage;
+
+import java.util.Collection;
+import java.util.Map;
+
+import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotStrategy.SnapshotOperation;
+
+import com.cloud.host.Host;
+import com.cloud.storage.Snapshot;
+
+public interface StorageStrategyFactory {
+
+ Collection<DataMotionStrategy> getDataMotionStrategies(DataObject srcData, DataObject destData);
+
+ DataMotionStrategy getDataMotionStrategy(DataObject srcData, DataObject destData);
+
+
+ Collection<DataMotionStrategy> getDataMotionStrategies(Map<VolumeInfo, DataStore> volumeMap, Host srcHost, Host destHost);
+
+ DataMotionStrategy getDataMotionStrategy(Map<VolumeInfo, DataStore> volumeMap, Host srcHost, Host destHost);
+
+
+ Collection<SnapshotStrategy> getSnapshotStrategies(Snapshot snapshot, SnapshotOperation op);
+
+ SnapshotStrategy getSnapshotStrategy(Snapshot snapshot, SnapshotOperation op);
+
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c9101966/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/StrategyPriority.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/StrategyPriority.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/StrategyPriority.java
index 05159dd..12f2a6a 100644
--- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/StrategyPriority.java
+++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/StrategyPriority.java
@@ -16,66 +16,10 @@
// under the License.
package org.apache.cloudstack.engine.subsystem.api.storage;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotStrategy.SnapshotOperation;
-
-import com.cloud.host.Host;
-import com.cloud.storage.Snapshot;
-
-public class StrategyPriority {
- public enum Priority {
- CANT_HANDLE,
- DEFAULT,
- HYPERVISOR,
- PLUGIN,
- HIGHEST
- }
-
- public static SnapshotStrategy pickStrategy(List<SnapshotStrategy> strategies, Snapshot snapshot, SnapshotOperation op) {
- Priority highestPriority = Priority.CANT_HANDLE;
- SnapshotStrategy strategyToUse = null;
-
- for (SnapshotStrategy strategy : strategies) {
- Priority priority = strategy.canHandle(snapshot, op);
- if (priority.ordinal() > highestPriority.ordinal()) {
- highestPriority = priority;
- strategyToUse = strategy;
- }
- }
-
- return strategyToUse;
- }
-
- // TODO DRY this out by consolidating methods
- public static DataMotionStrategy pickStrategy(List<DataMotionStrategy> strategies, DataObject srcData, DataObject destData) {
- Priority highestPriority = Priority.CANT_HANDLE;
- DataMotionStrategy strategyToUse = null;
-
- for (DataMotionStrategy strategy : strategies) {
- Priority priority = strategy.canHandle(srcData, destData);
- if (priority.ordinal() > highestPriority.ordinal()) {
- highestPriority = priority;
- strategyToUse = strategy;
- }
- }
-
- return strategyToUse;
- }
-
- public static DataMotionStrategy pickStrategy(List<DataMotionStrategy> strategies, Map<VolumeInfo, DataStore> volumeMap, Host srcHost, Host destHost) {
- Priority highestPriority = Priority.CANT_HANDLE;
- DataMotionStrategy strategyToUse = null;
-
- for (DataMotionStrategy strategy : strategies) {
- Priority priority = strategy.canHandle(volumeMap, srcHost, destHost);
- if (priority.ordinal() > highestPriority.ordinal()) {
- highestPriority = priority;
- strategyToUse = strategy;
- }
- }
-
- return strategyToUse;
- }
+public enum StrategyPriority {
+ CANT_HANDLE,
+ DEFAULT,
+ HYPERVISOR,
+ PLUGIN,
+ HIGHEST
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c9101966/engine/api/test/org/apache/cloudstack/engine/subsystem/api/storage/StrategyPriorityTest.java
----------------------------------------------------------------------
diff --git a/engine/api/test/org/apache/cloudstack/engine/subsystem/api/storage/StrategyPriorityTest.java b/engine/api/test/org/apache/cloudstack/engine/subsystem/api/storage/StrategyPriorityTest.java
deleted file mode 100644
index e18e660..0000000
--- a/engine/api/test/org/apache/cloudstack/engine/subsystem/api/storage/StrategyPriorityTest.java
+++ /dev/null
@@ -1,152 +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.engine.subsystem.api.storage;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotStrategy.SnapshotOperation;
-import org.apache.cloudstack.engine.subsystem.api.storage.StrategyPriority.Priority;
-import org.junit.Test;
-
-import com.cloud.host.Host;
-import com.cloud.storage.Snapshot;
-
-import static org.junit.Assert.assertEquals;
-
-import static org.mockito.Matchers.any;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
-
-public class StrategyPriorityTest {
-
- @Test
- public void testSortSnapshotStrategies() {
- SnapshotStrategy cantHandleStrategy = mock(SnapshotStrategy.class);
- SnapshotStrategy defaultStrategy = mock(SnapshotStrategy.class);
- SnapshotStrategy hyperStrategy = mock(SnapshotStrategy.class);
- SnapshotStrategy pluginStrategy = mock(SnapshotStrategy.class);
- SnapshotStrategy highestStrategy = mock(SnapshotStrategy.class);
-
- doReturn(Priority.CANT_HANDLE).when(cantHandleStrategy).canHandle(any(Snapshot.class), any(SnapshotOperation.class));
- doReturn(Priority.DEFAULT).when(defaultStrategy).canHandle(any(Snapshot.class), any(SnapshotOperation.class));
- doReturn(Priority.HYPERVISOR).when(hyperStrategy).canHandle(any(Snapshot.class), any(SnapshotOperation.class));
- doReturn(Priority.PLUGIN).when(pluginStrategy).canHandle(any(Snapshot.class), any(SnapshotOperation.class));
- doReturn(Priority.HIGHEST).when(highestStrategy).canHandle(any(Snapshot.class), any(SnapshotOperation.class));
-
- List<SnapshotStrategy> strategies = new ArrayList<SnapshotStrategy>(5);
- SnapshotStrategy strategy = null;
-
- strategies.add(cantHandleStrategy);
- strategy = StrategyPriority.pickStrategy(strategies, mock(Snapshot.class), SnapshotOperation.TAKE);
- assertEquals("A strategy was found when it shouldn't have been.", null, strategy);
-
- strategies.add(defaultStrategy);
- strategy = StrategyPriority.pickStrategy(strategies, mock(Snapshot.class), SnapshotOperation.TAKE);
- assertEquals("Default strategy was not picked.", defaultStrategy, strategy);
-
- strategies.add(hyperStrategy);
- strategy = StrategyPriority.pickStrategy(strategies, mock(Snapshot.class), SnapshotOperation.TAKE);
- assertEquals("Hypervisor strategy was not picked.", hyperStrategy, strategy);
-
- strategies.add(pluginStrategy);
- strategy = StrategyPriority.pickStrategy(strategies, mock(Snapshot.class), SnapshotOperation.TAKE);
- assertEquals("Plugin strategy was not picked.", pluginStrategy, strategy);
-
- strategies.add(highestStrategy);
- strategy = StrategyPriority.pickStrategy(strategies, mock(Snapshot.class), SnapshotOperation.TAKE);
- assertEquals("Highest strategy was not picked.", highestStrategy, strategy);
- }
-
- @Test
- public void testSortDataMotionStrategies() {
- DataMotionStrategy cantHandleStrategy = mock(DataMotionStrategy.class);
- DataMotionStrategy defaultStrategy = mock(DataMotionStrategy.class);
- DataMotionStrategy hyperStrategy = mock(DataMotionStrategy.class);
- DataMotionStrategy pluginStrategy = mock(DataMotionStrategy.class);
- DataMotionStrategy highestStrategy = mock(DataMotionStrategy.class);
-
- doReturn(Priority.CANT_HANDLE).when(cantHandleStrategy).canHandle(any(DataObject.class), any(DataObject.class));
- doReturn(Priority.DEFAULT).when(defaultStrategy).canHandle(any(DataObject.class), any(DataObject.class));
- doReturn(Priority.HYPERVISOR).when(hyperStrategy).canHandle(any(DataObject.class), any(DataObject.class));
- doReturn(Priority.PLUGIN).when(pluginStrategy).canHandle(any(DataObject.class), any(DataObject.class));
- doReturn(Priority.HIGHEST).when(highestStrategy).canHandle(any(DataObject.class), any(DataObject.class));
-
- List<DataMotionStrategy> strategies = new ArrayList<DataMotionStrategy>(5);
- DataMotionStrategy strategy = null;
-
- strategies.add(cantHandleStrategy);
- strategy = StrategyPriority.pickStrategy(strategies, mock(DataObject.class), mock(DataObject.class));
- assertEquals("A strategy was found when it shouldn't have been.", null, strategy);
-
- strategies.add(defaultStrategy);
- strategy = StrategyPriority.pickStrategy(strategies, mock(DataObject.class), mock(DataObject.class));
- assertEquals("Default strategy was not picked.", defaultStrategy, strategy);
-
- strategies.add(hyperStrategy);
- strategy = StrategyPriority.pickStrategy(strategies, mock(DataObject.class), mock(DataObject.class));
- assertEquals("Hypervisor strategy was not picked.", hyperStrategy, strategy);
-
- strategies.add(pluginStrategy);
- strategy = StrategyPriority.pickStrategy(strategies, mock(DataObject.class), mock(DataObject.class));
- assertEquals("Plugin strategy was not picked.", pluginStrategy, strategy);
-
- strategies.add(highestStrategy);
- strategy = StrategyPriority.pickStrategy(strategies, mock(DataObject.class), mock(DataObject.class));
- assertEquals("Highest strategy was not picked.", highestStrategy, strategy);
- }
-
- @Test
- @SuppressWarnings("unchecked")
- public void testSortDataMotionStrategies2() {
- DataMotionStrategy cantHandleStrategy = mock(DataMotionStrategy.class);
- DataMotionStrategy defaultStrategy = mock(DataMotionStrategy.class);
- DataMotionStrategy hyperStrategy = mock(DataMotionStrategy.class);
- DataMotionStrategy pluginStrategy = mock(DataMotionStrategy.class);
- DataMotionStrategy highestStrategy = mock(DataMotionStrategy.class);
-
- doReturn(Priority.CANT_HANDLE).when(cantHandleStrategy).canHandle(any(Map.class), any(Host.class), any(Host.class));
- doReturn(Priority.DEFAULT).when(defaultStrategy).canHandle(any(Map.class), any(Host.class), any(Host.class));
- doReturn(Priority.HYPERVISOR).when(hyperStrategy).canHandle(any(Map.class), any(Host.class), any(Host.class));
- doReturn(Priority.PLUGIN).when(pluginStrategy).canHandle(any(Map.class), any(Host.class), any(Host.class));
- doReturn(Priority.HIGHEST).when(highestStrategy).canHandle(any(Map.class), any(Host.class), any(Host.class));
-
- List<DataMotionStrategy> strategies = new ArrayList<DataMotionStrategy>(5);
- DataMotionStrategy strategy = null;
-
- strategies.add(cantHandleStrategy);
- strategy = StrategyPriority.pickStrategy(strategies, mock(Map.class), mock(Host.class), mock(Host.class));
- assertEquals("A strategy was found when it shouldn't have been.", null, strategy);
-
- strategies.add(defaultStrategy);
- strategy = StrategyPriority.pickStrategy(strategies, mock(Map.class), mock(Host.class), mock(Host.class));
- assertEquals("Default strategy was not picked.", defaultStrategy, strategy);
-
- strategies.add(hyperStrategy);
- strategy = StrategyPriority.pickStrategy(strategies, mock(Map.class), mock(Host.class), mock(Host.class));
- assertEquals("Hypervisor strategy was not picked.", hyperStrategy, strategy);
-
- strategies.add(pluginStrategy);
- strategy = StrategyPriority.pickStrategy(strategies, mock(Map.class), mock(Host.class), mock(Host.class));
- assertEquals("Plugin strategy was not picked.", pluginStrategy, strategy);
-
- strategies.add(highestStrategy);
- strategy = StrategyPriority.pickStrategy(strategies, mock(Map.class), mock(Host.class), mock(Host.class));
- assertEquals("Highest strategy was not picked.", highestStrategy, strategy);
- }
-}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c9101966/engine/storage/datamotion/resources/META-INF/cloudstack/core/spring-engine-storage-datamotion-core-context.xml
----------------------------------------------------------------------
diff --git a/engine/storage/datamotion/resources/META-INF/cloudstack/core/spring-engine-storage-datamotion-core-context.xml b/engine/storage/datamotion/resources/META-INF/cloudstack/core/spring-engine-storage-datamotion-core-context.xml
index 07c0fdf..3bde768 100644
--- a/engine/storage/datamotion/resources/META-INF/cloudstack/core/spring-engine-storage-datamotion-core-context.xml
+++ b/engine/storage/datamotion/resources/META-INF/cloudstack/core/spring-engine-storage-datamotion-core-context.xml
@@ -29,7 +29,6 @@
<bean id="dataMotionServiceImpl"
class="org.apache.cloudstack.storage.motion.DataMotionServiceImpl">
- <property name="strategies" value="#{dataMotionStrategiesRegistry.registered}" />
</bean>
</beans>
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c9101966/engine/storage/datamotion/src/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java
----------------------------------------------------------------------
diff --git a/engine/storage/datamotion/src/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java b/engine/storage/datamotion/src/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java
index 5f5f01e..54e01f1 100644
--- a/engine/storage/datamotion/src/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java
+++ b/engine/storage/datamotion/src/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java
@@ -36,7 +36,7 @@ import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreState
import org.apache.cloudstack.engine.subsystem.api.storage.Scope;
import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotInfo;
import org.apache.cloudstack.engine.subsystem.api.storage.StorageCacheManager;
-import org.apache.cloudstack.engine.subsystem.api.storage.StrategyPriority.Priority;
+import org.apache.cloudstack.engine.subsystem.api.storage.StrategyPriority;
import org.apache.cloudstack.engine.subsystem.api.storage.TemplateInfo;
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope;
@@ -124,13 +124,13 @@ AncientDataMotionStrategy implements DataMotionStrategy {
ManagementService _mgmtServer;
@Override
- public Priority canHandle(DataObject srcData, DataObject destData) {
- return Priority.DEFAULT;
+ public StrategyPriority canHandle(DataObject srcData, DataObject destData) {
+ return StrategyPriority.DEFAULT;
}
@Override
- public Priority canHandle(Map<VolumeInfo, DataStore> volumeMap, Host srcHost, Host destHost) {
- return Priority.CANT_HANDLE;
+ public StrategyPriority canHandle(Map<VolumeInfo, DataStore> volumeMap, Host srcHost, Host destHost) {
+ return StrategyPriority.CANT_HANDLE;
}
protected boolean needCacheStorage(DataObject srcData, DataObject destData) {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c9101966/engine/storage/datamotion/src/org/apache/cloudstack/storage/motion/DataMotionServiceImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/datamotion/src/org/apache/cloudstack/storage/motion/DataMotionServiceImpl.java b/engine/storage/datamotion/src/org/apache/cloudstack/storage/motion/DataMotionServiceImpl.java
index 47c988f..a1f05e1 100644
--- a/engine/storage/datamotion/src/org/apache/cloudstack/storage/motion/DataMotionServiceImpl.java
+++ b/engine/storage/datamotion/src/org/apache/cloudstack/storage/motion/DataMotionServiceImpl.java
@@ -30,6 +30,8 @@ import org.apache.cloudstack.engine.subsystem.api.storage.DataMotionStrategy;
import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
import org.apache.cloudstack.engine.subsystem.api.storage.StrategyPriority;
+import org.apache.cloudstack.engine.subsystem.api.storage.StorageStrategyFactory;
+import org.apache.cloudstack.engine.subsystem.api.storage.StrategyPriority;
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
import org.springframework.stereotype.Component;
@@ -41,8 +43,8 @@ import com.cloud.utils.exception.CloudRuntimeException;
@Component
public class DataMotionServiceImpl implements DataMotionService {
-
- List<DataMotionStrategy> strategies;
+ @Inject
+ StorageStrategyFactory storageStrategyFactory;
@Override
public void copyAsync(DataObject srcData, DataObject destData, AsyncCompletionCallback<CopyCommandResult> callback) {
@@ -58,8 +60,7 @@ public class DataMotionServiceImpl implements DataMotionService {
return;
}
- // TODO DRY this out when the overloaded methods are DRYed out
- DataMotionStrategy strategy = StrategyPriority.pickStrategy(strategies, srcData, destData);
+ DataMotionStrategy strategy = storageStrategyFactory.getDataMotionStrategy(srcData, destData);
if (strategy == null) {
throw new CloudRuntimeException("Can't find strategy to move data. "+
"Source: "+srcData.getType().name()+" '"+srcData.getUuid()+
@@ -73,8 +74,7 @@ public class DataMotionServiceImpl implements DataMotionService {
public void copyAsync(Map<VolumeInfo, DataStore> volumeMap, VirtualMachineTO vmTo, Host srcHost, Host destHost,
AsyncCompletionCallback<CopyCommandResult> callback) {
- // TODO DRY this out when the overloaded methods are DRYed out
- DataMotionStrategy strategy = StrategyPriority.pickStrategy(strategies, volumeMap, srcHost, destHost);
+ DataMotionStrategy strategy = storageStrategyFactory.getDataMotionStrategy(volumeMap, srcHost, destHost);
if (strategy == null) {
List<String> volumeIds = new LinkedList<String>();
for (final VolumeInfo volumeInfo : volumeMap.keySet()) {
@@ -88,13 +88,4 @@ public class DataMotionServiceImpl implements DataMotionService {
strategy.copyAsync(volumeMap, vmTo, srcHost, destHost, callback);
}
-
- @Inject
- public void setStrategies(List<DataMotionStrategy> strategies) {
- this.strategies = strategies;
- }
-
- public List<DataMotionStrategy> getStrategies() {
- return strategies;
- }
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c9101966/engine/storage/resources/META-INF/cloudstack/core/spring-engine-storage-core-context.xml
----------------------------------------------------------------------
diff --git a/engine/storage/resources/META-INF/cloudstack/core/spring-engine-storage-core-context.xml b/engine/storage/resources/META-INF/cloudstack/core/spring-engine-storage-core-context.xml
index 29f4fcd..8a78fdd 100644
--- a/engine/storage/resources/META-INF/cloudstack/core/spring-engine-storage-core-context.xml
+++ b/engine/storage/resources/META-INF/cloudstack/core/spring-engine-storage-core-context.xml
@@ -59,5 +59,10 @@
<list />
</property>
</bean>
+
+ <bean id="storageStrategyFactoryImpl" class="org.apache.cloudstack.storage.helper.StorageStrategyFactoryImpl" >
+ <property name="dataMotionStrategies" value="#{dataMotionStrategiesRegistry.registered}" />
+ <property name="snapshotStrategies" value="#{snapshotStrategiesRegistry.registered}" />
+ </bean>
</beans>
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c9101966/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotObject.java
----------------------------------------------------------------------
diff --git a/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotObject.java b/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotObject.java
index 147f1d4..daf6477 100644
--- a/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotObject.java
+++ b/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotObject.java
@@ -31,6 +31,7 @@ import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotInfo;
import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotStrategy;
import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotStrategy.SnapshotOperation;
import org.apache.cloudstack.engine.subsystem.api.storage.StrategyPriority;
+import org.apache.cloudstack.engine.subsystem.api.storage.StorageStrategyFactory;
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeDataFactory;
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
import org.apache.cloudstack.storage.command.CopyCmdAnswer;
@@ -76,7 +77,7 @@ public class SnapshotObject implements SnapshotInfo {
@Inject
SnapshotDataStoreDao snapshotStoreDao;
@Inject
- List<SnapshotStrategy> snapshotStrategies;
+ StorageStrategyFactory storageStrategyFactory;
public SnapshotObject() {
@@ -129,7 +130,7 @@ public class SnapshotObject implements SnapshotInfo {
@Override
public boolean isRevertable() {
- SnapshotStrategy snapshotStrategy = StrategyPriority.pickStrategy(snapshotStrategies, snapshot, SnapshotOperation.REVERT);
+ SnapshotStrategy snapshotStrategy = storageStrategyFactory.getSnapshotStrategy(snapshot, SnapshotOperation.REVERT);
if (snapshotStrategy != null) {
return true;
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c9101966/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/XenserverSnapshotStrategy.java
----------------------------------------------------------------------
diff --git a/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/XenserverSnapshotStrategy.java b/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/XenserverSnapshotStrategy.java
index b3a64b6..27dbd83 100644
--- a/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/XenserverSnapshotStrategy.java
+++ b/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/XenserverSnapshotStrategy.java
@@ -27,7 +27,6 @@ import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotInfo;
import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotResult;
import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotService;
import org.apache.cloudstack.engine.subsystem.api.storage.StrategyPriority;
-import org.apache.cloudstack.engine.subsystem.api.storage.StrategyPriority.Priority;
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
import org.apache.cloudstack.storage.command.CreateObjectAnswer;
@@ -311,11 +310,11 @@ public class XenserverSnapshotStrategy extends SnapshotStrategyBase {
}
@Override
- public StrategyPriority.Priority canHandle(Snapshot snapshot, SnapshotOperation op) {
+ public StrategyPriority canHandle(Snapshot snapshot, SnapshotOperation op) {
if (op == SnapshotOperation.REVERT) {
- return Priority.CANT_HANDLE;
+ return StrategyPriority.CANT_HANDLE;
}
- return Priority.DEFAULT;
+ return StrategyPriority.DEFAULT;
}
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c9101966/engine/storage/src/org/apache/cloudstack/storage/helper/StorageStrategyFactoryImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/helper/StorageStrategyFactoryImpl.java b/engine/storage/src/org/apache/cloudstack/storage/helper/StorageStrategyFactoryImpl.java
new file mode 100644
index 0000000..0bbd28b
--- /dev/null
+++ b/engine/storage/src/org/apache/cloudstack/storage/helper/StorageStrategyFactoryImpl.java
@@ -0,0 +1,139 @@
+/*
+ * 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.helper;
+
+import java.util.Collection;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeSet;
+
+import javax.inject.Inject;
+
+import org.apache.cloudstack.engine.subsystem.api.storage.DataMotionStrategy;
+import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
+import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
+import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotStrategy;
+import org.apache.cloudstack.engine.subsystem.api.storage.StorageStrategyFactory;
+import org.apache.cloudstack.engine.subsystem.api.storage.StrategyPriority;
+import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
+import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotStrategy.SnapshotOperation;
+
+import com.cloud.host.Host;
+import com.cloud.storage.Snapshot;
+
+public class StorageStrategyFactoryImpl implements StorageStrategyFactory {
+
+ List<SnapshotStrategy> snapshotStrategies;
+ List<DataMotionStrategy> dataMotionStrategies;
+
+ @Override
+ public DataMotionStrategy getDataMotionStrategy(DataObject srcData, DataObject destData) {
+ return first(getDataMotionStrategies(srcData, destData));
+ }
+
+ @Override
+ public DataMotionStrategy getDataMotionStrategy(Map<VolumeInfo, DataStore> volumeMap, Host srcHost, Host destHost) {
+ return first(getDataMotionStrategies(volumeMap, srcHost, destHost));
+ }
+
+ @Override
+ public SnapshotStrategy getSnapshotStrategy(Snapshot snapshot, SnapshotOperation op) {
+ return first(getSnapshotStrategies(snapshot, op));
+ }
+
+ @Override
+ public Collection<DataMotionStrategy> getDataMotionStrategies(final DataObject srcData, final DataObject destData) {
+ return sort(dataMotionStrategies, new CanHandle<DataMotionStrategy>() {
+ @Override
+ public StrategyPriority canHandle(DataMotionStrategy strategy) {
+ return strategy.canHandle(srcData, destData);
+ }
+ });
+ }
+
+ @Override
+ public Collection<DataMotionStrategy> getDataMotionStrategies(final Map<VolumeInfo, DataStore> volumeMap, final Host srcHost, final Host destHost) {
+ return sort(dataMotionStrategies, new CanHandle<DataMotionStrategy>() {
+ @Override
+ public StrategyPriority canHandle(DataMotionStrategy strategy) {
+ return strategy.canHandle(volumeMap, srcHost, destHost);
+ }
+ });
+ }
+
+ @Override
+ public Collection<SnapshotStrategy> getSnapshotStrategies(final Snapshot snapshot, final SnapshotOperation op) {
+ return sort(snapshotStrategies, new CanHandle<SnapshotStrategy>() {
+ @Override
+ public StrategyPriority canHandle(SnapshotStrategy strategy) {
+ return strategy.canHandle(snapshot, op);
+ }
+ });
+ }
+
+ private static <T> Collection<T> sort(Collection<T> collection, final CanHandle<T> canHandle) {
+ if (collection.size() == 0)
+ return null;
+
+ TreeSet<T> resultSet = new TreeSet<T>(new Comparator<T>() {
+ @Override
+ public int compare(T o1, T o2) {
+ int i1 = canHandle.canHandle(o1).ordinal();
+ int i2 = canHandle.canHandle(o2).ordinal();
+ return new Integer(i2).compareTo(new Integer(i1));
+ }
+ });
+
+ for ( T test : collection ) {
+ if ( canHandle.canHandle(test) != StrategyPriority.CANT_HANDLE ) {
+ resultSet.add(test);
+ }
+ }
+
+ return resultSet;
+ }
+
+ private static <T> T first(Collection<T> resultSet) {
+ return resultSet.size() == 0 ? null : resultSet.iterator().next();
+ }
+
+ private static interface CanHandle<T> {
+ StrategyPriority canHandle(T strategy);
+ }
+
+ public List<SnapshotStrategy> getSnapshotStrategies() {
+ return snapshotStrategies;
+ }
+
+ @Inject
+ public void setSnapshotStrategies(List<SnapshotStrategy> snapshotStrategies) {
+ this.snapshotStrategies = snapshotStrategies;
+ }
+
+ public List<DataMotionStrategy> getDataMotionStrategies() {
+ return dataMotionStrategies;
+ }
+
+ @Inject
+ public void setDataMotionStrategies(List<DataMotionStrategy> dataMotionStrategies) {
+ this.dataMotionStrategies = dataMotionStrategies;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c9101966/engine/storage/test/org/apache/cloudstack/engine/subsystem/api/storage/StrategyPriorityTest.java
----------------------------------------------------------------------
diff --git a/engine/storage/test/org/apache/cloudstack/engine/subsystem/api/storage/StrategyPriorityTest.java b/engine/storage/test/org/apache/cloudstack/engine/subsystem/api/storage/StrategyPriorityTest.java
new file mode 100644
index 0000000..8cfa955
--- /dev/null
+++ b/engine/storage/test/org/apache/cloudstack/engine/subsystem/api/storage/StrategyPriorityTest.java
@@ -0,0 +1,122 @@
+// 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.engine.subsystem.api.storage;
+
+import static org.junit.Assert.*;
+import static org.mockito.Matchers.*;
+import static org.mockito.Mockito.*;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotStrategy.SnapshotOperation;
+import org.apache.cloudstack.storage.helper.StorageStrategyFactoryImpl;
+import org.junit.Test;
+
+import com.cloud.host.Host;
+import com.cloud.storage.Snapshot;
+
+public class StrategyPriorityTest {
+
+ @Test
+ public void testSortSnapshotStrategies() {
+ SnapshotStrategy cantHandleStrategy = mock(SnapshotStrategy.class);
+ SnapshotStrategy defaultStrategy = mock(SnapshotStrategy.class);
+ SnapshotStrategy hyperStrategy = mock(SnapshotStrategy.class);
+ SnapshotStrategy pluginStrategy = mock(SnapshotStrategy.class);
+ SnapshotStrategy highestStrategy = mock(SnapshotStrategy.class);
+
+ doReturn(StrategyPriority.CANT_HANDLE).when(cantHandleStrategy).canHandle(any(Snapshot.class), any(SnapshotOperation.class));
+ doReturn(StrategyPriority.DEFAULT).when(defaultStrategy).canHandle(any(Snapshot.class), any(SnapshotOperation.class));
+ doReturn(StrategyPriority.HYPERVISOR).when(hyperStrategy).canHandle(any(Snapshot.class), any(SnapshotOperation.class));
+ doReturn(StrategyPriority.PLUGIN).when(pluginStrategy).canHandle(any(Snapshot.class), any(SnapshotOperation.class));
+ doReturn(StrategyPriority.HIGHEST).when(highestStrategy).canHandle(any(Snapshot.class), any(SnapshotOperation.class));
+
+ List<SnapshotStrategy> strategies = new ArrayList<SnapshotStrategy>(5);
+ strategies.addAll(Arrays.asList(defaultStrategy, pluginStrategy, hyperStrategy, cantHandleStrategy, highestStrategy));
+
+ StorageStrategyFactoryImpl factory = new StorageStrategyFactoryImpl();
+ factory.setSnapshotStrategies(strategies);
+ Iterator<SnapshotStrategy> iter = factory.getSnapshotStrategies(mock(Snapshot.class), SnapshotOperation.TAKE).iterator();
+
+ assertEquals("Highest was not 1st.", highestStrategy, iter.next());
+ assertEquals("Plugin was not 2nd.", pluginStrategy, iter.next());
+ assertEquals("Hypervisor was not 3rd.", hyperStrategy, iter.next());
+ assertEquals("Default was not 4th.", defaultStrategy, iter.next());
+ assertTrue("Can't Handle was not 5th.", !iter.hasNext());
+ }
+
+ @Test
+ public void testSortDataMotionStrategies() {
+ DataMotionStrategy cantHandleStrategy = mock(DataMotionStrategy.class);
+ DataMotionStrategy defaultStrategy = mock(DataMotionStrategy.class);
+ DataMotionStrategy hyperStrategy = mock(DataMotionStrategy.class);
+ DataMotionStrategy pluginStrategy = mock(DataMotionStrategy.class);
+ DataMotionStrategy highestStrategy = mock(DataMotionStrategy.class);
+
+ doReturn(StrategyPriority.CANT_HANDLE).when(cantHandleStrategy).canHandle(any(DataObject.class), any(DataObject.class));
+ doReturn(StrategyPriority.DEFAULT).when(defaultStrategy).canHandle(any(DataObject.class), any(DataObject.class));
+ doReturn(StrategyPriority.HYPERVISOR).when(hyperStrategy).canHandle(any(DataObject.class), any(DataObject.class));
+ doReturn(StrategyPriority.PLUGIN).when(pluginStrategy).canHandle(any(DataObject.class), any(DataObject.class));
+ doReturn(StrategyPriority.HIGHEST).when(highestStrategy).canHandle(any(DataObject.class), any(DataObject.class));
+
+ List<DataMotionStrategy> strategies = new ArrayList<DataMotionStrategy>(5);
+ strategies.addAll(Arrays.asList(defaultStrategy, pluginStrategy, hyperStrategy, cantHandleStrategy, highestStrategy));
+
+ StorageStrategyFactoryImpl factory = new StorageStrategyFactoryImpl();
+ factory.setDataMotionStrategies(strategies);
+ Iterator<DataMotionStrategy> iter = factory.getDataMotionStrategies(mock(DataObject.class), mock(DataObject.class)).iterator();
+
+ assertEquals("Highest was not 1st.", highestStrategy, iter.next());
+ assertEquals("Plugin was not 2nd.", pluginStrategy, iter.next());
+ assertEquals("Hypervisor was not 3rd.", hyperStrategy, iter.next());
+ assertEquals("Default was not 4th.", defaultStrategy, iter.next());
+ assertTrue("Can't Handle was not 5th.", !iter.hasNext());
+ }
+
+ @Test
+ @SuppressWarnings("unchecked")
+ public void testSortDataMotionStrategies2() {
+ DataMotionStrategy cantHandleStrategy = mock(DataMotionStrategy.class);
+ DataMotionStrategy defaultStrategy = mock(DataMotionStrategy.class);
+ DataMotionStrategy hyperStrategy = mock(DataMotionStrategy.class);
+ DataMotionStrategy pluginStrategy = mock(DataMotionStrategy.class);
+ DataMotionStrategy highestStrategy = mock(DataMotionStrategy.class);
+
+ doReturn(StrategyPriority.CANT_HANDLE).when(cantHandleStrategy).canHandle(any(Map.class), any(Host.class), any(Host.class));
+ doReturn(StrategyPriority.DEFAULT).when(defaultStrategy).canHandle(any(Map.class), any(Host.class), any(Host.class));
+ doReturn(StrategyPriority.HYPERVISOR).when(hyperStrategy).canHandle(any(Map.class), any(Host.class), any(Host.class));
+ doReturn(StrategyPriority.PLUGIN).when(pluginStrategy).canHandle(any(Map.class), any(Host.class), any(Host.class));
+ doReturn(StrategyPriority.HIGHEST).when(highestStrategy).canHandle(any(Map.class), any(Host.class), any(Host.class));
+
+ List<DataMotionStrategy> strategies = new ArrayList<DataMotionStrategy>(5);
+ strategies.addAll(Arrays.asList(defaultStrategy, pluginStrategy, hyperStrategy, cantHandleStrategy, highestStrategy));
+
+ StorageStrategyFactoryImpl factory = new StorageStrategyFactoryImpl();
+ factory.setDataMotionStrategies(strategies);
+ Iterator<DataMotionStrategy> iter = factory.getDataMotionStrategies(mock(Map.class), mock(Host.class), mock(Host.class)).iterator();
+
+ assertEquals("Highest was not 1st.", highestStrategy, iter.next());
+ assertEquals("Plugin was not 2nd.", pluginStrategy, iter.next());
+ assertEquals("Hypervisor was not 3rd.", hyperStrategy, iter.next());
+ assertEquals("Default was not 4th.", defaultStrategy, iter.next());
+ assertTrue("Can't Handle was not 5th.", !iter.hasNext());
+ }
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c9101966/plugins/hypervisors/simulator/src/org/apache/cloudstack/storage/motion/SimulatorDataMotionStrategy.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/simulator/src/org/apache/cloudstack/storage/motion/SimulatorDataMotionStrategy.java b/plugins/hypervisors/simulator/src/org/apache/cloudstack/storage/motion/SimulatorDataMotionStrategy.java
index 74868c4..3eb2cf6 100644
--- a/plugins/hypervisors/simulator/src/org/apache/cloudstack/storage/motion/SimulatorDataMotionStrategy.java
+++ b/plugins/hypervisors/simulator/src/org/apache/cloudstack/storage/motion/SimulatorDataMotionStrategy.java
@@ -24,7 +24,7 @@ import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult;
import org.apache.cloudstack.engine.subsystem.api.storage.DataMotionStrategy;
import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
-import org.apache.cloudstack.engine.subsystem.api.storage.StrategyPriority.Priority;
+import org.apache.cloudstack.engine.subsystem.api.storage.StrategyPriority;
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
@@ -33,13 +33,13 @@ import com.cloud.host.Host;
public class SimulatorDataMotionStrategy implements DataMotionStrategy {
@Override
- public Priority canHandle(DataObject srcData, DataObject destData) {
- return Priority.HYPERVISOR;
+ public StrategyPriority canHandle(DataObject srcData, DataObject destData) {
+ return StrategyPriority.HYPERVISOR;
}
@Override
- public Priority canHandle(Map<VolumeInfo, DataStore> volumeMap, Host srcHost, Host destHost) {
- return Priority.HYPERVISOR;
+ public StrategyPriority canHandle(Map<VolumeInfo, DataStore> volumeMap, Host srcHost, Host destHost) {
+ return StrategyPriority.HYPERVISOR;
}
@Override
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c9101966/plugins/hypervisors/vmware/src/org/apache/cloudstack/storage/motion/VmwareStorageMotionStrategy.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/vmware/src/org/apache/cloudstack/storage/motion/VmwareStorageMotionStrategy.java b/plugins/hypervisors/vmware/src/org/apache/cloudstack/storage/motion/VmwareStorageMotionStrategy.java
index f5f23a2..5c9b3af 100644
--- a/plugins/hypervisors/vmware/src/org/apache/cloudstack/storage/motion/VmwareStorageMotionStrategy.java
+++ b/plugins/hypervisors/vmware/src/org/apache/cloudstack/storage/motion/VmwareStorageMotionStrategy.java
@@ -28,7 +28,7 @@ import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult;
import org.apache.cloudstack.engine.subsystem.api.storage.DataMotionStrategy;
import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
-import org.apache.cloudstack.engine.subsystem.api.storage.StrategyPriority.Priority;
+import org.apache.cloudstack.engine.subsystem.api.storage.StrategyPriority;
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeDataFactory;
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
@@ -64,17 +64,17 @@ public class VmwareStorageMotionStrategy implements DataMotionStrategy {
@Inject VMInstanceDao instanceDao;
@Override
- public Priority canHandle(DataObject srcData, DataObject destData) {
- return Priority.CANT_HANDLE;
+ public StrategyPriority canHandle(DataObject srcData, DataObject destData) {
+ return StrategyPriority.CANT_HANDLE;
}
@Override
- public Priority canHandle(Map<VolumeInfo, DataStore> volumeMap, Host srcHost, Host destHost) {
+ public StrategyPriority canHandle(Map<VolumeInfo, DataStore> volumeMap, Host srcHost, Host destHost) {
if (srcHost.getHypervisorType() == HypervisorType.VMware && destHost.getHypervisorType() == HypervisorType.VMware) {
s_logger.debug(this.getClass() + " can handle the request because the hosts have VMware hypervisor");
- return Priority.HYPERVISOR;
+ return StrategyPriority.HYPERVISOR;
}
- return Priority.CANT_HANDLE;
+ return StrategyPriority.CANT_HANDLE;
}
@Override
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c9101966/plugins/hypervisors/vmware/test/org/apache/cloudstack/storage/motion/VmwareStorageMotionStrategyTest.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/vmware/test/org/apache/cloudstack/storage/motion/VmwareStorageMotionStrategyTest.java b/plugins/hypervisors/vmware/test/org/apache/cloudstack/storage/motion/VmwareStorageMotionStrategyTest.java
index c19480c..1234728 100644
--- a/plugins/hypervisors/vmware/test/org/apache/cloudstack/storage/motion/VmwareStorageMotionStrategyTest.java
+++ b/plugins/hypervisors/vmware/test/org/apache/cloudstack/storage/motion/VmwareStorageMotionStrategyTest.java
@@ -25,7 +25,7 @@ import javax.naming.ConfigurationException;
import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
-import org.apache.cloudstack.engine.subsystem.api.storage.StrategyPriority.Priority;
+import org.apache.cloudstack.engine.subsystem.api.storage.StrategyPriority;
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeDataFactory;
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
import org.apache.cloudstack.framework.async.AsyncCallFuture;
@@ -100,8 +100,8 @@ public class VmwareStorageMotionStrategyTest {
when(srcHost.getHypervisorType()).thenReturn(HypervisorType.VMware);
when(destHost.getHypervisorType()).thenReturn(HypervisorType.VMware);
Map<VolumeInfo, DataStore> volumeMap = new HashMap<VolumeInfo, DataStore>();
- Priority canHandle = strategy.canHandle(volumeMap, srcHost, destHost);
- assertTrue("The strategy is only supposed to handle vmware hosts", canHandle == Priority.HYPERVISOR);
+ StrategyPriority canHandle = strategy.canHandle(volumeMap, srcHost, destHost);
+ assertTrue("The strategy is only supposed to handle vmware hosts", canHandle == StrategyPriority.HYPERVISOR);
}
@Test
@@ -111,8 +111,8 @@ public class VmwareStorageMotionStrategyTest {
when(srcHost.getHypervisorType()).thenReturn(HypervisorType.XenServer);
when(destHost.getHypervisorType()).thenReturn(HypervisorType.XenServer);
Map<VolumeInfo, DataStore> volumeMap = new HashMap<VolumeInfo, DataStore>();
- Priority canHandle = strategy.canHandle(volumeMap, srcHost, destHost);
- assertFalse("The strategy is only supposed to handle vmware hosts", canHandle == Priority.HYPERVISOR);
+ StrategyPriority canHandle = strategy.canHandle(volumeMap, srcHost, destHost);
+ assertFalse("The strategy is only supposed to handle vmware hosts", canHandle == StrategyPriority.HYPERVISOR);
}
@Test
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c9101966/plugins/hypervisors/xen/src/org/apache/cloudstack/storage/motion/XenServerStorageMotionStrategy.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xen/src/org/apache/cloudstack/storage/motion/XenServerStorageMotionStrategy.java b/plugins/hypervisors/xen/src/org/apache/cloudstack/storage/motion/XenServerStorageMotionStrategy.java
index 8578a9a..3dc7dd8 100644
--- a/plugins/hypervisors/xen/src/org/apache/cloudstack/storage/motion/XenServerStorageMotionStrategy.java
+++ b/plugins/hypervisors/xen/src/org/apache/cloudstack/storage/motion/XenServerStorageMotionStrategy.java
@@ -28,7 +28,7 @@ import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult;
import org.apache.cloudstack.engine.subsystem.api.storage.DataMotionStrategy;
import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
-import org.apache.cloudstack.engine.subsystem.api.storage.StrategyPriority.Priority;
+import org.apache.cloudstack.engine.subsystem.api.storage.StrategyPriority;
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeDataFactory;
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
@@ -71,18 +71,18 @@ public class XenServerStorageMotionStrategy implements DataMotionStrategy {
@Inject VMInstanceDao instanceDao;
@Override
- public Priority canHandle(DataObject srcData, DataObject destData) {
- return Priority.CANT_HANDLE;
+ public StrategyPriority canHandle(DataObject srcData, DataObject destData) {
+ return StrategyPriority.CANT_HANDLE;
}
@Override
- public Priority canHandle(Map<VolumeInfo, DataStore> volumeMap, Host srcHost, Host destHost) {
+ public StrategyPriority canHandle(Map<VolumeInfo, DataStore> volumeMap, Host srcHost, Host destHost) {
if (srcHost.getHypervisorType() == HypervisorType.XenServer &&
destHost.getHypervisorType() == HypervisorType.XenServer) {
- return Priority.HYPERVISOR;
+ return StrategyPriority.HYPERVISOR;
}
- return Priority.CANT_HANDLE;
+ return StrategyPriority.CANT_HANDLE;
}
@Override
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c9101966/server/resources/META-INF/cloudstack/core/spring-server-core-managers-context.xml
----------------------------------------------------------------------
diff --git a/server/resources/META-INF/cloudstack/core/spring-server-core-managers-context.xml b/server/resources/META-INF/cloudstack/core/spring-server-core-managers-context.xml
index 7400759..11b69d2 100644
--- a/server/resources/META-INF/cloudstack/core/spring-server-core-managers-context.xml
+++ b/server/resources/META-INF/cloudstack/core/spring-server-core-managers-context.xml
@@ -142,9 +142,7 @@
<bean id="site2SiteVpnManagerImpl" class="com.cloud.network.vpn.Site2SiteVpnManagerImpl" />
- <bean id="snapshotManagerImpl" class="com.cloud.storage.snapshot.SnapshotManagerImpl" >
- <property name="snapshotStrategies" value="#{snapshotStrategiesRegistry.registered}" />
- </bean>
+ <bean id="snapshotManagerImpl" class="com.cloud.storage.snapshot.SnapshotManagerImpl" />
<bean id="snapshotSchedulerImpl" class="com.cloud.storage.snapshot.SnapshotSchedulerImpl" />
<bean id="storageNetworkManagerImpl" class="com.cloud.network.StorageNetworkManagerImpl" />
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c9101966/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java b/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java
index a7a5e03..1e17de1 100755
--- a/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java
+++ b/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java
@@ -42,6 +42,9 @@ import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotService;
import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotStrategy;
import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotStrategy.SnapshotOperation;
import org.apache.cloudstack.engine.subsystem.api.storage.StrategyPriority;
+import org.apache.cloudstack.engine.subsystem.api.storage.StorageStrategyFactory;
+import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotStrategy.SnapshotOperation;
+import org.apache.cloudstack.engine.subsystem.api.storage.StrategyPriority;
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeDataFactory;
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope;
@@ -194,7 +197,7 @@ public class SnapshotManagerImpl extends ManagerBase implements SnapshotManager,
@Inject EndPointSelector _epSelector;
@Inject
private ResourceManager _resourceMgr;
- protected List<SnapshotStrategy> snapshotStrategies;
+ @Inject StorageStrategyFactory _storageStrategyFactory;
private int _totalRetries;
@@ -277,7 +280,7 @@ public class SnapshotManagerImpl extends ManagerBase implements SnapshotManager,
}
}
- SnapshotStrategy snapshotStrategy = StrategyPriority.pickStrategy(snapshotStrategies, snapshot, SnapshotOperation.REVERT);
+ SnapshotStrategy snapshotStrategy = _storageStrategyFactory.getSnapshotStrategy(snapshot, SnapshotOperation.REVERT);
if (snapshotStrategy == null) {
s_logger.error("Unable to find snaphot strategy to handle snapshot with id '"+snapshotId+"'");
@@ -506,7 +509,7 @@ public class SnapshotManagerImpl extends ManagerBase implements SnapshotManager,
}
_accountMgr.checkAccess(caller, null, true, snapshotCheck);
- SnapshotStrategy snapshotStrategy = StrategyPriority.pickStrategy(snapshotStrategies, snapshotCheck, SnapshotOperation.DELETE);
+ SnapshotStrategy snapshotStrategy = _storageStrategyFactory.getSnapshotStrategy(snapshotCheck, SnapshotOperation.DELETE);
if (snapshotStrategy == null) {
s_logger.error("Unable to find snaphot strategy to handle snapshot with id '"+snapshotId+"'");
return false;
@@ -696,7 +699,7 @@ public class SnapshotManagerImpl extends ManagerBase implements SnapshotManager,
// Either way delete the snapshots for this volume.
List<SnapshotVO> snapshots = listSnapsforVolume(volumeId);
for (SnapshotVO snapshot : snapshots) {
- SnapshotStrategy snapshotStrategy = StrategyPriority.pickStrategy(snapshotStrategies, snapshot, SnapshotOperation.DELETE);
+ SnapshotStrategy snapshotStrategy = _storageStrategyFactory.getSnapshotStrategy(snapshot, SnapshotOperation.DELETE);
if (snapshotStrategy == null) {
s_logger.error("Unable to find snaphot strategy to handle snapshot with id '"+snapshot.getId()+"'");
continue;
@@ -1027,7 +1030,7 @@ public class SnapshotManagerImpl extends ManagerBase implements SnapshotManager,
SnapshotInfo snapshot = snapshotFactory.getSnapshot(snapshotId, volume.getDataStore());
try {
- SnapshotStrategy snapshotStrategy = StrategyPriority.pickStrategy(snapshotStrategies, snapshot, SnapshotOperation.TAKE);
+ SnapshotStrategy snapshotStrategy = _storageStrategyFactory.getSnapshotStrategy(snapshot, SnapshotOperation.TAKE);
if (snapshotStrategy == null) {
throw new CloudRuntimeException("Can't find snapshot strategy to deal with snapshot:" + snapshotId);
@@ -1210,12 +1213,4 @@ public class SnapshotManagerImpl extends ManagerBase implements SnapshotManager,
return snapshot;
}
- public List<SnapshotStrategy> getSnapshotStrategies() {
- return snapshotStrategies;
- }
-
- @Inject
- public void setSnapshotStrategies(List<SnapshotStrategy> snapshotStrategies) {
- this.snapshotStrategies = snapshotStrategies;
- }
}