1
0
mirror of https://github.com/OpenNebula/one.git synced 2025-03-21 14:50:08 +03:00

Feature #3782: Action for Ceph snapshot flatten

This commit is contained in:
Jaime Melis 2015-06-08 12:04:23 +02:00
parent 85a5e5f859
commit 211619d806

View File

@ -0,0 +1,115 @@
#!/bin/bash
# -------------------------------------------------------------------------- #
# Copyright 2002-2015, OpenNebula Project (OpenNebula.org), C12G Labs #
# #
# Licensed 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 KIND, either express or implied. #
# See the License for the specific language governing permissions and #
# limitations under the License. #
#--------------------------------------------------------------------------- #
###############################################################################
# This script is used to flatten a snapshot of a persistent image
###############################################################################
# -------- Set up the environment to source common tools & conf ------------
if [ -z "${ONE_LOCATION}" ]; then
LIB_LOCATION=/usr/lib/one
else
LIB_LOCATION=$ONE_LOCATION/lib
fi
. $LIB_LOCATION/sh/scripts_common.sh
DRIVER_PATH=$(dirname $0)
source ${DRIVER_PATH}/../libfs.sh
source ${DRIVER_PATH}/ceph.conf
# -------- Get image and datastore arguments from OpenNebula core ------------
DRV_ACTION=$1
ID=$2
XPATH="${DRIVER_PATH}/../xpath.rb -b $DRV_ACTION"
unset i XPATH_ELEMENTS
while IFS= read -r -d '' element; do
XPATH_ELEMENTS[i++]="$element"
done < <($XPATH /DS_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/BRIDGE_LIST \
/DS_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/POOL_NAME \
/DS_DRIVER_ACTION_DATA/IMAGE/SOURCE \
/DS_DRIVER_ACTION_DATA/IMAGE/TARGET_SNAPSHOT \
/DS_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/CEPH_USER)
unset i
BRIDGE_LIST="${XPATH_ELEMENTS[i++]}"
POOL_NAME="${XPATH_ELEMENTS[i++]:-$POOL_NAME}"
RBD_SRC="${XPATH_ELEMENTS[i++]}"
SNAP_ID="${XPATH_ELEMENTS[i++]}"
CEPH_USER="${XPATH_ELEMENTS[i++]}"
DST_HOST=`get_destination_host $ID`
if [ -z "$DST_HOST" ]; then
error_message "Datastore template missing 'BRIDGE_LIST' attribute."
exit -1
fi
if [ -n "$CEPH_USER" ]; then
RBD="$RBD --id ${CEPH_USER}"
fi
SNAP_FLATTEN_CMD=$(cat <<EOF
rm_children(){
local rbd_snap rbd snap_id child snap_list
rbd_snap=\$1
rbd=\${rbd_snap%%@*}
snap_list=\$(set +e; rbd snap ls \$rbd)
if [ -n "\$snap_list" ]; then
CHILDREN=\$(set +e; rbd children \$rbd_snap 2>/dev/null)
for child in \$CHILDREN; do
snap_id=\${child##*-}
child=\$child@\$snap_id
rm_children \$child
done
$RBD snap unprotect \$rbd_snap
$RBD snap rm \$rbd_snap
fi
$RBD rm \$rbd
}
RBD_FORMAT=\$($RBD info $RBD_SRC | sed -n 's/.*format: // p')
if [ "\${RBD_FORMAT}" != "2" ]; then
echo "Only RBD Format 2 is supported for this operation" >&2
exit 1
fi
$RBD clone $RBD_SRC-$SNAP_ID@$SNAP_ID $RBD_SRC.flatten
$RBD flatten $RBD_SRC.flatten
rm_children $RBD_SRC-0@0
$RBD rename $RBD_SRC.flatten $RBD_SRC
EOF
)
ssh_exec_and_log "$DST_HOST" "$SNAP_FLATTEN_CMD" \
"Error flattening snapshot $RBD_SRC-$SNAP_ID@$SNAP_ID"