diskimage-builder/elements/ironic-discoverd-ramdisk/init.d/80-ironic-discoverd-ramdisk
Dmitry Tantsur 2c15fd83ca Fix memory detection in ironic-discoverd-ramdisk
It was actually detecting total _possible_ size, not real one.

Change-Id: I9e96e0058d91734aa960d1b2f9663f8a9207f5d8
2015-02-16 11:41:30 +01:00

103 lines
3.1 KiB
Text

DISCOVERD_URL=$(get_kernel_parameter discoverd_callback_url)
if [ -z "$DISCOVERD_URL" ]; then
# Some old ramdisks are around
DISCOVERD_URL=$(get_kernel_parameter ironic_callback_url)
if [ -z "$DISCOVERD_URL" ]; then
echo "No discoverd_callback_url supplied"
troubleshoot
else
echo "WARNING: deprecated option ironic_callback_url"
echo "WARNING: use discoverd_callback_url instead"
fi
fi
echo '{"interfaces":{}}' > data.json
function update() {
jq "$1" data.json > temp.json || troubleshoot
mv temp.json data.json
}
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
update ".interfaces[\"$iface\"] = {mac: \"$MAC\", ip: \"$IP\"}"
fi
done
# NOTE(dtantsur): workaround for IPMI device not present on some systems
function modprobe_ipmi() {
modprobe ipmi_$1 || echo "WARNING: modprobe ipmi_$1 failed, ipmitool call may fail later"
}
modprobe_ipmi msghandler
modprobe_ipmi devintf
modprobe_ipmi si
BMC_ADDRESS=$(ipmitool lan print | grep -e "IP Address [^S]" | awk '{ print $4 }')
update ".ipmi_address = \"$BMC_ADDRESS\""
CPU_ARCH=$(lscpu | grep Architecture | awk '{ print $2 }')
update ".cpu_arch = \"$CPU_ARCH\""
RAM=0
for i in $(dmidecode --type memory | grep Size | awk '{ print $2; }' | grep -E '[0-9]+');
do
RAM=$(( RAM + $i ));
done
update ".memory_mb = $RAM"
CPUS=$(cat /proc/cpuinfo | grep processor | wc -l)
update ".cpus = $CPUS"
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))
update ".local_gb = $DISK_SIZE"
BOOTIF=$(get_kernel_parameter BOOTIF)
update ".boot_interface = \"$BOOTIF\""
echo Collected:
cat data.json
RESULT=$(eval curl -i -X POST \
"-H 'Accept: application/json'" \
"-H 'Content-Type: application/json'" \
"-d @data.json" \
"$DISCOVERD_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
JSON_RESP=$(echo $RESULT | tr '\r' '\n' | tail -n1) # drop HTTP headers
if echo "$JSON_RESP" | jq '.ipmi_setup_credentials' | grep -q true; then
USERNAME=$(echo "$JSON_RESP" | jq -r '.ipmi_username')
if [ -z "$USERNAME" ]; then
echo "Empty IPMI user name"
troubleshoot
fi
PASSWORD=$(echo "$JSON_RESP" | jq -r '.ipmi_password')
if [ -z "$PASSWORD" ]; then
echo "Empty IPMI password"
troubleshoot
fi
echo "Assigning IPMI credentials: user $USERNAME"
ipmitool user set name 2 $USERNAME
ipmitool user set password 2 $PASSWORD
# Assign priviledges just in case
ipmitool channel setaccess 1 2 link=on ipmi=on callin=on privilege=4
ipmitool user enable 2
fi
echo "Node is now discovered! Halting..."
# Give user a chance of seeing the output
sleep 5
poweroff -f