Document validate-borgmatic-config and add a few tests.
This commit is contained in:
parent
6a10022543
commit
8650a15db1
7 changed files with 80 additions and 40 deletions
4
NEWS
4
NEWS
|
@ -1,3 +1,7 @@
|
||||||
|
1.3.3
|
||||||
|
* Add validate-borgmatic-config command, useful for validating borgmatic config generated by
|
||||||
|
configuration management or even edited by hand.
|
||||||
|
|
||||||
1.3.2
|
1.3.2
|
||||||
* #160: Fix for hooks executing when using --dry-run. Now hooks are skipped during a dry run.
|
* #160: Fix for hooks executing when using --dry-run. Now hooks are skipped during a dry run.
|
||||||
|
|
||||||
|
|
|
@ -42,9 +42,7 @@ def main(): # pragma: no cover
|
||||||
found_issues = False
|
found_issues = False
|
||||||
for config_filename in config_filenames:
|
for config_filename in config_filenames:
|
||||||
try:
|
try:
|
||||||
validate.parse_configuration(
|
validate.parse_configuration(config_filename, validate.schema_filename())
|
||||||
config_filename, validate.schema_filename()
|
|
||||||
)
|
|
||||||
except (ValueError, OSError, validate.Validation_error) as error:
|
except (ValueError, OSError, validate.Validation_error) as error:
|
||||||
logging.critical('{}: Error parsing configuration file'.format(config_filename))
|
logging.critical('{}: Error parsing configuration file'.format(config_filename))
|
||||||
logging.critical(error)
|
logging.critical(error)
|
||||||
|
@ -53,4 +51,6 @@ def main(): # pragma: no cover
|
||||||
if found_issues:
|
if found_issues:
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
else:
|
else:
|
||||||
logger.info('All given configuration files are valid: {}'.format(config_filenames))
|
logger.info(
|
||||||
|
'All given configuration files are valid: {}'.format(', '.join(config_filenames))
|
||||||
|
)
|
||||||
|
|
|
@ -76,7 +76,21 @@ FAQ](http://borgbackup.readthedocs.io/en/stable/faq.html#how-can-i-specify-the-e
|
||||||
for more info.
|
for more info.
|
||||||
|
|
||||||
|
|
||||||
###
|
### Validation
|
||||||
|
|
||||||
|
If you'd like to validate that your borgmatic configuration is valid, the
|
||||||
|
following command is available for that:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo validate-borgmatic-config
|
||||||
|
```
|
||||||
|
|
||||||
|
This command's exit status (`$?` in Bash) is zero when configuration is valid
|
||||||
|
and non-zero otherwise.
|
||||||
|
|
||||||
|
Validating configuration can be useful if you generate your configuration
|
||||||
|
files via configuration management, or you just want to double check that your
|
||||||
|
hand edits are valid.
|
||||||
|
|
||||||
|
|
||||||
## Initialization
|
## Initialization
|
||||||
|
|
2
setup.py
2
setup.py
|
@ -1,7 +1,7 @@
|
||||||
from setuptools import setup, find_packages
|
from setuptools import setup, find_packages
|
||||||
|
|
||||||
|
|
||||||
VERSION = '1.3.2'
|
VERSION = '1.3.3'
|
||||||
|
|
||||||
|
|
||||||
setup(
|
setup(
|
||||||
|
|
|
@ -29,36 +29,6 @@ def generate_configuration(config_path, repository_path):
|
||||||
config_file.close()
|
config_file.close()
|
||||||
|
|
||||||
|
|
||||||
def validate_valid_configuration(config_path):
|
|
||||||
'''
|
|
||||||
Validate borgmatic configuration which is valid.
|
|
||||||
'''
|
|
||||||
subprocess.check_call(
|
|
||||||
'validate-borgmatic-config --config {}'.format(config_path).split(' ')
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def validate_invalid_configuration(config_path):
|
|
||||||
'''
|
|
||||||
Validate borgmatic configuration which is invalid.
|
|
||||||
'''
|
|
||||||
|
|
||||||
config = (
|
|
||||||
open(config_path)
|
|
||||||
.read()
|
|
||||||
.replace('keep_daily: 7', 'keep_daily: "7"')
|
|
||||||
)
|
|
||||||
config_file = open(config_path, 'w')
|
|
||||||
config_file.write(config)
|
|
||||||
config_file.close()
|
|
||||||
|
|
||||||
exit_code = subprocess.call(
|
|
||||||
'validate-borgmatic-config --config {}'.format(config_path).split(' ')
|
|
||||||
)
|
|
||||||
|
|
||||||
assert exit_code == 1
|
|
||||||
|
|
||||||
|
|
||||||
def test_borgmatic_command():
|
def test_borgmatic_command():
|
||||||
# Create a Borg repository.
|
# Create a Borg repository.
|
||||||
temporary_directory = tempfile.mkdtemp()
|
temporary_directory = tempfile.mkdtemp()
|
||||||
|
@ -71,11 +41,7 @@ def test_borgmatic_command():
|
||||||
|
|
||||||
try:
|
try:
|
||||||
config_path = os.path.join(temporary_directory, 'test.yaml')
|
config_path = os.path.join(temporary_directory, 'test.yaml')
|
||||||
invalid_config_path = os.path.join(temporary_directory, 'test_invalid.yaml')
|
|
||||||
generate_configuration(config_path, repository_path)
|
generate_configuration(config_path, repository_path)
|
||||||
generate_configuration(invalid_config_path, repository_path)
|
|
||||||
validate_valid_configuration(config_path)
|
|
||||||
validate_invalid_configuration(invalid_config_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(' ')
|
||||||
|
|
36
tests/end-to-end/test_validate_config.py
Normal file
36
tests/end-to-end/test_validate_config.py
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
import os
|
||||||
|
import subprocess
|
||||||
|
import tempfile
|
||||||
|
|
||||||
|
|
||||||
|
def test_validate_config_command_with_valid_configuration_succeeds():
|
||||||
|
with tempfile.TemporaryDirectory() as temporary_directory:
|
||||||
|
config_path = os.path.join(temporary_directory, 'test.yaml')
|
||||||
|
|
||||||
|
subprocess.check_call(
|
||||||
|
'generate-borgmatic-config --destination {}'.format(config_path).split(' ')
|
||||||
|
)
|
||||||
|
exit_code = subprocess.call(
|
||||||
|
'validate-borgmatic-config --config {}'.format(config_path).split(' ')
|
||||||
|
)
|
||||||
|
|
||||||
|
assert exit_code == 0
|
||||||
|
|
||||||
|
|
||||||
|
def test_validate_config_command_with_invalid_configuration_fails():
|
||||||
|
with tempfile.TemporaryDirectory() as temporary_directory:
|
||||||
|
config_path = os.path.join(temporary_directory, 'test.yaml')
|
||||||
|
|
||||||
|
subprocess.check_call(
|
||||||
|
'generate-borgmatic-config --destination {}'.format(config_path).split(' ')
|
||||||
|
)
|
||||||
|
config = open(config_path).read().replace('keep_daily: 7', 'keep_daily: "7"')
|
||||||
|
config_file = open(config_path, 'w')
|
||||||
|
config_file.write(config)
|
||||||
|
config_file.close()
|
||||||
|
|
||||||
|
exit_code = subprocess.call(
|
||||||
|
'validate-borgmatic-config --config {}'.format(config_path).split(' ')
|
||||||
|
)
|
||||||
|
|
||||||
|
assert exit_code == 1
|
20
tests/integration/commands/test_validate_config.py
Normal file
20
tests/integration/commands/test_validate_config.py
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
from flexmock import flexmock
|
||||||
|
|
||||||
|
from borgmatic.commands import validate_config as module
|
||||||
|
|
||||||
|
|
||||||
|
def test_parse_arguments_with_no_arguments_uses_defaults():
|
||||||
|
config_paths = ['default']
|
||||||
|
flexmock(module.collect).should_receive('get_default_config_paths').and_return(config_paths)
|
||||||
|
|
||||||
|
parser = module.parse_arguments()
|
||||||
|
|
||||||
|
assert parser.config_paths == config_paths
|
||||||
|
|
||||||
|
|
||||||
|
def test_parse_arguments_with_multiple_config_paths_parses_as_list():
|
||||||
|
flexmock(module.collect).should_receive('get_default_config_paths').and_return(['default'])
|
||||||
|
|
||||||
|
parser = module.parse_arguments('--config', 'myconfig', 'otherconfig')
|
||||||
|
|
||||||
|
assert parser.config_paths == ['myconfig', 'otherconfig']
|
Loading…
Reference in a new issue