Add element for hardware discovery ramdisk for ironic-discoverd
ironic-discoverd [1] is a StackForge project for conducting hardware properties discovery via booting a special discovery ramdisk and interrogating hardware from within it. It aims to be one of the official means of hardware properties discovery for Ironic in Kilo release [2]. The ramdisk collects hardware information from the machine it's booted on and posts it to the URL provided via kernel argument 'discoverd_callback_url'. [1] https://pypi.python.org/pypi/ironic-discoverd [2] https://review.openstack.org/#/c/135605/ Co-Authored-By: Lucas Alvares Gomes <lucasagomes@gmail.com> Change-Id: Ic81fe8b3bd0884971bb522b48658c7ee538a31f2
This commit is contained in:
parent
37ec06cd0b
commit
13c6b6bdf1
19
elements/ironic-discoverd-ramdisk/README.md
Normal file
19
elements/ironic-discoverd-ramdisk/README.md
Normal file
@ -0,0 +1,19 @@
|
||||
ironic-discoverd [1] is a StackForge project for conducting hardware properties
|
||||
discovery via booting a special discovery ramdisk and interrogating hardware
|
||||
from within it.
|
||||
|
||||
This ramdisk collects hardware information from the machine
|
||||
it's booted on and posts it to the URL provided via
|
||||
kernel argument 'discoverd_callback_url'.
|
||||
|
||||
The hardware information collected by the ramdisk are:
|
||||
|
||||
* BMC IP address (may be required for associating with existing node in Ironic)
|
||||
* CPU count and architecture
|
||||
* Memory amount in MiB
|
||||
* Hard drive size in GiB
|
||||
* IP and mac addresses for all NICs except the loopback
|
||||
|
||||
The machine is halted at the end of the process.
|
||||
|
||||
[1] https://pypi.python.org/pypi/ironic-discoverd
|
@ -0,0 +1,6 @@
|
||||
curl
|
||||
dmidecode
|
||||
fdisk
|
||||
ipmitool
|
||||
lscpu
|
||||
wc
|
60
elements/ironic-discoverd-ramdisk/init.d/80-discovery-ironic
Normal file
60
elements/ironic-discoverd-ramdisk/init.d/80-discovery-ironic
Normal file
@ -0,0 +1,60 @@
|
||||
readonly DISCOVERD_URL=$(get_kernel_parameter discoverd_callback_url)
|
||||
|
||||
function request_curl(){
|
||||
HTTP_METHOD=$1
|
||||
URL=$2
|
||||
DATA=$3
|
||||
|
||||
if [ ! -z "$DATA" ]; then
|
||||
DATA="\"-d \"$DATA\"\""
|
||||
fi
|
||||
|
||||
RESULT=$(eval curl -i -X "$HTTP_METHOD" \
|
||||
"-H 'Accept: application/json'" \
|
||||
"-H 'Content-Type: application/json'" \
|
||||
"$DATA" \
|
||||
"$URL") || troubleshoot
|
||||
# CURL can't return error code on 4xx error
|
||||
if echo $RESULT | grep "HTTP/1.0 4"; then
|
||||
echo "Ironic API returned error: $RESULT"
|
||||
troubleshoot
|
||||
fi
|
||||
echo $RESULT
|
||||
}
|
||||
|
||||
IFACES=
|
||||
for iface in $(ls /sys/class/net/ | grep -v lo)
|
||||
do
|
||||
MAC=$(ip link show $iface | awk '/ether/ {print $2}')
|
||||
IP=$(ip addr show $iface | awk '/inet / { sub(/\/.*/, "", $2); print $2 }')
|
||||
if [ ! -z "$MAC" ]; then
|
||||
IFACES="$IFACES,\"$iface\":{\"mac\":\"$MAC\",\"ip\":\"$IP\"}"
|
||||
fi
|
||||
done
|
||||
IFACES="{$(echo $IFACES | sed s/,//)}"
|
||||
|
||||
# NOTE(dtantsur): workaround for IPMI device not present on some systems
|
||||
modprobe ipmi_msghandler || echo "WARNING: modprobe failed, ipmitool call may fail"
|
||||
modprobe ipmi_devintf || echo "WARNING: modprobe failed, ipmitool call may fail"
|
||||
modprobe ipmi_si || echo "WARNING: modprobe failed, ipmitool call may fail"
|
||||
|
||||
BMC_ADDRESS=$(ipmitool lan print | grep -e "IP Address [^S]" | awk '{ print $4 }')
|
||||
|
||||
CPU_ARCH=$(lscpu | grep Architecture | awk '{ print $2 }')
|
||||
# NOTE(lucasagomes): dmidecode because we want to know the total
|
||||
# memory in the system, even the reserved part to the BIOS
|
||||
RAM=$(dmidecode -t 16 | grep 'Maximum Capacity' | awk '{if ($4 == "GB") s+=$3*1024; else s+=$3;} END {print s}')
|
||||
CPUS=$(cat /proc/cpuinfo | grep processor | wc -l)
|
||||
disk_bytes=$(fdisk -l | grep Disk | awk '{print $5}' | head -n 1)
|
||||
# NOTE(dtantsur): -1 is required to give Ironic some spacing for partitioning and may be removed later
|
||||
DISK_SIZE=$(($disk_bytes/1024/1024/1024 - 1))
|
||||
|
||||
NODE_DATA="'{\"ipmi_address\":\"$BMC_ADDRESS\",\"local_gb\":$DISK_SIZE,\"memory_mb\":$RAM,\"cpus\":$CPUS,\"cpu_arch\":\"$CPU_ARCH\""
|
||||
NODE_DATA="$NODE_DATA,\"interfaces\":$IFACES}'"
|
||||
echo Collected $NODE_DATA
|
||||
NODE_RESP=$(request_curl POST $DISCOVERD_URL $NODE_DATA)
|
||||
|
||||
echo "Node is now discovered! Halting..."
|
||||
# Give user a chance of seeing the output
|
||||
sleep 5
|
||||
poweroff -f
|
@ -0,0 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -eu
|
||||
set -o pipefail
|
||||
|
||||
install-packages util-linux
|
@ -0,0 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -eu
|
||||
set -o pipefail
|
||||
|
||||
install-packages curl
|
@ -0,0 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -eu
|
||||
set -o pipefail
|
||||
|
||||
install-packages dmidecode
|
@ -0,0 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -eu
|
||||
set -o pipefail
|
||||
|
||||
install-packages ipmitool
|
Loading…
Reference in New Issue
Block a user