diff --git a/roles/cmp-rdbms/tasks/main.yml b/roles/cmp-rdbms/tasks/main.yml index 18c6017c..a20af5f1 100644 --- a/roles/cmp-rdbms/tasks/main.yml +++ b/roles/cmp-rdbms/tasks/main.yml @@ -16,4 +16,4 @@ when: applications | get_app_conf(application_id, 'features.central_database', False) - 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" diff --git a/roles/svc-prx-openresty/vars/main.yml b/roles/svc-prx-openresty/vars/main.yml index 6dc7612a..2387b4df 100644 --- a/roles/svc-prx-openresty/vars/main.yml +++ b/roles/svc-prx-openresty/vars/main.yml @@ -2,7 +2,7 @@ application_id: "svc-prx-openresty" # Deactivate Database for openresty -database_type: false +database_enabled: false # Openresty openresty_image: "openresty/openresty" diff --git a/roles/sys-bkp-docker-2-loc/defaults/main.yml b/roles/sys-bkp-docker-2-loc/defaults/main.yml new file mode 100644 index 00000000..3edb2ada --- /dev/null +++ b/roles/sys-bkp-docker-2-loc/defaults/main.yml @@ -0,0 +1 @@ +database_enabled: "{{ database_type | default('') | bool }}" # Enables the database backup \ No newline at end of file diff --git a/roles/sys-bkp-docker-2-loc/tasks/01_pkgmgr_routines.yml b/roles/sys-bkp-docker-2-loc/tasks/01_pkgmgr_routines.yml new file mode 100644 index 00000000..ebe8f584 --- /dev/null +++ b/roles/sys-bkp-docker-2-loc/tasks/01_pkgmgr_routines.yml @@ -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 diff --git a/roles/sys-bkp-docker-2-loc/tasks/reset.yml b/roles/sys-bkp-docker-2-loc/tasks/02_reset.yml similarity index 100% rename from roles/sys-bkp-docker-2-loc/tasks/reset.yml rename to roles/sys-bkp-docker-2-loc/tasks/02_reset.yml diff --git a/roles/sys-bkp-docker-2-loc/tasks/seed-database-to-backup.yml b/roles/sys-bkp-docker-2-loc/tasks/03_seed-database-to-backup.yml similarity index 96% rename from roles/sys-bkp-docker-2-loc/tasks/seed-database-to-backup.yml rename to roles/sys-bkp-docker-2-loc/tasks/03_seed-database-to-backup.yml index 3136342a..103938fc 100644 --- a/roles/sys-bkp-docker-2-loc/tasks/seed-database-to-backup.yml +++ b/roles/sys-bkp-docker-2-loc/tasks/03_seed-database-to-backup.yml @@ -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" debug: diff --git a/roles/sys-bkp-docker-2-loc/tasks/main.yml b/roles/sys-bkp-docker-2-loc/tasks/main.yml index 081c2dc0..374ef737 100644 --- a/roles/sys-bkp-docker-2-loc/tasks/main.yml +++ b/roles/sys-bkp-docker-2-loc/tasks/main.yml @@ -1,22 +1,9 @@ - block: - - name: "pkgmgr install" - 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 + - include_tasks: 01_pkgmgr_routines.yml + when: backup_docker_to_local_folder is not defined - name: "reset (if enabled)" - include_tasks: reset.yml + include_tasks: 02_reset.yml when: mode_reset | bool - name: configure sys-bkp-docker-2-loc-everything.infinito.service @@ -41,15 +28,12 @@ vars: on_calendar: "{{on_calendar_backup_docker_to_local}}" - - name: run the backup_docker_to_local tasks once - set_fact: - run_once_sys_bkp_docker_2_loc: true - + - include_tasks: "{{ playbook_dir }}/tasks/utils/load_handlers.yml" when: - 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" - include_tasks: seed-database-to-backup.yml +- name: "include 03_seed-database-to-backup.yml" + include_tasks: 03_seed-database-to-backup.yml when: - - database_type is defined and database_type + - database_enabled | bool diff --git a/roles/web-app-bigbluebutton/config/main.yml b/roles/web-app-bigbluebutton/config/main.yml index 930ea344..d4b96109 100644 --- a/roles/web-app-bigbluebutton/config/main.yml +++ b/roles/web-app-bigbluebutton/config/main.yml @@ -7,7 +7,7 @@ features: # @todo fix this ldap: false oidc: true - central_database: false + central_database: false # Propably required for backup routines logout: true server: csp: @@ -20,3 +20,9 @@ server: canonical: - "meet.{{ primary_domain }}" credentials: {} + +docker: + services: + database: + # This is set to true to pass integration test, doesn't have any other function + enabled: true diff --git a/roles/web-app-bigbluebutton/tasks/main.yml b/roles/web-app-bigbluebutton/tasks/main.yml index 7afd5f89..5f694c95 100644 --- a/roles/web-app-bigbluebutton/tasks/main.yml +++ b/roles/web-app-bigbluebutton/tasks/main.yml @@ -3,8 +3,8 @@ include_role: name: cmp-docker-proxy -- name: "include seed-database-to-backup.yml" - include_tasks: "{{ playbook_dir }}/roles/sys-bkp-docker-2-loc/tasks/seed-database-to-backup.yml" +- name: "include 03_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 copy: diff --git a/roles/web-app-matrix/tasks/create-and-seed-database.yml b/roles/web-app-matrix/tasks/create-and-seed-database.yml index 7933facf..983677f9 100644 --- a/roles/web-app-matrix/tasks/create-and-seed-database.yml +++ b/roles/web-app-matrix/tasks/create-and-seed-database.yml @@ -9,5 +9,5 @@ name: svc-db-postgres when: applications | get_app_conf(application_id, 'features.central_database', False) -- name: "include seed-database-to-backup.yml" - include_tasks: "{{ playbook_dir }}/roles/sys-bkp-docker-2-loc/tasks/seed-database-to-backup.yml" \ No newline at end of file +- name: "include 03_seed-database-to-backup.yml" + include_tasks: "{{ playbook_dir }}/roles/sys-bkp-docker-2-loc/tasks/03_seed-database-to-backup.yml" \ No newline at end of file diff --git a/tests/integration/test_central_database_config.py b/tests/integration/test_central_database_config.py new file mode 100644 index 00000000..3a9c5dcc --- /dev/null +++ b/tests/integration/test_central_database_config.py @@ -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()