@Override
public void copyAsync(DataObject srcData, DataObject destData, Host destHost, AsyncCompletionCallback<CopyCommandResult> callback) {
if (srcData.getDataStore() == null || destData.getDataStore() == null) {
throw new CloudRuntimeException("can't find data store");
}
if (srcData.getDataStore().getDriver().canCopy(srcData, destData)) {
srcData.getDataStore().getDriver().copyAsync(srcData, destData, callback);
return;
} else if (destData.getDataStore().getDriver().canCopy(srcData, destData)) {
destData.getDataStore().getDriver().copyAsync(srcData, destData, callback);
return;
}
DataMotionStrategy strategy = storageStrategyFactory.getDataMotionStrategy(srcData, destData);
if (strategy == null) {
cleanUpVolumesForFailedMigrations(srcData, destData);
throw new CloudRuntimeException("Can't find strategy to move data. " + "Source: " + srcData.getType().name() + " '" + srcData.getUuid() + ", Destination: " +
destData.getType().name() + " '" + destData.getUuid() + "'");
}
strategy.copyAsync(srcData, destData, destHost, callback);
}