module

ScalewayApi

ScalewayApi — client Crystal pur (stdlib uniquement) pour l'API Scaleway REST v1.

Couvre le strict nécessaire au provisioning Elastic Metal :

  • client.ssh_keys — lister / créer / supprimer les clés SSH IAM.
  • client.baremetal.offers — catalogue Elastic Metal (EM-A115X-SSD, etc.).
  • client.baremetal.oses — templates d'OS (Debian 13, Ubuntu 24.04…).
  • client.baremetal.servers — création + installation en un appel, réinstallation, mise à jour (nom, reverse), suivi par événements.
  • client.domain.records — gestion des records DNS d'une zone (A/AAAA/CNAME/MX…), changesets, idempotent.
require "scaleway-api"

client = ScalewayApi::Client.new(
  secret_key: ENV["SCW_SECRET_KEY"],
  default_project_id: ENV["SCW_DEFAULT_PROJECT_ID"],
  default_zone: "fr-par-2",
)

key = client.ssh_keys.create(name: "laptop", public_key: "ssh-ed25519 AAAA...")
os = client.baremetal.oses.find_by_name_prefix("debian").not_nil!
offer = client.baremetal.offers.list.first

server = client.baremetal.servers.create(
  offer_id: offer.id,
  install: ScalewayApi::Endpoints::Baremetal::Install.new(
    os_id: os.id,
    hostname: "web01.aloli.fr",
    ssh_key_ids: [key.id],
  ),
  reverse: "web01.aloli.fr",
)

loop do
  events = client.baremetal.servers.events(server_id: server.id)
  break if events.any? { |e| e.action == "install_server" && e.success? }
  sleep 30.seconds
end

Constants

BASE_URL = "https://api.scaleway.com"

URL de base de l'API Scaleway (unique, contrairement à OVH qui distingue eu/ca/us). La zone fait partie du chemin (/zones/{zone}/...), pas du hostname.

DEFAULT_ZONE = "fr-par-2"

Zone par défaut si ni le client ni l'appel ne la précisent.

VERSION = {{ (((read_file("/tmp/tmp.kmBOlm/src/src/scaleway_api/../../shard.yml")) .lines .find(&.starts_with?("version:")) || "version: 0.0.0") .gsub(/^version:\s*/, "")) .chomp }}

Lue au compile-time depuis shard.yml via le macro read_file. Cf. note mémoire feedback_shard_version_macro.md (mémoire ALOLI).

ZONES = ["fr-par-1", "fr-par-2", "fr-par-3", "nl-ams-1", "nl-ams-2", "nl-ams-3", "pl-waw-1", "pl-waw-2", "pl-waw-3"] of ::String

Zones supportées au moment de l'écriture. Cette liste est purement indicative : le client accepte n'importe quelle chaîne pour zone, ce qui évite à ce shard de devoir être maintenu au rythme des ouvertures de nouveaux datacenters Scaleway.

Nested types