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

Handle snap_revert, snap_delete

TM_MAD/delete and DS_MAD/rm for persistent
Ceph images with snapshots
This commit is contained in:
Jaime Melis 2015-06-05 17:42:11 +02:00
parent 08356ed8c3
commit 85a5e5f859
4 changed files with 226 additions and 5 deletions

View File

@ -17,7 +17,7 @@
#--------------------------------------------------------------------------- #
###############################################################################
# This script is used to remove a VM image (SRC) from the image repository
# This script is used to remove a VM image (RBD_SRC) from the image repository
###############################################################################
# ------------ Set up the environment to source common tools ------------
@ -48,7 +48,7 @@ done < <($XPATH /DS_DRIVER_ACTION_DATA/IMAGE/SOURCE \
/DS_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/BRIDGE_LIST \
/DS_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/CEPH_USER)
SRC="${XPATH_ELEMENTS[j++]}"
RBD_SRC="${XPATH_ELEMENTS[j++]}"
BRIDGE_LIST="${XPATH_ELEMENTS[j++]}"
CEPH_USER="${XPATH_ELEMENTS[j++]}"
@ -63,11 +63,52 @@ if [ -n "$CEPH_USER" ]; then
RBD="$RBD --id ${CEPH_USER}"
fi
# -------- Remove Image from Datastore ------------
log "Removing $SRC from the rbd image repository in $DST_HOST"
log "Removing $RBD_SRC from the rbd image repository in $DST_HOST"
ssh_exec_and_log "$DST_HOST" "$RBD rm $SRC" "Error removing $SRC in $DST_HOST"
DELETE_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
has_snap_shots=\$($RBD info $RBD_SRC-0@0 2>/dev/null)
if [ -n "\$has_snap_shots" ]; then
rm_children $RBD_SRC-0@0
else
$RBD rm $RBD_SRC
fi
else
$RBD rm $RBD_SRC
fi
EOF
)
ssh_exec_and_log "$DST_HOST" "$DELETE_CMD" \
"Error deleting $RBD_SRC in $DST_HOST"
exit 0

View File

@ -0,0 +1,90 @@
#!/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 delete a snapshot of an 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_DELETE_CMD=$(cat <<EOF
set -e
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 snap unprotect $RBD_SRC-$SNAP_ID@$SNAP_ID
$RBD snap rm $RBD_SRC-$SNAP_ID@$SNAP_ID
$RBD rm $RBD_SRC-$SNAP_ID
EOF
)
ssh_exec_and_log "$DST_HOST" "$SNAP_DELETE_CMD" \
"Error deleting snapshot $RBD_SRC-$SNAP_ID@$SNAP_ID"

View File

@ -0,0 +1,89 @@
#!/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 revert a snapshot of an 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_REVERT_CMD=$(cat <<EOF
set -e
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 rm $RBD_SRC
$RBD clone $RBD_SRC-$SNAP_ID@$SNAP_ID $RBD_SRC
EOF
)
ssh_exec_and_log "$DST_HOST" "$SNAP_REVERT_CMD" \
"Error reverting snapshot $RBD_SRC-$SNAP_ID@$SNAP_ID"

View File

@ -135,6 +135,7 @@ DELETE_CMD=$(cat <<EOF
$RBD rm $RBD_SRC
fi
# Remove the snapshot of the original image used to create a CLONE
if [ "\$RBD_FORMAT" = "2" ]; then
$RBD snap unprotect $SRC@$RBD_SNAP
$RBD snap rm $SRC@$RBD_SNAP