Statistics
| Branch: | Tag: | Revision:

root / htools / offline-test.sh @ 36c70d4d

History | View | Annotate | Download (8.1 kB)

1 42089b55 Iustin Pop
#!/bin/bash
2 42089b55 Iustin Pop
3 42089b55 Iustin Pop
# Copyright (C) 2012 Google Inc.
4 42089b55 Iustin Pop
5 42089b55 Iustin Pop
# This program is free software; you can redistribute it and/or modify
6 42089b55 Iustin Pop
# it under the terms of the GNU General Public License as published by
7 42089b55 Iustin Pop
# the Free Software Foundation; either version 2 of the License, or
8 42089b55 Iustin Pop
# (at your option) any later version.
9 42089b55 Iustin Pop
10 42089b55 Iustin Pop
# This program is distributed in the hope that it will be useful, but
11 42089b55 Iustin Pop
# WITHOUT ANY WARRANTY; without even the implied warranty of
12 42089b55 Iustin Pop
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 42089b55 Iustin Pop
# General Public License for more details.
14 42089b55 Iustin Pop
15 42089b55 Iustin Pop
# You should have received a copy of the GNU General Public License
16 42089b55 Iustin Pop
# along with this program; if not, write to the Free Software
17 42089b55 Iustin Pop
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
18 42089b55 Iustin Pop
# 02110-1301, USA.
19 42089b55 Iustin Pop
20 42089b55 Iustin Pop
# This is an offline testing script for most/all of the htools
21 42089b55 Iustin Pop
# programs, checking basic command line functionality.
22 42089b55 Iustin Pop
23 42089b55 Iustin Pop
set -e
24 30084381 Iustin Pop
set -o pipefail
25 42089b55 Iustin Pop
26 42089b55 Iustin Pop
. $(dirname $0)/cli-tests-defs.sh
27 42089b55 Iustin Pop
28 3e7220e4 Iustin Pop
T=`mktemp -d`
29 3e7220e4 Iustin Pop
trap 'rm -rf $T' EXIT
30 3e7220e4 Iustin Pop
trap 'echo FAIL' ERR
31 3e7220e4 Iustin Pop
echo Using $T as temporary dir
32 3e7220e4 Iustin Pop
33 3e7220e4 Iustin Pop
echo Checking command line basic options
34 42089b55 Iustin Pop
for prog in $ALL_ROLES; do
35 42089b55 Iustin Pop
  $prog --version >/dev/null
36 42089b55 Iustin Pop
  $prog --help >/dev/null
37 42089b55 Iustin Pop
  ! $prog --no-such-option 2>/dev/null
38 42089b55 Iustin Pop
done
39 3e7220e4 Iustin Pop
echo OK
40 3e7220e4 Iustin Pop
41 3e7220e4 Iustin Pop
echo Checking missing backend failure
42 3e7220e4 Iustin Pop
for prog in hspace hinfo hbal; do
43 3e7220e4 Iustin Pop
  ! $prog 2>/dev/null
44 3e7220e4 Iustin Pop
done
45 3e7220e4 Iustin Pop
echo OK
46 3e7220e4 Iustin Pop
47 3e7220e4 Iustin Pop
echo Checking hail missing input file
48 3e7220e4 Iustin Pop
! hail 2>/dev/null
49 3e7220e4 Iustin Pop
echo OK
50 3e7220e4 Iustin Pop
51 3e7220e4 Iustin Pop
echo Checking extra arguments
52 3e7220e4 Iustin Pop
for prog in hspace hbal hinfo; do
53 30084381 Iustin Pop
  (! $prog unexpected-argument 2>&1 ) | \
54 3e7220e4 Iustin Pop
    grep -q "Error: this program doesn't take any arguments"
