diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/DefaultPrimaryDataStoreImpl.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/DefaultPrimaryDataStoreImpl.java index 696085daec2..c5432718905 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/datastore/DefaultPrimaryDataStoreImpl.java +++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/DefaultPrimaryDataStoreImpl.java @@ -27,10 +27,14 @@ import org.apache.cloudstack.storage.volume.db.VolumeVO; import org.apache.log4j.Logger; +import com.cloud.dao.EntityManager; import com.cloud.host.HostVO; import com.cloud.host.dao.HostDao; import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.utils.component.ComponentInject; +import com.cloud.utils.db.SearchCriteria; +import com.cloud.utils.db.SearchCriteria2; +import com.cloud.utils.db.SearchCriteriaService; import com.cloud.utils.exception.CloudRuntimeException; import edu.emory.mathcs.backport.java.util.Collections; @@ -42,8 +46,8 @@ public class DefaultPrimaryDataStoreImpl implements PrimaryDataStore { protected PrimaryDataStoreInfo pdsInfo; @Inject private VolumeDao volumeDao; - //@Inject - private HostDao hostDao; + @Inject + HostDao hostDao; @Inject TemplatePrimaryDataStoreManager templatePrimaryStoreMgr; diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDaoImpl.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDaoImpl.java index adf131fa96c..49dad27d872 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDaoImpl.java +++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDaoImpl.java @@ -46,7 +46,6 @@ import com.cloud.utils.db.SearchCriteria.Func; import com.cloud.utils.db.SearchCriteria.Op; import com.cloud.utils.exception.CloudRuntimeException; -@Component public class PrimaryDataStoreDaoImpl extends GenericDaoBase implements PrimaryDataStoreDao { protected final SearchBuilder AllFieldSearch; protected final SearchBuilder DcPodSearch; @@ -60,7 +59,7 @@ public class PrimaryDataStoreDaoImpl extends GenericDaoBase endPoints = volume.getDataStore().getEndPoints(); + List endPoints = template.getPrimaryDataStore().getEndPoints(); Answer answer = sendOutCommand(cmd, endPoints); diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/lifecycle/DefaultPrimaryDataStoreLifeCycleImpl.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/lifecycle/DefaultPrimaryDataStoreLifeCycleImpl.java index c16c230afd8..c4c72167a59 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/datastore/lifecycle/DefaultPrimaryDataStoreLifeCycleImpl.java +++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/lifecycle/DefaultPrimaryDataStoreLifeCycleImpl.java @@ -85,6 +85,7 @@ public class DefaultPrimaryDataStoreLifeCycleImpl implements PrimaryDataStoreLif dataStore.setHostAddress(parser.getHost()); dataStore.setPath(parser.getPath()); dataStore.setStorageProviderId(this.provider.getId()); + dataStore.setClusterId(Long.parseLong(dsInfos.get("clusterId"))); dataStore = dataStoreDao.persist(dataStore); //TODO: add extension point for each data store return this.provider.getDataStore(dataStore.getId()); diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/motion/DefaultImageMotionStrategy.java b/engine/storage/src/org/apache/cloudstack/storage/image/motion/DefaultImageMotionStrategy.java index 7ec63e0160f..625cdc91f77 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/image/motion/DefaultImageMotionStrategy.java +++ b/engine/storage/src/org/apache/cloudstack/storage/image/motion/DefaultImageMotionStrategy.java @@ -18,16 +18,10 @@ */ package org.apache.cloudstack.storage.image.motion; -import org.apache.cloudstack.engine.cloud.entity.api.TemplateEntity; import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint; import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreInfo; -import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo; import org.apache.cloudstack.storage.command.CopyTemplateToPrimaryStorage; -import org.apache.cloudstack.storage.datastore.PrimaryDataStore; -import org.apache.cloudstack.storage.image.TemplateInfo; import org.apache.cloudstack.storage.to.ImageOnPrimayDataStoreTO; -import org.apache.cloudstack.storage.to.TemplateTO; -import org.apache.cloudstack.storage.to.VolumeTO; import org.apache.cloudstack.storage.volume.TemplateOnPrimaryDataStoreInfo; import org.springframework.stereotype.Component; diff --git a/engine/storage/src/org/apache/cloudstack/storage/volume/TemplateOnPrimaryDataStoreObject.java b/engine/storage/src/org/apache/cloudstack/storage/volume/TemplateOnPrimaryDataStoreObject.java index 25ae38d2cb0..b3326e11965 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/volume/TemplateOnPrimaryDataStoreObject.java +++ b/engine/storage/src/org/apache/cloudstack/storage/volume/TemplateOnPrimaryDataStoreObject.java @@ -18,8 +18,6 @@ */ package org.apache.cloudstack.storage.volume; -import javax.inject.Inject; - import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreInfo; import org.apache.cloudstack.storage.image.TemplateInfo; import org.apache.cloudstack.storage.volume.db.TemplatePrimaryDataStoreDao; @@ -31,13 +29,14 @@ public class TemplateOnPrimaryDataStoreObject implements TemplateOnPrimaryDataSt protected PrimaryDataStoreInfo dataStore; protected TemplateInfo template; protected TemplatePrimaryDataStoreVO vo; - @Inject TemplatePrimaryDataStoreDao templateStoreDao; - public TemplateOnPrimaryDataStoreObject(PrimaryDataStoreInfo primaryDataStore, TemplateInfo template, TemplatePrimaryDataStoreVO vo) { + public TemplateOnPrimaryDataStoreObject(PrimaryDataStoreInfo primaryDataStore, TemplateInfo template, TemplatePrimaryDataStoreVO vo, + TemplatePrimaryDataStoreDao templateStoreDao) { this.dataStore = primaryDataStore; this.template = template; this.vo = vo; + this.templateStoreDao = templateStoreDao; } @Override diff --git a/engine/storage/src/org/apache/cloudstack/storage/volume/TemplatePrimaryDataStoreManagerImpl.java b/engine/storage/src/org/apache/cloudstack/storage/volume/TemplatePrimaryDataStoreManagerImpl.java index 95ea49ffaf5..19704be79af 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/volume/TemplatePrimaryDataStoreManagerImpl.java +++ b/engine/storage/src/org/apache/cloudstack/storage/volume/TemplatePrimaryDataStoreManagerImpl.java @@ -41,7 +41,7 @@ public class TemplatePrimaryDataStoreManagerImpl implements TemplatePrimaryDataS TemplatePrimaryDataStoreVO templateStoreVO = new TemplatePrimaryDataStoreVO(dataStore.getId(), template.getId()); templateStoreVO = templateStoreDao.persist(templateStoreVO); - TemplateOnPrimaryDataStoreObject templateStoreObject = new TemplateOnPrimaryDataStoreObject(dataStore, template, templateStoreVO); + TemplateOnPrimaryDataStoreObject templateStoreObject = new TemplateOnPrimaryDataStoreObject(dataStore, template, templateStoreVO, templateStoreDao); return templateStoreObject; } @@ -52,7 +52,11 @@ public class TemplatePrimaryDataStoreManagerImpl implements TemplatePrimaryDataS sc.addAnd(sc.getEntity().getPoolId(), Op.EQ, dataStore.getId()); sc.addAnd(sc.getEntity().getDownloadState(), Op.EQ, VMTemplateStorageResourceAssoc.Status.DOWNLOADED); TemplatePrimaryDataStoreVO templateStoreVO = sc.find(); - TemplateOnPrimaryDataStoreObject templateStoreObject = new TemplateOnPrimaryDataStoreObject(dataStore, template, templateStoreVO); + if (templateStoreVO == null) { + return null; + } + + TemplateOnPrimaryDataStoreObject templateStoreObject = new TemplateOnPrimaryDataStoreObject(dataStore, template, templateStoreVO, templateStoreDao); return templateStoreObject; } } diff --git a/engine/storage/test/org/apache/cloudstack/storage/test/ChildTestConfiguration.java b/engine/storage/test/org/apache/cloudstack/storage/test/ChildTestConfiguration.java new file mode 100644 index 00000000000..9077a5a7e38 --- /dev/null +++ b/engine/storage/test/org/apache/cloudstack/storage/test/ChildTestConfiguration.java @@ -0,0 +1,28 @@ +package org.apache.cloudstack.storage.test; + +import org.mockito.Mockito; +import org.springframework.context.annotation.Bean; + +import com.cloud.agent.AgentManager; +import com.cloud.host.dao.HostDao; + +public class ChildTestConfiguration extends TestConfiguration { + + @Override + @Bean + public HostDao hostDao() { + HostDao dao = super.hostDao(); + HostDao nDao = Mockito.spy(dao); + return nDao; + } + + @Bean + public AgentManager agentMgr() { + return Mockito.mock(AgentManager.class); + } +/* @Override + @Bean + public PrimaryDataStoreDao primaryDataStoreDao() { + return Mockito.mock(PrimaryDataStoreDaoImpl.class); + }*/ +} diff --git a/engine/storage/test/org/apache/cloudstack/storage/test/StorageTest.java b/engine/storage/test/org/apache/cloudstack/storage/test/StorageTest.java new file mode 100644 index 00000000000..2a285cb8f41 --- /dev/null +++ b/engine/storage/test/org/apache/cloudstack/storage/test/StorageTest.java @@ -0,0 +1,20 @@ +package org.apache.cloudstack.storage.test; + +import static org.junit.Assert.*; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(locations="classpath:resource/storageContext.xml") +public class StorageTest { + + @Test + public void test() { + fail("Not yet implemented"); + } + +} diff --git a/engine/storage/test/org/apache/cloudstack/storage/test/TestConfiguration.java b/engine/storage/test/org/apache/cloudstack/storage/test/TestConfiguration.java new file mode 100644 index 00000000000..42cd8fb5f59 --- /dev/null +++ b/engine/storage/test/org/apache/cloudstack/storage/test/TestConfiguration.java @@ -0,0 +1,21 @@ +package org.apache.cloudstack.storage.test; + +import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; +import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDaoImpl; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import com.cloud.host.dao.HostDao; +import com.cloud.host.dao.HostDaoImpl; + +@Configuration +public class TestConfiguration { + @Bean + public HostDao hostDao() { + return new HostDaoImpl(); + } + @Bean + public PrimaryDataStoreDao primaryDataStoreDao() { + return new PrimaryDataStoreDaoImpl(); + } +} diff --git a/engine/storage/test/org/apache/cloudstack/storage/test/XenEndpoint.java b/engine/storage/test/org/apache/cloudstack/storage/test/XenEndpoint.java new file mode 100644 index 00000000000..a96d7eca154 --- /dev/null +++ b/engine/storage/test/org/apache/cloudstack/storage/test/XenEndpoint.java @@ -0,0 +1,5 @@ +package org.apache.cloudstack.storage.test; + +public class XenEndpoint { + +} diff --git a/engine/storage/test/org/apache/cloudstack/storage/test/volumeServiceTest.java b/engine/storage/test/org/apache/cloudstack/storage/test/volumeServiceTest.java index 2c832107e50..c6eafa50009 100644 --- a/engine/storage/test/org/apache/cloudstack/storage/test/volumeServiceTest.java +++ b/engine/storage/test/org/apache/cloudstack/storage/test/volumeServiceTest.java @@ -20,9 +20,10 @@ package org.apache.cloudstack.storage.test; import static org.junit.Assert.*; -import java.awt.List; +import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedList; +import java.util.List; import java.util.Map; import java.util.UUID; import java.util.concurrent.ExecutorService; @@ -41,7 +42,11 @@ import org.apache.cloudstack.engine.subsystem.api.storage.disktype.VolumeDiskTyp import org.apache.cloudstack.engine.subsystem.api.storage.disktype.VolumeDiskTypeHelper; import org.apache.cloudstack.engine.subsystem.api.storage.type.RootDisk; import org.apache.cloudstack.engine.subsystem.api.storage.type.VolumeTypeHelper; +import org.apache.cloudstack.storage.command.CreateVolumeAnswer; +import org.apache.cloudstack.storage.command.CreateVolumeFromBaseImageCommand; import org.apache.cloudstack.storage.datastore.DefaultPrimaryDataStoreImpl; +import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; +import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreVO; import org.apache.cloudstack.storage.datastore.lifecycle.PrimaryDataStoreLifeCycle; import org.apache.cloudstack.storage.datastore.provider.DefaultPrimaryDatastoreProviderImpl; import org.apache.cloudstack.storage.datastore.provider.PrimaryDataStoreProvider; @@ -68,9 +73,29 @@ import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.mockito.Mockito; import org.mockito.Mockito.*; +import com.cloud.agent.AgentManager; +import com.cloud.dc.ClusterVO; +import com.cloud.dc.DataCenterVO; +import com.cloud.dc.HostPodVO; +import com.cloud.dc.DataCenter.NetworkType; +import com.cloud.dc.dao.ClusterDao; +import com.cloud.dc.dao.DataCenterDao; +import com.cloud.dc.dao.HostPodDao; +import com.cloud.exception.AgentUnavailableException; +import com.cloud.exception.OperationTimedoutException; +import com.cloud.host.Host; +import com.cloud.host.HostVO; +import com.cloud.host.Status; +import com.cloud.host.Status.Event; +import com.cloud.host.dao.HostDao; +import com.cloud.hypervisor.Hypervisor.HypervisorType; +import com.cloud.org.Cluster.ClusterType; +import com.cloud.org.Managed.ManagedState; +import com.cloud.resource.ResourceState; import com.cloud.storage.Storage.TemplateType; import com.cloud.utils.component.ComponentInject; import com.cloud.utils.db.DB; @@ -89,11 +114,68 @@ public class volumeServiceTest { ImageDataDao imageDataDao; @Inject VolumeDao volumeDao; + @Inject + HostDao hostDao; + @Inject + HostPodDao podDao; + @Inject + ClusterDao clusterDao; + @Inject + DataCenterDao dcDao; + @Inject + PrimaryDataStoreDao primaryStoreDao; @Inject PrimaryDataStoreProviderManager primaryDataStoreProviderMgr; + @Inject + AgentManager agentMgr; + Long dcId; + Long clusterId; @Before public void setUp() { + //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); + dc = dcDao.persist(dc); + dcId = dc.getId(); + //create pod + HostPodVO pod = new HostPodVO(UUID.randomUUID().toString(), dc.getId(), "192.168.56.1", "192.168.56.0/24", 8, "test"); + pod = podDao.persist(pod); + //create xen cluster + ClusterVO cluster = new ClusterVO(dc.getId(), pod.getId(), "devcloud cluster"); + cluster.setHypervisorType(HypervisorType.XenServer.toString()); + cluster.setClusterType(ClusterType.CloudManaged); + cluster.setManagedState(ManagedState.Managed); + cluster = clusterDao.persist(cluster); + clusterId = cluster.getId(); + //create xen host + + HostVO host = new HostVO(UUID.randomUUID().toString()); + host.setName("devcloud xen host"); + host.setType(Host.Type.Routing); + host.setPrivateIpAddress("192.168.56.2"); + host.setDataCenterId(dc.getId()); + host.setVersion("6.0.1"); + host.setAvailable(true); + host.setSetup(true); + host.setLastPinged(0); + host.setResourceState(ResourceState.Enabled); + host.setClusterId(cluster.getId()); + + host = hostDao.persist(host); + List results = new ArrayList(); + results.add(host); + Mockito.when(hostDao.listAll()).thenReturn(results); + Mockito.when(hostDao.findHypervisorHostInCluster(Mockito.anyLong())).thenReturn(results); + CreateVolumeAnswer createVolumeFromImageAnswer = new CreateVolumeAnswer(UUID.randomUUID().toString()); + try { + Mockito.when(agentMgr.send(Mockito.anyLong(), Mockito.any(CreateVolumeFromBaseImageCommand.class))).thenReturn(createVolumeFromImageAnswer); + } catch (AgentUnavailableException e) { + + } catch (OperationTimedoutException e) { + + } + //Mockito.when(primaryStoreDao.findById(Mockito.anyLong())).thenReturn(primaryStore); } private ImageDataVO createImageData() { @@ -145,7 +227,8 @@ public class volumeServiceTest { PrimaryDataStoreLifeCycle lifeCycle = provider.getDataStoreLifeCycle(); Map params = new HashMap(); params.put("url", "nfs://test/test"); - params.put("dcId", "1"); + params.put("dcId", dcId.toString()); + params.put("clusterId", clusterId.toString()); params.put("name", "my primary data store"); PrimaryDataStoreInfo primaryDataStoreInfo = lifeCycle.registerDataStore(params); return primaryDataStoreInfo; diff --git a/engine/storage/test/resource/storageContext.xml b/engine/storage/test/resource/storageContext.xml index dbc997f1493..86811c354b4 100644 --- a/engine/storage/test/resource/storageContext.xml +++ b/engine/storage/test/resource/storageContext.xml @@ -15,7 +15,8 @@ - + + @@ -35,5 +36,7 @@ + + diff --git a/server/src/com/cloud/dao/EntityManagerImpl.java b/server/src/com/cloud/dao/EntityManagerImpl.java index 42d35c91eec..43c38cab55f 100644 --- a/server/src/com/cloud/dao/EntityManagerImpl.java +++ b/server/src/com/cloud/dao/EntityManagerImpl.java @@ -33,6 +33,7 @@ import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.GenericSearchBuilder; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; +import com.cloud.utils.db.SearchCriteria2; @Component @Local(value=EntityManager.class) @@ -119,6 +120,11 @@ public class EntityManagerImpl implements EntityManager, Manager { GenericDao dao = (GenericDao)GenericDaoBase.getDao(entityType); return dao.customSearch(sc, null); } + + @Override + public List search(SearchCriteria2 sc) { + return sc.list(); + } @Override public void remove(Class entityType, K id) { diff --git a/server/src/com/cloud/dc/dao/ClusterDaoImpl.java b/server/src/com/cloud/dc/dao/ClusterDaoImpl.java index 9edf7dbb6d0..f06b24daae5 100644 --- a/server/src/com/cloud/dc/dao/ClusterDaoImpl.java +++ b/server/src/com/cloud/dc/dao/ClusterDaoImpl.java @@ -25,6 +25,7 @@ import java.util.List; import java.util.Map; import javax.ejb.Local; +import javax.inject.Inject; import org.springframework.stereotype.Component; @@ -55,10 +56,10 @@ public class ClusterDaoImpl extends GenericDaoBase implements C private static final String GET_POD_CLUSTER_MAP_PREFIX = "SELECT pod_id, id FROM cloud.cluster WHERE cluster.id IN( "; private static final String GET_POD_CLUSTER_MAP_SUFFIX = " )"; + @Inject + protected HostPodDao _hostPodDao; - protected final HostPodDaoImpl _hostPodDao = ComponentLocator.inject(HostPodDaoImpl.class); - - protected ClusterDaoImpl() { + public ClusterDaoImpl() { super(); HyTypeWithoutGuidSearch = createSearchBuilder(); diff --git a/setup/db/create-schema.sql b/setup/db/create-schema.sql index 3d66f751489..aa8aeb8e326 100755 --- a/setup/db/create-schema.sql +++ b/setup/db/create-schema.sql @@ -2371,19 +2371,5 @@ CREATE TABLE `cloud`.`nicira_nvp_nic_map` ( PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -CREATE TABLE `cloud`.`image_data_store` ( - `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', - `name` varchar(255) NOT NULL COMMENT 'name of data store', - `image_provider_id` bigint unsigned NOT NULL COMMENT 'id of image_data_store_provider', - PRIMARY KEY(`id`), - CONSTRAINT `fk_tags__image_data_store_provider_id` FOREIGN KEY(`image_provider_id`) REFERENCES `image_data_store_provider`(`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`image_data_store_provider` ( - `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', - `name` varchar(255) NOT NULL COMMENT 'name of data store provider', - PRIMARY KEY(`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - SET foreign_key_checks = 1;