Sha256: 56112c9693cb9c6649bfa1ff72eed62c02ac7b21388df90e7726183e5dda4f29

Contents?: true

Size: 1.87 KB

Versions: 1

Compression:

Stored size: 1.87 KB

Contents

# frozen_string_literal: true

require "hcloud"

class Kraaken::Cloud::Hetzner < Kraaken::Cloud
  def provision(name, groups:)
    logger.with_progress(total: 100) do
      logger.info "Provisioning server #{name}"
      keys = client.ssh_keys
      user_data = config.load_template("cloud-config.yml", keys:)
      options = {
        name:,
        server_type: "cax41",
        image: "ubuntu-22.04",
        labels: {group: groups.join(".")},
        location: "nbg1",
        networks: [client.networks.first.id],
        ssh_keys: keys.map(&:id),
        user_data:
      }
      logger.increment_progress by: 5
      logger.info "Creating server"
      action, server = client.servers.create(**options)
      await_action action
      logger.increment_progress by: 10
      server = await_startup server
      logger.info "Server started #{server.public_net.dig("ipv4", "ip")}"
      logger.increment_progress by: 10
      logger.info "Regenrating ssh config"
      config.ssh.regenerate_config
      logger.increment_progress by: 5
      sleep 10
      logger.increment_progress by: 10
      logger.info "Rebooting server after applying cloud-config"
      await_action server.reboot
      logger.increment_progress by: 10
      prepare name
    end
  end

  def servers
    client.servers.map { Kraaken::Cloud::Server.new(name: _1.name, ip: _1.private_net.first&.ip, public_ip: _1.public_net.dig("ipv4", "ip"), status: _1.status) }
  end

  private

  def client
    @client ||= Hcloud::Client.new(token: config.credentials.password("hetzner"))
  end

  def await_action(action)
    while action.status == "running"
      sleep 2
      action = client.actions.find(action.id)
    end
  end

  def await_startup(server)
    while server.status == "initializing" || server.status == "starting" || server.status == "off"
      sleep 3
      server = client.servers.find(server.id)
    end
    server
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
kraaken-0.0.1 lib/kraaken/cloud/hetzner.rb