root / htools / offline-test.sh @ 8d616d4d
History | View | Annotate | Download (7.7 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 | 3e7220e4 | Iustin Pop | echo Checking hspace machine-readable mode |
64 | 3e7220e4 | Iustin Pop | hspace --simu p,4,8T,64g,16 --machine-readable \ |
65 | 3e7220e4 | Iustin Pop | --disk-template drbd -l 8 >$T/capacity |
66 | 3e7220e4 | Iustin Pop | ( . $T/capacity && test "$HTS_OK" = "1" ) |
67 | 3e7220e4 | Iustin Pop | echo OK |
68 | 3e7220e4 | Iustin Pop | |
69 | 3e7220e4 | Iustin Pop | echo Checking hspace simulation to hinfo to hbal |
70 | 3e7220e4 | Iustin Pop | # this cluster spec should be fine |
71 | 3e7220e4 | Iustin Pop | hspace --simu p,4,8T,64g,16 -S $T/simu-onegroup \ |
72 | 3e7220e4 | Iustin Pop | --disk-template drbd -l 8 -v -v -v >/dev/null 2>&1 |
73 | 3e7220e4 | Iustin Pop | # results in .tiered and .standard |
74 | 3e7220e4 | Iustin Pop | for suffix in standard tiered; do |
75 | 3e7220e4 | Iustin Pop | BACKEND="-t$T/simu-onegroup.$suffix" |
76 | 3e7220e4 | Iustin Pop | hinfo -v -v -p --print-instances $BACKEND >/dev/null 2>&1 |
77 | 3e7220e4 | Iustin Pop | hbal -v -v -p --print-instances $BACKEND >/dev/null 2>&1 |
78 | 3e7220e4 | Iustin Pop | # hbal should not be able to balance |
79 | 3e7220e4 | Iustin Pop | hbal $BACKEND | grep -qE "(Nothing to do, exiting|No solution found)" |
80 | 3e7220e4 | Iustin Pop | done |
81 | 3e7220e4 | Iustin Pop | echo OK |
82 | 3e7220e4 | Iustin Pop | |
83 | 3e7220e4 | Iustin Pop | echo Checking hinfo and hbal on multi-nodegroup |
84 | 3e7220e4 | Iustin Pop | hspace --simu p,4,8T,64g,16 --simu p,4,8T,64g,16 \ |
85 | 3e7220e4 | Iustin Pop | -S $T/simu-twogroups --disk-template drbd -l 8 >/dev/null 2>&1 |
86 | 3e7220e4 | Iustin Pop | # results in .tiered and .standard |
87 | 3e7220e4 | Iustin Pop | for suffix in standard tiered; do |
88 | 3e7220e4 | Iustin Pop | BACKEND="-t$T/simu-twogroups.$suffix" |
89 | 3e7220e4 | Iustin Pop | hinfo -v -v -p --print-instances $BACKEND >/dev/null 2>&1 |
90 | 3e7220e4 | Iustin Pop | ! hbal $BACKEND >/dev/null 2>&1 |
91 | 3e7220e4 | Iustin Pop | # hbal should not be able to balance |
92 | 3e7220e4 | Iustin Pop | ! hbal $BACKEND 2>&1 | grep -q "Found multiple node groups" |
93 | 3e7220e4 | Iustin Pop | # but hbal should be able to balance one node group |
94 | 3e7220e4 | Iustin Pop | hbal $BACKEND -G group-01 >/dev/null |
95 | 3e7220e4 | Iustin Pop | # and it should not find an invalid group |
96 | 3e7220e4 | Iustin Pop | ! hbal $BACKEND -G no-such-group >/dev/null 2>&1 |
97 | 3e7220e4 | Iustin Pop | done |
98 | 3e7220e4 | Iustin Pop | echo OK |
99 | 42089b55 | Iustin Pop | |
100 | 16197d69 | Iustin Pop | echo Checking rebalancing |
101 | 16197d69 | Iustin Pop | # we generate a cluster with two node groups, one with unallocable |
102 | 16197d69 | Iustin Pop | # policy, then we change all nodes from this group to the allocable |
103 | 16197d69 | Iustin Pop | # one, and we check for rebalancing |
104 | 16197d69 | Iustin Pop | FROOT="$T/simu-rebal-orig" |
105 | 6bbd76d2 | Iustin Pop | hspace --simu u,4,8T,64g,16 --simu p,4,8T,64g,16 \ |
106 | 16197d69 | Iustin Pop | -S $FROOT --disk-template drbd -l 8 >/dev/null 2>&1 |
107 | 16197d69 | Iustin Pop | for suffix in standard tiered; do |
108 | 16197d69 | Iustin Pop | RELOC="$T/simu-rebal-merged.$suffix" |
109 | 16197d69 | Iustin Pop | # this relocates the nodes |
110 | 16197d69 | Iustin Pop | sed -re 's/^(node-.*|fake-uuid-)-02(|.*)/\1-01\2/' \ |
111 | 16197d69 | Iustin Pop | < $FROOT.$suffix > $RELOC |
112 | 16197d69 | Iustin Pop | BACKEND="-t$RELOC" |
113 | 16197d69 | Iustin Pop | hinfo -v -v -p --print-instances $BACKEND >/dev/null 2>&1 |
114 | 16197d69 | Iustin Pop | hbal -v -v -v -p --print-instances $BACKEND -G group-01 2>/dev/null | \ |
115 | 16197d69 | Iustin Pop | grep -qE -v "(Nothing to do, exiting|No solution found)" |
116 | 16197d69 | Iustin Pop | hbal $BACKEND -G group-01 -C$T/rebal-cmds.$suffix \ |
117 | 16197d69 | Iustin Pop | -S $T/simu-rebal.$suffix >/dev/null 2>&1 |
118 | 16197d69 | Iustin Pop | grep -qE "gnt-instance (failover|migrate|replace-disks)" \ |
119 | 16197d69 | Iustin Pop | $T/rebal-cmds.$suffix |
120 | 16197d69 | Iustin Pop | hbal $BACKEND -G group-01 -C \ |
121 | 16197d69 | Iustin Pop | -S $T/simu-rebal.$suffix 2>/dev/null | \ |
122 | 16197d69 | Iustin Pop | grep -qE "gnt-instance (failover|migrate|replace-disks)" |
123 | 16197d69 | Iustin Pop | # state saved by hbal should be original |
124 | 16197d69 | Iustin Pop | cmp $RELOC $T/simu-rebal.$suffix.original |
125 | 16197d69 | Iustin Pop | # and we can't double rebalance |
126 | 16197d69 | Iustin Pop | hbal -t $T/simu-rebal.$suffix.balanced \ |
127 | 16197d69 | Iustin Pop | -G group-01 | \ |
128 | 16197d69 | Iustin Pop | grep -qE "(Nothing to do, exiting|No solution found)" |
129 | 16197d69 | Iustin Pop | |
130 | 16197d69 | Iustin Pop | done |
131 | 16197d69 | Iustin Pop | echo OK |
132 | 16197d69 | Iustin Pop | |
133 | 8d616d4d | Iustin Pop | echo Checking utilisation-based code |
134 | 8d616d4d | Iustin Pop | BACKEND="-t $T/simu-onegroup.standard" |
135 | 8d616d4d | Iustin Pop | echo a > $T/dynu |
136 | 8d616d4d | Iustin Pop | (! hbal -U <(echo a) $BACKEND 2>&1 ) | grep -q "Cannot parse line" |
137 | 8d616d4d | Iustin Pop | (! hbal -U <(echo a b c d e f g h) $BACKEND 2>&1 ) | \ |
138 | 8d616d4d | Iustin Pop | grep -q "Cannot parse line" |
139 | 8d616d4d | Iustin Pop | (! hbal -U <(echo inst cpu mem dsk net) $BACKEND 2>&1 ) | \ |
140 | 8d616d4d | Iustin Pop | grep -Eq "cannot parse string '(cpu|mem|dsk|net)'" |
141 | 8d616d4d | Iustin Pop | # unknown instances are currently just ignored |
142 | 8d616d4d | Iustin Pop | hbal -U <(echo no-such-inst 2 2 2 2) $BACKEND >/dev/null 2>&1 |
143 | 8d616d4d | Iustin Pop | # new-0 is the name of the first instance allocated by hspace |
144 | 8d616d4d | Iustin Pop | hbal -U <(echo new-0 2 2 2 2) $BACKEND >/dev/null 2>&1 |
145 | 8d616d4d | Iustin Pop | echo OK |
146 | 8d616d4d | Iustin Pop | |
147 | 8d616d4d | Iustin Pop | echo Checking selected/excluded instances |
148 | 8d616d4d | Iustin Pop | (! hbal $BACKEND --exclude-instances no-such-instance 2>&1 ) | \ |
149 | 8d616d4d | Iustin Pop | grep -q "Unknown instance" |
150 | 8d616d4d | Iustin Pop | (! hbal $BACKEND --select-instances no-such-instances 2>&1 ) | \ |
151 | 8d616d4d | Iustin Pop | grep -q "Unknown instance" |
152 | 8d616d4d | Iustin Pop | hbal $BACKEND --exclude-instances new-0 --select-instances new-1 >/dev/null |
153 | 8d616d4d | Iustin Pop | echo OK |
154 | 8d616d4d | Iustin Pop | |
155 | 6bbd76d2 | Iustin Pop | echo IAllocator checks |
156 | 6bbd76d2 | Iustin Pop | # test that on invalid files it can't parse the request |
157 | 30084381 | Iustin Pop | (! hail /dev/null 2>&1 ) | grep -q "Invalid JSON" |
158 | 6bbd76d2 | Iustin Pop | ! hail <(echo '[]') >/dev/null 2>&1 |
159 | 30084381 | Iustin Pop | (! hail <(echo '{}') 2>&1 ) | grep -q "key 'request' not found" |
160 | 30084381 | Iustin Pop | (! hail <(echo '{"request": 0}') 2>&1 ) | grep -q "key 'request'" |
161 | 6bbd76d2 | Iustin Pop | ! hail $TESTDATA_DIR/hail-invalid-reloc.json >/dev/null 2>&1 |
162 | 6bbd76d2 | Iustin Pop | |
163 | 6bbd76d2 | Iustin Pop | # just test that it can read the file, print the cluster and generate |
164 | 6bbd76d2 | Iustin Pop | # pre and post allocation files |
165 | 6bbd76d2 | Iustin Pop | hail -v -v -v -p $TESTDATA_DIR/hail-alloc-drbd.json \ |
166 | 6bbd76d2 | Iustin Pop | -S $T/hail-alloc >/dev/null 2>&1 |
167 | 6bbd76d2 | Iustin Pop | ! cmp -s $T/hail-alloc.pre-ialloc $T/hail-alloc.post-ialloc |
168 | 6bbd76d2 | Iustin Pop | hail -v -v -v -p $TESTDATA_DIR/hail-reloc-drbd.json \ |
169 | 6bbd76d2 | Iustin Pop | -S $T/hail-reloc >/dev/null 2>&1 |
170 | 6bbd76d2 | Iustin Pop | ! cmp -s $T/hail-reloc.pre-ialloc $T/hail-reloc.post-ialloc |
171 | 6bbd76d2 | Iustin Pop | |
172 | 6bbd76d2 | Iustin Pop | # and now start the real tests |
173 | 6bbd76d2 | Iustin Pop | hail $TESTDATA_DIR/hail-alloc-drbd.json | \ |
174 | 6bbd76d2 | Iustin Pop | grep -q '"success":true,.*,"result":\["node2","node1"\]' |
175 | 6bbd76d2 | Iustin Pop | hail $TESTDATA_DIR/hail-reloc-drbd.json | \ |
176 | 6bbd76d2 | Iustin Pop | grep -q '"success":true,.*,"result":\["node1"\]' |
177 | 6bbd76d2 | Iustin Pop | |
178 | 6bbd76d2 | Iustin Pop | hail $TESTDATA_DIR/hail-node-evac.json | \ |
179 | 6bbd76d2 | Iustin Pop | grep -Fq '"success":true,"info":"Request successful: 0 instances failed to move and 1 were moved successfully"' |
180 | 6bbd76d2 | Iustin Pop | |
181 | 6bbd76d2 | Iustin Pop | hail $TESTDATA_DIR/hail-change-group.json | \ |
182 | 6bbd76d2 | Iustin Pop | grep -Fq '"success":true,"info":"Request successful: 0 instances failed to move and 1 were moved successfully"' |
183 | 6bbd76d2 | Iustin Pop | |
184 | 6bbd76d2 | Iustin Pop | for evac_mode in primary-only secondary-only all; do |
185 | 6bbd76d2 | Iustin Pop | sed -e 's/"evac_mode": "all"/"evac_mode": "'${evac_mode}'"/' \ |
186 | 6bbd76d2 | Iustin Pop | < $TESTDATA_DIR/hail-node-evac.json \ |
187 | 6bbd76d2 | Iustin Pop | > $T/hail-node-evac.json.$evac_mode |
188 | 6bbd76d2 | Iustin Pop | hail $T/hail-node-evac.json.$evac_mode | \ |
189 | 6bbd76d2 | Iustin Pop | grep -q '"success":true,"info":"Request successful: 0 instances failed to move and 1 were moved successfully"' |
190 | 6bbd76d2 | Iustin Pop | done |
191 | 6bbd76d2 | Iustin Pop | |
192 | 6bbd76d2 | Iustin Pop | # check that hail can use the simu and text backends |
193 | 6bbd76d2 | Iustin Pop | hail --simu p,8,8T,16g,16 $TESTDATA_DIR/hail-alloc-drbd.json | \ |
194 | 6bbd76d2 | Iustin Pop | grep -q '"success":true,' |
195 | 6bbd76d2 | Iustin Pop | hail -t $T/simu-rebal-merged.standard $TESTDATA_DIR/hail-alloc-drbd.json | \ |
196 | 6bbd76d2 | Iustin Pop | grep -q '"success":true,' |
197 | 6bbd76d2 | Iustin Pop | echo OK |
198 | 6bbd76d2 | Iustin Pop | |
199 | 55ffacfa | Iustin Pop | echo Checking file-based RAPI |
200 | 55ffacfa | Iustin Pop | mkdir -p $T/hscan |
201 | 55ffacfa | Iustin Pop | URL="file://$TESTDATA_DIR/rapi" |
202 | 55ffacfa | Iustin Pop | hinfo -v -v -p --print-instances -m $URL >/dev/null 2>&1 |
203 | 55ffacfa | Iustin Pop | hbal -v -v -p --print-instances -m $URL >/dev/null 2>&1 |
204 | 55ffacfa | Iustin Pop | hscan -d $T/hscan/ -p -v -v $URL >/dev/null 2>&1 |
205 | 55ffacfa | Iustin Pop | # check that we file parsing is correct, i.e. hscan saves correct text |
206 | 55ffacfa | Iustin Pop | # files, and is idempotent (rapi+text == rapi) |
207 | 55ffacfa | Iustin Pop | HS="$(ls $T/hscan/*.data|head -n1)" |
208 | 55ffacfa | Iustin Pop | hinfo -p --print-instances -m $URL > $T/hscan/direct.hinfo 2>&1 |
209 | 55ffacfa | Iustin Pop | hinfo -p --print-instances -t $HS > $T/hscan/fromtext.hinfo 2>&1 |
210 | 55ffacfa | Iustin Pop | cmp -s $T/hscan/direct.hinfo $T/hscan/fromtext.hinfo |
211 | 55ffacfa | Iustin Pop | echo OK |
212 | 55ffacfa | Iustin Pop | |
213 | 42089b55 | Iustin Pop | echo All OK |