diff --git a/api/src/com/cloud/storage/Storage.java b/api/src/com/cloud/storage/Storage.java index 91213fa1f30..87f23658817 100644 --- a/api/src/com/cloud/storage/Storage.java +++ b/api/src/com/cloud/storage/Storage.java @@ -96,7 +96,8 @@ public class Storage { LVM(false), // XenServer local LVM SR SharedMountPoint(true), VMFS(true), // VMware VMFS storage - PreSetup(true); // for XenServer, Storage Pool is set up by customers. + PreSetup(true), // for XenServer, Storage Pool is set up by customers. + EXT(false); // XenServer local EXT SR boolean shared; diff --git a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java index 80a61242ad5..a513c281e51 100644 --- a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java +++ b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java @@ -277,7 +277,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe protected String _localGateway; public enum SRType { - NFS, LVM, ISCSI, ISO, LVMOISCSI, LVMOHBA; + NFS, LVM, ISCSI, ISO, LVMOISCSI, LVMOHBA, EXT; String _str; @@ -3612,43 +3612,100 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe s_logger.warn(msg); } return null; - } - protected StartupStorageCommand initializeLocalSR(Connection conn) { - - SR lvmsr = getLocalLVMSR(conn); - if (lvmsr == null) { - return null; - } + protected SR getLocalEXTSR(Connection conn) { try { - String lvmuuid = lvmsr.getUuid(conn); - long cap = lvmsr.getPhysicalSize(conn); - if (cap < 0) { - return null; + Map map = SR.getAllRecords(conn); + for (Map.Entry entry : map.entrySet()) { + SR.Record srRec = entry.getValue(); + if (SRType.EXT.equals(srRec.type)) { + Set pbds = srRec.PBDs; + if (pbds == null) { + continue; + } + for (PBD pbd : pbds) { + Host host = pbd.getHost(conn); + if (!isRefNull(host) && host.getUuid(conn).equals(_host.uuid)) { + if (!pbd.getCurrentlyAttached(conn)) { + pbd.plug(conn); + } + SR sr = entry.getKey(); + sr.scan(conn); + return sr; + } + } + } } - long avail = cap - lvmsr.getPhysicalUtilisation(conn); - lvmsr.setNameLabel(conn, lvmuuid); - String name = "Cloud Stack Local Storage Pool for " + _host.uuid; - lvmsr.setNameDescription(conn, name); - Host host = Host.getByUuid(conn, _host.uuid); - String address = host.getAddress(conn); - StoragePoolInfo pInfo = new StoragePoolInfo(lvmuuid, address, SRType.LVM.toString(), SRType.LVM.toString(), StoragePoolType.LVM, cap, avail); - StartupStorageCommand cmd = new StartupStorageCommand(); - cmd.setPoolInfo(pInfo); - cmd.setGuid(_host.uuid); - cmd.setDataCenter(Long.toString(_dcId)); - cmd.setResourceType(Storage.StorageResourceType.STORAGE_POOL); - return cmd; } catch (XenAPIException e) { - String msg = "build startupstoragecommand err in host:" + _host.uuid + e.toString(); + String msg = "Unable to get local EXTSR in host:" + _host.uuid + e.toString(); s_logger.warn(msg); } catch (XmlRpcException e) { - String msg = "build startupstoragecommand err in host:" + _host.uuid + e.getMessage(); + String msg = "Unable to get local EXTSR in host:" + _host.uuid + e.getCause(); s_logger.warn(msg); } return null; + } + protected StartupStorageCommand initializeLocalSR(Connection conn) { + SR lvmsr = getLocalLVMSR(conn); + if (lvmsr != null) { + try { + String lvmuuid = lvmsr.getUuid(conn); + long cap = lvmsr.getPhysicalSize(conn); + if (cap > 0) { + long avail = cap - lvmsr.getPhysicalUtilisation(conn); + lvmsr.setNameLabel(conn, lvmuuid); + String name = "Cloud Stack Local LVM Storage Pool for " + _host.uuid; + lvmsr.setNameDescription(conn, name); + Host host = Host.getByUuid(conn, _host.uuid); + String address = host.getAddress(conn); + StoragePoolInfo pInfo = new StoragePoolInfo(lvmuuid, address, SRType.LVM.toString(), SRType.LVM.toString(), StoragePoolType.LVM, cap, avail); + StartupStorageCommand cmd = new StartupStorageCommand(); + cmd.setPoolInfo(pInfo); + cmd.setGuid(_host.uuid); + cmd.setDataCenter(Long.toString(_dcId)); + cmd.setResourceType(Storage.StorageResourceType.STORAGE_POOL); + return cmd; + } + } catch (XenAPIException e) { + String msg = "build local LVM info err in host:" + _host.uuid + e.toString(); + s_logger.warn(msg); + } catch (XmlRpcException e) { + String msg = "build local LVM info err in host:" + _host.uuid + e.getMessage(); + s_logger.warn(msg); + } + } + + SR extsr = getLocalEXTSR(conn); + if (extsr != null) { + try { + String extuuid = extsr.getUuid(conn); + long cap = extsr.getPhysicalSize(conn); + if (cap > 0) { + long avail = cap - extsr.getPhysicalUtilisation(conn); + extsr.setNameLabel(conn, extuuid); + String name = "Cloud Stack Local EXT Storage Pool for " + _host.uuid; + extsr.setNameDescription(conn, name); + Host host = Host.getByUuid(conn, _host.uuid); + String address = host.getAddress(conn); + StoragePoolInfo pInfo = new StoragePoolInfo(extuuid, address, SRType.EXT.toString(), SRType.EXT.toString(), StoragePoolType.EXT, cap, avail); + StartupStorageCommand cmd = new StartupStorageCommand(); + cmd.setPoolInfo(pInfo); + cmd.setGuid(_host.uuid); + cmd.setDataCenter(Long.toString(_dcId)); + cmd.setResourceType(Storage.StorageResourceType.STORAGE_POOL); + return cmd; + } + } catch (XenAPIException e) { + String msg = "build local EXT info err in host:" + _host.uuid + e.toString(); + s_logger.warn(msg); + } catch (XmlRpcException e) { + String msg = "build local EXT info err in host:" + _host.uuid + e.getMessage(); + s_logger.warn(msg); + } + } + return null; } @Override diff --git a/scripts/vm/hypervisor/xenserver/copy_vhd_from_secondarystorage.sh b/scripts/vm/hypervisor/xenserver/copy_vhd_from_secondarystorage.sh index e079fa3fdc5..3df77478a1c 100755 --- a/scripts/vm/hypervisor/xenserver/copy_vhd_from_secondarystorage.sh +++ b/scripts/vm/hypervisor/xenserver/copy_vhd_from_secondarystorage.sh @@ -87,7 +87,7 @@ copyvhd() cleanup exit 0 fi - if [ $type != "nfs" ]; then + if [ $type != "nfs" -a $type != "ext" ]; then dd if=$srcvhd of=$desvhd bs=512 seek=$(($(($vsize/512))-1)) count=1 $VHDUTIL modify -s $vsize -n $desvhd if [ $? -ne 0 ]; then @@ -107,7 +107,7 @@ copyvhd() fi } -if [ $type == "nfs" ]; then +if [ $type == "nfs" -o $type == "ext" ]; then uuid=$(uuidgen -r) desvhd=/var/run/sr-mount/$sruuid/$uuid copyvhd $desvhd $vhdfile 0 $type diff --git a/scripts/vm/hypervisor/xenserver/copy_vhd_to_secondarystorage.sh b/scripts/vm/hypervisor/xenserver/copy_vhd_to_secondarystorage.sh index cb381409a8f..79160010430 100755 --- a/scripts/vm/hypervisor/xenserver/copy_vhd_to_secondarystorage.sh +++ b/scripts/vm/hypervisor/xenserver/copy_vhd_to_secondarystorage.sh @@ -64,7 +64,7 @@ fi vhdfile=$localmp/${vdiuuid}.vhd -if [ $type == "nfs" ]; then +if [ $type == "nfs" -o $type == "ext" ]; then dd if=/var/run/sr-mount/$sruuid/${vdiuuid}.vhd of=$vhdfile bs=2M if [ $? -ne 0 ]; then echo "8#failed to copy /var/run/sr-mount/$sruuid/${vdiuuid}.vhd to secondarystorage" diff --git a/server/src/com/cloud/storage/StorageManagerImpl.java b/server/src/com/cloud/storage/StorageManagerImpl.java index b9829402ffe..7c18c7ff92a 100755 --- a/server/src/com/cloud/storage/StorageManagerImpl.java +++ b/server/src/com/cloud/storage/StorageManagerImpl.java @@ -380,7 +380,7 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag List storagePoolHostRefs = _storagePoolHostDao.listByHostId(host.getId()); for (StoragePoolHostVO storagePoolHostRef : storagePoolHostRefs) { StoragePoolVO storagePool = _storagePoolDao.findById(storagePoolHostRef.getPoolId()); - if (storagePool.getPoolType() == StoragePoolType.LVM) { + if (storagePool.getPoolType() == StoragePoolType.LVM || storagePool.getPoolType() == StoragePoolType.EXT) { SearchBuilder volumeSB = _volsDao.createSearchBuilder(); volumeSB.and("poolId", volumeSB.entity().getPoolId(), SearchCriteria.Op.EQ); volumeSB.and("removed", volumeSB.entity().getRemoved(), SearchCriteria.Op.NULL); @@ -1311,7 +1311,7 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag throw new InvalidParameterValueException("Unable to find pool by id " + id); } - if (sPool.getPoolType().equals(StoragePoolType.LVM)) { + if (sPool.getPoolType().equals(StoragePoolType.LVM) || sPool.getPoolType().equals(StoragePoolType.EXT)) { s_logger.warn("Unable to delete local storage id:" + id); throw new InvalidParameterValueException("Unable to delete local storage id: " + id); } @@ -3030,7 +3030,7 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag @DB public StoragePoolVO findLocalStorageOnHost(long hostId) { SearchCriteria sc = LocalStorageSearch.create(); - sc.setParameters("type", new Object[]{StoragePoolType.Filesystem, StoragePoolType.LVM}); + sc.setParameters("type", new Object[]{StoragePoolType.Filesystem, StoragePoolType.LVM, StoragePoolType.EXT}); sc.setJoinParameters("poolHost", "hostId", hostId); List storagePools = _storagePoolDao.search(sc, null); if (!storagePools.isEmpty()) { diff --git a/server/src/com/cloud/storage/dao/StoragePoolDao.java b/server/src/com/cloud/storage/dao/StoragePoolDao.java index 2d943e55f17..0c272980908 100644 --- a/server/src/com/cloud/storage/dao/StoragePoolDao.java +++ b/server/src/com/cloud/storage/dao/StoragePoolDao.java @@ -93,8 +93,6 @@ public interface StoragePoolDao extends GenericDao { List listPoolByHostPath(String host, String path); - void deleteStoragePoolRecords(ArrayList ids); - void updateDetails(long poolId, Map details); Map getDetails(long poolId); diff --git a/server/src/com/cloud/storage/dao/StoragePoolDaoImpl.java b/server/src/com/cloud/storage/dao/StoragePoolDaoImpl.java index a22f07435c8..8af75336828 100644 --- a/server/src/com/cloud/storage/dao/StoragePoolDaoImpl.java +++ b/server/src/com/cloud/storage/dao/StoragePoolDaoImpl.java @@ -256,17 +256,6 @@ public class StoragePoolDaoImpl extends GenericDaoBase imp return pool; } - @DB - @Override - public void deleteStoragePoolRecords(ArrayList ids) - { - SearchCriteria sc = DeleteLvmSearch.create(); - sc.setParameters("ids", ids.toArray()); - sc.setParameters("LVM", StoragePoolType.LVM); - sc.setParameters("Filesystem", StoragePoolType.Filesystem); - remove(sc); - } - @DB @Override public List findPoolsByDetails(long dcId, long podId, Long clusterId, Map details) {