Return-Path: X-Original-To: apmail-incubator-cloudstack-commits-archive@minotaur.apache.org Delivered-To: apmail-incubator-cloudstack-commits-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id C9645D050 for ; Fri, 10 Aug 2012 20:36:22 +0000 (UTC) Received: (qmail 19622 invoked by uid 500); 10 Aug 2012 20:36:22 -0000 Delivered-To: apmail-incubator-cloudstack-commits-archive@incubator.apache.org Received: (qmail 19600 invoked by uid 500); 10 Aug 2012 20:36:22 -0000 Mailing-List: contact cloudstack-commits-help@incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: cloudstack-dev@incubator.apache.org Delivered-To: mailing list cloudstack-commits@incubator.apache.org Received: (qmail 19592 invoked by uid 99); 10 Aug 2012 20:36:22 -0000 Received: from tyr.zones.apache.org (HELO tyr.zones.apache.org) (140.211.11.114) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 10 Aug 2012 20:36:22 +0000 Received: by tyr.zones.apache.org (Postfix, from userid 65534) id 114A61C440; Fri, 10 Aug 2012 20:36:22 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: edison@apache.org To: cloudstack-commits@incubator.apache.org X-Mailer: ASF-Git Admin Mailer Subject: git commit: Adds CLVM as an option for primary storage. It copies most of the RBD bits, in most cases simply adding an 'else if' or similar. In the managesnapshot.sh we add the ability to manipulate snapshots for the CLVM volumes, as well as a few minor Message-Id: <20120810203622.114A61C440@tyr.zones.apache.org> Date: Fri, 10 Aug 2012 20:36:22 +0000 (UTC) Updated Branches: refs/heads/master 7895386a8 -> 263216caa Adds CLVM as an option for primary storage. It copies most of the RBD bits, in most cases simply adding an 'else if' or similar. In the managesnapshot.sh we add the ability to manipulate snapshots for the CLVM volumes, as well as a few minor fixes like adjusting the usage for the -b option to reflect that it accepts four arguments (note that it already accepted four args, it just wasn't reflected in the usage). RB: https://reviews.apache.org/r/6470/ Send-by: shadowsor@gmail.com Project: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/commit/263216ca Tree: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/tree/263216ca Diff: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/diff/263216ca Branch: refs/heads/master Commit: 263216caa5b548099451f669fae918ed63608fd7 Parents: 7895386 Author: Edison Su Authored: Fri Aug 10 13:32:21 2012 -0700 Committer: Edison Su Committed: Fri Aug 10 13:33:06 2012 -0700 ---------------------------------------------------------------------- api/src/com/cloud/storage/Storage.java | 1 + .../kvm/resource/LibvirtComputingResource.java | 18 ++- .../kvm/storage/KVMStoragePoolManager.java | 4 + .../kvm/storage/LibvirtStorageAdaptor.java | 16 ++- .../hypervisor/kvm/storage/LibvirtStoragePool.java | 6 +- scripts/storage/qcow2/managesnapshot.sh | 136 ++++++++++++--- .../src/com/cloud/storage/StorageManagerImpl.java | 4 +- ui/scripts/system.js | 1 + ui/scripts/zoneWizard.js | 1 + 9 files changed, 154 insertions(+), 33 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/263216ca/api/src/com/cloud/storage/Storage.java ---------------------------------------------------------------------- diff --git a/api/src/com/cloud/storage/Storage.java b/api/src/com/cloud/storage/Storage.java index d6bd04e..fba12b6 100755 --- a/api/src/com/cloud/storage/Storage.java +++ b/api/src/com/cloud/storage/Storage.java @@ -96,6 +96,7 @@ public class Storage { Iscsi(true), // for e.g., ZFS Comstar ISO(false), // for iso image LVM(false), // XenServer local LVM SR + CLVM(true), RBD(true), SharedMountPoint(true), VMFS(true), // VMware VMFS storage http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/263216ca/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java ---------------------------------------------------------------------- diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java index 4a22e73..f2fe65a 100755 --- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java @@ -2640,13 +2640,19 @@ public class LibvirtComputingResource extends ServerResourceBase implements disk.defNetworkBasedDisk(physicalDisk.getPath().replace("rbd:", ""), pool.getSourceHost(), pool.getSourcePort(), pool.getAuthUserName(), pool.getUuid(), devId, diskBusType, diskProtocol.RBD); - } else if (volume.getType() == Volume.Type.DATADISK) { - disk.defFileBasedDisk(physicalDisk.getPath(), devId, - DiskDef.diskBus.VIRTIO, - DiskDef.diskFmtType.QCOW2); + } else if (pool.getType() == StoragePoolType.CLVM) { + disk.defBlockBasedDisk(physicalDisk.getPath(), devId, + diskBusType); } else { - disk.defFileBasedDisk(physicalDisk.getPath(), devId, - diskBusType, DiskDef.diskFmtType.QCOW2); + if (volume.getType() == Volume.Type.DATADISK) { + disk.defFileBasedDisk(physicalDisk.getPath(), devId, + DiskDef.diskBus.VIRTIO, + DiskDef.diskFmtType.QCOW2); + } else { + disk.defFileBasedDisk(physicalDisk.getPath(), devId, + diskBusType, DiskDef.diskFmtType.QCOW2); + } + } } http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/263216ca/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMStoragePoolManager.java ---------------------------------------------------------------------- diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMStoragePoolManager.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMStoragePoolManager.java index 491f772..751da83 100644 --- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMStoragePoolManager.java +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMStoragePoolManager.java @@ -78,6 +78,10 @@ public class KVMStoragePoolManager { if (destPool.getType() == StoragePoolType.RBD) { return this._storageAdaptor.createDiskFromTemplate(template, name, KVMPhysicalDisk.PhysicalDiskFormat.RAW, template.getSize(), destPool); + } else if (destPool.getType() == StoragePoolType.CLVM) { + return this._storageAdaptor.createDiskFromTemplate(template, name, + KVMPhysicalDisk.PhysicalDiskFormat.RAW, template.getSize(), + destPool); } else { return this._storageAdaptor.createDiskFromTemplate(template, name, KVMPhysicalDisk.PhysicalDiskFormat.QCOW2, http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/263216ca/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java ---------------------------------------------------------------------- diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java index 85c64ba..9f62ee8 100644 --- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java @@ -462,6 +462,8 @@ public class LibvirtStorageAdaptor implements StorageAdaptor { type = StoragePoolType.Filesystem; } else if (spd.getPoolType() == LibvirtStoragePoolDef.poolType.RBD) { type = StoragePoolType.RBD; + } else if (spd.getPoolType() == LibvirtStoragePoolDef.poolType.LOGICAL) { + type = StoragePoolType.CLVM; } LibvirtStoragePool pool = new LibvirtStoragePool(uuid, storage.getName(), @@ -551,6 +553,8 @@ public class LibvirtStorageAdaptor implements StorageAdaptor { sp = CreateSharedStoragePool(conn, name, host, path); } else if (type == StoragePoolType.RBD) { sp = createRBDStoragePool(conn, name, host, port, userInfo, path); + } else if (type == StoragePoolType.CLVM) { + sp = createCLVMStoragePool(conn, name, host, path); } } @@ -685,9 +689,15 @@ public class LibvirtStorageAdaptor implements StorageAdaptor { if (destPool.getType() != StoragePoolType.RBD) { disk = destPool.createPhysicalDisk(newUuid, format, template.getVirtualSize()); - Script.runSimpleBashScript("qemu-img create -f " - + template.getFormat() + " -b " + template.getPath() + " " - + disk.getPath()); + if (format == PhysicalDiskFormat.QCOW2) { + Script.runSimpleBashScript("qemu-img create -f " + + template.getFormat() + " -b " + template.getPath() + " " + + disk.getPath()); + } else if (format == PhysicalDiskFormat.RAW) { + Script.runSimpleBashScript("qemu-img convert -f " + + template.getFormat() + " -O raw " + template.getPath() + + " " + disk.getPath()); + } } else { disk = new KVMPhysicalDisk(destPool.getSourceDir() + "/" + newUuid, newUuid, destPool); disk.setFormat(format); http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/263216ca/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/LibvirtStoragePool.java ---------------------------------------------------------------------- diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/LibvirtStoragePool.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/LibvirtStoragePool.java index bc428e1..32f8ce9 100644 --- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/LibvirtStoragePool.java +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/LibvirtStoragePool.java @@ -88,7 +88,11 @@ public class LibvirtStoragePool implements KVMStoragePool { @Override public PhysicalDiskFormat getDefaultFormat() { - return PhysicalDiskFormat.QCOW2; + if (getStoragePoolType() == StoragePoolType.CLVM) { + return PhysicalDiskFormat.RAW; + } else { + return PhysicalDiskFormat.QCOW2; + } } @Override http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/263216ca/scripts/storage/qcow2/managesnapshot.sh ---------------------------------------------------------------------- diff --git a/scripts/storage/qcow2/managesnapshot.sh b/scripts/storage/qcow2/managesnapshot.sh index a305ba8..29b7081 100755 --- a/scripts/storage/qcow2/managesnapshot.sh +++ b/scripts/storage/qcow2/managesnapshot.sh @@ -6,9 +6,9 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @@ -16,16 +16,16 @@ # specific language governing permissions and limitations # under the License. - + # $Id: managesnapshot.sh 11601 2010-08-11 17:26:15Z kris $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.refactor/java/scripts/storage/qcow2/managesnapshot.sh $ -# managesnapshot.sh -- manage snapshots for a single disk (create, destroy, rollback) +# managesnapshot.sh -- manage snapshots for a single disk (create, destroy, rollback, backup) usage() { printf "Usage: %s: -c -n \n" $(basename $0) >&2 printf "Usage: %s: -d -n \n" $(basename $0) >&2 printf "Usage: %s: -r -n \n" $(basename $0) >&2 - printf "Usage: %s: -b -n -p \n" $(basename $0) >&2 + printf "Usage: %s: -b -n -p -t \n" $(basename $0) >&2 exit 2 } @@ -40,21 +40,69 @@ then fi fi +is_lv() { + # Must be a block device + if [ -b "${1}" ]; then + # But not a volume group or physical volume + lvm vgs "${1}" > /dev/null 2>&1 && return 1 + # And a logical volume + lvm lvs "${1}" > /dev/null 2>&1 && return 0 + fi + return 1 +} + +get_vg() { + lvm lvs --noheadings --unbuffered --separator=/ "${1}" | cut -d '/' -f 2 +} + +get_lv() { + lvm lvs --noheadings --unbuffered --separator=/ "${1}" | cut -d '/' -f 1 +} + +double_hyphens() { + echo ${1} | sed -e "s/-/--/g" +} + create_snapshot() { local disk=$1 local snapshotname="$2" local failed=0 - if [ -f "${disk}" ]; then + if [ ${dmsnapshot} = "yes" ] && is_lv ${disk}; then + local lv=`get_lv ${disk}` + local vg=`get_vg ${disk}` + local lv_dm=`double_hyphens ${lv}` + local vg_dm=`double_hyphens ${vg}` + local lvdevice=/dev/mapper/${vg_dm}-${lv_dm} + local lv_bytes=`blockdev --getsize64 ${lvdevice}` + local lv_sectors=`blockdev --getsz ${lvdevice}` + + lvm lvcreate --size ${lv_bytes}b --name "${snapshotname}-cow" ${vg} >&2 || return 2 + dmsetup suspend ${vg_dm}-${lv_dm} >&2 + if dmsetup info -c --noheadings -o name ${vg_dm}-${lv_dm}-real > /dev/null 2>&1; then + echo "0 ${lv_sectors} snapshot ${lvdevice}-real /dev/mapper/${vg_dm}-${snapshotname}--cow p 64" | \ + dmsetup create "${vg_dm}-${snapshotname}" >&2 || ( destroy_snapshot ${disk} "${snapshotname}"; return 2 ) + dmsetup resume "${vg_dm}-${snapshotname}" >&2 || ( destroy_snapshot ${disk} "${snapshotname}"; return 2 ) + else + dmsetup table ${vg_dm}-${lv_dm} | dmsetup create ${vg_dm}-${lv_dm}-real >&2 || ( destroy_snapshot ${disk} "${snapshotname}"; return 2 ) + dmsetup resume ${vg_dm}-${lv_dm}-real >&2 || ( destroy_snapshot ${disk} "${snapshotname}"; return 2 ) + echo "0 ${lv_sectors} snapshot ${lvdevice}-real /dev/mapper/${vg_dm}-${snapshotname}--cow p 64" | \ + dmsetup create "${vg_dm}-${snapshotname}" >&2 || ( destroy_snapshot ${disk} "${snapshotname}"; return 2 ) + echo "0 ${lv_sectors} snapshot-origin ${lvdevice}-real" | \ + dmsetup load ${vg_dm}-${lv_dm} >&2 || ( destroy_snapshot ${disk} "${snapshotname}"; return 2 ) + dmsetup resume "${vg_dm}-${snapshotname}" >&2 || ( destroy_snapshot ${disk} "${snapshotname}"; return 2 ) + fi + dmsetup resume "${vg_dm}-${lv_dm}" >&2 + elif [ -f "${disk}" ]; then $qemu_img snapshot -c "$snapshotname" $disk - + if [ $? -gt 0 ] then failed=2 printf "***Failed to create snapshot $snapshotname for path $disk\n" >&2 $qemu_img snapshot -d "$snapshotname" $disk - + if [ $? -gt 0 ] then printf "***Failed to delete snapshot $snapshotname for path $disk\n" >&2 @@ -65,26 +113,46 @@ create_snapshot() { printf "***Failed to create snapshot $snapshotname, undefined type $disk\n" >&2 fi - return $failed + return $failed } destroy_snapshot() { local disk=$1 - local snapshotname=$2 + local snapshotname="$2" local failed=0 - if [ -f $disk ]; then + if is_lv ${disk}; then + local lv=`get_lv ${disk}` + local vg=`get_vg ${disk}` + local lv_dm=`double_hyphens ${lv}` + local vg_dm=`double_hyphens ${vg}` + if [ -e /dev/mapper/${vg_dm}-${lv_dm}-real ]; then + local dm_refcount=`dmsetup info -c --noheadings -o open ${vg_dm}-${lv_dm}-real` + if [ ${dm_refcount} -le 2 ]; then + dmsetup suspend ${vg_dm}-${lv_dm} >&2 + dmsetup table ${vg_dm}-${lv_dm}-real | dmsetup load ${vg_dm}-${lv_dm} >&2 + dmsetup resume ${vg_dm}-${lv_dm} + dmsetup remove "${vg_dm}-${snapshotname}" + dmsetup remove ${vg_dm}-${lv_dm}-real + else + dmsetup remove "${vg_dm}-${snapshotname}" + fi + else + dmsetup remove "${vg_dm}-${snapshotname}" + fi + lvm lvremove -f "${vg}/${snapshotname}-cow" + elif [ -f $disk ]; then $qemu_img snapshot -d "$snapshotname" $disk if [ $? -gt 0 ] then failed=2 printf "Failed to delete snapshot $snapshotname for path $disk\n" >&2 - fi + fi else failed=3 printf "***Failed to delete snapshot $snapshotname, undefined type $disk\n" >&2 fi - return $failed + return $failed } rollback_snapshot() { @@ -93,18 +161,19 @@ rollback_snapshot() { local failed=0 $qemu_img snapshot -a $snapshotname $disk - + if [ $? -gt 0 ] then printf "***Failed to apply snapshot $snapshotname for path $disk\n" >&2 failed=1 fi - - return $failed + + return $failed } + backup_snapshot() { local disk=$1 - local snapshotname=$2 + local snapshotname="$2" local destPath=$3 local destName=$4 @@ -113,24 +182,37 @@ backup_snapshot() { mkdir -p $destPath >& /dev/null if [ $? -gt 0 ] then - printf "Failed to create $destPath" >&2 + printf "Failed to create $destPath\n" >&2 return 3 fi fi - if [ -f ${disk} ]; then - # Does the snapshot exist? + if [ ${dmsnapshot} = "yes" ] && is_lv ${disk}; then + local vg=`get_vg ${disk}` + local vg_dm=`double_hyphens ${vg}` + local scriptdir=`dirname ${0}` + + if ! dmsetup info -c --noheadings -o name ${vg_dm}-${snapshotname} > /dev/null 2>&1; then + printf "Disk ${disk} has no snapshot called ${snapshotname}.\n" >&2 + return 1 + fi + + ${qemu_img} convert -f raw -O qcow2 "/dev/mapper/${vg_dm}-${snapshotname}" "${destPath}/${destName}" || \ + ( printf "${qemu_img} failed to create backup of snapshot ${snapshotname} for disk ${disk} to ${destPath}.\n" >&2; return 2 ) + + elif [ -f ${disk} ]; then + # Does the snapshot exist? $qemu_img snapshot -l $disk|grep -w "$snapshotname" >& /dev/null if [ $? -gt 0 ] then - printf "there is no $snapshotname on disk $disk" >&2 + printf "there is no $snapshotname on disk $disk\n" >&2 return 1 fi $qemu_img convert -f qcow2 -O qcow2 -s $snapshotname $disk $destPath/$destName >& /dev/null if [ $? -gt 0 ] then - printf "Failed to backup $snapshotname for disk $disk to $destPath" >&2 + printf "Failed to backup $snapshotname for disk $disk to $destPath\n" >&2 return 2 fi else @@ -150,6 +232,8 @@ pathval= snapshot= tmplName= deleteDir= +dmsnapshot=no +dmrollback=no while getopts 'c:d:r:n:b:p:t:f' OPTION do @@ -180,6 +264,13 @@ do esac done +if modprobe dm-snapshot; then + dmsnapshot=yes + dmsetup targets | grep -q "^snapshot-merge" && dmrollback=yes +fi + +[ -z "${snapshot}" ] && usage + [ -b "$pathval" ] && snapshot=`echo "${snapshot}" | md5sum -t | awk '{ print $1 }'` if [ "$cflag" == "1" ] @@ -192,6 +283,7 @@ then exit $? elif [ "$bflag" == "1" ] then + [ -z "${destPath}" -o -z "${tmplName}" ] && usage backup_snapshot $pathval $snapshot $destPath $tmplName exit $? elif [ "$rflag" == "1" ] http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/263216ca/server/src/com/cloud/storage/StorageManagerImpl.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/storage/StorageManagerImpl.java b/server/src/com/cloud/storage/StorageManagerImpl.java index c7dda00..c17379f 100755 --- a/server/src/com/cloud/storage/StorageManagerImpl.java +++ b/server/src/com/cloud/storage/StorageManagerImpl.java @@ -1325,6 +1325,8 @@ public class StorageManagerImpl implements StorageManager, Manager, ClusterManag pool = new StoragePoolVO(StoragePoolType.Filesystem, "localhost", 0, hostPath); } else if (scheme.equalsIgnoreCase("sharedMountPoint")) { pool = new StoragePoolVO(StoragePoolType.SharedMountPoint, storageHost, 0, hostPath); + } else if (scheme.equalsIgnoreCase("clvm")) { + pool = new StoragePoolVO(StoragePoolType.CLVM, storageHost, 0, hostPath.replaceFirst("/", "")); } else if (scheme.equalsIgnoreCase("rbd")) { if (port == -1) { port = 6789; @@ -1628,7 +1630,7 @@ public class StorageManagerImpl implements StorageManager, Manager, ClusterManag s_logger.debug("creating pool " + pool.getName() + " on host " + hostId); if (pool.getPoolType() != StoragePoolType.NetworkFilesystem && pool.getPoolType() != StoragePoolType.Filesystem && pool.getPoolType() != StoragePoolType.IscsiLUN && pool.getPoolType() != StoragePoolType.Iscsi && pool.getPoolType() != StoragePoolType.VMFS && pool.getPoolType() != StoragePoolType.SharedMountPoint - && pool.getPoolType() != StoragePoolType.PreSetup && pool.getPoolType() != StoragePoolType.OCFS2 && pool.getPoolType() != StoragePoolType.RBD) { + && pool.getPoolType() != StoragePoolType.PreSetup && pool.getPoolType() != StoragePoolType.OCFS2 && pool.getPoolType() != StoragePoolType.RBD && pool.getPoolType() != StoragePoolType.CLVM) { s_logger.warn(" Doesn't support storage pool type " + pool.getPoolType()); return false; } http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/263216ca/ui/scripts/system.js ---------------------------------------------------------------------- diff --git a/ui/scripts/system.js b/ui/scripts/system.js index 9d9936c..3db9289 100644 --- a/ui/scripts/system.js +++ b/ui/scripts/system.js @@ -7510,6 +7510,7 @@ items.push({id: "nfs", description: "nfs"}); items.push({id: "SharedMountPoint", description: "SharedMountPoint"}); items.push({id: "rbd", description: "RBD"}); + items.push({id: "clvm", description: "CLVM"}); args.response.success({data: items}); } else if(selectedClusterObj.hypervisortype == "XenServer") { http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/263216ca/ui/scripts/zoneWizard.js ---------------------------------------------------------------------- diff --git a/ui/scripts/zoneWizard.js b/ui/scripts/zoneWizard.js index 261668f..f598a2b 100644 --- a/ui/scripts/zoneWizard.js +++ b/ui/scripts/zoneWizard.js @@ -966,6 +966,7 @@ var items = []; items.push({id: "nfs", description: "nfs"}); items.push({id: "SharedMountPoint", description: "SharedMountPoint"}); + items.push({id: "clvm", description: "CLVM"}); args.response.success({data: items}); } else if(selectedClusterObj.hypervisortype == "XenServer") {