End-to-end tests for database dump and restore.
This commit is contained in:
parent
8660af745e
commit
9f821862b7
3 changed files with 125 additions and 4 deletions
45
.drone.yml
45
.drone.yml
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
76
tests/end-to-end/test_database.py
Normal file
76
tests/end-to-end/test_database.py
Normal 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)
|
Loading…
Reference in a new issue