End-to-end tests for database dump and restore.

This commit is contained in:
Dan Helfman 2019-12-10 16:41:01 -08:00
parent 8660af745e
commit 9f821862b7
3 changed files with 125 additions and 4 deletions

View file

@ -2,6 +2,15 @@
kind: pipeline kind: pipeline
name: python-3-5-alpine-3-10 name: python-3-5-alpine-3-10
services:
database:
image: postgres:11.5
ports:
- "5432:5432"
environment:
POSTGRES_PASSWORD: test
POSTGRES_DB: test
steps: steps:
- name: build - name: build
image: python:3.5-alpine3.10 image: python:3.5-alpine3.10
@ -12,6 +21,15 @@ steps:
kind: pipeline kind: pipeline
name: python-3-6-alpine-3-10 name: python-3-6-alpine-3-10
services:
database:
image: postgres:11.5
ports:
- "5432:5432"
environment:
POSTGRES_PASSWORD: test
POSTGRES_DB: test
steps: steps:
- name: build - name: build
image: python:3.6-alpine3.10 image: python:3.6-alpine3.10
@ -22,6 +40,15 @@ steps:
kind: pipeline kind: pipeline
name: python-3-7-alpine-3-10 name: python-3-7-alpine-3-10
services:
database:
image: postgres:11.5
ports:
- "5432:5432"
environment:
POSTGRES_PASSWORD: test
POSTGRES_DB: test
steps: steps:
- name: build - name: build
image: python:3.7-alpine3.10 image: python:3.7-alpine3.10
@ -32,6 +59,15 @@ steps:
kind: pipeline kind: pipeline
name: python-3-7-alpine-3-7 name: python-3-7-alpine-3-7
services:
database:
image: postgres:11.5
ports:
- "5432:5432"
environment:
POSTGRES_PASSWORD: test
POSTGRES_DB: test
steps: steps:
- name: build - name: build
image: python:3.7-alpine3.7 image: python:3.7-alpine3.7
@ -42,6 +78,15 @@ steps:
kind: pipeline kind: pipeline
name: python-3-8-alpine-3-10 name: python-3-8-alpine-3-10
services:
database:
image: postgres:11.5
ports:
- "5432:5432"
environment:
POSTGRES_PASSWORD: test
POSTGRES_DB: test
steps: steps:
- name: build - name: build
image: python:3.8-alpine3.10 image: python:3.8-alpine3.10

View file

@ -44,13 +44,13 @@ def test_borgmatic_command():
generate_configuration(config_path, repository_path) generate_configuration(config_path, repository_path)
subprocess.check_call( subprocess.check_call(
'borgmatic -v 2 --config {} --init --encryption repokey'.format(config_path).split(' ') 'borgmatic -v 2 --config {} init --encryption repokey'.format(config_path).split(' ')
) )
# Run borgmatic to generate a backup archive, and then list it to make sure it exists. # Run borgmatic to generate a backup archive, and then list it to make sure it exists.
subprocess.check_call('borgmatic --config {}'.format(config_path).split(' ')) subprocess.check_call('borgmatic --config {}'.format(config_path).split(' '))
output = subprocess.check_output( output = subprocess.check_output(
'borgmatic --config {} --list --json'.format(config_path).split(' ') 'borgmatic --config {} list --json'.format(config_path).split(' ')
).decode(sys.stdout.encoding) ).decode(sys.stdout.encoding)
parsed_output = json.loads(output) parsed_output = json.loads(output)
@ -61,7 +61,7 @@ def test_borgmatic_command():
# Extract the created archive into the current (temporary) directory, and confirm that the # Extract the created archive into the current (temporary) directory, and confirm that the
# extracted file looks right. # extracted file looks right.
output = subprocess.check_output( output = subprocess.check_output(
'borgmatic --config {} --extract --archive {}'.format(config_path, archive_name).split( 'borgmatic --config {} extract --archive {}'.format(config_path, archive_name).split(
' ' ' '
) )
).decode(sys.stdout.encoding) ).decode(sys.stdout.encoding)
@ -70,7 +70,7 @@ def test_borgmatic_command():
# Exercise the info flag. # Exercise the info flag.
output = subprocess.check_output( output = subprocess.check_output(
'borgmatic --config {} --info --json'.format(config_path).split(' ') 'borgmatic --config {} info --json'.format(config_path).split(' ')
).decode(sys.stdout.encoding) ).decode(sys.stdout.encoding)
parsed_output = json.loads(output) parsed_output = json.loads(output)

View file

@ -0,0 +1,76 @@
import json
import os
import shutil
import subprocess
import sys
import tempfile
def write_configuration(config_path, repository_path, borgmatic_source_directory):
'''
Write out borgmatic configuration into a file at the config path. Set the options so as to work
for testing. This includes injecting the given repository path, borgmatic source directory for
storing database dumps, and encryption passphrase.
'''
config = '''
location:
source_directories:
- {}
repositories:
- {}
borgmatic_source_directory: {}
storage:
encryption_passphrase: "test"
hooks:
postgresql_databases:
- name: test
hostname: localhost
username: postgres
password: test
'''.format(config_path, repository_path, borgmatic_source_directory)
config_file = open(config_path, 'w')
config_file.write(config)
config_file.close()
def test_database_dump_and_restore():
# Create a Borg repository.
temporary_directory = tempfile.mkdtemp()
repository_path = os.path.join(temporary_directory, 'test.borg')
borgmatic_source_directory = os.path.join(temporary_directory, '.borgmatic')
original_working_directory = os.getcwd()
try:
config_path = os.path.join(temporary_directory, 'test.yaml')
write_configuration(config_path, repository_path, borgmatic_source_directory)
subprocess.check_call(
'borgmatic -v 2 --config {} init --encryption repokey'.format(config_path).split(' ')
)
# Run borgmatic to generate a backup archive including a database dump
subprocess.check_call('borgmatic create --config {} -v 2'.format(config_path).split(' '))
# Get the created archive name.
output = subprocess.check_output(
'borgmatic --config {} list --json'.format(config_path).split(' ')
).decode(sys.stdout.encoding)
parsed_output = json.loads(output)
assert len(parsed_output) == 1
assert len(parsed_output[0]['archives']) == 1
archive_name = parsed_output[0]['archives'][0]['archive']
# Restore the database from the archive.
subprocess.check_call(
'borgmatic --config {} restore --archive {}'.format(config_path, archive_name).split(
' '
)
)
finally:
os.chdir(original_working_directory)
shutil.rmtree(temporary_directory)