From 0debd8a393b6173dfe88cb80cd672e723072ee73 Mon Sep 17 00:00:00 2001 From: Edison Su Date: Mon, 29 Oct 2012 09:32:28 -0700 Subject: [PATCH] add more classes --- .../apache/cloudstack/storage/EndPoint.java | 5 ++ .../DefaultPrimaryDataStoreImpl.java | 63 +++++++++++++++++++ .../storage/datastore/PrimaryDataStore.java | 4 ++ .../DefaultPrimaryDataStoreDriverImpl.java | 35 +++++++++++ .../driver/PrimaryDataStoreDriver.java | 11 ++++ .../DefaultPrimaryDatastoreProviderImpl.java | 18 ++++++ .../provider/PrimaryDataStoreProvider.java | 7 +++ .../PrimaryDataStoreProviderManager.java | 5 ++ .../cloudstack/storage/volume/Volume.java | 19 +++++- .../volume/disktype/VolumeDiskType.java | 1 - .../volume/disktype/VolumeDiskTypeBase.java | 15 ++++- .../storage/test/storageContext.xml | 1 + .../storage/test/volumeServiceTest.java | 17 +++++ .../utils/component/ComponentInject.java | 20 ++++++ 14 files changed, 215 insertions(+), 6 deletions(-) create mode 100644 platform/storage/src/org/apache/cloudstack/storage/EndPoint.java create mode 100644 platform/storage/src/org/apache/cloudstack/storage/datastore/DefaultPrimaryDataStoreImpl.java create mode 100644 platform/storage/src/org/apache/cloudstack/storage/datastore/driver/DefaultPrimaryDataStoreDriverImpl.java create mode 100644 platform/storage/src/org/apache/cloudstack/storage/datastore/driver/PrimaryDataStoreDriver.java create mode 100644 platform/storage/src/org/apache/cloudstack/storage/datastore/provider/DefaultPrimaryDatastoreProviderImpl.java create mode 100644 platform/storage/src/org/apache/cloudstack/storage/datastore/provider/PrimaryDataStoreProvider.java create mode 100644 platform/storage/src/org/apache/cloudstack/storage/datastore/provider/PrimaryDataStoreProviderManager.java create mode 100644 utils/src/com/cloud/utils/component/ComponentInject.java diff --git a/platform/storage/src/org/apache/cloudstack/storage/EndPoint.java b/platform/storage/src/org/apache/cloudstack/storage/EndPoint.java new file mode 100644 index 00000000000..8cb01a13fc7 --- /dev/null +++ b/platform/storage/src/org/apache/cloudstack/storage/EndPoint.java @@ -0,0 +1,5 @@ +package org.apache.cloudstack.storage; + +public interface EndPoint { + public String getEndPoint(); +} diff --git a/platform/storage/src/org/apache/cloudstack/storage/datastore/DefaultPrimaryDataStoreImpl.java b/platform/storage/src/org/apache/cloudstack/storage/datastore/DefaultPrimaryDataStoreImpl.java new file mode 100644 index 00000000000..54f535b5162 --- /dev/null +++ b/platform/storage/src/org/apache/cloudstack/storage/datastore/DefaultPrimaryDataStoreImpl.java @@ -0,0 +1,63 @@ +package org.apache.cloudstack.storage.datastore; + +import java.util.List; + +import javax.inject.Inject; + +import org.apache.cloudstack.storage.datastore.driver.PrimaryDataStoreDriver; +import org.apache.cloudstack.storage.volume.Volume; +import org.apache.cloudstack.storage.volume.db.VolumeDao; +import org.apache.cloudstack.storage.volume.db.VolumeVO; +import org.apache.cloudstack.storage.volume.disktype.VolumeDiskType; + +public class DefaultPrimaryDataStoreImpl implements PrimaryDataStore { + protected PrimaryDataStoreDriver driver; + protected List supportedDiskTypes; + @Inject + VolumeDao volumeDao; + public DefaultPrimaryDataStoreImpl(PrimaryDataStoreDriver driver, List types) { + this.driver = driver; + this.supportedDiskTypes = types; + } + + @Override + public Volume getVolume(long id) { + VolumeVO volumeVO = volumeDao.findById(id); + Volume vol = new Volume(this, volumeVO); + return vol; + } + + @Override + public List getVolumes() { + // TODO Auto-generated method stub + return null; + } + + @Override + public boolean deleteVolume(long id) { + // TODO Auto-generated method stub + return false; + } + + @Override + public Volume createVolume(long id, VolumeDiskType diskType) { + Volume vol = this.getVolume(id); + if (vol == null) { + return null; + } + + if (!this.getSupportedDiskTypes().contains(diskType)) { + return null; + } + + vol.setVolumeDiskType(diskType); + this.driver.createVolume(vol); + vol.update(); + return vol; + } + + @Override + public List getSupportedDiskTypes() { + return this.supportedDiskTypes; + } +} diff --git a/platform/storage/src/org/apache/cloudstack/storage/datastore/PrimaryDataStore.java b/platform/storage/src/org/apache/cloudstack/storage/datastore/PrimaryDataStore.java index 6fc4ed0c5c7..e7ff49a05fd 100644 --- a/platform/storage/src/org/apache/cloudstack/storage/datastore/PrimaryDataStore.java +++ b/platform/storage/src/org/apache/cloudstack/storage/datastore/PrimaryDataStore.java @@ -18,11 +18,15 @@ */ package org.apache.cloudstack.storage.datastore; +import java.util.List; + import org.apache.cloudstack.storage.volume.Volume; import org.apache.cloudstack.storage.volume.disktype.VolumeDiskType; public interface PrimaryDataStore { Volume getVolume(long id); + List getVolumes(); boolean deleteVolume(long id); Volume createVolume(long id, VolumeDiskType diskType); + List getSupportedDiskTypes(); } diff --git a/platform/storage/src/org/apache/cloudstack/storage/datastore/driver/DefaultPrimaryDataStoreDriverImpl.java b/platform/storage/src/org/apache/cloudstack/storage/datastore/driver/DefaultPrimaryDataStoreDriverImpl.java new file mode 100644 index 00000000000..d1e69768552 --- /dev/null +++ b/platform/storage/src/org/apache/cloudstack/storage/datastore/driver/DefaultPrimaryDataStoreDriverImpl.java @@ -0,0 +1,35 @@ +package org.apache.cloudstack.storage.datastore.driver; + +import org.apache.cloudstack.storage.EndPoint; +import org.apache.cloudstack.storage.volume.Volume; +import org.springframework.stereotype.Component; + +@Component +public class DefaultPrimaryDataStoreDriverImpl implements + PrimaryDataStoreDriver { + + @Override + public boolean createVolume(Volume vol) { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean deleteVolume(Volume vo) { + // TODO Auto-generated method stub + return false; + } + + @Override + public String grantAccess(Volume vol, EndPoint ep) { + // TODO Auto-generated method stub + return null; + } + + @Override + public boolean revokeAccess(Volume vol, EndPoint ep) { + // TODO Auto-generated method stub + return false; + } + +} diff --git a/platform/storage/src/org/apache/cloudstack/storage/datastore/driver/PrimaryDataStoreDriver.java b/platform/storage/src/org/apache/cloudstack/storage/datastore/driver/PrimaryDataStoreDriver.java new file mode 100644 index 00000000000..a35118a97b6 --- /dev/null +++ b/platform/storage/src/org/apache/cloudstack/storage/datastore/driver/PrimaryDataStoreDriver.java @@ -0,0 +1,11 @@ +package org.apache.cloudstack.storage.datastore.driver; + +import org.apache.cloudstack.storage.EndPoint; +import org.apache.cloudstack.storage.volume.Volume; + +public interface PrimaryDataStoreDriver { + boolean createVolume(Volume vol); + boolean deleteVolume(Volume vo); + String grantAccess(Volume vol, EndPoint ep); + boolean revokeAccess(Volume vol, EndPoint ep); +} diff --git a/platform/storage/src/org/apache/cloudstack/storage/datastore/provider/DefaultPrimaryDatastoreProviderImpl.java b/platform/storage/src/org/apache/cloudstack/storage/datastore/provider/DefaultPrimaryDatastoreProviderImpl.java new file mode 100644 index 00000000000..dd7e061519f --- /dev/null +++ b/platform/storage/src/org/apache/cloudstack/storage/datastore/provider/DefaultPrimaryDatastoreProviderImpl.java @@ -0,0 +1,18 @@ +package org.apache.cloudstack.storage.datastore.provider; + +import javax.inject.Inject; + +import org.apache.cloudstack.storage.datastore.PrimaryDataStore; +import org.apache.cloudstack.storage.datastore.driver.PrimaryDataStoreDriver; + +public class DefaultPrimaryDatastoreProviderImpl implements + PrimaryDataStoreProvider { + @Inject + public PrimaryDataStoreDriver driver; + @Override + public PrimaryDataStore getDataStore(String dataStoreId) { + // TODO Auto-generated method stub + return null; + } + +} diff --git a/platform/storage/src/org/apache/cloudstack/storage/datastore/provider/PrimaryDataStoreProvider.java b/platform/storage/src/org/apache/cloudstack/storage/datastore/provider/PrimaryDataStoreProvider.java new file mode 100644 index 00000000000..8a8d1012a21 --- /dev/null +++ b/platform/storage/src/org/apache/cloudstack/storage/datastore/provider/PrimaryDataStoreProvider.java @@ -0,0 +1,7 @@ +package org.apache.cloudstack.storage.datastore.provider; + +import org.apache.cloudstack.storage.datastore.PrimaryDataStore; + +public interface PrimaryDataStoreProvider { + public PrimaryDataStore getDataStore(String dataStoreId); +} diff --git a/platform/storage/src/org/apache/cloudstack/storage/datastore/provider/PrimaryDataStoreProviderManager.java b/platform/storage/src/org/apache/cloudstack/storage/datastore/provider/PrimaryDataStoreProviderManager.java new file mode 100644 index 00000000000..a01c96c0dbc --- /dev/null +++ b/platform/storage/src/org/apache/cloudstack/storage/datastore/provider/PrimaryDataStoreProviderManager.java @@ -0,0 +1,5 @@ +package org.apache.cloudstack.storage.datastore.provider; + +public interface PrimaryDataStoreProviderManager { + public PrimaryDataStoreProvider getDataStoreProvider(String providerUuid); +} diff --git a/platform/storage/src/org/apache/cloudstack/storage/volume/Volume.java b/platform/storage/src/org/apache/cloudstack/storage/volume/Volume.java index 6780f602698..fb1c37d6580 100644 --- a/platform/storage/src/org/apache/cloudstack/storage/volume/Volume.java +++ b/platform/storage/src/org/apache/cloudstack/storage/volume/Volume.java @@ -3,6 +3,8 @@ package org.apache.cloudstack.storage.volume; import javax.inject.Inject; import org.apache.cloudstack.platform.subsystem.api.storage.DataStore; +import org.apache.cloudstack.storage.datastore.PrimaryDataStore; +import org.apache.cloudstack.storage.volume.db.VolumeDao; import org.apache.cloudstack.storage.volume.db.VolumeVO; import org.apache.cloudstack.storage.volume.disktype.VolumeDiskType; import org.apache.cloudstack.storage.volume.disktype.VolumeDiskTypeHelper; @@ -13,13 +15,15 @@ import com.cloud.utils.fsm.StateObject; public class Volume implements StateObject { protected VolumeVO volumeVO; - protected DataStore dataStore; + protected PrimaryDataStore dataStore; @Inject VolumeDiskTypeHelper diskTypeHelper; @Inject VolumeTypeHelper volumeTypeHelper; + @Inject + VolumeDao volumeDao; - public Volume(DataStore dataStore, VolumeVO volumeVO) { + public Volume(PrimaryDataStore dataStore, VolumeVO volumeVO) { this.volumeVO = volumeVO; this.dataStore = dataStore; } @@ -29,7 +33,7 @@ public class Volume implements StateObject { return volumeVO.getState(); } - public DataStore getDataStore() { + public PrimaryDataStore getDataStore() { return dataStore; } @@ -44,4 +48,13 @@ public class Volume implements StateObject { public VolumeType getType() { return volumeTypeHelper.getType(volumeVO.getVolumeType()); } + + public void setVolumeDiskType(VolumeDiskType type) { + volumeVO.setDiskType(type.toString()); + } + + public void update() { + volumeDao.update(volumeVO.getId(), volumeVO); + volumeVO = volumeDao.findById(volumeVO.getId()); + } } diff --git a/platform/storage/src/org/apache/cloudstack/storage/volume/disktype/VolumeDiskType.java b/platform/storage/src/org/apache/cloudstack/storage/volume/disktype/VolumeDiskType.java index c2d280411c2..1832fe3483a 100644 --- a/platform/storage/src/org/apache/cloudstack/storage/volume/disktype/VolumeDiskType.java +++ b/platform/storage/src/org/apache/cloudstack/storage/volume/disktype/VolumeDiskType.java @@ -1,5 +1,4 @@ package org.apache.cloudstack.storage.volume.disktype; public interface VolumeDiskType { - boolean equals(String diskType); } diff --git a/platform/storage/src/org/apache/cloudstack/storage/volume/disktype/VolumeDiskTypeBase.java b/platform/storage/src/org/apache/cloudstack/storage/volume/disktype/VolumeDiskTypeBase.java index 1ee314128b3..083d49c6f2c 100644 --- a/platform/storage/src/org/apache/cloudstack/storage/volume/disktype/VolumeDiskTypeBase.java +++ b/platform/storage/src/org/apache/cloudstack/storage/volume/disktype/VolumeDiskTypeBase.java @@ -4,12 +4,23 @@ public class VolumeDiskTypeBase implements VolumeDiskType { protected String type = "Unknown"; @Override - public boolean equals(String diskType) { - if (getType().equalsIgnoreCase(diskType)) { + public boolean equals(Object that) { + if (this == that) { return true; + } + if (that instanceof String) { + if (getType().equalsIgnoreCase((String)that)) { + return true; + } + } else if (that instanceof VolumeDiskTypeBase) { + VolumeDiskTypeBase th = (VolumeDiskTypeBase)that; + if (this.getType().equalsIgnoreCase(th.getType())) { + return true; + } } else { return false; } + return false; } @Override diff --git a/platform/storage/test/org/apache/cloudstack/storage/test/storageContext.xml b/platform/storage/test/org/apache/cloudstack/storage/test/storageContext.xml index 508848a7428..c32004bb61d 100644 --- a/platform/storage/test/org/apache/cloudstack/storage/test/storageContext.xml +++ b/platform/storage/test/org/apache/cloudstack/storage/test/storageContext.xml @@ -13,6 +13,7 @@ + diff --git a/platform/storage/test/org/apache/cloudstack/storage/test/volumeServiceTest.java b/platform/storage/test/org/apache/cloudstack/storage/test/volumeServiceTest.java index 7f4f82605d2..b8229e4b4e8 100644 --- a/platform/storage/test/org/apache/cloudstack/storage/test/volumeServiceTest.java +++ b/platform/storage/test/org/apache/cloudstack/storage/test/volumeServiceTest.java @@ -25,9 +25,13 @@ import java.util.LinkedList; import javax.inject.Inject; +import org.apache.cloudstack.storage.datastore.provider.DefaultPrimaryDatastoreProviderImpl; +import org.apache.cloudstack.storage.datastore.provider.PrimaryDataStoreProvider; import org.apache.cloudstack.storage.volume.VolumeMotionService; import org.apache.cloudstack.storage.volume.VolumeService; import org.apache.cloudstack.storage.volume.db.VolumeDao; +import org.apache.cloudstack.storage.volume.disktype.VHD; +import org.apache.cloudstack.storage.volume.disktype.VMDK; import org.apache.cloudstack.storage.volume.disktype.VolumeDiskTypeHelper; import org.apache.cloudstack.storage.volume.type.VolumeTypeHelper; import org.junit.Before; @@ -36,11 +40,13 @@ import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.config.AutowireCapableBeanFactory; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.mockito.Mockito.*; +import com.cloud.utils.component.ComponentInject; import com.cloud.utils.db.DB; @@ -86,5 +92,16 @@ public class volumeServiceTest { public void test1() { System.out.println(volTypeHelper.getType("Root")); System.out.println(volDiskTypeHelper.getDiskType("vmdk")); + assertFalse(new VMDK().equals(new VHD())); + VMDK vmdk = new VMDK(); + assertTrue(vmdk.equals(vmdk)); + VMDK newvmdk = new VMDK(); + assertTrue(vmdk.equals(newvmdk)); + } + + @Test + public void testStaticBean() { + DefaultPrimaryDatastoreProviderImpl provider = ComponentInject.inject(DefaultPrimaryDatastoreProviderImpl.class); + assertNotNull(provider.driver); } } diff --git a/utils/src/com/cloud/utils/component/ComponentInject.java b/utils/src/com/cloud/utils/component/ComponentInject.java new file mode 100644 index 00000000000..4578ea19e67 --- /dev/null +++ b/utils/src/com/cloud/utils/component/ComponentInject.java @@ -0,0 +1,20 @@ +package com.cloud.utils.component; + +import javax.inject.Inject; + +import org.springframework.beans.factory.config.AutowireCapableBeanFactory; +import org.springframework.stereotype.Component; + +@Component +public class ComponentInject { + + private static AutowireCapableBeanFactory beanFactory; + @Inject + private void setbeanFactory(AutowireCapableBeanFactory bf) { + ComponentInject.beanFactory = bf; + } + + public static T inject(Class clazz) { + return beanFactory.createBean(clazz); + } +}