55 3e7220e4 Iustin Pop
done
56 3e7220e4 Iustin Pop
echo OK
57 3e7220e4 Iustin Pop
58 3e7220e4 Iustin Pop
echo Checking failure on multiple backends
59 3e7220e4 Iustin Pop
(! hbal -t /dev/null -m localhost 2>&1 ) | \
60 3e7220e4 Iustin Pop
  grep -q "Error: Only one of the rapi, luxi, and data files options should be given."
61 3e7220e4 Iustin Pop
echo OK
62 3e7220e4 Iustin Pop
63 9915fb20 Iustin Pop
echo Checking text file loading
64 9915fb20 Iustin Pop
hbal -t $TESTDATA_DIR/missing-resources.data 2>&1 | \
65 9915fb20 Iustin Pop
  grep "node node2 is missing .* ram and .* disk" >/dev/null
66 9915fb20 Iustin Pop
hbal -t $TESTDATA_DIR/common-suffix.data -v 2>&1 | \
67 9915fb20 Iustin Pop
  grep "Stripping common suffix of '.example.com' from names" >/dev/null
68 9915fb20 Iustin Pop
(! hbal -t $TESTDATA_DIR/invalid-node.data 2>&1 ) | \
69 9915fb20 Iustin Pop
  grep "Unknown node '.*' for instance new-0" >/dev/null
70 9915fb20 Iustin Pop
echo OK
71 9915fb20 Iustin Pop
72 3e7220e4 Iustin Pop
echo Checking hspace machine-readable mode
73 3e7220e4 Iustin Pop
hspace --simu p,4,8T,64g,16 --machine-readable \
74 3e7220e4 Iustin Pop
  --disk-template drbd -l 8 >$T/capacity
75 3e7220e4 Iustin Pop
( . $T/capacity && test "$HTS_OK" = "1" )
76 3e7220e4 Iustin Pop
echo OK
77 3e7220e4 Iustin Pop
78 3e7220e4 Iustin Pop
echo Checking hspace simulation to hinfo to hbal
79 3e7220e4 Iustin Pop
# this cluster spec should be fine
80 3e7220e4 Iustin Pop
hspace --simu p,4,8T,64g,16 -S $T/simu-onegroup \
81 3e7220e4 Iustin Pop
  --disk-template drbd -l 8 -v -v -v >/dev/null 2>&1
82 3e7220e4 Iustin Pop
# results in .tiered and .standard
83 3e7220e4 Iustin Pop
for suffix in standard tiered; do
84 3e7220e4 Iustin Pop
  BACKEND="-t$T/simu-onegroup.$suffix"
85 3e7220e4 Iustin Pop
  hinfo -v -v -p --print-instances $BACKEND >/dev/null 2>&1
86 3e7220e4 Iustin Pop
  hbal  -v -v -p --print-instances $BACKEND >/dev/null 2>&1
87 3e7220e4 Iustin Pop
  # hbal should not be able to balance
88 3e7220e4 Iustin Pop
  hbal $BACKEND | grep -qE "(Nothing to do, exiting|No solution found)"
89 3e7220e4 Iustin Pop
done
90 3e7220e4 Iustin Pop
echo OK
91 3e7220e4 Iustin Pop
92 3e7220e4 Iustin Pop
echo Checking hinfo and hbal on multi-nodegroup
93 3e7220e4 Iustin Pop
hspace --simu p,4,8T,64g,16 --simu p,4,8T,64g,16 \
94 3e7220e4 Iustin Pop
  -S $T/simu-twogroups --disk-template drbd -l 8 >/dev/null 2>&1
95 3e7220e4 Iustin Pop
# results in .tiered and .standard
96 3e7220e4 Iustin Pop
for suffix in standard tiered; do
97 3e7220e4 Iustin Pop
  BACKEND="-t$T/simu-twogroups.$suffix"
98 3e7220e4 Iustin Pop
  hinfo -v -v -p --print-instances $BACKEND >/dev/null 2>&1
99 3e7220e4 Iustin Pop
  ! hbal $BACKEND >/dev/null 2>&1
