Statistics
| Branch: | Tag: | Revision:

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