readonly IRONIC_API_URL=$(get_kernel_parameter ironic_api_url) readonly IRONIC_BOOT_OPTION=$(get_kernel_parameter boot_option) readonly IRONIC_BOOT_MODE=$(get_kernel_parameter boot_mode) readonly ROOT_DEVICE=$(get_kernel_parameter root_device) if [ -z "$ISCSI_TARGET_IQN" ]; then err_msg "iscsi_target_iqn is not defined" troubleshoot fi target_disk= if [[ $ROOT_DEVICE ]]; then target_disk="$(get_root_device)" else t=0 while ! target_disk=$(find_disk "$DISK"); do if [ $t -eq 10 ]; then break fi t=$(($t + 1)) sleep 1 done fi if [ -z "$target_disk" ]; then err_msg "Could not find disk to use." troubleshoot fi echo "start iSCSI target on $target_disk" start_iscsi_target "$ISCSI_TARGET_IQN" "$target_disk" ALL if [ $? -ne 0 ]; then err_msg "Failed to start iscsi target." troubleshoot fi if [ "$BOOT_METHOD" = "$VMEDIA_BOOT_TAG" ]; then TOKEN_FILE="$VMEDIA_DIR/token" if [ -f "$TOKEN_FILE" ]; then TOKEN_HEADER="-H 'X-Auth-Token: $(cat $TOKEN_FILE)'" else TOKEN_HEADER="" fi else TOKEN_FILE=token-$DEPLOYMENT_ID # Allow multiple versions of the tftp client if tftp -r $TOKEN_FILE -g $BOOT_SERVER || tftp $BOOT_SERVER -c get $TOKEN_FILE; then TOKEN_HEADER="-H 'X-Auth-Token: $(cat $TOKEN_FILE)'" else TOKEN_HEADER="" fi fi DATA="'{\"address\":\"$BOOT_IP_ADDRESS\",\"key\":\"$DEPLOYMENT_KEY\",\"iqn\":\"$ISCSI_TARGET_IQN\",\"error\":\"$FIRST_ERR_MSG\"}'" echo "request Ironic API to deploy image" eval curl -i -X POST \ "$TOKEN_HEADER" \ "-H 'Accept: application/json'" \ "-H 'Content-Type: application/json'" \ -d "$DATA" \ $IRONIC_API_URL/nodes/$DEPLOYMENT_ID/vendor_passthru/pass_deploy_info echo "waiting for notice of complete" nc -l -p 10000 echo "stop iSCSI target on $target_disk" stop_iscsi_target # If localboot is set, install a bootloader if [ "$IRONIC_BOOT_OPTION" = "local" ]; then echo "Installing bootloader" # We need to run partprobe to ensure all partitions are visible partprobe $target_disk # root partition is always the last partition of the disk readonly root_part=$(ls $target_disk* | tr " " "\n" | tail -n1) readonly root_part_mount=/mnt/rootfs mkdir -p $root_part_mount mount $root_part $root_part_mount mount -o bind /dev $root_part_mount/dev mount -o bind /sys $root_part_mount/sys mount -o bind /proc $root_part_mount/proc # If boot mode is uefi, then mount the system partition in /boot/efi. # Grub expects the efi system partition to be mounted here. if [ "$IRONIC_BOOT_MODE" = "uefi" ]; then # efi system partition is labelled as "efi-part" by Ironic. # lsblk output looks like this: # NAME="sda1" LABEL="efi-part" readonly efi_system_part=$(lsblk -Pio NAME,LABEL $target_disk | \ awk -F'"' '/"efi-part"/{print $2}') readonly efi_system_part_dev_file="/dev/$efi_system_part" readonly efi_system_part_mount="$root_part_mount/boot/efi" mkdir -p $efi_system_part_mount mount $efi_system_part_dev_file $efi_system_part_mount fi # TODO(lucasagomes): Add extlinux as a fallback # Find grub version V= if [ -x $root_part_mount/usr/sbin/grub2-install ]; then V=2 fi # Install grub ret=1 if chroot $root_part_mount /bin/bash -c "/usr/sbin/grub$V-install ${target_disk}"; then echo "Generating the grub configuration file" # tell GRUB2 to preload its "lvm" module to gain LVM booting on direct-attached disks if [ "$V" = "2" ]; then echo "GRUB_PRELOAD_MODULES=lvm" >> $root_part_mount/etc/default/grub fi chroot $root_part_mount /bin/bash -c "/usr/sbin/grub$V-mkconfig -o /boot/grub$V/grub.cfg" ret=$? fi # If we had mounted efi system partition, umount it. if [ "$IRONIC_BOOT_MODE" = "uefi" ]; then umount $efi_system_part_mount fi umount $root_part_mount/dev umount $root_part_mount/sys umount $root_part_mount/proc umount $root_part_mount if [ $ret -eq 0 ]; then echo "Bootloader successfully installed" fi fi