(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)))))