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:
Dmitry Tantsur 2014-07-17 13:36:24 +01:00
parent 37ec06cd0b
commit 13c6b6bdf1
7 changed files with 109 additions and 0 deletions

View 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

View File

@ -0,0 +1,6 @@
curl
dmidecode
fdisk
ipmitool
lscpu
wc

View 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

View File

@ -0,0 +1,6 @@
#!/bin/bash
set -eu
set -o pipefail
install-packages util-linux

View File

@ -0,0 +1,6 @@
#!/bin/bash
set -eu
set -o pipefail
install-packages curl

View File

@ -0,0 +1,6 @@
#!/bin/bash
set -eu
set -o pipefail
install-packages dmidecode

View File

@ -0,0 +1,6 @@
#!/bin/bash
set -eu
set -o pipefail
install-packages ipmitool