1 ! Copyright (C) 2022 Doug Coleman.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: assocs assocs.extras formatting http http.client io
4 io.encodings.string io.encodings.utf8 json.reader kernel
5 namespaces sequences sequences.generalizations ;
8 SYMBOL: hetzner-access-token
10 CONSTANT: hetzner-api-v1 "https://api.hetzner.cloud/v1/"
12 ERROR: hetzner-access-token-required symbol ;
14 : get-hetzner-token ( -- token/* )
15 hetzner-access-token get [
16 hetzner-access-token hetzner-access-token-required
19 : set-hetzner-auth-header ( request -- request )
20 "Bearer " get-hetzner-token append "Authorization" set-header ;
22 : hetzner-get ( route -- json )
23 hetzner-api-v1 prepend <get-request>
24 set-hetzner-auth-header http-request nip utf8 decode json> ;
27 : get-hetzner-actions ( -- servers ) "actions" hetzner-get ;
28 : get-hetzner-action ( action-id -- servers ) "actions/%d" sprintf hetzner-get ;
31 : get-hetzner-certificates ( -- servers ) "certificates" hetzner-get ;
34 : get-hetzner-datacenters ( -- servers ) "datacenters" hetzner-get ;
35 : get-hetzner-datacenter ( datacenter-id -- servers ) "datacenters/%s" sprintf hetzner-get ;
38 : get-hetzner-firewalls ( -- servers ) "firewalls" hetzner-get ;
41 : get-hetzner-floating-ips ( -- servers ) "floating_ips" hetzner-get ;
44 : get-hetzner-images ( -- servers ) "images" hetzner-get ;
47 : get-hetzner-isos ( -- servers ) "isos" hetzner-get ;
48 : get-hetzner-iso ( iso-id -- servers ) "isos/%d" sprintf hetzner-get ;
51 : get-hetzner-locations ( -- servers ) "locations" hetzner-get ;
54 : get-hetzner-networks ( -- servers ) "networks" hetzner-get ;
57 : get-hetzner-pricing ( -- servers ) "pricing" hetzner-get ;
60 : get-hetzner-servers ( -- servers ) "servers" hetzner-get ;
61 : get-hetzner-server-by-id ( id -- servers ) "servers/%d" sprintf hetzner-get ;
63 : server-type. ( hash -- )
64 { "description" "cores" "cpu_type" "memory" "disk" } values-of 5 firstn
65 "%s: %d cores %s, %dGB RAM, %d GB disk" sprintf print ;
67 : hetzner-servers. ( -- )
68 get-hetzner-servers "servers" of [ "server_type" of server-type. ] each ;
71 : get-hetzner-server-types ( -- servers ) "server_types" hetzner-get ;
74 : get-hetzner-ssh-keys ( -- servers ) "ssh_keys" hetzner-get ;
77 : get-hetzner-volumes ( -- servers ) "volumes" hetzner-get ;
80 : get-hetzner-volume-actions ( volume-id -- servers ) "volumes/%d/actions" sprintf hetzner-get ;
81 : get-hetzner-volume-action ( volume-id action-id -- servers ) "volumes/%d/actions/%d" sprintf hetzner-get ;