Finish DNS creation for Cloudflare

This commit is contained in:
2025-09-27 21:02:23 -05:00
parent 3ffe110578
commit 6a1942c684

View File

@@ -1,22 +1,57 @@
(ns dns (ns infra.dns
(:require (:require
["@pulumi/pulumi" :as pulumi] [clojure.string :as str]
["@pulumi/vault" :as vault] ["@pulumi/pulumi" :as pulumi]
["@pulumi/cloudflare" :as cloudflare])) ["@pulumi/kubernetes" :as k8s]
["@pulumi/vault" :as vault]
["@pulumi/cloudflare" :as cloudflare]
["@pulumi/command/local" :as local]))
(defn setup-dns [zone-id vault-provider] (defn get-record-type
(let [dns-secrets (.getSecret (.-generic vault) "Determines the DNS record type (A or AAAA) based on IP address format."
(clj->js {:path "secret/dns-entries"}) [ip-address]
(clj->js {:provider vault-provider})) (println ip-address)
dns-entries-map (.-dataJson dns-secrets) (if (.includes ip-address ":")
] "AAAA"
(pulumi/all [dns-entries-map] "A"))
(fn [[entries]]
(doall (defn- get-node-ips []
(for [[name ip] entries] (str "kubectl get nodes -o jsonpath='{range .items[*]}{.status.addresses[?(@.type==\"ExternalIP\")].address}{\"\\n\"}{end}'"))
(new cloudflare/Record (str "dns-record-" name)
(clj->js {:zoneId zone-id (defn setup-dns [cfg vault-provider]
:name name (let [get-node-ips (local/Command.
:value ip "get-node-ips"
:type "A" ;; Need to check the IP and determine if we should use AAAA or A (clj->js {:create (get-node-ips)
:ttl 300})))))))) :environment {:KUBECONFIG "./kubeconfig.yaml"}}))
token (.requireSecret cfg "apiToken")
cloudflare-provider (new cloudflare/Provider "cloudflare-provider"
(clj->js {:apiToken token}))
dns-configs-secret (.getSecret (.-generic vault)
(clj->js {:path "secret/dns"})
(clj->js {:provider vault-provider}))
node-ips-output (.-stdout get-node-ips)]
(.apply node-ips-output
(fn [command-output]
(let [node-ips (-> command-output
str/split-lines
(->> (map #(first (str/split % #" ")))
(filter seq)))]
(.then dns-configs-secret
(fn [secret-data]
(let [hostname-to-zone (-> (.-data secret-data)
(js->clj :keywordize-keys true))]
(vec
(for [[hostname zone-id] hostname-to-zone
[index ip] (map-indexed vector node-ips)
:when (and hostname zone-id ip)]
(new cloudflare/DnsRecord
(str "dns-" (name hostname) "-node-" index)
(clj->js {:zoneId zone-id
:name (str hostname)
:content ip
:type (get-record-type ip)
:ttl 300})
(clj->js {:provider cloudflare-provider}))))))))))))