Updates docs for SR1 with final revision
[genesis.git] / fuel / prototypes / auto-deploy / deploy / dha-adapters / libvirt.sh
1 #!/bin/bash
2 ##############################################################################
3 # Copyright (c) 2015 Ericsson AB and others.
4 # stefan.k.berg@ericsson.com
5 # jonas.bjurel@ericsson.com
6 # All rights reserved. This program and the accompanying materials
7 # are made available under the terms of the Apache License, Version 2.0
8 # which accompanies this distribution, and is available at
9 # http://www.apache.org/licenses/LICENSE-2.0
10 ##############################################################################
11
12
13
14 ########################################################################
15 # Internal functions BEGIN
16
17
18 dha_f_err()
19 {
20     local rc
21     local cmd
22
23     rc=$1
24     shift
25
26     echo "$@" >&2
27     echo "Exit with code $rc" >&2
28
29     exit $rc
30 }
31
32 dha_f_run()
33 {
34   $@
35   rc=$?
36   if [ $rc -ne 0 ]; then
37      dha_f_err $rc "running $@" >&2
38      exit $rc
39   fi
40 }
41
42 # Internal functions END
43 ########################################################################
44
45
46 true=0
47 false=1
48
49 # API: Get the DHA API version supported by this adapter
50 dha_getApiVersion ()
51 {
52     echo "1.0"
53 }
54
55 # API: Get the name of this adapter
56 dha_getAdapterName ()
57 {
58     echo "libvirt"
59 }
60
61 # API: ### Node identity functions ###
62 # API: Node numbering is sequential.
63
64 # API: Get a list of all defined node ids, sorted in ascending order
65 dha_getAllNodeIds()
66 {
67     dha_f_run $DHAPARSE $DHAFILE getNodes | sort -n
68 }
69
70
71 # API: Get ID for Fuel node ID
72 dha_getFuelNodeId()
73 {
74     for node in `dha_getAllNodeIds`
75     do
76         if [ -n "`dha_f_run $DHAPARSE $DHAFILE getNodeProperty $node isFuel`" ]
77         then
78             echo $node
79         fi
80     done
81 }
82
83 # API: Get node property
84 # API: Argument 1: node id
85 # API: Argument 2: Property
86 dha_getNodeProperty()
87 {
88     dha_f_run $DHAPARSE $DHAFILE getNodeProperty $1 $2
89 }
90
91
92 # API: Get MAC address for the PXE interface of this node. If not
93 # API: defined, an empty string will be returned.
94 # API: Argument 1: Node id
95 dha_getNodePxeMac()
96 {
97     dha_getNodeProperty $1 pxeMac
98 }
99
100
101 ### Node operation functions ###
102
103 # API: Use custom installation method for Fuel master?
104 # API: Returns 0 if true, 1 if false
105 dha_useFuelCustomInstall()
106 {
107     $DHAPARSE $DHAFILE get fuelCustomInstall | grep -qi true
108     rc=$?
109     return $rc
110 }
111
112 # API: Fuel custom installation method
113 # API: Leaving the Fuel master powered on and booting from ISO at exit
114 # API: Argument 1: Full path to ISO file to install
115 dha_fuelCustomInstall()
116 {
117     dha_useFuelCustomInstall || dha_f_err 1 "dha_fuelCustomInstall not supported"
118     date
119 }
120
121 # API: Get power on strategy from DHA
122 # API: Returns one of two values:
123 # API:   all:        Power on all nodes simultaneously
124 # API:   sequence:   Power on node by node, wait for Fuel detection
125 dha_getPowerOnStrategy()
126 {
127     local strategy
128
129     strategy=`$DHAPARSE $DHAFILE get powerOnStrategy`
130
131     if [ "$strategy" == "all" ]; then
132         echo $strategy
133     elif
134         [ "$strategy" == "sequence" ]; then
135         echo $strategy
136     else
137         dha_f_err 1 "Could not parse strategy from DHA, got $strategy"
138     fi
139 }
140
141
142 # API: Power on node
143 # API: Argument 1: node id
144 dha_nodePowerOn()
145 {
146     local state
147     local virtName
148
149     virtName=`$DHAPARSE $DHAFILE getNodeProperty $1 libvirtName`
150     state=`virsh domstate $virtName`
151     if [ "$state" == "shut off" ]; then
152         dha_f_run virsh start $virtName
153     fi
154 }
155
156 # API: Power off node
157 # API: Argument 1: node id
158 dha_nodePowerOff()
159 {
160     local state
161     local virtName
162
163     virtName=`$DHAPARSE $DHAFILE getNodeProperty $1 libvirtName`
164     state=`virsh domstate $virtName`
165     if [ "$state" != "shut off" ]; then
166         dha_f_run virsh destroy $virtName
167     fi
168 }
169
170 # API: Reset node
171 # API: Argument 1: node id
172 dha_nodeReset()
173 {
174     local virtName
175
176     virtName=`$DHAPARSE $DHAFILE getNodeProperty $1 libvirtName`
177     dha_f_run virsh reset $virtName
178 }
179
180 # Boot order and ISO boot file
181
182 # API: Is the node able to commit boot order without power toggle?
183 # API: Argument 1: node id
184 # API: Returns 0 if true, 1 if false
185 dha_nodeCanSetBootOrderLive()
186 {
187   return $false
188 }
189
190 # API: Set node boot order
191 # API: Argument 1: node id
192 # API: Argument 2: Space separated line of boot order - boot ids are "pxe", "disk" and "iso"
193 dha_nodeSetBootOrder()
194 {
195     local id
196     local bootline
197     local virtName
198     local order
199
200     id=$1
201     virtName=`$DHAPARSE $DHAFILE getNodeProperty $1 libvirtName`
202     shift
203
204     for order in $@
205     do
206         if [ "$order" == "pxe" ]; then
207             bootline+="<boot dev='network'\/>\n"
208         elif [ "$order" == "disk" ]; then
209             bootline+="<boot dev='hd'/\>\n"
210         elif [ "$order" == "iso" ]; then
211             bootline+="<boot dev='cdrom'/\>\n"
212         else
213             error_exit "Unknown boot type: $order"
214         fi
215     done
216     echo $bootline
217
218     virsh dumpxml $virtName | grep -v "<boot dev.*>" | \
219         sed "/<\/os>/i\
220     ${bootline}" > $tmpdir/vm.xml || error_exit "Could not set bootorder"
221     virsh define $tmpdir/vm.xml || error_exit "Could not set bootorder"
222
223 }
224
225 # API: Is the node able to operate on ISO media?
226 # API: Argument 1: node id
227 # API: Returns 0 if true, 1 if false
228 dha_nodeCanSetIso()
229 {
230   return $true
231 }
232
233 # API: Is the node able to insert add eject ISO files without power toggle?
234 # API: Argument 1: node id
235 # API: Returns 0 if true, 1 if false
236 dha_nodeCanHandeIsoLive()
237 {
238   return $true
239 }
240
241 # API: Insert ISO into virtualDVD
242 # API: Argument 1: node id
243 # API: Argument 2: iso file
244 dha_nodeInsertIso()
245 {
246     local virtName
247     local isoFile
248
249     virtName=`$DHAPARSE $DHAFILE getNodeProperty $1 libvirtName`
250     isoFile=$2
251     virsh change-media $virtName --insert hdc $isoFile
252 }
253
254 # API: Eject ISO from virtual DVD
255 # API: Argument 1: node id
256 dha_nodeEjectIso()
257 {
258     local virtName
259     local isoFile
260
261     virtName=`$DHAPARSE $DHAFILE getNodeProperty $1 libvirtName`
262     isoFile=$2
263     virsh change-media $virtName --eject hdc
264 }
265
266 # API: Wait until a suitable time to change the boot order to
267 # API: "disk iso" when ISO has been booted. Can't be too long, nor
268 # API: too short...
269 # API: We should make a smart trigger for this somehow...
270 dha_waitForIsoBoot()
271 {
272     echo "waitForIsoBoot: No delay necessary for libvirt"
273 }
274
275 # API: Is the node able to reset its MBR?
276 # API: Returns 0 if true, 1 if false
277 dha_nodeCanZeroMBR()
278 {
279     return $true
280 }
281
282 # API: Reset the node's MBR
283 dha_nodeZeroMBR()
284 {
285     local fueldisk
286     local disksize
287
288     fueldisk=`virsh dumpxml $(dha_getNodeProperty $1 libvirtName) | \
289      grep "<source file" | grep raw | sed "s/.*'\(.*\)'.*/\1/"`
290     disksize=`ls -l $fueldisk | awk '{ print $5 }'`
291     rm -f $fueldisk
292     fallocate -l $disksize $fueldisk
293 }
294
295
296 # API: Entry point for dha functions
297 # API: Typically do not call "dha_node_zeroMBR" but "dha node_ZeroMBR"
298 # API:
299 # API: Before calling dha, the adapter file must gave been sourced with
300 # API: the DHA file name as argument
301 dha()
302 {
303     if [ -z "$DHAFILE" ]; then
304         error_exit "dha_setup has not been run"
305     fi
306
307
308     if type dha_$1 &>/dev/null; then
309         cmd=$1
310         shift
311         dha_$cmd $@
312         return $?
313     else
314         error_exit "No such function dha_$1 defined"
315     fi
316 }
317
318 if [ "$1" == "api" ]; then
319   egrep "^# API: |dha.*\(\)" $0 | sed 's/^# API: /# /' | grep -v dha_f_ | sed 's/)$/)\n/'
320 else
321     dhatopdir=$(dirname $(readlink -f $BASH_SOURCE))
322     DHAPARSE="$dhatopdir/dhaParse.py"
323     DHAFILE=$1
324
325     if [ ! -f $DHAFILE ]; then
326         error_exit "No such DHA file: $DHAFILE"
327     else
328         echo "Adapter init"
329         echo "$@"
330         echo "DHAPARSE: $DHAPARSE"
331         echo "DHAFILE: $DHAFILE"
332     fi
333
334 fi