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
(:require
["@pulumi/pulumi" :as pulumi]
["@pulumi/vault" :as vault]
["@pulumi/cloudflare" :as cloudflare]))
(ns infra.dns
(:require
[clojure.string :as str]
["@pulumi/pulumi" :as pulumi]
["@pulumi/kubernetes" :as k8s]
["@pulumi/vault" :as vault]
["@pulumi/cloudflare" :as cloudflare]
["@pulumi/command/local" :as local]))
(defn setup-dns [zone-id vault-provider]
(let [dns-secrets (.getSecret (.-generic vault)
(clj->js {:path "secret/dns-entries"})
(clj->js {:provider vault-provider}))
dns-entries-map (.-dataJson dns-secrets)
]
(pulumi/all [dns-entries-map]
(fn [[entries]]
(doall
(for [[name ip] entries]
(new cloudflare/Record (str "dns-record-" name)
(clj->js {:zoneId zone-id
:name name
:value ip
:type "A" ;; Need to check the IP and determine if we should use AAAA or A
:ttl 300}))))))))
(defn get-record-type
"Determines the DNS record type (A or AAAA) based on IP address format."
[ip-address]
(println ip-address)
(if (.includes ip-address ":")
"AAAA"
"A"))
(defn- get-node-ips []
(str "kubectl get nodes -o jsonpath='{range .items[*]}{.status.addresses[?(@.type==\"ExternalIP\")].address}{\"\\n\"}{end}'"))
(defn setup-dns [cfg vault-provider]
(let [get-node-ips (local/Command.
"get-node-ips"
(clj->js {:create (get-node-ips)
: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}))))))))))))