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 ##############################################################################
14 ########################################################################
15 # Internal functions BEGIN
27 echo "Exit with code $rc" >&2
36 if [ $rc -ne 0 ]; then
37 dha_f_err $rc "running $@" >&2
42 # Internal functions END
43 ########################################################################
49 # API: Get the DHA API version supported by this adapter
55 # API: Get the name of this adapter
61 # API: ### Node identity functions ###
62 # API: Node numbering is sequential.
64 # API: Get a list of all defined node ids, sorted in ascending order
67 dha_f_run $DHAPARSE $DHAFILE getNodes | sort -n
71 # API: Get ID for Fuel node ID
74 for node in `dha_getAllNodeIds`
76 if [ -n "`dha_f_run $DHAPARSE $DHAFILE getNodeProperty $node isFuel`" ]
83 # API: Get node property
84 # API: Argument 1: node id
85 # API: Argument 2: Property
88 dha_f_run $DHAPARSE $DHAFILE getNodeProperty $1 $2
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
97 dha_getNodeProperty $1 pxeMac
101 ### Node operation functions ###
103 # API: Use custom installation method for Fuel master?
104 # API: Returns 0 if true, 1 if false
105 dha_useFuelCustomInstall()
107 $DHAPARSE $DHAFILE get fuelCustomInstall | grep -qi true
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()
117 dha_useFuelCustomInstall || dha_f_err 1 "dha_fuelCustomInstall not supported"
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()
129 strategy=`$DHAPARSE $DHAFILE get powerOnStrategy`
131 if [ "$strategy" == "all" ]; then
134 [ "$strategy" == "sequence" ]; then
137 dha_f_err 1 "Could not parse strategy from DHA, got $strategy"
143 # API: Argument 1: node id
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
156 # API: Power off node
157 # API: Argument 1: node id
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
171 # API: Argument 1: node id
176 virtName=`$DHAPARSE $DHAFILE getNodeProperty $1 libvirtName`
177 dha_f_run virsh reset $virtName
180 # Boot order and ISO boot file
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()
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()
201 virtName=`$DHAPARSE $DHAFILE getNodeProperty $1 libvirtName`
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"
213 error_exit "Unknown boot type: $order"
218 virsh dumpxml $virtName | grep -v "<boot dev.*>" | \
220 ${bootline}" > $tmpdir/vm.xml || error_exit "Could not set bootorder"
221 virsh define $tmpdir/vm.xml || error_exit "Could not set bootorder"
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
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()
241 # API: Insert ISO into virtualDVD
242 # API: Argument 1: node id
243 # API: Argument 2: iso file
249 virtName=`$DHAPARSE $DHAFILE getNodeProperty $1 libvirtName`
251 virsh change-media fuel-master --insert hdc $isoFile
254 # API: Eject ISO from virtual DVD
255 # API: Argument 1: node id
261 virtName=`$DHAPARSE $DHAFILE getNodeProperty $1 libvirtName`
263 virsh change-media $virtName --eject hdc
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
269 # API: We should make a smart trigger for this somehow...
272 echo "waitForIsoBoot: No delay necessary for libvirt"
275 # API: Is the node able to reset its MBR?
276 # API: Returns 0 if true, 1 if false
282 # API: Reset the node's MBR
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 }'`
292 fallocate -l $disksize $fueldisk
296 # API: Entry point for dha functions
297 # API: Typically do not call "dha_node_zeroMBR" but "dha node_ZeroMBR"
299 # API: Before calling dha, the adapter file must gave been sourced with
300 # API: the DHA file name as argument
303 if [ -z "$DHAFILE" ]; then
304 error_exit "dha_setup has not been run"
308 if type dha_$1 &>/dev/null; then
314 error_exit "No such function dha_$1 defined"
318 if [ "$1" == "api" ]; then
319 egrep "^# API: |dha.*\(\)" $0 | sed 's/^# API: /# /' | grep -v dha_f_ | sed 's/)$/)\n/'
321 dhatopdir=$(dirname $(readlink -f $BASH_SOURCE))
322 DHAPARSE="$dhatopdir/dhaParse.py"
325 if [ ! -f $DHAFILE ]; then
326 error_exit "No such DHA file: $DHAFILE"
330 echo "DHAPARSE: $DHAPARSE"
331 echo "DHAFILE: $DHAFILE"