From 34b7aedeeb317f53f9cdf68e366ee8ac83599496 Mon Sep 17 00:00:00 2001 From: Frederik Ring Date: Sat, 11 Oct 2025 19:49:51 +0200 Subject: [PATCH] Add failing test --- cmd/backup/command.go | 16 ++++++++++++++-- cmd/backup/container.go | 5 +++++ test/container/docker-compose.yml | 22 ++++++++++++++++++++++ test/container/run.sh | 28 ++++++++++++++++++++++++++++ 4 files changed, 69 insertions(+), 2 deletions(-) create mode 100644 cmd/backup/container.go create mode 100644 test/container/docker-compose.yml create mode 100755 test/container/run.sh diff --git a/cmd/backup/command.go b/cmd/backup/command.go index 46d8b40..662a466 100644 --- a/cmd/backup/command.go +++ b/cmd/backup/command.go @@ -42,7 +42,9 @@ func (c *command) runAsCommand() error { return errwrap.Wrap(err, "error running script") } case "container": - panic("execution mode container not implemented") + if err := runInContainer(config); err != nil { + return errwrap.Wrap(err, "error spawning container") + } default: return errwrap.Wrap(nil, fmt.Sprintf("unknown execution mode %s", config.ExecutionMode)) } @@ -131,7 +133,17 @@ func (c *command) schedule(strategy configStrategy) error { ) } case "container": - panic("execution mode container not implemented") + if err := runInContainer(config); err != nil { + c.logger.Error( + fmt.Sprintf( + "Unexpected error running schedule %s in container: %v", + config.BackupCronExpression, + errwrap.Unwrap(err), + ), + "error", + err, + ) + } default: c.logger.Error( fmt.Sprintf( diff --git a/cmd/backup/container.go b/cmd/backup/container.go new file mode 100644 index 0000000..482c415 --- /dev/null +++ b/cmd/backup/container.go @@ -0,0 +1,5 @@ +package main + +func runInContainer(config *Config) error { + return nil +} diff --git a/test/container/docker-compose.yml b/test/container/docker-compose.yml new file mode 100644 index 0000000..839d4f7 --- /dev/null +++ b/test/container/docker-compose.yml @@ -0,0 +1,22 @@ +services: + backup: + image: offen/docker-volume-backup:${TEST_VERSION:-canary} + restart: always + environment: + BACKUP_FILENAME: test.tar.gz + BACKUP_CRON_EXPRESSION: 0 0 5 31 2 ? + EXECUTION_MODE: container + volumes: + - app_data:/backup/app_data:ro + - /var/run/docker.sock:/var/run/docker.sock:ro + - ${LOCAL_DIR:-./local}:/archive + + offen: + image: offen/offen:latest + labels: + - docker-volume-backup.stop-during-backup=true + volumes: + - app_data:/var/opt/offen + +volumes: + app_data: diff --git a/test/container/run.sh b/test/container/run.sh new file mode 100755 index 0000000..b3b8230 --- /dev/null +++ b/test/container/run.sh @@ -0,0 +1,28 @@ +#!/bin/sh + +set -e + +cd "$(dirname "$0")" +. ../util.sh +current_test=$(basename $(pwd)) + +export LOCAL_DIR=$(mktemp -d) + +docker compose up -d --quiet-pull +sleep 5 + +# A symlink for a known file in the volume is created so the test can check +# whether symlinks are preserved on backup. +docker compose exec offen ln -s /var/opt/offen/offen.db /var/opt/offen/db.link +docker compose exec backup backup + +sleep 5 + +expect_running_containers "2" + +tmp_dir=$(mktemp -d) +tar -xvf "$LOCAL_DIR/test.tar.gz" -C $tmp_dir +if [ ! -f "$tmp_dir/backup/app_data/offen.db" ]; then + fail "Could not find expected file in untared archive." +fi +rm -f "$LOCAL_DIR/test-hostnametoken.tar.gz"