Adding more logic on Control Plane to help with creating of VMs inside slices. Also introduced new families and VM configurations to help with experimentation. - two new families added: 'burstable' and 'sharable'. Both get created in an isolated slice called like the family. Allowed sizes are -50 and -100 which mean 50% or 100% vCPU, respectively. Burstable instances can go up another 50% or 100%. - iniital slice allocation and tracking at VmHost level, this will need to be changed later - cleaned up some earlier hardcoded values on Data Plane side - temporarily turned off CPU accounting on VmHost/Allocator to allow for overcommiting With this, new instances can be created with: Prog::Vm::Nexus.assemble(File.read("/home/maciek/.ssh/id_ed25519.pub"), Project.first.id, name: "r2d2", size: "burstable-50", location: "hetzner-fsn1", enable_ip4: true, boot_image: "ubuntu-jammy")
101 lines
3 KiB
Ruby
Executable file
101 lines
3 KiB
Ruby
Executable file
#!/usr/bin/env ruby
|
|
# frozen_string_literal: true
|
|
|
|
REPL = true
|
|
|
|
require_relative "../loader"
|
|
require "timeout"
|
|
|
|
LOCATIONS = Option::LOCATIONS.map { |l| [l, "#{l.provider.display_name} #{l.display_name}"] }.to_h
|
|
|
|
def get_input(msg, default = nil)
|
|
prompt = "#{msg}#{default.nil? ? "" : " [default: #{default}]"}: "
|
|
input = ""
|
|
|
|
while input.empty?
|
|
print prompt
|
|
input = gets.chomp
|
|
input = default if input.empty? && !default.nil?
|
|
end
|
|
|
|
input
|
|
end
|
|
|
|
def select_option(msg, options, default = nil)
|
|
puts "\n"
|
|
options.each_with_index { |(key, name), index| puts "#{index + 1}. #{name}" }
|
|
puts "\n"
|
|
|
|
prompt = "#{msg}#{default.nil? ? "" : " [default: #{default}]"}: "
|
|
selected = nil
|
|
|
|
while selected.nil?
|
|
print prompt
|
|
option = gets.chomp
|
|
option = if option.empty?
|
|
default
|
|
elsif option.to_i < 1
|
|
puts "Plese enter a number between 1-#{options.count}#{default.nil? ? "" : " or leave empty for default"}"
|
|
else
|
|
option.to_i
|
|
end
|
|
|
|
selected = options.keys[option - 1] unless option.nil?
|
|
end
|
|
|
|
selected
|
|
end
|
|
|
|
hostname = get_input("Enter host IP address (required)")
|
|
if hostname.nil?
|
|
puts "\n\n"
|
|
puts "Please enter a valid host IP address."
|
|
exit 1
|
|
end
|
|
host_id = get_input("Enter host identifier (optional)", "")
|
|
location = select_option("Select provider and location", LOCATIONS, 1)
|
|
|
|
puts "\n\nCloudifying '#{hostname}' server for '#{LOCATIONS[location]}' \n\n"
|
|
|
|
# puts "Hostname: #{hostname}, Provider: #{location.provider.name}, Hetzner ID: #{host_id}, Location: #{location.name}"
|
|
strand = Prog::Vm::HostNexus.assemble(hostname, provider: location.provider.name, hetzner_server_identifier: host_id, location: location.name)
|
|
|
|
puts "Waiting public SSH keys\n\n"
|
|
until (ssh_key = strand.reload.subject.sshable.keys.map(&:public_key).first)
|
|
sleep 2
|
|
end
|
|
puts "Add following public SSH key to '/root/.ssh/authorized_keys' on your machine\n\n"
|
|
puts ssh_key
|
|
|
|
print "\n\nPress enter after you add the above SSH key to your machine\n\n"
|
|
gets.chomp
|
|
|
|
begin
|
|
Timeout.timeout(10 * 60) do
|
|
puts "Waiting for server to be cloudified"
|
|
previous_state = nil
|
|
while (state = strand.reload.label) != "wait"
|
|
if previous_state != state
|
|
puts "#{Time.now} state: #{state}"
|
|
previous_state = state
|
|
end
|
|
sleep 2
|
|
end
|
|
|
|
puts "Downloading the default boot image - Ubuntu Jammy 22.04"
|
|
download = strand.subject.download_boot_image("ubuntu-jammy", version: "20240319")
|
|
while download.exists?
|
|
print "."
|
|
sleep 2
|
|
end
|
|
end
|
|
rescue Timeout::Error
|
|
puts "\n\n"
|
|
puts "Could not cloudify server in 10 minutes. Probably something went wrong."
|
|
puts "Last state: #{strand.label}. Server ID for debug: #{strand.id}"
|
|
puts "Please check your hostname/IP address and be sure that you added the correct public SSH key to your server."
|
|
puts "You can ask for help on GitHub discussion page: https://github.com/ubicloud/ubicloud/discussions"
|
|
exit 1
|
|
end
|
|
|
|
puts "\n\nYour server is cloudified now. You can create virtual machines at '#{location.name}' in the cloud dashboard."
|