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;
