Files
ubicloud/rhizome/host/bin/setup-vm
Jeremy Evans edd7040d29 Allow Prog::Vm::Nexus.assemble to choose cloud-hypervisor version
Additionally, allow it to choose whether to support hugepages and to
choose the firmware version (though currently only one firmware
version is supported).  The default for hugepages is set to "on,"
pending additional work to avoid the reboot overheads of hugepages in
development.

In rhizome prep_host, download all supported cloud-hypervisor versions
and firmware versions.  Currently, only one firmware version is
supported.  On Ubuntu 24, both cloud-hypervisor 35.1 and 45.0 are
installed, with 45.0 as the default if it is installed.  On Ubuntu
22, only cloud-hypervisor 35.1 is installed.
2025-05-06 11:16:04 -07:00

124 lines
3.5 KiB
Ruby
Executable File

#!/bin/env ruby
# frozen_string_literal: true
require "json"
require_relative "../lib/vm_setup"
unless (action = ARGV.shift)
puts "expected action as argument"
exit 1
end
unless (vm_name = ARGV.shift)
puts "expected path to vm_name as argument"
exit 1
end
params = begin
JSON.parse(File.read(VmPath.new(vm_name).prep_json))
rescue Errno::ENOENT
if action.start_with?("delete")
# Params were not historically needed for the delete actions,
# so handle case where prep file has already been deleted.
{}
else
raise
end
end
vm_setup = VmSetup.new(vm_name,
hugepages: params.fetch("hugepages", true),
ch_version: params["ch_version"],
firmware_version: params["firmware_version"])
if action == "delete"
vm_setup.purge
exit 0
end
if action == "delete_keep_net"
vm_setup.purge_without_network
exit 0
end
if action == "delete_net"
vm_setup.purge_network
vm_setup.purge_user
exit 0
end
begin
# "Global Unicast" subnet, i.e. a subnet for exchanging packets with
# the internet.
gua = params.fetch("public_ipv6")
ip4 = params.fetch("public_ipv4")
local_ip4 = params.fetch("local_ipv4")
unix_user = params.fetch("unix_user")
ssh_public_keys = params.fetch("ssh_public_keys")
nics = params.fetch("nics").map { |args| VmSetup::Nic.new(*args) }.freeze
max_vcpus = params.fetch("max_vcpus")
cpu_topology = params.fetch("cpu_topology")
mem_gib = params.fetch("mem_gib")
ndp_needed = params.fetch("ndp_needed", false)
storage_volumes = params.fetch("storage_volumes")
swap_size_bytes = params["swap_size_bytes"]
pci_devices = params.fetch("pci_devices", [])
boot_image = params.fetch("boot_image")
dns_ipv4 = params.fetch("dns_ipv4")
slice_name = params.fetch("slice_name", "system.slice")
cpu_percent_limit = params.fetch("cpu_percent_limit", 0)
cpu_burst_percent_limit = params.fetch("cpu_burst_percent_limit", 0)
rescue KeyError => e
puts "Needed #{e.key} in parameters json"
exit 1
end
case action
when "prep"
secrets = JSON.parse($stdin.read)
unless (storage_secrets = secrets["storage"])
puts "need storage secrets in secrets json"
exit 1
end
vm_setup.prep(unix_user, ssh_public_keys, nics, gua, ip4,
local_ip4, max_vcpus, cpu_topology, mem_gib,
ndp_needed, storage_volumes, storage_secrets, swap_size_bytes,
pci_devices, boot_image, dns_ipv4,
slice_name, cpu_percent_limit, cpu_burst_percent_limit)
when "recreate-unpersisted"
secrets = JSON.parse($stdin.read)
unless (storage_secrets = secrets["storage"])
puts "need storage secrets in secrets json"
exit 1
end
vm_setup.recreate_unpersisted(
gua, ip4, local_ip4, nics, mem_gib,
ndp_needed, storage_volumes, storage_secrets, dns_ipv4,
pci_devices, slice_name, cpu_burst_percent_limit,
multiqueue: max_vcpus > 1
)
when "reinstall-systemd-units"
vm_setup.install_systemd_unit(
max_vcpus, cpu_topology, mem_gib, storage_volumes, nics,
pci_devices, slice_name, cpu_percent_limit, cpu_burst_percent_limit
)
when "reassign-ip6"
secrets = JSON.parse($stdin.read)
unless (storage_secrets = secrets["storage"])
puts "need storage secrets in secrets json"
exit 1
end
vm_setup.reassign_ip6(unix_user, ssh_public_keys, nics, gua, ip4,
local_ip4, max_vcpus, cpu_topology, mem_gib,
ndp_needed, storage_volumes, storage_secrets,
swap_size_bytes, pci_devices, boot_image, dns_ipv4,
slice_name, cpu_percent_limit, cpu_burst_percent_limit)
when "restart"
vm_setup.restart(slice_name, cpu_burst_percent_limit)
else
puts "Invalid action #{action}"
exit 1
end