diff --git a/labs/lib/osbash/virtualbox.install_node b/labs/lib/osbash/virtualbox.install_node new file mode 100644 index 00000000..ebbe3e4e --- /dev/null +++ b/labs/lib/osbash/virtualbox.install_node @@ -0,0 +1,86 @@ +# This bash library contains the main function that creates a node VM. + +# Configure VirtualBox network interfaces +function _vbox_configure_ifs { + # Iterate over all NET_IF_? variables + local NET_IFS=( "${!NET_IF_@}" ) + local NET_IF="" + for NET_IF in "${NET_IFS[@]}"; do + local IF_NUM=${NET_IF##*_} + if [ "${!NET_IF}" = "nat" ]; then + echo "interface $IF_NUM: NAT" + vm_nic_nat "$NODE_NAME" "$IF_NUM" + else + # Host-only network: NET_IF is net name (e.g. API_NET) + # Use corresponding VirtualBox interface (e.g. API_NET_IF) + local HOST_IF="${!NET_IF}_IF" + echo "interface $IF_NUM: host-only ${!HOST_IF}" + vm_nic_hostonly "$NODE_NAME" "$IF_NUM" "${!HOST_IF}" + fi + done +} + +# Boot node VM; wait until autostart files are processed and VM is shut down +function _vbox_boot_with_autostart { + local VM=$1 + local SSH_PORT=$2 + + vbox_boot "$VM" + + # Wait for ssh connection and execute scripts in autostart directory + # (for wbatch, osbashauto does the processing instead) + ${WBATCH:+:} ssh_process_autostart "$SSH_PORT" & + + wait_for_autofiles + echo >&2 "VM \"$VM\": autostart files executed" + vm_wait_for_shutdown "$VM" +} + +function vm_build_node { + # XXX Run this function in sub-shell to protect our caller's environment + # (which might be _our_ enviroment if we get called again) + ( + + NODE_NAME=$1 + source "$CONFIG_DIR/config.$NODE_NAME" + + ${WBATCH:-:} wbatch_begin_node "$NODE_NAME" + + vm_create "$NODE_NAME" + + # Set VM_MEM in config/config.NODE_NAME to override + vm_mem "$NODE_NAME" "${VM_MEM:-512}" + + _vbox_configure_ifs + + # Port forwarding + if [ -n "${VM_SSH_PORT:-}" ]; then + vm_port "$NODE_NAME" ssh "$VM_SSH_PORT" 22 + fi + if [ -n "${VM_WWW_PORT:-}" ]; then + vm_port "$NODE_NAME" http "$VM_WWW_PORT" 80 + fi + + vm_add_share "$NODE_NAME" "$SHARE_DIR" "$SHARE_NAME" + vm_attach_disk_multi "$NODE_NAME" "$BASE_DISK" + #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + autostart_reset + # Rename to pass the node name to the script + autostart_and_rename osbash init_xxx_node.sh "init_${NODE_NAME}_node.sh" + autostart_from_config scripts.nodeinit_osbash + + _vbox_boot_with_autostart "$NODE_NAME" "$VM_SSH_PORT" + vm_snapshot "$NODE_NAME" "network_configured" + #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + autostart_reset + autostart_from_config "scripts.$NODE_NAME" + autostart scripts shutdown.sh + _vbox_boot_with_autostart "$NODE_NAME" "$VM_SSH_PORT" + vm_snapshot "$NODE_NAME" "pre-installed" + #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + ${WBATCH:-:} wbatch_end_file + + ) +} + +# vim: set ai ts=4 sw=4 et ft=sh: