(define (cleanup-temporary-ssh-key/maybe)
  (when (%hetzner-ssh-key-file)
    (delete-file (%hetzner-ssh-key-file))
    (%hetzner-ssh-key-file #f)
    (format #t "TODO: delete temporary ssh key via hetzner api~%")))

(define (deploy-hetzner machine)
  "Internal implementation of 'deploy-machine' for 'machine' instances with an
environment type of 'hetzner-environment-type'."
  (hetzner-machine-validate machine)

  (define server (hetzner-machine-server machine))

  ;; Provisioning requires uploading an SSH key via the Hetzner API to
  ;; authenticate non-interactively with the newly created server.
  (unless (or server                    ;provisioning?
              (hetzner-configuration-ssh-public-key
               (machine-configuration machine)))
    (format #t "using a temporary ssh key for provisioning~%")
    (%hetzner-ssh-key-file (temporary-ssh-key-file)))
  (unless (hetzner-machine-ssh-key machine)
    (hetzner-machine-ssh-key-create machine))

  ;; Cleaning-up here is a bit tricky, as `deploy-machine' returns a monadic
  ;; value immediately, to be executed later; this means the clean-up must be
  ;; delayed until monadic evaluation time.
  (let* ((server (or server
                     (hetzner-machine-provision machine)))
         (delegate-machine (hetzner-machine-delegate machine server)))
    (guard (c (#t (cleanup-temporary-ssh-key/maybe)))
      (mlet %store-monad
          ((value (deploy-machine delegate-machine)))
        (cleanup-temporary-ssh-key/maybe)
        (return value)))))

Generated by apteryx using scpaste at Tue May 5 22:45:55 2026. JST. (original)