finish configurator, the default primary storage provider can cover all the hypervisors and protocols

This commit is contained in:
Edison Su 2012-12-08 03:16:03 -08:00
parent 7652a44be7
commit cdf5511664
25 changed files with 372 additions and 187 deletions

View File

@ -37,6 +37,9 @@ public class DefaultPrimaryDataStore implements PrimaryDataStore {
protected PrimaryDataStoreVO pdsv; protected PrimaryDataStoreVO pdsv;
protected PrimaryDataStoreInfo pdsInfo; protected PrimaryDataStoreInfo pdsInfo;
protected PrimaryDataStoreLifeCycle lifeCycle; protected PrimaryDataStoreLifeCycle lifeCycle;
protected PrimaryDataStoreProvider provider;
private HypervisorType supportedHypervisor;
private boolean isLocalStorageSupported = false;
@Inject @Inject
private VolumeDao volumeDao; private VolumeDao volumeDao;
@Inject @Inject
@ -58,6 +61,10 @@ public class DefaultPrimaryDataStore implements PrimaryDataStore {
this.lifeCycle = lifeCycle; this.lifeCycle = lifeCycle;
} }
public void setProvider(PrimaryDataStoreProvider provider) {
this.provider = provider;
}
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);
@ -102,16 +109,22 @@ public class DefaultPrimaryDataStore implements PrimaryDataStore {
return endpoints; return endpoints;
} }
public void setSupportedHypervisor(HypervisorType type) {
this.supportedHypervisor = type;
}
@Override @Override
public boolean isHypervisorSupported(HypervisorType hypervisor) { public boolean isHypervisorSupported(HypervisorType hypervisor) {
// TODO Auto-generated method stub return (this.supportedHypervisor == hypervisor) ? true : false;
return false; }
public void setLocalStorageFlag(boolean supported) {
this.isLocalStorageSupported = supported;
} }
@Override @Override
public boolean isLocalStorageSupported() { public boolean isLocalStorageSupported() {
// TODO Auto-generated method stub return this.isLocalStorageSupported;
return false;
} }
@Override @Override
@ -208,13 +221,11 @@ public class DefaultPrimaryDataStore implements PrimaryDataStore {
@Override @Override
public PrimaryDataStoreLifeCycle getLifeCycle() { public PrimaryDataStoreLifeCycle getLifeCycle() {
// TODO Auto-generated method stub return lifeCycle;
return null;
} }
@Override @Override
public PrimaryDataStoreProvider getProvider() { public PrimaryDataStoreProvider getProvider() {
// TODO Auto-generated method stub return this.provider;
return null;
} }
} }

View File

@ -0,0 +1,43 @@
package org.apache.cloudstack.storage.datastore.configurator;
import javax.inject.Inject;
import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreLifeCycle;
import org.apache.cloudstack.storage.datastore.DefaultPrimaryDataStore;
import org.apache.cloudstack.storage.datastore.PrimaryDataStore;
import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreVO;
import org.apache.cloudstack.storage.datastore.driver.PrimaryDataStoreDriver;
import com.cloud.utils.exception.CloudRuntimeException;
public abstract class AbstractPrimaryDataStoreConfigurator implements PrimaryDataStoreConfigurator {
@Inject
PrimaryDataStoreDao dataStoreDao;
protected PrimaryDataStoreLifeCycle getLifeCycle() {
return null;
}
protected PrimaryDataStoreDriver getDriver() {
return null;
}
protected boolean isLocalStorageSupported() {
return false;
}
@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());
dataStore.setSupportedHypervisor(getSupportedHypervisor());
dataStore.setLocalStorageFlag(isLocalStorageSupported());
return dataStore;
}
}

View File

@ -26,7 +26,7 @@ import com.cloud.storage.Storage.StoragePoolType;
public interface PrimaryDataStoreConfigurator { public interface PrimaryDataStoreConfigurator {
public HypervisorType getSupportedHypervisor(); public HypervisorType getSupportedHypervisor();
public StoragePoolType getSupportedDataStoreType(); public String getSupportedDataStoreType();
public PrimaryDataStore getDataStore(long dataStoreId); public PrimaryDataStore getDataStore(long dataStoreId);
public ProtocolValidator getValidator(); public ProtocolValidator getValidator();
} }

View File