100 3e7220e4 Iustin Pop
  # hbal should not be able to balance
101 3e7220e4 Iustin Pop
  ! hbal $BACKEND 2>&1 | grep -q "Found multiple node groups"
102 3e7220e4 Iustin Pop
  # but hbal should be able to balance one node group
103 3e7220e4 Iustin Pop
  hbal $BACKEND -G group-01 >/dev/null
104 3e7220e4 Iustin Pop
  # and it should not find an invalid group
105 3e7220e4 Iustin Pop
  ! hbal $BACKEND -G no-such-group >/dev/null 2>&1
106 3e7220e4 Iustin Pop
done
107 3e7220e4 Iustin Pop
echo OK
108 42089b55 Iustin Pop
109 16197d69 Iustin Pop
echo Checking rebalancing
110 16197d69 Iustin Pop
# we generate a cluster with two node groups, one with unallocable
111 16197d69 Iustin Pop
# policy, then we change all nodes from this group to the allocable
112 16197d69 Iustin Pop
# one, and we check for rebalancing
113 16197d69 Iustin Pop
FROOT="$T/simu-rebal-orig"
114 6bbd76d2 Iustin Pop
hspace --simu u,4,8T,64g,16 --simu p,4,8T,64g,16 \
115 16197d69 Iustin Pop
  -S $FROOT --disk-template drbd -l 8 >/dev/null 2>&1
116 16197d69 Iustin Pop
for suffix in standard tiered; do
117 16197d69 Iustin Pop
  RELOC="$T/simu-rebal-merged.$suffix"
118 16197d69 Iustin Pop
  # this relocates the nodes
119 16197d69 Iustin Pop
  sed -re 's/^(node-.*|fake-uuid-)-02(|.*)/\1-01\2/' \
120 16197d69 Iustin Pop
    < $FROOT.$suffix > $RELOC
121 16197d69 Iustin Pop
  BACKEND="-t$RELOC"
122 16197d69 Iustin Pop
  hinfo -v -v -p --print-instances $BACKEND >/dev/null 2>&1
123 16197d69 Iustin Pop
  hbal -v -v -v -p --print-instances $BACKEND -G group-01 2>/dev/null | \
124 16197d69 Iustin Pop
    grep -qE -v "(Nothing to do, exiting|No solution found)"
125 16197d69 Iustin Pop
  hbal $BACKEND -G group-01 -C$T/rebal-cmds.$suffix \
126 16197d69 Iustin Pop
    -S $T/simu-rebal.$suffix >/dev/null 2>&1
127 16197d69 Iustin Pop
  grep -qE "gnt-instance (failover|migrate|replace-disks)" \
128 16197d69 Iustin Pop
    $T/rebal-cmds.$suffix
129 16197d69 Iustin Pop
  hbal $BACKEND -G group-01 -C \
130 16197d69 Iustin Pop
    -S $T/simu-rebal.$suffix 2>/dev/null | \
131 16197d69 Iustin Pop
    grep -qE "gnt-instance (failover|migrate|replace-disks)"
132 16197d69 Iustin Pop
  # state saved by hbal should be original
133 16197d69 Iustin Pop
  cmp $RELOC $T/simu-rebal.$suffix.original
134 16197d69 Iustin Pop
  # and we can't double rebalance
135 16197d69 Iustin Pop
  hbal -t $T/simu-rebal.$suffix.balanced \
136 16197d69 Iustin Pop
    -G group-01 | \
137 16197d69 Iustin Pop
    grep -qE "(Nothing to do, exiting|No solution found)"
138 16197d69 Iustin Pop
139 16197d69 Iustin Pop
done
140 16197d69 Iustin Pop
echo OK
141 16197d69 Iustin Pop
142 8d616d4d Iustin Pop
echo Checking utilisation-based code
143 8d616d4d Iustin Pop
BACKEND="-t $T/simu-onegroup.standard"
144 8d616d4d Iustin Pop
echo a > $T/dynu
145 8d616d4d Iustin Pop
(! hbal -U <(echo a) $BACKEND  2>&1 ) | grep -q "Cannot parse line"
146 8d616d4d Iustin Pop
(! hbal -U <(echo a b c d e f g h) $BACKEND 2>&1 ) | \
147 8d616d4d Iustin Pop
  grep -q "Cannot parse line"
