From f5d5526d41d4889aa252714e2cc6006598c63993 Mon Sep 17 00:00:00 2001 From: Min Chen Date: Mon, 6 May 2013 18:02:52 -0700 Subject: [PATCH] Fix unit test to test NFS template download flow. --- .../resource/NfsSecondaryStorageResource.java | 2 +- .../storage/template/DownloadManagerImpl.java | 15 +++++- .../MockLocalNfsSecondaryStorageResource.java | 12 +++++ .../cloudstack/storage/test/TemplateTest.java | 48 +++++++++++-------- .../integration-test/test/resource/testng.xml | 3 +- .../ResourceLimitManagerImpl.java | 1 + .../storage/download/DownloadListener.java | 2 +- .../template/HypervisorTemplateAdapter.java | 5 +- 8 files changed, 63 insertions(+), 25 deletions(-) diff --git a/core/src/com/cloud/storage/resource/NfsSecondaryStorageResource.java b/core/src/com/cloud/storage/resource/NfsSecondaryStorageResource.java index d9f91a33e84..48854dfbcb5 100755 --- a/core/src/com/cloud/storage/resource/NfsSecondaryStorageResource.java +++ b/core/src/com/cloud/storage/resource/NfsSecondaryStorageResource.java @@ -140,7 +140,7 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S String _guid; String _role; Map _params; - StorageLayer _storage; + protected StorageLayer _storage; boolean _inSystemVM = false; boolean _sslCopy = false; diff --git a/core/src/com/cloud/storage/template/DownloadManagerImpl.java b/core/src/com/cloud/storage/template/DownloadManagerImpl.java index 12914b0ef45..53810e9083c 100755 --- a/core/src/com/cloud/storage/template/DownloadManagerImpl.java +++ b/core/src/com/cloud/storage/template/DownloadManagerImpl.java @@ -62,6 +62,7 @@ import com.cloud.agent.api.Answer; import com.cloud.agent.api.storage.DownloadAnswer; import com.cloud.agent.api.storage.Proxy; import com.cloud.agent.api.to.DataStoreTO; +import com.cloud.agent.api.to.NfsTO; import com.cloud.agent.api.to.S3TO; import com.cloud.exception.InternalErrorException; import com.cloud.storage.Storage.ImageFormat; @@ -245,6 +246,10 @@ public class DownloadManagerImpl extends ManagerBase implements DownloadManager this.threadPool = threadPool; } + public void setStorageLayer(StorageLayer storage){ + this._storage = storage; + } + /** * Get notified of change of job status. Executed in context of downloader * thread @@ -656,8 +661,16 @@ public class DownloadManagerImpl extends ManagerBase implements DownloadManager return new DownloadAnswer("Invalid Name", VMTemplateStorageResourceAssoc.Status.DOWNLOAD_ERROR); } - String installPathPrefix = cmd.getInstallPath(); DataStoreTO dstore = cmd.getDataStore(); + String installPathPrefix = cmd.getInstallPath(); + // for NFS, we need to get mounted path + if (dstore instanceof NfsTO) { + if (ResourceType.TEMPLATE == resourceType) { + installPathPrefix = resource.getRootDir(cmd) + File.separator + installPathPrefix; + } else { + installPathPrefix = resource.getRootDir(cmd) + File.separator + installPathPrefix; + } + } String user = null; String password = null; if (cmd.getAuth() != null) { diff --git a/engine/storage/integration-test/test/org/apache/cloudstack/storage/MockLocalNfsSecondaryStorageResource.java b/engine/storage/integration-test/test/org/apache/cloudstack/storage/MockLocalNfsSecondaryStorageResource.java index a5c0af1ef20..60dc16127fa 100644 --- a/engine/storage/integration-test/test/org/apache/cloudstack/storage/MockLocalNfsSecondaryStorageResource.java +++ b/engine/storage/integration-test/test/org/apache/cloudstack/storage/MockLocalNfsSecondaryStorageResource.java @@ -18,10 +18,12 @@ import com.amazonaws.services.s3.model.S3ObjectSummary; import com.cloud.agent.api.Answer; import com.cloud.agent.api.Command; import com.cloud.agent.api.storage.DownloadAnswer; +import com.cloud.agent.api.storage.ssCommand; import com.cloud.agent.api.to.DataStoreTO; import com.cloud.agent.api.to.NfsTO; import com.cloud.agent.api.to.S3TO; import com.cloud.agent.api.to.SwiftTO; +import com.cloud.storage.JavaStorageLayer; import com.cloud.storage.VMTemplateStorageResourceAssoc.Status; import com.cloud.storage.resource.NfsSecondaryStorageResource; import com.cloud.storage.template.DownloadManagerImpl; @@ -35,7 +37,17 @@ public class MockLocalNfsSecondaryStorageResource extends public MockLocalNfsSecondaryStorageResource(){ _dlMgr = new DownloadManagerImpl(); + + _storage = new JavaStorageLayer(); ((DownloadManagerImpl)_dlMgr).setThreadPool(Executors.newFixedThreadPool(10)); + ((DownloadManagerImpl)_dlMgr).setStorageLayer(_storage); + + } + + @Override + public String getRootDir(ssCommand cmd) { + return "/mnt"; + } @Override diff --git a/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/TemplateTest.java b/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/TemplateTest.java index ff540d95748..541f668e7d4 100644 --- a/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/TemplateTest.java +++ b/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/TemplateTest.java @@ -1,5 +1,7 @@ package org.apache.cloudstack.storage.test; +import static org.testng.Assert.assertTrue; + import java.util.UUID; import java.util.concurrent.ExecutionException; @@ -8,6 +10,7 @@ import javax.inject.Inject; 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.DataStoreManager; +import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreProvider; import org.apache.cloudstack.engine.subsystem.api.storage.EndPointSelector; import org.apache.cloudstack.engine.subsystem.api.storage.TemplateDataFactory; import org.apache.cloudstack.engine.subsystem.api.storage.TemplateInfo; @@ -15,6 +18,7 @@ import org.apache.cloudstack.engine.subsystem.api.storage.TemplateService; import org.apache.cloudstack.engine.subsystem.api.storage.TemplateService.TemplateApiResult; import org.apache.cloudstack.framework.async.AsyncCallFuture; import org.apache.cloudstack.storage.LocalHostEndpoint; +import org.apache.cloudstack.storage.MockLocalNfsSecondaryStorageResource; import org.apache.cloudstack.storage.datastore.db.ImageStoreDao; import org.apache.cloudstack.storage.datastore.db.ImageStoreVO; import org.mockito.Mockito; @@ -34,7 +38,7 @@ import com.cloud.storage.download.DownloadMonitorImpl; import com.cloud.utils.component.ComponentContext; @ContextConfiguration(locations={"classpath:/storageContext.xml"}) - + public class TemplateTest extends CloudStackTestNGBase { @Inject DataCenterDao dcDao; @@ -55,7 +59,7 @@ public class TemplateTest extends CloudStackTestNGBase { DownloadMonitorImpl downloadMonitor; long dcId; long templateId; - + @Test(priority = -1) public void setUp() { ComponentContext.initComponentsLifeCycle(); @@ -64,17 +68,17 @@ public class TemplateTest extends CloudStackTestNGBase { null, null, NetworkType.Basic, null, null, true, true, null, null); dc = dcDao.persist(dc); dcId = dc.getId(); - + imageStore = new ImageStoreVO(); imageStore.setName("test"); imageStore.setDataCenterId(dcId); - imageStore.setProviderName("CloudStack ImageStore Provider"); + imageStore.setProviderName(DataStoreProvider.NFS_IMAGE); imageStore.setRole(DataStoreRole.Image); imageStore.setUrl(this.getSecondaryStorage()); imageStore.setUuid(UUID.randomUUID().toString()); imageStore.setProtocol("nfs"); imageStore = imageStoreDao.persist(imageStore); - + VMTemplateVO image = new VMTemplateVO(); image.setTemplateType(TemplateType.USER); image.setUrl(this.getTemplateUrl()); @@ -93,30 +97,36 @@ public class TemplateTest extends CloudStackTestNGBase { image.setCrossZones(true); image.setExtractable(true); - + //image.setImageDataStoreId(storeId); image = templateDao.persist(image); templateId = image.getId(); - - Mockito.when(epSelector.select(Mockito.any(DataObject.class))).thenReturn(new LocalHostEndpoint()); - //Mockito.when(downloadMonitor.isTemplateUpdateable(Mockito.anyLong(), Mockito.anyLong())).thenReturn(true); + + // inject mockito + LocalHostEndpoint ep = new LocalHostEndpoint(); + ep.setResource(new MockLocalNfsSecondaryStorageResource()); + Mockito.when(epSelector.select(Mockito.any(DataObject.class))).thenReturn(ep); + Mockito.when(epSelector.select(Mockito.any(DataStore.class))).thenReturn(ep); } - + @Test public void registerTemplate() { TemplateInfo template = templateFactory.getTemplate(templateId); DataStore store = dataStoreMgr.getImageStore(dcId); AsyncCallFuture future = new AsyncCallFuture(); templateSvr.createTemplateAsync(template, store, future); - try { - future.get(); - } catch (InterruptedException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (ExecutionException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } + try { + TemplateApiResult result = future.get(); + assertTrue(result.isSuccess(), "failed to register template: " + result.getResult()); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + assertTrue(false, e.getMessage()); + } catch (ExecutionException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + assertTrue(false, e.getMessage()); + } } } diff --git a/engine/storage/integration-test/test/resource/testng.xml b/engine/storage/integration-test/test/resource/testng.xml index ad4829bc1b0..dbadae1dde1 100644 --- a/engine/storage/integration-test/test/resource/testng.xml +++ b/engine/storage/integration-test/test/resource/testng.xml @@ -27,7 +27,8 @@ - + + diff --git a/server/src/com/cloud/resourcelimit/ResourceLimitManagerImpl.java b/server/src/com/cloud/resourcelimit/ResourceLimitManagerImpl.java index 49c3af1853b..818c5ab0291 100755 --- a/server/src/com/cloud/resourcelimit/ResourceLimitManagerImpl.java +++ b/server/src/com/cloud/resourcelimit/ResourceLimitManagerImpl.java @@ -227,6 +227,7 @@ public class ResourceLimitManagerImpl extends ManagerBase implements ResourceLim s_logger.trace("Not incrementing resource count for system accounts, returning"); return; } + long numToIncrement = (delta.length == 0) ? 1 : delta[0].longValue(); if (!updateResourceCountForAccount(accountId, type, true, numToIncrement)) { diff --git a/server/src/com/cloud/storage/download/DownloadListener.java b/server/src/com/cloud/storage/download/DownloadListener.java index 001b45dc1c4..84c51b1ffdb 100755 --- a/server/src/com/cloud/storage/download/DownloadListener.java +++ b/server/src/com/cloud/storage/download/DownloadListener.java @@ -99,7 +99,7 @@ public class DownloadListener implements Listener { public static final Logger s_logger = Logger.getLogger(DownloadListener.class.getName()); public static final int SMALL_DELAY = 100; - public static final long STATUS_POLL_INTERVAL = 10000L; + public static final long STATUS_POLL_INTERVAL = 300000L; //10000L; public static final String DOWNLOADED=Status.DOWNLOADED.toString(); public static final String NOT_DOWNLOADED=Status.NOT_DOWNLOADED.toString(); diff --git a/server/src/com/cloud/template/HypervisorTemplateAdapter.java b/server/src/com/cloud/template/HypervisorTemplateAdapter.java index 7e560e380fa..af77c925688 100755 --- a/server/src/com/cloud/template/HypervisorTemplateAdapter.java +++ b/server/src/com/cloud/template/HypervisorTemplateAdapter.java @@ -198,8 +198,9 @@ public class HypervisorTemplateAdapter extends TemplateAdapterBase implements Te TemplateInfo template = context.template; VMTemplateVO tmplt = this._tmpltDao.findById(template.getId()); long accountId = tmplt.getAccountId(); - _resourceLimitMgr.incrementResourceCount(accountId, ResourceType.secondary_storage, - template.getSize()); + if (template.getSize() != null) { + _resourceLimitMgr.incrementResourceCount(accountId, ResourceType.secondary_storage, template.getSize()); + } return null; }