DevStack currently lacks support for LVM ephemeral storage in Nova.
This support is important for testing of Nova's LVM backend. The
proposed change adds a default volume group, to be shared by Cinder
and Nova. It also adds a configuration option NOVA_BACKEND, which
must be LVM if it is set, that determines whether Nova should be
configured to use LVM ephemeral storage.
Change-Id: I4eb9afff3536fbcd563939f2d325efbb845081bb
| ... | ... |
@@ -110,8 +110,8 @@ follows: |
| 110 | 110 |
* Global configuration that may be referenced in ``local.conf``, i.e. ``DEST``, ``DATA_DIR`` |
| 111 | 111 |
* Global service configuration like ``ENABLED_SERVICES`` |
| 112 | 112 |
* Variables used by multiple services that do not have a clear owner, i.e. |
| 113 |
- ``VOLUME_BACKING_FILE_SIZE`` (nova-volumes and cinder) or ``PUBLIC_NETWORK_NAME`` |
|
| 114 |
- (nova-network and neutron) |
|
| 113 |
+ ``VOLUME_BACKING_FILE_SIZE`` (nova-compute, nova-volumes and cinder) or |
|
| 114 |
+ ``PUBLIC_NETWORK_NAME`` (nova-network and neutron) |
|
| 115 | 115 |
* Variables that can not be cleanly declared in a project file due to |
| 116 | 116 |
dependency ordering, i.e. the order of sourcing the project files can |
| 117 | 117 |
not be changed for other reasons but the earlier file needs to dereference a |
| ... | ... |
@@ -76,9 +76,9 @@ CINDER_MULTI_LVM_BACKEND=$(trueorfalse False CINDER_MULTI_LVM_BACKEND) |
| 76 | 76 |
# configuration and for the volume type name. Multiple backends are |
| 77 | 77 |
# comma-separated. |
| 78 | 78 |
if [[ $CINDER_MULTI_LVM_BACKEND == "False" ]]; then |
| 79 |
- CINDER_ENABLED_BACKENDS=${CINDER_ENABLED_BACKENDS:-lvm:lvmdriver-1}
|
|
| 79 |
+ CINDER_ENABLED_BACKENDS=${CINDER_ENABLED_BACKENDS:-lvm:${DEFAULT_VOLUME_GROUP_NAME##*-}}
|
|
| 80 | 80 |
else |
| 81 |
- CINDER_ENABLED_BACKENDS=${CINDER_ENABLED_BACKENDS:-lvm:lvmdriver-1,lvm:lvmdriver-2}
|
|
| 81 |
+ CINDER_ENABLED_BACKENDS=${CINDER_ENABLED_BACKENDS:-lvm:${DEFAULT_VOLUME_GROUP_NAME##*-},lvm:cinder}
|
|
| 82 | 82 |
fi |
| 83 | 83 |
|
| 84 | 84 |
|
| ... | ... |
@@ -14,6 +14,7 @@ |
| 14 | 14 |
|
| 15 | 15 |
# CINDER_CONF |
| 16 | 16 |
# DATA_DIR |
| 17 |
+# VOLUME_GROUP_NAME |
|
| 17 | 18 |
|
| 18 | 19 |
# clean_cinder_backend_lvm - called from clean_cinder() |
| 19 | 20 |
# configure_cinder_backend_lvm - called from configure_cinder() |
| ... | ... |
@@ -25,157 +26,44 @@ MY_XTRACE=$(set +o | grep xtrace) |
| 25 | 25 |
set +o xtrace |
| 26 | 26 |
|
| 27 | 27 |
|
| 28 |
-# Defaults |
|
| 29 |
-# -------- |
|
| 30 |
- |
|
| 31 |
-# Name of the lvm volume groups to use/create for iscsi volumes |
|
| 32 |
-# This monkey-motion is for compatibility with icehouse-generation Grenade |
|
| 33 |
-# If ``VOLUME_GROUP`` is set, use it, otherwise we'll build a VG name based |
|
| 34 |
-# on ``VOLUME_GROUP_NAME`` that includes the backend name |
|
| 35 |
-# Grenade doesn't use ``VOLUME_GROUP2`` so it is left out |
|
| 36 |
-VOLUME_GROUP=${VOLUME_GROUP:-}
|
|
| 37 |
-VOLUME_GROUP_NAME=${VOLUME_GROUP:-${VOLUME_GROUP_NAME:-stack-volumes}}
|
|
| 38 |
- |
|
| 39 | 28 |
# TODO: resurrect backing device...need to know how to set values |
| 40 | 29 |
#VOLUME_BACKING_DEVICE=${VOLUME_BACKING_DEVICE:-}
|
| 41 | 30 |
|
| 42 |
-VOLUME_NAME_PREFIX=${VOLUME_NAME_PREFIX:-volume-}
|
|
| 43 |
- |
|
| 44 |
- |
|
| 45 | 31 |
# Entry Points |
| 46 | 32 |
# ------------ |
| 47 | 33 |
|
| 48 |
-# Compatibility for getting a volume group name from either ``VOLUME_GROUP`` |
|
| 49 |
-# or from ``VOLUME_GROUP_NAME`` plus the backend name |
|
| 50 |
-function get_volume_group_name {
|
|
| 51 |
- local be_name=$1 |
|
| 52 |
- |
|
| 53 |
- # Again with the icehouse-generation compatibility |
|
| 54 |
- local volume_group_name=$VOLUME_GROUP_NAME |
|
| 55 |
- if [[ -z $VOLUME_GROUP ]]; then |
|
| 56 |
- volume_group_name+="-$be_name" |
|
| 57 |
- fi |
|
| 58 |
- echo $volume_group_name |
|
| 59 |
-} |
|
| 60 |
- |
|
| 34 |
+# cleanup_cinder_backend_lvm - Delete volume group and remove backing file |
|
| 35 |
+# cleanup_cinder_backend_lvm $be_name |
|
| 61 | 36 |
function cleanup_cinder_backend_lvm {
|
| 62 | 37 |
local be_name=$1 |
| 63 | 38 |
|
| 64 |
- # Again with the icehouse-generation compatibility |
|
| 65 |
- local volume_group_name=$(get_volume_group_name $be_name) |
|
| 66 |
- |
|
| 67 | 39 |
# Campsite rule: leave behind a volume group at least as clean as we found it |
| 68 |
- _clean_lvm_lv ${volume_group_name} $VOLUME_NAME_PREFIX
|
|
| 69 |
- _clean_lvm_backing_file ${volume_group_name} $DATA_DIR/${volume_group_name}-backing-file
|
|
| 40 |
+ clean_lvm_volume_group $VOLUME_GROUP_NAME-$be_name |
|
| 70 | 41 |
} |
| 71 | 42 |
|
| 72 | 43 |
# configure_cinder_backend_lvm - Set config files, create data dirs, etc |
| 73 |
-# configure_cinder_backend_lvm $name |
|
| 44 |
+# configure_cinder_backend_lvm $be_name |
|
| 74 | 45 |
function configure_cinder_backend_lvm {
|
| 75 | 46 |
local be_name=$1 |
| 76 | 47 |
|
| 77 |
- # Again with the icehouse-generation compatibility |
|
| 78 |
- local volume_group_name=$(get_volume_group_name $be_name) |
|
| 79 |
- |
|
| 80 | 48 |
iniset $CINDER_CONF $be_name volume_backend_name $be_name |
| 81 | 49 |
iniset $CINDER_CONF $be_name volume_driver "cinder.volume.drivers.lvm.LVMISCSIDriver" |
| 82 |
- iniset $CINDER_CONF $be_name volume_group $volume_group_name |
|
| 50 |
+ iniset $CINDER_CONF $be_name volume_group $VOLUME_GROUP_NAME-$be_name |
|
| 83 | 51 |
|
| 84 | 52 |
if [[ "$CINDER_SECURE_DELETE" == "False" ]]; then |
| 85 | 53 |
iniset $CINDER_CONF $be_name volume_clear none |
| 86 | 54 |
fi |
| 87 | 55 |
} |
| 88 | 56 |
|
| 89 |
- |
|
| 57 |
+# init_cinder_backend_lvm - Initialize volume group |
|
| 58 |
+# init_cinder_backend_lvm $be_name |
|
| 90 | 59 |
function init_cinder_backend_lvm {
|
| 91 | 60 |
local be_name=$1 |
| 92 | 61 |
|
| 93 |
- # Again with the icehouse-generation compatibility |
|
| 94 |
- local volume_group_name=$(get_volume_group_name $be_name) |
|
| 95 |
- |
|
| 96 | 62 |
# Start with a clean volume group |
| 97 |
- _create_cinder_volume_group ${volume_group_name} $DATA_DIR/${volume_group_name}-backing-file
|
|
| 98 |
- |
|
| 99 |
- if is_fedora || is_suse; then |
|
| 100 |
- # service is not started by default |
|
| 101 |
- start_service tgtd |
|
| 102 |
- fi |
|
| 103 |
- |
|
| 104 |
- # Remove iscsi targets |
|
| 105 |
- sudo tgtadm --op show --mode target | grep $VOLUME_NAME_PREFIX | grep Target | cut -f3 -d ' ' | sudo xargs -n1 tgt-admin --delete || true |
|
| 106 |
- _clean_lvm_lv ${volume_group_name} $VOLUME_NAME_PREFIX
|
|
| 107 |
-} |
|
| 108 |
- |
|
| 109 |
- |
|
| 110 |
-# _clean_lvm_lv removes all cinder LVM volumes |
|
| 111 |
-# |
|
| 112 |
-# Usage: _clean_lvm_lv volume-group-name $VOLUME_NAME_PREFIX |
|
| 113 |
-function _clean_lvm_lv {
|
|
| 114 |
- local vg=$1 |
|
| 115 |
- local lv_prefix=$2 |
|
| 116 |
- |
|
| 117 |
- # Clean out existing volumes |
|
| 118 |
- local lv |
|
| 119 |
- for lv in $(sudo lvs --noheadings -o lv_name $vg 2>/dev/null); do |
|
| 120 |
- # lv_prefix prefixes the LVs we want |
|
| 121 |
- if [[ "${lv#$lv_prefix}" != "$lv" ]]; then
|
|
| 122 |
- sudo lvremove -f $vg/$lv |
|
| 123 |
- fi |
|
| 124 |
- done |
|
| 125 |
-} |
|
| 126 |
- |
|
| 127 |
-# _clean_lvm_backing_file() removes the backing file of the |
|
| 128 |
-# volume group used by cinder |
|
| 129 |
-# |
|
| 130 |
-# Usage: _clean_lvm_backing_file() volume-group-name backing-file-name |
|
| 131 |
-function _clean_lvm_backing_file {
|
|
| 132 |
- local vg=$1 |
|
| 133 |
- local backing_file=$2 |
|
| 134 |
- |
|
| 135 |
- # if there is no logical volume left, it's safe to attempt a cleanup |
|
| 136 |
- # of the backing file |
|
| 137 |
- if [[ -z "$(sudo lvs --noheadings -o lv_name $vg 2>/dev/null)" ]]; then |
|
| 138 |
- # if the backing physical device is a loop device, it was probably setup by devstack |
|
| 139 |
- local vg_dev=$(sudo losetup -j $backing_file | awk -F':' '/backing-file/ { print $1}')
|
|
| 140 |
- if [[ -n "$vg_dev" ]] && [[ -e "$vg_dev" ]]; then |
|
| 141 |
- sudo losetup -d $vg_dev |
|
| 142 |
- rm -f $backing_file |
|
| 143 |
- fi |
|
| 144 |
- fi |
|
| 63 |
+ init_lvm_volume_group $VOLUME_GROUP_NAME-$be_name $VOLUME_BACKING_FILE_SIZE |
|
| 145 | 64 |
} |
| 146 | 65 |
|
| 147 |
-# _create_cinder_volume_group volume-group-name backing-file-name |
|
| 148 |
-function _create_cinder_volume_group {
|
|
| 149 |
- # According to the ``CINDER_MULTI_LVM_BACKEND`` value, configure one or two default volumes |
|
| 150 |
- # group called ``stack-volumes`` (and ``stack-volumes2``) for the volume |
|
| 151 |
- # service if it (they) does (do) not yet exist. If you don't wish to use a |
|
| 152 |
- # file backed volume group, create your own volume group called ``stack-volumes`` |
|
| 153 |
- # and ``stack-volumes2`` before invoking ``stack.sh``. |
|
| 154 |
- # |
|
| 155 |
- # The two backing files are ``VOLUME_BACKING_FILE_SIZE`` in size, and they are stored in |
|
| 156 |
- # the ``DATA_DIR``. |
|
| 157 |
- |
|
| 158 |
- local vg_name=$1 |
|
| 159 |
- local backing_file=$2 |
|
| 160 |
- |
|
| 161 |
- if ! sudo vgs $vg_name; then |
|
| 162 |
- # TODO: fix device handling |
|
| 163 |
- if [ -z "$VOLUME_BACKING_DEVICE" ]; then |
|
| 164 |
- # Only create if the file doesn't already exists |
|
| 165 |
- [[ -f $backing_file ]] || truncate -s $VOLUME_BACKING_FILE_SIZE $backing_file |
|
| 166 |
- local vg_dev=`sudo losetup -f --show $backing_file` |
|
| 167 |
- |
|
| 168 |
- # Only create if the loopback device doesn't contain $VOLUME_GROUP |
|
| 169 |
- if ! sudo vgs $vg_name; then |
|
| 170 |
- sudo vgcreate $vg_name $vg_dev |
|
| 171 |
- fi |
|
| 172 |
- else |
|
| 173 |
- sudo vgcreate $vg_name $VOLUME_BACKING_DEVICE |
|
| 174 |
- fi |
|
| 175 |
- fi |
|
| 176 |
-} |
|
| 177 |
- |
|
| 178 |
- |
|
| 179 | 66 |
# Restore xtrace |
| 180 | 67 |
$MY_XTRACE |
| 181 | 68 |
|
| 182 | 69 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,124 @@ |
| 0 |
+# lib/lvm |
|
| 1 |
+# Configure the default LVM volume group used by Cinder and Nova |
|
| 2 |
+ |
|
| 3 |
+# Dependencies: |
|
| 4 |
+# |
|
| 5 |
+# - ``functions`` file |
|
| 6 |
+# - ``cinder`` configurations |
|
| 7 |
+ |
|
| 8 |
+# DATA_DIR |
|
| 9 |
+ |
|
| 10 |
+# clean_default_volume_group - called from clean() |
|
| 11 |
+# configure_default_volume_group - called from configure() |
|
| 12 |
+# init_default_volume_group - called from init() |
|
| 13 |
+ |
|
| 14 |
+ |
|
| 15 |
+# Save trace setting |
|
| 16 |
+MY_XTRACE=$(set +o | grep xtrace) |
|
| 17 |
+set +o xtrace |
|
| 18 |
+ |
|
| 19 |
+ |
|
| 20 |
+# Defaults |
|
| 21 |
+# -------- |
|
| 22 |
+# Name of the lvm volume groups to use/create for iscsi volumes |
|
| 23 |
+# This monkey-motion is for compatibility with icehouse-generation Grenade |
|
| 24 |
+# If ``VOLUME_GROUP`` is set, use it, otherwise we'll build a VG name based |
|
| 25 |
+# on ``VOLUME_GROUP_NAME`` that includes the backend name |
|
| 26 |
+# Grenade doesn't use ``VOLUME_GROUP2`` so it is left out |
|
| 27 |
+VOLUME_GROUP_NAME=${VOLUME_GROUP:-${VOLUME_GROUP_NAME:-stack-volumes}}
|
|
| 28 |
+DEFAULT_VOLUME_GROUP_NAME=$VOLUME_GROUP_NAME-default |
|
| 29 |
+ |
|
| 30 |
+# Backing file name is of the form $VOLUME_GROUP$BACKING_FILE_SUFFIX |
|
| 31 |
+BACKING_FILE_SUFFIX=-backing-file |
|
| 32 |
+ |
|
| 33 |
+ |
|
| 34 |
+# Entry Points |
|
| 35 |
+# ------------ |
|
| 36 |
+ |
|
| 37 |
+# _clean_lvm_volume_group removes all default LVM volumes |
|
| 38 |
+# |
|
| 39 |
+# Usage: clean_lvm_volume_group $vg |
|
| 40 |
+function _clean_lvm_volume_group {
|
|
| 41 |
+ local vg=$1 |
|
| 42 |
+ |
|
| 43 |
+ # Clean out existing volumes |
|
| 44 |
+ sudo lvremove -f $vg |
|
| 45 |
+} |
|
| 46 |
+ |
|
| 47 |
+# _clean_lvm_backing_file() removes the backing file of the |
|
| 48 |
+# volume group |
|
| 49 |
+# |
|
| 50 |
+# Usage: _clean_lvm_backing_file() $backing_file |
|
| 51 |
+function _clean_lvm_backing_file {
|
|
| 52 |
+ local backing_file=$1 |
|
| 53 |
+ |
|
| 54 |
+ # if the backing physical device is a loop device, it was probably setup by devstack |
|
| 55 |
+ if [[ -n "$backing_file" ]] && [[ -e "$backing_file" ]]; then |
|
| 56 |
+ local vg_dev=$(sudo losetup -j $backing_file | awk -F':' '/'$BACKING_FILE_SUFFIX'/ { print $1}')
|
|
| 57 |
+ sudo losetup -d $vg_dev |
|
| 58 |
+ rm -f $backing_file |
|
| 59 |
+ fi |
|
| 60 |
+} |
|
| 61 |
+ |
|
| 62 |
+# clean_lvm_volume_group() cleans up the volume group and removes the |
|
| 63 |
+# backing file |
|
| 64 |
+# |
|
| 65 |
+# Usage: clean_lvm_volume_group $vg |
|
| 66 |
+function clean_lvm_volume_group {
|
|
| 67 |
+ local vg=$1 |
|
| 68 |
+ |
|
| 69 |
+ _clean_lvm_volume_group $vg |
|
| 70 |
+ # if there is no logical volume left, it's safe to attempt a cleanup |
|
| 71 |
+ # of the backing file |
|
| 72 |
+ if [[ -z "$(sudo lvs --noheadings -o lv_name $vg 2>/dev/null)" ]]; then |
|
| 73 |
+ _clean_lvm_backing_file $DATA_DIR/$vg$BACKING_FILE_SUFFIX |
|
| 74 |
+ fi |
|
| 75 |
+} |
|
| 76 |
+ |
|
| 77 |
+ |
|
| 78 |
+# _create_volume_group creates default volume group |
|
| 79 |
+# |
|
| 80 |
+# Usage: _create_lvm_volume_group() $vg $size |
|
| 81 |
+function _create_lvm_volume_group {
|
|
| 82 |
+ local vg=$1 |
|
| 83 |
+ local size=$2 |
|
| 84 |
+ |
|
| 85 |
+ local backing_file=$DATA_DIR/$vg$BACKING_FILE_SUFFIX |
|
| 86 |
+ if ! sudo vgs $vg; then |
|
| 87 |
+ # Only create if the file doesn't already exists |
|
| 88 |
+ [[ -f $DATA_DIR/$backing_file ]] || truncate -s $size $backing_file |
|
| 89 |
+ local vg_dev=`sudo losetup -f --show $backing_file` |
|
| 90 |
+ |
|
| 91 |
+ # Only create volume group if it doesn't already exist |
|
| 92 |
+ if ! sudo vgs $vg; then |
|
| 93 |
+ sudo vgcreate $vg $vg_dev |
|
| 94 |
+ fi |
|
| 95 |
+ fi |
|
| 96 |
+} |
|
| 97 |
+ |
|
| 98 |
+# init_lvm_volume_group() initializes the volume group creating the backing |
|
| 99 |
+# file if necessary |
|
| 100 |
+# |
|
| 101 |
+# Usage: init_lvm_volume_group() $vg |
|
| 102 |
+function init_lvm_volume_group {
|
|
| 103 |
+ local vg=$1 |
|
| 104 |
+ local size=$2 |
|
| 105 |
+ # Start with a clean volume group |
|
| 106 |
+ _create_lvm_volume_group $vg $size |
|
| 107 |
+ |
|
| 108 |
+ if is_fedora || is_suse; then |
|
| 109 |
+ # service is not started by default |
|
| 110 |
+ start_service tgtd |
|
| 111 |
+ fi |
|
| 112 |
+ |
|
| 113 |
+ # Remove iscsi targets |
|
| 114 |
+ sudo tgtadm --op show --mode target | grep Target | cut -f3 -d ' ' | sudo xargs -n1 tgt-admin --delete || true |
|
| 115 |
+ |
|
| 116 |
+ _clean_lvm_volume_group $vg |
|
| 117 |
+} |
|
| 118 |
+ |
|
| 119 |
+# Restore xtrace |
|
| 120 |
+$MY_XTRACE |
|
| 121 |
+ |
|
| 122 |
+# mode: shell-script |
|
| 123 |
+# End: |
| ... | ... |
@@ -547,6 +547,11 @@ function create_nova_conf {
|
| 547 | 547 |
iniset $NOVA_CONF DEFAULT ec2_workers "$API_WORKERS" |
| 548 | 548 |
iniset $NOVA_CONF DEFAULT metadata_workers "$API_WORKERS" |
| 549 | 549 |
|
| 550 |
+ if [[ "$NOVA_BACKEND" == "LVM" ]]; then |
|
| 551 |
+ iniset $NOVA_CONF libvirt images_type "lvm" |
|
| 552 |
+ iniset $NOVA_CONF libvirt images_volume_group $DEFAULT_VOLUME_GROUP_NAME |
|
| 553 |
+ fi |
|
| 554 |
+ |
|
| 550 | 555 |
if is_ssl_enabled_service glance || is_service_enabled tls-proxy; then |
| 551 | 556 |
iniset $NOVA_CONF DEFAULT glance_protocol https |
| 552 | 557 |
fi |
| ... | ... |
@@ -523,6 +523,7 @@ source $TOP_DIR/lib/tls |
| 523 | 523 |
source $TOP_DIR/lib/infra |
| 524 | 524 |
source $TOP_DIR/lib/oslo |
| 525 | 525 |
source $TOP_DIR/lib/stackforge |
| 526 |
+source $TOP_DIR/lib/lvm |
|
| 526 | 527 |
source $TOP_DIR/lib/horizon |
| 527 | 528 |
source $TOP_DIR/lib/keystone |
| 528 | 529 |
source $TOP_DIR/lib/glance |
| ... | ... |
@@ -939,6 +940,10 @@ init_service_check |
| 939 | 939 |
# A better kind of sysstat, with the top process per time slice |
| 940 | 940 |
start_dstat |
| 941 | 941 |
|
| 942 |
+# Initialize default LVM volume group |
|
| 943 |
+# ----------------------------------- |
|
| 944 |
+init_lvm_volume_group $DEFAULT_VOLUME_GROUP_NAME $VOLUME_BACKING_FILE_SIZE |
|
| 945 |
+ |
|
| 942 | 946 |
# Start Services |
| 943 | 947 |
# ============== |
| 944 | 948 |
|
| ... | ... |
@@ -55,6 +55,7 @@ source $TOP_DIR/lib/tls |
| 55 | 55 |
source $TOP_DIR/lib/infra |
| 56 | 56 |
source $TOP_DIR/lib/oslo |
| 57 | 57 |
source $TOP_DIR/lib/stackforge |
| 58 |
+source $TOP_DIR/lib/lvm |
|
| 58 | 59 |
source $TOP_DIR/lib/horizon |
| 59 | 60 |
source $TOP_DIR/lib/keystone |
| 60 | 61 |
source $TOP_DIR/lib/glance |
| ... | ... |
@@ -177,3 +178,5 @@ if [[ -n "$SCREEN" ]]; then |
| 177 | 177 |
screen -X -S $SESSION quit |
| 178 | 178 |
fi |
| 179 | 179 |
fi |
| 180 |
+ |
|
| 181 |
+clean_lvm_volume_group $DEFAULT_VOLUME_GROUP_NAME |