You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by bf...@apache.org on 2013/02/21 22:45:19 UTC

[41/51] [abbrv] refactor snapshot, move existing snapshot code into its own snapshotstrategy

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/ff047e75/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/DefaultPrimaryDataStore.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/DefaultPrimaryDataStore.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/DefaultPrimaryDataStore.java
index 72c1843..f2a9993 100644
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/DefaultPrimaryDataStore.java
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/DefaultPrimaryDataStore.java
@@ -31,6 +31,7 @@ import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreProvider;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreRole;
 import org.apache.cloudstack.engine.subsystem.api.storage.ImageDataFactory;
 import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine;
+import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreDriver;
 import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreLifeCycle;
 import org.apache.cloudstack.engine.subsystem.api.storage.Scope;
 import org.apache.cloudstack.engine.subsystem.api.storage.ScopeType;
@@ -42,7 +43,6 @@ import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope;
 import org.apache.cloudstack.engine.subsystem.api.storage.disktype.DiskFormat;
 import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
 import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
-import org.apache.cloudstack.storage.volume.PrimaryDataStoreDriver;
 import org.apache.cloudstack.storage.volume.VolumeObject;
 import org.apache.log4j.Logger;
 

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/ff047e75/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/driver/AncientPrimaryDataStoreDriverImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/driver/AncientPrimaryDataStoreDriverImpl.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/driver/AncientPrimaryDataStoreDriverImpl.java
index 9946fba..657ba80 100644
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/driver/AncientPrimaryDataStoreDriverImpl.java
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/driver/AncientPrimaryDataStoreDriverImpl.java
@@ -29,261 +29,325 @@ import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectType;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
 import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint;
+import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreDriver;
 import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotInfo;
 import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
 import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
 import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
-import org.apache.cloudstack.storage.volume.PrimaryDataStoreDriver;
+import org.apache.cloudstack.storage.volume.VolumeObject;
 import org.apache.log4j.Logger;
 
 import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.ManageSnapshotAnswer;
+import com.cloud.agent.api.ManageSnapshotCommand;
 import com.cloud.agent.api.storage.CreateAnswer;
 import com.cloud.agent.api.storage.CreateCommand;
 import com.cloud.agent.api.storage.DestroyCommand;
+import com.cloud.agent.api.storage.ResizeVolumeAnswer;
+import com.cloud.agent.api.storage.ResizeVolumeCommand;
 import com.cloud.agent.api.to.StorageFilerTO;
 import com.cloud.exception.StorageUnavailableException;
 import com.cloud.host.HostVO;
 import com.cloud.host.dao.HostDao;
 import com.cloud.storage.DiskOfferingVO;
+import com.cloud.storage.ResizeVolumePayload;
 import com.cloud.storage.Storage;
 import com.cloud.storage.Storage.StoragePoolType;
+import com.cloud.storage.SnapshotVO;
 import com.cloud.storage.StorageManager;
 import com.cloud.storage.StoragePool;
 import com.cloud.storage.VMTemplateHostVO;
 import com.cloud.storage.VMTemplateStoragePoolVO;
 import com.cloud.storage.VMTemplateVO;
+import com.cloud.storage.VolumeManager;
 import com.cloud.storage.VolumeVO;
 import com.cloud.storage.dao.DiskOfferingDao;
+import com.cloud.storage.dao.SnapshotDao;
 import com.cloud.storage.dao.VMTemplateDao;
 import com.cloud.storage.dao.VolumeDao;
