// 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 org.apache.cloudstack.storage.test; import static org.testng.Assert.assertNotNull; import static org.testng.Assert.assertTrue; import java.util.HashMap; import java.util.Map; import java.util.UUID; import java.util.concurrent.ExecutionException; import javax.inject.Inject; import org.mockito.Matchers; import org.mockito.Mockito; import org.springframework.test.context.ContextConfiguration; import org.testng.annotations.Test; import org.apache.cloudstack.api.ApiConstants; 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.StorageCacheManager; import org.apache.cloudstack.engine.subsystem.api.storage.TemplateDataFactory; import org.apache.cloudstack.engine.subsystem.api.storage.TemplateInfo; import org.apache.cloudstack.engine.subsystem.api.storage.TemplateService; import org.apache.cloudstack.engine.subsystem.api.storage.TemplateService.TemplateApiResult; import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope; 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.ImageStoreDetailVO; import org.apache.cloudstack.storage.datastore.db.ImageStoreVO; import org.apache.cloudstack.storage.image.datastore.ImageStoreHelper; import com.cloud.dc.DataCenter.NetworkType; import com.cloud.dc.DataCenterVO; import com.cloud.dc.dao.DataCenterDao; import com.cloud.storage.DataStoreRole; import com.cloud.storage.ScopeType; import com.cloud.storage.Storage; import com.cloud.storage.Storage.TemplateType; import com.cloud.storage.VMTemplateVO; import com.cloud.storage.dao.VMTemplateDao; import com.cloud.storage.download.DownloadMonitorImpl; import com.cloud.utils.component.ComponentContext; @ContextConfiguration(locations = {"classpath:/storageContext.xml"}) public class S3TemplateTest extends CloudStackTestNGBase { @Inject DataCenterDao dcDao; ImageStoreVO imageStore; ImageStoreDetailVO imageStoreDetail; @Inject ImageStoreDao imageStoreDao; @Inject TemplateService templateSvr; @Inject VMTemplateDao templateDao; @Inject TemplateDataFactory templateFactory; @Inject DataStoreManager dataStoreMgr; @Inject EndPointSelector epSelector; @Inject DownloadMonitorImpl downloadMonitor; @Inject ImageStoreHelper imageStoreHelper; @Inject StorageCacheManager cacheMgr; long dcId; long templateId; @Test(priority = -1) public void setUp() { ComponentContext.initComponentsLifeCycle(); // create data center DataCenterVO dc = new DataCenterVO(UUID.randomUUID().toString(), "test", "8.8.8.8", null, "10.0.0.1", null, "10.0.0.1/24", null, null, NetworkType.Basic, null, null, true, true, null, null); dc = dcDao.persist(dc); dcId = dc.getId(); // add s3 image store Map<String, Object> sParams = new HashMap<String, Object>(); sParams.put("name", "test"); sParams.put("protocol", "http"); sParams.put("providerName", "S3"); sParams.put("scope", ScopeType.REGION); sParams.put("role", DataStoreRole.Image); Map<String, String> sDetails = new HashMap<String, String>(); sDetails.put(ApiConstants.S3_ACCESS_KEY, this.getS3AccessKey()); sDetails.put(ApiConstants.S3_SECRET_KEY, this.getS3SecretKey()); sDetails.put(ApiConstants.S3_BUCKET_NAME, this.getS3TemplateBucket()); sDetails.put(ApiConstants.S3_END_POINT, this.getS3EndPoint()); this.imageStoreHelper.createImageStore(sParams, sDetails); // add nfs cache storage Map<String, Object> cParams = new HashMap<String, Object>(); cParams.put("name", "testCache"); cParams.put("protocol", "nfs"); cParams.put("providerName", DataStoreProvider.NFS_IMAGE); cParams.put("scope", ScopeType.ZONE); cParams.put("role", DataStoreRole.ImageCache); cParams.put("url", this.getSecondaryStorage()); cParams.put("zoneId", dcId); this.imageStoreHelper.createImageStore(cParams); VMTemplateVO image = new VMTemplateVO(); image.setTemplateType(TemplateType.SYSTEM); image.setUrl(this.getTemplateUrl()); image.setUniqueName(UUID.randomUUID().toString()); image.setName(UUID.randomUUID().toString()); image.setPublicTemplate(false); image.setFeatured(false); image.setRequiresHvm(false); image.setBits(64); image.setFormat(Storage.ImageFormat.VHD); image.setEnablePassword(false); image.setEnableSshKey(false); image.setGuestOSId(133); image.setBootable(true); image.setPrepopulate(true); image.setCrossZones(true); image.setExtractable(true); image.setAccountId(2); image = templateDao.persist(image); templateId = image.getId(); // inject mockito LocalHostEndpoint ep = new LocalHostEndpoint(); ep.setResource(new MockLocalNfsSecondaryStorageResource()); Mockito.when(epSelector.select(Matchers.any(DataObject.class))).thenReturn(ep); Mockito.when(epSelector.select(Matchers.any(DataStore.class))).thenReturn(ep); Mockito.when(epSelector.select(Matchers.any(DataObject.class), Matchers.any(DataObject.class))).thenReturn(ep); } @Test(priority = 1) public void registerTemplate() { TemplateInfo template = templateFactory.getTemplate(templateId, DataStoreRole.Image); DataStore store = dataStoreMgr.getImageStore(dcId); AsyncCallFuture<TemplateApiResult> future = new AsyncCallFuture<TemplateApiResult>(); templateSvr.createTemplateAsync(template, store, future); 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()); } } @Test(priority = 2) public void copyTemplateToCache() { TemplateInfo template = templateFactory.getTemplate(templateId, DataStoreRole.Image); DataObject cacheObj = this.cacheMgr.createCacheObject(template, new ZoneScope(dcId)); assertNotNull(cacheObj, "failed to create cache object"); } }