Files
ubicloud/demo/cloudify_server
Eren Başak 2cdbe07efb Make the VM image Ubuntu Noble
As the default setting in VM creation has been Ubuntu Noble (24.04)
for a while, it may cause confusion to users to ask for 22.04, so let's
change the VM image to Ubuntu Noble in the cloudify script.
2025-07-14 22:58:29 +03:00

108 lines
3.2 KiB
Ruby
Executable File

#!/usr/bin/env ruby
# frozen_string_literal: true
REPL = true
require_relative "../loader"
require "timeout"
LOCATIONS = Location.where(visible: true).map { |l| [l, "#{l.provider} #{l.name} (#{l.display_name})"] }.to_h
REQUIRED_ENV_VARS = %w[HETZNER_USER HETZNER_PASSWORD HETZNER_SSH_PUBLIC_KEY HETZNER_SSH_PRIVATE_KEY].freeze
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
unless REQUIRED_ENV_VARS.all? { Config.public_send(it.downcase) }
puts "Please set the following variables in the .env file and re-run docker-compose up:"
puts REQUIRED_ENV_VARS.join("\n")
exit 1
end
hostname = get_input("Enter host IP address")
host_id = get_input("Enter host identifier", "")
location = select_option("Select provider and location", LOCATIONS, 1)
puts "\n\nCloudifying '#{hostname}' server for '#{LOCATIONS[location]}' \n\n"
if location.provider != HostProvider::HETZNER_PROVIDER_NAME
puts "Currently only Hetzner is supported for this demo. Please use a Hetzner server for cloudification."
exit 1
end
vm_host_ds = VmHost
.where(id: Sshable.where(host: hostname).select(:id))
.where(id: HostProvider.where(server_identifier: host_id).select(:id))
.where(location_id: location.id)
strand = if (vmh = vm_host_ds.first)
puts "Found existing cloudified server for '#{hostname}' with ID: #{vmh.id}"
vmh.strand
else
# Create a new strand for the cloudified server
Prog::Vm::HostNexus.assemble(
hostname,
provider_name: location.provider,
server_identifier: host_id,
location_id: location.id,
default_boot_images: ["ubuntu-noble"]
)
end
begin
Timeout.timeout(30 * 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
end
rescue Timeout::Error
puts "\n\n"
puts "Could not cloudify server in 30 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 '#{LOCATIONS[location]}' in the cloud dashboard."