diskimage-builder/elements/ironic-discoverd-ramdisk/init.d/80-ironic-discoverd-ramdisk
Mark Hamzy 76bf793a39 dmidecode does not exist for ppc64/ppc64el
Adding three separate lines because the arch tag does not support a list.

Change-Id: Icf8a075224833fcfbbe2128e8802ff41c39f3c09
2016-06-29 16:51:46 -05:00

115 lines
3.5 KiB
Plaintext

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
if hash dmidecode 2>/dev/null; then
for i in $(dmidecode --type memory | grep Size | awk '{ print $2; }' | grep -E '[0-9]+');
do
RAM=$(( RAM + $i ));
done
elif hash lshw 2>/dev/null; then
# dmidecode does not exist for ppc, but lshw should (for both)
MEMORY=$(lshw -c memory -short -quiet | grep -i 'system memory' | awk '{ print $3; }')
if [[ "${MEMORY}" =~ GiB$ ]]; then
RAMGB=${MEMORY::-3}
RAM=$(( RAMGB * 1024 ));
elif [[ "${MEMORY}" =~ MiB$ ]]; then
RAM=${MEMORY::-3}
fi
fi
[ ${RAM} -gt 0 ] && 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