mirror of
https://github.com/apache/cloudstack.git
synced 2025-12-16 02:22:52 +01:00
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:
parent
4b2d9f4415
commit
d99161399e
@ -41,4 +41,5 @@ public interface PrimaryDataStoreInfo {
|
|||||||
public String getType();
|
public String getType();
|
||||||
public PrimaryDataStoreLifeCycle getLifeCycle();
|
public PrimaryDataStoreLifeCycle getLifeCycle();
|
||||||
PrimaryDataStoreProvider getProvider();
|
PrimaryDataStoreProvider getProvider();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -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);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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"/>
|
||||||
|
|||||||
@ -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() {
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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() {
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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();
|
||||||
}
|
}
|
||||||
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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"));
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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) {
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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");
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user