148 8d616d4d Iustin Pop
(! hbal -U <(echo inst cpu mem dsk net) $BACKEND 2>&1 ) | \
149 8d616d4d Iustin Pop
  grep -Eq "cannot parse string '(cpu|mem|dsk|net)'"
150 8d616d4d Iustin Pop
# unknown instances are currently just ignored
151 8d616d4d Iustin Pop
hbal -U <(echo no-such-inst 2 2 2 2) $BACKEND >/dev/null 2>&1
152 8d616d4d Iustin Pop
# new-0 is the name of the first instance allocated by hspace
153 8d616d4d Iustin Pop
hbal -U <(echo new-0 2 2 2 2) $BACKEND >/dev/null 2>&1
154 8d616d4d Iustin Pop
echo OK
155 8d616d4d Iustin Pop
156 8d616d4d Iustin Pop
echo Checking selected/excluded instances
157 8d616d4d Iustin Pop
(! hbal $BACKEND --exclude-instances no-such-instance 2>&1 ) | \
158 8d616d4d Iustin Pop
  grep -q "Unknown instance"
159 8d616d4d Iustin Pop
(! hbal $BACKEND --select-instances no-such-instances 2>&1 ) | \
160 8d616d4d Iustin Pop
  grep -q "Unknown instance"
161 8d616d4d Iustin Pop
hbal $BACKEND --exclude-instances new-0 --select-instances new-1 >/dev/null
162 8d616d4d Iustin Pop
echo OK
163 8d616d4d Iustin Pop
164 6bbd76d2 Iustin Pop
echo IAllocator checks
165 6bbd76d2 Iustin Pop
# test that on invalid files it can't parse the request
166 30084381 Iustin Pop
(! hail /dev/null 2>&1 ) | grep -q "Invalid JSON"
167 6bbd76d2 Iustin Pop
! hail <(echo '[]') >/dev/null 2>&1
168 30084381 Iustin Pop
(! hail <(echo '{}') 2>&1 ) | grep -q "key 'request' not found"
169 30084381 Iustin Pop
(! hail <(echo '{"request": 0}') 2>&1 ) | grep -q "key 'request'"
170 6bbd76d2 Iustin Pop
! hail $TESTDATA_DIR/hail-invalid-reloc.json >/dev/null 2>&1
171 6bbd76d2 Iustin Pop
172 6bbd76d2 Iustin Pop
# just test that it can read the file, print the cluster and generate
173 6bbd76d2 Iustin Pop
# pre and post allocation files
174 6bbd76d2 Iustin Pop
hail -v -v -v -p $TESTDATA_DIR/hail-alloc-drbd.json \
175 6bbd76d2 Iustin Pop
  -S $T/hail-alloc >/dev/null 2>&1
176 6bbd76d2 Iustin Pop
! cmp -s $T/hail-alloc.pre-ialloc $T/hail-alloc.post-ialloc
177 6bbd76d2 Iustin Pop
hail -v -v -v -p $TESTDATA_DIR/hail-reloc-drbd.json \
178 6bbd76d2 Iustin Pop
  -S $T/hail-reloc >/dev/null 2>&1
179 6bbd76d2 Iustin Pop
! cmp -s $T/hail-reloc.pre-ialloc $T/hail-reloc.post-ialloc
180 6bbd76d2 Iustin Pop
181 6bbd76d2 Iustin Pop
# and now start the real tests
182 6bbd76d2 Iustin Pop
hail $TESTDATA_DIR/hail-alloc-drbd.json | \
183 6bbd76d2 Iustin Pop
  grep -q '"success":true,.*,"result":\["node2","node1"\]'
