|
(ns delete-datomic-system |
|
(:require |
|
[clojure.string :as str] |
|
[clojure.java.shell :as sh] |
|
[clojure.data.json :as json])) |
|
|
|
(defn json-cmd |
|
([args] (json-cmd args nil)) |
|
([args opts] |
|
(let [r (apply sh/sh (concat args (mapcat identity opts)))] |
|
(if (= 0 (:exit r)) |
|
(json/read-str (:out r)) |
|
(println "Error:" (:err r)))))) |
|
|
|
(defn parse-arn |
|
[arn-str] |
|
(let [parts (drop 1 (str/split arn-str #":" 6))] |
|
(zipmap [:partition :service :region :account-id :resource] parts))) |
|
|
|
;; Delete docs |
|
;; https://docs.datomic.com/cloud/operation/deleting.html#deleting-storage |
|
|
|
(defn delete-s3-bucket |
|
[s3-bucket] |
|
(sh/sh "aws" "s3" "rb" (str "s3://" s3-bucket) "--force")) |
|
|
|
(defn delete-ddb-table |
|
[table-name] |
|
(sh/sh "aws" "dynamodb" "delete-table" "--table-name" table-name)) |
|
|
|
(defn delete-efs |
|
[fs-id] |
|
(sh/sh "aws" "efs" "delete-file-system" "--file-system-id" fs-id)) |
|
|
|
(defn deregister-dynamo-scalable-target |
|
[datomic-system] |
|
(let [deregister (fn [dimension] |
|
(sh/sh "aws" "application-autoscaling" "deregister-scalable-target" |
|
"--service-namespace" "dynamodb" |
|
"--scalable-dimension" dimension |
|
"--resource-id" (format "table/datomic-%s" datomic-system)))] |
|
(deregister "dynamodb:table:WriteCapacityUnits") |
|
(deregister "dynamodb:table:ReadCapacityUnits"))) |
|
|
|
(defn get-datomic-resource-arns |
|
[system-name] |
|
(let [r (json-cmd ["aws" "resourcegroupstaggingapi" "get-resources" "--tag-filters" |
|
(format "Key=datomic:system,Values=%s" system-name)])] |
|
(when r |
|
(map (comp parse-arn #(get % "ResourceARN")) (get r "ResourceTagMappingList"))))) |
|
|
|
(defn delete-leftover-datomic-resources-from-arns |
|
[system-name parsed-arns] |
|
(let [resources-by-service (group-by :service parsed-arns)] |
|
;; delete s3 buckets |
|
(doseq [{:keys [resource]} (get resources-by-service "s3")] |
|
(println "Deleting S3 bucket" resource) |
|
(delete-s3-bucket resource)) |
|
;; delete dynamo tables |
|
(doseq [{:keys [resource]} (get resources-by-service "dynamodb") |
|
:let [[_ table-name] (str/split resource #"\/" 2)]] |
|
(println "Deleting ddb table" table-name) |
|
(delete-ddb-table table-name)) |
|
;; delete efs |
|
(doseq [{:keys [resource]} (get resources-by-service "elasticfilesystem") |
|
:let [[_ fs-id] (str/split resource #"\/" 2)]] |
|
(println "Deleting efs " fs-id) |
|
(delete-efs fs-id)) |
|
(println "Deregistering dynamodb application-autoscaling") |
|
(deregister-dynamo-scalable-target system-name))) |
|
|
|
(defn delete-leftover-datomic-system-resources |
|
[system-name] |
|
(->> (get-datomic-resource-arns system-name) |
|
(delete-leftover-datomic-resources-from-arns system-name))) |
|
|
|
(defn system-exit! |
|
"Exit the process." |
|
[status message] |
|
(when (and message (not (str/blank? message))) |
|
(binding [*out* (if (= 0 status) *out* *err*)] |
|
(println message))) |
|
(System/exit status)) |
|
|
|
(defn -main |
|
[& args] |
|
(let [datomic-system-name (first args)] |
|
(if datomic-system-name |
|
(do (delete-leftover-datomic-system-resources datomic-system-name) |
|
(shutdown-agents)) |
|
(system-exit! 1 "Missing datomic system name.")))) |