This is an automated email from the ASF dual-hosted git repository.

rohit pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cloudstack.git


The following commit(s) were added to refs/heads/master by this push:
     new f30d716  cloudstack: fix forward merge issues (#3394)
f30d716 is described below

commit f30d716452995f86bf4fbf09136b33bdc8548480
Author: Rohit Yadav <rohit.ya...@shapeblue.com>
AuthorDate: Wed Jun 12 16:38:58 2019 +0530

    cloudstack: fix forward merge issues (#3394)
    
    - Fixes tests path from old layout to standard maven in src/test/java/
    - Removed duplicate SnapshotManagerImpl at old path `server/src/com...`
    
    Signed-off-by: Rohit Yadav <rohit.ya...@shapeblue.com>
---
 .../storage/configdrive/ConfigDriveTest.java       |    0
 .../resource/XenServerStorageProcessorTest.java    |    0
 .../cloudstack/ldap/ADLdapUserManagerImplTest.java |    0
 .../cloudstack/ldap/LdapAuthenticatorTest.java     |    0
 .../storage/snapshot/SnapshotManagerImpl.java      | 1444 --------------------
 5 files changed, 1444 deletions(-)

diff --git 
a/engine/storage/configdrive/test/org/apache/cloudstack/storage/configdrive/ConfigDriveTest.java
 
b/engine/storage/configdrive/src/test/java/org/apache/cloudstack/storage/configdrive/ConfigDriveTest.java
similarity index 100%
rename from 
engine/storage/configdrive/test/org/apache/cloudstack/storage/configdrive/ConfigDriveTest.java
rename to 
engine/storage/configdrive/src/test/java/org/apache/cloudstack/storage/configdrive/ConfigDriveTest.java
diff --git 
a/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/XenServerStorageProcessorTest.java
 
b/plugins/hypervisors/xenserver/src/test/java/com/cloud/hypervisor/xenserver/resource/XenServerStorageProcessorTest.java
similarity index 100%
rename from 
plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/XenServerStorageProcessorTest.java
rename to 
plugins/hypervisors/xenserver/src/test/java/com/cloud/hypervisor/xenserver/resource/XenServerStorageProcessorTest.java
diff --git 
a/plugins/user-authenticators/ldap/test/org/apache/cloudstack/ldap/ADLdapUserManagerImplTest.java
 
b/plugins/user-authenticators/ldap/src/test/java/org/apache/cloudstack/ldap/ADLdapUserManagerImplTest.java
similarity index 100%
rename from 
plugins/user-authenticators/ldap/test/org/apache/cloudstack/ldap/ADLdapUserManagerImplTest.java
rename to 
plugins/user-authenticators/ldap/src/test/java/org/apache/cloudstack/ldap/ADLdapUserManagerImplTest.java
diff --git 
a/plugins/user-authenticators/ldap/test/org/apache/cloudstack/ldap/LdapAuthenticatorTest.java
 
b/plugins/user-authenticators/ldap/src/test/java/org/apache/cloudstack/ldap/LdapAuthenticatorTest.java
similarity index 100%
rename from 
plugins/user-authenticators/ldap/test/org/apache/cloudstack/ldap/LdapAuthenticatorTest.java
rename to 
plugins/user-authenticators/ldap/src/test/java/org/apache/cloudstack/ldap/LdapAuthenticatorTest.java
diff --git a/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java 
b/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java
deleted file mode 100755
index 07eb072..0000000
--- a/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java
+++ /dev/null
@@ -1,1444 +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 com.cloud.storage.snapshot;
-
-import com.cloud.agent.api.Answer;
-import com.cloud.utils.db.GlobalLock;
-import com.cloud.agent.api.Command;
-import com.cloud.agent.api.DeleteSnapshotsDirCommand;
-import com.cloud.alert.AlertManager;
-import com.cloud.api.commands.ListRecurringSnapshotScheduleCmd;
-import com.cloud.api.query.MutualExclusiveIdsManagerBase;
-import com.cloud.configuration.Config;
-import com.cloud.configuration.Resource.ResourceType;
-import com.cloud.dc.ClusterVO;
-import com.cloud.dc.dao.ClusterDao;
-import com.cloud.domain.dao.DomainDao;
-import com.cloud.event.ActionEvent;
-import com.cloud.event.ActionEventUtils;
-import com.cloud.event.EventTypes;
-import com.cloud.event.EventVO;
-import com.cloud.event.UsageEventUtils;
-import com.cloud.exception.InvalidParameterValueException;
-import com.cloud.exception.PermissionDeniedException;
-import com.cloud.exception.ResourceAllocationException;
-import com.cloud.exception.StorageUnavailableException;
-import com.cloud.host.HostVO;
-import com.cloud.hypervisor.Hypervisor.HypervisorType;
-import com.cloud.projects.Project.ListProjectResourcesCriteria;
-import com.cloud.resource.ResourceManager;
-import com.cloud.server.ResourceTag.ResourceObjectType;
-import com.cloud.storage.CreateSnapshotPayload;
-import com.cloud.storage.DataStoreRole;
-import com.cloud.storage.ScopeType;
-import com.cloud.storage.Snapshot;
-import com.cloud.storage.Snapshot.Type;
-import com.cloud.storage.SnapshotPolicyVO;
-import com.cloud.storage.SnapshotScheduleVO;
-import com.cloud.storage.SnapshotVO;
-import com.cloud.storage.Storage;
-import com.cloud.storage.Storage.ImageFormat;
-import com.cloud.storage.StorageManager;
-import com.cloud.storage.StoragePool;
-import com.cloud.storage.VMTemplateVO;
-import com.cloud.storage.Volume;
-import com.cloud.storage.VolumeVO;
-import com.cloud.storage.dao.SnapshotDao;
-import com.cloud.storage.dao.SnapshotPolicyDao;
-import com.cloud.storage.dao.SnapshotScheduleDao;
-import com.cloud.storage.dao.VMTemplateDao;
-import com.cloud.storage.dao.VolumeDao;
-import com.cloud.storage.template.TemplateConstants;
-import com.cloud.tags.ResourceTagVO;
-import com.cloud.tags.dao.ResourceTagDao;
-import com.cloud.user.Account;
-import com.cloud.user.AccountManager;
-import com.cloud.user.AccountVO;
-import com.cloud.user.DomainManager;
-import com.cloud.user.ResourceLimitService;
-import com.cloud.user.User;
-import com.cloud.user.dao.AccountDao;
-import com.cloud.utils.DateUtil;
-import com.cloud.utils.DateUtil.IntervalType;
-import com.cloud.utils.NumbersUtil;
-import com.cloud.utils.Pair;
-import com.cloud.utils.Ternary;
-import com.cloud.utils.concurrency.NamedThreadFactory;
-import com.cloud.utils.db.DB;
-import com.cloud.utils.db.Filter;
-import com.cloud.utils.db.JoinBuilder;
-import com.cloud.utils.db.SearchBuilder;
-import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.exception.CloudRuntimeException;
-import com.cloud.vm.UserVmVO;
-import com.cloud.vm.VMInstanceVO;
-import com.cloud.vm.VirtualMachine;
-import com.cloud.vm.VirtualMachine.State;
-import com.cloud.vm.dao.UserVmDao;
-import com.cloud.vm.snapshot.VMSnapshot;
-import com.cloud.vm.snapshot.VMSnapshotVO;
-import com.cloud.vm.snapshot.dao.VMSnapshotDao;
-import org.apache.cloudstack.api.command.user.snapshot.CreateSnapshotPolicyCmd;
-import 
org.apache.cloudstack.api.command.user.snapshot.DeleteSnapshotPoliciesCmd;
-import org.apache.cloudstack.api.command.user.snapshot.ListSnapshotPoliciesCmd;
-import org.apache.cloudstack.api.command.user.snapshot.ListSnapshotsCmd;
-import org.apache.cloudstack.api.command.user.snapshot.UpdateSnapshotPolicyCmd;
-import org.apache.cloudstack.context.CallContext;
-import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
-import 
org.apache.cloudstack.engine.subsystem.api.storage.DataStoreCapabilities;
-import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
-import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint;
-import org.apache.cloudstack.engine.subsystem.api.storage.EndPointSelector;
-import 
org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine;
-import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotDataFactory;
-import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotInfo;
-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.StorageStrategyFactory;
-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;
-import org.apache.cloudstack.framework.config.ConfigKey;
-import org.apache.cloudstack.framework.config.Configurable;
-import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
-import org.apache.cloudstack.managed.context.ManagedContextRunnable;
-import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
-import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreDao;
-import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreVO;
-import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
-import org.apache.log4j.Logger;
-import org.springframework.stereotype.Component;
-
-import javax.inject.Inject;
-import javax.naming.ConfigurationException;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-import java.util.TimeZone;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.TimeUnit;
-
-@Component
-public class SnapshotManagerImpl extends MutualExclusiveIdsManagerBase 
implements SnapshotManager, SnapshotApiService, Configurable {
-    private static final Logger s_logger = 
Logger.getLogger(SnapshotManagerImpl.class);
-    @Inject
-    VMTemplateDao _templateDao;
-    @Inject
-    UserVmDao _vmDao;
-    @Inject
-    VolumeDao _volsDao;
-    @Inject
-    AccountDao _accountDao;
-    @Inject
-    SnapshotDao _snapshotDao;
-    @Inject
-    SnapshotDataStoreDao _snapshotStoreDao;
-    @Inject
-    PrimaryDataStoreDao _storagePoolDao;
-    @Inject
-    SnapshotPolicyDao _snapshotPolicyDao = null;
-    @Inject
-    SnapshotScheduleDao _snapshotScheduleDao;
-    @Inject
-    DomainDao _domainDao;
-    @Inject
-    StorageManager _storageMgr;
-    @Inject
-    SnapshotScheduler _snapSchedMgr;
-    @Inject
-    AccountManager _accountMgr;
-    @Inject
-    AlertManager _alertMgr;
-    @Inject
-    ClusterDao _clusterDao;
-    @Inject
-    ResourceLimitService _resourceLimitMgr;
-    @Inject
-    DomainManager _domainMgr;
-    @Inject
-    ResourceTagDao _resourceTagDao;
-    @Inject
-    ConfigurationDao _configDao;
-    @Inject
-    VMSnapshotDao _vmSnapshotDao;
-    @Inject
-    DataStoreManager dataStoreMgr;
-    @Inject
-    SnapshotService snapshotSrv;
-    @Inject
-    VolumeDataFactory volFactory;
-    @Inject
-    SnapshotDataFactory snapshotFactory;
-    @Inject
-    EndPointSelector _epSelector;
-    @Inject
-    ResourceManager _resourceMgr;
-    @Inject
-    StorageStrategyFactory _storageStrategyFactory;
-
-    private int _totalRetries;
-    private int _pauseInterval;
-    private int snapshotBackupRetries, snapshotBackupRetryInterval;
-
-    private ScheduledExecutorService backupSnapshotExecutor;
-
-    @Override
-    public String getConfigComponentName() {
-        return SnapshotManager.class.getSimpleName();
-    }
-
-    @Override
-    public ConfigKey<?>[] getConfigKeys() {
-        return new ConfigKey<?>[] {BackupRetryAttempts, BackupRetryInterval, 
SnapshotHourlyMax, SnapshotDailyMax, SnapshotMonthlyMax, SnapshotWeeklyMax, 
usageSnapshotSelection, BackupSnapshotAfterTakingSnapshot};
-    }
-
-    @Override
-    public Answer sendToPool(Volume vol, Command cmd) {
-        StoragePool pool = 
(StoragePool)dataStoreMgr.getPrimaryDataStore(vol.getPoolId());
-        long[] hostIdsToTryFirst = null;
-
-        Long vmHostId = getHostIdForSnapshotOperation(vol);
-
-        if (vmHostId != null) {
-            hostIdsToTryFirst = new long[] {vmHostId};
-        }
-
-        List<Long> hostIdsToAvoid = new ArrayList<Long>();
-        for (int retry = _totalRetries; retry >= 0; retry--) {
-            try {
-                Pair<Long, Answer> result = _storageMgr.sendToPool(pool, 
hostIdsToTryFirst, hostIdsToAvoid, cmd);
-                if (result.second().getResult()) {
-                    return result.second();
-                }
-                if (s_logger.isDebugEnabled()) {
-                    s_logger.debug("The result for " + 
cmd.getClass().getName() + " is " + result.second().getDetails() + " through " 
+ result.first());
-                }
-                hostIdsToAvoid.add(result.first());
-            } catch (StorageUnavailableException e1) {
-                s_logger.warn("Storage unavailable ", e1);
-                return null;
-            }
-
-            try {
-                Thread.sleep(_pauseInterval * 1000);
-            } catch (InterruptedException e) {
-                s_logger.debug("[ignored] interupted while retry cmd.");
-            }
-
-            s_logger.debug("Retrying...");
-        }
-
-        s_logger.warn("After " + _totalRetries + " retries, the command " + 
cmd.getClass().getName() + " did not succeed.");
-
-        return null;
-    }
-
-    @Override
-    public Long getHostIdForSnapshotOperation(Volume vol) {
-        VMInstanceVO vm = _vmDao.findById(vol.getInstanceId());
-        if (vm != null) {
-            if (vm.getHostId() != null) {
-                return vm.getHostId();
-            } else if (vm.getLastHostId() != null) {
-                return vm.getLastHostId();
-            }
-        }
-        return null;
-    }
-
-    @Override
-    public Snapshot revertSnapshot(Long snapshotId) {
-        SnapshotVO snapshot = _snapshotDao.findById(snapshotId);
-        if (snapshot == null) {
-            throw new InvalidParameterValueException("No such snapshot");
-        }
-
-        VolumeVO volume = _volsDao.findById(snapshot.getVolumeId());
-        if (volume.getState() != Volume.State.Ready) {
-            throw new InvalidParameterValueException("The volume is not in 
Ready state.");
-        }
-
-        Long instanceId = volume.getInstanceId();
-
-        // If this volume is attached to an VM, then the VM needs to be in the 
stopped state
-        // in order to revert the volume
-        if (instanceId != null) {
-            UserVmVO vm = _vmDao.findById(instanceId);
-            if (vm.getState() != State.Stopped && vm.getState() != 
State.Shutdowned) {
-                throw new InvalidParameterValueException("The VM the specified 
disk is attached to is not in the shutdown state.");
-            }
-            // If target VM has associated VM snapshots then don't allow to 
revert from snapshot
-            List<VMSnapshotVO> vmSnapshots = 
_vmSnapshotDao.findByVm(instanceId);
-            if (vmSnapshots.size() > 0) {
-                throw new InvalidParameterValueException("Unable to revert 
snapshot for VM, please remove VM snapshots before reverting VM from snapshot");
-            }
-        }
-
-        DataStoreRole dataStoreRole = getDataStoreRole(snapshot, 
_snapshotStoreDao, dataStoreMgr);
-
-        SnapshotInfo snapshotInfo = snapshotFactory.getSnapshot(snapshotId, 
dataStoreRole);
-        if (snapshotInfo == null) {
-            throw new CloudRuntimeException("snapshot:" + snapshotId + " not 
exist in data store");
-        }
-
-        SnapshotStrategy snapshotStrategy = 
_storageStrategyFactory.getSnapshotStrategy(snapshot, SnapshotOperation.REVERT);
-
-        if (snapshotStrategy == null) {
-            s_logger.error("Unable to find snaphot strategy to handle snapshot 
with id '" + snapshotId + "'");
-            return null;
-        }
-
-        boolean result = snapshotStrategy.revertSnapshot(snapshotInfo);
-        if (result) {
-            // update volume size and primary storage count
-            _resourceLimitMgr.decrementResourceCount(snapshot.getAccountId(), 
ResourceType.primary_storage, new Long(volume.getSize() - snapshot.getSize()));
-            volume.setSize(snapshot.getSize());
-            _volsDao.update(volume.getId(), volume);
-            return snapshotInfo;
-        }
-        return null;
-    }
-
-    @Override
-    @ActionEvent(eventType = EventTypes.EVENT_SNAPSHOT_POLICY_UPDATE, 
eventDescription = "updating snapshot policy", async = true)
-    public SnapshotPolicy updateSnapshotPolicy(UpdateSnapshotPolicyCmd cmd) {
-
-        Long id = cmd.getId();
-        String customUUID = cmd.getCustomId();
-        Boolean display = cmd.getDisplay();
-
-        SnapshotPolicyVO policyVO = _snapshotPolicyDao.findById(id);
-        if(display != null){
-            boolean previousDisplay = policyVO.isDisplay();
-            policyVO.setDisplay(display);
-            
_snapSchedMgr.scheduleOrCancelNextSnapshotJobOnDisplayChange(policyVO, 
previousDisplay);
-        }
-
-        if(customUUID != null)
-            policyVO.setUuid(customUUID);
-
-        _snapshotPolicyDao.update(id, policyVO);
-
-        return policyVO;
-
-    }
-
-    @Override
-    @DB
-    @ActionEvent(eventType = EventTypes.EVENT_SNAPSHOT_CREATE, 
eventDescription = "creating snapshot", async = true)
-    public Snapshot createSnapshot(Long volumeId, Long policyId, Long 
snapshotId, Account snapshotOwner) {
-        VolumeInfo volume = volFactory.getVolume(volumeId);
-        if (volume == null) {
-            throw new InvalidParameterValueException("No such volume exist");
-        }
-
-        if (volume.getState() != Volume.State.Ready) {
-            throw new InvalidParameterValueException("Volume is not in ready 
state");
-        }
-
-
-        // does the caller have the authority to act on this volume
-        _accountMgr.checkAccess(CallContext.current().getCallingAccount(), 
null, true, volume);
-
-        SnapshotInfo snapshot = snapshotFactory.getSnapshot(snapshotId, 
DataStoreRole.Primary);
-        if(snapshot == null)
-        {
-            s_logger.debug("Failed to create snapshot");
-            throw new CloudRuntimeException("Failed to create snapshot");
-        }
-        try {
-            postCreateSnapshot(volumeId, snapshot.getId(), policyId);
-            //Check if the snapshot was removed while backingUp. If yes, do 
not log snapshot create usage event
-            SnapshotVO freshSnapshot = _snapshotDao.findById(snapshot.getId());
-            if (freshSnapshot != null)  {
-                
UsageEventUtils.publishUsageEvent(EventTypes.EVENT_SNAPSHOT_CREATE, 
snapshot.getAccountId(), snapshot.getDataCenterId(), snapshotId, 
snapshot.getName(),
-                    null, null, volume.getSize(), 
snapshot.getClass().getName(), snapshot.getUuid());
-            }
-            _resourceLimitMgr.incrementResourceCount(snapshotOwner.getId(), 
ResourceType.snapshot);
-
-        } catch (Exception e) {
-            s_logger.debug("Failed to create snapshot", e);
-            throw new CloudRuntimeException("Failed to create snapshot", e);
-        }
-
-        return snapshot;
-    }
-
-    @Override
-    public Snapshot backupSnapshot(Long snapshotId) {
-        SnapshotInfo snapshot = snapshotFactory.getSnapshot(snapshotId, 
DataStoreRole.Image);
-        if (snapshot != null) {
-            throw new CloudRuntimeException("Already in the backup snapshot:" 
+ snapshotId);
-        }
-
-         return snapshotSrv.backupSnapshot(snapshot);
-    }
-
-    @Override
-    public Snapshot backupSnapshotFromVmSnapshot(Long snapshotId, Long vmId, 
Long volumeId, Long vmSnapshotId) {
-        VMInstanceVO vm = _vmDao.findById(vmId);
-        if (vm == null) {
-            throw new InvalidParameterValueException("Creating snapshot failed 
due to vm:" + vmId + " doesn't exist");
-        }
-        if (! HypervisorType.KVM.equals(vm.getHypervisorType())) {
-            throw new InvalidParameterValueException("Unsupported hypervisor 
type " + vm.getHypervisorType() + ". This supports KVM only");
-        }
-
-        VMSnapshotVO vmSnapshot = _vmSnapshotDao.findById(vmSnapshotId);
-        if (vmSnapshot == null) {
-            throw new InvalidParameterValueException("Creating snapshot failed 
due to vmSnapshot:" + vmSnapshotId + " doesn't exist");
-        }
-        // check vmsnapshot permissions
-        Account caller = CallContext.current().getCallingAccount();
-        _accountMgr.checkAccess(caller, null, true, vmSnapshot);
-
-        SnapshotVO snapshot = _snapshotDao.findById(snapshotId);
-        if (snapshot == null) {
-            throw new InvalidParameterValueException("Creating snapshot failed 
due to snapshot:" + snapshotId + " doesn't exist");
-        }
-
-        VolumeInfo volume = volFactory.getVolume(volumeId);
-        if (volume == null) {
-            throw new InvalidParameterValueException("Creating snapshot failed 
due to volume:" + volumeId + " doesn't exist");
-        }
-
-        if (volume.getState() != Volume.State.Ready) {
-            throw new InvalidParameterValueException("VolumeId: " + volumeId + 
" is not in " + Volume.State.Ready + " state but " + volume.getState() + ". 
Cannot take snapshot.");
-        }
-
-        DataStore store = volume.getDataStore();
-        SnapshotDataStoreVO parentSnapshotDataStoreVO = 
_snapshotStoreDao.findParent(store.getRole(), store.getId(), volumeId);
-        if (parentSnapshotDataStoreVO != null) {
-            //Double check the snapshot is removed or not
-            SnapshotVO parentSnap = 
_snapshotDao.findById(parentSnapshotDataStoreVO.getSnapshotId());
-            if (parentSnap != null && 
parentSnapshotDataStoreVO.getInstallPath() != null && 
parentSnapshotDataStoreVO.getInstallPath().equals(vmSnapshot.getName())) {
-                throw new InvalidParameterValueException("Creating snapshot 
failed due to snapshot : " + parentSnap.getUuid() + " is created from the same 
vm snapshot");
-            }
-        }
-        SnapshotInfo snapshotInfo = 
this.snapshotFactory.getSnapshot(snapshotId, store);
-        snapshotInfo = (SnapshotInfo) store.create(snapshotInfo);
-        SnapshotDataStoreVO snapshotOnPrimaryStore = 
this._snapshotStoreDao.findBySnapshot(snapshot.getId(), store.getRole());
-        
snapshotOnPrimaryStore.setState(ObjectInDataStoreStateMachine.State.Ready);
-        snapshotOnPrimaryStore.setInstallPath(vmSnapshot.getName());
-        _snapshotStoreDao.update(snapshotOnPrimaryStore.getId(), 
snapshotOnPrimaryStore);
-        snapshot.setState(Snapshot.State.CreatedOnPrimary);
-        _snapshotDao.update(snapshot.getId(), snapshot);
-
-        snapshotInfo = this.snapshotFactory.getSnapshot(snapshotId, store);
-
-        Long snapshotOwnerId = vm.getAccountId();
-
-        try {
-            SnapshotStrategy snapshotStrategy = 
_storageStrategyFactory.getSnapshotStrategy(snapshot, SnapshotOperation.BACKUP);
-            if (snapshotStrategy == null) {
-                throw new CloudRuntimeException("Unable to find snaphot 
strategy to handle snapshot with id '" + snapshotId + "'");
-            }
-            snapshotInfo = snapshotStrategy.backupSnapshot(snapshotInfo);
-
-        } catch(Exception e) {
-            s_logger.debug("Failed to backup snapshot from vm snapshot", e);
-            _resourceLimitMgr.decrementResourceCount(snapshotOwnerId, 
ResourceType.snapshot);
-            _resourceLimitMgr.decrementResourceCount(snapshotOwnerId, 
ResourceType.secondary_storage, new Long(volume.getSize()));
-            throw new CloudRuntimeException("Failed to backup snapshot from vm 
snapshot", e);
-        }
-        return snapshotInfo;
-    }
-
-    @Override
-    public SnapshotVO getParentSnapshot(VolumeInfo volume) {
-        long preId = _snapshotDao.getLastSnapshot(volume.getId(), 
DataStoreRole.Primary);
-
-         SnapshotVO preSnapshotVO = null;
-         if (preId != 0 && !(volume.getLastPoolId() != null && 
!volume.getLastPoolId().equals(volume.getPoolId()))) {
-             preSnapshotVO = _snapshotDao.findByIdIncludingRemoved(preId);
-         }
-
-         return preSnapshotVO;
-    }
-
-    private Long getSnapshotUserId() {
-        Long userId = CallContext.current().getCallingUserId();
-        if (userId == null) {
-            return User.UID_SYSTEM;
-        }
-        return userId;
-    }
-
-    private void postCreateSnapshot(Long volumeId, Long snapshotId, Long 
policyId) {
-        Long userId = getSnapshotUserId();
-        SnapshotVO snapshot = _snapshotDao.findById(snapshotId);
-        if (policyId != Snapshot.MANUAL_POLICY_ID) {
-            SnapshotScheduleVO snapshotSchedule = 
_snapshotScheduleDao.getCurrentSchedule(volumeId, policyId, true);
-            if (snapshotSchedule !=null) {
-                snapshotSchedule.setSnapshotId(snapshotId);
-                _snapshotScheduleDao.update(snapshotSchedule.getId(), 
snapshotSchedule);
-            }
-        }
-
-        if (snapshot != null && snapshot.isRecursive()) {
-            postCreateRecurringSnapshotForPolicy(userId, volumeId, snapshotId, 
policyId);
-        }
-    }
-
-    private void postCreateRecurringSnapshotForPolicy(long userId, long 
volumeId, long snapshotId, long policyId) {
-        // Use count query
-        SnapshotVO spstVO = _snapshotDao.findById(snapshotId);
-        Type type = spstVO.getRecurringType();
-        int maxSnaps = type.getMax();
-
-        List<SnapshotVO> snaps = listSnapsforVolumeTypeNotDestroyed(volumeId, 
type);
-        SnapshotPolicyVO policy = _snapshotPolicyDao.findById(policyId);
-        if (policy != null && policy.getMaxSnaps() < maxSnaps) {
-            maxSnaps = policy.getMaxSnaps();
-        }
-        while (snaps.size() > maxSnaps && snaps.size() > 1) {
-            SnapshotVO oldestSnapshot = snaps.get(0);
-            long oldSnapId = oldestSnapshot.getId();
-            if (policy != null) {
-            s_logger.debug("Max snaps: " + policy.getMaxSnaps() + " exceeded 
for snapshot policy with Id: " + policyId + ". Deleting oldest snapshot: " + 
oldSnapId);
-            }
-            if (deleteSnapshot(oldSnapId)) {
-                //log Snapshot delete event
-                ActionEventUtils.onCompletedActionEvent(User.UID_SYSTEM, 
oldestSnapshot.getAccountId(), EventVO.LEVEL_INFO, 
EventTypes.EVENT_SNAPSHOT_DELETE,
-                    "Successfully deleted oldest snapshot: " + oldSnapId, 0);
-            }
-            snaps.remove(oldestSnapshot);
-        }
-    }
-
-    @Override
-    @DB
-    @ActionEvent(eventType = EventTypes.EVENT_SNAPSHOT_DELETE, 
eventDescription = "deleting snapshot", async = true)
-    public boolean deleteSnapshot(long snapshotId) {
-        Account caller = CallContext.current().getCallingAccount();
-
-        // Verify parameters
-        SnapshotVO snapshotCheck = _snapshotDao.findById(snapshotId);
-
-        if (snapshotCheck == null) {
-            throw new InvalidParameterValueException("unable to find a 
snapshot with id " + snapshotId);
-        }
-
-        if (snapshotCheck.getState() == Snapshot.State.Destroyed) {
-            throw new InvalidParameterValueException("Snapshot with id: " + 
snapshotId + " is already destroyed");
-        }
-
-        _accountMgr.checkAccess(caller, null, true, snapshotCheck);
-
-        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;
-        }
-
-        DataStoreRole dataStoreRole = getDataStoreRole(snapshotCheck, 
_snapshotStoreDao, dataStoreMgr);
-
-        SnapshotDataStoreVO snapshotStoreRef = 
_snapshotStoreDao.findBySnapshot(snapshotId, dataStoreRole);
-
-        try {
-            boolean result = snapshotStrategy.deleteSnapshot(snapshotId);
-
-            if (result) {
-                if (snapshotCheck.getState() == Snapshot.State.BackedUp) {
-                    
UsageEventUtils.publishUsageEvent(EventTypes.EVENT_SNAPSHOT_DELETE, 
snapshotCheck.getAccountId(), snapshotCheck.getDataCenterId(), snapshotId,
-                        snapshotCheck.getName(), null, null, 0L, 
snapshotCheck.getClass().getName(), snapshotCheck.getUuid());
-                }
-
-                if (snapshotCheck.getState() != Snapshot.State.Error && 
snapshotCheck.getState() != Snapshot.State.Destroyed) {
-                    
_resourceLimitMgr.decrementResourceCount(snapshotCheck.getAccountId(), 
ResourceType.snapshot);
-                }
-
-                if (snapshotCheck.getState() == Snapshot.State.BackedUp) {
-                    if (snapshotStoreRef != null) {
-                        
_resourceLimitMgr.decrementResourceCount(snapshotCheck.getAccountId(), 
ResourceType.secondary_storage, new Long(snapshotStoreRef.getPhysicalSize()));
-                    }
-                }
-            }
-
-            return result;
-        } catch (Exception e) {
-            s_logger.debug("Failed to delete snapshot: " + 
snapshotCheck.getId() + ":" + e.toString());
-
-            throw new CloudRuntimeException("Failed to delete snapshot:" + 
e.toString());
-        }
-    }
-
-    @Override
-    public String getSecondaryStorageURL(SnapshotVO snapshot) {
-        SnapshotDataStoreVO snapshotStore = 
_snapshotStoreDao.findBySnapshot(snapshot.getId(), DataStoreRole.Image);
-        if (snapshotStore != null) {
-            DataStore store = 
dataStoreMgr.getDataStore(snapshotStore.getDataStoreId(), DataStoreRole.Image);
-            if (store != null) {
-                return store.getUri();
-            }
-        }
-        throw new CloudRuntimeException("Can not find secondary storage 
hosting the snapshot");
-    }
-
-    @Override
-    public Pair<List<? extends Snapshot>, Integer> 
listSnapshots(ListSnapshotsCmd cmd) {
-        Long volumeId = cmd.getVolumeId();
-        String name = cmd.getSnapshotName();
-        Long id = cmd.getId();
-        String keyword = cmd.getKeyword();
-        String snapshotTypeStr = cmd.getSnapshotType();
-        String intervalTypeStr = cmd.getIntervalType();
-        Map<String, String> tags = cmd.getTags();
-        Long zoneId = cmd.getZoneId();
-        Account caller = CallContext.current().getCallingAccount();
-        List<Long> permittedAccounts = new ArrayList<Long>();
-
-        // Verify parameters
-        if (volumeId != null) {
-            VolumeVO volume = _volsDao.findById(volumeId);
-            if (volume != null) {
-                
_accountMgr.checkAccess(CallContext.current().getCallingAccount(), null, true, 
volume);
-            }
-        }
-
-        List<Long> ids = getIdsListFromCmd(cmd.getId(), cmd.getIds());
-
-        Ternary<Long, Boolean, ListProjectResourcesCriteria> 
domainIdRecursiveListProject = new Ternary<Long, Boolean, 
ListProjectResourcesCriteria>(cmd.getDomainId(), cmd.isRecursive(), null);
-       _accountMgr.buildACLSearchParameters(caller, id, cmd.getAccountName(), 
cmd.getProjectId(), permittedAccounts, domainIdRecursiveListProject, 
cmd.listAll(), false);
-       Long domainId = domainIdRecursiveListProject.first();
-       Boolean isRecursive = domainIdRecursiveListProject.second();
-       ListProjectResourcesCriteria listProjectResourcesCriteria = 
domainIdRecursiveListProject.third();
-
-        Filter searchFilter = new Filter(SnapshotVO.class, "created", false, 
cmd.getStartIndex(), cmd.getPageSizeVal());
-        SearchBuilder<SnapshotVO> sb = _snapshotDao.createSearchBuilder();
-        _accountMgr.buildACLSearchBuilder(sb, domainId, isRecursive, 
permittedAccounts, listProjectResourcesCriteria);
-
-        sb.and("statusNEQ", sb.entity().getState(), SearchCriteria.Op.NEQ); 
//exclude those Destroyed snapshot, not showing on UI
-        sb.and("volumeId", sb.entity().getVolumeId(), SearchCriteria.Op.EQ);
-        sb.and("name", sb.entity().getName(), SearchCriteria.Op.LIKE);
-        sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ);
-        sb.and("idIN", sb.entity().getId(), SearchCriteria.Op.IN);
-        sb.and("snapshotTypeEQ", sb.entity().getsnapshotType(), 
SearchCriteria.Op.IN);
-        sb.and("snapshotTypeNEQ", sb.entity().getsnapshotType(), 
SearchCriteria.Op.NEQ);
-        sb.and("dataCenterId", sb.entity().getDataCenterId(), 
SearchCriteria.Op.EQ);
-
-        if (tags != null && !tags.isEmpty()) {
-            SearchBuilder<ResourceTagVO> tagSearch = 
_resourceTagDao.createSearchBuilder();
-            for (int count = 0; count < tags.size(); count++) {
-                tagSearch.or().op("key" + String.valueOf(count), 
tagSearch.entity().getKey(), SearchCriteria.Op.EQ);
-                tagSearch.and("value" + String.valueOf(count), 
tagSearch.entity().getValue(), SearchCriteria.Op.EQ);
-                tagSearch.cp();
-            }
-            tagSearch.and("resourceType", 
tagSearch.entity().getResourceType(), SearchCriteria.Op.EQ);
-            sb.groupBy(sb.entity().getId());
-            sb.join("tagSearch", tagSearch, sb.entity().getId(), 
tagSearch.entity().getResourceId(), JoinBuilder.JoinType.INNER);
-        }
-
-        SearchCriteria<SnapshotVO> sc = sb.create();
-        _accountMgr.buildACLSearchCriteria(sc, domainId, isRecursive, 
permittedAccounts, listProjectResourcesCriteria);
-
-        sc.setParameters("statusNEQ", Snapshot.State.Destroyed);
-
-        if (volumeId != null) {
-            sc.setParameters("volumeId", volumeId);
-        }
-
-        if (tags != null && !tags.isEmpty()) {
-            int count = 0;
-            sc.setJoinParameters("tagSearch", "resourceType", 
ResourceObjectType.Snapshot.toString());
-            for (String key : tags.keySet()) {
-                sc.setJoinParameters("tagSearch", "key" + 
String.valueOf(count), key);
-                sc.setJoinParameters("tagSearch", "value" + 
String.valueOf(count), tags.get(key));
-                count++;
-            }
-        }
-
-        if (zoneId != null) {
-            sc.setParameters("dataCenterId", zoneId);
-        }
-
-        setIdsListToSearchCriteria(sc, ids);
-
-        if (name != null) {
-            sc.setParameters("name", "%" + name + "%");
-        }
-
-        if (id != null) {
-            sc.setParameters("id", id);
-        }
-
-        if (keyword != null) {
-            SearchCriteria<SnapshotVO> ssc = 
_snapshotDao.createSearchCriteria();
-            ssc.addOr("name", SearchCriteria.Op.LIKE, "%" + keyword + "%");
-            sc.addAnd("name", SearchCriteria.Op.SC, ssc);
-        }
-
-        if (snapshotTypeStr != null) {
-            Type snapshotType = SnapshotVO.getSnapshotType(snapshotTypeStr);
-            if (snapshotType == null) {
-                throw new InvalidParameterValueException("Unsupported snapshot 
type " + snapshotTypeStr);
-            }
-            if (snapshotType == Type.RECURRING) {
-                sc.setParameters("snapshotTypeEQ", Type.HOURLY.ordinal(), 
Type.DAILY.ordinal(), Type.WEEKLY.ordinal(), Type.MONTHLY.ordinal());
-            } else {
-                sc.setParameters("snapshotTypeEQ", snapshotType.ordinal());
-            }
-        } else if (intervalTypeStr != null && volumeId != null) {
-            Type type = SnapshotVO.getSnapshotType(intervalTypeStr);
-            if (type == null) {
-                throw new InvalidParameterValueException("Unsupported snapstho 
interval type " + intervalTypeStr);
-            }
-            sc.setParameters("snapshotTypeEQ", type.ordinal());
-        } else {
-            // Show only MANUAL and RECURRING snapshot types
-            sc.setParameters("snapshotTypeNEQ", 
Snapshot.Type.TEMPLATE.ordinal());
-        }
-
-        Pair<List<SnapshotVO>, Integer> result = 
_snapshotDao.searchAndCount(sc, searchFilter);
-        return new Pair<List<? extends Snapshot>, Integer>(result.first(), 
result.second());
-    }
-
-    @Override
-    public boolean deleteSnapshotDirsForAccount(long accountId) {
-
-        List<VolumeVO> volumes = _volsDao.findByAccount(accountId);
-        // The above call will list only non-destroyed volumes.
-        // So call this method before marking the volumes as destroyed.
-        // i.e Call them before the VMs for those volumes are destroyed.
-        boolean success = true;
-        for (VolumeVO volume : volumes) {
-            if (volume.getPoolId() == null) {
-                continue;
-            }
-            Long volumeId = volume.getId();
-            Long dcId = volume.getDataCenterId();
-            if 
(_snapshotDao.listByVolumeIdIncludingRemoved(volumeId).isEmpty()) {
-                // This volume doesn't have any snapshots. Nothing do delete.
-                continue;
-            }
-            List<DataStore> ssHosts = dataStoreMgr.getImageStoresByScope(new 
ZoneScope(dcId));
-            for (DataStore ssHost : ssHosts) {
-                String snapshotDir = 
TemplateConstants.DEFAULT_SNAPSHOT_ROOT_DIR + "/" + accountId + "/" + volumeId;
-                DeleteSnapshotsDirCommand cmd = new 
DeleteSnapshotsDirCommand(ssHost.getTO(), snapshotDir);
-                EndPoint ep = _epSelector.select(ssHost);
-                Answer answer = null;
-                if (ep == null) {
-                    String errMsg = "No remote endpoint to send command, check 
if host or ssvm is down?";
-                    s_logger.error(errMsg);
-                    answer = new Answer(cmd, false, errMsg);
-                } else {
-                    answer = ep.sendMessage(cmd);
-                }
-                if ((answer != null) && answer.getResult()) {
-                    s_logger.debug("Deleted all snapshots for volume: " + 
volumeId + " under account: " + accountId);
-                } else {
-                    success = false;
-                    if (answer != null) {
-                        s_logger.warn("Failed to delete all snapshot for 
volume " + volumeId + " on secondary storage " + ssHost.getUri());
-                        s_logger.error(answer.getDetails());
-                    }
-                }
-            }
-
-            // Either way delete the snapshots for this volume.
-            List<SnapshotVO> snapshots = listSnapsforVolume(volumeId);
-            for (SnapshotVO snapshot : snapshots) {
-                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;
-                }
-                SnapshotDataStoreVO snapshotStoreRef = 
_snapshotStoreDao.findBySnapshot(snapshot.getId(), DataStoreRole.Image);
-
-                if (snapshotStrategy.deleteSnapshot(snapshot.getId())) {
-                    if (Type.MANUAL == snapshot.getRecurringType()) {
-                        _resourceLimitMgr.decrementResourceCount(accountId, 
ResourceType.snapshot);
-                        if  (snapshotStoreRef != null) {
-                            
_resourceLimitMgr.decrementResourceCount(accountId, 
ResourceType.secondary_storage, new Long(snapshotStoreRef.getPhysicalSize()));
-                        }
-                    }
-
-                    // Log event after successful deletion
-                    
UsageEventUtils.publishUsageEvent(EventTypes.EVENT_SNAPSHOT_DELETE, 
snapshot.getAccountId(), volume.getDataCenterId(), snapshot.getId(),
-                        snapshot.getName(), null, null, volume.getSize(), 
snapshot.getClass().getName(), snapshot.getUuid());
-                }
-            }
-        }
-
-        // Returns true if snapshotsDir has been deleted for all volumes.
-        return success;
-    }
-
-    @Override
-    @DB
-    @ActionEvent(eventType = EventTypes.EVENT_SNAPSHOT_POLICY_CREATE, 
eventDescription = "creating snapshot policy")
-    public SnapshotPolicyVO createPolicy(CreateSnapshotPolicyCmd cmd, Account 
policyOwner) {
-        Long volumeId = cmd.getVolumeId();
-        boolean display = cmd.isDisplay();
-        SnapshotPolicyVO policy = null;
-        VolumeVO volume = _volsDao.findById(cmd.getVolumeId());
-        if (volume == null) {
-            throw new InvalidParameterValueException("Failed to create 
snapshot policy, unable to find a volume with id " + volumeId);
-        }
-
-        _accountMgr.checkAccess(CallContext.current().getCallingAccount(), 
null, true, volume);
-
-        // If display is false we don't actually schedule snapshots.
-        if (volume.getState() != Volume.State.Ready && display) {
-            throw new InvalidParameterValueException("VolumeId: " + volumeId + 
" is not in " + Volume.State.Ready + " state but " + volume.getState() +
-                ". Cannot take snapshot.");
-        }
-
-        if (volume.getTemplateId() != null) {
-            VMTemplateVO  template = 
_templateDao.findById(volume.getTemplateId());
-            if (template != null && template.getTemplateType() == 
Storage.TemplateType.SYSTEM) {
-                throw new InvalidParameterValueException("VolumeId: " + 
volumeId + " is for System VM , Creating snapshot against System VM volumes is 
not supported");
-            }
-        }
-
-        AccountVO owner = _accountDao.findById(volume.getAccountId());
-        Long instanceId = volume.getInstanceId();
-        if (instanceId != null) {
-            // It is not detached, but attached to a VM
-            if (_vmDao.findById(instanceId) == null) {
-                // It is not a UserVM but a SystemVM or DomR
-                throw new InvalidParameterValueException("Failed to create 
snapshot policy, snapshots of volumes attached to System or router VM are not 
allowed");
-            }
-        }
-        IntervalType intvType = 
DateUtil.IntervalType.getIntervalType(cmd.getIntervalType());
-        if (intvType == null) {
-            throw new InvalidParameterValueException("Unsupported interval 
type " + cmd.getIntervalType());
-        }
-        Type type = getSnapshotType(intvType);
-
-        TimeZone timeZone = TimeZone.getTimeZone(cmd.getTimezone());
-        String timezoneId = timeZone.getID();
-        if (!timezoneId.equals(cmd.getTimezone())) {
-            s_logger.warn("Using timezone: " + timezoneId + " for running this 
snapshot policy as an equivalent of " + cmd.getTimezone());
-        }
-        try {
-            DateUtil.getNextRunTime(intvType, cmd.getSchedule(), timezoneId, 
null);
-        } catch (Exception e) {
-            throw new InvalidParameterValueException("Invalid schedule: " + 
cmd.getSchedule() + " for interval type: " + cmd.getIntervalType());
-        }
-
-        if (cmd.getMaxSnaps() <= 0) {
-            throw new InvalidParameterValueException("maxSnaps should be 
greater than 0");
-        }
-
-        int intervalMaxSnaps = type.getMax();
-        if (cmd.getMaxSnaps() > intervalMaxSnaps) {
-            throw new InvalidParameterValueException("maxSnaps exceeds limit: 
" + intervalMaxSnaps + " for interval type: " + cmd.getIntervalType());
-        }
-
-        // Verify that max doesn't exceed domain and account snapshot limits 
in case display is on
-        if(display){
-            long accountLimit = 
_resourceLimitMgr.findCorrectResourceLimitForAccount(owner, 
ResourceType.snapshot);
-            long domainLimit = 
_resourceLimitMgr.findCorrectResourceLimitForDomain(_domainMgr.getDomain(owner.getDomainId()),
 ResourceType.snapshot);
-            int max = cmd.getMaxSnaps().intValue();
-            if (!_accountMgr.isRootAdmin(owner.getId())&& ((accountLimit != -1 
&& max > accountLimit) || (domainLimit != -1 && max > domainLimit))) {
-                String message = "domain/account";
-                if (owner.getType() == Account.ACCOUNT_TYPE_PROJECT) {
-                    message = "domain/project";
-                }
-
-                throw new InvalidParameterValueException("Max number of 
snapshots shouldn't exceed the " + message + " level snapshot limit");
-            }
-        }
-
-        final GlobalLock createSnapshotPolicyLock = 
GlobalLock.getInternLock("createSnapshotPolicy_" + volumeId);
-        boolean isLockAcquired = createSnapshotPolicyLock.lock(5);
-        if (isLockAcquired) {
-            s_logger.debug("Acquired lock for creating snapshot policy of 
volume : " + volume.getName());
-            try {
-                policy = _snapshotPolicyDao.findOneByVolumeInterval(volumeId, 
intvType);
-                if (policy == null) {
-                    policy = new SnapshotPolicyVO(volumeId, cmd.getSchedule(), 
timezoneId, intvType, cmd.getMaxSnaps(), display);
-                    policy = _snapshotPolicyDao.persist(policy);
-                    _snapSchedMgr.scheduleNextSnapshotJob(policy);
-                } else {
-                    boolean previousDisplay = policy.isDisplay();
-                    policy.setSchedule(cmd.getSchedule());
-                    policy.setTimezone(timezoneId);
-                    policy.setInterval((short)intvType.ordinal());
-                    policy.setMaxSnaps(cmd.getMaxSnaps());
-                    policy.setActive(true);
-                    policy.setDisplay(display);
-                    _snapshotPolicyDao.update(policy.getId(), policy);
-                    
_snapSchedMgr.scheduleOrCancelNextSnapshotJobOnDisplayChange(policy, 
previousDisplay);
-                }
-            } finally {
-                createSnapshotPolicyLock.unlock();
-            }
-
-            // TODO - Make createSnapshotPolicy - BaseAsyncCreate and remove 
this.
-            CallContext.current().putContextParameter(SnapshotPolicy.class, 
policy.getUuid());
-            return policy;
-        } else {
-            s_logger.warn("Unable to acquire lock for creating snapshot policy 
of volume : " + volume.getName());
-            return null;
-        }
-    }
-
-    protected boolean deletePolicy(long userId, Long policyId) {
-        SnapshotPolicyVO snapshotPolicy = 
_snapshotPolicyDao.findById(policyId);
-        _snapSchedMgr.removeSchedule(snapshotPolicy.getVolumeId(), 
snapshotPolicy.getId());
-        return _snapshotPolicyDao.remove(policyId);
-    }
-
-    @Override
-    public Pair<List<? extends SnapshotPolicy>, Integer> 
listPoliciesforVolume(ListSnapshotPoliciesCmd cmd) {
-        Long volumeId = cmd.getVolumeId();
-        boolean display = cmd.isDisplay();
-        Long id = cmd.getId();
-        Pair<List<SnapshotPolicyVO>, Integer> result = null;
-        // TODO - Have a better way of doing this.
-        if(id != null){
-            result = _snapshotPolicyDao.listAndCountById(id, display, null);
-            if(result != null && result.first() != null && 
!result.first().isEmpty()){
-                SnapshotPolicyVO snapshotPolicy = result.first().get(0);
-                volumeId = snapshotPolicy.getVolumeId();
-            }
-        }
-        VolumeVO volume = _volsDao.findById(volumeId);
-        if (volume == null) {
-            throw new InvalidParameterValueException("Unable to find a volume 
with id " + volumeId);
-        }
-        _accountMgr.checkAccess(CallContext.current().getCallingAccount(), 
null, true, volume);
-        if(result != null)
-            return new Pair<List<? extends SnapshotPolicy>, 
Integer>(result.first(), result.second());
-        result = _snapshotPolicyDao.listAndCountByVolumeId(volumeId, display);
-        return new Pair<List<? extends SnapshotPolicy>, 
Integer>(result.first(), result.second());
-    }
-
-    private List<SnapshotPolicyVO> listPoliciesforVolume(long volumeId) {
-        return _snapshotPolicyDao.listByVolumeId(volumeId);
-    }
-
-    private List<SnapshotVO> listSnapsforVolume(long volumeId) {
-        return _snapshotDao.listByVolumeId(volumeId);
-    }
-
-    private List<SnapshotVO> listSnapsforVolumeTypeNotDestroyed(long volumeId, 
Type type) {
-        return _snapshotDao.listByVolumeIdTypeNotDestroyed(volumeId, type);
-    }
-
-    @Override
-    public void deletePoliciesForVolume(Long volumeId) {
-        List<SnapshotPolicyVO> policyInstances = 
listPoliciesforVolume(volumeId);
-        for (SnapshotPolicyVO policyInstance : policyInstances) {
-            Long policyId = policyInstance.getId();
-            deletePolicy(1L, policyId);
-        }
-        // We also want to delete the manual snapshots scheduled for this 
volume
-        // We can only delete the schedules in the future, not the ones which 
are already executing.
-        SnapshotScheduleVO snapshotSchedule = 
_snapshotScheduleDao.getCurrentSchedule(volumeId, Snapshot.MANUAL_POLICY_ID, 
false);
-        if (snapshotSchedule != null) {
-            _snapshotScheduleDao.expunge(snapshotSchedule.getId());
-        }
-    }
-
-    @Override
-    public List<SnapshotScheduleVO> 
findRecurringSnapshotSchedule(ListRecurringSnapshotScheduleCmd cmd) {
-        Long volumeId = cmd.getVolumeId();
-        Long policyId = cmd.getSnapshotPolicyId();
-        Account account = CallContext.current().getCallingAccount();
-
-        // Verify parameters
-        VolumeVO volume = _volsDao.findById(volumeId);
-        if (volume == null) {
-            throw new InvalidParameterValueException("Failed to list snapshot 
schedule, unable to find a volume with id " + volumeId);
-        }
-
-        if (account != null) {
-            long volAcctId = volume.getAccountId();
-            if (_accountMgr.isAdmin(account.getId())) {
-                Account userAccount = 
_accountDao.findById(Long.valueOf(volAcctId));
-                if (!_domainDao.isChildDomain(account.getDomainId(), 
userAccount.getDomainId())) {
-                    throw new PermissionDeniedException("Unable to list 
snapshot schedule for volume " + volumeId + ", permission denied.");
-                }
-            } else if (account.getId() != volAcctId) {
-                throw new PermissionDeniedException("Unable to list snapshot 
schedule, account " + account.getAccountName() + " does not own volume id " + 
volAcctId);
-            }
-        }
-
-        // List only future schedules, not past ones.
-        List<SnapshotScheduleVO> snapshotSchedules = new 
ArrayList<SnapshotScheduleVO>();
-        if (policyId == null) {
-            List<SnapshotPolicyVO> policyInstances = 
listPoliciesforVolume(volumeId);
-            for (SnapshotPolicyVO policyInstance : policyInstances) {
-                SnapshotScheduleVO snapshotSchedule = 
_snapshotScheduleDao.getCurrentSchedule(volumeId, policyInstance.getId(), 
false);
-                snapshotSchedules.add(snapshotSchedule);
-            }
-        } else {
-            
snapshotSchedules.add(_snapshotScheduleDao.getCurrentSchedule(volumeId, 
policyId, false));
-        }
-        return snapshotSchedules;
-    }
-
-    private Type getSnapshotType(Long policyId) {
-        if (policyId.equals(Snapshot.MANUAL_POLICY_ID)) {
-            return Type.MANUAL;
-        } else {
-            SnapshotPolicyVO spstPolicyVO = 
_snapshotPolicyDao.findById(policyId);
-            IntervalType intvType = 
DateUtil.getIntervalType(spstPolicyVO.getInterval());
-            return getSnapshotType(intvType);
-        }
-    }
-
-    private Type getSnapshotType(IntervalType intvType) {
-        if (intvType.equals(IntervalType.HOURLY)) {
-            return Type.HOURLY;
-        } else if (intvType.equals(IntervalType.DAILY)) {
-            return Type.DAILY;
-        } else if (intvType.equals(IntervalType.WEEKLY)) {
-            return Type.WEEKLY;
-        } else if (intvType.equals(IntervalType.MONTHLY)) {
-            return Type.MONTHLY;
-        }
-        return null;
-    }
-
-    private boolean hostSupportSnapsthotForVolume(HostVO host, VolumeInfo 
volume) {
-        if (host.getHypervisorType() != HypervisorType.KVM) {
-            return true;
-        }
-
-        //Turn off snapshot by default for KVM if the volume attached to vm 
that is not in the Stopped/Destroyed state,
-        //unless it is set in the global flag
-        Long vmId = volume.getInstanceId();
-        if (vmId != null) {
-            VMInstanceVO vm = _vmDao.findById(vmId);
-            if (vm.getState() != VirtualMachine.State.Stopped && vm.getState() 
!= VirtualMachine.State.Destroyed) {
-                boolean snapshotEnabled = 
Boolean.parseBoolean(_configDao.getValue("kvm.snapshot.enabled"));
-                if (!snapshotEnabled) {
-                    s_logger.debug("Snapshot is not supported on host " + host 
+ " for the volume " + volume + " attached to the vm " + vm);
-                    return false;
-                }
-            }
-        }
-
-        // Determine host capabilities
-        String caps = host.getCapabilities();
-
-        if (caps != null) {
-            String[] tokens = caps.split(",");
-            for (String token : tokens) {
-                if (token.contains("snapshot")) {
-                    return true;
-                }
-            }
-        }
-        return false;
-    }
-
-    private boolean supportedByHypervisor(VolumeInfo volume) {
-        HypervisorType hypervisorType;
-        StoragePoolVO storagePool = 
_storagePoolDao.findById(volume.getDataStore().getId());
-        ScopeType scope = storagePool.getScope();
-        if (scope.equals(ScopeType.ZONE)) {
-            hypervisorType = storagePool.getHypervisor();
-        } else {
-            hypervisorType = volume.getHypervisorType();
-        }
-
-        if (hypervisorType.equals(HypervisorType.Ovm)) {
-            throw new InvalidParameterValueException("Ovm won't support taking 
snapshot");
-        }
-
-        if (hypervisorType.equals(HypervisorType.KVM)) {
-            List<HostVO> hosts = null;
-            if (scope.equals(ScopeType.CLUSTER)) {
-                ClusterVO cluster = 
_clusterDao.findById(storagePool.getClusterId());
-                hosts = _resourceMgr.listAllHostsInCluster(cluster.getId());
-            } else if (scope.equals(ScopeType.ZONE)) {
-                hosts = 
_resourceMgr.listAllUpAndEnabledHostsInOneZoneByHypervisor(hypervisorType, 
volume.getDataCenterId());
-            }
-            if (hosts != null && !hosts.isEmpty()) {
-                HostVO host = hosts.get(0);
-                if (!hostSupportSnapsthotForVolume(host, volume)) {
-                    throw new CloudRuntimeException("KVM Snapshot is not 
supported: " + host.getId());
-                }
-            }
-        }
-
-        // if volume is attached to a vm in destroyed or expunging state; 
disallow
-        if (volume.getInstanceId() != null) {
-            UserVmVO userVm = _vmDao.findById(volume.getInstanceId());
-            if (userVm != null) {
-                if (userVm.getState().equals(State.Destroyed) || 
userVm.getState().equals(State.Expunging)) {
-                    throw new CloudRuntimeException("Creating snapshot failed 
due to volume:" + volume.getId() + " is associated with vm:" + 
userVm.getInstanceName() +
-                        " is in " + userVm.getState().toString() + " state");
-                }
-
-                if (userVm.getHypervisorType() == HypervisorType.VMware || 
userVm.getHypervisorType() == HypervisorType.KVM) {
-                    List<SnapshotVO> activeSnapshots =
-                        _snapshotDao.listByInstanceId(volume.getInstanceId(), 
Snapshot.State.Creating, Snapshot.State.CreatedOnPrimary, 
Snapshot.State.BackingUp);
-                    if (activeSnapshots.size() > 0) {
-                        throw new InvalidParameterValueException("There is 
other active snapshot tasks on the instance to which the volume is attached, 
please try again later");
-                    }
-                }
-
-                List<VMSnapshotVO> activeVMSnapshots =
-                    _vmSnapshotDao.listByInstanceId(userVm.getId(), 
VMSnapshot.State.Creating, VMSnapshot.State.Reverting, 
VMSnapshot.State.Expunging);
-                if (activeVMSnapshots.size() > 0) {
-                    throw new CloudRuntimeException("There is other active vm 
snapshot tasks on the instance to which the volume is attached, please try 
again later");
-                }
-            }
-        }
-
-        return true;
-    }
-
-    @Override
-    @DB
-    public SnapshotInfo takeSnapshot(VolumeInfo volume) throws 
ResourceAllocationException {
-        CreateSnapshotPayload payload = 
(CreateSnapshotPayload)volume.getpayload();
-
-        updateSnapshotPayload(volume.getPoolId(), payload);
-
-        Long snapshotId = payload.getSnapshotId();
-        Account snapshotOwner = payload.getAccount();
-        SnapshotInfo snapshot = snapshotFactory.getSnapshot(snapshotId, 
volume.getDataStore());
-        snapshot.addPayload(payload);
-        try {
-            SnapshotStrategy snapshotStrategy = 
_storageStrategyFactory.getSnapshotStrategy(snapshot, SnapshotOperation.TAKE);
-
-            if (snapshotStrategy == null) {
-                throw new CloudRuntimeException("Can't find snapshot strategy 
to deal with snapshot:" + snapshotId);
-            }
-
-            SnapshotInfo snapshotOnPrimary = 
snapshotStrategy.takeSnapshot(snapshot);
-            boolean backupSnapToSecondary = 
BackupSnapshotAfterTakingSnapshot.value() == null ||
-                    BackupSnapshotAfterTakingSnapshot.value();
-
-            if (backupSnapToSecondary) {
-                backupSnapshotToSecondary(payload.getAsyncBackup(), 
snapshotStrategy, snapshotOnPrimary);
-            } else {
-                if(s_logger.isDebugEnabled()) {
-                    s_logger.debug("skipping backup of snapshot " + snapshotId 
+ " to secondary due to configuration");
-                }
-                snapshotOnPrimary.markBackedUp();
-            }
-
-            try {
-                postCreateSnapshot(volume.getId(), snapshotId, 
payload.getSnapshotPolicyId());
-
-                DataStoreRole dataStoreRole = getDataStoreRole(snapshot, 
_snapshotStoreDao, dataStoreMgr);
-
-                SnapshotDataStoreVO snapshotStoreRef = 
_snapshotStoreDao.findBySnapshot(snapshotId, dataStoreRole);
-                if(snapshotStoreRef == null) {
-                    // The snapshot was not backed up to secondary.  Find the 
snap on primary
-                    snapshotStoreRef = 
_snapshotStoreDao.findBySnapshot(snapshotId, DataStoreRole.Primary);
-                    if(snapshotStoreRef == null) {
-                        throw new CloudRuntimeException("Could not find 
snapshot");
-                    }
-                }
-                
UsageEventUtils.publishUsageEvent(EventTypes.EVENT_SNAPSHOT_CREATE, 
snapshot.getAccountId(), snapshot.getDataCenterId(), snapshotId, 
snapshot.getName(),
-                    null, null, snapshotStoreRef.getPhysicalSize(), 
volume.getSize(), snapshot.getClass().getName(), snapshot.getUuid());
-
-                // Correct the resource count of snapshot in case of delta 
snapshots.
-                
_resourceLimitMgr.decrementResourceCount(snapshotOwner.getId(), 
ResourceType.secondary_storage, new Long(volume.getSize() - 
snapshotStoreRef.getPhysicalSize()));
-            } catch (Exception e) {
-                s_logger.debug("post process snapshot failed", e);
-            }
-        } catch (CloudRuntimeException cre) {
-            if(s_logger.isDebugEnabled()) {
-                s_logger.debug("Failed to create snapshot" + 
cre.getLocalizedMessage());
-            }
-            _resourceLimitMgr.decrementResourceCount(snapshotOwner.getId(), 
ResourceType.snapshot);
-            _resourceLimitMgr.decrementResourceCount(snapshotOwner.getId(), 
ResourceType.secondary_storage, new Long(volume.getSize()));
-            throw cre;
-        } catch (Exception e) {
-            if(s_logger.isDebugEnabled()) {
-                s_logger.debug("Failed to create snapshot", e);
-            }
-            _resourceLimitMgr.decrementResourceCount(snapshotOwner.getId(), 
ResourceType.snapshot);
-            _resourceLimitMgr.decrementResourceCount(snapshotOwner.getId(), 
ResourceType.secondary_storage, new Long(volume.getSize()));
-            throw new CloudRuntimeException("Failed to create snapshot", e);
-        }
-        return snapshot;
-    }
-
-    protected void backupSnapshotToSecondary(boolean asyncBackup, 
SnapshotStrategy snapshotStrategy, SnapshotInfo snapshotOnPrimary) {
-        if (asyncBackup) {
-            backupSnapshotExecutor.schedule(new 
BackupSnapshotTask(snapshotOnPrimary, snapshotBackupRetries - 1, 
snapshotStrategy), 0, TimeUnit.SECONDS);
-        } else {
-            SnapshotInfo backupedSnapshot = 
snapshotStrategy.backupSnapshot(snapshotOnPrimary);
-            if (backupedSnapshot != null) {
-                snapshotStrategy.postSnapshotCreation(snapshotOnPrimary);
-            }
-        }
-    }
-
-    protected class BackupSnapshotTask extends ManagedContextRunnable {
-        SnapshotInfo snapshot;
-        int attempts;
-        SnapshotStrategy snapshotStrategy;
-
-        public BackupSnapshotTask(SnapshotInfo snap, int maxRetries, 
SnapshotStrategy strategy) {
-            snapshot = snap;
-            attempts = maxRetries;
-            snapshotStrategy = strategy;
-        }
-
-        @Override
-        protected void runInContext() {
-            try {
-                s_logger.debug("Value of attempts is " + 
(snapshotBackupRetries-attempts));
-
-                SnapshotInfo backupedSnapshot = 
snapshotStrategy.backupSnapshot(snapshot);
-
-                if (backupedSnapshot != null) {
-                    snapshotStrategy.postSnapshotCreation(snapshot);
-                }
-            } catch (final Exception e) {
-                if (attempts >= 0) {
-                    s_logger.debug("Backing up of snapshot failed, for 
snapshot with ID "+snapshot.getSnapshotId()+", left with "+attempts+" more 
attempts");
-                    backupSnapshotExecutor.schedule(new 
BackupSnapshotTask(snapshot, --attempts, snapshotStrategy), 
snapshotBackupRetryInterval, TimeUnit.SECONDS);
-                } else {
-                    s_logger.debug("Done with "+snapshotBackupRetries+" 
attempts in  backing up of snapshot with ID "+snapshot.getSnapshotId());
-                    snapshotSrv.cleanupOnSnapshotBackupFailure(snapshot);
-                }
-            }
-        }
-    }
-
-    private void updateSnapshotPayload(long storagePoolId, 
CreateSnapshotPayload payload) {
-        StoragePoolVO storagePoolVO = _storagePoolDao.findById(storagePoolId);
-
-        if (storagePoolVO.isManaged()) {
-            Snapshot.LocationType locationType = payload.getLocationType();
-
-            if (locationType == null) {
-                payload.setLocationType(Snapshot.LocationType.PRIMARY);
-            }
-        }
-        else {
-            payload.setLocationType(null);
-        }
-    }
-
-    private static DataStoreRole getDataStoreRole(Snapshot snapshot, 
SnapshotDataStoreDao snapshotStoreDao, DataStoreManager dataStoreMgr) {
-        SnapshotDataStoreVO snapshotStore = 
snapshotStoreDao.findBySnapshot(snapshot.getId(), DataStoreRole.Primary);
-
-        if (snapshotStore == null) {
-            return DataStoreRole.Image;
-        }
-
-        long storagePoolId = snapshotStore.getDataStoreId();
-        DataStore dataStore = dataStoreMgr.getDataStore(storagePoolId, 
DataStoreRole.Primary);
-
-        Map<String, String> mapCapabilities = 
dataStore.getDriver().getCapabilities();
-
-        if (mapCapabilities != null) {
-            String value = 
mapCapabilities.get(DataStoreCapabilities.STORAGE_SYSTEM_SNAPSHOT.toString());
-            Boolean supportsStorageSystemSnapshots = new Boolean(value);
-
-            if (supportsStorageSystemSnapshots) {
-                return DataStoreRole.Primary;
-            }
-        }
-
-        return DataStoreRole.Image;
-    }
-
-    @Override
-    public boolean configure(String name, Map<String, Object> params) throws 
ConfigurationException {
-
-        String value = 
_configDao.getValue(Config.BackupSnapshotWait.toString());
-
-        Type.HOURLY.setMax(SnapshotHourlyMax.value());
-        Type.DAILY.setMax(SnapshotDailyMax.value());
-        Type.WEEKLY.setMax(SnapshotWeeklyMax.value());
-        Type.MONTHLY.setMax(SnapshotMonthlyMax.value());
-        _totalRetries = 
NumbersUtil.parseInt(_configDao.getValue("total.retries"), 4);
-        _pauseInterval = 2 * 
NumbersUtil.parseInt(_configDao.getValue("ping.interval"), 60);
-
-        snapshotBackupRetries = BackupRetryAttempts.value();
-        snapshotBackupRetryInterval = BackupRetryInterval.value();
-        backupSnapshotExecutor = Executors.newScheduledThreadPool(10, new 
NamedThreadFactory("BackupSnapshotTask"));
-        s_logger.info("Snapshot Manager is configured.");
-
-        return true;
-    }
-
-    @Override
-    public boolean start() {
-        //destroy snapshots in destroying state
-        List<SnapshotVO> snapshots = 
_snapshotDao.listAllByStatus(Snapshot.State.Destroying);
-        for (SnapshotVO snapshotVO : snapshots) {
-            try {
-                if (!deleteSnapshot(snapshotVO.getId())) {
-                    s_logger.debug("Failed to delete snapshot in destroying 
state with id " + snapshotVO.getUuid());
-                }
-            } catch (Exception e) {
-                s_logger.debug("Failed to delete snapshot in destroying state 
with id " + snapshotVO.getUuid());
-            }
-        }
-        return true;
-    }
-
-    @Override
-    public boolean stop() {
-        backupSnapshotExecutor.shutdown();
-        return true;
-    }
-
-    @Override
-    public boolean deleteSnapshotPolicies(DeleteSnapshotPoliciesCmd cmd) {
-        Long policyId = cmd.getId();
-        List<Long> policyIds = cmd.getIds();
-        Long userId = getSnapshotUserId();
-
-        if ((policyId == null) && (policyIds == null)) {
-            throw new InvalidParameterValueException("No policy id (or list of 
ids) specified.");
-        }
-
-        if (policyIds == null) {
-            policyIds = new ArrayList<Long>();
-            policyIds.add(policyId);
-        } else if (policyIds.size() <= 0) {
-            // Not even sure how this is even possible
-            throw new InvalidParameterValueException("There are no policy 
ids");
-        }
-
-        for (Long policy : policyIds) {
-            SnapshotPolicyVO snapshotPolicyVO = 
_snapshotPolicyDao.findById(policy);
-            if (snapshotPolicyVO == null) {
-                throw new InvalidParameterValueException("Policy id given: " + 
policy + " does not exist");
-            }
-            VolumeVO volume = 
_volsDao.findById(snapshotPolicyVO.getVolumeId());
-            if (volume == null) {
-                throw new InvalidParameterValueException("Policy id given: " + 
policy + " does not belong to a valid volume");
-            }
-
-            _accountMgr.checkAccess(CallContext.current().getCallingAccount(), 
null, true, volume);
-        }
-
-        boolean success = true;
-
-        if (policyIds.contains(Snapshot.MANUAL_POLICY_ID)) {
-            throw new InvalidParameterValueException("Invalid Policy id given: 
" + Snapshot.MANUAL_POLICY_ID);
-        }
-
-        for (Long pId : policyIds) {
-            if (!deletePolicy(userId, pId)) {
-                success = false;
-                s_logger.warn("Failed to delete snapshot policy with Id: " + 
policyId);
-                return success;
-            }
-        }
-
-        return success;
-    }
-
-    @Override
-    public boolean canOperateOnVolume(Volume volume) {
-        List<SnapshotVO> snapshots = _snapshotDao.listByStatus(volume.getId(), 
Snapshot.State.Creating, Snapshot.State.CreatedOnPrimary, 
Snapshot.State.BackingUp);
-        if (snapshots.size() > 0) {
-            return false;
-        }
-        return true;
-    }
-
-    @Override
-    public void cleanupSnapshotsByVolume(Long volumeId) {
-        List<SnapshotInfo> infos = snapshotFactory.getSnapshots(volumeId, 
DataStoreRole.Primary);
-        for(SnapshotInfo info: infos) {
-            try {
-               if(info != null) {
-                   snapshotSrv.deleteSnapshot(info);
-               }
-            } catch(CloudRuntimeException e) {
-                String msg = "Cleanup of Snapshot with uuid " + info.getUuid() 
+ " in primary storage is failed. Ignoring";
-                s_logger.warn(msg);
-            }
-        }
-    }
-
-    @Override
-    public Snapshot allocSnapshot(Long volumeId, Long policyId, String 
snapshotName, Snapshot.LocationType locationType) throws 
ResourceAllocationException {
-        Account caller = CallContext.current().getCallingAccount();
-        VolumeInfo volume = volFactory.getVolume(volumeId);
-        supportedByHypervisor(volume);
-
-        // Verify permissions
-        _accountMgr.checkAccess(caller, null, true, volume);
-        Type snapshotType = getSnapshotType(policyId);
-        Account owner = _accountMgr.getAccount(volume.getAccountId());
-
-        try {
-            _resourceLimitMgr.checkResourceLimit(owner, ResourceType.snapshot);
-                _resourceLimitMgr.checkResourceLimit(owner, 
ResourceType.secondary_storage, new Long(volume.getSize()).longValue());
-        } catch (ResourceAllocationException e) {
-            if (snapshotType != Type.MANUAL) {
-                String msg = "Snapshot resource limit exceeded for account id 
: " + owner.getId() + ". Failed to create recurring snapshots";
-                s_logger.warn(msg);
-                
_alertMgr.sendAlert(AlertManager.AlertType.ALERT_TYPE_UPDATE_RESOURCE_COUNT, 
0L, 0L, msg,
-                    "Snapshot resource limit exceeded for account id : " + 
owner.getId() +
-                        ". Failed to create recurring snapshots; please use 
updateResourceLimit to increase the limit");
-            }
-            throw e;
-        }
-
-        // Determine the name for this snapshot
-        // Snapshot Name: VMInstancename + volumeName + timeString
-        String timeString = 
DateUtil.getDateDisplayString(DateUtil.GMT_TIMEZONE, new Date(), 
DateUtil.YYYYMMDD_FORMAT);
-
-        VMInstanceVO vmInstance = _vmDao.findById(volume.getInstanceId());
-        String vmDisplayName = "detached";
-        if (vmInstance != null) {
-            vmDisplayName = vmInstance.getHostName();
-        }
-        if (snapshotName == null)
-            snapshotName = vmDisplayName + "_" + volume.getName() + "_" + 
timeString;
-
-        HypervisorType hypervisorType = HypervisorType.None;
-        StoragePoolVO storagePool = 
_storagePoolDao.findById(volume.getDataStore().getId());
-        if (storagePool.getScope() == ScopeType.ZONE) {
-            hypervisorType = storagePool.getHypervisor();
-
-            // at the time being, managed storage only supports XenServer, 
ESX(i), and KVM (i.e. not Hyper-V), so the VHD file type can be mapped to 
XenServer
-            if (storagePool.isManaged() && 
HypervisorType.Any.equals(hypervisorType)) {
-                if (ImageFormat.VHD.equals(volume.getFormat())) {
-                    hypervisorType = HypervisorType.XenServer;
-                }
-                else if (ImageFormat.OVA.equals(volume.getFormat())) {
-                    hypervisorType = HypervisorType.VMware;
-                }
-                else if (ImageFormat.QCOW2.equals(volume.getFormat())) {
-                    hypervisorType = HypervisorType.KVM;
-                }
-            }
-        } else {
-            hypervisorType = volume.getHypervisorType();
-        }
-
-        SnapshotVO snapshotVO =
-            new SnapshotVO(volume.getDataCenterId(), volume.getAccountId(), 
volume.getDomainId(), volume.getId(), volume.getDiskOfferingId(), snapshotName,
-                (short)snapshotType.ordinal(), snapshotType.name(), 
volume.getSize(), volume.getMinIops(), volume.getMaxIops(), hypervisorType, 
locationType);
-
-        SnapshotVO snapshot = _snapshotDao.persist(snapshotVO);
-        if (snapshot == null) {
-            throw new CloudRuntimeException("Failed to create snapshot for 
volume: " + volume.getId());
-        }
-        _resourceLimitMgr.incrementResourceCount(volume.getAccountId(), 
ResourceType.snapshot);
-        _resourceLimitMgr.incrementResourceCount(volume.getAccountId(), 
ResourceType.secondary_storage, new Long(volume.getSize()));
-        return snapshot;
-    }
-}

Reply via email to