184 6bbd76d2 Iustin Pop
hail $TESTDATA_DIR/hail-reloc-drbd.json | \
185 6bbd76d2 Iustin Pop
  grep -q '"success":true,.*,"result":\["node1"\]'
186 6bbd76d2 Iustin Pop
187 6bbd76d2 Iustin Pop
hail $TESTDATA_DIR/hail-node-evac.json | \
188 6bbd76d2 Iustin Pop
  grep -Fq '"success":true,"info":"Request successful: 0 instances failed to move and 1 were moved successfully"'
189 6bbd76d2 Iustin Pop
190 6bbd76d2 Iustin Pop
hail $TESTDATA_DIR/hail-change-group.json | \
191 6bbd76d2 Iustin Pop
  grep -Fq '"success":true,"info":"Request successful: 0 instances failed to move and 1 were moved successfully"'
192 6bbd76d2 Iustin Pop
193 6bbd76d2 Iustin Pop
for evac_mode in primary-only secondary-only all; do
194 6bbd76d2 Iustin Pop
  sed -e 's/"evac_mode": "all"/"evac_mode": "'${evac_mode}'"/' \
195 6bbd76d2 Iustin Pop
    < $TESTDATA_DIR/hail-node-evac.json \
196 6bbd76d2 Iustin Pop
    > $T/hail-node-evac.json.$evac_mode
197 6bbd76d2 Iustin Pop
  hail $T/hail-node-evac.json.$evac_mode | \
198 6bbd76d2 Iustin Pop
    grep -q '"success":true,"info":"Request successful: 0 instances failed to move and 1 were moved successfully"'
199 6bbd76d2 Iustin Pop
done
200 6bbd76d2 Iustin Pop
201 6bbd76d2 Iustin Pop
# check that hail can use the simu and text backends
202 6bbd76d2 Iustin Pop
hail --simu p,8,8T,16g,16 $TESTDATA_DIR/hail-alloc-drbd.json | \
203 6bbd76d2 Iustin Pop
  grep -q '"success":true,'
204 6bbd76d2 Iustin Pop
hail -t $T/simu-rebal-merged.standard $TESTDATA_DIR/hail-alloc-drbd.json | \
205 6bbd76d2 Iustin Pop
  grep -q '"success":true,'
206 6bbd76d2 Iustin Pop
echo OK
207 6bbd76d2 Iustin Pop
208 55ffacfa Iustin Pop
echo Checking file-based RAPI
209 55ffacfa Iustin Pop
mkdir -p $T/hscan
210 55ffacfa Iustin Pop
URL="file://$TESTDATA_DIR/rapi"
211 55ffacfa Iustin Pop
hinfo -v -v -p --print-instances -m $URL >/dev/null 2>&1
212 55ffacfa Iustin Pop
hbal -v -v -p --print-instances -m $URL >/dev/null 2>&1
213 55ffacfa Iustin Pop
hscan -d $T/hscan/ -p -v -v $URL >/dev/null 2>&1
214 55ffacfa Iustin Pop
# check that we file parsing is correct, i.e. hscan saves correct text
215 55ffacfa Iustin Pop
# files, and is idempotent (rapi+text == rapi)
216 55ffacfa Iustin Pop
HS="$(ls $T/hscan/*.data|head -n1)"
217 55ffacfa Iustin Pop
hinfo -p --print-instances -m $URL > $T/hscan/direct.hinfo 2>&1
218 55ffacfa Iustin Pop
hinfo -p --print-instances -t $HS  > $T/hscan/fromtext.hinfo 2>&1
219 55ffacfa Iustin Pop
cmp -s $T/hscan/direct.hinfo $T/hscan/fromtext.hinfo
220 55ffacfa Iustin Pop
echo OK
221 55ffacfa Iustin Pop
222 42089b55 Iustin Pop
echo All OK