From 1a49fe3c10e7c906d0d718c6ec2d16db2bec51cc Mon Sep 17 00:00:00 2001 From: Michael Jerger Date: Tue, 20 Aug 2024 07:56:13 +0200 Subject: [PATCH] add db-drop-create --- infrastructure/backup/test/resources/test.bb | 26 +++++++---- src/dda/backup/postgresql.clj | 45 ++++++++++++++------ src/dda/backup/postgresql/domain.clj | 41 ++++++++++++++++++ test/dda/backup/postgresql/domain_test.clj | 31 ++++++++++++++ 4 files changed, 121 insertions(+), 22 deletions(-) create mode 100644 src/dda/backup/postgresql/domain.clj create mode 100644 test/dda/backup/postgresql/domain_test.clj diff --git a/infrastructure/backup/test/resources/test.bb b/infrastructure/backup/test/resources/test.bb index ae50704..214e077 100755 --- a/infrastructure/backup/test/resources/test.bb +++ b/infrastructure/backup/test/resources/test.bb @@ -2,30 +2,40 @@ (require '[babashka.tasks :as tasks] '[dda.backup.management :as mgm] + '[dda.backup.postgresql :as ps] '[dda.backup.backup :as bak] '[dda.backup.restore :as rs]) +(def restic-repo {:password-file "restic-pwd" + :restic-repository "restic-repo"}) + +(defn prepare! + [] + (ps/create-pg-pass! (merge restic-repo {:backup-path "db" + :pg-db "mydb" + :pg-user "user" + :pg-password "password"}))) + (defn restic-repo-init! [] (spit "restic-pwd" "ThePassword") - (mgm/init! {:password-file "restic-pwd" - :restic-repository "restic-repo"})) + (mgm/init! (merge restic-repo {:backup-path "files"})) + (mgm/init! (merge restic-repo {:backup-path "db" :dry-run true :debug true}))) (defn restic-backup! [] (tasks/shell "mkdir" "-p" "test-backup") (spit "test-backup/file" "I was here") - (bak/backup! {:password-file "restic-pwd" - :restic-repository "restic-repo" - :files ["test-backup"]})) + (bak/backup! (merge restic-repo {:backup-path "files" + :files ["test-backup"]}))) (defn restic-restore! [] (tasks/shell "mkdir" "-p" "test-restore") - (rs/restore! {:password-file "restic-pwd" - :restic-repository "restic-repo" - :target-directory "test-restore"})) + (rs/restore! (merge restic-repo {:backup-path "files" + :target-directory "test-restore"}))) +(prepare!) (restic-repo-init!) (restic-backup!) (restic-restore!) diff --git a/src/dda/backup/postgresql.clj b/src/dda/backup/postgresql.clj index 79ac471..f28f2a1 100644 --- a/src/dda/backup/postgresql.clj +++ b/src/dda/backup/postgresql.clj @@ -1,26 +1,43 @@ -(ns dda.backup.postgres +(ns dda.backup.postgresql (:require [orchestra.core :refer [defn-spec]] [clojure.spec.alpha :as s] [dda.backup.core.domain :as cd] - [dda.backup.management.domain :as domain] + [dda.backup.postgresql.domain :as domain] [dda.backup.core :as core] [dda.backup.infrastructure :as i])) -;; function drop-create-db() { -;; psql -d template1 -h ${POSTGRES_SERVICE} -p ${POSTGRES_PORT} -U ${POSTGRES_USER} \ -;; --no-password -c "DROP DATABASE \"${POSTGRES_DB}\";" -;; psql -d template1 -h ${POSTGRES_SERVICE} -p ${POSTGRES_PORT} -U ${POSTGRES_USER} \ -;; --no-password -c "CREATE DATABASE \"${POSTGRES_DB}\";" -;; } +(def default + (merge core/default + {:pg-host "localhost" + :pg_port 5432})) -;; function create-pg-pass() { -;; local pg_host=${POSTGRES_HOST:-localhost} +(s/def ::config + (s/keys :req-un [::domain/pg-db + ::domain/pg-user + ::domain/pg-password + ::cd/restic-repository + ::cd/backup-path] + :opt-un [::domain/pg-host + ::domain/pg-port + ::cd/certificate-file + ::cd/password-file + ::cd/days-to-keep + ::cd/months-to-keep + ::cd/directory + ::cd/dry-run + ::cd/debug])) -;; echo "${pg_host}:${POSTGRES_DB}:${POSTGRES_USER}:${POSTGRES_PASSWORD}" > /root/.pgpass -;; echo "${POSTGRES_HOST}:template1:${POSTGRES_USER}:${POSTGRES_PASSWORD}" >> /root/.pgpass -;; chmod 0600 /root/.pgpass -;; } +(defn-spec create-pg-pass! nil? + [config ::config] + (let [config-w-defaults (merge default config)] + (spit "/root/.pgpass" (domain/pgpass config-w-defaults)))) + + +(defn-spec drop-create-db! nil? + [config ::config] + (let [config-w-defaults (merge default config)] + ((i/execute! (domain/db-drop-create-command config-w-defaults))))) ;; function backup-roles() { ;; local role_prefix="$1"; shift diff --git a/src/dda/backup/postgresql/domain.clj b/src/dda/backup/postgresql/domain.clj new file mode 100644 index 0000000..5333019 --- /dev/null +++ b/src/dda/backup/postgresql/domain.clj @@ -0,0 +1,41 @@ +(ns dda.backup.postgresql.domain + (:require + [orchestra.core :refer [defn-spec]] + [clojure.spec.alpha :as s] + [dda.backup.core.domain :as cd])) + +(s/def ::pg-host string?) +(s/def ::pg-port pos-int?) +(s/def ::pg-db string?) +(s/def ::pg-user string?) +(s/def ::pg-password string?) + +(s/def ::config + (s/keys :req-un [::pg-host + ::pg-port + ::pg-db + ::pg-password + ::pg-user + ::cd/restic-repository + ::cd/backup-path] + :opt-un [::cd/certificate-file + ::cd/password-file])) + +(defn-spec psql-command ::cd/command + [config ::config + command string?] + (let [{:keys [pg-host pg-port pg-user]} config] + ["psql" "-d" "template1" "-h" pg-host "-p" (str pg-port) "-U" pg-user + "--no-password" "-c" command])) + + +(defn-spec pgpass string? + [config ::config] + (let [{:keys [pg-host pg-db pg-user pg-password]} config] + (str pg-host ":" pg-db ":" pg-user ":" pg-password))) + +(defn-spec db-drop-create-command ::cd/commands + [config ::config] + (let [{:keys [pg-db]} config] + [(psql-command config (str "\"DROP DATABASE \\\"" pg-db "\\\";\"")) + (psql-command config (str "\"CREATE DATABASE \\\"" pg-db "\\\";\""))])) diff --git a/test/dda/backup/postgresql/domain_test.clj b/test/dda/backup/postgresql/domain_test.clj new file mode 100644 index 0000000..eb62e17 --- /dev/null +++ b/test/dda/backup/postgresql/domain_test.clj @@ -0,0 +1,31 @@ +(ns dda.backup.postgresql.domain-test + (:require + [clojure.test :refer [deftest is are testing run-tests]] + [clojure.spec.test.alpha :as st] + [dda.backup.postgresql.domain :as cut])) + +(st/instrument `cut/pgpass) +(st/instrument `cut/db-drop-create-command) + +(deftest should-calculate-pgpass + (is (= "localhost:mydb:user:password" + (cut/pgpass {:restic-repository "repo" + :backup-path "dir-at-repo" + :pg-host "localhost" + :pg-port 5432 + :pg-db "mydb" + :pg-user "user" + :pg-password "password"})))) + +(deftest should-calculate-db-drop-create-command + (is (= [["psql" "-d" "template1" "-h" "localhost" "-p" "5432" "-U" "user" + "--no-password" "-c" "\"DROP DATABASE \\\"mydb\\\";\""] + ["psql" "-d" "template1" "-h" "localhost" "-p" "5432" "-U" "user" + "--no-password" "-c" "\"CREATE DATABASE \\\"mydb\\\";\""]] + (cut/db-drop-create-command {:restic-repository "repo" + :backup-path "dir-at-repo" + :pg-host "localhost" + :pg-port 5432 + :pg-db "mydb" + :pg-user "user" + :pg-password "password"}))))