ubicloud/demo/cloudify_server
Maciek Sarnowicz 0b50b83445 'burstable' and 'sharable' VM families added on Control Plane
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")
2024-11-05 06:56:47 -08:00

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."