From 6e32b2024067dddcb00e96f9ad356214f287bd1e Mon Sep 17 00:00:00 2001 From: Kevin Veen-Birkenbach Date: Fri, 11 Jul 2025 00:42:36 +0200 Subject: [PATCH] Finished new role identification system implementation --- cli/deploy.py | 2 +- cli/fix/vars_main_files.py | 2 +- group_vars/all/05_maintenace.yml | 2 +- playbook.yml | 6 +- roles/bkp-data-to-usb/vars/main.yml | 10 +- roles/bkp-directory-validator/vars/main.yml | 3 +- roles/bkp-docker-to-local/vars/main.yml | 3 +- roles/bkp-provider-user/vars/main.yml | 5 +- roles/bkp-provider/vars/main.yml | 1 + roles/bkp-remote-to-local/vars/main.yml | 3 +- roles/categories.yml | 7 +- roles/cln-backups-service/vars/main.yml | 3 +- roles/cln-backups-timer/vars/main.yml | 1 + roles/cln-certs/vars/main.yml | 1 + roles/cln-disc-space/vars/main.yml | 3 +- .../vars/main.yml | 1 + .../README.md | 0 .../files/__init__.py | 0 .../files/cln-docker-storage-optimizer.py} | 0 .../handlers/main.yml | 5 + .../meta/main.yml | 0 .../tasks/main.yml | 22 +++++ .../cln-docker-storage-optimizer.service.j2} | 2 +- .../vars/main.yml | 3 + roles/cln-domains/vars/main.yml | 1 + roles/cln-failed-docker-backups/vars/main.yml | 3 +- roles/desk-docker/vars/main.yml | 2 +- roles/desk-git/meta/main.yml | 2 +- roles/docker-core/tasks/main.yml | 2 +- .../handlers/main.yml | 5 - .../tasks/main.yml | 22 ----- .../vars/main.yml | 3 - roles/web-svc-simpleicons/vars/main.yml | 2 +- tasks/plays/02_personal-computer.yml | 91 ------------------- tasks/plays/03_destructor.yml | 15 --- tasks/{plays => stages}/01_constructor.yml | 57 +----------- tasks/stages/02_personal-computer.yml | 16 ++++ tasks/{plays => stages}/02_server.yml | 8 +- tasks/stages/03_destructor.yml | 6 ++ .../test_application_id_consistency.py | 2 +- .../test_meta_roles_integration.py | 67 ++++++++++++++ .../integration/test_unique_application_id.py | 39 ++++++++ .../__init__.py | 0 .../test_storage_optimizer.py | 2 +- 44 files changed, 212 insertions(+), 218 deletions(-) create mode 100644 roles/bkp-provider/vars/main.yml create mode 100644 roles/cln-backups-timer/vars/main.yml create mode 100644 roles/cln-certs/vars/main.yml create mode 100644 roles/cln-docker-anonymous-volumes/vars/main.yml rename roles/{maint-docker-storage-optimizer => cln-docker-storage-optimizer}/README.md (100%) rename roles/{maint-docker-storage-optimizer => cln-docker-storage-optimizer}/files/__init__.py (100%) rename roles/{maint-docker-storage-optimizer/files/maint-docker-storage-optimizer.py => cln-docker-storage-optimizer/files/cln-docker-storage-optimizer.py} (100%) create mode 100644 roles/cln-docker-storage-optimizer/handlers/main.yml rename roles/{maint-docker-storage-optimizer => cln-docker-storage-optimizer}/meta/main.yml (100%) create mode 100644 roles/cln-docker-storage-optimizer/tasks/main.yml rename roles/{maint-docker-storage-optimizer/templates/maint-docker-storage-optimizer.service.j2 => cln-docker-storage-optimizer/templates/cln-docker-storage-optimizer.service.j2} (64%) create mode 100644 roles/cln-docker-storage-optimizer/vars/main.yml create mode 100644 roles/cln-domains/vars/main.yml delete mode 100644 roles/maint-docker-storage-optimizer/handlers/main.yml delete mode 100644 roles/maint-docker-storage-optimizer/tasks/main.yml delete mode 100644 roles/maint-docker-storage-optimizer/vars/main.yml delete mode 100644 tasks/plays/02_personal-computer.yml delete mode 100644 tasks/plays/03_destructor.yml rename tasks/{plays => stages}/01_constructor.yml (67%) create mode 100644 tasks/stages/02_personal-computer.yml rename tasks/{plays => stages}/02_server.yml (72%) create mode 100644 tasks/stages/03_destructor.yml create mode 100644 tests/integration/test_meta_roles_integration.py create mode 100644 tests/integration/test_unique_application_id.py rename tests/unit/roles/{maint-docker-storage-optimizer => cln-docker-storage-optimizer}/__init__.py (100%) rename tests/unit/roles/{maint-docker-storage-optimizer => cln-docker-storage-optimizer}/test_storage_optimizer.py (94%) diff --git a/cli/deploy.py b/cli/deploy.py index ffdd7944..fd07e161 100644 --- a/cli/deploy.py +++ b/cli/deploy.py @@ -80,7 +80,7 @@ def main(): ) parser.add_argument( "--host-type", - choices=["server", "personal-computer"], + choices=["server", "desktop"], default="server", help="Specify whether the target is a server or a personal computer. Affects role selection and variables." ) diff --git a/cli/fix/vars_main_files.py b/cli/fix/vars_main_files.py index f4bad3da..6a99892b 100644 --- a/cli/fix/vars_main_files.py +++ b/cli/fix/vars_main_files.py @@ -10,7 +10,7 @@ from pathlib import Path # Directory containing roles; can be overridden by tests MODULE_DIR = Path(__file__).resolve().parent -ROLES_DIR = (MODULE_DIR.parent / "roles").resolve() +ROLES_DIR = (MODULE_DIR.parent.parent / "roles").resolve() def process_role(role_dir: Path, prefix: str, preview: bool, overwrite: bool): name = role_dir.name diff --git a/group_vars/all/05_maintenace.yml b/group_vars/all/05_maintenace.yml index ec450726..99d921ac 100644 --- a/group_vars/all/05_maintenace.yml +++ b/group_vars/all/05_maintenace.yml @@ -28,7 +28,7 @@ system_maintenance_cleanup_services: system_maintenance_manipulation_services: - "maint-docker-heal" - "update-docker" - - "maint-docker-storage-optimizer" + - "cln-docker-storage-optimizer" - "maint-docker-restart" ## Total System Maintenance Services diff --git a/playbook.yml b/playbook.yml index a0f93900..f258cec3 100644 --- a/playbook.yml +++ b/playbook.yml @@ -2,9 +2,9 @@ hosts: all tasks: - name: "Load 'constructor' tasks" - include_tasks: "tasks/plays/01_constructor.yml" + include_tasks: "tasks/stages/01_constructor.yml" - name: "Load '{{host_type}}' tasks" - include_tasks: "tasks/plays/02_{{host_type}}.yml" + include_tasks: "tasks/stages/02_{{host_type}}.yml" - name: "Load 'destructor' tasks" - include_tasks: "tasks/plays/03_destructor.yml" + include_tasks: "tasks/stages/03_destructor.yml" become: true \ No newline at end of file diff --git a/roles/bkp-data-to-usb/vars/main.yml b/roles/bkp-data-to-usb/vars/main.yml index cfd70d61..75cad993 100644 --- a/roles/bkp-data-to-usb/vars/main.yml +++ b/roles/bkp-data-to-usb/vars/main.yml @@ -1,4 +1,6 @@ -backup_to_usb_script_path: "/usr/local/sbin/bkp-data-to-usb.python" -backup_to_usb_destination: "{{backup_to_usb_mount}}{{backup_to_usb_destination_subdirectory}}" -backups_folder_path: "{{backup_to_usb_destination}}" -systemctl_mount_service_name: "{{ backup_to_usb_mount | trim('/') | replace('/', '-') }}.mount" \ No newline at end of file +backup_to_usb_script_path: /usr/local/sbin/bkp-data-to-usb.python +backup_to_usb_destination: '{{backup_to_usb_mount}}{{backup_to_usb_destination_subdirectory}}' +backups_folder_path: '{{backup_to_usb_destination}}' +systemctl_mount_service_name: '{{ backup_to_usb_mount | trim(''/'') | replace(''/'', + ''-'') }}.mount' +application_id: data-to-usb diff --git a/roles/bkp-directory-validator/vars/main.yml b/roles/bkp-directory-validator/vars/main.yml index 8b7ac34a..fe00a370 100644 --- a/roles/bkp-directory-validator/vars/main.yml +++ b/roles/bkp-directory-validator/vars/main.yml @@ -1 +1,2 @@ -backup_directory_validator_folder: "{{path_administrator_scripts}}directory-validator/" \ No newline at end of file +backup_directory_validator_folder: '{{path_administrator_scripts}}directory-validator/' +application_id: directory-validator diff --git a/roles/bkp-docker-to-local/vars/main.yml b/roles/bkp-docker-to-local/vars/main.yml index 50ba6abd..be74fde6 100644 --- a/roles/bkp-docker-to-local/vars/main.yml +++ b/roles/bkp-docker-to-local/vars/main.yml @@ -1 +1,2 @@ -bkp_docker_to_local_pkg: backup-docker-to-local \ No newline at end of file +bkp_docker_to_local_pkg: backup-docker-to-local +application_id: docker-to-local diff --git a/roles/bkp-provider-user/vars/main.yml b/roles/bkp-provider-user/vars/main.yml index 031eba48..6ede8f70 100644 --- a/roles/bkp-provider-user/vars/main.yml +++ b/roles/bkp-provider-user/vars/main.yml @@ -1,2 +1,3 @@ -authorized_keys_path: "{{ inventory_dir }}/files/{{ inventory_hostname }}/home/backup/.ssh/authorized_keys" -authorized_keys_list: "{{ lookup('file', authorized_keys_path).splitlines() }}" +authorized_keys_path: '{{ inventory_dir }}/files/{{ inventory_hostname }}/home/backup/.ssh/authorized_keys' +authorized_keys_list: '{{ lookup(''file'', authorized_keys_path).splitlines() }}' +application_id: provider-user diff --git a/roles/bkp-provider/vars/main.yml b/roles/bkp-provider/vars/main.yml new file mode 100644 index 00000000..0b665467 --- /dev/null +++ b/roles/bkp-provider/vars/main.yml @@ -0,0 +1 @@ +application_id: provider diff --git a/roles/bkp-remote-to-local/vars/main.yml b/roles/bkp-remote-to-local/vars/main.yml index e13b116b..a82fad38 100644 --- a/roles/bkp-remote-to-local/vars/main.yml +++ b/roles/bkp-remote-to-local/vars/main.yml @@ -1 +1,2 @@ -docker_backup_remote_to_local_folder: "{{path_administrator_scripts}}bkp-remote-to-local/" \ No newline at end of file +docker_backup_remote_to_local_folder: '{{path_administrator_scripts}}bkp-remote-to-local/' +application_id: remote-to-local diff --git a/roles/categories.yml b/roles/categories.yml index 064f8aaa..a98cfafa 100644 --- a/roles/categories.yml +++ b/roles/categories.yml @@ -92,7 +92,7 @@ roles: title: "Backup & Restore" description: "Backup strategies & restore procedures" icon: "fas fa-hdd" - invokable: false + invokable: true update: title: "Updates & Package Management" description: "OS & package updates" @@ -103,3 +103,8 @@ roles: description: "User accounts & access control" icon: "fas fa-users" invokable: false + cln: + title: "Cleanup" + description: "Roles for cleaning up various system resources—old backups, unused certificates, temporary files, Docker volumes, disk caches, deprecated domains, and more." + icon: "fas fa-trash-alt" + invokable: true diff --git a/roles/cln-backups-service/vars/main.yml b/roles/cln-backups-service/vars/main.yml index 1a35a217..8ea269e7 100644 --- a/roles/cln-backups-service/vars/main.yml +++ b/roles/cln-backups-service/vars/main.yml @@ -1 +1,2 @@ -cleanup_backups_directory: "{{path_administrator_scripts}}cln-backups/" \ No newline at end of file +cleanup_backups_directory: '{{path_administrator_scripts}}cln-backups/' +application_id: backups-service diff --git a/roles/cln-backups-timer/vars/main.yml b/roles/cln-backups-timer/vars/main.yml new file mode 100644 index 00000000..1e83fccf --- /dev/null +++ b/roles/cln-backups-timer/vars/main.yml @@ -0,0 +1 @@ +application_id: backups-timer diff --git a/roles/cln-certs/vars/main.yml b/roles/cln-certs/vars/main.yml new file mode 100644 index 00000000..c2600a87 --- /dev/null +++ b/roles/cln-certs/vars/main.yml @@ -0,0 +1 @@ +application_id: certs diff --git a/roles/cln-disc-space/vars/main.yml b/roles/cln-disc-space/vars/main.yml index 4af6e8e3..5d45dcb5 100644 --- a/roles/cln-disc-space/vars/main.yml +++ b/roles/cln-disc-space/vars/main.yml @@ -1 +1,2 @@ -cleanup_disc_space_folder: "{{path_administrator_scripts}}cln-disc-space/" \ No newline at end of file +cleanup_disc_space_folder: '{{path_administrator_scripts}}cln-disc-space/' +application_id: disc-space diff --git a/roles/cln-docker-anonymous-volumes/vars/main.yml b/roles/cln-docker-anonymous-volumes/vars/main.yml new file mode 100644 index 00000000..acae31a0 --- /dev/null +++ b/roles/cln-docker-anonymous-volumes/vars/main.yml @@ -0,0 +1 @@ +application_id: docker-anonymous-volumes diff --git a/roles/maint-docker-storage-optimizer/README.md b/roles/cln-docker-storage-optimizer/README.md similarity index 100% rename from roles/maint-docker-storage-optimizer/README.md rename to roles/cln-docker-storage-optimizer/README.md diff --git a/roles/maint-docker-storage-optimizer/files/__init__.py b/roles/cln-docker-storage-optimizer/files/__init__.py similarity index 100% rename from roles/maint-docker-storage-optimizer/files/__init__.py rename to roles/cln-docker-storage-optimizer/files/__init__.py diff --git a/roles/maint-docker-storage-optimizer/files/maint-docker-storage-optimizer.py b/roles/cln-docker-storage-optimizer/files/cln-docker-storage-optimizer.py similarity index 100% rename from roles/maint-docker-storage-optimizer/files/maint-docker-storage-optimizer.py rename to roles/cln-docker-storage-optimizer/files/cln-docker-storage-optimizer.py diff --git a/roles/cln-docker-storage-optimizer/handlers/main.yml b/roles/cln-docker-storage-optimizer/handlers/main.yml new file mode 100644 index 00000000..39f1909a --- /dev/null +++ b/roles/cln-docker-storage-optimizer/handlers/main.yml @@ -0,0 +1,5 @@ +- name: "reload cln-docker-storage-optimizer.cymais.service" + systemd: + name: cln-docker-storage-optimizer.cymais.service + state: reloaded + daemon_reload: yes diff --git a/roles/maint-docker-storage-optimizer/meta/main.yml b/roles/cln-docker-storage-optimizer/meta/main.yml similarity index 100% rename from roles/maint-docker-storage-optimizer/meta/main.yml rename to roles/cln-docker-storage-optimizer/meta/main.yml diff --git a/roles/cln-docker-storage-optimizer/tasks/main.yml b/roles/cln-docker-storage-optimizer/tasks/main.yml new file mode 100644 index 00000000..c51a6888 --- /dev/null +++ b/roles/cln-docker-storage-optimizer/tasks/main.yml @@ -0,0 +1,22 @@ +- name: "create {{storage_optimizer_directory}}" + file: + path: "{{storage_optimizer_directory}}" + state: directory + mode: 0755 + +- name: create cln-docker-storage-optimizer.cymais.service + template: + src: cln-docker-storage-optimizer.service.j2 + dest: /etc/systemd/system/cln-docker-storage-optimizer.cymais.service + notify: reload cln-docker-storage-optimizer.cymais.service + +- name: create cln-docker-storage-optimizer.py + copy: + src: cln-docker-storage-optimizer.py + dest: "{{storage_optimizer_script}}" + mode: 0755 + +- name: "optimize storage performance" + systemd: + name: cln-docker-storage-optimizer.cymais.service + state: started \ No newline at end of file diff --git a/roles/maint-docker-storage-optimizer/templates/maint-docker-storage-optimizer.service.j2 b/roles/cln-docker-storage-optimizer/templates/cln-docker-storage-optimizer.service.j2 similarity index 64% rename from roles/maint-docker-storage-optimizer/templates/maint-docker-storage-optimizer.service.j2 rename to roles/cln-docker-storage-optimizer/templates/cln-docker-storage-optimizer.service.j2 index 8c9ca788..64336063 100644 --- a/roles/maint-docker-storage-optimizer/templates/maint-docker-storage-optimizer.service.j2 +++ b/roles/cln-docker-storage-optimizer/templates/cln-docker-storage-optimizer.service.j2 @@ -4,5 +4,5 @@ OnFailure=alert-compose.cymais@%n.service [Service] Type=oneshot -ExecStartPre=/bin/sh -c '/usr/bin/python {{ path_system_lock_script }} {{ system_maintenance_services | join(' ') }} --ignore maint-docker-storage-optimizer bkp-remote-to-local --timeout "{{system_maintenance_lock_timeout_storage_optimizer}}"' +ExecStartPre=/bin/sh -c '/usr/bin/python {{ path_system_lock_script }} {{ system_maintenance_services | join(' ') }} --ignore cln-docker-storage-optimizer bkp-remote-to-local --timeout "{{system_maintenance_lock_timeout_storage_optimizer}}"' ExecStart=/bin/sh -c '/usr/bin/python {{storage_optimizer_script}} --rapid-storage-path {{path_rapid_storage}} --mass-storage-path {{path_mass_storage}}' \ No newline at end of file diff --git a/roles/cln-docker-storage-optimizer/vars/main.yml b/roles/cln-docker-storage-optimizer/vars/main.yml new file mode 100644 index 00000000..521ac869 --- /dev/null +++ b/roles/cln-docker-storage-optimizer/vars/main.yml @@ -0,0 +1,3 @@ +storage_optimizer_directory: '{{path_administrator_scripts}}cln-docker-storage-optimizer/' +storage_optimizer_script: '{{storage_optimizer_directory}}cln-docker-storage-optimizer.py' +application_id: docker-storage-optimizer diff --git a/roles/cln-domains/vars/main.yml b/roles/cln-domains/vars/main.yml new file mode 100644 index 00000000..b1282f6f --- /dev/null +++ b/roles/cln-domains/vars/main.yml @@ -0,0 +1 @@ +application_id: domains diff --git a/roles/cln-failed-docker-backups/vars/main.yml b/roles/cln-failed-docker-backups/vars/main.yml index 7df3fb2b..e737fdc7 100644 --- a/roles/cln-failed-docker-backups/vars/main.yml +++ b/roles/cln-failed-docker-backups/vars/main.yml @@ -1 +1,2 @@ -cln_failed_docker_backups_pkg: cleanup-failed-docker-backups \ No newline at end of file +cln_failed_docker_backups_pkg: cleanup-failed-docker-backups +application_id: failed-docker-backups diff --git a/roles/desk-docker/vars/main.yml b/roles/desk-docker/vars/main.yml index 8961f33b..037839c4 100644 --- a/roles/desk-docker/vars/main.yml +++ b/roles/desk-docker/vars/main.yml @@ -1 +1 @@ -application_id: docker +application_id: desk-docker diff --git a/roles/desk-git/meta/main.yml b/roles/desk-git/meta/main.yml index 1fc1b023..7c9d26d8 100644 --- a/roles/desk-git/meta/main.yml +++ b/roles/desk-git/meta/main.yml @@ -17,4 +17,4 @@ galaxy_info: - git - configuration - pacman - - personal-computer \ No newline at end of file + - desktop \ No newline at end of file diff --git a/roles/docker-core/tasks/main.yml b/roles/docker-core/tasks/main.yml index 9140a458..e5d196c4 100644 --- a/roles/docker-core/tasks/main.yml +++ b/roles/docker-core/tasks/main.yml @@ -16,7 +16,7 @@ group: administrator when: run_once_docker is not defined -- name: Set docker_enabled to true, to activate maint-docker-storage-optimizer +- name: Set docker_enabled to true, to activate cln-docker-storage-optimizer set_fact: docker_enabled: true when: run_once_docker is not defined diff --git a/roles/maint-docker-storage-optimizer/handlers/main.yml b/roles/maint-docker-storage-optimizer/handlers/main.yml deleted file mode 100644 index e0523f0b..00000000 --- a/roles/maint-docker-storage-optimizer/handlers/main.yml +++ /dev/null @@ -1,5 +0,0 @@ -- name: "reload maint-docker-storage-optimizer.cymais.service" - systemd: - name: maint-docker-storage-optimizer.cymais.service - state: reloaded - daemon_reload: yes diff --git a/roles/maint-docker-storage-optimizer/tasks/main.yml b/roles/maint-docker-storage-optimizer/tasks/main.yml deleted file mode 100644 index 94280498..00000000 --- a/roles/maint-docker-storage-optimizer/tasks/main.yml +++ /dev/null @@ -1,22 +0,0 @@ -- name: "create {{storage_optimizer_directory}}" - file: - path: "{{storage_optimizer_directory}}" - state: directory - mode: 0755 - -- name: create maint-docker-storage-optimizer.cymais.service - template: - src: maint-docker-storage-optimizer.service.j2 - dest: /etc/systemd/system/maint-docker-storage-optimizer.cymais.service - notify: reload maint-docker-storage-optimizer.cymais.service - -- name: create maint-docker-storage-optimizer.py - copy: - src: maint-docker-storage-optimizer.py - dest: "{{storage_optimizer_script}}" - mode: 0755 - -- name: "optimize storage performance" - systemd: - name: maint-docker-storage-optimizer.cymais.service - state: started \ No newline at end of file diff --git a/roles/maint-docker-storage-optimizer/vars/main.yml b/roles/maint-docker-storage-optimizer/vars/main.yml deleted file mode 100644 index 1397ece6..00000000 --- a/roles/maint-docker-storage-optimizer/vars/main.yml +++ /dev/null @@ -1,3 +0,0 @@ -storage_optimizer_directory: '{{path_administrator_scripts}}maint-docker-storage-optimizer/' -storage_optimizer_script: '{{storage_optimizer_directory}}maint-docker-storage-optimizer.py' -application_id: docker-storage-optimizer diff --git a/roles/web-svc-simpleicons/vars/main.yml b/roles/web-svc-simpleicons/vars/main.yml index efec6b90..82303f46 100644 --- a/roles/web-svc-simpleicons/vars/main.yml +++ b/roles/web-svc-simpleicons/vars/main.yml @@ -1,4 +1,4 @@ -application_id: simpleicons +application_id: simpleicons container_port: 3000 simpleicons_host_server_file: "{{docker_compose.directories.config}}server.js" simpleicons_host_package_file: "{{docker_compose.directories.config}}package.json" \ No newline at end of file diff --git a/tasks/plays/02_personal-computer.yml b/tasks/plays/02_personal-computer.yml deleted file mode 100644 index b30ef830..00000000 --- a/tasks/plays/02_personal-computer.yml +++ /dev/null @@ -1,91 +0,0 @@ ---- -## pc applications -- name: "setup docker role includes for desktop pc" - include_tasks: "./tasks/groups/{{ item }}-roles.yml" - loop: - - util-desk - - desk - loop_control: - label: "{{ item }}-roles.yml" - -- name: general host setup - when: ("personal_computers" in group_names) - include_role: - name: "{{ item }}" - loop: - - util-gen-admin - - drv-non-free - -- name: util-desk-office-tools - when: ("collection_officetools" in group_names) - include_role: - name: "{{ item }}" - loop: - - util-desk-office-tools - - desk-jrnl - -- name: personal computer for business - when: ("business_personal_computer" in group_names) - include_role: - name: desk-gnucash - -- name: util-desk-design - when: ("collection_designer" in group_names) - include_role: - name: util-desk-design - -- name: desk-qbittorrent - when: ("collection_torrent" in group_names) - include_role: - name: desk-qbittorrent - -- name: desk-obs - when: ("collection_streamer" in group_names) - include_role: - name: desk-obs - -- name: desk-bluray-player - when: ("collection_bluray_player" in group_names) - include_role: - name: desk-bluray-player - -- name: GNOME setup - when: ("gnome" in group_names) - include_role: - name: desk-gnome - -- name: setup ssh client - when: ("ssh-client" in group_names) - include_role: - name: desk-ssh - -- name: setup gaming hosts - when: ("gaming" in group_names) - include_role: - name: util-desk-game-compose - -- name: setup entertainment hosts - when: ("entertainment" in group_names) - include_role: - name: desk-spotify - -- name: setup torbrowser hosts - when: ("torbrowser" in group_names) - include_role: - name: desk-torbrowser - -- name: setup nextcloud-client - when: ("nextcloud_client" in group_names) - include_role: - name: desk-nextcloud-client - -- name: setup docker - when: ("docker_client" in group_names) - include_role: - name: desk-docker - -# driver -- name: setup msi rgb keyboard - when: ("msi_perkeyrgb" in group_names) - include_role: - name: drv-msi-keyboard-color \ No newline at end of file diff --git a/tasks/plays/03_destructor.yml b/tasks/plays/03_destructor.yml deleted file mode 100644 index f9e0abd7..00000000 --- a/tasks/plays/03_destructor.yml +++ /dev/null @@ -1,15 +0,0 @@ -- name: optimize storage performance - include_role: - name: maint-docker-storage-optimizer - when: ('storage-optimizer' | application_allowed(group_names, allowed_applications)) - -- name: Cleanup Docker Anonymous Volumes - import_role: - name: cln-docker-anonymous-volumes - when: mode_cleanup | bool - -- name: Show all facts - debug: - var: ansible_facts - when: enable_debug | bool - diff --git a/tasks/plays/01_constructor.yml b/tasks/stages/01_constructor.yml similarity index 67% rename from tasks/plays/01_constructor.yml rename to tasks/stages/01_constructor.yml index af2745dc..5bc4a189 100644 --- a/tasks/plays/01_constructor.yml +++ b/tasks/stages/01_constructor.yml @@ -101,7 +101,7 @@ name: update when: mode_update | bool -- name: "Integrate Docker Role includes" +- name: "Load base roles" include_tasks: "./tasks/groups/{{ item }}-roles.yml" loop: - core @@ -111,55 +111,8 @@ - alert - mon - maint + - update + - bkp + - cln loop_control: - label: "{{ item }}-roles.yml" - -- name: setup standard wireguard - when: ('wireguard_server' | application_allowed(group_names, allowed_applications)) - include_role: - name: net-wireguard-core - -# vpn setup -- name: setup wireguard client behind firewall\nat - when: ('wireguard_behind_firewall' | application_allowed(group_names, allowed_applications)) - include_role: - name: net-wireguard-firewalled - -- name: setup wireguard client - when: ('wireguard_client' | application_allowed(group_names, allowed_applications)) - include_role: - name: net-wireguard-plain - -## backup setup -- name: setup replica backup hosts - when: ('backup_remote_to_local' | application_allowed(group_names, allowed_applications)) - include_role: - name: bkp-remote-to-local - -- name: setup backup to swappable - when: ('backup_to_usb' | application_allowed(group_names, allowed_applications)) - include_role: - name: bkp-data-to-usb - -## driver setup -- name: drv-intel - when: ('intel' | application_allowed(group_names, allowed_applications)) - include_role: - name: drv-intel - -- name: setup multiprinter hosts - when: ('epson_multiprinter' | application_allowed(group_names, allowed_applications)) - include_role: - name: drv-epson-multiprinter - - -- name: setup hibernate lid switch - when: ('drv-lid-switch' | application_allowed(group_names, allowed_applications)) - include_role: - name: drv-lid-switch - -## system setup -- name: setup swapfile hosts - when: ('swapfile' | application_allowed(group_names, allowed_applications)) - include_role: - name: maint-swapfile \ No newline at end of file + label: "{{ item }}-roles.yml" \ No newline at end of file diff --git a/tasks/stages/02_personal-computer.yml b/tasks/stages/02_personal-computer.yml new file mode 100644 index 00000000..508b8a7f --- /dev/null +++ b/tasks/stages/02_personal-computer.yml @@ -0,0 +1,16 @@ +--- +- name: "setup docker role includes for desktop pc" + include_tasks: "./tasks/groups/{{ item }}-roles.yml" + loop: + - util-srv # Services need to run before applications + - util-desk + loop_control: + label: "{{ item }}-roles.yml" + +- name: general host setup + when: ("personal_computers" in group_names) + include_role: + name: "{{ item }}" + loop: + - util-gen-admin + - drv-non-free diff --git a/tasks/plays/02_server.yml b/tasks/stages/02_server.yml similarity index 72% rename from tasks/plays/02_server.yml rename to tasks/stages/02_server.yml index c508b709..497c19d3 100644 --- a/tasks/plays/02_server.yml +++ b/tasks/stages/02_server.yml @@ -1,5 +1,5 @@ --- -- name: servers host setup +- name: Setup server base when: ("servers" in group_names) include_role: name: "{{ item }}" @@ -11,10 +11,10 @@ - mon-bot-btrfs - maint-btrfs-auto-balancer -- name: "Integrate Docker Server Roles" +- name: "Include server roles" include_tasks: "./tasks/groups/{{ item }}-roles.yml" loop: - - svc - - web + - web-svc # Services need to run before applications + - web-app loop_control: label: "{{ item }}-roles.yml" diff --git a/tasks/stages/03_destructor.yml b/tasks/stages/03_destructor.yml new file mode 100644 index 00000000..88edb54e --- /dev/null +++ b/tasks/stages/03_destructor.yml @@ -0,0 +1,6 @@ +- name: "Load destruction roles" + include_tasks: "./tasks/groups/{{ item }}-roles.yml" + loop: + - cln + loop_control: + label: "{{ item }}-roles.yml" \ No newline at end of file diff --git a/tests/integration/test_application_id_consistency.py b/tests/integration/test_application_id_consistency.py index f07db22e..421c7392 100644 --- a/tests/integration/test_application_id_consistency.py +++ b/tests/integration/test_application_id_consistency.py @@ -39,7 +39,7 @@ class TestApplicationIdConsistency(unittest.TestCase): continue actual_id = vars_data.get("application_id") - if actual_id != expected_id: + if actual_id not in [expected_id, role_name]: failed_roles.append(( role_name, f"application_id is '{actual_id}', expected '{expected_id}'" diff --git a/tests/integration/test_meta_roles_integration.py b/tests/integration/test_meta_roles_integration.py new file mode 100644 index 00000000..e033cc3e --- /dev/null +++ b/tests/integration/test_meta_roles_integration.py @@ -0,0 +1,67 @@ +import unittest +from pathlib import Path +import re +import os +import sys + +# Ensure your project root is on PYTHONPATH so filter_plugins can be imported +ROOT = Path(__file__).parents[2] +sys.path.insert(0, str(ROOT)) + +from filter_plugins.invokable_paths import get_invokable_paths + +STAGES_DIR = ROOT / "tasks" / "stages" +GROUPS_DIR = ROOT / "tasks" / "groups" + +class TestMetaRolesIntegration(unittest.TestCase): + @classmethod + def setUpClass(cls): + # Use the filter directly + cls.role_files = get_invokable_paths(suffix="-roles.yml") + cls.invokable_items = get_invokable_paths() + + # Read all playbook YAML contents under tasks/stages + cls.playbook_contents = {} + for path in STAGES_DIR.rglob("*.yml"): + cls.playbook_contents[path] = path.read_text(encoding="utf-8") + + # Regex for include_tasks line with {{ item }}-roles.yml + cls.include_pattern = re.compile( + r'include_tasks:\s*["\']\./tasks/groups/\{\{\s*item\s*\}\}-roles\.yml["\']' + ) + + def test_all_role_files_exist(self): + """Each '-roles.yml' path returned by the filter must exist in the project root.""" + missing = [] + for fname in self.role_files: + path = GROUPS_DIR / fname + if not path.is_file(): + missing.append(fname) + self.assertFalse( + missing, + f"The following role files are missing at project root: {missing}" + ) + + def test_each_invokable_item_referenced_in_playbooks(self): + """ + Each invokable item (without suffix) must be looped through in at least one playbook + and include its corresponding include_tasks entry. + """ + not_referenced = [] + for item in self.invokable_items: + found = False + loop_entry = re.compile(rf"-\s*{re.escape(item)}\b") + for content in self.playbook_contents.values(): + if self.include_pattern.search(content) and loop_entry.search(content): + found = True + break + if not found: + not_referenced.append(item) + + self.assertEqual( + not_referenced, [], + f"The following invokable items are not referenced in any playbook: {not_referenced}" + ) + +if __name__ == "__main__": + unittest.main() diff --git a/tests/integration/test_unique_application_id.py b/tests/integration/test_unique_application_id.py new file mode 100644 index 00000000..57c69162 --- /dev/null +++ b/tests/integration/test_unique_application_id.py @@ -0,0 +1,39 @@ +import os +import glob +import yaml +import unittest + + +def find_application_ids(): + """ + Scans all roles/*/vars/main.yml files and collects application_id values. + Returns a dict mapping application_id to list of file paths where it appears. + """ + ids = {} + # Wenn der Test unter tests/integration liegt, gehen wir zwei Ebenen hoch zum Projekt-Root + base_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..")) + pattern = os.path.join(base_dir, "roles", "*", "vars", "main.yml") + + for file_path in glob.glob(pattern): + with open(file_path, 'r') as f: + data = yaml.safe_load(f) or {} + app_id = data.get('application_id') + if app_id is not None: + ids.setdefault(app_id, []).append(file_path) + return ids + + +class TestUniqueApplicationId(unittest.TestCase): + def test_application_ids_are_unique(self): + ids = find_application_ids() + duplicates = {app_id: paths for app_id, paths in ids.items() if len(paths) > 1} + if duplicates: + messages = [] + for app_id, paths in duplicates.items(): + file_list = '\n '.join(paths) + messages.append(f"application_id '{app_id}' found in multiple files:\n {file_list}") + self.fail("\n\n".join(messages)) + + +if __name__ == '__main__': + unittest.main(verbosity=2) diff --git a/tests/unit/roles/maint-docker-storage-optimizer/__init__.py b/tests/unit/roles/cln-docker-storage-optimizer/__init__.py similarity index 100% rename from tests/unit/roles/maint-docker-storage-optimizer/__init__.py rename to tests/unit/roles/cln-docker-storage-optimizer/__init__.py diff --git a/tests/unit/roles/maint-docker-storage-optimizer/test_storage_optimizer.py b/tests/unit/roles/cln-docker-storage-optimizer/test_storage_optimizer.py similarity index 94% rename from tests/unit/roles/maint-docker-storage-optimizer/test_storage_optimizer.py rename to tests/unit/roles/cln-docker-storage-optimizer/test_storage_optimizer.py index 82e9efb0..4a27622b 100644 --- a/tests/unit/roles/maint-docker-storage-optimizer/test_storage_optimizer.py +++ b/tests/unit/roles/cln-docker-storage-optimizer/test_storage_optimizer.py @@ -8,7 +8,7 @@ import sys def load_optimizer_module(): module_path = os.path.abspath(os.path.join( os.path.dirname(__file__), - '..', "..", "..","..",'roles', 'maint-docker-storage-optimizer', 'files', 'maint-docker-storage-optimizer.py' + '..', "..", "..","..",'roles', 'cln-docker-storage-optimizer', 'files', 'cln-docker-storage-optimizer.py' )) spec = importlib.util.spec_from_file_location('storage_optimizer', module_path) optimizer = importlib.util.module_from_spec(spec)