@ -21,21 +21,18 @@ package org.apache.cloudstack.storage.datastore.configurator.kvm;
import javax.inject.Inject; 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.configurator.AbstractPrimaryDataStoreConfigurator;
import org.apache.cloudstack.storage.datastore.PrimaryDataStore;
import org.apache.cloudstack.storage.datastore.configurator.PrimaryDataStoreConfigurator;
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.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.DefaultKvmPrimaryDataStoreLifeCycle; import org.apache.cloudstack.storage.datastore.lifecycle.DefaultKvmPrimaryDataStoreLifeCycle;
import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.utils.exception.CloudRuntimeException;
public abstract class AbstractKvmConfigurator implements PrimaryDataStoreConfigurator { public abstract class AbstractKvmConfigurator extends AbstractPrimaryDataStoreConfigurator {
@Inject @Inject
PrimaryDataStoreDao dataStoreDao; PrimaryDataStoreDao dataStoreDao;
@Override @Override
public HypervisorType getSupportedHypervisor() { public HypervisorType getSupportedHypervisor() {
return HypervisorType.KVM; return HypervisorType.KVM;
@ -48,17 +45,4 @@ public abstract class AbstractKvmConfigurator implements PrimaryDataStoreConfigu
protected PrimaryDataStoreDriver getDriver() { protected PrimaryDataStoreDriver getDriver() {
return new DefaultPrimaryDataStoreDriverImpl(); return new DefaultPrimaryDataStoreDriverImpl();
} }
@Override
public PrimaryDataStore getDataStore(long dataStoreId) {
PrimaryDataStoreVO dataStoreVO = dataStoreDao.findById(dataStoreId);
if (dataStoreVO == null) {
throw new CloudRuntimeException("Can't find primary data store: " + dataStoreId);
}
DefaultPrimaryDataStore dataStore = DefaultPrimaryDataStore.createDataStore(dataStoreVO);
dataStore.setDriver(this.getDriver());
dataStore.setLifeCycle(getLifeCycle());
return dataStore;
}
} }

View File

@ -18,23 +18,18 @@
*/ */
package org.apache.cloudstack.storage.datastore.configurator.kvm; package org.apache.cloudstack.storage.datastore.configurator.kvm;
import org.apache.cloudstack.storage.datastore.PrimaryDataStore;
import org.apache.cloudstack.storage.datastore.configurator.PrimaryDataStoreConfigurator;
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.ProtocolValidator;
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.hypervisor.Hypervisor.HypervisorType;
import com.cloud.storage.Storage.StoragePoolType;
@Component @Component
@Qualifier("defaultProvider") @Qualifier("defaultProvider")
public class KvmCLVMConfigurator extends AbstractKvmConfigurator { public class KvmCLVMConfigurator extends AbstractKvmConfigurator {
@Override @Override
public StoragePoolType getSupportedDataStoreType() { public String getSupportedDataStoreType() {
return StoragePoolType.CLVM; return "clvm";
} }
@Override @Override

View File

@ -23,15 +23,13 @@ import org.apache.cloudstack.storage.datastore.configurator.validator.ProtocolVa
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;
@Component @Component
@Qualifier("defaultProvider") @Qualifier("defaultProvider")
public class KvmNfsConfigurator extends AbstractKvmConfigurator { public class KvmNfsConfigurator extends AbstractKvmConfigurator {
@Override @Override
public StoragePoolType getSupportedDataStoreType() { public String getSupportedDataStoreType() {
return StoragePoolType.NetworkFilesystem; return "nfs";
} }
@Override @Override

View File

@ -30,8 +30,8 @@ import com.cloud.storage.Storage.StoragePoolType;
public class KvmRBDConfigurator extends AbstractKvmConfigurator { public class KvmRBDConfigurator extends AbstractKvmConfigurator {
@Override @Override
public StoragePoolType getSupportedDataStoreType() { public String getSupportedDataStoreType() {
return StoragePoolType.RBD; return "rbd";
} }
@Override @Override

View File

@ -18,21 +18,49 @@
*/ */
package org.apache.cloudstack.storage.datastore.configurator.validator; package org.apache.cloudstack.storage.datastore.configurator.validator;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import com.cloud.utils.exception.CloudRuntimeException;
public class NfsValidator implements ProtocolValidator { public class NfsValidator implements ProtocolValidator {
@Override @Override
public boolean validate(Map<String, String> params) { public boolean validate(Map<String, String> params) {
// TODO Auto-generated method stub String url = params.get("url");
return false;
try {
URI uri = new URI(url);
if (!"nfs".equalsIgnoreCase(uri.getScheme())) {
throw new CloudRuntimeException("invalid protocol, must starting with nfs");
}
String storageHost = uri.getHost();
String hostPath = uri.getPath();
String userInfo = uri.getUserInfo();
int port = uri.getPort();
if (port == -1) {
port = 2049;
}
params.put("server", storageHost);
params.put("path", hostPath);
params.put("user", userInfo);
params.put("port", String.valueOf(port));
} catch (URISyntaxException e) {
throw new CloudRuntimeException("invalid url: " + e.toString());
}
return true;
} }
@Override @Override
public List<String> getInputParamNames() { public List<String> getInputParamNames() {
// TODO Auto-generated method stub List<String> paramNames = new ArrayList<String>();
return null; paramNames.add("server");
paramNames.add("path");
return paramNames;
} }
} }

View File

@ -21,19 +21,14 @@ package org.apache.cloudstack.storage.datastore.configurator.vmware;
import javax.inject.Inject; 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.configurator.AbstractPrimaryDataStoreConfigurator;
import org.apache.cloudstack.storage.datastore.PrimaryDataStore;
import org.apache.cloudstack.storage.datastore.configurator.PrimaryDataStoreConfigurator;
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.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.DefaultVmwarePrimaryDataStoreLifeCycle; import org.apache.cloudstack.storage.datastore.lifecycle.DefaultVmwarePrimaryDataStoreLifeCycle;
import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.utils.exception.CloudRuntimeException;
public abstract class AbstractVmwareConfigurator implements PrimaryDataStoreConfigurator { public abstract class AbstractVmwareConfigurator extends AbstractPrimaryDataStoreConfigurator {
@Inject @Inject
PrimaryDataStoreDao dataStoreDao; PrimaryDataStoreDao dataStoreDao;
@ -42,25 +37,13 @@ public abstract class AbstractVmwareConfigurator implements PrimaryDataStoreConf
return HypervisorType.VMware; return HypervisorType.VMware;
} }
@Override
protected PrimaryDataStoreLifeCycle getLifeCycle() { protected PrimaryDataStoreLifeCycle getLifeCycle() {
return new DefaultVmwarePrimaryDataStoreLifeCycle(); return new DefaultVmwarePrimaryDataStoreLifeCycle(dataStoreDao);
}
protected PrimaryDataStoreDriver getDriver() {
return new DefaultPrimaryDataStoreDriverImpl();
} }
@Override @Override
public PrimaryDataStore getDataStore(long dataStoreId) { protected PrimaryDataStoreDriver getDriver() {
PrimaryDataStoreVO dataStoreVO = dataStoreDao.findById(dataStoreId); return new DefaultPrimaryDataStoreDriverImpl();
if (dataStoreVO == null) {
throw new CloudRuntimeException("Can't find primary data store: " + dataStoreId);
} }
DefaultPrimaryDataStore dataStore = DefaultPrimaryDataStore.createDataStore(dataStoreVO);
dataStore.setDriver(this.getDriver());
dataStore.setLifeCycle(getLifeCycle());
return dataStore;
}
} }

View File

@ -23,19 +23,18 @@ import org.apache.cloudstack.storage.datastore.configurator.validator.ProtocolVa
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;
@Component @Component
@Qualifier("defaultProvider") @Qualifier("defaultProvider")
public class VmwareIsciConfigurator extends AbstractVmwareConfigurator { public class VmwareIsciConfigurator extends AbstractVmwareConfigurator {
@Override @Override
public StoragePoolType getSupportedDataStoreType() { public String getSupportedDataStoreType() {
return StoragePoolType.Iscsi; return "iscsi";
} }
@Override @Override
public ProtocolValidator getValidator() { public ProtocolValidator getValidator() {
return new ISCSIValiator(); return new ISCSIValiator();
} }
} }

View File

@ -20,14 +20,18 @@ 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.NfsValidator;
import org.apache.cloudstack.storage.datastore.configurator.validator.ProtocolValidator; import org.apache.cloudstack.storage.datastore.configurator.validator.ProtocolValidator;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import com.cloud.storage.Storage.StoragePoolType; import com.cloud.storage.Storage.StoragePoolType;
@Component
@Qualifier("defaultProvider")
public class VmwareNfsConfigurator extends AbstractVmwareConfigurator { public class VmwareNfsConfigurator extends AbstractVmwareConfigurator {
@Override @Override
public StoragePoolType getSupportedDataStoreType() { public String getSupportedDataStoreType() {
return StoragePoolType.NetworkFilesystem; return "nfs";
} }
@Override @Override

View File

@ -20,14 +20,18 @@ 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.ProtocolValidator;
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.stereotype.Component;
import com.cloud.storage.Storage.StoragePoolType; import com.cloud.storage.Storage.StoragePoolType;
@Component
@Qualifier("defaultProvider")
public class VmwareVMFSConfigurator extends AbstractVmwareConfigurator { public class VmwareVMFSConfigurator extends AbstractVmwareConfigurator {
@Override @Override
public StoragePoolType getSupportedDataStoreType() { public String getSupportedDataStoreType() {
return StoragePoolType.VMFS; return "vmfs";
} }
@Override @Override

View File

@ -0,0 +1,48 @@
package org.apache.cloudstack.storage.datastore.configurator.xen;
import javax.inject.Inject;
import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreLifeCycle;
import org.apache.cloudstack.storage.datastore.DefaultPrimaryDataStore;
import org.apache.cloudstack.storage.datastore.PrimaryDataStore;
import org.apache.cloudstack.storage.datastore.configurator.AbstractPrimaryDataStoreConfigurator;
import org.apache.cloudstack.storage.datastore.configurator.PrimaryDataStoreConfigurator;
import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreVO;
import org.apache.cloudstack.storage.datastore.driver.DefaultPrimaryDataStoreDriverImpl;
import org.apache.cloudstack.storage.datastore.driver.PrimaryDataStoreDriver;
import org.apache.cloudstack.storage.datastore.lifecycle.DefaultXenPrimaryDataStoreLifeCycle;
import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.utils.exception.CloudRuntimeException;
public abstract class AbstractXenConfigurator extends AbstractPrimaryDataStoreConfigurator {
@Inject
PrimaryDataStoreDao dataStoreDao;
@Override
public HypervisorType getSupportedHypervisor() {
return HypervisorType.XenServer;
}
protected PrimaryDataStoreLifeCycle getLifeCycle() {
return new DefaultXenPrimaryDataStoreLifeCycle(dataStoreDao);
}
protected PrimaryDataStoreDriver getDriver() {
return new DefaultPrimaryDataStoreDriverImpl();
}
@Override
public PrimaryDataStore getDataStore(long dataStoreId) {
PrimaryDataStoreVO dataStoreVO = dataStoreDao.findById(dataStoreId);
if (dataStoreVO == null) {
throw new CloudRuntimeException("Can't find primary data store: " + dataStoreId);
}
DefaultPrimaryDataStore dataStore = DefaultPrimaryDataStore.createDataStore(dataStoreVO);
dataStore.setDriver(this.getDriver());
dataStore.setLifeCycle(getLifeCycle());
return dataStore;
}
}

View File

@ -18,29 +18,23 @@
*/ */
package org.apache.cloudstack.storage.datastore.configurator.xen; package org.apache.cloudstack.storage.datastore.configurator.xen;
import org.apache.cloudstack.storage.datastore.PrimaryDataStore; import org.apache.cloudstack.storage.datastore.configurator.validator.ISCSIValiator;
import org.apache.cloudstack.storage.datastore.configurator.PrimaryDataStoreConfigurator; import org.apache.cloudstack.storage.datastore.configurator.validator.ProtocolValidator;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import com.cloud.hypervisor.Hypervisor.HypervisorType; @Component
@Qualifier("defaultProvider")
public class XenIscsiConfigurator implements PrimaryDataStoreConfigurator { public class XenIscsiConfigurator extends AbstractXenConfigurator {
@Override
public HypervisorType getSupportedHypervisor() {
// TODO Auto-generated method stub
return null;
}
@Override @Override
public String getSupportedDataStoreType() { public String getSupportedDataStoreType() {
// TODO Auto-generated method stub return "iscsi";
return null;
} }
@Override @Override
public PrimaryDataStore getDataStore() { public ProtocolValidator getValidator() {
// TODO Auto-generated method stub return new ISCSIValiator();
return null;
} }
} }

View File

@ -18,29 +18,24 @@
*/ */
package org.apache.cloudstack.storage.datastore.configurator.xen; package org.apache.cloudstack.storage.datastore.configurator.xen;
import org.apache.cloudstack.storage.datastore.PrimaryDataStore; import org.apache.cloudstack.storage.datastore.configurator.validator.NfsValidator;
import org.apache.cloudstack.storage.datastore.configurator.PrimaryDataStoreConfigurator; import org.apache.cloudstack.storage.datastore.configurator.validator.ProtocolValidator;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.storage.Storage.StoragePoolType;
public class XenNfsConfigurator implements PrimaryDataStoreConfigurator { @Component
@Qualifier("defaultProvider")
@Override public class XenNfsConfigurator extends AbstractXenConfigurator {
public HypervisorType getSupportedHypervisor() {
// TODO Auto-generated method stub
return null;
}
@Override @Override
public String getSupportedDataStoreType() { public String getSupportedDataStoreType() {
// TODO Auto-generated method stub return "nfs";
return null;
} }
@Override @Override
public PrimaryDataStore getDataStore() { public ProtocolValidator getValidator() {
// TODO Auto-generated method stub return new NfsValidator();
return null;
} }
} }

View File

@ -99,6 +99,9 @@ public class PrimaryDataStoreVO implements Identity {
@Column(name = "cluster_id") @Column(name = "cluster_id")
private Long clusterId; private Long clusterId;
@Column(name = "configurator_key")
private String key;
public long getId() { public long getId() {
return id; return id;
} }
@ -235,6 +238,14 @@ public class PrimaryDataStoreVO implements Identity {
this.name = name; this.name = name;
} }
public void setKey(String key) {
this.key = key;
}
public String getKey() {
return this.key;
}
@Override @Override
public boolean equals(Object obj) { public boolean equals(Object obj) {
if (!(obj instanceof PrimaryDataStoreVO) || obj == null) { if (!(obj instanceof PrimaryDataStoreVO) || obj == null) {

View File

@ -48,55 +48,12 @@ public class DefaultPrimaryDataStoreLifeCycleImpl implements PrimaryDataStoreLif
this.dataStore = dataStore; this.dataStore = dataStore;
} }
protected class DataStoreUrlParser {
private String schema;
private String host;
private String path;
private int port;
public DataStoreUrlParser(String url) {
try {
URI uri = new URI(url);
schema = uri.getScheme();
host = uri.getHost();
path = uri.getPath();
port = (uri.getPort() == -1) ? 0 : uri.getPort();
} catch (URISyntaxException e) {
}
}
public String getSchema() {
return this.schema;
}
public String getHost() {
return this.host;
}
public String getPath() {
return this.path;
}
public int getPort() {
return this.port;
}
}
@Override @Override
public boolean initialize(Map<String, String> dsInfos) { public boolean initialize(Map<String, String> dsInfos) {
DataStoreUrlParser parser = new DataStoreUrlParser(dsInfos.get("url"));
PrimaryDataStoreVO dataStore = dataStoreDao.findById(this.dataStore.getId()); PrimaryDataStoreVO dataStore = dataStoreDao.findById(this.dataStore.getId());
dataStore.setName(dsInfos.get("name"));
dataStore.setPoolType(parser.getSchema());
dataStore.setPort(parser.port);
dataStore.setHostAddress(parser.getHost());
dataStore.setPath(parser.getPath());
dataStore.setStatus(DataStoreStatus.Initialized); dataStore.setStatus(DataStoreStatus.Initialized);
dataStoreDao.update(this.dataStore.getId(), dataStore); dataStoreDao.update(this.dataStore.getId(), dataStore);
//TODO: add extension point for each data store //TODO: add extension point for each data store
this.dataStore = this.dataStore.getProvider().getDataStore(dataStore.getId());
return true; return true;
} }

View File

@ -27,13 +27,9 @@ public class DefaultVmwarePrimaryDataStoreLifeCycle extends DefaultPrimaryDataSt
* @param dataStoreDao * @param dataStoreDao
* @param dataStore * @param dataStore
*/ */
public DefaultVmwarePrimaryDataStoreLifeCycle(PrimaryDataStoreDao dataStoreDao, PrimaryDataStore dataStore) { public DefaultVmwarePrimaryDataStoreLifeCycle(PrimaryDataStoreDao dataStoreDao) {
super(dataStoreDao, dataStore); super(dataStoreDao);
// TODO Auto-generated constructor stub // TODO Auto-generated constructor stub
} }
public DefaultVmwarePrimaryDataStoreLifeCycle() {
super(null, null);
}
} }

View File

@ -18,7 +18,6 @@
*/ */
package org.apache.cloudstack.storage.datastore.lifecycle; package org.apache.cloudstack.storage.datastore.lifecycle;
import org.apache.cloudstack.storage.datastore.PrimaryDataStore;
import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
public class DefaultXenPrimaryDataStoreLifeCycle extends DefaultPrimaryDataStoreLifeCycleImpl { public class DefaultXenPrimaryDataStoreLifeCycle extends DefaultPrimaryDataStoreLifeCycleImpl {
@ -27,8 +26,8 @@ public class DefaultXenPrimaryDataStoreLifeCycle extends DefaultPrimaryDataStore
* @param dataStoreDao * @param dataStoreDao
* @param dataStore * @param dataStore
*/ */
public DefaultXenPrimaryDataStoreLifeCycle(PrimaryDataStoreDao dataStoreDao, PrimaryDataStore dataStore) { public DefaultXenPrimaryDataStoreLifeCycle(PrimaryDataStoreDao dataStoreDao) {
super(dataStoreDao, dataStore); super(dataStoreDao);
// TODO Auto-generated constructor stub // TODO Auto-generated constructor stub
} }

View File

@ -1,5 +1,9 @@
package org.apache.cloudstack.storage.datastore.provider; package org.apache.cloudstack.storage.datastore.provider;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import java.util.Map;
import javax.inject.Inject; import javax.inject.Inject;
@ -8,6 +12,8 @@ import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreLifeCy
import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreProvider; import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreProvider;
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.validator.ProtocolValidator;
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;
@ -15,8 +21,15 @@ import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
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.DefaultPrimaryDataStoreLifeCycleImpl; import org.apache.cloudstack.storage.datastore.lifecycle.DefaultPrimaryDataStoreLifeCycleImpl;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import com.cloud.dc.ClusterVO;
import com.cloud.dc.dao.ClusterDao;
import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.storage.Storage.StoragePoolType;
import com.cloud.utils.exception.CloudRuntimeException;
@Component @Component
public class DefaultPrimaryDatastoreProviderImpl implements PrimaryDataStoreProvider { public class DefaultPrimaryDatastoreProviderImpl implements PrimaryDataStoreProvider {
private final String providerName = "default primary data store provider"; private final String providerName = "default primary data store provider";
@ -26,9 +39,20 @@ public class DefaultPrimaryDatastoreProviderImpl implements PrimaryDataStoreProv
protected PrimaryDataStoreDao dataStoreDao; protected PrimaryDataStoreDao dataStoreDao;
@Inject @Inject
protected PrimaryDataStoreProviderDao providerDao; protected PrimaryDataStoreProviderDao providerDao;
@Inject
protected ClusterDao clusterDao;
protected Map<String, PrimaryDataStoreConfigurator> configuratorMaps = new HashMap<String, PrimaryDataStoreConfigurator>();
public DefaultPrimaryDatastoreProviderImpl() { @Inject
public DefaultPrimaryDatastoreProviderImpl(@Qualifier("defaultProvider") List<PrimaryDataStoreConfigurator> configurators) {
for (PrimaryDataStoreConfigurator configurator : configurators) {
String key = generateKey(configurator.getSupportedHypervisor(), configurator.getSupportedDataStoreType().toString());
configuratorMaps.put(key, configurator);
}
}
protected String generateKey(HypervisorType hypervisor, String poolType) {
return hypervisor.toString().toLowerCase() + "_" + poolType.toString().toLowerCase();
} }
@Override @Override
@ -38,24 +62,58 @@ public class DefaultPrimaryDatastoreProviderImpl implements PrimaryDataStoreProv
return null; return null;
} }
DefaultPrimaryDataStore pds = DefaultPrimaryDataStore.createDataStore(dsv); String key = dsv.getKey();
PrimaryDataStoreDriver driver = new DefaultPrimaryDataStoreDriverImpl(pds); PrimaryDataStoreConfigurator configurator = configuratorMaps.get(key);
pds.setDriver(driver);
DefaultPrimaryDataStoreLifeCycleImpl lifeCycle = new DefaultPrimaryDataStoreLifeCycleImpl(dataStoreDao, pds); DefaultPrimaryDataStore dataStore = (DefaultPrimaryDataStore)configurator.getDataStore(dataStoreId);
pds.setLifeCycle(lifeCycle); dataStore.setProvider(this);
return dataStore;
return pds;
} }
@Override @Override
public PrimaryDataStore registerDataStore(Map<String, String> dsInfos) { public PrimaryDataStore registerDataStore(Map<String, String> dsInfos) {
String url = dsInfos.get("url");
URI uri = null;
try {
uri = new URI(url);
} catch (URISyntaxException e) {
throw new CloudRuntimeException("invalid url: " + e.toString());
}
String protocol = uri.getScheme();
Long cluster = null;
try {
cluster = Long.parseLong(dsInfos.get("clusterId"));
} catch (NumberFormatException e) {
throw new CloudRuntimeException("Failed to get clusterId");
}
ClusterVO clusterVO = clusterDao.findById(cluster);
if (clusterVO == null) {
throw new CloudRuntimeException("Can't find cluster: " + cluster);
}
HypervisorType hypervisor = clusterVO.getHypervisorType();
String key = generateKey(hypervisor, protocol);
PrimaryDataStoreConfigurator configurator = configuratorMaps.get(key);
if (configurator == null) {
throw new CloudRuntimeException("can't find configurator from key: " + key);
}
ProtocolValidator validator = configurator.getValidator();
validator.validate(dsInfos);
PrimaryDataStoreVO dataStoreVO = new PrimaryDataStoreVO(); PrimaryDataStoreVO dataStoreVO = new PrimaryDataStoreVO();
dataStoreVO.setStorageProviderId(this.getId()); dataStoreVO.setStorageProviderId(this.getId());
dataStoreVO.setHostAddress(dsInfos.get("server"));
dataStoreVO.setPath(dsInfos.get("path"));
dataStoreVO.setPoolType(protocol);
dataStoreVO.setPort(Integer.parseInt(dsInfos.get("port")));
dataStoreVO.setKey(key);
dataStoreVO.setName(dsInfos.get("name"));
dataStoreVO = dataStoreDao.persist(dataStoreVO); dataStoreVO = dataStoreDao.persist(dataStoreVO);
PrimaryDataStore dataStore = this.getDataStore(dataStoreVO.getId()); DefaultPrimaryDataStore dataStore = (DefaultPrimaryDataStore)configurator.getDataStore(dataStoreVO.getId());
dataStore.setProvider(this);
PrimaryDataStoreLifeCycle lifeCycle = dataStore.getLifeCycle(); PrimaryDataStoreLifeCycle lifeCycle = dataStore.getLifeCycle();
lifeCycle.initialize(dsInfos); lifeCycle.initialize(dsInfos);
return getDataStore(dataStore.getId()); return getDataStore(dataStore.getId());

View File

@ -29,6 +29,8 @@ 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.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import com.cloud.utils.db.DB;
@Component @Component
public class PrimaryDataStoreProviderManagerImpl implements PrimaryDataStoreProviderManager { public class PrimaryDataStoreProviderManagerImpl implements PrimaryDataStoreProviderManager {
@Inject @Inject
@ -47,6 +49,7 @@ public class PrimaryDataStoreProviderManagerImpl implements PrimaryDataStoreProv
} }
@Override @Override
@DB
public boolean configure(String name, Map<String, Object> params) throws ConfigurationException { public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
List<PrimaryDataStoreProviderVO> providerVos = providerDao.listAll(); List<PrimaryDataStoreProviderVO> providerVos = providerDao.listAll();
for (PrimaryDataStoreProvider provider : providers) { for (PrimaryDataStoreProvider provider : providers) {

View File

@ -18,17 +18,30 @@
*/ */
package org.apache.cloudstack.storage.volume.test; package org.apache.cloudstack.storage.volume.test;
import static org.junit.Assert.*;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import javax.inject.Inject; import javax.inject.Inject;
import javax.naming.ConfigurationException;
import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreProvider;
import org.apache.cloudstack.storage.datastore.configurator.PrimaryDataStoreConfigurator; import org.apache.cloudstack.storage.datastore.configurator.PrimaryDataStoreConfigurator;
import org.apache.cloudstack.storage.datastore.provider.PrimaryDataStoreProviderManager;
import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.cloud.dc.ClusterVO;
import com.cloud.dc.dao.ClusterDao;
import com.cloud.hypervisor.Hypervisor.HypervisorType;
@RunWith(SpringJUnit4ClassRunner.class) @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:/resource/testContext.xml") @ContextConfiguration(locations="classpath:/resource/testContext.xml")
public class ConfiguratorTest { public class ConfiguratorTest {
@ -36,10 +49,53 @@ public class ConfiguratorTest {
@Qualifier("defaultProvider") @Qualifier("defaultProvider")
List<PrimaryDataStoreConfigurator> configurators; List<PrimaryDataStoreConfigurator> configurators;
@Inject
List<PrimaryDataStoreProvider> providers;
@Inject
PrimaryDataStoreProviderManager providerMgr;
@Inject
ClusterDao clusterDao;
@Before
public void setup() {
ClusterVO cluster = new ClusterVO();
cluster.setHypervisorType(HypervisorType.XenServer.toString());
Mockito.when(clusterDao.findById(Mockito.anyLong())).thenReturn(cluster);
try {
providerMgr.configure("manager", null);
} catch (ConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Test @Test
public void testLoadConfigurator() { public void testLoadConfigurator() {
for (PrimaryDataStoreConfigurator configurator : configurators) { for (PrimaryDataStoreConfigurator configurator : configurators) {
System.out.println(configurator.getClass().getName()); System.out.println(configurator.getClass().getName());
} }
} }
@Test
public void testProvider() {
for (PrimaryDataStoreProvider provider : providers) {
if (provider.getName().startsWith("default")) {
assertTrue(true);
}
}
}
@Test
public void getProvider() {
assertNotNull(providerMgr.getDataStoreProvider("default primary data store provider"));
}
@Test
public void createDataStore() {
PrimaryDataStoreProvider provider = providerMgr.getDataStoreProvider("default primary data store provider");
Map<String, String> params = new HashMap<String, String>();
params.put("url", "nfs://localhost/mnt");
params.put("clusterId", "1");
params.put("name", "nfsprimary");
assertNotNull(provider.registerDataStore(params));
}
} }

View File

@ -23,6 +23,9 @@ import org.mockito.Mockito;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import com.cloud.dc.dao.ClusterDao;
import com.cloud.dc.dao.ClusterDaoImpl;
@Configuration @Configuration
public class TestConfiguration { public class TestConfiguration {
@ -30,4 +33,9 @@ public class TestConfiguration {
public ImageMotionService imageMotion() { public ImageMotionService imageMotion() {
return Mockito.mock(ImageMotionService.class); return Mockito.mock(ImageMotionService.class);
} }
@Bean
public ClusterDao clusterDao() {
return Mockito.mock(ClusterDaoImpl.class);
}
} }

View File

@ -12,7 +12,8 @@
http://www.springframework.org/schema/context/spring-context-3.0.xsd"> http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:annotation-config /> <context:annotation-config />
<context:component-scan base-package="org.apache.cloudstack.storage" /> <context:component-scan base-package="org.apache.cloudstack.storage" />
<context:component-scan base-package="org.apache.cloudstack.engine.subsystem.api.storage" /> <context:component-scan
base-package="org.apache.cloudstack.engine.subsystem.api.storage" />
<context:component-scan base-package="com.cloud.utils.db" /> <context:component-scan base-package="com.cloud.utils.db" />
<context:component-scan base-package="com.cloud.utils.component" /> <context:component-scan base-package="com.cloud.utils.component" />
<context:component-scan base-package="com.cloud.host.dao" /> <context:component-scan base-package="com.cloud.host.dao" />
@ -20,5 +21,14 @@
<context:component-scan base-package=" com.cloud.upgrade.dao" /> <context:component-scan base-package=" com.cloud.upgrade.dao" />
<tx:annotation-driven transaction-manager="transactionManager" /> <tx:annotation-driven transaction-manager="transactionManager" />
<bean class="org.cloudstack.storage.volume.test.TestConfiguration" /> <bean class="org.apache.cloudstack.storage.volume.test.TestConfiguration" />
<aop:config proxy-target-class="true">
<aop:aspect id="dbContextBuilder" ref="transactionContextBuilder">
<aop:pointcut id="captureAnyMethod" expression="@annotation(com.cloud.utils.db.DB)" />
<aop:around pointcut-ref="captureAnyMethod" method="AroundAnyMethod" />
</aop:aspect>
</aop:config>
<bean id="transactionContextBuilder" class="com.cloud.utils.db.TransactionContextBuilder" />
</beans> </beans>

View File

@ -17,6 +17,7 @@
alter table vm_template add image_data_store_id bigint unsigned; alter table vm_template add image_data_store_id bigint unsigned;
alter table storage_pool add storage_provider_id bigint unsigned; alter table storage_pool add storage_provider_id bigint unsigned;
alter table storage_pool add configurator_key varchar(255);
alter table storage_pool modify id bigint unsigned AUTO_INCREMENT UNIQUE NOT NULL; alter table storage_pool modify id bigint unsigned AUTO_INCREMENT UNIQUE NOT NULL;
alter table volumes add disk_type varchar(255); alter table volumes add disk_type varchar(255);
alter table volumes drop foreign key `fk_volumes__account_id`; alter table volumes drop foreign key `fk_volumes__account_id`;