Updated Branches: refs/heads/master f673167d0 -> f28a28dc7
CLOUDSTACK-3913 Private templates would now get copied to only one of image storage chosen randamly as was the case earlier. Dont throw an exception for uploading volumes when there are multiple image stores, instead choose one of them randomly Signed off by : nitin mehta<[email protected]> Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/f28a28dc Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/f28a28dc Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/f28a28dc Branch: refs/heads/master Commit: f28a28dc779bd6c7f6598b6944056249eb677904 Parents: f673167 Author: Nitin Mehta <[email protected]> Authored: Mon Aug 5 17:12:52 2013 +0530 Committer: Nitin Mehta <[email protected]> Committed: Mon Aug 5 17:43:57 2013 +0530 ---------------------------------------------------------------------- .../cloudstack/storage/image/BaseImageStoreDriverImpl.java | 3 ++- server/src/com/cloud/template/HypervisorTemplateAdapter.java | 6 ++++++ server/src/com/cloud/template/TemplateManagerImpl.java | 7 +++---- 3 files changed, 11 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f28a28dc/engine/storage/src/org/apache/cloudstack/storage/image/BaseImageStoreDriverImpl.java ---------------------------------------------------------------------- diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/BaseImageStoreDriverImpl.java b/engine/storage/src/org/apache/cloudstack/storage/image/BaseImageStoreDriverImpl.java index 13d19d3..fcbc5c9 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/image/BaseImageStoreDriverImpl.java +++ b/engine/storage/src/org/apache/cloudstack/storage/image/BaseImageStoreDriverImpl.java @@ -106,7 +106,8 @@ public abstract class BaseImageStoreDriverImpl implements ImageStoreDriver { } @Override - public void createAsync(DataStore dataStore, DataObject data, AsyncCompletionCallback<CreateCmdResult> callback) { + public void + createAsync(DataStore dataStore, DataObject data, AsyncCompletionCallback<CreateCmdResult> callback) { CreateContext<CreateCmdResult> context = new CreateContext<CreateCmdResult>(callback, data); AsyncCallbackDispatcher<BaseImageStoreDriverImpl, DownloadAnswer> caller = AsyncCallbackDispatcher .create(this); http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f28a28dc/server/src/com/cloud/template/HypervisorTemplateAdapter.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/template/HypervisorTemplateAdapter.java b/server/src/com/cloud/template/HypervisorTemplateAdapter.java index 21a0f6e..de0ed7e 100755 --- a/server/src/com/cloud/template/HypervisorTemplateAdapter.java +++ b/server/src/com/cloud/template/HypervisorTemplateAdapter.java @@ -18,6 +18,7 @@ package com.cloud.template; import java.net.MalformedURLException; import java.net.URL; +import java.util.Collections; import java.util.List; import java.util.concurrent.ExecutionException; @@ -180,6 +181,8 @@ public class HypervisorTemplateAdapter extends TemplateAdapterBase { if ( imageStores == null || imageStores.size() == 0 ){ throw new CloudRuntimeException("Unable to find image store to download template "+ profile.getTemplate()); } + + Collections.shuffle(imageStores);// For private templates choose a random store. TODO - Have a better algorithm based on size, no. of objects, load etc. for (DataStore imageStore : imageStores) { TemplateInfo tmpl = this.imageFactory.getTemplate(template.getId(), imageStore); CreateTemplateContext<TemplateApiResult> context = new CreateTemplateContext<TemplateApiResult>(null, tmpl); @@ -187,6 +190,9 @@ public class HypervisorTemplateAdapter extends TemplateAdapterBase { caller.setCallback(caller.getTarget().createTemplateAsyncCallBack(null, null)); caller.setContext(context); this.imageService.createTemplateAsync(tmpl, imageStore, caller); + if( !(profile.getIsPublic() || profile.getFeatured()) ){ // If private template then break + break; + } } _resourceLimitMgr.incrementResourceCount(profile.getAccountId(), ResourceType.template); http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f28a28dc/server/src/com/cloud/template/TemplateManagerImpl.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/template/TemplateManagerImpl.java b/server/src/com/cloud/template/TemplateManagerImpl.java index fa591a0..2b52d76 100755 --- a/server/src/com/cloud/template/TemplateManagerImpl.java +++ b/server/src/com/cloud/template/TemplateManagerImpl.java @@ -360,11 +360,10 @@ public class TemplateManagerImpl extends ManagerBase implements TemplateManager, if (storeUuid != null) { imageStore = _dataStoreMgr.getDataStore(storeUuid, DataStoreRole.Image); } else { - List<DataStore> stores = _dataStoreMgr.getImageStoresByScope(new ZoneScope(zoneId)); - if (stores.size() > 1) { - throw new CloudRuntimeException("multiple image stores, don't know which one to use"); + imageStore = this._dataStoreMgr.getImageStore(zoneId); + if (imageStore == null) { + throw new CloudRuntimeException("cannot find an image store for zone " + zoneId); } - imageStore = stores.get(0); } return imageStore;
