mirror of
https://github.com/kevinveenbirkenbach/computer-playbook.git
synced 2025-08-15 16:40:45 +02:00
Optimized logic for database backups and integrated test to verify that database feature is used correct
This commit is contained in:
parent
e9ef62b95d
commit
149c563831
@ -16,4 +16,4 @@
|
|||||||
when: applications | get_app_conf(application_id, 'features.central_database', False)
|
when: applications | get_app_conf(application_id, 'features.central_database', False)
|
||||||
|
|
||||||
- name: "For '{{ application_id }}': Add Entry for Backup Procedure"
|
- name: "For '{{ application_id }}': Add Entry for Backup Procedure"
|
||||||
include_tasks: "{{ playbook_dir }}/roles/sys-bkp-docker-2-loc/tasks/seed-database-to-backup.yml"
|
include_tasks: "{{ playbook_dir }}/roles/sys-bkp-docker-2-loc/tasks/03_seed-database-to-backup.yml"
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
application_id: "svc-prx-openresty"
|
application_id: "svc-prx-openresty"
|
||||||
|
|
||||||
# Deactivate Database for openresty
|
# Deactivate Database for openresty
|
||||||
database_type: false
|
database_enabled: false
|
||||||
|
|
||||||
# Openresty
|
# Openresty
|
||||||
openresty_image: "openresty/openresty"
|
openresty_image: "openresty/openresty"
|
||||||
|
1
roles/sys-bkp-docker-2-loc/defaults/main.yml
Normal file
1
roles/sys-bkp-docker-2-loc/defaults/main.yml
Normal file
@ -0,0 +1 @@
|
|||||||
|
database_enabled: "{{ database_type | default('') | bool }}" # Enables the database backup
|
17
roles/sys-bkp-docker-2-loc/tasks/01_pkgmgr_routines.yml
Normal file
17
roles/sys-bkp-docker-2-loc/tasks/01_pkgmgr_routines.yml
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
- block:
|
||||||
|
- name: "pkgmgr install {{ bkp_docker_to_local_pkg }}"
|
||||||
|
include_role:
|
||||||
|
name: pkgmgr-install
|
||||||
|
vars:
|
||||||
|
package_name: "{{ bkp_docker_to_local_pkg }}"
|
||||||
|
|
||||||
|
- name: "Retrieve {{ bkp_docker_to_local_pkg }} path from pkgmgr"
|
||||||
|
command: "pkgmgr path {{ bkp_docker_to_local_pkg }}"
|
||||||
|
register: pkgmgr_output
|
||||||
|
changed_when: false
|
||||||
|
|
||||||
|
- name: Set fact for backup_docker_to_local_folder
|
||||||
|
set_fact:
|
||||||
|
backup_docker_to_local_folder: "{{ pkgmgr_output.stdout }}/"
|
||||||
|
changed_when: false
|
||||||
|
when: backup_docker_to_local_folder is not defined
|
@ -1,4 +1,5 @@
|
|||||||
# This file is also used by web-app-matrix
|
- include_tasks: 01_pkgmgr_routines.yml
|
||||||
|
when: backup_docker_to_local_folder is not defined
|
||||||
|
|
||||||
- name: "Display all database variables"
|
- name: "Display all database variables"
|
||||||
debug:
|
debug:
|
@ -1,22 +1,9 @@
|
|||||||
- block:
|
- block:
|
||||||
- name: "pkgmgr install"
|
- include_tasks: 01_pkgmgr_routines.yml
|
||||||
include_role:
|
when: backup_docker_to_local_folder is not defined
|
||||||
name: pkgmgr-install
|
|
||||||
vars:
|
|
||||||
package_name: "{{ bkp_docker_to_local_pkg }}"
|
|
||||||
|
|
||||||
- name: "Retrieve {{ bkp_docker_to_local_pkg }} path from pkgmgr"
|
|
||||||
command: "pkgmgr path {{ bkp_docker_to_local_pkg }}"
|
|
||||||
register: pkgmgr_output
|
|
||||||
changed_when: false
|
|
||||||
|
|
||||||
- name: Set fact for backup_docker_to_local_folder
|
|
||||||
set_fact:
|
|
||||||
backup_docker_to_local_folder: "{{ pkgmgr_output.stdout }}/"
|
|
||||||
changed_when: false
|
|
||||||
|
|
||||||
- name: "reset (if enabled)"
|
- name: "reset (if enabled)"
|
||||||
include_tasks: reset.yml
|
include_tasks: 02_reset.yml
|
||||||
when: mode_reset | bool
|
when: mode_reset | bool
|
||||||
|
|
||||||
- name: configure sys-bkp-docker-2-loc-everything.infinito.service
|
- name: configure sys-bkp-docker-2-loc-everything.infinito.service
|
||||||
@ -41,15 +28,12 @@
|
|||||||
vars:
|
vars:
|
||||||
on_calendar: "{{on_calendar_backup_docker_to_local}}"
|
on_calendar: "{{on_calendar_backup_docker_to_local}}"
|
||||||
|
|
||||||
- name: run the backup_docker_to_local tasks once
|
- include_tasks: "{{ playbook_dir }}/tasks/utils/load_handlers.yml"
|
||||||
set_fact:
|
|
||||||
run_once_sys_bkp_docker_2_loc: true
|
|
||||||
|
|
||||||
when:
|
when:
|
||||||
- run_once_sys_bkp_docker_2_loc is not defined
|
- run_once_sys_bkp_docker_2_loc is not defined
|
||||||
- database_type is defined and database_type
|
- database_enabled | bool
|
||||||
|
|
||||||
- name: "include seed-database-to-backup.yml"
|
- name: "include 03_seed-database-to-backup.yml"
|
||||||
include_tasks: seed-database-to-backup.yml
|
include_tasks: 03_seed-database-to-backup.yml
|
||||||
when:
|
when:
|
||||||
- database_type is defined and database_type
|
- database_enabled | bool
|
||||||
|
@ -7,7 +7,7 @@ features:
|
|||||||
# @todo fix this
|
# @todo fix this
|
||||||
ldap: false
|
ldap: false
|
||||||
oidc: true
|
oidc: true
|
||||||
central_database: false
|
central_database: false # Propably required for backup routines
|
||||||
logout: true
|
logout: true
|
||||||
server:
|
server:
|
||||||
csp:
|
csp:
|
||||||
@ -20,3 +20,9 @@ server:
|
|||||||
canonical:
|
canonical:
|
||||||
- "meet.{{ primary_domain }}"
|
- "meet.{{ primary_domain }}"
|
||||||
credentials: {}
|
credentials: {}
|
||||||
|
|
||||||
|
docker:
|
||||||
|
services:
|
||||||
|
database:
|
||||||
|
# This is set to true to pass integration test, doesn't have any other function
|
||||||
|
enabled: true
|
||||||
|
@ -3,8 +3,8 @@
|
|||||||
include_role:
|
include_role:
|
||||||
name: cmp-docker-proxy
|
name: cmp-docker-proxy
|
||||||
|
|
||||||
- name: "include seed-database-to-backup.yml"
|
- name: "include 03_seed-database-to-backup.yml"
|
||||||
include_tasks: "{{ playbook_dir }}/roles/sys-bkp-docker-2-loc/tasks/seed-database-to-backup.yml"
|
include_tasks: "{{ playbook_dir }}/roles/sys-bkp-docker-2-loc/tasks/03_seed-database-to-backup.yml"
|
||||||
|
|
||||||
- name: configure websocket_upgrade.conf
|
- name: configure websocket_upgrade.conf
|
||||||
copy:
|
copy:
|
||||||
|
@ -9,5 +9,5 @@
|
|||||||
name: svc-db-postgres
|
name: svc-db-postgres
|
||||||
when: applications | get_app_conf(application_id, 'features.central_database', False)
|
when: applications | get_app_conf(application_id, 'features.central_database', False)
|
||||||
|
|
||||||
- name: "include seed-database-to-backup.yml"
|
- name: "include 03_seed-database-to-backup.yml"
|
||||||
include_tasks: "{{ playbook_dir }}/roles/sys-bkp-docker-2-loc/tasks/seed-database-to-backup.yml"
|
include_tasks: "{{ playbook_dir }}/roles/sys-bkp-docker-2-loc/tasks/03_seed-database-to-backup.yml"
|
59
tests/integration/test_central_database_config.py
Normal file
59
tests/integration/test_central_database_config.py
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
# tests/integration/test_central_database_config.py
|
||||||
|
import unittest
|
||||||
|
from pathlib import Path
|
||||||
|
import yaml
|
||||||
|
|
||||||
|
|
||||||
|
def load_yaml(path: Path):
|
||||||
|
"""Load a YAML file and return dict ({} if missing/empty)."""
|
||||||
|
if not path.exists():
|
||||||
|
return {}
|
||||||
|
with path.open("r", encoding="utf-8") as f:
|
||||||
|
return yaml.safe_load(f) or {}
|
||||||
|
|
||||||
|
|
||||||
|
class TestCentralDatabaseConfig(unittest.TestCase):
|
||||||
|
def test_central_database_feature_requires_database_service(self):
|
||||||
|
"""
|
||||||
|
If features.central_database is defined in either vars/main.yml or config/main.yml,
|
||||||
|
then config/main.yml must define docker.services.database.
|
||||||
|
"""
|
||||||
|
repo_root = Path(__file__).resolve().parents[2]
|
||||||
|
roles_dir = repo_root / "roles"
|
||||||
|
|
||||||
|
violations = []
|
||||||
|
|
||||||
|
for role_dir in sorted(roles_dir.glob("*")):
|
||||||
|
if not role_dir.is_dir():
|
||||||
|
continue
|
||||||
|
|
||||||
|
vars_file = role_dir / "vars" / "main.yml"
|
||||||
|
cfg_file = role_dir / "config" / "main.yml"
|
||||||
|
|
||||||
|
vars_data = load_yaml(vars_file)
|
||||||
|
cfg_data = load_yaml(cfg_file)
|
||||||
|
|
||||||
|
# Check if the feature key is defined in either file (value is irrelevant).
|
||||||
|
vars_features = vars_data.get("features", {}) if isinstance(vars_data.get("features"), dict) else {}
|
||||||
|
cfg_features = cfg_data.get("features", {}) if isinstance(cfg_data.get("features"), dict) else {}
|
||||||
|
central_defined = ("central_database" in vars_features) or ("central_database" in cfg_features)
|
||||||
|
|
||||||
|
if not central_defined:
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Require docker.services.database in config/main.yml
|
||||||
|
docker = cfg_data.get("docker", {})
|
||||||
|
services = docker.get("services", {}) if isinstance(docker, dict) else {}
|
||||||
|
if "database" not in services:
|
||||||
|
violations.append(role_dir.name)
|
||||||
|
|
||||||
|
if violations:
|
||||||
|
self.fail(
|
||||||
|
"The 'central_database' feature is only available if 'docker.services.database' "
|
||||||
|
"is defined in config/main.yml. Missing in roles:\n"
|
||||||
|
+ "\n".join(f"- {name}" for name in violations)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
unittest.main()
|
Loading…
x
Reference in New Issue
Block a user