diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStoreInfo.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStoreInfo.java index c818522d337..11bc26b3249 100644 --- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStoreInfo.java +++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStoreInfo.java @@ -41,4 +41,5 @@ public interface PrimaryDataStoreInfo { public String getType(); public PrimaryDataStoreLifeCycle getLifeCycle(); PrimaryDataStoreProvider getProvider(); + } diff --git a/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/ChildTestConfiguration.java b/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/ChildTestConfiguration.java index 27a8513e1c5..69907bc790b 100644 --- a/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/ChildTestConfiguration.java +++ b/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/ChildTestConfiguration.java @@ -24,7 +24,7 @@ public class ChildTestConfiguration extends TestConfiguration { @Bean public HostEndpointRpcServer rpcServer() { - return new MockHypervsiorHostEndPointRpcServer(); + return new MockHostEndpointRpcServerDirectCallResource(); } /* @Override @Bean diff --git a/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/CloudStackTestNGBase.java b/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/CloudStackTestNGBase.java index 94ae2088d91..5bc7c0d2d27 100644 --- a/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/CloudStackTestNGBase.java +++ b/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/CloudStackTestNGBase.java @@ -6,6 +6,7 @@ import org.springframework.test.context.testng.AbstractTestNGSpringContextTests; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Parameters; +import org.testng.annotations.Test; import com.cloud.utils.db.DB; import com.cloud.utils.db.Transaction; @@ -17,13 +18,23 @@ public class CloudStackTestNGBase extends AbstractTestNGSpringContextTests { private String hostGuid; private String templateUrl; private String localStorageUuid; + private String primaryStorageUrl; private Transaction txn; + protected void injectMockito() { + + } + @BeforeMethod(alwaysRun = true) protected void injectDB(Method testMethod) throws Exception { txn = Transaction.open(testMethod.getName()); } + @Test + protected void injectMockitoTest() { + injectMockito(); + } + @AfterMethod(alwaysRun = true) protected void closeDB(Method testMethod) throws Exception { if (txn != null) { @@ -32,14 +43,19 @@ public class CloudStackTestNGBase extends AbstractTestNGSpringContextTests { } @BeforeMethod(alwaysRun = true) - @Parameters({"devcloud-host-uuid", "devcloud-host-gateway", "devcloud-host-cidr", "devcloud-host-ip", "template-url", "devcloud-local-storage-uuid"}) - protected void setup(String hostuuid, String gateway, String cidr, String hostIp, String templateUrl, String localStorageUuid) { + @Parameters({"devcloud-host-uuid", "devcloud-host-gateway", "devcloud-host-cidr", + "devcloud-host-ip", "template-url", "devcloud-local-storage-uuid", + "primary-storage-want-to-add"}) + protected void setup(String hostuuid, String gateway, String cidr, + String hostIp, String templateUrl, String localStorageUuid, + String primaryStorage) { this.hostGuid = hostuuid; this.hostGateway = gateway; this.hostCidr = cidr; this.hostIp = hostIp; this.templateUrl = templateUrl; this.localStorageUuid = localStorageUuid; + this.primaryStorageUrl = primaryStorage; } protected String getHostGuid() { @@ -65,4 +81,8 @@ public class CloudStackTestNGBase extends AbstractTestNGSpringContextTests { protected String getLocalStorageUuid() { return this.localStorageUuid; } + + protected String getPrimaryStorageUrl() { + return this.primaryStorageUrl; + } } diff --git a/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/MockHostEndpointRpcServerDirectCallResource.java b/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/MockHostEndpointRpcServerDirectCallResource.java index f2272ce58b9..a9700cafefe 100644 --- a/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/MockHostEndpointRpcServerDirectCallResource.java +++ b/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/MockHostEndpointRpcServerDirectCallResource.java @@ -37,6 +37,9 @@ import com.cloud.agent.api.Answer; import com.cloud.agent.api.Command; import com.cloud.exception.AgentUnavailableException; import com.cloud.exception.OperationTimedoutException; +import com.cloud.utils.component.ComponentInject; +import com.cloud.utils.db.DB; +import com.cloud.utils.db.Transaction; public class MockHostEndpointRpcServerDirectCallResource implements HostEndpointRpcServer { @@ -47,29 +50,14 @@ public class MockHostEndpointRpcServerDirectCallResource implements HostEndpoint public MockHostEndpointRpcServerDirectCallResource() { executor = Executors.newScheduledThreadPool(10); } - protected class MockRpcCallBack implements Runnable { - private final Command cmd; - private final long hostId; - private final AsyncCompletionCallback callback; - public MockRpcCallBack(long hostId, Command cmd, final AsyncCompletionCallback callback) { - this.cmd = cmd; - this.callback = callback; - this.hostId = hostId; - } - @Override - public void run() { - try { - Answer answer = agentMgr.send(hostId, cmd); - callback.complete(answer); - } catch (Exception e) { - s_logger.debug("send command failed:" + e.toString()); - } - } - - } public void sendCommandAsync(HypervisorHostEndPoint host, final Command command, final AsyncCompletionCallback callback) { - executor.schedule(new MockRpcCallBack(host.getHostId(), command, callback), 10, TimeUnit.SECONDS); + // new MockRpcCallBack(host.getHostId(), command, callback); + MockRpcCallBack run = ComponentInject.inject(MockRpcCallBack.class); + run.setCallback(callback); + run.setCmd(command); + run.setHostId(host.getHostId()); + executor.schedule(run, 10, TimeUnit.SECONDS); } @Override diff --git a/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/MockRpcCallBack.java b/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/MockRpcCallBack.java new file mode 100644 index 00000000000..294cb1ed8fa --- /dev/null +++ b/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/MockRpcCallBack.java @@ -0,0 +1,46 @@ +package org.apache.cloudstack.storage.test; + +import javax.inject.Inject; + +import org.apache.cloudstack.framework.async.AsyncCompletionCallback; + +import com.cloud.agent.AgentManager; +import com.cloud.agent.api.Answer; +import com.cloud.agent.api.Command; +import com.cloud.utils.db.DB; +import com.cloud.utils.db.Transaction; + +public class MockRpcCallBack implements Runnable { + @Inject + AgentManager agentMgr; + private Command cmd; + private long hostId; + private AsyncCompletionCallback callback; + + public void setCmd(Command cmd) { + this.cmd = cmd; + } + + public void setHostId(long hostId) { + this.hostId = hostId; + } + + public void setCallback(AsyncCompletionCallback callback) { + this.callback = callback; + } + + @Override + @DB + public void run() { + try { + Answer answer = agentMgr.send(hostId, cmd); + + callback.complete(answer); + } catch (Throwable e) { + //s_logger.debug("send command failed:" + e.toString()); + } finally { + int i =1; + } + } + +} diff --git a/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/volumeServiceTest.java b/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/volumeServiceTest.java index cd251b15074..7451f362396 100644 --- a/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/volumeServiceTest.java +++ b/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/volumeServiceTest.java @@ -18,8 +18,9 @@ */ package org.apache.cloudstack.storage.test; -import static org.junit.Assert.*; - +import org.testng.annotations.Test; +import org.testng.annotations.BeforeMethod; +import org.testng.AssertJUnit; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedList; @@ -51,7 +52,6 @@ import org.apache.cloudstack.storage.command.CreateVolumeFromBaseImageCommand; import org.apache.cloudstack.storage.datastore.DefaultPrimaryDataStore; import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreVO; -import org.apache.cloudstack.storage.datastore.provider.DefaultPrimaryDatastoreProviderImpl; import org.apache.cloudstack.storage.datastore.provider.PrimaryDataStoreProviderManager; import org.apache.cloudstack.storage.image.ImageService; import org.apache.cloudstack.storage.image.db.ImageDataDao; @@ -68,14 +68,7 @@ import org.apache.cloudstack.storage.image.store.lifecycle.ImageDataStoreLifeCyc 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; - -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.*; @@ -100,13 +93,9 @@ 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; -import com.cloud.utils.db.Transaction; -@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations="classpath:/storageContext.xml") -public class volumeServiceTest { +public class volumeServiceTest extends CloudStackTestNGBase { @Inject ImageDataStoreProviderManager imageProviderMgr; @Inject @@ -134,8 +123,19 @@ public class volumeServiceTest { Long dcId; Long clusterId; Long podId; - @Before + HostVO host; + String primaryName = "my primary data store"; + + @Test(priority = -1) public void setUp() { + + host = hostDao.findByGuid(this.getHostGuid()); + if (host != null) { + dcId = host.getDataCenterId(); + clusterId = host.getClusterId(); + podId = host.getPodId(); + return; + } //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); @@ -143,7 +143,7 @@ public class volumeServiceTest { 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"); + HostPodVO pod = new HostPodVO(UUID.randomUUID().toString(), dc.getId(), this.getHostGateway(), this.getHostCidr(), 8, "test"); pod = podDao.persist(pod); podId = pod.getId(); //create xen cluster @@ -155,23 +155,23 @@ public class volumeServiceTest { clusterId = cluster.getId(); //create xen host - HostVO host = new HostVO(UUID.randomUUID().toString()); + host = new HostVO(this.getHostGuid()); host.setName("devcloud xen host"); host.setType(Host.Type.Routing); - host.setPrivateIpAddress("192.168.56.2"); + host.setPrivateIpAddress(this.getHostIp()); host.setDataCenterId(dc.getId()); host.setVersion("6.0.1"); host.setAvailable(true); host.setSetup(true); + host.setPodId(podId); host.setLastPinged(0); host.setResourceState(ResourceState.Enabled); + host.setHypervisorType(HypervisorType.XenServer); 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 { @@ -187,11 +187,22 @@ public class volumeServiceTest { //Mockito.when(primaryStoreDao.findById(Mockito.anyLong())).thenReturn(primaryStore); } + + @Override + protected void injectMockito() { + if (host == null) { + return; + } + List results = new ArrayList(); + results.add(host); + Mockito.when(hostDao.listAll()).thenReturn(results); + Mockito.when(hostDao.findHypervisorHostInCluster(Mockito.anyLong())).thenReturn(results); + } private ImageDataVO createImageData() { ImageDataVO image = new ImageDataVO(); image.setTemplateType(TemplateType.USER); - image.setUrl("http://testurl/test.vhd"); + image.setUrl(this.getTemplateUrl()); image.setUniqueName(UUID.randomUUID().toString()); image.setName(UUID.randomUUID().toString()); image.setPublicTemplate(true); @@ -226,21 +237,29 @@ public class volumeServiceTest { } } - @Test public void createTemplateTest() { createTemplate(); } private PrimaryDataStoreInfo createPrimaryDataStore() { try { - primaryDataStoreProviderMgr.configure("primary data store mgr", new HashMap()); - PrimaryDataStoreProvider provider = primaryDataStoreProviderMgr.getDataStoreProvider("default primary data store provider"); - + PrimaryDataStoreProvider provider = primaryDataStoreProviderMgr.getDataStoreProvider("default primary data store provider"); + primaryDataStoreProviderMgr.configure("primary data store mgr", new HashMap()); + + List ds = primaryStoreDao.findPoolByName(this.primaryName); + if (ds.size() >= 1) { + PrimaryDataStoreVO store = ds.get(0); + if (store.getRemoved() == null) { + return provider.getDataStore(store.getId()); + } + } + + Map params = new HashMap(); - params.put("url", "nfs://localhost/primarynfs"); + params.put("url", this.getPrimaryStorageUrl()); params.put("dcId", dcId.toString()); params.put("clusterId", clusterId.toString()); - params.put("name", "my primary data store"); + params.put("name", this.primaryName); PrimaryDataStoreInfo primaryDataStoreInfo = provider.registerDataStore(params); PrimaryDataStoreLifeCycle lc = primaryDataStoreInfo.getLifeCycle(); ClusterScope scope = new ClusterScope(clusterId, podId, dcId); @@ -251,11 +270,6 @@ public class volumeServiceTest { } } - @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); @@ -263,7 +277,7 @@ public class volumeServiceTest { } - @Test + @Test(priority=2) public void createVolumeFromTemplate() { TemplateEntity te = createTemplate(); PrimaryDataStoreInfo dataStoreInfo = createPrimaryDataStore(); @@ -271,37 +285,40 @@ public class volumeServiceTest { VolumeEntity ve = volumeService.getVolumeEntity(volume.getId()); ve.createVolumeFromTemplate(dataStoreInfo.getId(), new VHD(), te); } + + @Test(priority=3) + public void tearDown() { + List ds = primaryStoreDao.findPoolByName(this.primaryName); + for (int i = 0; i < ds.size(); i++) { + PrimaryDataStoreVO store = ds.get(i); + store.setUuid(null); + primaryStoreDao.remove(ds.get(i).getId()); + primaryStoreDao.expunge(ds.get(i).getId()); + } + } //@Test - public void test1() { + @Test + public void test1() { System.out.println(VolumeTypeHelper.getType("Root")); System.out.println(VolumeDiskTypeHelper.getDiskType("vmdk")); System.out.println(ImageFormatHelper.getFormat("ova")); - assertFalse(new VMDK().equals(new VHD())); + AssertJUnit.assertFalse(new VMDK().equals(new VHD())); VMDK vmdk = new VMDK(); - assertTrue(vmdk.equals(vmdk)); + AssertJUnit.assertTrue(vmdk.equals(vmdk)); VMDK newvmdk = new VMDK(); - assertTrue(vmdk.equals(newvmdk)); + AssertJUnit.assertTrue(vmdk.equals(newvmdk)); ImageFormat ova = new OVA(); ImageFormat iso = new ISO(); - assertTrue(ova.equals(new OVA())); - assertFalse(ova.equals(iso)); - assertTrue(ImageFormatHelper.getFormat("test").equals(new Unknown())); + AssertJUnit.assertTrue(ova.equals(new OVA())); + AssertJUnit.assertFalse(ova.equals(iso)); + AssertJUnit.assertTrue(ImageFormatHelper.getFormat("test").equals(new Unknown())); VolumeDiskType qcow2 = new QCOW2(); ImageFormat qcow2format = new org.apache.cloudstack.storage.image.format.QCOW2(); - assertFalse(qcow2.equals(qcow2format)); + AssertJUnit.assertFalse(qcow2.equals(qcow2format)); } - //@Test - public void testStaticBean() { - DefaultPrimaryDatastoreProviderImpl provider = ComponentInject.inject(DefaultPrimaryDatastoreProviderImpl.class); - //assertNotNull(provider.dataStoreDao); - - DefaultPrimaryDataStore dpdsi = DefaultPrimaryDataStore.createDataStore(null); - //assertNotNull(dpdsi.volumeDao); - } - } diff --git a/engine/storage/integration-test/test/resource/testng.xml b/engine/storage/integration-test/test/resource/testng.xml index b2531d17d93..186c542c890 100644 --- a/engine/storage/integration-test/test/resource/testng.xml +++ b/engine/storage/integration-test/test/resource/testng.xml @@ -1,6 +1,6 @@ - + diff --git a/engine/storage/src/org/apache/cloudstack/storage/command/AttachPrimaryDataStoreCmd.java b/engine/storage/src/org/apache/cloudstack/storage/command/AttachPrimaryDataStoreCmd.java index 53400a3d22b..b0b329904b2 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/command/AttachPrimaryDataStoreCmd.java +++ b/engine/storage/src/org/apache/cloudstack/storage/command/AttachPrimaryDataStoreCmd.java @@ -18,15 +18,14 @@ */ package org.apache.cloudstack.storage.command; -import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreInfo; import org.apache.cloudstack.storage.to.PrimaryDataStoreTO; import com.cloud.agent.api.Command; public class AttachPrimaryDataStoreCmd extends Command implements StorageSubSystemCommand { private final PrimaryDataStoreTO dataStore; - public AttachPrimaryDataStoreCmd(PrimaryDataStoreInfo dataStore) { - this.dataStore = new PrimaryDataStoreTO(dataStore); + public AttachPrimaryDataStoreCmd(PrimaryDataStoreTO dataStore) { + this.dataStore = dataStore; } public PrimaryDataStoreTO getDataStore() { diff --git a/engine/storage/src/org/apache/cloudstack/storage/command/CreatePrimaryDataStoreCmd.java b/engine/storage/src/org/apache/cloudstack/storage/command/CreatePrimaryDataStoreCmd.java index db5c0192f02..5a64e334bee 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/command/CreatePrimaryDataStoreCmd.java +++ b/engine/storage/src/org/apache/cloudstack/storage/command/CreatePrimaryDataStoreCmd.java @@ -1,5 +1,6 @@ package org.apache.cloudstack.storage.command; +import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreInfo; import org.apache.cloudstack.storage.to.PrimaryDataStoreTO; import com.cloud.agent.api.Command; diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/PrimaryDataStore.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/PrimaryDataStore.java index 9005bc083d3..a945e289081 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/datastore/PrimaryDataStore.java +++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/PrimaryDataStore.java @@ -27,6 +27,8 @@ import org.apache.cloudstack.framework.async.AsyncCompletionCallback; import org.apache.cloudstack.storage.EndPoint; import org.apache.cloudstack.storage.command.CommandResult; import org.apache.cloudstack.storage.image.TemplateInfo; +import org.apache.cloudstack.storage.to.PrimaryDataStoreTO; +import org.apache.cloudstack.storage.to.VolumeTO; import org.apache.cloudstack.storage.volume.TemplateOnPrimaryDataStoreInfo; public interface PrimaryDataStore extends PrimaryDataStoreInfo { @@ -53,4 +55,8 @@ public interface PrimaryDataStore extends PrimaryDataStoreInfo { boolean installTemplate(TemplateOnPrimaryDataStoreInfo template); VolumeDiskType getDefaultDiskType(); + + PrimaryDataStoreTO getDataStoreTO(); + + VolumeTO getVolumeTO(VolumeInfo volume); } diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/protocol/DataStoreProtocol.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/protocol/DataStoreProtocol.java new file mode 100644 index 00000000000..54518ae3a5b --- /dev/null +++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/protocol/DataStoreProtocol.java @@ -0,0 +1,16 @@ +package org.apache.cloudstack.storage.datastore.protocol; + +public enum DataStoreProtocol { + NFS("nfs"), + ISCSI("iscsi"); + + private String name; + DataStoreProtocol(String name) { + this.name = name; + } + + @Override + public String toString() { + return this.name; + } +} diff --git a/engine/storage/src/org/apache/cloudstack/storage/to/ImageOnPrimayDataStoreTO.java b/engine/storage/src/org/apache/cloudstack/storage/to/ImageOnPrimayDataStoreTO.java index 4c040f4f34f..f7c2322e346 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/to/ImageOnPrimayDataStoreTO.java +++ b/engine/storage/src/org/apache/cloudstack/storage/to/ImageOnPrimayDataStoreTO.java @@ -26,7 +26,7 @@ public class ImageOnPrimayDataStoreTO { private final TemplateTO template; public ImageOnPrimayDataStoreTO(TemplateOnPrimaryDataStoreInfo template) { this.pathOnPrimaryDataStore = template.getPath(); - this.dataStore = new PrimaryDataStoreTO(template.getPrimaryDataStore()); + this.dataStore = template.getPrimaryDataStore().getDataStoreTO(); this.template = new TemplateTO(template.getTemplate()); } diff --git a/engine/storage/src/org/apache/cloudstack/storage/to/NfsPrimaryDataStoreTO.java b/engine/storage/src/org/apache/cloudstack/storage/to/NfsPrimaryDataStoreTO.java new file mode 100644 index 00000000000..06ff16b2bfe --- /dev/null +++ b/engine/storage/src/org/apache/cloudstack/storage/to/NfsPrimaryDataStoreTO.java @@ -0,0 +1,28 @@ +package org.apache.cloudstack.storage.to; + +import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreInfo; + +public class NfsPrimaryDataStoreTO extends PrimaryDataStoreTO { + private String server; + private String path; + + public NfsPrimaryDataStoreTO(PrimaryDataStoreInfo dataStore) { + super(dataStore); + } + + public void setServer(String server) { + this.server = server; + } + + public String getServer() { + return this.server; + } + + public void setPath(String path) { + this.path = path; + } + + public String getPath() { + return this.path; + } +} diff --git a/engine/storage/src/org/apache/cloudstack/storage/to/PrimaryDataStoreTO.java b/engine/storage/src/org/apache/cloudstack/storage/to/PrimaryDataStoreTO.java index 77086211738..13d51acb7a1 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/to/PrimaryDataStoreTO.java +++ b/engine/storage/src/org/apache/cloudstack/storage/to/PrimaryDataStoreTO.java @@ -6,10 +6,16 @@ public class PrimaryDataStoreTO { private final String uuid; private final String name; private final String type; + private final long id; public PrimaryDataStoreTO(PrimaryDataStoreInfo dataStore) { this.uuid = dataStore.getUuid(); this.name = dataStore.getName(); this.type = dataStore.getType(); + this.id = dataStore.getId(); + } + + public long getId() { + return this.id; } public String getUuid() { diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/DataStoreStatus.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/DataStoreStatus.java index a40f6cf65ad..23551e4d0ac 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/DataStoreStatus.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/DataStoreStatus.java @@ -19,5 +19,5 @@ package org.apache.cloudstack.storage.datastore; public enum DataStoreStatus { - Initial, Initialized, Creating, Up, PrepareForMaintenance, ErrorInMaintenance, CancelMaintenance, Maintenance, Removed; + Initial, Initialized, Creating, Attaching, Up, PrepareForMaintenance, ErrorInMaintenance, CancelMaintenance, Maintenance, Removed; } diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/DefaultPrimaryDataStore.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/DefaultPrimaryDataStore.java index a3d1038511a..347817dffda 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/DefaultPrimaryDataStore.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/DefaultPrimaryDataStore.java @@ -15,9 +15,13 @@ import org.apache.cloudstack.framework.async.AsyncCompletionCallback; import org.apache.cloudstack.storage.EndPoint; import org.apache.cloudstack.storage.HypervisorHostEndPoint; import org.apache.cloudstack.storage.command.CommandResult; +import org.apache.cloudstack.storage.datastore.configurator.validator.StorageProtocolTransformer; +import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreVO; import org.apache.cloudstack.storage.datastore.driver.PrimaryDataStoreDriver; import org.apache.cloudstack.storage.image.TemplateInfo; +import org.apache.cloudstack.storage.to.PrimaryDataStoreTO; +import org.apache.cloudstack.storage.to.VolumeTO; import org.apache.cloudstack.storage.volume.TemplateOnPrimaryDataStoreInfo; import org.apache.cloudstack.storage.volume.TemplatePrimaryDataStoreManager; import org.apache.cloudstack.storage.volume.VolumeObject; @@ -36,18 +40,20 @@ public class DefaultPrimaryDataStore implements PrimaryDataStore { private static final Logger s_logger = Logger.getLogger(DefaultPrimaryDataStore.class); protected PrimaryDataStoreDriver driver; protected PrimaryDataStoreVO pdsv; - protected PrimaryDataStoreInfo pdsInfo; protected PrimaryDataStoreLifeCycle lifeCycle; protected PrimaryDataStoreProvider provider; + protected StorageProtocolTransformer protocalTransformer; private HypervisorType supportedHypervisor; private boolean isLocalStorageSupported = false; @Inject private VolumeDao volumeDao; @Inject - HostDao hostDao; + private HostDao hostDao; @Inject - TemplatePrimaryDataStoreManager templatePrimaryStoreMgr; - + private PrimaryDataStoreDao dataStoreDao; + @Inject + private TemplatePrimaryDataStoreManager templatePrimaryStoreMgr; + private DefaultPrimaryDataStore(PrimaryDataStoreVO pdsv) { this.pdsv = pdsv; } @@ -66,6 +72,20 @@ public class DefaultPrimaryDataStore implements PrimaryDataStore { this.provider = provider; } + public void setProtocolTransFormer(StorageProtocolTransformer transformer) { + this.protocalTransformer = transformer; + } + + @Override + public PrimaryDataStoreTO getDataStoreTO() { + return this.protocalTransformer.getDataStoreTO(this); + } + + @Override + public VolumeTO getVolumeTO(VolumeInfo volume) { + return this.protocalTransformer.getVolumeTO(volume); + } + public static DefaultPrimaryDataStore createDataStore(PrimaryDataStoreVO pdsv) { DefaultPrimaryDataStore dataStore = new DefaultPrimaryDataStore(pdsv); return ComponentInject.inject(dataStore); @@ -97,8 +117,13 @@ public class DefaultPrimaryDataStore implements PrimaryDataStore { public List getEndPoints() { Long clusterId = pdsv.getClusterId(); if (clusterId == null) { - return null; + pdsv = dataStoreDao.findById(pdsv.getId()); + clusterId = pdsv.getClusterId(); + if (clusterId == null) { + return new ArrayList(); + } } + List endpoints = new ArrayList(); List hosts = hostDao.findHypervisorHostInCluster(clusterId); for (HostVO host : hosts) { @@ -206,26 +231,22 @@ public class DefaultPrimaryDataStore implements PrimaryDataStore { @Override public String getUuid() { - // TODO Auto-generated method stub - return null; + return this.pdsv.getUuid(); } @Override public DataCenterResourceEntity.State getManagedState() { - // TODO Auto-generated method stub return null; } @Override public String getName() { - // TODO Auto-generated method stub - return null; + return this.pdsv.getName(); } @Override public String getType() { - // TODO Auto-generated method stub - return null; + return this.pdsv.getPoolType(); } @Override diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/AbstractPrimaryDataStoreConfigurator.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/AbstractPrimaryDataStoreConfigurator.java index 1ffe9e6aa15..db1fbde977c 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/AbstractPrimaryDataStoreConfigurator.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/AbstractPrimaryDataStoreConfigurator.java @@ -12,19 +12,13 @@ import com.cloud.utils.exception.CloudRuntimeException; public abstract class AbstractPrimaryDataStoreConfigurator implements PrimaryDataStoreConfigurator { @Inject - PrimaryDataStoreDao dataStoreDao; + protected PrimaryDataStoreDao dataStoreDao; - protected PrimaryDataStoreLifeCycle getLifeCycle() { - return null; - } + protected abstract PrimaryDataStoreLifeCycle getLifeCycle(); - protected PrimaryDataStoreDriver getDriver() { - return null; - } + protected abstract PrimaryDataStoreDriver getDriver(); - protected boolean isLocalStorageSupported() { - return false; - } + protected abstract boolean isLocalStorageSupported(); @Override public PrimaryDataStore getDataStore(long dataStoreId) { @@ -34,10 +28,11 @@ public abstract class AbstractPrimaryDataStoreConfigurator implements PrimaryDat } DefaultPrimaryDataStore dataStore = DefaultPrimaryDataStore.createDataStore(dataStoreVO); - dataStore.setDriver(this.getDriver()); + dataStore.setDriver(getDriver()); dataStore.setLifeCycle(getLifeCycle()); dataStore.setSupportedHypervisor(getSupportedHypervisor()); dataStore.setLocalStorageFlag(isLocalStorageSupported()); + dataStore.setProtocolTransFormer(getProtocolTransformer()); return dataStore; } } diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/PrimaryDataStoreConfigurator.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/PrimaryDataStoreConfigurator.java index fa0b76a3190..e868b4e149d 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/PrimaryDataStoreConfigurator.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/PrimaryDataStoreConfigurator.java @@ -19,7 +19,7 @@ package org.apache.cloudstack.storage.datastore.configurator; import org.apache.cloudstack.storage.datastore.PrimaryDataStore; -import org.apache.cloudstack.storage.datastore.configurator.validator.ProtocolValidator; +import org.apache.cloudstack.storage.datastore.configurator.validator.StorageProtocolTransformer; import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.storage.Storage.StoragePoolType; @@ -28,5 +28,5 @@ public interface PrimaryDataStoreConfigurator { public HypervisorType getSupportedHypervisor(); public String getSupportedDataStoreType(); public PrimaryDataStore getDataStore(long dataStoreId); - public ProtocolValidator getValidator(); + public StorageProtocolTransformer getProtocolTransformer(); } diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/kvm/KvmCLVMConfigurator.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/kvm/KvmCLVMConfigurator.java index 8ca4df05269..b5e9db3d167 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/kvm/KvmCLVMConfigurator.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/kvm/KvmCLVMConfigurator.java @@ -19,7 +19,7 @@ package org.apache.cloudstack.storage.datastore.configurator.kvm; import org.apache.cloudstack.storage.datastore.configurator.validator.CLVMValidator; -import org.apache.cloudstack.storage.datastore.configurator.validator.ProtocolValidator; +import org.apache.cloudstack.storage.datastore.configurator.validator.StorageProtocolTransformer; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; @@ -33,9 +33,15 @@ public class KvmCLVMConfigurator extends AbstractKvmConfigurator { } @Override - public ProtocolValidator getValidator() { + public StorageProtocolTransformer getProtocolTransformer() { return new CLVMValidator(); } + @Override + protected boolean isLocalStorageSupported() { + // TODO Auto-generated method stub + return false; + } + } diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/kvm/KvmNfsConfigurator.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/kvm/KvmNfsConfigurator.java index faed6ccf657..6897e547729 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/kvm/KvmNfsConfigurator.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/kvm/KvmNfsConfigurator.java @@ -18,22 +18,32 @@ */ package org.apache.cloudstack.storage.datastore.configurator.kvm; -import org.apache.cloudstack.storage.datastore.configurator.validator.NfsValidator; -import org.apache.cloudstack.storage.datastore.configurator.validator.ProtocolValidator; +import org.apache.cloudstack.storage.datastore.configurator.validator.NfsProtocolTransformer; +import org.apache.cloudstack.storage.datastore.configurator.validator.StorageProtocolTransformer; +import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; +import com.cloud.utils.component.Inject; + @Component @Qualifier("defaultProvider") public class KvmNfsConfigurator extends AbstractKvmConfigurator { - + @Inject + PrimaryDataStoreDao dataStoreDao; @Override public String getSupportedDataStoreType() { return "nfs"; } @Override - public ProtocolValidator getValidator() { - return new NfsValidator(); + public StorageProtocolTransformer getProtocolTransformer() { + return new NfsProtocolTransformer(dataStoreDao); + } + + @Override + protected boolean isLocalStorageSupported() { + // TODO Auto-generated method stub + return false; } } diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/kvm/KvmRBDConfigurator.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/kvm/KvmRBDConfigurator.java index cdbbb2570ca..a6442393104 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/kvm/KvmRBDConfigurator.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/kvm/KvmRBDConfigurator.java @@ -18,7 +18,7 @@ */ package org.apache.cloudstack.storage.datastore.configurator.kvm; -import org.apache.cloudstack.storage.datastore.configurator.validator.ProtocolValidator; +import org.apache.cloudstack.storage.datastore.configurator.validator.StorageProtocolTransformer; import org.apache.cloudstack.storage.datastore.configurator.validator.RBDValidator; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; @@ -29,13 +29,18 @@ import com.cloud.storage.Storage.StoragePoolType; @Qualifier("defaultProvider") public class KvmRBDConfigurator extends AbstractKvmConfigurator { - @Override public String getSupportedDataStoreType() { return "rbd"; } @Override - public ProtocolValidator getValidator() { + public StorageProtocolTransformer getProtocolTransformer() { return new RBDValidator(); } + + @Override + protected boolean isLocalStorageSupported() { + // TODO Auto-generated method stub + return false; + } } diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/validator/CLVMValidator.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/validator/CLVMValidator.java index e26394de530..ea259913f52 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/validator/CLVMValidator.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/validator/CLVMValidator.java @@ -21,10 +21,15 @@ package org.apache.cloudstack.storage.datastore.configurator.validator; import java.util.List; import java.util.Map; -public class CLVMValidator implements ProtocolValidator { +import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreInfo; +import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo; +import org.apache.cloudstack.storage.to.PrimaryDataStoreTO; +import org.apache.cloudstack.storage.to.VolumeTO; + +public class CLVMValidator implements StorageProtocolTransformer { @Override - public boolean validate(Map params) { + public boolean normalizeUserInput(Map params) { // TODO Auto-generated method stub return false; } @@ -35,4 +40,17 @@ public class CLVMValidator implements ProtocolValidator { return null; } + @Override + public PrimaryDataStoreTO getDataStoreTO(PrimaryDataStoreInfo dataStore) { + // TODO Auto-generated method stub + return null; + } + + @Override + public VolumeTO getVolumeTO(VolumeInfo volume) { + // TODO Auto-generated method stub + return null; + } + + } diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/validator/FileSystemValidator.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/validator/FileSystemValidator.java index 60532dcb8bb..8e1180eef3b 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/validator/FileSystemValidator.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/validator/FileSystemValidator.java @@ -21,10 +21,15 @@ package org.apache.cloudstack.storage.datastore.configurator.validator; import java.util.List; import java.util.Map; -public class FileSystemValidator implements ProtocolValidator { +import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreInfo; +import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo; +import org.apache.cloudstack.storage.to.PrimaryDataStoreTO; +import org.apache.cloudstack.storage.to.VolumeTO; + +public class FileSystemValidator implements StorageProtocolTransformer { @Override - public boolean validate(Map params) { + public boolean normalizeUserInput(Map params) { // TODO Auto-generated method stub return false; } @@ -35,4 +40,17 @@ public class FileSystemValidator implements ProtocolValidator { return null; } + @Override + public PrimaryDataStoreTO getDataStoreTO(PrimaryDataStoreInfo dataStore) { + // TODO Auto-generated method stub + return null; + } + + @Override + public VolumeTO getVolumeTO(VolumeInfo volume) { + // TODO Auto-generated method stub + return null; + } + + } diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/validator/ISCSIValiator.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/validator/ISCSIValiator.java index 89ecc310193..9e56058a758 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/validator/ISCSIValiator.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/validator/ISCSIValiator.java @@ -21,13 +21,12 @@ package org.apache.cloudstack.storage.datastore.configurator.validator; import java.util.List; import java.util.Map; -public class ISCSIValiator implements ProtocolValidator { +import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreInfo; +import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo; +import org.apache.cloudstack.storage.to.PrimaryDataStoreTO; +import org.apache.cloudstack.storage.to.VolumeTO; - @Override - public boolean validate(Map params) { - // TODO Auto-generated method stub - return false; - } +public class ISCSIValiator implements StorageProtocolTransformer { @Override public List getInputParamNames() { @@ -35,4 +34,22 @@ public class ISCSIValiator implements ProtocolValidator { return null; } + @Override + public boolean normalizeUserInput(Map params) { + // TODO Auto-generated method stub + return false; + } + + @Override + public PrimaryDataStoreTO getDataStoreTO(PrimaryDataStoreInfo dataStore) { + // TODO Auto-generated method stub + return null; + } + + @Override + public VolumeTO getVolumeTO(VolumeInfo volume) { + // TODO Auto-generated method stub + return null; + } + } diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/validator/NfsValidator.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/validator/NfsProtocolTransformer.java similarity index 59% rename from engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/validator/NfsValidator.java rename to engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/validator/NfsProtocolTransformer.java index 0da41749206..f812ffb99f1 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/validator/NfsValidator.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/validator/NfsProtocolTransformer.java @@ -25,12 +25,25 @@ import java.util.List; import java.util.Map; import java.util.UUID; +import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreInfo; +import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo; +import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; +import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreVO; +import org.apache.cloudstack.storage.to.NfsPrimaryDataStoreTO; +import org.apache.cloudstack.storage.to.PrimaryDataStoreTO; +import org.apache.cloudstack.storage.to.VolumeTO; + import com.cloud.utils.exception.CloudRuntimeException; -public class NfsValidator implements ProtocolValidator { - +public class NfsProtocolTransformer implements StorageProtocolTransformer { + private final PrimaryDataStoreDao dataStoreDao; + + public NfsProtocolTransformer(PrimaryDataStoreDao dao) { + this.dataStoreDao = dao; + } + @Override - public boolean validate(Map params) { + public boolean normalizeUserInput(Map params) { String url = params.get("url"); try { @@ -49,8 +62,7 @@ public class NfsValidator implements ProtocolValidator { params.put("path", hostPath); params.put("user", userInfo); params.put("port", String.valueOf(port)); - params.put("uuid", UUID.fromString(storageHost + hostPath).toString()); - + params.put("uuid", UUID.nameUUIDFromBytes((storageHost + hostPath).getBytes()).toString()); } catch (URISyntaxException e) { throw new CloudRuntimeException("invalid url: " + e.toString()); } @@ -65,4 +77,19 @@ public class NfsValidator implements ProtocolValidator { return paramNames; } + @Override + public PrimaryDataStoreTO getDataStoreTO(PrimaryDataStoreInfo dataStore) { + NfsPrimaryDataStoreTO dataStoreTO = new NfsPrimaryDataStoreTO(dataStore); + PrimaryDataStoreVO dataStoreVO = dataStoreDao.findById(dataStore.getId()); + dataStoreTO.setServer(dataStoreVO.getHostAddress()); + dataStoreTO.setPath(dataStoreVO.getPath()); + return dataStoreTO; + } + + @Override + public VolumeTO getVolumeTO(VolumeInfo volume) { + // TODO Auto-generated method stub + return null; + } + } diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/validator/RBDValidator.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/validator/RBDValidator.java index fbcf4510870..e18c8612e3a 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/validator/RBDValidator.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/validator/RBDValidator.java @@ -21,10 +21,15 @@ package org.apache.cloudstack.storage.datastore.configurator.validator; import java.util.List; import java.util.Map; -public class RBDValidator implements ProtocolValidator { +import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreInfo; +import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo; +import org.apache.cloudstack.storage.to.PrimaryDataStoreTO; +import org.apache.cloudstack.storage.to.VolumeTO; + +public class RBDValidator implements StorageProtocolTransformer { @Override - public boolean validate(Map params) { + public boolean normalizeUserInput(Map params) { // TODO Auto-generated method stub return false; } @@ -35,4 +40,16 @@ public class RBDValidator implements ProtocolValidator { return null; } + @Override + public PrimaryDataStoreTO getDataStoreTO(PrimaryDataStoreInfo dataStore) { + // TODO Auto-generated method stub + return null; + } + + @Override + public VolumeTO getVolumeTO(VolumeInfo volume) { + // TODO Auto-generated method stub + return null; + } + } diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/validator/ProtocolValidator.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/validator/StorageProtocolTransformer.java similarity index 65% rename from engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/validator/ProtocolValidator.java rename to engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/validator/StorageProtocolTransformer.java index 2b1948b8b9c..ab9a613cc40 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/validator/ProtocolValidator.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/validator/StorageProtocolTransformer.java @@ -21,7 +21,14 @@ package org.apache.cloudstack.storage.datastore.configurator.validator; import java.util.List; import java.util.Map; -public interface ProtocolValidator { - public boolean validate(Map params); +import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreInfo; +import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo; +import org.apache.cloudstack.storage.to.PrimaryDataStoreTO; +import org.apache.cloudstack.storage.to.VolumeTO; + +public interface StorageProtocolTransformer { + public boolean normalizeUserInput(Map params); + public PrimaryDataStoreTO getDataStoreTO(PrimaryDataStoreInfo dataStore); + public VolumeTO getVolumeTO(VolumeInfo volume); public List getInputParamNames(); } diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/validator/VMFSValidator.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/validator/VMFSValidator.java index 439e047c2fd..a0ae1f84845 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/validator/VMFSValidator.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/validator/VMFSValidator.java @@ -21,10 +21,15 @@ package org.apache.cloudstack.storage.datastore.configurator.validator; import java.util.List; import java.util.Map; -public class VMFSValidator implements ProtocolValidator { +import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreInfo; +import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo; +import org.apache.cloudstack.storage.to.PrimaryDataStoreTO; +import org.apache.cloudstack.storage.to.VolumeTO; + +public class VMFSValidator implements StorageProtocolTransformer { @Override - public boolean validate(Map params) { + public boolean normalizeUserInput(Map params) { // TODO Auto-generated method stub return false; } @@ -35,4 +40,16 @@ public class VMFSValidator implements ProtocolValidator { return null; } + @Override + public PrimaryDataStoreTO getDataStoreTO(PrimaryDataStoreInfo dataStore) { + // TODO Auto-generated method stub + return null; + } + + @Override + public VolumeTO getVolumeTO(VolumeInfo volume) { + // TODO Auto-generated method stub + return null; + } + } diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/vmware/VmwareIsciConfigurator.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/vmware/VmwareIsciConfigurator.java index 55c82ca4930..2a47e03ff37 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/vmware/VmwareIsciConfigurator.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/vmware/VmwareIsciConfigurator.java @@ -19,7 +19,7 @@ package org.apache.cloudstack.storage.datastore.configurator.vmware; import org.apache.cloudstack.storage.datastore.configurator.validator.ISCSIValiator; -import org.apache.cloudstack.storage.datastore.configurator.validator.ProtocolValidator; +import org.apache.cloudstack.storage.datastore.configurator.validator.StorageProtocolTransformer; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; @@ -27,14 +27,19 @@ import org.springframework.stereotype.Component; @Qualifier("defaultProvider") public class VmwareIsciConfigurator extends AbstractVmwareConfigurator { - @Override public String getSupportedDataStoreType() { return "iscsi"; } @Override - public ProtocolValidator getValidator() { + public StorageProtocolTransformer getProtocolTransformer() { return new ISCSIValiator(); } + + @Override + protected boolean isLocalStorageSupported() { + // TODO Auto-generated method stub + return false; + } } diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/vmware/VmwareNfsConfigurator.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/vmware/VmwareNfsConfigurator.java index 23cabb1cef6..c6afc133e3a 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/vmware/VmwareNfsConfigurator.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/vmware/VmwareNfsConfigurator.java @@ -18,24 +18,33 @@ */ package org.apache.cloudstack.storage.datastore.configurator.vmware; -import org.apache.cloudstack.storage.datastore.configurator.validator.NfsValidator; -import org.apache.cloudstack.storage.datastore.configurator.validator.ProtocolValidator; +import org.apache.cloudstack.storage.datastore.configurator.validator.NfsProtocolTransformer; +import org.apache.cloudstack.storage.datastore.configurator.validator.StorageProtocolTransformer; +import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; import com.cloud.storage.Storage.StoragePoolType; +import com.cloud.utils.component.Inject; @Component @Qualifier("defaultProvider") public class VmwareNfsConfigurator extends AbstractVmwareConfigurator { - + @Inject + PrimaryDataStoreDao dataStoreDao; @Override public String getSupportedDataStoreType() { return "nfs"; } @Override - public ProtocolValidator getValidator() { - return new NfsValidator(); + public StorageProtocolTransformer getProtocolTransformer() { + return new NfsProtocolTransformer(dataStoreDao); + } + + @Override + protected boolean isLocalStorageSupported() { + // TODO Auto-generated method stub + return false; } } diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/vmware/VmwareVMFSConfigurator.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/vmware/VmwareVMFSConfigurator.java index ef0444c400c..fc8738c2507 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/vmware/VmwareVMFSConfigurator.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/vmware/VmwareVMFSConfigurator.java @@ -18,7 +18,7 @@ */ package org.apache.cloudstack.storage.datastore.configurator.vmware; -import org.apache.cloudstack.storage.datastore.configurator.validator.ProtocolValidator; +import org.apache.cloudstack.storage.datastore.configurator.validator.StorageProtocolTransformer; import org.apache.cloudstack.storage.datastore.configurator.validator.VMFSValidator; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; @@ -35,7 +35,13 @@ public class VmwareVMFSConfigurator extends AbstractVmwareConfigurator { } @Override - public ProtocolValidator getValidator() { + public StorageProtocolTransformer getProtocolTransformer() { return new VMFSValidator(); } + + @Override + protected boolean isLocalStorageSupported() { + // TODO Auto-generated method stub + return false; + } } diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/xen/AbstractXenConfigurator.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/xen/AbstractXenConfigurator.java index 9b0d153bbbe..b8efb482c0d 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/xen/AbstractXenConfigurator.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/xen/AbstractXenConfigurator.java @@ -1,25 +1,14 @@ package org.apache.cloudstack.storage.datastore.configurator.xen; -import javax.inject.Inject; - import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreLifeCycle; -import org.apache.cloudstack.storage.datastore.DefaultPrimaryDataStore; -import org.apache.cloudstack.storage.datastore.PrimaryDataStore; import org.apache.cloudstack.storage.datastore.configurator.AbstractPrimaryDataStoreConfigurator; -import org.apache.cloudstack.storage.datastore.configurator.PrimaryDataStoreConfigurator; -import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; -import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreVO; import org.apache.cloudstack.storage.datastore.driver.DefaultPrimaryDataStoreDriverImpl; import org.apache.cloudstack.storage.datastore.driver.PrimaryDataStoreDriver; import org.apache.cloudstack.storage.datastore.lifecycle.DefaultXenPrimaryDataStoreLifeCycle; import com.cloud.hypervisor.Hypervisor.HypervisorType; -import com.cloud.utils.exception.CloudRuntimeException; public abstract class AbstractXenConfigurator extends AbstractPrimaryDataStoreConfigurator { - @Inject - PrimaryDataStoreDao dataStoreDao; - @Override public HypervisorType getSupportedHypervisor() { return HypervisorType.XenServer; @@ -32,17 +21,4 @@ public abstract class AbstractXenConfigurator extends AbstractPrimaryDataStoreCo protected PrimaryDataStoreDriver getDriver() { return new DefaultPrimaryDataStoreDriverImpl(); } - - @Override - public PrimaryDataStore getDataStore(long dataStoreId) { - PrimaryDataStoreVO dataStoreVO = dataStoreDao.findById(dataStoreId); - if (dataStoreVO == null) { - throw new CloudRuntimeException("Can't find primary data store: " + dataStoreId); - } - - DefaultPrimaryDataStore dataStore = DefaultPrimaryDataStore.createDataStore(dataStoreVO); - dataStore.setDriver(this.getDriver()); - dataStore.setLifeCycle(getLifeCycle()); - return dataStore; - } } diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/xen/XenIscsiConfigurator.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/xen/XenIscsiConfigurator.java index c9546a897b8..a4477560cc5 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/xen/XenIscsiConfigurator.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/xen/XenIscsiConfigurator.java @@ -19,7 +19,7 @@ package org.apache.cloudstack.storage.datastore.configurator.xen; import org.apache.cloudstack.storage.datastore.configurator.validator.ISCSIValiator; -import org.apache.cloudstack.storage.datastore.configurator.validator.ProtocolValidator; +import org.apache.cloudstack.storage.datastore.configurator.validator.StorageProtocolTransformer; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; @@ -33,8 +33,13 @@ public class XenIscsiConfigurator extends AbstractXenConfigurator { } @Override - public ProtocolValidator getValidator() { + public StorageProtocolTransformer getProtocolTransformer() { return new ISCSIValiator(); } + protected boolean isLocalStorageSupported() { + // TODO Auto-generated method stub + return false; + } + } diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/xen/XenNfsConfigurator.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/xen/XenNfsConfigurator.java index 8fb7e882870..6ad4b536349 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/xen/XenNfsConfigurator.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/xen/XenNfsConfigurator.java @@ -18,24 +18,32 @@ */ package org.apache.cloudstack.storage.datastore.configurator.xen; -import org.apache.cloudstack.storage.datastore.configurator.validator.NfsValidator; -import org.apache.cloudstack.storage.datastore.configurator.validator.ProtocolValidator; +import org.apache.cloudstack.storage.datastore.configurator.validator.NfsProtocolTransformer; +import org.apache.cloudstack.storage.datastore.configurator.validator.StorageProtocolTransformer; +import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; +import org.apache.cloudstack.storage.datastore.protocol.DataStoreProtocol; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; import com.cloud.storage.Storage.StoragePoolType; +import com.cloud.utils.component.Inject; @Component @Qualifier("defaultProvider") public class XenNfsConfigurator extends AbstractXenConfigurator { - @Override public String getSupportedDataStoreType() { - return "nfs"; + return DataStoreProtocol.NFS.toString(); } @Override - public ProtocolValidator getValidator() { - return new NfsValidator(); + public StorageProtocolTransformer getProtocolTransformer() { + return new NfsProtocolTransformer(dataStoreDao); } + + @Override + protected boolean isLocalStorageSupported() { + // TODO Auto-generated method stub + return false; + } } diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/driver/DefaultPrimaryDataStoreDriverImpl.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/driver/DefaultPrimaryDataStoreDriverImpl.java index 1a09266c6e3..012d00674c3 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/driver/DefaultPrimaryDataStoreDriverImpl.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/driver/DefaultPrimaryDataStoreDriverImpl.java @@ -47,7 +47,7 @@ public class DefaultPrimaryDataStoreDriverImpl implements PrimaryDataStoreDriver // which can access its datastore List endPoints = vol.getDataStore().getEndPoints(); VolumeInfo volInfo = vol; - CreateVolumeCommand createCmd = new CreateVolumeCommand(new VolumeTO(volInfo)); + CreateVolumeCommand createCmd = new CreateVolumeCommand(this.dataStore.getVolumeTO(volInfo)); Answer answer = sendOutCommand(createCmd, endPoints); CreateVolumeAnswer volAnswer = (CreateVolumeAnswer) answer; diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/lifecycle/DefaultPrimaryDataStoreLifeCycleImpl.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/lifecycle/DefaultPrimaryDataStoreLifeCycleImpl.java index 3826414e51f..658d4dbece7 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/lifecycle/DefaultPrimaryDataStoreLifeCycleImpl.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/lifecycle/DefaultPrimaryDataStoreLifeCycleImpl.java @@ -52,8 +52,8 @@ public class DefaultPrimaryDataStoreLifeCycleImpl implements PrimaryDataStoreLif } protected void attachCluster() { - //send down createStoragePool command to all the hosts in the cluster - AttachPrimaryDataStoreCmd cmd = new AttachPrimaryDataStoreCmd(this.dataStore); + //send down AttachPrimaryDataStoreCmd command to all the hosts in the cluster + AttachPrimaryDataStoreCmd cmd = new AttachPrimaryDataStoreCmd(this.dataStore.getDataStoreTO()); for (EndPoint ep : dataStore.getEndPoints()) { ep.sendMessage(cmd); } @@ -61,14 +61,19 @@ public class DefaultPrimaryDataStoreLifeCycleImpl implements PrimaryDataStoreLif @Override public boolean attachCluster(ClusterScope scope) { - attachCluster(); - PrimaryDataStoreVO dataStoreVO = dataStoreDao.findById(this.dataStore.getId()); dataStoreVO.setDataCenterId(scope.getZoneId()); dataStoreVO.setPodId(scope.getPodId()); dataStoreVO.setClusterId(scope.getScopeId()); + dataStoreVO.setStatus(DataStoreStatus.Attaching); + dataStoreDao.update(dataStoreVO.getId(), dataStoreVO); + + attachCluster(); + + dataStoreVO = dataStoreDao.findById(this.dataStore.getId()); dataStoreVO.setStatus(DataStoreStatus.Up); dataStoreDao.update(dataStoreVO.getId(), dataStoreVO); + return true; } diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/lifecycle/DefaultXenPrimaryDataStoreLifeCycle.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/lifecycle/DefaultXenPrimaryDataStoreLifeCycle.java index d689258480b..bb255b0cc53 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/lifecycle/DefaultXenPrimaryDataStoreLifeCycle.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/lifecycle/DefaultXenPrimaryDataStoreLifeCycle.java @@ -20,6 +20,7 @@ package org.apache.cloudstack.storage.datastore.lifecycle; import org.apache.cloudstack.storage.EndPoint; import org.apache.cloudstack.storage.command.AttachPrimaryDataStoreCmd; +import org.apache.cloudstack.storage.command.CreatePrimaryDataStoreCmd; import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; import com.cloud.agent.api.Answer; @@ -39,7 +40,7 @@ public class DefaultXenPrimaryDataStoreLifeCycle extends DefaultPrimaryDataStore @Override public void attachCluster() { //send one time is enough, as xenserver is clustered - AttachPrimaryDataStoreCmd cmd = new AttachPrimaryDataStoreCmd(this.dataStore); + CreatePrimaryDataStoreCmd cmd = new CreatePrimaryDataStoreCmd(this.dataStore.getDataStoreTO()); String result = null; for (EndPoint ep : dataStore.getEndPoints()) { Answer answer = ep.sendMessage(cmd); @@ -49,8 +50,9 @@ public class DefaultXenPrimaryDataStoreLifeCycle extends DefaultPrimaryDataStore result = answer.getDetails(); } - throw new CloudRuntimeException("AttachPrimaryDataStoreCmd failed: " + result); + if (result != null) + throw new CloudRuntimeException("AttachPrimaryDataStoreCmd failed: " + result); + + super.attachCluster(); } - - } diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/provider/DefaultPrimaryDatastoreProviderImpl.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/provider/DefaultPrimaryDatastoreProviderImpl.java index 3bd4113b62a..f89ba808c26 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/provider/DefaultPrimaryDatastoreProviderImpl.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/provider/DefaultPrimaryDatastoreProviderImpl.java @@ -14,7 +14,7 @@ import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreProvid import org.apache.cloudstack.storage.datastore.DefaultPrimaryDataStore; import org.apache.cloudstack.storage.datastore.PrimaryDataStore; import org.apache.cloudstack.storage.datastore.configurator.PrimaryDataStoreConfigurator; -import org.apache.cloudstack.storage.datastore.configurator.validator.ProtocolValidator; +import org.apache.cloudstack.storage.datastore.configurator.validator.StorageProtocolTransformer; import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreProviderDao; import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreProviderVO; import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreVO; @@ -44,21 +44,6 @@ public class DefaultPrimaryDatastoreProviderImpl implements PrimaryDataStoreProv protected ClusterDao clusterDao; protected Map configuratorMaps = new HashMap(); - @Qualifier("defaultProvider") - @Inject - List defaultConfigurators; - - public DefaultPrimaryDatastoreProviderImpl() { - } - - @PostConstruct - public void intialize() { - for (PrimaryDataStoreConfigurator configurator : defaultConfigurators) { - String key = generateKey(configurator.getSupportedHypervisor(), configurator.getSupportedDataStoreType().toString()); - configuratorMaps.put(key, configurator); - } - } - @Inject public DefaultPrimaryDatastoreProviderImpl(@Qualifier("defaultProvider") List configurators) { for (PrimaryDataStoreConfigurator configurator : configurators) { @@ -114,10 +99,15 @@ public class DefaultPrimaryDatastoreProviderImpl implements PrimaryDataStoreProv throw new CloudRuntimeException("can't find configurator from key: " + key); } - ProtocolValidator validator = configurator.getValidator(); - validator.validate(dsInfos); + StorageProtocolTransformer validator = configurator.getProtocolTransformer(); + validator.normalizeUserInput(dsInfos); - PrimaryDataStoreVO dataStoreVO = new PrimaryDataStoreVO(); + PrimaryDataStoreVO dataStoreVO = dataStoreDao.findPoolByUUID(dsInfos.get("uuid")); + if (dataStoreVO != null) { + throw new CloudRuntimeException("duplicate uuid: " + dsInfos.get("uuid")); + } + + dataStoreVO = new PrimaryDataStoreVO(); dataStoreVO.setStorageProviderId(this.getId()); dataStoreVO.setHostAddress(dsInfos.get("server")); dataStoreVO.setPath(dsInfos.get("path")); diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/TemplateOnPrimaryDataStoreObject.java b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/TemplateOnPrimaryDataStoreObject.java index 9d6452d1978..0ae45e37227 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/TemplateOnPrimaryDataStoreObject.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/TemplateOnPrimaryDataStoreObject.java @@ -71,13 +71,17 @@ public class TemplateOnPrimaryDataStoreObject implements TemplateOnPrimaryDataSt public void updateStatus(Status status) { vo.setDownloadState(status); templateStoreDao.update(vo.getId(), vo); + vo = templateStoreDao.findById(vo.getId()); } public void stateTransit(TemplateOnPrimaryDataStoreStateMachine.Event event) { try { this.stateMachine.transitTo(vo, event, null, templateStoreDao); + vo = templateStoreDao.findById(vo.getId()); } catch (NoTransitionException e) { throw new CloudRuntimeException("Failed change state", e); + } catch (Exception e) { + throw new CloudRuntimeException("Failed change state", e); } } } diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java index 10a298a314d..712b0ef188a 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java @@ -187,10 +187,8 @@ public class VolumeServiceImpl implements VolumeService { CommandResult result = callback.getResult(); TemplateOnPrimaryDataStoreObject templateOnPrimaryStoreObj = context.getTemplate(); if (result.isSuccess()) { - templateOnPrimaryStoreObj.updateStatus(Status.DOWNLOADED); templateOnPrimaryStoreObj.stateTransit(TemplateOnPrimaryDataStoreStateMachine.Event.OperationSuccessed); } else { - templateOnPrimaryStoreObj.updateStatus(Status.ABANDONED); templateOnPrimaryStoreObj.stateTransit(TemplateOnPrimaryDataStoreStateMachine.Event.OperationFailed); } diff --git a/framework/ipc/src/org/apache/cloudstack/framework/async/AsyncCallbackDispatcher.java b/framework/ipc/src/org/apache/cloudstack/framework/async/AsyncCallbackDispatcher.java index f3cb60c95ee..92a9d396a52 100644 --- a/framework/ipc/src/org/apache/cloudstack/framework/async/AsyncCallbackDispatcher.java +++ b/framework/ipc/src/org/apache/cloudstack/framework/async/AsyncCallbackDispatcher.java @@ -22,6 +22,8 @@ package org.apache.cloudstack.framework.async; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +import net.sf.cglib.proxy.CallbackFilter; +import net.sf.cglib.proxy.Callback; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; @@ -52,14 +54,33 @@ public class AsyncCallbackDispatcher implements AsyncCompletionCallback { @SuppressWarnings("unchecked") public T getTarget() { - return (T)Enhancer.create(_targetObject.getClass(), new MethodInterceptor() { - @Override - public Object intercept(Object arg0, Method arg1, Object[] arg2, - MethodProxy arg3) throws Throwable { - _callbackMethod = arg1; - return null; - } - }); + Enhancer en = new Enhancer(); + en.setSuperclass(_targetObject.getClass()); + en.setCallbacks(new Callback[]{new MethodInterceptor() { + @Override + public Object intercept(Object arg0, Method arg1, Object[] arg2, + MethodProxy arg3) throws Throwable { + _callbackMethod = arg1; + return null; + } + }, + new MethodInterceptor() { + @Override + public Object intercept(Object arg0, Method arg1, Object[] arg2, + MethodProxy arg3) throws Throwable { + return null; + } + } + }); + en.setCallbackFilter(new CallbackFilter() { + public int accept(Method method) { + if (method.getParameterTypes().length == 0 && method.getName().equals("finalize")) { + return 1; + } + return 0; + }} + ); + return (T)en.create(); } public AsyncCallbackDispatcher setCallback(Object useless) { diff --git a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java index 9cd1bf635e3..9a0490335fe 100644 --- a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java +++ b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java @@ -338,6 +338,9 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe s_statesTable.put(Types.VmPowerState.UNRECOGNIZED, State.Unknown); } + public XsHost getHost() { + return this._host; + } protected boolean cleanupHaltedVms(Connection conn) throws XenAPIException, XmlRpcException { Host host = Host.getByUuid(conn, _host.uuid); diff --git a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerStorageResource.java b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerStorageResource.java index 7b2de95abee..af6f80d8f5c 100644 --- a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerStorageResource.java +++ b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerStorageResource.java @@ -33,9 +33,13 @@ import org.apache.cloudstack.storage.command.AttachPrimaryDataStoreCmd; import org.apache.cloudstack.storage.command.CopyTemplateToPrimaryStorageCmd; import org.apache.cloudstack.storage.command.CopyTemplateToPrimaryStorageAnswer; import org.apache.cloudstack.storage.command.CreatePrimaryDataStoreCmd; +import org.apache.cloudstack.storage.command.CreateVolumeAnswer; +import org.apache.cloudstack.storage.command.CreateVolumeFromBaseImageCommand; import org.apache.cloudstack.storage.command.StorageSubSystemCommand; +import org.apache.cloudstack.storage.datastore.protocol.DataStoreProtocol; import org.apache.cloudstack.storage.to.ImageDataStoreTO; import org.apache.cloudstack.storage.to.ImageOnPrimayDataStoreTO; +import org.apache.cloudstack.storage.to.NfsPrimaryDataStoreTO; import org.apache.cloudstack.storage.to.PrimaryDataStoreTO; import org.apache.cloudstack.storage.to.TemplateTO; import org.apache.commons.httpclient.HttpClient; @@ -86,14 +90,20 @@ public class XenServerStorageResource { return this.execute((AttachPrimaryDataStoreCmd)command); } else if (command instanceof CreatePrimaryDataStoreCmd) { return execute((CreatePrimaryDataStoreCmd) command); + } else if (command instanceof CreateVolumeFromBaseImageCommand) { + return execute((CreateVolumeFromBaseImageCommand)command); } return new Answer((Command)command, false, "not implemented yet"); } - /* - protected SR getNfsSR(Connection conn, PrimaryDataStoreTO pool) { + + public Answer execute(CreateVolumeFromBaseImageCommand cmd) { + return new CreateVolumeAnswer(cmd, UUID.randomUUID().toString()); + } + + protected SR getNfsSR(Connection conn, NfsPrimaryDataStoreTO pool) { Map deviceConfig = new HashMap(); try { - String server = pool.getHost(); + String server = pool.getServer(); String serverpath = pool.getPath(); serverpath = serverpath.replace("//", "/"); Set srs = SR.getAll(conn); @@ -125,13 +135,13 @@ public class XenServerStorageResource { if (server.equals(dc.get("server")) && serverpath.equals(dc.get("serverpath"))) { throw new CloudRuntimeException("There is a SR using the same configuration server:" + dc.get("server") + ", serverpath:" - + dc.get("serverpath") + " for pool " + pool.getUuid() + "on host:" + _host.uuid); + + dc.get("serverpath") + " for pool " + pool.getUuid() + "on host:" + hypervisorResource.getHost().uuid); } } deviceConfig.put("server", server); deviceConfig.put("serverpath", serverpath); - Host host = Host.getByUuid(conn, _host.uuid); + Host host = Host.getByUuid(conn, hypervisorResource.getHost().uuid); SR sr = SR.create(conn, host, deviceConfig, new Long(0), pool.getUuid(), Long.toString(pool.getId()), SRType.NFS.toString(), "user", true, new HashMap()); sr.scan(conn); @@ -142,7 +152,7 @@ public class XenServerStorageResource { throw new CloudRuntimeException("Unable to create NFS SR " + pool.toString(), e); } } - + /* protected SR getIscsiSR(Connection conn, PrimaryDataStoreTO pool) { synchronized (pool.getUuid().intern()) { Map deviceConfig = new HashMap(); @@ -271,9 +281,9 @@ public class XenServerStorageResource { Connection conn = hypervisorResource.getConnection(); PrimaryDataStoreTO dataStore = cmd.getDataStore(); try { - if (dataStore.getType() == StoragePoolType.NetworkFilesystem.toString()) { - //getNfsSR(conn, dataStore); - } else if (dataStore.getType() == StoragePoolType.IscsiLUN.toString()) { + if (DataStoreProtocol.NFS.toString().equalsIgnoreCase(dataStore.getType())) { + getNfsSR(conn, (NfsPrimaryDataStoreTO)dataStore); + } else if (DataStoreProtocol.NFS.toString().equalsIgnoreCase(dataStore.getType())) { //getIscsiSR(conn, dataStore); } else if (dataStore.getType() == StoragePoolType.PreSetup.toString()) { } else { @@ -366,11 +376,11 @@ public class XenServerStorageResource { boolean result = false; try { - SR sr = SR.getByUuid(conn, primaryStoreUuid); - if (sr == null) { + Set srs = SR.getByNameLabel(conn, primaryStoreUuid); + if (srs.size() != 1) { throw new CloudRuntimeException("storage uuid: " + primaryStoreUuid + " is not unique"); } - poolsr = sr; + poolsr = srs.iterator().next(); VDI.Record vdir = new VDI.Record(); vdir.nameLabel = "Base-Image-" + UUID.randomUUID().toString(); vdir.SR = poolsr; @@ -381,15 +391,20 @@ public class XenServerStorageResource { vdir = vdi.getRecord(conn); String vdiLocation = vdir.location; - Set pbds = poolsr.getPBDs(conn); - if (pbds.size() != 1) { - throw new CloudRuntimeException("Don't how to handle multiple pbds:" + pbds.size() + " for sr: " + poolsr.getUuid(conn)); + String pbdLocation = null; + if (primarDataStore.getType().equalsIgnoreCase(DataStoreProtocol.NFS.toString())) { + pbdLocation = "/run/sr-mount/" + poolsr.getUuid(conn); + } else { + Set pbds = poolsr.getPBDs(conn); + if (pbds.size() != 1) { + throw new CloudRuntimeException("Don't how to handle multiple pbds:" + pbds.size() + " for sr: " + poolsr.getUuid(conn)); + } + PBD pbd = pbds.iterator().next(); + Map deviceCfg = pbd.getDeviceConfig(conn); + pbdLocation = deviceCfg.get("location"); } - PBD pbd = pbds.iterator().next(); - Map deviceCfg = pbd.getDeviceConfig(conn); - String pbdLocation = deviceCfg.get("location"); if (pbdLocation == null) { - throw new CloudRuntimeException("Can't get pbd: " + pbd.getUuid(conn) + " location"); + throw new CloudRuntimeException("Can't get pbd location"); } String vdiPath = pbdLocation + "/" + vdiLocation + ".vhd"; @@ -454,8 +469,7 @@ public class XenServerStorageResource { protected Answer execute(CopyTemplateToPrimaryStorageCmd cmd) { ImageOnPrimayDataStoreTO imageTO = cmd.getImage(); TemplateTO template = imageTO.getTemplate(); - ImageDataStoreTO imageStore = template.getImageDataStore(); - if (imageStore.getType().equalsIgnoreCase("http")) { + if (template.getPath().startsWith("http")) { return directDownloadHttpTemplate(cmd, template, imageTO.getPrimaryDataStore()); } else { return new Answer(cmd, false, "not implemented yet");