You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ed...@apache.org on 2012/11/21 04:01:20 UTC

[8/8] create template/primary data store is done

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/550f4fbc/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeManagerImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeManagerImpl.java b/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeManagerImpl.java
index 241bc3b..e6508e6 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeManagerImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeManagerImpl.java
@@ -19,29 +19,67 @@
 package org.apache.cloudstack.storage.volume;
 
 import org.apache.cloudstack.engine.subsystem.api.storage.VolumeProfile;
+import org.apache.cloudstack.storage.volume.db.VolumeDao;
+import org.apache.cloudstack.storage.volume.db.VolumeVO;
+import org.springframework.stereotype.Component;
 
-import com.cloud.storage.VolumeVO;
 import com.cloud.storage.Volume;
-import com.cloud.storage.dao.VolumeDao;
+import com.cloud.storage.Volume.Event;
+import com.cloud.storage.Volume.State;
 import com.cloud.utils.component.Inject;
 import com.cloud.utils.fsm.NoTransitionException;
 import com.cloud.utils.fsm.StateMachine2;
 
+@Component
 public class VolumeManagerImpl implements VolumeManager {
-    private StateMachine2<Volume.State, Volume.Event, Volume> _volStateMachine;
     @Inject
     protected VolumeDao _volumeDao;
+    private final static StateMachine2<State, Event, VolumeVO> s_fsm = new StateMachine2<State, Event, VolumeVO>();
+    public VolumeManagerImpl() {
+        initStateMachine();
+    }
 
     public VolumeVO allocateDuplicateVolume(VolumeVO oldVol) {
+        /*
         VolumeVO newVol = new VolumeVO(oldVol.getVolumeType(), oldVol.getName(), oldVol.getDataCenterId(), oldVol.getDomainId(), oldVol.getAccountId(), oldVol.getDiskOfferingId(), oldVol.getSize());
         newVol.setTemplateId(oldVol.getTemplateId());
         newVol.setDeviceId(oldVol.getDeviceId());
         newVol.setInstanceId(oldVol.getInstanceId());
         newVol.setRecreatable(oldVol.isRecreatable());
         newVol.setReservationId(oldVol.getReservationId());
+        */
         return null;
         // return _volumeDao.persist(newVol);
     }
+    
+    private void initStateMachine() {
+            s_fsm.addTransition(Volume.State.Allocated, Event.CreateRequested, Volume.State.Creating);
+            s_fsm.addTransition(Volume.State.Allocated, Event.DestroyRequested, Volume.State.Destroy);
+            s_fsm.addTransition(Volume.State.Creating, Event.OperationRetry, Volume.State.Creating);
+            s_fsm.addTransition(Volume.State.Creating, Event.OperationFailed, Volume.State.Allocated);
+            s_fsm.addTransition(Volume.State.Creating, Event.OperationSucceeded, Volume.State.Ready);
+            s_fsm.addTransition(Volume.State.Creating, Event.DestroyRequested, Volume.State.Destroy);
+            s_fsm.addTransition(Volume.State.Creating, Event.CreateRequested, Volume.State.Creating);            
+            s_fsm.addTransition(Volume.State.Allocated, Event.UploadRequested, Volume.State.UploadOp);
+            s_fsm.addTransition(Volume.State.UploadOp, Event.CopyRequested, Volume.State.Creating);// CopyRequested for volume from sec to primary storage            
+            s_fsm.addTransition(Volume.State.Creating, Event.CopySucceeded, Volume.State.Ready);
+            s_fsm.addTransition(Volume.State.Creating, Event.CopyFailed, Volume.State.UploadOp);// Copying volume from sec to primary failed.  
+            s_fsm.addTransition(Volume.State.UploadOp, Event.DestroyRequested, Volume.State.Destroy);
+            s_fsm.addTransition(Volume.State.Ready, Event.DestroyRequested, Volume.State.Destroy);
+            s_fsm.addTransition(Volume.State.Destroy, Event.ExpungingRequested, Volume.State.Expunging);
+            s_fsm.addTransition(Volume.State.Ready, Event.SnapshotRequested, Volume.State.Snapshotting);
+            s_fsm.addTransition(Volume.State.Snapshotting, Event.OperationSucceeded, Volume.State.Ready);
+            s_fsm.addTransition(Volume.State.Snapshotting, Event.OperationFailed, Volume.State.Ready);
+            s_fsm.addTransition(Volume.State.Ready, Event.MigrationRequested, Volume.State.Migrating);
+            s_fsm.addTransition(Volume.State.Migrating, Event.OperationSucceeded, Volume.State.Ready);
+            s_fsm.addTransition(Volume.State.Migrating, Event.OperationFailed, Volume.State.Ready);
+            s_fsm.addTransition(Volume.State.Destroy, Event.OperationSucceeded, Volume.State.Destroy);
+    }
+    
+    @Override
+    public StateMachine2<State, Event, VolumeVO> getStateMachine() {
+        return s_fsm;
+    }
 
     public VolumeVO processEvent(Volume vol, Volume.Event event) throws NoTransitionException {
         // _volStateMachine.transitTo(vol, event, null, _volumeDao);

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/550f4fbc/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeObject.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeObject.java b/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeObject.java
index f57fb75..f0eb1b5 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeObject.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeObject.java
@@ -18,6 +18,7 @@ import org.apache.log4j.Logger;
 
 import com.cloud.storage.Volume;
 import com.cloud.storage.Volume.State;
+import com.cloud.utils.component.ComponentInject;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.fsm.NoTransitionException;
 import com.cloud.utils.fsm.StateMachine2;
@@ -25,7 +26,7 @@ import com.cloud.utils.fsm.StateMachine2;
 public class VolumeObject implements VolumeInfo {
     private static final Logger s_logger = Logger.getLogger(VolumeObject.class);
     protected VolumeVO volumeVO;
-    private StateMachine2<Volume.State, VolumeEvent, VolumeVO> _volStateMachine;
+    private StateMachine2<Volume.State, Volume.Event, VolumeVO> _volStateMachine;
     protected PrimaryDataStore dataStore;
     @Inject
     VolumeDiskTypeHelper diskTypeHelper;
@@ -33,11 +34,18 @@ public class VolumeObject implements VolumeInfo {
     VolumeTypeHelper volumeTypeHelper;
     @Inject
     VolumeDao volumeDao;
-
-    public VolumeObject(PrimaryDataStore dataStore, VolumeVO volumeVO) {
+    @Inject
+    VolumeManager volumeMgr;
+    private VolumeObject(PrimaryDataStore dataStore, VolumeVO volumeVO) {
         this.volumeVO = volumeVO;
         this.dataStore = dataStore;
     }
+    
+    public static VolumeObject getVolumeObject(PrimaryDataStore dataStore, VolumeVO volumeVO) {
+        VolumeObject vo = new VolumeObject(dataStore, volumeVO);
+        vo = ComponentInject.inject(vo);
+        return vo;
+    }
 
     public String getUuid() {
         return volumeVO.getUuid();
@@ -91,8 +99,9 @@ public class VolumeObject implements VolumeInfo {
         volumeVO.setDiskType(type.toString());
     }
 
-    public boolean stateTransit(VolumeEvent event) {
+    public boolean stateTransit(Volume.Event event) {
         boolean result = false;
+        _volStateMachine = volumeMgr.getStateMachine();
         try {
             result = _volStateMachine.transitTo(volumeVO, event, null, volumeDao);
         } catch (NoTransitionException e) {

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/550f4fbc/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java b/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java
index f994847..0e6ed9f 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java
@@ -68,14 +68,14 @@ public class VolumeServiceImpl implements VolumeService {
         }
 
         VolumeObject vo = (VolumeObject) volume;
-        vo.stateTransit(VolumeEvent.CreateRequested);
+        vo.stateTransit(Volume.Event.CreateRequested);
 
         try {
             VolumeInfo vi = dataStore.createVolume(vo, diskType);
-            vo.stateTransit(VolumeEvent.OperationSucceeded);
+            vo.stateTransit(Volume.Event.OperationSucceeded);
             return vi;
         } catch (Exception e) {
-            vo.stateTransit(VolumeEvent.OperationFailed);
+            vo.stateTransit(Volume.Event.OperationFailed);
             throw new CloudRuntimeException(e.toString());
         }
     }
@@ -107,7 +107,7 @@ public class VolumeServiceImpl implements VolumeService {
     @Override
     public VolumeEntity allocateVolumeInDb(long size, VolumeType type, String volName, Long templateId) {
         VolumeVO vo = volDao.allocVolume(size, type, volName, templateId);
-        return new VolumeEntityImpl(new VolumeObject(null, vo));
+        return new VolumeEntityImpl(VolumeObject.getVolumeObject(null, vo), this);
     }
 
     @Override
@@ -118,10 +118,10 @@ public class VolumeServiceImpl implements VolumeService {
         }
 
         if (vo.getPoolId() == null) {
-            return new VolumeEntityImpl(new VolumeObject(null, vo));
+            return new VolumeEntityImpl(VolumeObject.getVolumeObject(null, vo), this);
         } else {
             PrimaryDataStore dataStore = dataStoreMgr.getPrimaryDataStore(vo.getPoolId());
-            return new VolumeEntityImpl(dataStore.getVolume(volumeId));
+            return new VolumeEntityImpl(dataStore.getVolume(volumeId), this);
         }
     }
 
@@ -164,16 +164,16 @@ public class VolumeServiceImpl implements VolumeService {
 
         VolumeObject vo = (VolumeObject) volume;
         try {
-            vo.stateTransit(VolumeEvent.CreateRequested);
+            vo.stateTransit(Volume.Event.CreateRequested);
         } catch (Exception e) {
             throw new CloudRuntimeException(e.toString());
         }
 
         try {
             volume = pd.createVoluemFromBaseImage(volume, templateOnPrimaryStore);
-            vo.stateTransit(VolumeEvent.OperationSucceeded);
+            vo.stateTransit(Volume.Event.OperationSucceeded);
         } catch (Exception e) {
-            vo.stateTransit(VolumeEvent.OperationFailed);
+            vo.stateTransit(Volume.Event.OperationFailed);
             throw new CloudRuntimeException(e.toString());
         }
         return volume;

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/550f4fbc/engine/storage/src/org/apache/cloudstack/storage/volume/db/VolumeDao.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/volume/db/VolumeDao.java b/engine/storage/src/org/apache/cloudstack/storage/volume/db/VolumeDao.java
index 85124ec..ccc1901 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/volume/db/VolumeDao.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/volume/db/VolumeDao.java
@@ -28,7 +28,7 @@ import com.cloud.utils.Pair;
 import com.cloud.utils.db.GenericDao;
 import com.cloud.utils.fsm.StateDao;
 
-public interface VolumeDao extends GenericDao<VolumeVO, Long>, StateDao<Volume.State, VolumeEvent, VolumeVO> {
+public interface VolumeDao extends GenericDao<VolumeVO, Long>, StateDao<Volume.State, Volume.Event, VolumeVO> {
 
     List<VolumeVO> findDetachedByAccount(long accountId);
 

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/550f4fbc/engine/storage/src/org/apache/cloudstack/storage/volume/db/VolumeDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/volume/db/VolumeDaoImpl.java b/engine/storage/src/org/apache/cloudstack/storage/volume/db/VolumeDaoImpl.java
index 59211a8..980e4f8 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/volume/db/VolumeDaoImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/volume/db/VolumeDaoImpl.java
@@ -335,7 +335,7 @@ public class VolumeDaoImpl extends GenericDaoBase<VolumeVO, Long> implements Vol
     }
 
     @Override
-    public boolean updateState(Volume.State currentState, VolumeEvent event, Volume.State nextState, VolumeVO vo, Object data) {
+    public boolean updateState(Volume.State currentState, Volume.Event event, Volume.State nextState, VolumeVO vo, Object data) {
 
         Long oldUpdated = vo.getUpdatedCount();
         Date oldUpdatedTime = vo.getUpdated();

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/550f4fbc/engine/storage/src/org/apache/cloudstack/storage/volume/db/VolumeVO.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/volume/db/VolumeVO.java b/engine/storage/src/org/apache/cloudstack/storage/volume/db/VolumeVO.java
index 04104f6..32e6e3b 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/volume/db/VolumeVO.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/volume/db/VolumeVO.java
@@ -141,16 +141,14 @@ public class VolumeVO implements Identity, StateObject<Volume.State> {
     @Column(name = "uuid")
     String uuid;
 
-    @Column(name = "reservation")
-    String reservationId;
-
     // Real Constructor
     public VolumeVO(long size, String type, String name, Long templateId) {
-        this.volumeType = type.toString();
+        this.volumeType = type;
         this.size = size;
         this.name = name;
         this.templateId = templateId;
         this.uuid = UUID.randomUUID().toString();
+        this.state = Volume.State.Allocated;
     }
 
     // Copy Constructor
@@ -398,14 +396,6 @@ public class VolumeVO implements Identity, StateObject<Volume.State> {
         }
     }
 
-    public String getReservationId() {
-        return this.reservationId;
-    }
-
-    public void setReservationId(String reserv) {
-        this.reservationId = reserv;
-    }
-
     @Override
     public String getUuid() {
         return this.uuid;

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/550f4fbc/engine/storage/test/org/apache/cloudstack/storage/test/volumeServiceTest.java
----------------------------------------------------------------------
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 d096cd5..2c83210 100644
--- a/engine/storage/test/org/apache/cloudstack/storage/test/volumeServiceTest.java
+++ b/engine/storage/test/org/apache/cloudstack/storage/test/volumeServiceTest.java
@@ -23,26 +23,43 @@ import static org.junit.Assert.*;
 import java.awt.List;
 import java.util.HashMap;
 import java.util.LinkedList;
+import java.util.Map;
+import java.util.UUID;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 
 import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
+import org.apache.cloudstack.engine.cloud.entity.api.TemplateEntity;
+import org.apache.cloudstack.engine.cloud.entity.api.VolumeEntity;
+import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreInfo;
 import org.apache.cloudstack.engine.subsystem.api.storage.disktype.QCOW2;
 import org.apache.cloudstack.engine.subsystem.api.storage.disktype.VHD;
 import org.apache.cloudstack.engine.subsystem.api.storage.disktype.VMDK;
 import org.apache.cloudstack.engine.subsystem.api.storage.disktype.VolumeDiskType;
 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.datastore.DefaultPrimaryDataStoreImpl;
+import org.apache.cloudstack.storage.datastore.lifecycle.PrimaryDataStoreLifeCycle;
 import org.apache.cloudstack.storage.datastore.provider.DefaultPrimaryDatastoreProviderImpl;
+import org.apache.cloudstack.storage.datastore.provider.PrimaryDataStoreProvider;
+import org.apache.cloudstack.storage.datastore.provider.PrimaryDataStoreProviderManager;
+import org.apache.cloudstack.storage.image.ImageService;
+import org.apache.cloudstack.storage.image.db.ImageDataDao;
+import org.apache.cloudstack.storage.image.db.ImageDataVO;
 import org.apache.cloudstack.storage.image.format.ISO;
 import org.apache.cloudstack.storage.image.format.ImageFormat;
 import org.apache.cloudstack.storage.image.format.ImageFormatHelper;
 import org.apache.cloudstack.storage.image.format.OVA;
 import org.apache.cloudstack.storage.image.format.Unknown;
+import org.apache.cloudstack.storage.image.provider.ImageDataStoreProvider;
 import org.apache.cloudstack.storage.image.provider.ImageDataStoreProviderManager;
+import org.apache.cloudstack.storage.image.store.ImageDataStore;
+import org.apache.cloudstack.storage.volume.VolumeService;
+import org.apache.cloudstack.storage.volume.db.VolumeDao;
+import org.apache.cloudstack.storage.volume.db.VolumeVO;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -54,31 +71,110 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 import org.mockito.Mockito.*;
 
 
+import com.cloud.storage.Storage.TemplateType;
 import com.cloud.utils.component.ComponentInject;
 import com.cloud.utils.db.DB;
+import com.cloud.utils.db.Transaction;
 
 @RunWith(SpringJUnit4ClassRunner.class)
 @ContextConfiguration(locations="classpath:/resource/storageContext.xml")
 public class volumeServiceTest {
     @Inject
     ImageDataStoreProviderManager imageProviderMgr;
+    @Inject
+    ImageService imageService;
+    @Inject
+    VolumeService volumeService;
+    @Inject
+    ImageDataDao imageDataDao;
+    @Inject
+    VolumeDao volumeDao;
+    @Inject
+    PrimaryDataStoreProviderManager primaryDataStoreProviderMgr;
 	@Before
 	public void setUp() {
 		
 	}
 	
-	@Test
-	public void test() {
+	private ImageDataVO createImageData() {
+	    ImageDataVO image = new ImageDataVO();
+        image.setTemplateType(TemplateType.USER);
+        image.setUrl("http://testurl/test.vhd");
+        image.setUniqueName(UUID.randomUUID().toString());
+        image.setName(UUID.randomUUID().toString());
+        image.setPublicTemplate(true);
+        image.setFeatured(true);
+        image.setRequireHvm(true);
+        image.setBits(64);
+        image.setFormat(new VHD().toString());
+        image.setAccountId(1);
+        image.setEnablePassword(true);
+        image.setEnableSshKey(true);
+        image.setGuestOSId(1);
+        image.setBootable(true);
+        image.setPrepopulate(true);
+        image.setCrossZones(true);
+        image.setExtractable(true);
+        image = imageDataDao.persist(image);
+        return image;
+	}
+	
+	private TemplateEntity createTemplate() {
 	    try {
-	        
             imageProviderMgr.configure("image Provider", new HashMap<String, Object>());
-            
+            ImageDataVO image = createImageData();
+            ImageDataStoreProvider defaultProvider = imageProviderMgr.getProvider("DefaultProvider");
+            ImageDataStore store = defaultProvider.registerDataStore("defaultHttpStore", new HashMap<String, String>());
+            imageService.registerTemplate(image.getId(), store.getImageDataStoreId());
+            TemplateEntity te = imageService.getTemplateEntity(image.getId());
+            return te;
+        } catch (ConfigurationException e) {
+            return null;
+        }
+	}
+	
+	@Test
+	public void createTemplateTest() {
+	    createTemplate();
+	}
+	
+	private PrimaryDataStoreInfo createPrimaryDataStore() {
+	    try {
+            primaryDataStoreProviderMgr.configure("primary data store mgr", new HashMap<String, Object>());
+            PrimaryDataStoreProvider provider = primaryDataStoreProviderMgr.getDataStoreProvider("default primary data store provider");
+            PrimaryDataStoreLifeCycle lifeCycle = provider.getDataStoreLifeCycle();
+            Map<String, String> params = new HashMap<String, String>();
+            params.put("url", "nfs://test/test");
+            params.put("dcId", "1");
+            params.put("name", "my primary data store");
+            PrimaryDataStoreInfo primaryDataStoreInfo = lifeCycle.registerDataStore(params);
+            return primaryDataStoreInfo;
         } catch (ConfigurationException e) {
-            // TODO Auto-generated catch block
-            e.printStackTrace();
+            return null;
         }
 	}
 	
+	@Test
+	public void createPrimaryDataStoreTest() {
+	    createPrimaryDataStore();
+	}
+	
+	private VolumeVO createVolume(long templateId) {
+	    VolumeVO volume = new VolumeVO(1000, new RootDisk().toString(), UUID.randomUUID().toString(), templateId);
+	    volume = volumeDao.persist(volume);
+	    return volume;
+	    
+	}
+	
+	@Test
+	public void createVolumeFromTemplate() {
+	    TemplateEntity te = createTemplate();
+	    PrimaryDataStoreInfo dataStoreInfo = createPrimaryDataStore();
+	    VolumeVO volume = createVolume(te.getId());
+	    VolumeEntity ve = volumeService.getVolumeEntity(volume.getId());
+	    ve.createVolumeFromTemplate(dataStoreInfo.getId(), new VHD(), te);
+	}
+	
 	//@Test
 	public void test1() {
 		System.out.println(VolumeTypeHelper.getType("Root"));
@@ -105,7 +201,7 @@ public class volumeServiceTest {
 	//@Test
 	public void testStaticBean() {
 		DefaultPrimaryDatastoreProviderImpl provider = ComponentInject.inject(DefaultPrimaryDatastoreProviderImpl.class);
-		assertNotNull(provider.dataStoreDao);
+		//assertNotNull(provider.dataStoreDao);
 		
 		DefaultPrimaryDataStoreImpl dpdsi = new DefaultPrimaryDataStoreImpl(null, null, null);
 		ComponentInject.inject(dpdsi);

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/550f4fbc/engine/storage/test/resource/storageContext.xml
----------------------------------------------------------------------
diff --git a/engine/storage/test/resource/storageContext.xml b/engine/storage/test/resource/storageContext.xml
index 0dab1f5..dbc997f 100644
--- a/engine/storage/test/resource/storageContext.xml
+++ b/engine/storage/test/resource/storageContext.xml
@@ -12,6 +12,7 @@
                                           http://www.springframework.org/schema/context/spring-context-3.0.xsd">
   <context:annotation-config />
   <context:component-scan base-package="org.apache.cloudstack.storage" />
+  <context:component-scan base-package="org.apache.cloudstack.engine.subsystem.api.storage" />
   <context:component-scan base-package="com.cloud.utils.db" />
   <context:component-scan base-package="com.cloud.utils.component" />
   
@@ -28,36 +29,7 @@
     
 
   </aop:config>
-  <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
-    <property name="entityManagerFactory" ref="entityManagerFactory" />
-  </bean>
-
-  <bean id="dataSource"
-    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
-    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
-    <property name="url" value="jdbc:mysql://localhost:3306/cloud" />
-    <property name="username" value="root" />
-    <property name="password" value="" />
-  </bean>
-
-  <bean id="openJpaVendorAdapter"
-    class="org.springframework.orm.jpa.vendor.OpenJpaVendorAdapter">
-    <property name="showSql" value="true" />
-    <property name="databasePlatform"
-      value="org.apache.openjpa.jdbc.sql.MySQLDictionary" />
-  </bean>
-
-  <bean id="entityManagerFactory"
-    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
-    <property name="dataSource" ref="dataSource" />
-    <property name="jpaVendorAdapter" ref="openJpaVendorAdapter" />
-    <property name="packagesToScan" value="org.apache.cloudstack.storage" />
-  </bean>
-
-  <bean id="sharedEntityManager"
-    class="org.springframework.orm.jpa.support.SharedEntityManagerBean">
-    <property name="entityManagerFactory" ref="entityManagerFactory" />
-  </bean>
+ 
 
   <bean id="someDependencyMock" class="org.apache.cloudstack.storage.test.StorageFactoryBean">
     <constructor-arg name="classToBeMocked"

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/550f4fbc/server/src/com/cloud/upgrade/DatabaseCreator.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/upgrade/DatabaseCreator.java b/server/src/com/cloud/upgrade/DatabaseCreator.java
index f6a5017..079e1e9 100755
--- a/server/src/com/cloud/upgrade/DatabaseCreator.java
+++ b/server/src/com/cloud/upgrade/DatabaseCreator.java
@@ -106,8 +106,8 @@ public class DatabaseCreator {
                     System.exit(1);
                 }
 
-                SystemIntegrityChecker checker = (SystemIntegrityChecker)ComponentLocator.inject(clazz);
-                checker.check();
+                //SystemIntegrityChecker checker = (SystemIntegrityChecker)ComponentLocator.inject(clazz);
+                //checker.check();
             }
         }
     }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/550f4fbc/setup/db/4.1-new-db-schema.sql
----------------------------------------------------------------------
diff --git a/setup/db/4.1-new-db-schema.sql b/setup/db/4.1-new-db-schema.sql
new file mode 100644
index 0000000..7be4b09
--- /dev/null
+++ b/setup/db/4.1-new-db-schema.sql
@@ -0,0 +1,41 @@
+-- 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.
+
+alter table vm_template add image_data_store_id bigint unsigned;
+alter table storage_pool add storage_provider_id bigint unsigned; 
+alter table storage_pool modify id bigint unsigned AUTO_INCREMENT UNIQUE NOT NULL;
+alter table volumes add disk_type varchar(255);
+alter table volumes drop foreign key `fk_volumes__account_id`;
+CREATE TABLE `cloud`.`primary_data_store_provider` (
+  `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
+  `name` varchar(255) NOT NULL COMMENT 'name of primary data store provider',
+  PRIMARY KEY(`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;
+
+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;

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/550f4fbc/setup/db/create-schema.sql
----------------------------------------------------------------------
diff --git a/setup/db/create-schema.sql b/setup/db/create-schema.sql
index aa5867f..3d66f75 100755
--- a/setup/db/create-schema.sql
+++ b/setup/db/create-schema.sql
@@ -1500,7 +1500,6 @@ CREATE TABLE  `cloud`.`storage_pool` (
   `created` datetime COMMENT 'date the pool created',
   `removed` datetime COMMENT 'date removed if not null',
   `update_time` DATETIME,
-  `storage_provider` varchar(255) NOT NULL,
   `status` varchar(32),
   PRIMARY KEY  (`id`),
   CONSTRAINT `fk_storage_pool__pod_id` FOREIGN KEY `fk_storage_pool__pod_id` (`pod_id`) REFERENCES `host_pod_ref` (`id`) ON DELETE CASCADE,
@@ -2372,5 +2371,19 @@ 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;