+import com.cloud.storage.snapshot.SnapshotManager;
 import com.cloud.template.TemplateManager;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.vm.DiskProfile;
 import com.cloud.vm.dao.VMInstanceDao;
 
 public class AncientPrimaryDataStoreDriverImpl implements PrimaryDataStoreDriver {
-    private static final Logger s_logger = Logger
-            .getLogger(AncientPrimaryDataStoreDriverImpl.class);
-    @Inject DiskOfferingDao diskOfferingDao;
-    @Inject VMTemplateDao templateDao;
-    @Inject VolumeDao volumeDao;
-    @Inject TemplateManager templateMgr;
-    @Inject HostDao hostDao;
-    @Inject StorageManager storageMgr;
-    @Inject VMInstanceDao vmDao;
-    @Inject PrimaryDataStoreDao primaryStoreDao;
-    @Override
-    public String grantAccess(DataObject data, EndPoint ep) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public boolean revokeAccess(DataObject data, EndPoint ep) {
-        // TODO Auto-generated method stub
-        return false;
-    }
-
-    @Override
-    public Set<DataObject> listObjects(DataStore store) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    public boolean createVolume(
-            VolumeInfo volume) throws StorageUnavailableException {
-        if (s_logger.isDebugEnabled()) {
-            s_logger.debug("Creating volume: " + volume);
-        }
-        
-        DiskOfferingVO offering = diskOfferingDao.findById(volume.getDiskOfferingId());
-        DiskProfile diskProfile = new DiskProfile(volume, offering,
-                null);
+	private static final Logger s_logger = Logger
+			.getLogger(AncientPrimaryDataStoreDriverImpl.class);
+	@Inject DiskOfferingDao diskOfferingDao;
+	@Inject VMTemplateDao templateDao;
+	@Inject VolumeDao volumeDao;
+	@Inject TemplateManager templateMgr;
+	@Inject HostDao hostDao;
+	@Inject StorageManager storageMgr;
+	@Inject VolumeManager volumeMgr;
+	@Inject VMInstanceDao vmDao;
+	@Inject SnapshotDao snapshotDao;
+	@Inject PrimaryDataStoreDao primaryStoreDao;
+	@Inject SnapshotManager snapshotMgr;
+	@Override
+	public String grantAccess(DataObject data, EndPoint ep) {
+		// TODO Auto-generated method stub
+		return null;
+	}
 
-        VMTemplateVO template = null;
-        if (volume.getTemplateId() != null) {
-            template = templateDao.findById(volume.getTemplateId());
-        }
+	@Override
+	public boolean revokeAccess(DataObject data, EndPoint ep) {
+		// TODO Auto-generated method stub
+		return false;
+	}
 
-        StoragePool pool = (StoragePool)volume.getDataStore();
-        VolumeVO vol = volumeDao.findById(volume.getId());
-        if (pool != null) {
-            if (s_logger.isDebugEnabled()) {
-                s_logger.debug("Trying to create in " + pool);
-            }
-            vol.setPoolId(pool.getId());
-   
-            CreateCommand cmd = null;
-            VMTemplateStoragePoolVO tmpltStoredOn = null;
-
-            for (int i = 0; i < 2; i++) {
-                if (template != null
-                        && template.getFormat() != Storage.ImageFormat.ISO) {
-                    if (pool.getPoolType() == StoragePoolType.CLVM) {
-                        // prepareISOForCreate does what we need, which is to
-                        // tell us where the template is
-                        VMTemplateHostVO tmpltHostOn = templateMgr
-                                .prepareISOForCreate(template, pool);
-                        if (tmpltHostOn == null) {
-                            s_logger.debug("cannot find template "
-                                    + template.getId() + " "
-                                    + template.getName());
-                            throw new CloudRuntimeException("cannot find template"
-                                    + template.getId() 
-                                    + template.getName());
-                        }
-                        HostVO secondaryStorageHost = hostDao
-                                .findById(tmpltHostOn.getHostId());
-                        String tmpltHostUrl = secondaryStorageHost
-                                .getStorageUrl();
-                        String fullTmpltUrl = tmpltHostUrl + "/"
-                                + tmpltHostOn.getInstallPath();
-                        cmd = new CreateCommand(diskProfile, fullTmpltUrl,
-                                new StorageFilerTO(pool));
-                    } else {
-                        tmpltStoredOn = templateMgr.prepareTemplateForCreate(
-                                template, pool);
-                        if (tmpltStoredOn == null) {
-                            s_logger.debug("Cannot use this pool " + pool
-                                    + " because we can't propagate template "
-                                    + template);
-                            throw new CloudRuntimeException("Cannot use this pool " + pool
-                                    + " because we can't propagate template "
-                                    + template);
-                        }
-                        cmd = new CreateCommand(diskProfile,
-                                tmpltStoredOn.getLocalDownloadPath(),
-                                new StorageFilerTO(pool));
-                    }
-                } else {
-                    if (template != null
-                            && Storage.ImageFormat.ISO == template.getFormat()) {
-                        VMTemplateHostVO tmpltHostOn = templateMgr
-                                .prepareISOForCreate(template, pool);
-                        if (tmpltHostOn == null) {
-                            throw new CloudRuntimeException(
-                                    "Did not find ISO in secondry storage in zone "
-                                            + pool.getDataCenterId());
-                        }
-                    }
-                    cmd = new CreateCommand(diskProfile, new StorageFilerTO(
-                            pool));
-                }
-
-                Answer answer = storageMgr.sendToPool(pool, null, cmd);
-                if (answer.getResult()) {
-                    CreateAnswer createAnswer = (CreateAnswer) answer;
-                    vol.setFolder(pool.getPath());
-                    vol.setPath(createAnswer.getVolume().getPath());
-                    vol.setSize(createAnswer.getVolume().getSize());
-                    vol.setPoolType(pool.getPoolType());
-                    vol.setPoolId(pool.getId());
-                    vol.setPodId(pool.getPodId());
-                    this.volumeDao.update(vol.getId(), vol);
-                    return true;
-                } else {
-                    if (tmpltStoredOn != null
-                            && (answer instanceof CreateAnswer)
-                            && ((CreateAnswer) answer)
-                                    .templateReloadRequested()) {
-                        if (!templateMgr
-                                .resetTemplateDownloadStateOnPool(tmpltStoredOn
-                                        .getId())) {
-                            break; // break out of template-redeploy retry loop
-                        }
-                    } else {
-                        break;
-                    }
-                }
-            }
-        }
+	@Override
+	public Set<DataObject> listObjects(DataStore store) {
+		// TODO Auto-generated method stub
+		return null;
+	}
 
-        if (s_logger.isDebugEnabled()) {
-            s_logger.debug("Unable to create volume " + volume.getId());
-        }
-        return false;
-    }
-
-    @Override
-    public void createAsync(DataObject data,
-            AsyncCompletionCallback<CreateCmdResult> callback) {
-        // TODO Auto-generated method stub
-        String errMsg = null;
-        if (data.getType() == DataObjectType.VOLUME) {
-            try {
-                createVolume((VolumeInfo)data);
-            } catch (StorageUnavailableException e) {
-                s_logger.debug("failed to create volume", e);
-                errMsg = e.toString();
-            } catch (Exception e) {
-                s_logger.debug("failed to create volume", e);
-                errMsg = e.toString();
-            }
-        }
-        CreateCmdResult result = new CreateCmdResult(null, null);
-        if (errMsg != null) {
-            result.setResult(errMsg);
-        }
-        
-        callback.complete(result);
+	public boolean createVolume(
+			VolumeInfo volume) throws StorageUnavailableException {
+		if (s_logger.isDebugEnabled()) {
+			s_logger.debug("Creating volume: " + volume);
+		}
+
+		DiskOfferingVO offering = diskOfferingDao.findById(volume.getDiskOfferingId());
+		DiskProfile diskProfile = new DiskProfile(volume, offering,
+				null);
+
+		VMTemplateVO template = null;
+		if (volume.getTemplateId() != null) {
+			template = templateDao.findById(volume.getTemplateId());
+		}
+
+		StoragePool pool = (StoragePool)volume.getDataStore();
+		VolumeVO vol = volumeDao.findById(volume.getId());
+		if (pool != null) {
+			if (s_logger.isDebugEnabled()) {
+				s_logger.debug("Trying to create in " + pool);
+			}
+			vol.setPoolId(pool.getId());
+
+			CreateCommand cmd = null;
+			VMTemplateStoragePoolVO tmpltStoredOn = null;
+
+			for (int i = 0; i < 2; i++) {
+				if (template != null
+						&& template.getFormat() != Storage.ImageFormat.ISO) {
+					if (pool.getPoolType() == StoragePoolType.CLVM) {
+						// prepareISOForCreate does what we need, which is to
+						// tell us where the template is
+						VMTemplateHostVO tmpltHostOn = templateMgr
+								.prepareISOForCreate(template, pool);
+						if (tmpltHostOn == null) {
+							s_logger.debug("cannot find template "
+									+ template.getId() + " "
+									+ template.getName());
+							throw new CloudRuntimeException("cannot find template"
+									+ template.getId() 
+									+ template.getName());
+						}
+						HostVO secondaryStorageHost = hostDao
+								.findById(tmpltHostOn.getHostId());
+						String tmpltHostUrl = secondaryStorageHost
+								.getStorageUrl();
+						String fullTmpltUrl = tmpltHostUrl + "/"
+								+ tmpltHostOn.getInstallPath();
+						cmd = new CreateCommand(diskProfile, fullTmpltUrl,
+								new StorageFilerTO(pool));
+					} else {
+						tmpltStoredOn = templateMgr.prepareTemplateForCreate(
+								template, pool);
+						if (tmpltStoredOn == null) {
+							s_logger.debug("Cannot use this pool " + pool
+									+ " because we can't propagate template "
+									+ template);
+							throw new CloudRuntimeException("Cannot use this pool " + pool
+									+ " because we can't propagate template "
+									+ template);
+						}
+						cmd = new CreateCommand(diskProfile,
+								tmpltStoredOn.getLocalDownloadPath(),
+								new StorageFilerTO(pool));
+					}
+				} else {
+					if (template != null
+							&& Storage.ImageFormat.ISO == template.getFormat()) {
+						VMTemplateHostVO tmpltHostOn = templateMgr
+								.prepareISOForCreate(template, pool);
+						if (tmpltHostOn == null) {
+							throw new CloudRuntimeException(
+									"Did not find ISO in secondry storage in zone "
+											+ pool.getDataCenterId());
+						}
+					}
+					cmd = new CreateCommand(diskProfile, new StorageFilerTO(
+							pool));
+				}
+
+				Answer answer = storageMgr.sendToPool(pool, null, cmd);
+				if (answer.getResult()) {
+					CreateAnswer createAnswer = (CreateAnswer) answer;
+					vol.setFolder(pool.getPath());
+					vol.setPath(createAnswer.getVolume().getPath());
+					vol.setSize(createAnswer.getVolume().getSize());
+					vol.setPoolType(pool.getPoolType());
+					vol.setPoolId(pool.getId());
+					vol.setPodId(pool.getPodId());
+					this.volumeDao.update(vol.getId(), vol);
+					return true;
+				} else {
+					if (tmpltStoredOn != null
+							&& (answer instanceof CreateAnswer)
+							&& ((CreateAnswer) answer)
+							.templateReloadRequested()) {
+						if (!templateMgr
+								.resetTemplateDownloadStateOnPool(tmpltStoredOn
+										.getId())) {
+							break; // break out of template-redeploy retry loop
+						}
+					} else {
+						break;
+					}
+				}
+			}
+		}
+
+		if (s_logger.isDebugEnabled()) {
+			s_logger.debug("Unable to create volume " + volume.getId());
+		}
+		return false;
+	}
+
+	@Override
+	public void createAsync(DataObject data,
+			AsyncCompletionCallback<CreateCmdResult> callback) {
+		// TODO Auto-generated method stub
+		String errMsg = null;
+		if (data.getType() == DataObjectType.VOLUME) {
+			try {
+				createVolume((VolumeInfo)data);
+			} catch (StorageUnavailableException e) {
+				s_logger.debug("failed to create volume", e);
+				errMsg = e.toString();
+			} catch (Exception e) {
+				s_logger.debug("failed to create volume", e);
+				errMsg = e.toString();
+			}
+		}
+		CreateCmdResult result = new CreateCmdResult(null, null);
+		if (errMsg != null) {
+			result.setResult(errMsg);
+		}
+
+		callback.complete(result);
+
+	}
+
+	@Override
+	public void deleteAsync(DataObject data,
+			AsyncCompletionCallback<CommandResult> callback) {
+
+		String vmName = null;
+		VolumeVO vol = this.volumeDao.findById(data.getId());
+
+
+		StoragePool pool = (StoragePool)data.getDataStore();
+
+		DestroyCommand cmd = new DestroyCommand(pool, vol, vmName);
+
+		CommandResult result = new CommandResult();
+		try {
+			Answer answer = this.storageMgr.sendToPool(pool, cmd);
+			if (answer != null && !answer.getResult()) {
+				result.setResult(answer.getDetails());
+				s_logger.info("Will retry delete of " + vol + " from " + pool.getId());
+			}
+		} catch (StorageUnavailableException e) {
+			s_logger.error("Storage is unavailable currently.  Will retry delete of "
+					+ vol + " from " + pool.getId(), e);
+			result.setResult(e.toString());
+		} catch (Exception ex) {
+			s_logger.debug("Unable to destoy volume" + vol + " from " + pool.getId(), ex);
+			result.setResult(ex.toString());
+		}
+		callback.complete(result);
+	}
+
+	@Override
+	public void copyAsync(DataObject srcdata, DataObject destData,
+			AsyncCompletionCallback<CopyCommandResult> callback) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public boolean canCopy(DataObject srcData, DataObject destData) {
+		// TODO Auto-generated method stub
+		return false;
+	}
+
+	@Override
+	public void takeSnapshot(SnapshotInfo snapshot,
+			AsyncCompletionCallback<CreateCmdResult> callback) {
+		VolumeInfo volume = snapshot.getBaseVolume();
+        String vmName = this.volumeMgr.getVmNameOnVolume(volume);
+        SnapshotVO preSnapshotVO = this.snapshotMgr.getParentSnapshot(volume, snapshot);
+        StoragePool srcPool = (StoragePool)volume.getDataStore();
+
+        ManageSnapshotCommand cmd = new ManageSnapshotCommand(snapshot.getId(), volume.getPath(), srcPool, preSnapshotVO.getPath(), snapshot.getName(), vmName);
+      
+        ManageSnapshotAnswer answer = (ManageSnapshotAnswer) this.snapshotMgr.sendToPool(volume, cmd);
         
-    }
-
-    @Override
-    public void deleteAsync(DataObject data,
-            AsyncCompletionCallback<CommandResult> callback) {
-
-        String vmName = null;
-        VolumeVO vol = this.volumeDao.findById(data.getId());
-
-
-        StoragePool pool = (StoragePool)data.getDataStore();
-
-        DestroyCommand cmd = new DestroyCommand(pool, vol, vmName);
-
-        CommandResult result = new CommandResult();
-        try {
-            Answer answer = this.storageMgr.sendToPool(pool, cmd);
-            if (answer != null && !answer.getResult()) {
-                result.setResult(answer.getDetails());
-                s_logger.info("Will retry delete of " + vol + " from " + pool.getId());
-            }
-        } catch (StorageUnavailableException e) {
-            s_logger.error("Storage is unavailable currently.  Will retry delete of "
-                        + vol + " from " + pool.getId(), e);
-            result.setResult(e.toString());
-        } catch (Exception ex) {
-            s_logger.debug("Unable to destoy volume" + vol + " from " + pool.getId(), ex);
-            result.setResult(ex.toString());
+        CreateCmdResult result = null;
+        if ((answer != null) && answer.getResult()) {
+        	result = new CreateCmdResult(answer.getSnapshotPath(), null);
+        } else {
+        	result = new CreateCmdResult(null, null);
         }
+        
         callback.complete(result);
-    }
+	}
 
-    @Override
-    public void copyAsync(DataObject srcdata, DataObject destData,
-            AsyncCompletionCallback<CopyCommandResult> callback) {
-        // TODO Auto-generated method stub
+	@Override
+	public void revertSnapshot(SnapshotInfo snapshot,
+			AsyncCompletionCallback<CommandResult> callback) {
+		// TODO Auto-generated method stub
 
-    }
+	}
 
-    @Override
-    public boolean canCopy(DataObject srcData, DataObject destData) {
-        // TODO Auto-generated method stub
-        return false;
-    }
+	@Override
+	public void resize(DataObject data,
+			AsyncCompletionCallback<CreateCmdResult> callback) {
+		VolumeObject vol = (VolumeObject)data;
+		StoragePool pool = (StoragePool)data.getDataStore();
+		ResizeVolumePayload resizeParameter = (ResizeVolumePayload)vol.getpayload();
 
-    @Override
-    public void takeSnapshot(SnapshotInfo snapshot,
-            AsyncCompletionCallback<CommandResult> callback) {
-        // TODO Auto-generated method stub
-        
-    }
+		ResizeVolumeCommand resizeCmd = new ResizeVolumeCommand(
+				vol.getPath(), new StorageFilerTO(pool), vol.getSize(),
+				resizeParameter.newSize, resizeParameter.shrinkOk, resizeParameter.instanceName);
+		CreateCmdResult result = new CreateCmdResult(null, null);
+		try {
+			ResizeVolumeAnswer answer = (ResizeVolumeAnswer) this.storageMgr.sendToPool(pool,
+					resizeParameter.hosts, resizeCmd);
+			if (answer != null && answer.getResult()) {
+				long finalSize = answer.getNewSize();
+				s_logger.debug("Resize: volume started at size " + vol.getSize()
+						+ " and ended at size " + finalSize);
 
-    @Override
-    public void revertSnapshot(SnapshotInfo snapshot,
-            AsyncCompletionCallback<CommandResult> callback) {
-        // TODO Auto-generated method stub
-        
-    }
+				vol.setSize(finalSize);
+				vol.update();
+			} else if (answer != null) {
+				result.setResult(answer.getDetails());
+			} else {
+				s_logger.debug("return a null answer, mark it as failed for unknown reason");
+				result.setResult("return a null answer, mark it as failed for unknown reason");
+			}
+
+		} catch (Exception e) {
+			s_logger.debug("sending resize command failed", e);
+			result.setResult(e.toString());
+		}
+
+		callback.complete(result);
+	}
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/ff047e75/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/driver/DefaultPrimaryDataStoreDriverImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/driver/DefaultPrimaryDataStoreDriverImpl.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/driver/DefaultPrimaryDataStoreDriverImpl.java
index efd04d1..6d0c2c6 100644
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/driver/DefaultPrimaryDataStoreDriverImpl.java
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/driver/DefaultPrimaryDataStoreDriverImpl.java
@@ -27,6 +27,7 @@ import org.apache.cloudstack.engine.subsystem.api.storage.CreateCmdResult;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
 import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint;
+import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreDriver;
 import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotInfo;
 import org.apache.cloudstack.framework.async.AsyncCallbackDispatcher;
 import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
@@ -36,7 +37,6 @@ import org.apache.cloudstack.storage.command.CreateObjectCommand;
 import org.apache.cloudstack.storage.command.DeleteCommand;
 import org.apache.cloudstack.storage.datastore.DataObjectManager;
 import org.apache.cloudstack.storage.endpoint.EndPointSelector;
-import org.apache.cloudstack.storage.volume.PrimaryDataStoreDriver;
 import org.apache.log4j.Logger;
 
 import com.cloud.agent.api.Answer;
@@ -211,13 +211,6 @@ public class DefaultPrimaryDataStoreDriverImpl implements PrimaryDataStoreDriver
     }
 
     @Override
-    public void takeSnapshot(SnapshotInfo snapshot,
-            AsyncCompletionCallback<CommandResult> callback) {
-        // TODO Auto-generated method stub
-        
-    }
-
-    @Override
     public void revertSnapshot(SnapshotInfo snapshot,
             AsyncCompletionCallback<CommandResult> callback) {
         // TODO Auto-generated method stub
@@ -238,5 +231,19 @@ public class DefaultPrimaryDataStoreDriverImpl implements PrimaryDataStoreDriver
         // TODO Auto-generated method stub
         
     }
+
+	@Override
+	public void resize(DataObject data,
+			AsyncCompletionCallback<CreateCmdResult> callback) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public void takeSnapshot(SnapshotInfo snapshot,
+			AsyncCompletionCallback<CreateCmdResult> callback) {
+		// TODO Auto-generated method stub
+		
+	}
    
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/ff047e75/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/manager/DefaultPrimaryDataStoreProviderManagerImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/manager/DefaultPrimaryDataStoreProviderManagerImpl.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/manager/DefaultPrimaryDataStoreProviderManagerImpl.java
index fdbe4b4..f395061 100644
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/manager/DefaultPrimaryDataStoreProviderManagerImpl.java
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/manager/DefaultPrimaryDataStoreProviderManagerImpl.java
@@ -27,13 +27,13 @@ import javax.inject.Inject;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreProvider;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreProviderManager;
 import org.apache.cloudstack.engine.subsystem.api.storage.HypervisorHostListener;
+import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreDriver;
 import org.apache.cloudstack.storage.datastore.DefaultPrimaryDataStore;
 import org.apache.cloudstack.storage.datastore.PrimaryDataStore;
 import org.apache.cloudstack.storage.datastore.PrimaryDataStoreProviderManager;
 import org.apache.cloudstack.storage.datastore.db.DataStoreProviderDao;
 import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
 import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
-import org.apache.cloudstack.storage.volume.PrimaryDataStoreDriver;
 import org.springframework.stereotype.Component;
 
 @Component

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/ff047e75/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/provider/AncientPrimaryDataStoreProviderImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/provider/AncientPrimaryDataStoreProviderImpl.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/provider/AncientPrimaryDataStoreProviderImpl.java
index 702ab23..0ef1704 100644
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/provider/AncientPrimaryDataStoreProviderImpl.java
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/provider/AncientPrimaryDataStoreProviderImpl.java
@@ -23,10 +23,10 @@ import java.util.Map;
 import javax.inject.Inject;
 
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreLifeCycle;
+import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreDriver;
 import org.apache.cloudstack.storage.datastore.PrimaryDataStoreProviderManager;
 import org.apache.cloudstack.storage.datastore.driver.AncientPrimaryDataStoreDriverImpl;
 import org.apache.cloudstack.storage.datastore.lifecycle.AncientPrimaryDataStoreLifeCyclImpl;
-import org.apache.cloudstack.storage.volume.PrimaryDataStoreDriver;
 import org.springframework.stereotype.Component;
 
 import com.cloud.utils.component.ComponentContext;

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/ff047e75/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/provider/DefaultPrimaryDatastoreProviderImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/provider/DefaultPrimaryDatastoreProviderImpl.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/provider/DefaultPrimaryDatastoreProviderImpl.java
index 85a5d02..a1402c1 100644
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/provider/DefaultPrimaryDatastoreProviderImpl.java
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/provider/DefaultPrimaryDatastoreProviderImpl.java
@@ -22,10 +22,10 @@ import javax.inject.Inject;
 
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreLifeCycle;
 import org.apache.cloudstack.engine.subsystem.api.storage.HypervisorHostListener;
+import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreDriver;
 import org.apache.cloudstack.storage.datastore.PrimaryDataStoreProviderManager;
 import org.apache.cloudstack.storage.datastore.driver.DefaultPrimaryDataStoreDriverImpl;
 import org.apache.cloudstack.storage.datastore.lifecycle.DefaultPrimaryDataStoreLifeCycleImpl;
-import org.apache.cloudstack.storage.volume.PrimaryDataStoreDriver;
 import org.springframework.stereotype.Component;
 
 import com.cloud.utils.component.ComponentContext;

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/ff047e75/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeObject.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeObject.java b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeObject.java
index 87951ce..6ad6cc9 100644
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeObject.java
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeObject.java
@@ -30,6 +30,7 @@ import org.apache.cloudstack.engine.subsystem.api.storage.disktype.DiskFormat;
 import org.apache.cloudstack.storage.datastore.ObjectInDataStoreManager;
 import org.apache.log4j.Logger;
 
+import com.cloud.hypervisor.Hypervisor.HypervisorType;
 import com.cloud.storage.Volume;
 import com.cloud.storage.VolumeVO;
 import com.cloud.storage.dao.VolumeDao;
@@ -73,6 +74,10 @@ public class VolumeObject implements VolumeInfo {
     public void setPath(String uuid) {
         volumeVO.setPath(uuid);
     }
+    
+    public void setSize(Long size) {
+    	volumeVO.setSize(size);
+    }
 
     public Volume.State getState() {
         return volumeVO.getState();
@@ -182,6 +187,8 @@ public class VolumeObject implements VolumeInfo {
                 volEvent = Volume.Event.OperationSucceeded;
             } else if (event == ObjectInDataStoreStateMachine.Event.OperationFailed) {
                 volEvent = Volume.Event.OperationFailed;
+            } else if (event == ObjectInDataStoreStateMachine.Event.ResizeRequested) {
+            	volEvent = Volume.Event.ResizeRequested;
             }
             this.stateTransit(volEvent);
         } catch (Exception e) {
@@ -310,4 +317,14 @@ public class VolumeObject implements VolumeInfo {
     public Object getpayload() {
        return this.payload;
     }
+
+	@Override
+	public HypervisorType getHypervisorType() {
+		return this.volumeDao.getHypervisorType(this.volumeVO.getId());
+	}
+
+	@Override
+	public Long getLastPoolId() {
+		return this.volumeVO.getLastPoolId();
+	}
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/ff047e75/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java
index ef99a49..c019374 100644
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java
@@ -56,9 +56,6 @@ import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.vm.VirtualMachine;
 import com.cloud.vm.dao.VMInstanceDao;
 
-//1. change volume state
-//2. orchestrator of volume, control most of the information of volume, storage pool id, voluem state, scope etc.
-
 @Component
 public class VolumeServiceImpl implements VolumeService {
     private static final Logger s_logger = Logger
@@ -423,8 +420,49 @@ public class VolumeServiceImpl implements VolumeService {
     public AsyncCallFuture<VolumeApiResult> createVolumeFromSnapshot(
             VolumeInfo volume, DataStore store, SnapshotInfo snapshot) {
         AsyncCallFuture<VolumeApiResult> future = new AsyncCallFuture<VolumeApiResult>();
-        VolumeApiResult result = new VolumeApiResult(volume);
-        return null;
+        
+        try {
+        	DataObject volumeOnStore = store.create(volume);
+        	volume.processEvent(Event.CreateOnlyRequested);
+        	 CreateVolumeFromBaseImageContext<VolumeApiResult> context = new CreateVolumeFromBaseImageContext<VolumeApiResult>(null, 
+        			 (VolumeObject)volume, store, volumeOnStore, future);
+             AsyncCallbackDispatcher<VolumeServiceImpl, CopyCommandResult> caller =  AsyncCallbackDispatcher.create(this);
+             caller.setCallback(caller.getTarget().createVolumeFromSnapshotCallback(null, null))
+             .setContext(context);
+        	this.motionSrv.copyAsync(snapshot, volumeOnStore, caller);
+        } catch (Exception e) {
+        	s_logger.debug("create volume from snapshot failed", e);
+        	VolumeApiResult result = new VolumeApiResult(volume);
+        	result.setResult(e.toString());
+        	future.complete(result);
+        }
+        
+        return future;
+    }
+    
+    protected Void createVolumeFromSnapshotCallback(AsyncCallbackDispatcher<VolumeServiceImpl, CopyCommandResult> callback, 
+    		CreateVolumeFromBaseImageContext<VolumeApiResult> context) {
+    	CopyCommandResult result = callback.getResult();
+    	VolumeInfo volume = context.vo;
+    	VolumeApiResult apiResult = new VolumeApiResult(volume);
+    	Event event = null;
+    	if (result.isFailed()) {
+    		apiResult.setResult(result.getResult());
+    		event = Event.OperationFailed;
+    	} else {
+    		event = Event.OperationSuccessed;
+    	}
+    	
+    	try {
+    		volume.processEvent(event);
+    	} catch (Exception e) {
+    		s_logger.debug("create volume from snapshot failed", e);
+    		apiResult.setResult(e.toString());
+    	}
+    	
+    	AsyncCallFuture<VolumeApiResult> future = context.future;
+    	future.complete(apiResult);
+    	return null;
     }
     
     protected VolumeVO duplicateVolumeOnAnotherStorage(Volume volume, StoragePool pool) {
@@ -552,5 +590,61 @@ public class VolumeServiceImpl implements VolumeService {
         context.future.complete(res);
         return null;
     }
+    
+
+	@Override
+	public AsyncCallFuture<VolumeApiResult> resize(VolumeInfo volume) {
+		AsyncCallFuture<VolumeApiResult> future = new AsyncCallFuture<VolumeApiResult>();
+		VolumeApiResult result = new VolumeApiResult(volume);
+		try {
+			volume.processEvent(Event.ResizeRequested);
+		} catch (Exception e) {
+			s_logger.debug("Failed to change state to resize", e);
+			result.setResult(e.toString());
+			future.complete(result);
+			return future;
+		}
+		 CreateVolumeContext<VolumeApiResult> context = new CreateVolumeContext<VolumeApiResult>(null, volume, future);
+	        AsyncCallbackDispatcher<VolumeServiceImpl, CreateCmdResult> caller = AsyncCallbackDispatcher.create(this);
+	        caller.setCallback(caller.getTarget().registerVolumeCallback(null, null))
+	        .setContext(context);
+		volume.getDataStore().getDriver().resize(volume, caller);
+		return future;
+	}
+	
+	protected Void resizeVolumeCallback(AsyncCallbackDispatcher<VolumeServiceImpl, CreateCmdResult> callback, CreateVolumeContext<VolumeApiResult> context) {
+		CreateCmdResult result = callback.getResult();
+		AsyncCallFuture<VolumeApiResult> future  = context.future;
+		VolumeInfo volume = (VolumeInfo)context.volume;
+		
+		if (result.isFailed()) {
+			try {
+				volume.processEvent(Event.OperationFailed);
+			} catch (Exception e) {
+				s_logger.debug("Failed to change state", e);
+			}
+			VolumeApiResult res = new VolumeApiResult(volume);
+			res.setResult(result.getResult());
+			future.complete(res);
+			return null;
+		}
+		
+		try {
+			volume.processEvent(Event.OperationSuccessed);
+		} catch(Exception e) {
+			s_logger.debug("Failed to change state", e);
+			VolumeApiResult res = new VolumeApiResult(volume);
+			res.setResult(result.getResult());
+			future.complete(res);
+			return null;
+		}
+		
+		VolumeApiResult res = new VolumeApiResult(volume);
+		future.complete(res);
+		
+		return null;
+	}
+	
+	
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/ff047e75/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/driver/SolidfirePrimaryDataStoreDriver.java
----------------------------------------------------------------------
diff --git a/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/driver/SolidfirePrimaryDataStoreDriver.java b/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/driver/SolidfirePrimaryDataStoreDriver.java
index 88c5374..f31126c 100644
--- a/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/driver/SolidfirePrimaryDataStoreDriver.java
+++ b/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/driver/SolidfirePrimaryDataStoreDriver.java
@@ -24,9 +24,9 @@ import org.apache.cloudstack.engine.subsystem.api.storage.CreateCmdResult;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
 import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint;
+import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreDriver;
 import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotInfo;
 import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
-import org.apache.cloudstack.storage.volume.PrimaryDataStoreDriver;
 
 public class SolidfirePrimaryDataStoreDriver implements PrimaryDataStoreDriver {
 
@@ -73,16 +73,24 @@ public class SolidfirePrimaryDataStoreDriver implements PrimaryDataStoreDriver {
     }
 
     @Override
-    public void takeSnapshot(SnapshotInfo snapshot, AsyncCompletionCallback<CommandResult> callback) {
-        // TODO Auto-generated method stub
-        
-    }
-
-    @Override
     public void revertSnapshot(SnapshotInfo snapshot, AsyncCompletionCallback<CommandResult> callback) {
         // TODO Auto-generated method stub
         
     }
 
+	@Override
+	public void resize(DataObject data,
+			AsyncCompletionCallback<CreateCmdResult> callback) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public void takeSnapshot(SnapshotInfo snapshot,
+			AsyncCompletionCallback<CreateCmdResult> callback) {
+		// TODO Auto-generated method stub
+		
+	}
+
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/ff047e75/server/src/com/cloud/api/ApiDBUtils.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/ApiDBUtils.java b/server/src/com/cloud/api/ApiDBUtils.java
index 0a20352..c28daef 100755
--- a/server/src/com/cloud/api/ApiDBUtils.java
+++ b/server/src/com/cloud/api/ApiDBUtils.java
@@ -618,7 +618,7 @@ public class ApiDBUtils {
 
     public static String getSnapshotIntervalTypes(long snapshotId) {
         SnapshotVO snapshot = _snapshotDao.findById(snapshotId);
-        return snapshot.getType().name();
+        return snapshot.getRecurringType().name();
     }
 
     public static String getStoragePoolTags(long poolId) {

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/ff047e75/server/src/com/cloud/api/ApiResponseHelper.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/ApiResponseHelper.java b/server/src/com/cloud/api/ApiResponseHelper.java
index 3da3168..845b242 100755
--- a/server/src/com/cloud/api/ApiResponseHelper.java
+++ b/server/src/com/cloud/api/ApiResponseHelper.java
@@ -341,7 +341,7 @@ public class ApiResponseHelper implements ResponseGenerator {
         populateOwner(snapshotResponse, snapshot);
 
         VolumeVO volume = findVolumeById(snapshot.getVolumeId());
-        String snapshotTypeStr = snapshot.getType().name();
+        String snapshotTypeStr = snapshot.getRecurringType().name();
         snapshotResponse.setSnapshotType(snapshotTypeStr);
         if (volume != null) {
             snapshotResponse.setVolumeId(volume.getUuid());

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/ff047e75/server/src/com/cloud/configuration/Config.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/configuration/Config.java b/server/src/com/cloud/configuration/Config.java
index c0c23b6..8c77715 100755
--- a/server/src/com/cloud/configuration/Config.java
+++ b/server/src/com/cloud/configuration/Config.java
@@ -137,7 +137,8 @@ public enum Config {
     SnapshotMonthlyMax("Snapshots", SnapshotManager.class, Integer.class, "snapshot.max.monthly", "8", "Maximum monthly snapshots for a volume", null),
     SnapshotPollInterval("Snapshots", SnapshotManager.class, Integer.class, "snapshot.poll.interval", "300", "The time interval in seconds when the management server polls for snapshots to be scheduled.", null),
     SnapshotDeltaMax("Snapshots", SnapshotManager.class, Integer.class, "snapshot.delta.max", "16", "max delta snapshots between two full snapshots.", null),
-
+    BackupSnapshotAferTakingSnapshot("Snapshots", SnapshotManager.class, Boolean.class, "snapshot.backup.rightafter", "true", "backup snapshot right after snapshot is taken", null),
+    
 	// Advanced
     JobExpireMinutes("Advanced", ManagementServer.class, String.class, "job.expire.minutes", "1440", "Time (in minutes) for async-jobs to be kept in system", null),
     JobCancelThresholdMinutes("Advanced", ManagementServer.class, String.class, "job.cancel.threshold.minutes", "60", "Time (in minutes) for async-jobs to be forcely cancelled if it has been in process for long", null),

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/ff047e75/server/src/com/cloud/storage/ResizeVolumePayload.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/storage/ResizeVolumePayload.java b/server/src/com/cloud/storage/ResizeVolumePayload.java
new file mode 100644
index 0000000..472d627
--- /dev/null
+++ b/server/src/com/cloud/storage/ResizeVolumePayload.java
@@ -0,0 +1,14 @@
+package com.cloud.storage;
+
+public class ResizeVolumePayload {
+	public final Long newSize;
+	public final boolean shrinkOk;
+	public final String instanceName;
+	public final long[] hosts;
+	public ResizeVolumePayload(Long newSize, boolean shrinkOk, String instanceName, long[] hosts) {
+		this.newSize = newSize;
+		this.shrinkOk = shrinkOk;
+		this.instanceName = instanceName;
+		this.hosts = hosts;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/ff047e75/server/src/com/cloud/storage/VolumeManager.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/storage/VolumeManager.java b/server/src/com/cloud/storage/VolumeManager.java
index ebb9e54..af3cbbf 100644
--- a/server/src/com/cloud/storage/VolumeManager.java
+++ b/server/src/com/cloud/storage/VolumeManager.java
@@ -52,9 +52,9 @@ public interface VolumeManager extends VolumeApiService {
 
     boolean volumeOnSharedStoragePool(VolumeVO volume);
 
-    boolean volumeInactive(VolumeVO volume);
+    boolean volumeInactive(Volume volume);
 
-    String getVmNameOnVolume(VolumeVO volume);
+    String getVmNameOnVolume(Volume volume);
 
     VolumeVO allocVolume(CreateVolumeCmd cmd)
             throws ResourceAllocationException;

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/ff047e75/server/src/com/cloud/storage/VolumeManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/storage/VolumeManagerImpl.java b/server/src/com/cloud/storage/VolumeManagerImpl.java
index 573b8e9..a69607f 100644
--- a/server/src/com/cloud/storage/VolumeManagerImpl.java
+++ b/server/src/com/cloud/storage/VolumeManagerImpl.java
@@ -66,12 +66,6 @@ import com.cloud.agent.AgentManager;
 import com.cloud.agent.api.Answer;
 import com.cloud.agent.api.AttachVolumeAnswer;
 import com.cloud.agent.api.AttachVolumeCommand;
-import com.cloud.agent.api.storage.CopyVolumeAnswer;
-import com.cloud.agent.api.storage.CopyVolumeCommand;
-import com.cloud.agent.api.storage.DestroyCommand;
-import com.cloud.agent.api.storage.ResizeVolumeAnswer;
-import com.cloud.agent.api.storage.ResizeVolumeCommand;
-import com.cloud.agent.api.to.StorageFilerTO;
 import com.cloud.agent.api.to.VolumeTO;
 import com.cloud.alert.AlertManager;
 import com.cloud.api.ApiDBUtils;
@@ -763,7 +757,7 @@ public class VolumeManagerImpl extends ManagerBase implements VolumeManager {
     }
 
     @Override
-    public boolean volumeInactive(VolumeVO volume) {
+    public boolean volumeInactive(Volume volume) {
         Long vmId = volume.getInstanceId();
         if (vmId != null) {
             UserVm vm = _userVmDao.findById(vmId);
@@ -779,7 +773,7 @@ public class VolumeManagerImpl extends ManagerBase implements VolumeManager {
     }
 
     @Override
-    public String getVmNameOnVolume(VolumeVO volume) {
+    public String getVmNameOnVolume(Volume volume) {
         Long vmId = volume.getInstanceId();
         if (vmId != null) {
             VMInstanceVO vm = _vmInstanceDao.findById(vmId);
@@ -1013,7 +1007,6 @@ public class VolumeManagerImpl extends ManagerBase implements VolumeManager {
     public VolumeVO resizeVolume(ResizeVolumeCmd cmd) {
         Long newSize = null;
         boolean shrinkOk = cmd.getShrinkOk();
-        boolean success = false;
         
         VolumeVO volume = _volsDao.findById(cmd.getEntityId());
         if (volume == null) {
@@ -1170,64 +1163,31 @@ public class VolumeManagerImpl extends ManagerBase implements VolumeManager {
                         "VM must be stopped or disk detached in order to resize with the Xen HV");
             }
         }
-
+        
+        ResizeVolumePayload payload = new ResizeVolumePayload(newSize, shrinkOk, instanceName, hosts);
+        
         try {
-            try {
-                stateTransitTo(volume, Volume.Event.ResizeRequested);
-            } catch (NoTransitionException etrans) {
-                throw new CloudRuntimeException(
-                        "Unable to change volume state for resize: "
-                                + etrans.toString());
-            }
-
-            ResizeVolumeCommand resizeCmd = new ResizeVolumeCommand(
-                    volume.getPath(), new StorageFilerTO(pool), currentSize,
-                    newSize, shrinkOk, instanceName);
-            ResizeVolumeAnswer answer = (ResizeVolumeAnswer) this.storageMgr.sendToPool(pool,
-                    hosts, resizeCmd);
-
-            /*
-             * need to fetch/store new volume size in database. This value comes
-             * from hypervisor rather than trusting that a success means we have
-             * a volume of the size we requested
-             */
-            if (answer != null && answer.getResult()) {
-                long finalSize = answer.getNewSize();
-                s_logger.debug("Resize: volume started at size " + currentSize
-                        + " and ended at size " + finalSize);
-                volume.setSize(finalSize);
-                if (newDiskOffering != null) {
-                    volume.setDiskOfferingId(cmd.getNewDiskOfferingId());
-                }
-                _volsDao.update(volume.getId(), volume);
-
-                success = true;
-                return volume;
-            } else if (answer != null) {
-                s_logger.debug("Resize: returned '" + answer.getDetails() + "'");
-            }
-        } catch (StorageUnavailableException e) {
-            s_logger.debug("volume failed to resize: " + e);
-            return null;
-        } finally {
-            if (success) {
-                try {
-                    stateTransitTo(volume, Volume.Event.OperationSucceeded);
-                } catch (NoTransitionException etrans) {
-                    throw new CloudRuntimeException(
-                            "Failed to change volume state: "
-                                    + etrans.toString());
-                }
-            } else {
-                try {
-                    stateTransitTo(volume, Volume.Event.OperationFailed);
-                } catch (NoTransitionException etrans) {
-                    throw new CloudRuntimeException(
-                            "Failed to change volume state: "
-                                    + etrans.toString());
-                }
-            }
-        }
+        	VolumeInfo vol = this.volFactory.getVolume(volume.getId());
+            vol.addPayload(payload);
+            
+        	AsyncCallFuture<VolumeApiResult> future = this.volService.resize(vol);
+        	future.get();
+        	volume = _volsDao.findById(volume.getId());
+
+        	if (newDiskOffering != null) {
+        		volume.setDiskOfferingId(cmd.getNewDiskOfferingId());
+        	}
+        	_volsDao.update(volume.getId(), volume);
+
+        	return volume;
+		} catch (InterruptedException e) {
+			s_logger.debug("failed get resize volume result", e);
+		} catch (ExecutionException e) {
+			s_logger.debug("failed get resize volume result", e);
+		} catch (Exception e) {
+			s_logger.debug("failed get resize volume result", e);
+		}
+       
         return null;
     }
     

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/ff047e75/server/src/com/cloud/storage/dao/SnapshotDao.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/storage/dao/SnapshotDao.java b/server/src/com/cloud/storage/dao/SnapshotDao.java
index 3b961f6..0e378a7 100644
--- a/server/src/com/cloud/storage/dao/SnapshotDao.java
+++ b/server/src/com/cloud/storage/dao/SnapshotDao.java
@@ -25,7 +25,7 @@ import com.cloud.utils.fsm.StateDao;
 
 import java.util.List;
 
-public interface SnapshotDao extends GenericDao<SnapshotVO, Long>, StateDao<Snapshot.State, Snapshot.Event, Snapshot> {
+public interface SnapshotDao extends GenericDao<SnapshotVO, Long>, StateDao<Snapshot.State, Snapshot.Event, SnapshotVO> {
 	List<SnapshotVO> listByVolumeId(long volumeId);
 	List<SnapshotVO> listByVolumeId(Filter filter, long volumeId);
 	SnapshotVO findNextSnapshot(long parentSnapId);

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/ff047e75/server/src/com/cloud/storage/dao/SnapshotDaoImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/storage/dao/SnapshotDaoImpl.java b/server/src/com/cloud/storage/dao/SnapshotDaoImpl.java
index a8a07dc..5b3f273 100644
--- a/server/src/com/cloud/storage/dao/SnapshotDaoImpl.java
+++ b/server/src/com/cloud/storage/dao/SnapshotDaoImpl.java
@@ -324,7 +324,7 @@ public class SnapshotDaoImpl extends GenericDaoBase<SnapshotVO, Long> implements
     }
 
     @Override
-    public boolean updateState(State currentState, Event event, State nextState, Snapshot snapshot, Object data) {
+    public boolean updateState(State currentState, Event event, State nextState, SnapshotVO snapshot, Object data) {
         Transaction txn = Transaction.currentTxn();
         txn.start();
         SnapshotVO snapshotVO = (SnapshotVO)snapshot;

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/ff047e75/server/src/com/cloud/storage/listener/SnapshotStateListener.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/storage/listener/SnapshotStateListener.java b/server/src/com/cloud/storage/listener/SnapshotStateListener.java
index 17ccce5..8f94f23 100644
--- a/server/src/com/cloud/storage/listener/SnapshotStateListener.java
+++ b/server/src/com/cloud/storage/listener/SnapshotStateListener.java
@@ -17,24 +17,24 @@
 
 package com.cloud.storage.listener;
 
-import com.cloud.event.EventCategory;
-import com.cloud.storage.Snapshot;
-import com.cloud.storage.Snapshot.Event;
-import com.cloud.storage.Snapshot.State;
-import com.cloud.server.ManagementServer;
-import com.cloud.utils.fsm.StateListener;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.inject.Inject;
 
 import org.apache.cloudstack.framework.events.EventBus;
 import org.apache.cloudstack.framework.events.EventBusException;
 import org.apache.log4j.Logger;
 
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.inject.Inject;
+import com.cloud.event.EventCategory;
+import com.cloud.server.ManagementServer;
+import com.cloud.storage.Snapshot;
+import com.cloud.storage.Snapshot.Event;
+import com.cloud.storage.Snapshot.State;
+import com.cloud.storage.SnapshotVO;
+import com.cloud.utils.fsm.StateListener;
 
-public class SnapshotStateListener implements StateListener<State, Event, Snapshot> {
+public class SnapshotStateListener implements StateListener<State, Event, SnapshotVO> {
 
     // get the event bus provider if configured
     @Inject protected EventBus _eventBus;
@@ -46,13 +46,13 @@ public class SnapshotStateListener implements StateListener<State, Event, Snapsh
     }
 
     @Override
-    public boolean preStateTransitionEvent(State oldState, Event event, State newState, Snapshot vo, boolean status, Object opaque) {
+    public boolean preStateTransitionEvent(State oldState, Event event, State newState, SnapshotVO vo, boolean status, Object opaque) {
         pubishOnEventBus(event.name(), "preStateTransitionEvent", vo, oldState, newState);
         return true;
     }
 
     @Override
-    public boolean postStateTransitionEvent(State oldState, Event event, State newState, Snapshot vo, boolean status, Object opaque) {
+    public boolean postStateTransitionEvent(State oldState, Event event, State newState, SnapshotVO vo, boolean status, Object opaque) {
         pubishOnEventBus(event.name(), "postStateTransitionEvent", vo, oldState, newState);
         return true;
     }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/ff047e75/server/src/com/cloud/storage/snapshot/SnapshotManager.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/storage/snapshot/SnapshotManager.java b/server/src/com/cloud/storage/snapshot/SnapshotManager.java
index 72e8163..8181330 100755
--- a/server/src/com/cloud/storage/snapshot/SnapshotManager.java
+++ b/server/src/com/cloud/storage/snapshot/SnapshotManager.java
@@ -18,13 +18,19 @@ package com.cloud.storage.snapshot;
 
 import java.util.List;
 
+import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.Command;
 import com.cloud.exception.ResourceAllocationException;
 import com.cloud.host.HostVO;
+import com.cloud.storage.Snapshot;
 import com.cloud.storage.SnapshotPolicyVO;
 import com.cloud.storage.SnapshotVO;
 import com.cloud.storage.Volume;
 import com.cloud.storage.VolumeVO;
 import com.cloud.utils.db.Filter;
+import com.cloud.utils.fsm.NoTransitionException;
 
 /**
  * 
@@ -38,66 +44,6 @@ public interface SnapshotManager {
     public static final int MONTHLYMAX = 12;
     public static final int DELTAMAX = 16;
 
-    /**
-     * After successfully creating a snapshot of a volume, copy the snapshot to the secondary storage for 1) reliability 2) So
-     * that storage space on Primary is conserved.
-     * 
-     * @param snapshot
-     *            Info about the created snapshot on primary storage.
-     * @param startEventId
-     *            event id of the scheduled event for this snapshot
-     * @return True if the snapshot was successfully backed up.
-     */
-    public boolean backupSnapshotToSecondaryStorage(SnapshotVO snapshot);
-
-    /**
-     * Once a snapshot has completed, 1) If success, update the database entries 2) If success and there are excess snapshots
-     * for any of the policies given, delete the oldest one. 3) Schedule the next recurring snapshot.
-     * 
-     * @param volumeId
-     *            The volume for which the snapshot is being taken
-     * @param snapshotId
-     *            The snapshot which has just completed
-     * @param policyIds
-     *            The list of policyIds to which this snapshot belongs to
-     * @param backedUp
-     *            If true, the snapshot has been successfully created.
-     */
-    void postCreateSnapshot(Long volumeId, Long snapshotId, Long policyId, boolean backedUp);
-
-    /**
-     * Destroys the specified snapshot from secondary storage
-     */
-    boolean destroySnapshot(long userId, long snapshotId, long policyId);
-
-    /**
-     * Deletes snapshot scheduling policy. Delete will fail if this policy is assigned to one or more volumes
-     */
-    boolean deletePolicy(long userId, Long policyId);
-
-    /**
-     * Lists all snapshots for the volume which are created using schedule of the specified policy
-     */
-    /*
-     * List<SnapshotVO> listSnapsforPolicy(long policyId, Filter filter);
-     */
-    /**
-     * List all policies which are assigned to the specified volume
-     */
-    List<SnapshotPolicyVO> listPoliciesforVolume(long volumeId);
-
-    /**
-     * List all policies to which a specified snapshot belongs. For ex: A snapshot may belong to a hourly snapshot and a daily
-     * snapshot run at the same time
-     */
-    /*
-     * List<SnapshotPolicyVO> listPoliciesforSnapshot(long snapshotId);
-     */
-    /**
-     * List all snapshots for a specified volume irrespective of the policy which created the snapshot
-     */
-    List<SnapshotVO> listSnapsforVolume(long volumeId);
-
     void deletePoliciesForVolume(Long volumeId);
 
     /**
@@ -109,35 +55,20 @@ public interface SnapshotManager {
      *            The account which is to be deleted.
      */
     boolean deleteSnapshotDirsForAccount(long accountId);
-
-    SnapshotPolicyVO getPolicyForVolume(long volumeId);
-
-    boolean destroySnapshotBackUp(long snapshotId);
-
-    /**
-     * Create a snapshot of a volume
-     * 
-     * @param cmd
-     *            the API command wrapping the parameters for creating the snapshot (mainly volumeId)
-     * @return the Snapshot that was created
-     */
-    SnapshotVO createSnapshotOnPrimary(VolumeVO volume, Long polocyId, Long snapshotId) throws ResourceAllocationException;
-
-    List<SnapshotPolicyVO> listPoliciesforSnapshot(long snapshotId);
-
-    List<SnapshotVO> listSnapsforPolicy(long policyId, Filter filter);
-
+  
     void downloadSnapshotsFromSwift(SnapshotVO ss);
 
     void downloadSnapshotsFromS3(SnapshotVO snapshot);
 
-    HostVO getSecondaryStorageHost(SnapshotVO snapshot);
-
     String getSecondaryStorageURL(SnapshotVO snapshot);
 
-    void deleteSnapshotsForVolume (String secondaryStoragePoolUrl, Long dcId, Long accountId, Long volumeId );
-
     void deleteSnapshotsDirForVolume(String secondaryStoragePoolUrl, Long dcId, Long accountId, Long volumeId);
 
 	boolean canOperateOnVolume(Volume volume);
+
+	Answer sendToPool(Volume vol, Command cmd);
+
+	SnapshotVO getParentSnapshot(VolumeInfo volume, Snapshot snapshot);
+
+	Snapshot backupSnapshot(Long snapshotId);
 }