so many traps in rpc call: you can't use aop in a thread, you need to intercept finalize call etc

This commit is contained in:
Edison Su 2012-12-24 02:37:32 -08:00
parent 4b2d9f4415
commit d99161399e
43 changed files with 572 additions and 240 deletions

View File

@ -41,4 +41,5 @@ public interface PrimaryDataStoreInfo {
public String getType(); public String getType();
public PrimaryDataStoreLifeCycle getLifeCycle(); public PrimaryDataStoreLifeCycle getLifeCycle();
PrimaryDataStoreProvider getProvider(); PrimaryDataStoreProvider getProvider();
} }

View File

@ -24,7 +24,7 @@ public class ChildTestConfiguration extends TestConfiguration {
@Bean @Bean
public HostEndpointRpcServer rpcServer() { public HostEndpointRpcServer rpcServer() {
return new MockHypervsiorHostEndPointRpcServer(); return new MockHostEndpointRpcServerDirectCallResource();
} }
/* @Override /* @Override
@Bean @Bean

View File

@ -6,6 +6,7 @@ import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;
import org.testng.annotations.AfterMethod; import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod; import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Parameters; import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
import com.cloud.utils.db.DB; import com.cloud.utils.db.DB;
import com.cloud.utils.db.Transaction; import com.cloud.utils.db.Transaction;
@ -17,13 +18,23 @@ public class CloudStackTestNGBase extends AbstractTestNGSpringContextTests {
private String hostGuid; private String hostGuid;
private String templateUrl; private String templateUrl;
private String localStorageUuid; private String localStorageUuid;
private String primaryStorageUrl;
private Transaction txn; private Transaction txn;
protected void injectMockito() {
}
@BeforeMethod(alwaysRun = true) @BeforeMethod(alwaysRun = true)
protected void injectDB(Method testMethod) throws Exception { protected void injectDB(Method testMethod) throws Exception {
txn = Transaction.open(testMethod.getName()); txn = Transaction.open(testMethod.getName());
} }
@Test
protected void injectMockitoTest() {
injectMockito();
}
@AfterMethod(alwaysRun = true) @AfterMethod(alwaysRun = true)
protected void closeDB(Method testMethod) throws Exception { protected void closeDB(Method testMethod) throws Exception {
if (txn != null) { if (txn != null) {
@ -32,14 +43,19 @@ public class CloudStackTestNGBase extends AbstractTestNGSpringContextTests {
} }
@BeforeMethod(alwaysRun = true) @BeforeMethod(alwaysRun = true)
@Parameters({"devcloud-host-uuid", "devcloud-host-gateway", "devcloud-host-cidr", "devcloud-host-ip", "template-url", "devcloud-local-storage-uuid"}) @Parameters({"devcloud-host-uuid", "devcloud-host-gateway", "devcloud-host-cidr",
protected void setup(String hostuuid, String gateway, String cidr, String hostIp, String templateUrl, String localStorageUuid) { "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.hostGuid = hostuuid;
this.hostGateway = gateway; this.hostGateway = gateway;
this.hostCidr = cidr; this.hostCidr = cidr;
this.hostIp = hostIp; this.hostIp = hostIp;
this.templateUrl = templateUrl; this.templateUrl = templateUrl;
this.localStorageUuid = localStorageUuid; this.localStorageUuid = localStorageUuid;
this.primaryStorageUrl = primaryStorage;
} }
protected String getHostGuid() { protected String getHostGuid() {
@ -65,4 +81,8 @@ public class CloudStackTestNGBase extends AbstractTestNGSpringContextTests {
protected String getLocalStorageUuid() { protected String getLocalStorageUuid() {
return this.localStorageUuid; return this.localStorageUuid;
} }
protected String getPrimaryStorageUrl() {
return this.primaryStorageUrl;
}
} }

View File

@ -37,6 +37,9 @@ import com.cloud.agent.api.Answer;
import com.cloud.agent.api.Command; import com.cloud.agent.api.Command;
import com.cloud.exception.AgentUnavailableException; import com.cloud.exception.AgentUnavailableException;
import com.cloud.exception.OperationTimedoutException; 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 { public class MockHostEndpointRpcServerDirectCallResource implements HostEndpointRpcServer {
@ -47,29 +50,14 @@ public class MockHostEndpointRpcServerDirectCallResource implements HostEndpoint
public MockHostEndpointRpcServerDirectCallResource() { public MockHostEndpointRpcServerDirectCallResource() {
executor = Executors.newScheduledThreadPool(10); executor = Executors.newScheduledThreadPool(10);
} }
protected class MockRpcCallBack implements Runnable {
private final Command cmd;
private final long hostId;
private final AsyncCompletionCallback<Answer> callback;
public MockRpcCallBack(long hostId, Command cmd, final AsyncCompletionCallback<Answer> 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<Answer> callback) { public void sendCommandAsync(HypervisorHostEndPoint host, final Command command, final AsyncCompletionCallback<Answer> 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 @Override

View File

@ -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<Answer> callback;
public void setCmd(Command cmd) {
this.cmd = cmd;
}
public void setHostId(long hostId) {
this.hostId = hostId;
}
public void setCallback(AsyncCompletionCallback<Answer> 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;
}
}
}

View File

@ -18,8 +18,9 @@
*/ */
package org.apache.cloudstack.storage.test; 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.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.LinkedList; 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.DefaultPrimaryDataStore;
import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreVO; 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.datastore.provider.PrimaryDataStoreProviderManager;
import org.apache.cloudstack.storage.image.ImageService; import org.apache.cloudstack.storage.image.ImageService;
import org.apache.cloudstack.storage.image.db.ImageDataDao; 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.VolumeService;
import org.apache.cloudstack.storage.volume.db.VolumeDao; import org.apache.cloudstack.storage.volume.db.VolumeDao;
import org.apache.cloudstack.storage.volume.db.VolumeVO; 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.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.mockito.Mockito; import org.mockito.Mockito;
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.org.Managed.ManagedState;
import com.cloud.resource.ResourceState; import com.cloud.resource.ResourceState;
import com.cloud.storage.Storage.TemplateType; 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") @ContextConfiguration(locations="classpath:/storageContext.xml")
public class volumeServiceTest { public class volumeServiceTest extends CloudStackTestNGBase {
@Inject @Inject
ImageDataStoreProviderManager imageProviderMgr; ImageDataStoreProviderManager imageProviderMgr;
@Inject @Inject
@ -134,8 +123,19 @@ public class volumeServiceTest {
Long dcId; Long dcId;
Long clusterId; Long clusterId;
Long podId; Long podId;
@Before HostVO host;
String primaryName = "my primary data store";
@Test(priority = -1)
public void setUp() { public void setUp() {
host = hostDao.findByGuid(this.getHostGuid());
if (host != null) {
dcId = host.getDataCenterId();
clusterId = host.getClusterId();
podId = host.getPodId();
return;
}
//create data center //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", 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); null, null, NetworkType.Basic, null, null, true, true);
@ -143,7 +143,7 @@ public class volumeServiceTest {
dcId = dc.getId(); dcId = dc.getId();
//create pod //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); pod = podDao.persist(pod);
podId = pod.getId(); podId = pod.getId();
//create xen cluster //create xen cluster
@ -155,23 +155,23 @@ public class volumeServiceTest {
clusterId = cluster.getId(); clusterId = cluster.getId();
//create xen host //create xen host
HostVO host = new HostVO(UUID.randomUUID().toString()); host = new HostVO(this.getHostGuid());
host.setName("devcloud xen host"); host.setName("devcloud xen host");
host.setType(Host.Type.Routing); host.setType(Host.Type.Routing);
host.setPrivateIpAddress("192.168.56.2"); host.setPrivateIpAddress(this.getHostIp());
host.setDataCenterId(dc.getId()); host.setDataCenterId(dc.getId());
host.setVersion("6.0.1"); host.setVersion("6.0.1");
host.setAvailable(true); host.setAvailable(true);
host.setSetup(true); host.setSetup(true);
host.setPodId(podId);
host.setLastPinged(0); host.setLastPinged(0);
host.setResourceState(ResourceState.Enabled); host.setResourceState(ResourceState.Enabled);
host.setHypervisorType(HypervisorType.XenServer);
host.setClusterId(cluster.getId()); host.setClusterId(cluster.getId());
host = hostDao.persist(host); host = hostDao.persist(host);
List<HostVO> results = new ArrayList<HostVO>();
results.add(host);
Mockito.when(hostDao.listAll()).thenReturn(results);
Mockito.when(hostDao.findHypervisorHostInCluster(Mockito.anyLong())).thenReturn(results);
//CreateVolumeAnswer createVolumeFromImageAnswer = new CreateVolumeAnswer(UUID.randomUUID().toString()); //CreateVolumeAnswer createVolumeFromImageAnswer = new CreateVolumeAnswer(UUID.randomUUID().toString());
/*try { /*try {
@ -188,10 +188,21 @@ public class volumeServiceTest {
//Mockito.when(primaryStoreDao.findById(Mockito.anyLong())).thenReturn(primaryStore); //Mockito.when(primaryStoreDao.findById(Mockito.anyLong())).thenReturn(primaryStore);
} }
@Override
protected void injectMockito() {
if (host == null) {
return;
}
List<HostVO> results = new ArrayList<HostVO>();
results.add(host);
Mockito.when(hostDao.listAll()).thenReturn(results);
Mockito.when(hostDao.findHypervisorHostInCluster(Mockito.anyLong())).thenReturn(results);
}
private ImageDataVO createImageData() { private ImageDataVO createImageData() {
ImageDataVO image = new ImageDataVO(); ImageDataVO image = new ImageDataVO();
image.setTemplateType(TemplateType.USER); image.setTemplateType(TemplateType.USER);
image.setUrl("http://testurl/test.vhd"); image.setUrl(this.getTemplateUrl());
image.setUniqueName(UUID.randomUUID().toString()); image.setUniqueName(UUID.randomUUID().toString());
image.setName(UUID.randomUUID().toString()); image.setName(UUID.randomUUID().toString());
image.setPublicTemplate(true); image.setPublicTemplate(true);
@ -226,21 +237,29 @@ public class volumeServiceTest {
} }
} }
@Test
public void createTemplateTest() { public void createTemplateTest() {
createTemplate(); createTemplate();
} }
private PrimaryDataStoreInfo createPrimaryDataStore() { private PrimaryDataStoreInfo createPrimaryDataStore() {
try { try {
primaryDataStoreProviderMgr.configure("primary data store mgr", new HashMap<String, Object>());
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<String, Object>());
List<PrimaryDataStoreVO> ds = primaryStoreDao.findPoolByName(this.primaryName);
if (ds.size() >= 1) {
PrimaryDataStoreVO store = ds.get(0);
if (store.getRemoved() == null) {
return provider.getDataStore(store.getId());
}
}
Map<String, String> params = new HashMap<String, String>(); Map<String, String> params = new HashMap<String, String>();
params.put("url", "nfs://localhost/primarynfs"); params.put("url", this.getPrimaryStorageUrl());
params.put("dcId", dcId.toString()); params.put("dcId", dcId.toString());
params.put("clusterId", clusterId.toString()); params.put("clusterId", clusterId.toString());
params.put("name", "my primary data store"); params.put("name", this.primaryName);
PrimaryDataStoreInfo primaryDataStoreInfo = provider.registerDataStore(params); PrimaryDataStoreInfo primaryDataStoreInfo = provider.registerDataStore(params);
PrimaryDataStoreLifeCycle lc = primaryDataStoreInfo.getLifeCycle(); PrimaryDataStoreLifeCycle lc = primaryDataStoreInfo.getLifeCycle();
ClusterScope scope = new ClusterScope(clusterId, podId, dcId); ClusterScope scope = new ClusterScope(clusterId, podId, dcId);
@ -251,11 +270,6 @@ public class volumeServiceTest {
} }
} }
@Test
public void createPrimaryDataStoreTest() {
createPrimaryDataStore();
}
private VolumeVO createVolume(long templateId) { private VolumeVO createVolume(long templateId) {
VolumeVO volume = new VolumeVO(1000, new RootDisk().toString(), UUID.randomUUID().toString(), templateId); VolumeVO volume = new VolumeVO(1000, new RootDisk().toString(), UUID.randomUUID().toString(), templateId);
volume = volumeDao.persist(volume); volume = volumeDao.persist(volume);
@ -263,7 +277,7 @@ public class volumeServiceTest {
} }
@Test @Test(priority=2)
public void createVolumeFromTemplate() { public void createVolumeFromTemplate() {
TemplateEntity te = createTemplate(); TemplateEntity te = createTemplate();
PrimaryDataStoreInfo dataStoreInfo = createPrimaryDataStore(); PrimaryDataStoreInfo dataStoreInfo = createPrimaryDataStore();
@ -272,36 +286,39 @@ public class volumeServiceTest {
ve.createVolumeFromTemplate(dataStoreInfo.getId(), new VHD(), te); ve.createVolumeFromTemplate(dataStoreInfo.getId(), new VHD(), te);
} }
@Test(priority=3)
public void tearDown() {
List<PrimaryDataStoreVO> 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 //@Test
@Test
public void test1() { public void test1() {
System.out.println(VolumeTypeHelper.getType("Root")); System.out.println(VolumeTypeHelper.getType("Root"));
System.out.println(VolumeDiskTypeHelper.getDiskType("vmdk")); System.out.println(VolumeDiskTypeHelper.getDiskType("vmdk"));
System.out.println(ImageFormatHelper.getFormat("ova")); System.out.println(ImageFormatHelper.getFormat("ova"));
assertFalse(new VMDK().equals(new VHD())); AssertJUnit.assertFalse(new VMDK().equals(new VHD()));
VMDK vmdk = new VMDK(); VMDK vmdk = new VMDK();
assertTrue(vmdk.equals(vmdk)); AssertJUnit.assertTrue(vmdk.equals(vmdk));
VMDK newvmdk = new VMDK(); VMDK newvmdk = new VMDK();
assertTrue(vmdk.equals(newvmdk)); AssertJUnit.assertTrue(vmdk.equals(newvmdk));
ImageFormat ova = new OVA(); ImageFormat ova = new OVA();
ImageFormat iso = new ISO(); ImageFormat iso = new ISO();
assertTrue(ova.equals(new OVA())); AssertJUnit.assertTrue(ova.equals(new OVA()));
assertFalse(ova.equals(iso)); AssertJUnit.assertFalse(ova.equals(iso));
assertTrue(ImageFormatHelper.getFormat("test").equals(new Unknown())); AssertJUnit.assertTrue(ImageFormatHelper.getFormat("test").equals(new Unknown()));
VolumeDiskType qcow2 = new QCOW2(); VolumeDiskType qcow2 = new QCOW2();
ImageFormat qcow2format = new org.apache.cloudstack.storage.image.format.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);
}
} }

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite thread-count="1" verbose="1" name="storage test" annotations="JDK" parallel="methods"> <suite thread-count="1" verbose="1" name="storage test" annotations="JDK" parallel="classes">
<!--describe your test environment--> <!--describe your test environment-->
<parameter name="devcloud-host-ip" value="192.168.56.2"/> <parameter name="devcloud-host-ip" value="192.168.56.2"/>
<parameter name="devcloud-host-gateway" value="192.168.56.1"/> <parameter name="devcloud-host-gateway" value="192.168.56.1"/>

View File

@ -18,15 +18,14 @@
*/ */
package org.apache.cloudstack.storage.command; package org.apache.cloudstack.storage.command;
import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreInfo;
import org.apache.cloudstack.storage.to.PrimaryDataStoreTO; import org.apache.cloudstack.storage.to.PrimaryDataStoreTO;
import com.cloud.agent.api.Command; import com.cloud.agent.api.Command;
public class AttachPrimaryDataStoreCmd extends Command implements StorageSubSystemCommand { public class AttachPrimaryDataStoreCmd extends Command implements StorageSubSystemCommand {
private final PrimaryDataStoreTO dataStore; private final PrimaryDataStoreTO dataStore;
public AttachPrimaryDataStoreCmd(PrimaryDataStoreInfo dataStore) { public AttachPrimaryDataStoreCmd(PrimaryDataStoreTO dataStore) {
this.dataStore = new PrimaryDataStoreTO(dataStore); this.dataStore = dataStore;
} }
public PrimaryDataStoreTO getDataStore() { public PrimaryDataStoreTO getDataStore() {

View File

@ -1,5 +1,6 @@
package org.apache.cloudstack.storage.command; package org.apache.cloudstack.storage.command;
import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreInfo;
import org.apache.cloudstack.storage.to.PrimaryDataStoreTO; import org.apache.cloudstack.storage.to.PrimaryDataStoreTO;
import com.cloud.agent.api.Command; import com.cloud.agent.api.Command;

View File

@ -27,6 +27,8 @@ import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
import org.apache.cloudstack.storage.EndPoint; import org.apache.cloudstack.storage.EndPoint;
import org.apache.cloudstack.storage.command.CommandResult; import org.apache.cloudstack.storage.command.CommandResult;
import org.apache.cloudstack.storage.image.TemplateInfo; 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.TemplateOnPrimaryDataStoreInfo;
public interface PrimaryDataStore extends PrimaryDataStoreInfo { public interface PrimaryDataStore extends PrimaryDataStoreInfo {
@ -53,4 +55,8 @@ public interface PrimaryDataStore extends PrimaryDataStoreInfo {
boolean installTemplate(TemplateOnPrimaryDataStoreInfo template); boolean installTemplate(TemplateOnPrimaryDataStoreInfo template);
VolumeDiskType getDefaultDiskType(); VolumeDiskType getDefaultDiskType();
PrimaryDataStoreTO getDataStoreTO();
VolumeTO getVolumeTO(VolumeInfo volume);
} }

View File

@ -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;
}
}

View File

@ -26,7 +26,7 @@ public class ImageOnPrimayDataStoreTO {
private final TemplateTO template; private final TemplateTO template;
public ImageOnPrimayDataStoreTO(TemplateOnPrimaryDataStoreInfo template) { public ImageOnPrimayDataStoreTO(TemplateOnPrimaryDataStoreInfo template) {
this.pathOnPrimaryDataStore = template.getPath(); this.pathOnPrimaryDataStore = template.getPath();
this.dataStore = new PrimaryDataStoreTO(template.getPrimaryDataStore()); this.dataStore = template.getPrimaryDataStore().getDataStoreTO();
this.template = new TemplateTO(template.getTemplate()); this.template = new TemplateTO(template.getTemplate());
} }

View File

@ -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;
}
}

View File

@ -6,10 +6,16 @@ public class PrimaryDataStoreTO {
private final String uuid; private final String uuid;
private final String name; private final String name;
private final String type; private final String type;
private final long id;
public PrimaryDataStoreTO(PrimaryDataStoreInfo dataStore) { public PrimaryDataStoreTO(PrimaryDataStoreInfo dataStore) {
this.uuid = dataStore.getUuid(); this.uuid = dataStore.getUuid();
this.name = dataStore.getName(); this.name = dataStore.getName();
this.type = dataStore.getType(); this.type = dataStore.getType();
this.id = dataStore.getId();
}
public long getId() {
return this.id;
} }
public String getUuid() { public String getUuid() {

View File

@ -19,5 +19,5 @@
package org.apache.cloudstack.storage.datastore; package org.apache.cloudstack.storage.datastore;
public enum DataStoreStatus { public enum DataStoreStatus {
Initial, Initialized, Creating, Up, PrepareForMaintenance, ErrorInMaintenance, CancelMaintenance, Maintenance, Removed; Initial, Initialized, Creating, Attaching, Up, PrepareForMaintenance, ErrorInMaintenance, CancelMaintenance, Maintenance, Removed;
} }

View File

@ -15,9 +15,13 @@ import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
import org.apache.cloudstack.storage.EndPoint; import org.apache.cloudstack.storage.EndPoint;
import org.apache.cloudstack.storage.HypervisorHostEndPoint; import org.apache.cloudstack.storage.HypervisorHostEndPoint;
import org.apache.cloudstack.storage.command.CommandResult; 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.db.PrimaryDataStoreVO;
import org.apache.cloudstack.storage.datastore.driver.PrimaryDataStoreDriver; import org.apache.cloudstack.storage.datastore.driver.PrimaryDataStoreDriver;
import org.apache.cloudstack.storage.image.TemplateInfo; 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.TemplateOnPrimaryDataStoreInfo;
import org.apache.cloudstack.storage.volume.TemplatePrimaryDataStoreManager; import org.apache.cloudstack.storage.volume.TemplatePrimaryDataStoreManager;
import org.apache.cloudstack.storage.volume.VolumeObject; import org.apache.cloudstack.storage.volume.VolumeObject;
@ -36,17 +40,19 @@ public class DefaultPrimaryDataStore implements PrimaryDataStore {
private static final Logger s_logger = Logger.getLogger(DefaultPrimaryDataStore.class); private static final Logger s_logger = Logger.getLogger(DefaultPrimaryDataStore.class);
protected PrimaryDataStoreDriver driver; protected PrimaryDataStoreDriver driver;
protected PrimaryDataStoreVO pdsv; protected PrimaryDataStoreVO pdsv;
protected PrimaryDataStoreInfo pdsInfo;
protected PrimaryDataStoreLifeCycle lifeCycle; protected PrimaryDataStoreLifeCycle lifeCycle;
protected PrimaryDataStoreProvider provider; protected PrimaryDataStoreProvider provider;
protected StorageProtocolTransformer protocalTransformer;
private HypervisorType supportedHypervisor; private HypervisorType supportedHypervisor;
private boolean isLocalStorageSupported = false; private boolean isLocalStorageSupported = false;
@Inject @Inject
private VolumeDao volumeDao; private VolumeDao volumeDao;
@Inject @Inject
HostDao hostDao; private HostDao hostDao;
@Inject @Inject
TemplatePrimaryDataStoreManager templatePrimaryStoreMgr; private PrimaryDataStoreDao dataStoreDao;
@Inject
private TemplatePrimaryDataStoreManager templatePrimaryStoreMgr;
private DefaultPrimaryDataStore(PrimaryDataStoreVO pdsv) { private DefaultPrimaryDataStore(PrimaryDataStoreVO pdsv) {
this.pdsv = pdsv; this.pdsv = pdsv;
@ -66,6 +72,20 @@ public class DefaultPrimaryDataStore implements PrimaryDataStore {
this.provider = provider; 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) { public static DefaultPrimaryDataStore createDataStore(PrimaryDataStoreVO pdsv) {
DefaultPrimaryDataStore dataStore = new DefaultPrimaryDataStore(pdsv); DefaultPrimaryDataStore dataStore = new DefaultPrimaryDataStore(pdsv);
return ComponentInject.inject(dataStore); return ComponentInject.inject(dataStore);
@ -97,8 +117,13 @@ public class DefaultPrimaryDataStore implements PrimaryDataStore {
public List<EndPoint> getEndPoints() { public List<EndPoint> getEndPoints() {
Long clusterId = pdsv.getClusterId(); Long clusterId = pdsv.getClusterId();
if (clusterId == null) { if (clusterId == null) {
return null; pdsv = dataStoreDao.findById(pdsv.getId());
clusterId = pdsv.getClusterId();
if (clusterId == null) {
return new ArrayList<EndPoint>();
} }
}
List<EndPoint> endpoints = new ArrayList<EndPoint>(); List<EndPoint> endpoints = new ArrayList<EndPoint>();
List<HostVO> hosts = hostDao.findHypervisorHostInCluster(clusterId); List<HostVO> hosts = hostDao.findHypervisorHostInCluster(clusterId);
for (HostVO host : hosts) { for (HostVO host : hosts) {
@ -206,26 +231,22 @@ public class DefaultPrimaryDataStore implements PrimaryDataStore {
@Override @Override
public String getUuid() { public String getUuid() {
// TODO Auto-generated method stub return this.pdsv.getUuid();
return null;
} }
@Override @Override
public DataCenterResourceEntity.State getManagedState() { public DataCenterResourceEntity.State getManagedState() {
// TODO Auto-generated method stub
return null; return null;
} }
@Override @Override
public String getName() { public String getName() {
// TODO Auto-generated method stub return this.pdsv.getName();
return null;
} }
@Override @Override
public String getType() { public String getType() {
// TODO Auto-generated method stub return this.pdsv.getPoolType();
return null;
} }
@Override @Override

View File

@ -12,19 +12,13 @@ import com.cloud.utils.exception.CloudRuntimeException;
public abstract class AbstractPrimaryDataStoreConfigurator implements PrimaryDataStoreConfigurator { public abstract class AbstractPrimaryDataStoreConfigurator implements PrimaryDataStoreConfigurator {
@Inject @Inject
PrimaryDataStoreDao dataStoreDao; protected PrimaryDataStoreDao dataStoreDao;
protected PrimaryDataStoreLifeCycle getLifeCycle() { protected abstract PrimaryDataStoreLifeCycle getLifeCycle();
return null;
}
protected PrimaryDataStoreDriver getDriver() { protected abstract PrimaryDataStoreDriver getDriver();
return null;
}
protected boolean isLocalStorageSupported() { protected abstract boolean isLocalStorageSupported();
return false;
}
@Override @Override
public PrimaryDataStore getDataStore(long dataStoreId) { public PrimaryDataStore getDataStore(long dataStoreId) {
@ -34,10 +28,11 @@ public abstract class AbstractPrimaryDataStoreConfigurator implements PrimaryDat
} }
DefaultPrimaryDataStore dataStore = DefaultPrimaryDataStore.createDataStore(dataStoreVO); DefaultPrimaryDataStore dataStore = DefaultPrimaryDataStore.createDataStore(dataStoreVO);
dataStore.setDriver(this.getDriver()); dataStore.setDriver(getDriver());
dataStore.setLifeCycle(getLifeCycle()); dataStore.setLifeCycle(getLifeCycle());
dataStore.setSupportedHypervisor(getSupportedHypervisor()); dataStore.setSupportedHypervisor(getSupportedHypervisor());
dataStore.setLocalStorageFlag(isLocalStorageSupported()); dataStore.setLocalStorageFlag(isLocalStorageSupported());
dataStore.setProtocolTransFormer(getProtocolTransformer());
return dataStore; return dataStore;
} }
} }

View File

@ -19,7 +19,7 @@
package org.apache.cloudstack.storage.datastore.configurator; package org.apache.cloudstack.storage.datastore.configurator;
import org.apache.cloudstack.storage.datastore.PrimaryDataStore; 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.hypervisor.Hypervisor.HypervisorType;
import com.cloud.storage.Storage.StoragePoolType; import com.cloud.storage.Storage.StoragePoolType;
@ -28,5 +28,5 @@ public interface PrimaryDataStoreConfigurator {
public HypervisorType getSupportedHypervisor(); public HypervisorType getSupportedHypervisor();
public String getSupportedDataStoreType(); public String getSupportedDataStoreType();
public PrimaryDataStore getDataStore(long dataStoreId); public PrimaryDataStore getDataStore(long dataStoreId);
public ProtocolValidator getValidator(); public StorageProtocolTransformer getProtocolTransformer();
} }

View File

@ -19,7 +19,7 @@
package org.apache.cloudstack.storage.datastore.configurator.kvm; 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.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.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -33,9 +33,15 @@ public class KvmCLVMConfigurator extends AbstractKvmConfigurator {
} }
@Override @Override
public ProtocolValidator getValidator() { public StorageProtocolTransformer getProtocolTransformer() {
return new CLVMValidator(); return new CLVMValidator();
} }
@Override
protected boolean isLocalStorageSupported() {
// TODO Auto-generated method stub
return false;
}
} }

View File

@ -18,22 +18,32 @@
*/ */
package org.apache.cloudstack.storage.datastore.configurator.kvm; 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.NfsProtocolTransformer;
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.PrimaryDataStoreDao;
import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import com.cloud.utils.component.Inject;
@Component @Component
@Qualifier("defaultProvider") @Qualifier("defaultProvider")
public class KvmNfsConfigurator extends AbstractKvmConfigurator { public class KvmNfsConfigurator extends AbstractKvmConfigurator {
@Inject
PrimaryDataStoreDao dataStoreDao;
@Override @Override
public String getSupportedDataStoreType() { public String getSupportedDataStoreType() {
return "nfs"; return "nfs";
} }
@Override @Override
public ProtocolValidator getValidator() { public StorageProtocolTransformer getProtocolTransformer() {
return new NfsValidator(); return new NfsProtocolTransformer(dataStoreDao);
}
@Override
protected boolean isLocalStorageSupported() {
// TODO Auto-generated method stub
return false;
} }
} }

View File

@ -18,7 +18,7 @@
*/ */
package org.apache.cloudstack.storage.datastore.configurator.kvm; 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.apache.cloudstack.storage.datastore.configurator.validator.RBDValidator;
import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -29,13 +29,18 @@ import com.cloud.storage.Storage.StoragePoolType;
@Qualifier("defaultProvider") @Qualifier("defaultProvider")
public class KvmRBDConfigurator extends AbstractKvmConfigurator { public class KvmRBDConfigurator extends AbstractKvmConfigurator {
@Override
public String getSupportedDataStoreType() { public String getSupportedDataStoreType() {
return "rbd"; return "rbd";
} }
@Override @Override
public ProtocolValidator getValidator() { public StorageProtocolTransformer getProtocolTransformer() {
return new RBDValidator(); return new RBDValidator();
} }
@Override
protected boolean isLocalStorageSupported() {
// TODO Auto-generated method stub
return false;
}
} }

View File

@ -21,10 +21,15 @@ package org.apache.cloudstack.storage.datastore.configurator.validator;
import java.util.List; import java.util.List;
import java.util.Map; 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 @Override
public boolean validate(Map<String, String> params) { public boolean normalizeUserInput(Map<String, String> params) {
// TODO Auto-generated method stub // TODO Auto-generated method stub
return false; return false;
} }
@ -35,4 +40,17 @@ public class CLVMValidator implements ProtocolValidator {
return null; 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;
}
} }

View File

@ -21,10 +21,15 @@ package org.apache.cloudstack.storage.datastore.configurator.validator;
import java.util.List; import java.util.List;
import java.util.Map; 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 @Override
public boolean validate(Map<String, String> params) { public boolean normalizeUserInput(Map<String, String> params) {
// TODO Auto-generated method stub // TODO Auto-generated method stub
return false; return false;
} }
@ -35,4 +40,17 @@ public class FileSystemValidator implements ProtocolValidator {
return null; 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;
}
} }

View File

@ -21,13 +21,12 @@ package org.apache.cloudstack.storage.datastore.configurator.validator;
import java.util.List; import java.util.List;
import java.util.Map; 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 class ISCSIValiator implements StorageProtocolTransformer {
public boolean validate(Map<String, String> params) {
// TODO Auto-generated method stub
return false;
}
@Override @Override
public List<String> getInputParamNames() { public List<String> getInputParamNames() {
@ -35,4 +34,22 @@ public class ISCSIValiator implements ProtocolValidator {
return null; return null;
} }
@Override
public boolean normalizeUserInput(Map<String, String> 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;
}
} }

View File

@ -25,12 +25,25 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.UUID; 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; 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 @Override
public boolean validate(Map<String, String> params) { public boolean normalizeUserInput(Map<String, String> params) {
String url = params.get("url"); String url = params.get("url");
try { try {
@ -49,8 +62,7 @@ public class NfsValidator implements ProtocolValidator {
params.put("path", hostPath); params.put("path", hostPath);
params.put("user", userInfo); params.put("user", userInfo);
params.put("port", String.valueOf(port)); 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) { } catch (URISyntaxException e) {
throw new CloudRuntimeException("invalid url: " + e.toString()); throw new CloudRuntimeException("invalid url: " + e.toString());
} }
@ -65,4 +77,19 @@ public class NfsValidator implements ProtocolValidator {
return paramNames; 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;
}
} }

View File

@ -21,10 +21,15 @@ package org.apache.cloudstack.storage.datastore.configurator.validator;
import java.util.List; import java.util.List;
import java.util.Map; 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 @Override
public boolean validate(Map<String, String> params) { public boolean normalizeUserInput(Map<String, String> params) {
// TODO Auto-generated method stub // TODO Auto-generated method stub
return false; return false;
} }
@ -35,4 +40,16 @@ public class RBDValidator implements ProtocolValidator {
return null; 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;
}
} }

View File

@ -21,7 +21,14 @@ package org.apache.cloudstack.storage.datastore.configurator.validator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
public interface ProtocolValidator { import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreInfo;
public boolean validate(Map<String, String> params); 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<String, String> params);
public PrimaryDataStoreTO getDataStoreTO(PrimaryDataStoreInfo dataStore);
public VolumeTO getVolumeTO(VolumeInfo volume);
public List<String> getInputParamNames(); public List<String> getInputParamNames();
} }

View File

@ -21,10 +21,15 @@ package org.apache.cloudstack.storage.datastore.configurator.validator;
import java.util.List; import java.util.List;
import java.util.Map; 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 @Override
public boolean validate(Map<String, String> params) { public boolean normalizeUserInput(Map<String, String> params) {
// TODO Auto-generated method stub // TODO Auto-generated method stub
return false; return false;
} }
@ -35,4 +40,16 @@ public class VMFSValidator implements ProtocolValidator {
return null; 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;
}
} }

View File

@ -19,7 +19,7 @@
package org.apache.cloudstack.storage.datastore.configurator.vmware; 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.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.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -27,14 +27,19 @@ import org.springframework.stereotype.Component;
@Qualifier("defaultProvider") @Qualifier("defaultProvider")
public class VmwareIsciConfigurator extends AbstractVmwareConfigurator { public class VmwareIsciConfigurator extends AbstractVmwareConfigurator {
@Override
public String getSupportedDataStoreType() { public String getSupportedDataStoreType() {
return "iscsi"; return "iscsi";
} }
@Override @Override
public ProtocolValidator getValidator() { public StorageProtocolTransformer getProtocolTransformer() {
return new ISCSIValiator(); return new ISCSIValiator();
} }
@Override
protected boolean isLocalStorageSupported() {
// TODO Auto-generated method stub
return false;
}
} }

View File

@ -18,24 +18,33 @@
*/ */
package org.apache.cloudstack.storage.datastore.configurator.vmware; 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.NfsProtocolTransformer;
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.PrimaryDataStoreDao;
import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import com.cloud.storage.Storage.StoragePoolType; import com.cloud.storage.Storage.StoragePoolType;
import com.cloud.utils.component.Inject;
@Component @Component
@Qualifier("defaultProvider") @Qualifier("defaultProvider")
public class VmwareNfsConfigurator extends AbstractVmwareConfigurator { public class VmwareNfsConfigurator extends AbstractVmwareConfigurator {
@Inject
PrimaryDataStoreDao dataStoreDao;
@Override @Override
public String getSupportedDataStoreType() { public String getSupportedDataStoreType() {
return "nfs"; return "nfs";
} }
@Override @Override
public ProtocolValidator getValidator() { public StorageProtocolTransformer getProtocolTransformer() {
return new NfsValidator(); return new NfsProtocolTransformer(dataStoreDao);
}
@Override
protected boolean isLocalStorageSupported() {
// TODO Auto-generated method stub
return false;
} }
} }

View File

@ -18,7 +18,7 @@
*/ */
package org.apache.cloudstack.storage.datastore.configurator.vmware; 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.apache.cloudstack.storage.datastore.configurator.validator.VMFSValidator;
import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -35,7 +35,13 @@ public class VmwareVMFSConfigurator extends AbstractVmwareConfigurator {
} }
@Override @Override
public ProtocolValidator getValidator() { public StorageProtocolTransformer getProtocolTransformer() {
return new VMFSValidator(); return new VMFSValidator();
} }
@Override
protected boolean isLocalStorageSupported() {
// TODO Auto-generated method stub
return false;
}
} }

View File

@ -1,25 +1,14 @@
package org.apache.cloudstack.storage.datastore.configurator.xen; 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.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.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.DefaultPrimaryDataStoreDriverImpl;
import org.apache.cloudstack.storage.datastore.driver.PrimaryDataStoreDriver; import org.apache.cloudstack.storage.datastore.driver.PrimaryDataStoreDriver;
import org.apache.cloudstack.storage.datastore.lifecycle.DefaultXenPrimaryDataStoreLifeCycle; import org.apache.cloudstack.storage.datastore.lifecycle.DefaultXenPrimaryDataStoreLifeCycle;
import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.utils.exception.CloudRuntimeException;
public abstract class AbstractXenConfigurator extends AbstractPrimaryDataStoreConfigurator { public abstract class AbstractXenConfigurator extends AbstractPrimaryDataStoreConfigurator {
@Inject
PrimaryDataStoreDao dataStoreDao;
@Override @Override
public HypervisorType getSupportedHypervisor() { public HypervisorType getSupportedHypervisor() {
return HypervisorType.XenServer; return HypervisorType.XenServer;
@ -32,17 +21,4 @@ public abstract class AbstractXenConfigurator extends AbstractPrimaryDataStoreCo
protected PrimaryDataStoreDriver getDriver() { protected PrimaryDataStoreDriver getDriver() {
return new DefaultPrimaryDataStoreDriverImpl(); 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;
}
} }

View File

@ -19,7 +19,7 @@
package org.apache.cloudstack.storage.datastore.configurator.xen; 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.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.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -33,8 +33,13 @@ public class XenIscsiConfigurator extends AbstractXenConfigurator {
} }
@Override @Override
public ProtocolValidator getValidator() { public StorageProtocolTransformer getProtocolTransformer() {
return new ISCSIValiator(); return new ISCSIValiator();
} }
protected boolean isLocalStorageSupported() {
// TODO Auto-generated method stub
return false;
}
} }

View File

@ -18,24 +18,32 @@
*/ */
package org.apache.cloudstack.storage.datastore.configurator.xen; 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.NfsProtocolTransformer;
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.PrimaryDataStoreDao;
import org.apache.cloudstack.storage.datastore.protocol.DataStoreProtocol;
import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import com.cloud.storage.Storage.StoragePoolType; import com.cloud.storage.Storage.StoragePoolType;
import com.cloud.utils.component.Inject;
@Component @Component
@Qualifier("defaultProvider") @Qualifier("defaultProvider")
public class XenNfsConfigurator extends AbstractXenConfigurator { public class XenNfsConfigurator extends AbstractXenConfigurator {
@Override @Override
public String getSupportedDataStoreType() { public String getSupportedDataStoreType() {
return "nfs"; return DataStoreProtocol.NFS.toString();
} }
@Override @Override
public ProtocolValidator getValidator() { public StorageProtocolTransformer getProtocolTransformer() {
return new NfsValidator(); return new NfsProtocolTransformer(dataStoreDao);
}
@Override
protected boolean isLocalStorageSupported() {
// TODO Auto-generated method stub
return false;
} }
} }

View File

@ -47,7 +47,7 @@ public class DefaultPrimaryDataStoreDriverImpl implements PrimaryDataStoreDriver
// which can access its datastore // which can access its datastore
List<EndPoint> endPoints = vol.getDataStore().getEndPoints(); List<EndPoint> endPoints = vol.getDataStore().getEndPoints();
VolumeInfo volInfo = vol; VolumeInfo volInfo = vol;
CreateVolumeCommand createCmd = new CreateVolumeCommand(new VolumeTO(volInfo)); CreateVolumeCommand createCmd = new CreateVolumeCommand(this.dataStore.getVolumeTO(volInfo));
Answer answer = sendOutCommand(createCmd, endPoints); Answer answer = sendOutCommand(createCmd, endPoints);
CreateVolumeAnswer volAnswer = (CreateVolumeAnswer) answer; CreateVolumeAnswer volAnswer = (CreateVolumeAnswer) answer;

View File

@ -52,8 +52,8 @@ public class DefaultPrimaryDataStoreLifeCycleImpl implements PrimaryDataStoreLif
} }
protected void attachCluster() { protected void attachCluster() {
//send down createStoragePool command to all the hosts in the cluster //send down AttachPrimaryDataStoreCmd command to all the hosts in the cluster
AttachPrimaryDataStoreCmd cmd = new AttachPrimaryDataStoreCmd(this.dataStore); AttachPrimaryDataStoreCmd cmd = new AttachPrimaryDataStoreCmd(this.dataStore.getDataStoreTO());
for (EndPoint ep : dataStore.getEndPoints()) { for (EndPoint ep : dataStore.getEndPoints()) {
ep.sendMessage(cmd); ep.sendMessage(cmd);
} }
@ -61,14 +61,19 @@ public class DefaultPrimaryDataStoreLifeCycleImpl implements PrimaryDataStoreLif
@Override @Override
public boolean attachCluster(ClusterScope scope) { public boolean attachCluster(ClusterScope scope) {
attachCluster();
PrimaryDataStoreVO dataStoreVO = dataStoreDao.findById(this.dataStore.getId()); PrimaryDataStoreVO dataStoreVO = dataStoreDao.findById(this.dataStore.getId());
dataStoreVO.setDataCenterId(scope.getZoneId()); dataStoreVO.setDataCenterId(scope.getZoneId());
dataStoreVO.setPodId(scope.getPodId()); dataStoreVO.setPodId(scope.getPodId());
dataStoreVO.setClusterId(scope.getScopeId()); dataStoreVO.setClusterId(scope.getScopeId());
dataStoreVO.setStatus(DataStoreStatus.Attaching);
dataStoreDao.update(dataStoreVO.getId(), dataStoreVO);
attachCluster();
dataStoreVO = dataStoreDao.findById(this.dataStore.getId());
dataStoreVO.setStatus(DataStoreStatus.Up); dataStoreVO.setStatus(DataStoreStatus.Up);
dataStoreDao.update(dataStoreVO.getId(), dataStoreVO); dataStoreDao.update(dataStoreVO.getId(), dataStoreVO);
return true; return true;
} }

View File

@ -20,6 +20,7 @@ package org.apache.cloudstack.storage.datastore.lifecycle;
import org.apache.cloudstack.storage.EndPoint; import org.apache.cloudstack.storage.EndPoint;
import org.apache.cloudstack.storage.command.AttachPrimaryDataStoreCmd; import org.apache.cloudstack.storage.command.AttachPrimaryDataStoreCmd;
import org.apache.cloudstack.storage.command.CreatePrimaryDataStoreCmd;
import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
import com.cloud.agent.api.Answer; import com.cloud.agent.api.Answer;
@ -39,7 +40,7 @@ public class DefaultXenPrimaryDataStoreLifeCycle extends DefaultPrimaryDataStore
@Override @Override
public void attachCluster() { public void attachCluster() {
//send one time is enough, as xenserver is clustered //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; String result = null;
for (EndPoint ep : dataStore.getEndPoints()) { for (EndPoint ep : dataStore.getEndPoints()) {
Answer answer = ep.sendMessage(cmd); Answer answer = ep.sendMessage(cmd);
@ -49,8 +50,9 @@ public class DefaultXenPrimaryDataStoreLifeCycle extends DefaultPrimaryDataStore
result = answer.getDetails(); result = answer.getDetails();
} }
if (result != null)
throw new CloudRuntimeException("AttachPrimaryDataStoreCmd failed: " + result); throw new CloudRuntimeException("AttachPrimaryDataStoreCmd failed: " + result);
}
super.attachCluster();
}
} }

View File

@ -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.DefaultPrimaryDataStore;
import org.apache.cloudstack.storage.datastore.PrimaryDataStore; import org.apache.cloudstack.storage.datastore.PrimaryDataStore;
import org.apache.cloudstack.storage.datastore.configurator.PrimaryDataStoreConfigurator; 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.PrimaryDataStoreProviderDao;
import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreProviderVO; import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreProviderVO;
import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreVO; import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreVO;
@ -44,21 +44,6 @@ public class DefaultPrimaryDatastoreProviderImpl implements PrimaryDataStoreProv
protected ClusterDao clusterDao; protected ClusterDao clusterDao;
protected Map<String, PrimaryDataStoreConfigurator> configuratorMaps = new HashMap<String, PrimaryDataStoreConfigurator>(); protected Map<String, PrimaryDataStoreConfigurator> configuratorMaps = new HashMap<String, PrimaryDataStoreConfigurator>();
@Qualifier("defaultProvider")
@Inject
List<PrimaryDataStoreConfigurator> defaultConfigurators;
public DefaultPrimaryDatastoreProviderImpl() {
}
@PostConstruct
public void intialize() {
for (PrimaryDataStoreConfigurator configurator : defaultConfigurators) {
String key = generateKey(configurator.getSupportedHypervisor(), configurator.getSupportedDataStoreType().toString());
configuratorMaps.put(key, configurator);
}
}
@Inject @Inject
public DefaultPrimaryDatastoreProviderImpl(@Qualifier("defaultProvider") List<PrimaryDataStoreConfigurator> configurators) { public DefaultPrimaryDatastoreProviderImpl(@Qualifier("defaultProvider") List<PrimaryDataStoreConfigurator> configurators) {
for (PrimaryDataStoreConfigurator configurator : configurators) { for (PrimaryDataStoreConfigurator configurator : configurators) {
@ -114,10 +99,15 @@ public class DefaultPrimaryDatastoreProviderImpl implements PrimaryDataStoreProv
throw new CloudRuntimeException("can't find configurator from key: " + key); throw new CloudRuntimeException("can't find configurator from key: " + key);
} }
ProtocolValidator validator = configurator.getValidator(); StorageProtocolTransformer validator = configurator.getProtocolTransformer();
validator.validate(dsInfos); 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.setStorageProviderId(this.getId());
dataStoreVO.setHostAddress(dsInfos.get("server")); dataStoreVO.setHostAddress(dsInfos.get("server"));
dataStoreVO.setPath(dsInfos.get("path")); dataStoreVO.setPath(dsInfos.get("path"));

View File

@ -71,13 +71,17 @@ public class TemplateOnPrimaryDataStoreObject implements TemplateOnPrimaryDataSt
public void updateStatus(Status status) { public void updateStatus(Status status) {
vo.setDownloadState(status); vo.setDownloadState(status);
templateStoreDao.update(vo.getId(), vo); templateStoreDao.update(vo.getId(), vo);
vo = templateStoreDao.findById(vo.getId());
} }
public void stateTransit(TemplateOnPrimaryDataStoreStateMachine.Event event) { public void stateTransit(TemplateOnPrimaryDataStoreStateMachine.Event event) {
try { try {
this.stateMachine.transitTo(vo, event, null, templateStoreDao); this.stateMachine.transitTo(vo, event, null, templateStoreDao);
vo = templateStoreDao.findById(vo.getId());
} catch (NoTransitionException e) { } catch (NoTransitionException e) {
throw new CloudRuntimeException("Failed change state", e); throw new CloudRuntimeException("Failed change state", e);
} catch (Exception e) {
throw new CloudRuntimeException("Failed change state", e);
} }
} }
} }

View File

@ -187,10 +187,8 @@ public class VolumeServiceImpl implements VolumeService {
CommandResult result = callback.getResult(); CommandResult result = callback.getResult();
TemplateOnPrimaryDataStoreObject templateOnPrimaryStoreObj = context.getTemplate(); TemplateOnPrimaryDataStoreObject templateOnPrimaryStoreObj = context.getTemplate();
if (result.isSuccess()) { if (result.isSuccess()) {
templateOnPrimaryStoreObj.updateStatus(Status.DOWNLOADED);
templateOnPrimaryStoreObj.stateTransit(TemplateOnPrimaryDataStoreStateMachine.Event.OperationSuccessed); templateOnPrimaryStoreObj.stateTransit(TemplateOnPrimaryDataStoreStateMachine.Event.OperationSuccessed);
} else { } else {
templateOnPrimaryStoreObj.updateStatus(Status.ABANDONED);
templateOnPrimaryStoreObj.stateTransit(TemplateOnPrimaryDataStoreStateMachine.Event.OperationFailed); templateOnPrimaryStoreObj.stateTransit(TemplateOnPrimaryDataStoreStateMachine.Event.OperationFailed);
} }

View File

@ -22,6 +22,8 @@ package org.apache.cloudstack.framework.async;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; 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.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy; import net.sf.cglib.proxy.MethodProxy;
@ -52,14 +54,33 @@ public class AsyncCallbackDispatcher<T> implements AsyncCompletionCallback {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public T getTarget() { public T getTarget() {
return (T)Enhancer.create(_targetObject.getClass(), new MethodInterceptor() { Enhancer en = new Enhancer();
en.setSuperclass(_targetObject.getClass());
en.setCallbacks(new Callback[]{new MethodInterceptor() {
@Override @Override
public Object intercept(Object arg0, Method arg1, Object[] arg2, public Object intercept(Object arg0, Method arg1, Object[] arg2,
MethodProxy arg3) throws Throwable { MethodProxy arg3) throws Throwable {
_callbackMethod = arg1; _callbackMethod = arg1;
return null; 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<T> setCallback(Object useless) { public AsyncCallbackDispatcher<T> setCallback(Object useless) {

View File

@ -338,6 +338,9 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
s_statesTable.put(Types.VmPowerState.UNRECOGNIZED, State.Unknown); s_statesTable.put(Types.VmPowerState.UNRECOGNIZED, State.Unknown);
} }
public XsHost getHost() {
return this._host;
}
protected boolean cleanupHaltedVms(Connection conn) throws XenAPIException, XmlRpcException { protected boolean cleanupHaltedVms(Connection conn) throws XenAPIException, XmlRpcException {
Host host = Host.getByUuid(conn, _host.uuid); Host host = Host.getByUuid(conn, _host.uuid);

View File

@ -33,9 +33,13 @@ import org.apache.cloudstack.storage.command.AttachPrimaryDataStoreCmd;
import org.apache.cloudstack.storage.command.CopyTemplateToPrimaryStorageCmd; import org.apache.cloudstack.storage.command.CopyTemplateToPrimaryStorageCmd;
import org.apache.cloudstack.storage.command.CopyTemplateToPrimaryStorageAnswer; import org.apache.cloudstack.storage.command.CopyTemplateToPrimaryStorageAnswer;
import org.apache.cloudstack.storage.command.CreatePrimaryDataStoreCmd; 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.command.StorageSubSystemCommand;
import org.apache.cloudstack.storage.datastore.protocol.DataStoreProtocol;
import org.apache.cloudstack.storage.to.ImageDataStoreTO; import org.apache.cloudstack.storage.to.ImageDataStoreTO;
import org.apache.cloudstack.storage.to.ImageOnPrimayDataStoreTO; 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.PrimaryDataStoreTO;
import org.apache.cloudstack.storage.to.TemplateTO; import org.apache.cloudstack.storage.to.TemplateTO;
import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpClient;
@ -86,14 +90,20 @@ public class XenServerStorageResource {
return this.execute((AttachPrimaryDataStoreCmd)command); return this.execute((AttachPrimaryDataStoreCmd)command);
} else if (command instanceof CreatePrimaryDataStoreCmd) { } else if (command instanceof CreatePrimaryDataStoreCmd) {
return execute((CreatePrimaryDataStoreCmd) command); return execute((CreatePrimaryDataStoreCmd) command);
} else if (command instanceof CreateVolumeFromBaseImageCommand) {
return execute((CreateVolumeFromBaseImageCommand)command);
} }
return new Answer((Command)command, false, "not implemented yet"); 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<String, String> deviceConfig = new HashMap<String, String>(); Map<String, String> deviceConfig = new HashMap<String, String>();
try { try {
String server = pool.getHost(); String server = pool.getServer();
String serverpath = pool.getPath(); String serverpath = pool.getPath();
serverpath = serverpath.replace("//", "/"); serverpath = serverpath.replace("//", "/");
Set<SR> srs = SR.getAll(conn); Set<SR> srs = SR.getAll(conn);
@ -125,13 +135,13 @@ public class XenServerStorageResource {
if (server.equals(dc.get("server")) && serverpath.equals(dc.get("serverpath"))) { 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:" 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("server", server);
deviceConfig.put("serverpath", serverpath); 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, SR sr = SR.create(conn, host, deviceConfig, new Long(0), pool.getUuid(), Long.toString(pool.getId()), SRType.NFS.toString(), "user", true,
new HashMap<String, String>()); new HashMap<String, String>());
sr.scan(conn); sr.scan(conn);
@ -142,7 +152,7 @@ public class XenServerStorageResource {
throw new CloudRuntimeException("Unable to create NFS SR " + pool.toString(), e); throw new CloudRuntimeException("Unable to create NFS SR " + pool.toString(), e);
} }
} }
/*
protected SR getIscsiSR(Connection conn, PrimaryDataStoreTO pool) { protected SR getIscsiSR(Connection conn, PrimaryDataStoreTO pool) {
synchronized (pool.getUuid().intern()) { synchronized (pool.getUuid().intern()) {
Map<String, String> deviceConfig = new HashMap<String, String>(); Map<String, String> deviceConfig = new HashMap<String, String>();
@ -271,9 +281,9 @@ public class XenServerStorageResource {
Connection conn = hypervisorResource.getConnection(); Connection conn = hypervisorResource.getConnection();
PrimaryDataStoreTO dataStore = cmd.getDataStore(); PrimaryDataStoreTO dataStore = cmd.getDataStore();
try { try {
if (dataStore.getType() == StoragePoolType.NetworkFilesystem.toString()) { if (DataStoreProtocol.NFS.toString().equalsIgnoreCase(dataStore.getType())) {
//getNfsSR(conn, dataStore); getNfsSR(conn, (NfsPrimaryDataStoreTO)dataStore);
} else if (dataStore.getType() == StoragePoolType.IscsiLUN.toString()) { } else if (DataStoreProtocol.NFS.toString().equalsIgnoreCase(dataStore.getType())) {
//getIscsiSR(conn, dataStore); //getIscsiSR(conn, dataStore);
} else if (dataStore.getType() == StoragePoolType.PreSetup.toString()) { } else if (dataStore.getType() == StoragePoolType.PreSetup.toString()) {
} else { } else {
@ -366,11 +376,11 @@ public class XenServerStorageResource {
boolean result = false; boolean result = false;
try { try {
SR sr = SR.getByUuid(conn, primaryStoreUuid); Set<SR> srs = SR.getByNameLabel(conn, primaryStoreUuid);
if (sr == null) { if (srs.size() != 1) {
throw new CloudRuntimeException("storage uuid: " + primaryStoreUuid + " is not unique"); throw new CloudRuntimeException("storage uuid: " + primaryStoreUuid + " is not unique");
} }
poolsr = sr; poolsr = srs.iterator().next();
VDI.Record vdir = new VDI.Record(); VDI.Record vdir = new VDI.Record();
vdir.nameLabel = "Base-Image-" + UUID.randomUUID().toString(); vdir.nameLabel = "Base-Image-" + UUID.randomUUID().toString();
vdir.SR = poolsr; vdir.SR = poolsr;
@ -381,15 +391,20 @@ public class XenServerStorageResource {
vdir = vdi.getRecord(conn); vdir = vdi.getRecord(conn);
String vdiLocation = vdir.location; String vdiLocation = vdir.location;
String pbdLocation = null;
if (primarDataStore.getType().equalsIgnoreCase(DataStoreProtocol.NFS.toString())) {
pbdLocation = "/run/sr-mount/" + poolsr.getUuid(conn);
} else {
Set<PBD> pbds = poolsr.getPBDs(conn); Set<PBD> pbds = poolsr.getPBDs(conn);
if (pbds.size() != 1) { if (pbds.size() != 1) {
throw new CloudRuntimeException("Don't how to handle multiple pbds:" + pbds.size() + " for sr: " + poolsr.getUuid(conn)); throw new CloudRuntimeException("Don't how to handle multiple pbds:" + pbds.size() + " for sr: " + poolsr.getUuid(conn));
} }
PBD pbd = pbds.iterator().next(); PBD pbd = pbds.iterator().next();
Map<String, String> deviceCfg = pbd.getDeviceConfig(conn); Map<String, String> deviceCfg = pbd.getDeviceConfig(conn);
String pbdLocation = deviceCfg.get("location"); pbdLocation = deviceCfg.get("location");
}
if (pbdLocation == null) { 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"; String vdiPath = pbdLocation + "/" + vdiLocation + ".vhd";
@ -454,8 +469,7 @@ public class XenServerStorageResource {
protected Answer execute(CopyTemplateToPrimaryStorageCmd cmd) { protected Answer execute(CopyTemplateToPrimaryStorageCmd cmd) {
ImageOnPrimayDataStoreTO imageTO = cmd.getImage(); ImageOnPrimayDataStoreTO imageTO = cmd.getImage();
TemplateTO template = imageTO.getTemplate(); TemplateTO template = imageTO.getTemplate();
ImageDataStoreTO imageStore = template.getImageDataStore(); if (template.getPath().startsWith("http")) {
if (imageStore.getType().equalsIgnoreCase("http")) {
return directDownloadHttpTemplate(cmd, template, imageTO.getPrimaryDataStore()); return directDownloadHttpTemplate(cmd, template, imageTO.getPrimaryDataStore());
} else { } else {
return new Answer(cmd, false, "not implemented yet"); return new Answer(cmd, false, "not implemented yet");