tm_lvmssh-issue1240.patch
install.sh | ||
---|---|---|
872 | 872 | |
873 | 873 |
ETC_FILES="share/etc/oned.conf \ |
874 | 874 |
share/etc/defaultrc \ |
875 |
share/etc/tm_lvmsshrc \ |
|
875 | 876 |
src/scheduler/etc/sched.conf \ |
876 | 877 |
src/cli/etc/group.default" |
877 | 878 |
share/etc/tm_lvmsshrc | ||
---|---|---|
1 |
# -------------------------------------------------------------------------- # |
|
2 |
# Copyright 2002-2012, OpenNebula Project Leads (OpenNebula.org) # |
|
3 |
# # |
|
4 |
# Licensed under the Apache License, Version 2.0 (the "License"); you may # |
|
5 |
# not use this file except in compliance with the License. You may obtain # |
|
6 |
# a copy of the License at # |
|
7 |
# # |
|
8 |
# http://www.apache.org/licenses/LICENSE-2.0 # |
|
9 |
# # |
|
10 |
# Unless required by applicable law or agreed to in writing, software # |
|
11 |
# distributed under the License is distributed on an "AS IS" BASIS, # |
|
12 |
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # |
|
13 |
# See the License for the specific language governing permissions and # |
|
14 |
# limitations under the License. # |
|
15 |
#--------------------------------------------------------------------------- # |
|
16 | ||
17 |
# -------------------------------------------------------------------------- # |
|
18 | ||
19 |
# Volume Group to create logical volumes |
|
20 |
VG_NAME="LVM_XEN" |
|
21 | ||
22 |
# Prefix for each logical volume |
|
23 |
LV_PREFIX="lv-one" |
|
24 | ||
25 |
# Default size for logical volumes if not specified |
|
26 |
DEFAULT_LV_SIZE="6G" |
|
27 | ||
28 |
# Type of images to store in the filesystem datastore |
|
29 |
# |
|
30 |
# Could be TGZ, GZIP or RAW. Default: RAW |
|
31 |
# - RAW : raw image is dumped into the lv |
|
32 |
# - GZIP : raw image is (un)gzipped before dump |
|
33 |
# - TGZ : image is a gzipped tarball extracted in a new filesystem |
|
34 |
# |
|
35 |
# If you use TGZ, the LV contain a filesystem (not a disk) and you |
|
36 |
# have to specify the TARGET device in the image template. |
|
37 |
# Ex : TARGET=xvda1 |
|
38 |
MODE="RAW" |
|
39 | ||
40 |
# Compression level for TGZ and GZIP copy mode |
|
41 |
COMPRESS_LEVEL="1" |
|
42 | ||
43 |
# Block size used by dd |
|
44 |
BLOCK_SIZE="64k" |
|
45 | ||
46 |
# Default filesystem type for logical volumes if TGZ mode is used |
|
47 |
DEFAULT_FSTYPE="ext3" |
|
48 | ||
49 |
# -------------------------------------------------------------------------- # |
|
50 |
# Helper functions for the LVM plugin # |
|
51 |
# -------------------------------------------------------------------------- # |
|
52 | ||
53 |
function get_vid |
|
54 |
{ |
|
55 |
[[ $1 =~ datastores/[0-9]+/([0-9]+)/ ]] && echo ${BASH_REMATCH[1]} |
|
56 |
} |
|
57 | ||
58 |
function get_lv_name |
|
59 |
{ |
|
60 |
VID=`get_vid $1` |
|
61 |
DISK=`echo $1|$AWK -F. '{printf $NF}'` |
|
62 |
echo "${LV_PREFIX}-${VID}-${DISK}" |
|
63 |
} |
|
64 | ||
65 |
function send_rawfile_to_lv |
|
66 |
{ |
|
67 |
local DST_HOST=$1 |
|
68 |
local FILE=$2 |
|
69 |
local LV_NAME=$3 |
|
70 | ||
71 |
exec_and_log "eval cat $FILE | $SSH $DST_HOST $SUDO $DD of=/dev/$VG_NAME/$LV_NAME bs=$BLOCK_SIZE" |
|
72 |
} |
|
73 | ||
74 |
function send_gzipfile_to_lv |
|
75 |
{ |
|
76 |
local DST_HOST=$1 |
|
77 |
local FILE=$2 |
|
78 |
local LV_NAME=$3 |
|
79 | ||
80 |
exec_and_log "eval cat $FILE | $SSH $DST_HOST '$GZIP -d | $SUDO $DD of=/dev/$VG_NAME/$LV_NAME bs=$BLOCK_SIZE'" |
|
81 |
} |
|
82 | ||
83 |
function send_tgzfile_to_lv |
|
84 |
{ |
|
85 |
local HOST=$1 |
|
86 |
local FILE=$2 |
|
87 |
local LV_NAME=$3 |
|
88 |
local FSTYPE=${4:-$DEFAULT_FSTYPE} |
|
89 | ||
90 |
local TMP_DIR=$($SSH $HOST $SUDO mktemp -d) |
|
91 |
exec_and_log "eval $SSH $HOST '$SUDO $(mkfs_command /dev/$VG_NAME/$LV_NAME $FSTYPE) && $SUDO mount /dev/$VG_NAME/$LV_NAME $TMP_DIR'" |
|
92 |
exec_and_log "eval cat $FILE | $SSH $HOST '$SUDO $TAR -xzf - -C $TMP_DIR'" |
|
93 |
exec_and_log "eval $SSH $HOST '$SUDO umount $TMP_DIR && $SUDO rmdir $TMP_DIR'" |
|
94 |
} |
|
95 | ||
96 |
function get_rawfile_from_lv |
|
97 |
{ |
|
98 |
local HOST=$1 |
|
99 |
local FILE=$2 |
|
100 |
local LV=$3 |
|
101 | ||
102 |
exec_and_log "eval $SSH $HOST $SUDO $DD if=$LV bs=$BLOCK_SIZE | cat - >$FILE" |
|
103 |
} |
|
104 | ||
105 |
function get_gzipfile_from_lv |
|
106 |
{ |
|
107 |
local HOST=$1 |
|
108 |
local FILE=$2 |
|
109 |
local LV=$3 |
|
110 | ||
111 |
exec_and_log "eval $SSH $HOST '$SUDO $DD if=$LV bs=$BLOCK_SIZE | $GZIP -$COMPRESS_LEVEL ' | cat - >$FILE" |
|
112 |
} |
|
113 | ||
114 |
function get_tgzfile_from_lv |
|
115 |
{ |
|
116 |
local HOST=$1 |
|
117 |
local FILE=$2 |
|
118 |
local LV=$3 |
|
119 | ||
120 |
TMP_DIR=$($SSH $HOST $SUDO mktemp -d) |
|
121 |
exec_and_log "$SSH $HOST $SUDO mount $LV $TMP_DIR" |
|
122 |
exec_and_log "eval $SSH $HOST '$SUDO $TAR -cf - -C $TMP_DIR . | $GZIP -$COMPRESS_LEVEL ' | cat - >$FILE" |
|
123 |
exec_and_log "eval $SSH $HOST '$SUDO umount $TMP_DIR && $SUDO rmdir $TMP_DIR'" |
|
124 |
} |
|
125 | ||
126 |
function send_file_to_lv |
|
127 |
{ |
|
128 |
local HOST=$1 |
|
129 |
local FILE=$2 |
|
130 |
local LV_NAME=$3 |
|
131 |
local FSTYPE=${4:-$DEFAULT_FSTYPE} |
|
132 | ||
133 |
MIME=$(file -b --mime-type $FILE) |
|
134 |
case "$MIME" in |
|
135 |
"application/x-gzip") |
|
136 |
INNER_MIME=$(file -bz --mime-type $FILE) |
|
137 |
case "$INNER_MIME" in |
|
138 |
"application/x-tar") |
|
139 |
send_tgzfile_to_lv $HOST $FILE $LV_NAME $FSTYPE |
|
140 |
;; |
|
141 |
*) |
|
142 |
send_gzipfile_to_lv $HOST $FILE $LV_NAME |
|
143 |
;; |
|
144 |
esac |
|
145 |
;; |
|
146 |
*) |
|
147 |
send_rawfile_to_lv $HOST $FILE $LV_NAME |
|
148 |
;; |
|
149 |
esac |
|
150 |
} |
|
151 | ||
152 |
function get_file_from_lv |
|
153 |
{ |
|
154 |
local HOST=$1 |
|
155 |
local FILE=$2 |
|
156 |
local LV=$3 |
|
157 |
local TYPE=$4 |
|
158 | ||
159 |
case "$MODE" in |
|
160 |
"TGZ") |
|
161 |
case "$TYPE" in |
|
162 |
"FS") |
|
163 |
get_tgzfile_from_lv $HOST $FILE $LV |
|
164 |
;; |
|
165 |
*) |
|
166 |
get_gzipfile_from_lv $HOST $FILE $LV |
|
167 |
;; |
|
168 |
esac |
|
169 |
;; |
|
170 |
"GZIP") |
|
171 |
get_gzipfile_from_lv $HOST $FILE $LV |
|
172 |
;; |
|
173 |
*) |
|
174 |
get_rawfile_from_lv $HOST $FILE $LV |
|
175 |
;; |
|
176 |
esac |
|
177 |
} |
|
178 | ||
179 |
function get_disk |
|
180 |
{ |
|
181 |
local SRC_HOST=$1 |
|
182 |
local SRC_PATH=$2 |
|
183 |
local DST_PATH=$3 |
|
184 | ||
185 |
# Retrieve informations on logical volume |
|
186 |
read TYPE LV FSTYPE DUMMY < <(echo " |
|
187 |
LV=\$(readlink $SRC_PATH) |
|
188 |
MIME=\$(sudo file -bsL --mime-type \$LV) |
|
189 |
case \"\$MIME\" in |
|
190 |
\"application/octet-stream\") |
|
191 |
# This is a filesystem, try to detect the type |
|
192 |
TMP_DIR=\$(mktemp -d) |
|
193 |
sudo mount \$LV \$TMP_DIR 2>/dev/null |
|
194 |
if [ \$? -eq 0 ]; then |
|
195 |
FSTYPE=\$(grep \$TMP_DIR /proc/mounts | awk {'print \$3'}) |
|
196 |
echo \"FS \$LV \$FSTYPE\" |
|
197 |
sudo umount \$TMP_DIR |
|
198 |
else |
|
199 |
echo \"RAW \$LV \" |
|
200 |
fi |
|
201 |
rmdir \$TMP_DIR |
|
202 |
;; |
|
203 |
\"application/x-iso9660-image\") |
|
204 |
echo \"RAW \$LV \" |
|
205 |
;; |
|
206 |
*) |
|
207 |
echo \"RAW \$LV \" |
|
208 |
;; |
|
209 |
esac |
|
210 |
" | $SSH $SRC_HOST "$BASH -s") |
|
211 | ||
212 |
if [ "$?" != "0" ]; then |
|
213 |
log_error "Error retrieving LV informations." |
|
214 |
exit 1 |
|
215 |
fi |
|
216 | ||
217 |
get_file_from_lv $SRC_HOST $DST_PATH $LV $TYPE |
|
218 |
} |
|
219 | ||
220 |
function get_all_disks |
|
221 |
{ |
|
222 |
local SRC_HOST=$1 |
|
223 |
local SRC_PATH=$2 |
|
224 |
local DST_PATH=$3 |
|
225 |
local MAPFILE="$SRC_PATH/diskmap" |
|
226 | ||
227 |
# Retrieve informations on logical volumes |
|
228 |
echo " |
|
229 |
echo -e \"declare -a DISKS\nDISKS=(\" > $MAPFILE |
|
230 |
for DISK in \$(find $SRC_PATH -type l -regex '.*disk\.[0-9]+'); do |
|
231 |
LV=\$(readlink \$DISK) |
|
232 |
MIME=\$(sudo file -bsL --mime-type \$LV) |
|
233 |
SIZE=\$(sudo lvs -o lv_size \$LV --noheadings) |
|
234 |
case \"\$MIME\" in |
|
235 |
\"application/octet-stream\") |
|
236 |
# This is a filesystem, try to detect the type |
|
237 |
TMP_DIR=\$(mktemp -d) |
|
238 |
sudo mount \$LV \$TMP_DIR 2>/dev/null |
|
239 |
if [ \$? -eq 0 ]; then |
|
240 |
FSTYPE=\$(grep \$TMP_DIR /proc/mounts | awk {'print \$3'}) |
|
241 |
echo \"\\\"FS \$DISK \$LV \$SIZE \$FSTYPE\\\"\" >>$MAPFILE |
|
242 |
sudo umount \$TMP_DIR |
|
243 |
else |
|
244 |
echo \"\\\"RAW \$DISK \$LV \$SIZE\\\"\" >>$MAPFILE |
|
245 |
fi |
|
246 |
rmdir \$TMP_DIR |
|
247 |
;; |
|
248 |
\"application/x-iso9660-image\") |
|
249 |
echo \"\\\"RAW \$DISK \$LV \$SIZE\\\"\" >>$MAPFILE |
|
250 |
;; |
|
251 |
*) |
|
252 |
echo \"\\\"RAW \$DISK \$LV \$SIZE\\\"\" >>$MAPFILE |
|
253 |
;; |
|
254 |
esac |
|
255 |
done |
|
256 |
echo \")\" >> $MAPFILE |
|
257 |
" | $SSH $SRC_HOST "$BASH -s" |
|
258 | ||
259 |
if [ "$?" != "0" ]; then |
|
260 |
log_error "Error retrieving LV informations." |
|
261 |
exit 1 |
|
262 |
fi |
|
263 | ||
264 |
# Transfert configuration files (will not transfert symlinks) |
|
265 |
exec_and_log "$RSYNC --compress-level=$COMPRESS_LEVEL -re ssh $SRC/* $DST_PATH" |
|
266 |
local MAPFILE="$DST_PATH/diskmap" |
|
267 | ||
268 |
# Dump logicals volume to file |
|
269 |
[ -r "$MAPFILE" ] || log_error "Cannot read diskmap : $MAPFILE" |
|
270 |
source $MAPFILE |
|
271 |
for DISK in "${DISKS[@]}"; do |
|
272 |
read TYPE NAME LV SIZE FSTYPE DUMMY < <(echo $DISK) |
|
273 |
get_file_from_lv $SRC_HOST $NAME $LV $TYPE |
|
274 |
done |
|
275 |
} |
|
276 | ||
277 |
function send_all_disks |
|
278 |
{ |
|
279 |
local SRC_PATH=$1 |
|
280 |
local DST_HOST=$2 |
|
281 |
local DST_PATH=$3 |
|
282 |
local MAPFILE="$SRC_PATH/diskmap" |
|
283 | ||
284 |
# Send all fils but disks |
|
285 |
exec_and_log "$SCP -r $(ls $SRC_PATH -I disk.\* | xargs -I{} echo $SRC_PATH/{}) $DST_HOST:$DST_PATH" |
|
286 | ||
287 |
# Dump file to logical volumes |
|
288 |
[ -r "$MAPFILE" ] || log_error "Cannot read diskmap : $MAPFILE" |
|
289 |
source $MAPFILE |
|
290 |
for DISK in "${DISKS[@]}"; do |
|
291 |
read TYPE NAME LV SIZE FSTYPE DUMMY < <(echo $DISK) |
|
292 |
LV_NAME=$(basename $LV) |
|
293 | ||
294 |
# Create LV |
|
295 |
log "Creating LV $LV_NAME" |
|
296 |
create_lv $DST_HOST $LV_NAME "$DST_PATH/$(basename $NAME)" $SIZE |
|
297 | ||
298 |
send_file_to_lv $DST_HOST $NAME $LV_NAME $FSTYPE |
|
299 |
done |
|
300 |
} |
|
301 | ||
302 |
function remove_lv |
|
303 |
{ |
|
304 |
local HOST=$1 |
|
305 |
local FILE=$2 |
|
306 | ||
307 |
local CMD=$(cat <<EOF |
|
308 |
set -e |
|
309 |
LV=\$(readlink $FILE) |
|
310 |
$SUDO $LVCHANGE -an \$LV |
|
311 |
$SUDO $LVREMOVE -f \$LV |
|
312 |
$SUDO rm -f $FILE |
|
313 |
EOF |
|
314 |
) |
|
315 | ||
316 |
ssh_exec_and_log "$HOST" "$CMD" "Cannot remove LV $FILE" |
|
317 |
} |
|
318 | ||
319 |
function remove_all_lv |
|
320 |
{ |
|
321 |
local HOST=$1 |
|
322 |
local DST_PATH=$2 |
|
323 | ||
324 |
DISK_LIST=$($SSH $HOST "find $DST_PATH -type l -regex '.*disk\.[0-9]+'") |
|
325 | ||
326 |
if [ "$?" != "0" ]; then |
|
327 |
log_error "Error retrieving disks informations." |
|
328 |
exit 1 |
|
329 |
fi |
|
330 | ||
331 |
for DISK in $DISK_LIST; do |
|
332 |
log "Deleting LV $DISK" |
|
333 |
remove_lv $HOST $DISK |
|
334 |
done |
|
335 |
} |
|
336 | ||
337 |
function create_lv |
|
338 |
{ |
|
339 |
local HOST=$1 |
|
340 |
local LV_NAME=$2 |
|
341 |
local FILE=$3 |
|
342 |
local SIZE=${4:-$DEFAULT_LV_SIZE} |
|
343 | ||
344 |
local CMD=$(cat <<EOF |
|
345 |
set -e |
|
346 |
$SUDO $LVCREATE -L$SIZE -n $LV_NAME $VG_NAME |
|
347 |
ln -s /dev/$VG_NAME/$LV_NAME $FILE |
|
348 |
EOF |
|
349 |
) |
|
350 | ||
351 |
ssh_exec_and_log "$HOST" "$CMD" "Cannot create LV $LV_NAME" |
|
352 |
} |
|
353 | ||
354 |
# EOF |
src/mad/sh/scripts_common.sh | ||
---|---|---|
23 | 23 |
DD=dd |
24 | 24 |
DU=du |
25 | 25 |
GREP=grep |
26 |
GZIP=gzip |
|
26 | 27 |
ISCSIADM=iscsiadm |
27 | 28 |
LVCREATE=lvcreate |
28 | 29 |
LVREMOVE=lvremove |
30 |
LVCHANGE=lvchange |
|
29 | 31 |
LVS=lvs |
30 | 32 |
LN=ln |
31 | 33 |
MD5SUM=md5sum |
... | ... | |
34 | 36 |
MKSWAP=mkswap |
35 | 37 |
QEMU_IMG=qemu-img |
36 | 38 |
READLINK=readlink |
39 |
RSYNC=rsync |
|
37 | 40 |
SCP=scp |
38 | 41 |
SED=sed |
39 | 42 |
SSH=ssh |
src/tm_mad/lvmssh/clone | ||
---|---|---|
1 |
#!/bin/bash |
|
2 | ||
3 |
# -------------------------------------------------------------------------- # |
|
4 |
# Copyright 2002-2012, OpenNebula Project Leads (OpenNebula.org) # |
|
5 |
# # |
|
6 |
# Licensed under the Apache License, Version 2.0 (the "License"); you may # |
|
7 |
# not use this file except in compliance with the License. You may obtain # |
|
8 |
# a copy of the License at # |
|
9 |
# # |
|
10 |
# http://www.apache.org/licenses/LICENSE-2.0 # |
|
11 |
# # |
|
12 |
# Unless required by applicable law or agreed to in writing, software # |
|
13 |
# distributed under the License is distributed on an "AS IS" BASIS, # |
|
14 |
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # |
|
15 |
# See the License for the specific language governing permissions and # |
|
16 |
# limitations under the License. # |
|
17 |
#--------------------------------------------------------------------------- # |
|
18 | ||
19 |
# clone fe:SOURCE host:remote_system_ds/disk.i size |
|
20 |
# - fe is the front-end hostname |
|
21 |
# - SOURCE is the path of the disk image in the form DS_BASE_PATH/disk |
|
22 |
# - host is the target host to deploy the VM |
|
23 |
# - remote_system_ds is the path for the system datastore in the host |
|
24 | ||
25 |
SRC=$1 |
|
26 |
DST=$2 |
|
27 | ||
28 |
# TODO get SIZE and FSTYPE from template |
|
29 |
SIZE="" # Empty stings: will take default values |
|
30 |
FSTYPE="" |
|
31 | ||
32 |
if [ -z "${ONE_LOCATION}" ]; then |
|
33 |
TMCOMMON=/var/lib/one/remotes/tm/tm_common.sh |
|
34 |
LVMRC=/etc/one/tm_lvmsshrc |
|
35 |
else |
|
36 |
TMCOMMON=$ONE_LOCATION/var/remotes/tm/tm_common.sh |
|
37 |
LVMRC=$ONE_LOCATION/etc/tm_lvmsshrc |
|
38 |
fi |
|
39 | ||
40 |
. $TMCOMMON |
|
41 |
. $LVMRC |
|
42 | ||
43 |
#------------------------------------------------------------------------------- |
|
44 |
# Set dst path and dir |
|
45 |
#------------------------------------------------------------------------------- |
|
46 | ||
47 |
SRC_PATH=`arg_path $SRC` |
|
48 |
DST_PATH=`arg_path $DST` |
|
49 |
DST_HOST=`arg_host $DST` |
|
50 | ||
51 |
DST_DIR=`dirname $DST_PATH` |
|
52 | ||
53 |
LV_NAME=`get_lv_name $DST_PATH` |
|
54 | ||
55 |
ssh_make_path $DST_HOST $DST_DIR |
|
56 | ||
57 |
#------------------------------------------------------------------------------- |
|
58 |
# Copy files to the remote host |
|
59 |
#------------------------------------------------------------------------------- |
|
60 | ||
61 |
log "Creating LV $LV_NAME" |
|
62 |
create_lv $DST_HOST $LV_NAME $DST_PATH $SIZE |
|
63 | ||
64 |
case $SRC in |
|
65 |
http://*) |
|
66 |
log "Downloading $SRC into /dev/$VG_NAME/$LV_NAME" |
|
67 |
RMT_CMD="$WGET $SRC -q -O- | $SUDO $DD of=/dev/$VG_NAME/$LV_NAME bs=$BLOCK_SIZE" |
|
68 |
exec_and_log "eval $SSH $DST_HOST '$RMT_CMD'" "Error downloading $SRC" |
|
69 |
;; |
|
70 | ||
71 |
*) |
|
72 |
log "Dumping $SRC into /dev/$VG_NAME/$LV_NAME..." |
|
73 |
send_file_to_lv $DST_HOST $SRC_PATH $LV_NAME $FSTYPE |
|
74 |
;; |
|
75 |
esac |
src/tm_mad/lvmssh/context | ||
---|---|---|
1 |
#!/bin/bash |
|
2 | ||
3 |
# -------------------------------------------------------------------------- # |
|
4 |
# Copyright 2002-2012, OpenNebula Project Leads (OpenNebula.org) # |
|
5 |
# # |
|
6 |
# Licensed under the Apache License, Version 2.0 (the "License"); you may # |
|
7 |
# not use this file except in compliance with the License. You may obtain # |
|
8 |
# a copy of the License at # |
|
9 |
# # |
|
10 |
# http://www.apache.org/licenses/LICENSE-2.0 # |
|
11 |
# # |
|
12 |
# Unless required by applicable law or agreed to in writing, software # |
|
13 |
# distributed under the License is distributed on an "AS IS" BASIS, # |
|
14 |
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # |
|
15 |
# See the License for the specific language governing permissions and # |
|
16 |
# limitations under the License. # |
|
17 |
#--------------------------------------------------------------------------- # |
|
18 | ||
19 |
# context context.sh file1 file2 ... fileN host:remote_system_ds/disk.i |
|
20 |
# - context.sh file are the contents of the context ISO |
|
21 |
# - host is the target host to deploy the VM |
|
22 |
# - remote_system_ds is the path for the system datastore in the host |
|
23 | ||
24 |
while (( "$#" )); do |
|
25 |
if [ "$#" == "1" ]; then |
|
26 |
DST=$1 |
|
27 |
else |
|
28 |
SRC="$SRC $1" |
|
29 |
fi |
|
30 |
shift |
|
31 |
done |
|
32 | ||
33 |
if [ -z "${ONE_LOCATION}" ]; then |
|
34 |
TMCOMMON=/var/lib/one/remotes/tm/tm_common.sh |
|
35 |
LVMRC=/etc/one/tm_lvmsshrc |
|
36 |
else |
|
37 |
TMCOMMON=$ONE_LOCATION/var/remotes/tm/tm_common.sh |
|
38 |
LVMRC=$ONE_LOCATION/etc/tm_lvmsshrc |
|
39 |
fi |
|
40 | ||
41 |
. $TMCOMMON |
|
42 |
. $LVMRC |
|
43 | ||
44 |
#------------------------------------------------------------------------------- |
|
45 |
# Set dst path and dirs |
|
46 |
#------------------------------------------------------------------------------- |
|
47 |
DST_PATH=`arg_path $DST` |
|
48 |
DST_HOST=`arg_host $DST` |
|
49 |
DST_DIR=`dirname $DST_PATH` |
|
50 | ||
51 |
ssh_make_path $DST_HOST $DST_DIR |
|
52 | ||
53 |
#------------------------------------------------------------------------------- |
|
54 |
# Build the Context Block device (locally) and copy it remotely |
|
55 |
#------------------------------------------------------------------------------- |
|
56 |
log "Generating context block device at $DST" |
|
57 | ||
58 |
VM_ID=`basename $DST_DIR` |
|
59 |
ISO_DIR="$DS_DIR/.isofiles/$VM_ID" |
|
60 |
ISO_FILE="$ISO_DIR/$VM_ID.iso" |
|
61 |
LV_NAME=`get_lv_name $DST_PATH` |
|
62 | ||
63 |
exec_and_log "mkdir -p $ISO_DIR" "Could not create tmp dir to make context dev" |
|
64 | ||
65 |
for f in $SRC; do |
|
66 |
case $f in |
|
67 |
http://*) |
|
68 |
exec_and_log "$WGET -P $ISO_DIR $f" "Error downloading $f" |
|
69 |
;; |
|
70 |
*) |
|
71 |
exec_and_log "cp -R $f $ISO_DIR" "Error copying $f to $ISO_DIR" |
|
72 |
;; |
|
73 |
esac |
|
74 |
done |
|
75 | ||
76 |
exec_and_log "$MKISOFS -o $ISO_FILE -J -R $ISO_DIR" "Error creating iso fs" |
|
77 |
SIZE="$(stat -c %s $TMP_DIR/$DST_FILE)B" |
|
78 | ||
79 |
log "Creating LV $LV_NAME" |
|
80 |
create_lv $DST_HOST $LV_NAME $DST_PATH $SIZE |
|
81 |
exec_and_log "eval cat $ISO_FILE | $SSH $DST_HOST $SUDO $DD of=/dev/$VG_NAME/$LV_NAME bs=$BLOCK_SIZE" |
|
82 | ||
83 |
rm -rf $ISO_DIR &>/dev/null |
|
84 | ||
85 |
exit 0 |
src/tm_mad/lvmssh/delete | ||
---|---|---|
1 |
#!/bin/bash |
|
2 | ||
3 |
# -------------------------------------------------------------------------- # |
|
4 |
# Copyright 2002-2012, OpenNebula Project Leads (OpenNebula.org) # |
|
5 |
# # |
|
6 |
# Licensed under the Apache License, Version 2.0 (the "License"); you may # |
|
7 |
# not use this file except in compliance with the License. You may obtain # |
|
8 |
# a copy of the License at # |
|
9 |
# # |
|
10 |
# http://www.apache.org/licenses/LICENSE-2.0 # |
|
11 |
# # |
|
12 |
# Unless required by applicable law or agreed to in writing, software # |
|
13 |
# distributed under the License is distributed on an "AS IS" BASIS, # |
|
14 |
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # |
|
15 |
# See the License for the specific language governing permissions and # |
|
16 |
# limitations under the License. # |
|
17 |
#--------------------------------------------------------------------------- # |
|
18 | ||
19 |
# DELETE <host:remote_system_ds/disk.i|host:remote_system_ds/> |
|
20 |
# - host is the target host to deploy the VM |
|
21 |
# - remote_system_ds is the path for the system datastore in the host |
|
22 | ||
23 |
DST=$1 |
|
24 | ||
25 |
if [ -z "${ONE_LOCATION}" ]; then |
|
26 |
TMCOMMON=/var/lib/one/remotes/tm/tm_common.sh |
|
27 |
LVMRC=/etc/one/tm_lvmsshrc |
|
28 |
else |
|
29 |
TMCOMMON=$ONE_LOCATION/var/remotes/tm/tm_common.sh |
|
30 |
LVMRC=$ONE_LOCATION/etc/tm_lvmsshrc |
|
31 |
fi |
|
32 | ||
33 |
. $TMCOMMON |
|
34 |
. $LVMRC |
|
35 | ||
36 |
DST_PATH=`arg_path $DST` |
|
37 |
DST_HOST=`arg_host $DST` |
|
38 | ||
39 |
if [ `is_disk $DST_PATH` -eq 1 ]; then |
|
40 |
# Disk |
|
41 |
log "Deleting LV $DST_PATH" |
|
42 |
remove_lv $DST_HOST $DST_PATH |
|
43 |
else |
|
44 |
# Directory |
|
45 |
remove_all_lv $DST_HOST $DST_PATH |
|
46 | ||
47 |
log "Deleting directory $DST_PATH" |
|
48 |
ssh_exec_and_log $DST_HOST "$SUDO rm -rf $DST_PATH" "Error deleting $DST_PATH" |
|
49 |
fi |
|
50 | ||
51 |
exit 0 |
src/tm_mad/lvmssh/ln | ||
---|---|---|
1 |
clone |
src/tm_mad/lvmssh/mkimage | ||
---|---|---|
1 |
#!/bin/bash |
|
2 | ||
3 |
# -------------------------------------------------------------------------- # |
|
4 |
# Copyright 2002-2012, OpenNebula Project Leads (OpenNebula.org) # |
|
5 |
# # |
|
6 |
# Licensed under the Apache License, Version 2.0 (the "License"); you may # |
|
7 |
# not use this file except in compliance with the License. You may obtain # |
|
8 |
# a copy of the License at # |
|
9 |
# # |
|
10 |
# http://www.apache.org/licenses/LICENSE-2.0 # |
|
11 |
# # |
|
12 |
# Unless required by applicable law or agreed to in writing, software # |
|
13 |
# distributed under the License is distributed on an "AS IS" BASIS, # |
|
14 |
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # |
|
15 |
# See the License for the specific language governing permissions and # |
|
16 |
# limitations under the License. # |
|
17 |
#--------------------------------------------------------------------------- # |
|
18 | ||
19 |
# mkimage size format host:remote_system_ds/disk.i size |
|
20 |
# - size in MB of the image |
|
21 |
# - format for the image |
|
22 |
# - host is the target host to deploy the VM |
|
23 |
# - remote_system_ds is the path for the system datastore in the host |
|
24 | ||
25 |
SIZE=$1 |
|
26 |
FSTYPE=$2 |
|
27 |
DST=$3 |
|
28 | ||
29 |
if [ -z "${ONE_LOCATION}" ]; then |
|
30 |
TMCOMMON=/var/lib/one/remotes/tm/tm_common.sh |
|
31 |
LVMRC=/etc/one/tm_lvmsshrc |
|
32 |
else |
|
33 |
TMCOMMON=$ONE_LOCATION/var/remotes/tm/tm_common.sh |
|
34 |
LVMRC=$ONE_LOCATION/etc/tm_lvmsshrc |
|
35 |
fi |
|
36 | ||
37 |
. $TMCOMMON |
|
38 |
. $LVMRC |
|
39 | ||
40 |
#------------------------------------------------------------------------------- |
|
41 |
# Set dst path and dir |
|
42 |
#------------------------------------------------------------------------------- |
|
43 |
DST_PATH=`arg_path $DST` |
|
44 |
DST_HOST=`arg_host $DST` |
|
45 |
DST_DIR=`dirname $DST_PATH` |
|
46 | ||
47 |
ssh_make_path $DST_HOST $DST_DIR |
|
48 | ||
49 |
#------------------------------------------------------------------------------- |
|
50 |
# Make the new image (logical volume-based) |
|
51 |
#------------------------------------------------------------------------------- |
|
52 |
LV_NAME=`get_lv_name $DST_PATH` |
|
53 |
FSTYPE=${FSTYPE:-$DEFAULT_FSTYPE} |
|
54 |
MKFS_CMD=`mkfs_command /dev/$VG_NAME/$LV_NAME $FSTYPE $SIZE` |
|
55 | ||
56 |
log "Making filesystem of ${SIZE}M and type $FSTYPE at $DST" |
|
57 | ||
58 |
create_lv $DST_HOST $LV_NAME $DST_PATH $SIZE |
|
59 |
ssh_exec_and_log $DST_HOST "$SUDO $MKFS_CMD" "Could not create LV /dev/$VG_NAME/$LV_NAME" |
|
60 | ||
61 |
exit 0 |
src/tm_mad/lvmssh/mkswap | ||
---|---|---|
1 |
#!/bin/bash |
|
2 | ||
3 |
# -------------------------------------------------------------------------- # |
|
4 |
# Copyright 2002-2012, OpenNebula Project Leads (OpenNebula.org) # |
|
5 |
# # |
|
6 |
# Licensed under the Apache License, Version 2.0 (the "License"); you may # |
|
7 |
# not use this file except in compliance with the License. You may obtain # |
|
8 |
# a copy of the License at # |
|
9 |
# # |
|
10 |
# http://www.apache.org/licenses/LICENSE-2.0 # |
|
11 |
# # |
|
12 |
# Unless required by applicable law or agreed to in writing, software # |
|
13 |
# distributed under the License is distributed on an "AS IS" BASIS, # |
|
14 |
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # |
|
15 |
# See the License for the specific language governing permissions and # |
|
16 |
# limitations under the License. # |
|
17 |
#--------------------------------------------------------------------------- # |
|
18 | ||
19 |
# mkswap size host:remote_system_ds/disk.i size |
|
20 |
# - size in MB of the image |
|
21 |
# - host is the target host to deploy the VM |
|
22 |
# - remote_system_ds is the path for the system datastore in the host |
|
23 | ||
24 |
SIZE=$1 |
|
25 |
DST=$2 |
|
26 | ||
27 |
if [ -z "${ONE_LOCATION}" ]; then |
|
28 |
TMCOMMON=/var/lib/one/remotes/tm/tm_common.sh |
|
29 |
LVMRC=/etc/one/tm_lvmsshrc |
|
30 |
else |
|
31 |
TMCOMMON=$ONE_LOCATION/var/remotes/tm/tm_common.sh |
|
32 |
LVMRC=$ONE_LOCATION/etc/tm_lvmsshrc |
|
33 |
fi |
|
34 | ||
35 |
. $TMCOMMON |
|
36 |
. $LVMRC |
|
37 | ||
38 |
#------------------------------------------------------------------------------- |
|
39 |
# Set dst path and dir |
|
40 |
#------------------------------------------------------------------------------- |
|
41 | ||
42 |
DST_PATH=`arg_path $DST` |
|
43 |
DST_HOST=`arg_host $DST` |
|
44 | ||
45 |
DST_DIR=`dirname $DST_PATH` |
|
46 | ||
47 |
LV_NAME=`get_lv_name $DST_PATH` |
|
48 | ||
49 |
ssh_make_path $DST_HOST $DST_DIR |
|
50 | ||
51 |
#------------------------------------------------------------------------------- |
|
52 |
# Create swap LV on the remote host |
|
53 |
#------------------------------------------------------------------------------- |
|
54 | ||
55 |
log "Creating LV $LV_NAME" |
|
56 |
create_lv $DST_HOST $LV_NAME $DST_PATH $SIZE |
|
57 | ||
58 |
log "Initializing swap space" |
|
59 |
ssh_exec_and_log $DST_HOST "$SUDO $MKSWAP /dev/$VG_NAME/$LV_NAME" |
|
60 | ||
61 |
exit 0 |
src/tm_mad/lvmssh/mv | ||
---|---|---|
1 |
#!/bin/bash |
|
2 | ||
3 |
# -------------------------------------------------------------------------- # |
|
4 |
# Copyright 2002-2012, OpenNebula Project Leads (OpenNebula.org) # |
|
5 |
# # |
|
6 |
# Licensed under the Apache License, Version 2.0 (the "License"); you may # |
|
7 |
# not use this file except in compliance with the License. You may obtain # |
|
8 |
# a copy of the License at # |
|
9 |
# # |
|
10 |
# http://www.apache.org/licenses/LICENSE-2.0 # |
|
11 |
# # |
|
12 |
# Unless required by applicable law or agreed to in writing, software # |
|
13 |
# distributed under the License is distributed on an "AS IS" BASIS, # |
|
14 |
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # |
|
15 |
# See the License for the specific language governing permissions and # |
|
16 |
# limitations under the License. # |
|
17 |
#--------------------------------------------------------------------------- # |
|
18 | ||
19 |
# MV <hostA:system_ds/disk.i|hostB:system_ds/disk.i> |
|
20 |
# <hostA:system_ds/|hostB:system_ds/> |
|
21 |
# - hostX is the target host to deploy the VM |
|
22 |
# - system_ds is the path for the system datastore in the host |
|
23 | ||
24 |
SRC=$1 |
|
25 |
DST=$2 |
|
26 | ||
27 |
if [ -z "${ONE_LOCATION}" ]; then |
|
28 |
TMCOMMON=/var/lib/one/remotes/tm/tm_common.sh |
|
29 |
LVMRC=/etc/one/tm_lvmsshrc |
|
30 |
else |
|
31 |
TMCOMMON=$ONE_LOCATION/var/remotes/tm/tm_common.sh |
|
32 |
LVMRC=$ONE_LOCATION/etc/tm_lvmsshrc |
|
33 |
fi |
|
34 | ||
35 |
. $TMCOMMON |
|
36 |
. $LVMRC |
|
37 | ||
38 |
#------------------------------------------------------------------------------- |
|
39 |
# Set dst path and dir |
|
40 |
#------------------------------------------------------------------------------- |
|
41 |
SRC_PATH=`arg_path $SRC` |
|
42 |
DST_PATH=`arg_path $DST` |
|
43 | ||
44 |
SRC_HOST=`arg_host $SRC` |
|
45 |
DST_HOST=`arg_host $DST` |
|
46 | ||
47 |
DST_DIR=`dirname $DST_PATH` |
|
48 | ||
49 |
SRC_DS_DIR=`dirname $SRC_PATH` |
|
50 |
SRC_VM_DIR=`basename $SRC_PATH` |
|
51 | ||
52 |
#------------------------------------------------------------------------------- |
|
53 |
# Return if moving a disk, we will move them when moving the whole system_ds |
|
54 |
# directory for the VM |
|
55 |
#------------------------------------------------------------------------------- |
|
56 |
if [ `is_disk $DST_PATH` -eq 1 ]; then |
|
57 |
exit 0 |
|
58 |
fi |
|
59 | ||
60 |
if [ "$SRC" == "$DST" ]; then |
|
61 |
log "Not moving $SRC to $DST, they are the same path" |
|
62 |
exit 0 |
|
63 |
fi |
|
64 | ||
65 |
ssh_exec_and_log "$DST_HOST" "rm -rf '$DST_PATH'" \ |
|
66 |
"Error removing target path to prevent overwrite errors" |
|
67 | ||
68 |
ssh_make_path "$DST_HOST" "$DST_PATH" |
|
69 | ||
70 |
log "Moving $SRC to $DST" |
|
71 | ||
72 |
if [ "$SRC_HOST" == "$HOSTNAME" ]; then |
|
73 |
# From frontend to host, SRC is localhost |
|
74 |
send_all_disks $SRC_PATH $DST_HOST $DST_PATH |
|
75 | ||
76 |
# Clean source |
|
77 |
exec_and_log "rm -rf $SRC_PATH" |
|
78 | ||
79 |
elif [ "$DST_HOST" == "$HOSTNAME" ]; then |
|
80 |
# From host to frontend, DST is localhost |
|
81 |
get_all_disks $SRC_HOST $SRC_PATH $DST_PATH |
|
82 |
remove_all_lv $SRC_HOST $SRC_PATH |
|
83 | ||
84 |
# Clean source |
|
85 |
ssh_exec_and_log $SRC_HOST "rm -rf $SRC_PATH" |
|
86 | ||
87 |
else |
|
88 |
log_error "MIGRATE not supported by this TM." |
|
89 |
exit 0 |
|
90 |
fi |
|
91 | ||
92 |
exit 0 |
src/tm_mad/lvmssh/mvds | ||
---|---|---|
1 |
#!/bin/bash |
|
2 | ||
3 |
# -------------------------------------------------------------------------- # |
|
4 |
# Copyright 2002-2012, OpenNebula Project Leads (OpenNebula.org) # |
|
5 |
# # |
|
6 |
# Licensed under the Apache License, Version 2.0 (the "License"); you may # |
|
7 |
# not use this file except in compliance with the License. You may obtain # |
|
8 |
# a copy of the License at # |
|
9 |
# # |
|
10 |
# http://www.apache.org/licenses/LICENSE-2.0 # |
|
11 |
# # |
|
12 |
# Unless required by applicable law or agreed to in writing, software # |
|
13 |
# distributed under the License is distributed on an "AS IS" BASIS, # |
|
14 |
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # |
|
15 |
# See the License for the specific language governing permissions and # |
|
16 |
# limitations under the License. # |
|
17 |
#--------------------------------------------------------------------------- # |
|
18 | ||
19 |
# mvds host:remote_system_ds/disk.i fe:SOURCE |
|
20 |
# - fe is the front-end hostname |
|
21 |
# - SOURCE is the path of the disk image in the form DS_BASE_PATH/disk |
|
22 |
# - host is the target host to deploy the VM |
|
23 |
# - remote_system_ds is the path for the system datastore in the host |
|
24 | ||
25 |
SRC=$1 |
|
26 |
DST=$2 |
|
27 | ||
28 |
if [ -z "${ONE_LOCATION}" ]; then |
|
29 |
TMCOMMON=/var/lib/one/remotes/tm/tm_common.sh |
|
30 |
LVMRC=/etc/one/tm_lvmsshrc |
|
31 |
else |
|
32 |
TMCOMMON=$ONE_LOCATION/var/remotes/tm/tm_common.sh |
|
33 |
LVMRC=$ONE_LOCATION/etc/tm_lvmsshrc |
|
34 |
fi |
|
35 | ||
36 |
. $TMCOMMON |
|
37 |
. $LVMRC |
|
38 | ||
39 |
set_ds_location |
|
40 | ||
41 |
#------------------------------------------------------------------------------- |
|
42 |
# Set dst path and dir |
|
43 |
#------------------------------------------------------------------------------- |
|
44 |
SRC_PATH=`arg_path $SRC` |
|
45 |
DST_PATH=`arg_path $DST` |
|
46 | ||
47 |
DST_PATH="$RMT_DS_DIR/${DST_PATH##"$DS_DIR/"}" |
|
48 | ||
49 |
SRC_HOST=`arg_host $SRC` |
|
50 | ||
51 |
#------------------------------------------------------------------------------- |
|
52 |
# Move the image back to the datastore |
|
53 |
#------------------------------------------------------------------------------- |
|
54 |
log "Moving $SRC_PATH to datastore as $DST_PATH" |
|
55 |
get_disk $SRC_HOST $SRC_PATH $DST_PATH |
|
56 | ||
57 |
exit 0 |
|
0 |
- |