From 70b2c0150dad5ca3b42e34d20831a256661bc8f0 Mon Sep 17 00:00:00 2001 From: Edison Su Date: Fri, 25 Oct 2013 18:15:36 -0700 Subject: [PATCH] rebase to spring changes --- .../spring-core-registry-core-context.xml | 7 ++- ...-lifecycle-storage-context-inheritable.xml | 6 ++ .../api/storage/StorageStrategyFactory.java | 5 +- .../api/storage/VMSnapshotStrategy.java | 2 +- ...spring-engine-schema-core-daos-context.xml | 1 + .../spring-engine-storage-core-context.xml | 1 + ...ngine-storage-snapshot-storage-context.xml | 7 ++- .../vmsnapshot/DefaultVMSnapshotStrategy.java | 5 +- .../helper/StorageStrategyFactoryImpl.java | 22 +++++++ .../vm/snapshot/VMSnapshotManagerImpl.java | 62 ++----------------- 10 files changed, 56 insertions(+), 62 deletions(-) diff --git a/core/resources/META-INF/cloudstack/core/spring-core-registry-core-context.xml b/core/resources/META-INF/cloudstack/core/spring-core-registry-core-context.xml index 26d70c96829..a8b2e2954af 100644 --- a/core/resources/META-INF/cloudstack/core/spring-core-registry-core-context.xml +++ b/core/resources/META-INF/cloudstack/core/spring-core-registry-core-context.xml @@ -260,9 +260,14 @@ + + + + - \ No newline at end of file + diff --git a/core/resources/META-INF/cloudstack/storage/spring-lifecycle-storage-context-inheritable.xml b/core/resources/META-INF/cloudstack/storage/spring-lifecycle-storage-context-inheritable.xml index b6eed7d342b..ad78cad8edc 100644 --- a/core/resources/META-INF/cloudstack/storage/spring-lifecycle-storage-context-inheritable.xml +++ b/core/resources/META-INF/cloudstack/storage/spring-lifecycle-storage-context-inheritable.xml @@ -63,6 +63,12 @@ value="org.apache.cloudstack.engine.subsystem.api.storage.SnapshotStrategy" /> + + + + + volumeMap, Host srcHost, Host destHost); - SnapshotStrategy getSnapshotStrategy(Snapshot snapshot, SnapshotOperation op); + SnapshotStrategy getSnapshotStrategy(Snapshot snapshot, SnapshotOperation op); + + VMSnapshotStrategy getVmSnapshotStrategy(VMSnapshot vmSnapshot); } diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/VMSnapshotStrategy.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/VMSnapshotStrategy.java index 8dd6eca661d..c2a0dedc430 100644 --- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/VMSnapshotStrategy.java +++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/VMSnapshotStrategy.java @@ -24,5 +24,5 @@ public interface VMSnapshotStrategy { VMSnapshot takeVMSnapshot(VMSnapshot vmSnapshot); boolean deleteVMSnapshot(VMSnapshot vmSnapshot); boolean revertVMSnapshot(VMSnapshot vmSnapshot); - boolean canHandle(VMSnapshot vmSnapshot); + StrategyPriority canHandle(VMSnapshot vmSnapshot); } diff --git a/engine/schema/resources/META-INF/cloudstack/core/spring-engine-schema-core-daos-context.xml b/engine/schema/resources/META-INF/cloudstack/core/spring-engine-schema-core-daos-context.xml index a70cd0052b3..3fce43940c7 100644 --- a/engine/schema/resources/META-INF/cloudstack/core/spring-engine-schema-core-daos-context.xml +++ b/engine/schema/resources/META-INF/cloudstack/core/spring-engine-schema-core-daos-context.xml @@ -291,6 +291,7 @@ + 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 8a78fddb8ca..a6a0c22bcc5 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 @@ -63,6 +63,7 @@ + diff --git a/engine/storage/snapshot/resources/META-INF/cloudstack/storage/spring-engine-storage-snapshot-storage-context.xml b/engine/storage/snapshot/resources/META-INF/cloudstack/storage/spring-engine-storage-snapshot-storage-context.xml index 3faa89482c6..d25aeea0250 100644 --- a/engine/storage/snapshot/resources/META-INF/cloudstack/storage/spring-engine-storage-snapshot-storage-context.xml +++ b/engine/storage/snapshot/resources/META-INF/cloudstack/storage/spring-engine-storage-snapshot-storage-context.xml @@ -30,4 +30,9 @@ - \ No newline at end of file + + + + diff --git a/engine/storage/snapshot/src/org/apache/cloudstack/storage/vmsnapshot/DefaultVMSnapshotStrategy.java b/engine/storage/snapshot/src/org/apache/cloudstack/storage/vmsnapshot/DefaultVMSnapshotStrategy.java index 0ef8ebbbc25..be3cce94da9 100644 --- a/engine/storage/snapshot/src/org/apache/cloudstack/storage/vmsnapshot/DefaultVMSnapshotStrategy.java +++ b/engine/storage/snapshot/src/org/apache/cloudstack/storage/vmsnapshot/DefaultVMSnapshotStrategy.java @@ -24,6 +24,7 @@ import java.util.Map; import javax.inject.Inject; import javax.naming.ConfigurationException; +import org.apache.cloudstack.engine.subsystem.api.storage.StrategyPriority; import org.apache.cloudstack.engine.subsystem.api.storage.VMSnapshotStrategy; import org.apache.cloudstack.framework.config.dao.ConfigurationDao; import org.apache.cloudstack.storage.to.VolumeObjectTO; @@ -364,7 +365,7 @@ public class DefaultVMSnapshotStrategy extends ManagerBase implements VMSnapshot } @Override - public boolean canHandle(VMSnapshot vmSnapshot) { - return true; + public StrategyPriority canHandle(VMSnapshot vmSnapshot) { + return StrategyPriority.DEFAULT; } } diff --git a/engine/storage/src/org/apache/cloudstack/storage/helper/StorageStrategyFactoryImpl.java b/engine/storage/src/org/apache/cloudstack/storage/helper/StorageStrategyFactoryImpl.java index 30812bf39f1..a1d128bec0a 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/helper/StorageStrategyFactoryImpl.java +++ b/engine/storage/src/org/apache/cloudstack/storage/helper/StorageStrategyFactoryImpl.java @@ -31,15 +31,18 @@ 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.StorageStrategyFactory; import org.apache.cloudstack.engine.subsystem.api.storage.StrategyPriority; +import org.apache.cloudstack.engine.subsystem.api.storage.VMSnapshotStrategy; import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo; import com.cloud.host.Host; import com.cloud.storage.Snapshot; +import com.cloud.vm.snapshot.VMSnapshot; public class StorageStrategyFactoryImpl implements StorageStrategyFactory { List snapshotStrategies; List dataMotionStrategies; + List vmSnapshotStrategies; @Override public DataMotionStrategy getDataMotionStrategy(final DataObject srcData, final DataObject destData) { @@ -71,6 +74,16 @@ public class StorageStrategyFactoryImpl implements StorageStrategyFactory { }); } + @Override + public VMSnapshotStrategy getVmSnapshotStrategy(final VMSnapshot vmSnapshot) { + return bestMatch(vmSnapshotStrategies, new CanHandle() { + @Override + public StrategyPriority canHandle(VMSnapshotStrategy strategy) { + return strategy.canHandle(vmSnapshot); + } + }); + } + private static T bestMatch(Collection collection, final CanHandle canHandle) { if (collection.size() == 0) return null; @@ -111,4 +124,13 @@ public class StorageStrategyFactoryImpl implements StorageStrategyFactory { this.dataMotionStrategies = dataMotionStrategies; } + @Inject + public void setVmSnapshotStrategies(List vmSnapshotStrategies) { + this.vmSnapshotStrategies = vmSnapshotStrategies; + } + + public List getVmSnapshotStrategies() { + return vmSnapshotStrategies; + } + } diff --git a/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java b/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java index 3f473bd269e..ee81c82fe3f 100644 --- a/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java +++ b/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java @@ -27,26 +27,13 @@ import javax.ejb.Local; import javax.inject.Inject; import javax.naming.ConfigurationException; -import org.apache.log4j.Logger; -import org.springframework.stereotype.Component; import org.apache.cloudstack.api.command.user.vmsnapshot.ListVMSnapshotCmd; import org.apache.cloudstack.context.CallContext; -import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager; +import org.apache.cloudstack.engine.subsystem.api.storage.StorageStrategyFactory; +import org.apache.cloudstack.engine.subsystem.api.storage.VMSnapshotStrategy; import org.apache.cloudstack.framework.config.dao.ConfigurationDao; -import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; -import org.apache.cloudstack.storage.datastore.db.StoragePoolVO; - -import com.cloud.agent.AgentManager; -import com.cloud.agent.api.Answer; -import com.cloud.agent.api.Command; -import com.cloud.agent.api.CreateVMSnapshotAnswer; -import com.cloud.agent.api.CreateVMSnapshotCommand; -import com.cloud.agent.api.DeleteVMSnapshotAnswer; -import com.cloud.agent.api.DeleteVMSnapshotCommand; -import com.cloud.agent.api.RevertToVMSnapshotAnswer; -import com.cloud.agent.api.RevertToVMSnapshotCommand; -import com.cloud.agent.api.VMSnapshotTO; -import com.cloud.agent.api.to.VolumeTO; +import org.apache.log4j.Logger; +import org.springframework.stereotype.Component; import com.cloud.event.ActionEvent; import com.cloud.event.EventTypes; @@ -75,14 +62,6 @@ import com.cloud.utils.component.ManagerBase; import com.cloud.utils.db.Filter; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; - -import com.cloud.utils.db.Transaction; -import com.cloud.utils.db.TransactionCallback; -import com.cloud.utils.db.TransactionCallbackNoReturn; -import com.cloud.utils.db.TransactionCallbackWithException; -import com.cloud.utils.db.TransactionCallbackWithExceptionNoReturn; -import com.cloud.utils.db.TransactionStatus; - import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.vm.UserVmVO; import com.cloud.vm.VMInstanceVO; @@ -92,21 +71,6 @@ import com.cloud.vm.VirtualMachineManager; import com.cloud.vm.VirtualMachineProfile; import com.cloud.vm.dao.UserVmDao; import com.cloud.vm.snapshot.dao.VMSnapshotDao; -import org.apache.cloudstack.api.command.user.vmsnapshot.ListVMSnapshotCmd; -import org.apache.cloudstack.context.CallContext; -import org.apache.cloudstack.engine.subsystem.api.storage.VMSnapshotStrategy; -import org.apache.cloudstack.framework.config.dao.ConfigurationDao; -import org.apache.log4j.Logger; -import org.springframework.stereotype.Component; - -import javax.ejb.Local; -import javax.inject.Inject; -import javax.naming.ConfigurationException; -import java.util.ArrayList; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; @Component @Local(value = { VMSnapshotManager.class, VMSnapshotService.class }) @@ -123,16 +87,8 @@ public class VMSnapshotManagerImpl extends ManagerBase implements VMSnapshotMana @Inject VirtualMachineManager _itMgr; @Inject ConfigurationDao _configDao; @Inject HypervisorCapabilitiesDao _hypervisorCapabilitiesDao; - @Inject List vmSnapshotStrategies; - - public List getVmSnapshotStrategies() { - return vmSnapshotStrategies; - } - @Inject - public void setVmSnapshotStrategies(List vmSnapshotStrategies) { - this.vmSnapshotStrategies = vmSnapshotStrategies; - } + StorageStrategyFactory storageStrategyFactory; int _vmSnapshotMax; int _wait; @@ -343,13 +299,7 @@ public class VMSnapshotManagerImpl extends ManagerBase implements VMSnapshotMana } private VMSnapshotStrategy findVMSnapshotStrategy(VMSnapshot vmSnapshot) { - VMSnapshotStrategy snapshotStrategy = null; - for(VMSnapshotStrategy strategy : vmSnapshotStrategies) { - if (strategy.canHandle(vmSnapshot)) { - snapshotStrategy = strategy; - break; - } - } + VMSnapshotStrategy snapshotStrategy = storageStrategyFactory.getVmSnapshotStrategy(vmSnapshot); if (snapshotStrategy == null) { throw new CloudRuntimeException("can't find vm snapshot strategy for vmsnapshot: " + vmSnapshot.getId());