diff --git a/docs/ahriman.core.database.migrations.rst b/docs/ahriman.core.database.migrations.rst index 30cb7d28..b21bec7f 100644 --- a/docs/ahriman.core.database.migrations.rst +++ b/docs/ahriman.core.database.migrations.rst @@ -108,6 +108,14 @@ ahriman.core.database.migrations.m012\_last\_commit\_sha module :no-undoc-members: :show-inheritance: +ahriman.core.database.migrations.m013\_workers module +----------------------------------------------------- + +.. automodule:: ahriman.core.database.migrations.m013_workers + :members: + :no-undoc-members: + :show-inheritance: + Module contents --------------- diff --git a/docs/ahriman.core.database.operations.rst b/docs/ahriman.core.database.operations.rst index c2d38a94..afa23802 100644 --- a/docs/ahriman.core.database.operations.rst +++ b/docs/ahriman.core.database.operations.rst @@ -60,6 +60,14 @@ ahriman.core.database.operations.patch\_operations module :no-undoc-members: :show-inheritance: +ahriman.core.database.operations.workers\_operations module +----------------------------------------------------------- + +.. automodule:: ahriman.core.database.operations.workers_operations + :members: + :no-undoc-members: + :show-inheritance: + Module contents --------------- diff --git a/docs/ahriman.core.distributed.rst b/docs/ahriman.core.distributed.rst new file mode 100644 index 00000000..7158f788 --- /dev/null +++ b/docs/ahriman.core.distributed.rst @@ -0,0 +1,53 @@ +ahriman.core.distributed package +================================ + +Submodules +---------- + +ahriman.core.distributed.distributed\_system module +--------------------------------------------------- + +.. automodule:: ahriman.core.distributed.distributed_system + :members: + :no-undoc-members: + :show-inheritance: + +ahriman.core.distributed.worker\_loader\_trigger module +------------------------------------------------------- + +.. automodule:: ahriman.core.distributed.worker_loader_trigger + :members: + :no-undoc-members: + :show-inheritance: + +ahriman.core.distributed.worker\_register\_trigger module +--------------------------------------------------------- + +.. automodule:: ahriman.core.distributed.worker_register_trigger + :members: + :no-undoc-members: + :show-inheritance: + +ahriman.core.distributed.worker\_trigger module +----------------------------------------------- + +.. automodule:: ahriman.core.distributed.worker_trigger + :members: + :no-undoc-members: + :show-inheritance: + +ahriman.core.distributed.worker\_unregister\_trigger module +----------------------------------------------------------- + +.. automodule:: ahriman.core.distributed.worker_unregister_trigger + :members: + :no-undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: ahriman.core.distributed + :members: + :no-undoc-members: + :show-inheritance: diff --git a/docs/ahriman.core.rst b/docs/ahriman.core.rst index 8c3c99eb..31ca571f 100644 --- a/docs/ahriman.core.rst +++ b/docs/ahriman.core.rst @@ -12,6 +12,7 @@ Subpackages ahriman.core.build_tools ahriman.core.configuration ahriman.core.database + ahriman.core.distributed ahriman.core.formatters ahriman.core.gitremote ahriman.core.http diff --git a/docs/ahriman.web.schemas.rst b/docs/ahriman.web.schemas.rst index a3b9fcd6..f6924214 100644 --- a/docs/ahriman.web.schemas.rst +++ b/docs/ahriman.web.schemas.rst @@ -260,6 +260,22 @@ ahriman.web.schemas.versioned\_log\_schema module :no-undoc-members: :show-inheritance: +ahriman.web.schemas.worker\_id\_schema module +--------------------------------------------- + +.. automodule:: ahriman.web.schemas.worker_id_schema + :members: + :no-undoc-members: + :show-inheritance: + +ahriman.web.schemas.worker\_schema module +----------------------------------------- + +.. automodule:: ahriman.web.schemas.worker_schema + :members: + :no-undoc-members: + :show-inheritance: + Module contents --------------- diff --git a/docs/ahriman.web.views.v1.distributed.rst b/docs/ahriman.web.views.v1.distributed.rst new file mode 100644 index 00000000..452b46eb --- /dev/null +++ b/docs/ahriman.web.views.v1.distributed.rst @@ -0,0 +1,29 @@ +ahriman.web.views.v1.distributed package +======================================== + +Submodules +---------- + +ahriman.web.views.v1.distributed.worker module +---------------------------------------------- + +.. automodule:: ahriman.web.views.v1.distributed.worker + :members: + :no-undoc-members: + :show-inheritance: + +ahriman.web.views.v1.distributed.workers module +----------------------------------------------- + +.. automodule:: ahriman.web.views.v1.distributed.workers + :members: + :no-undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: ahriman.web.views.v1.distributed + :members: + :no-undoc-members: + :show-inheritance: diff --git a/docs/ahriman.web.views.v1.rst b/docs/ahriman.web.views.v1.rst index 64b29734..27c53c84 100644 --- a/docs/ahriman.web.views.v1.rst +++ b/docs/ahriman.web.views.v1.rst @@ -7,6 +7,7 @@ Subpackages .. toctree:: :maxdepth: 4 + ahriman.web.views.v1.distributed ahriman.web.views.v1.service ahriman.web.views.v1.status ahriman.web.views.v1.user diff --git a/docs/configuration.rst b/docs/configuration.rst index 67fbe86f..65d96fee 100644 --- a/docs/configuration.rst +++ b/docs/configuration.rst @@ -86,7 +86,7 @@ Build related configuration. Group name can refer to architecture, e.g. ``build: * ``triggers`` - list of ``ahriman.core.triggers.Trigger`` class implementation (e.g. ``ahriman.core.report.ReportTrigger ahriman.core.upload.UploadTrigger``) which will be loaded and run at the end of processing, space separated list of strings, optional. You can also specify triggers by their paths, e.g. ``/usr/lib/python3.10/site-packages/ahriman/core/report/report.py.ReportTrigger``. Triggers are run in the order of definition. * ``triggers_known`` - optional list of ``ahriman.core.triggers.Trigger`` class implementations which are not run automatically and used only for trigger discovery and configuration validation. * ``vcs_allowed_age`` - maximal age in seconds of the VCS packages before their version will be updated with its remote source, integer, optional, default is 7 days. -* ``workers`` - list of worker nodes addresses used for build process, space separated list of strings, optional. Each worker address must be valid and reachable url, e.g. ``https://10.0.0.1:8080``. If none set, the build process will be run on the current node. +* ``workers`` - list of worker nodes addresses used for build process, space separated list of strings, optional. Each worker address must be valid and reachable url, e.g. ``https://10.0.0.1:8080``. If none set, the build process will be run on the current node. There is also special trigger which loads this value based on the list of the discovered nodes. ``repository`` group -------------------- @@ -351,4 +351,13 @@ Requires ``boto3`` library to be installed. Section name must be either ``s3`` ( * ``chunk_size`` - chunk size for calculating entity tags, integer, optional, default 8 * 1024 * 1024. * ``object_path`` - path prefix for stored objects, string, optional. If none set, the prefix as in repository tree will be used. * ``region`` - bucket region (e.g. ``eu-central-1``), string, required. -* ``secret_key`` - AWS secret access key, string, required. \ No newline at end of file +* ``secret_key`` - AWS secret access key, string, required. + +``worker`` group +---------------- + +This section controls settings for ``ahriman.core.distributed.WorkerTrigger`` plugin. + +* ``address`` - address of the instance, string, required. Must be reachable for the master instance. +* ``identifier`` - unique identifier of the instance, string, optional. If none set, the random uuid will be generated on each run automatically. +* ``identifier_path`` - path to lock file, string, optional, default is ``/tmp/ahriman-worker-identifier``. diff --git a/docs/faq.rst b/docs/faq.rst index 3534e3b5..448138f9 100644 --- a/docs/faq.rst +++ b/docs/faq.rst @@ -1168,6 +1168,11 @@ Addition of new package, package removal, repository update In all scenarios, update process must be run only on ``master`` node. Unlike the manually distributed packages described above, automatic update must be enabled only for ``master`` node. +Automatic worker nodes discovery +"""""""""""""""""""""""""""""""" + +Instead of setting ``build.workers`` option it is also possible to configure services to load worker list dynamically. To do so, the ``ahriman.core.distributed.WorkerLoaderTrigger`` and ``ahriman.core.distributed.WorkerTrigger`` must be used for ``master`` and ``worker`` nodes repsectively. See recipes for more details. + Known limitations """"""""""""""""" diff --git a/docs/triggers.rst b/docs/triggers.rst index 9f0f3bf3..c276c098 100644 --- a/docs/triggers.rst +++ b/docs/triggers.rst @@ -14,6 +14,18 @@ Built-in triggers For the configuration details and settings explanation kindly refer to the :doc:`documentation `. +``ahriman.core.distributed.WorkerLoaderTrigger`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Special trigger to be used to load workers from database on the start of the application rather than configuration. If the option is already set, it will skip processing. + +``ahriman.core.distributed.WorkerTrigger`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Another trigger for the distributed system, which registers itself as remote worker. It calls the remote server on start (if no lock file found) and, later, it deregister itself before the stop. + +There are also two triggers which performs only registration and removal (``ahriman.core.distributed.WorkerRegisterTrigger`` and ``ahriman.core.distributed.WorkerUnregisterTrigger`` respectively), but they are not meant to be called directly. + ``ahriman.core.gitremote.RemotePullTrigger`` ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/package/share/ahriman/settings/ahriman.ini b/package/share/ahriman/settings/ahriman.ini index 6bf2d950..a6fe74f9 100644 --- a/package/share/ahriman/settings/ahriman.ini +++ b/package/share/ahriman/settings/ahriman.ini @@ -24,7 +24,7 @@ ignore_packages = makechrootpkg_flags = makepkg_flags = --nocolor --ignorearch triggers = ahriman.core.gitremote.RemotePullTrigger ahriman.core.report.ReportTrigger ahriman.core.upload.UploadTrigger ahriman.core.gitremote.RemotePushTrigger -triggers_known = ahriman.core.gitremote.RemotePullTrigger ahriman.core.gitremote.RemotePushTrigger ahriman.core.report.ReportTrigger ahriman.core.upload.UploadTrigger ahriman.core.support.KeyringTrigger ahriman.core.support.MirrorlistTrigger +triggers_known = ahriman.core.distributed.WorkerLoaderTrigger ahriman.core.distributed.WorkerRegisterTrigger ahriman.core.distributed.WorkerTrigger ahriman.core.distributed.WorkerUnregisterTrigger ahriman.core.gitremote.RemotePullTrigger ahriman.core.gitremote.RemotePushTrigger ahriman.core.report.ReportTrigger ahriman.core.upload.UploadTrigger ahriman.core.support.KeyringTrigger ahriman.core.support.MirrorlistTrigger vcs_allowed_age = 604800 [repository] diff --git a/package/share/bash-completion/completions/_ahriman b/package/share/bash-completion/completions/_ahriman index e7de6870..d802c4df 100644 --- a/package/share/bash-completion/completions/_ahriman +++ b/package/share/bash-completion/completions/_ahriman @@ -1,6 +1,6 @@ # AUTOMATICALLY GENERATED by `shtab` -_shtab_ahriman_subparsers=('aur-search' 'search' 'help-commands-unsafe' 'help' 'help-updates' 'help-version' 'version' 'package-add' 'add' 'package-update' 'package-changes' 'package-changes-remove' 'package-remove' 'remove' 'package-status' 'status' 'package-status-remove' 'package-status-update' 'status-update' 'patch-add' 'patch-list' 'patch-remove' 'patch-set-add' 'repo-backup' 'repo-check' 'check' 'repo-create-keyring' 'repo-create-mirrorlist' 'repo-daemon' 'daemon' 'repo-rebuild' 'rebuild' 'repo-remove-unknown' 'remove-unknown' 'repo-report' 'report' 'repo-restore' 'repo-sign' 'sign' 'repo-status-update' 'repo-sync' 'sync' 'repo-tree' 'repo-triggers' 'repo-update' 'update' 'service-clean' 'clean' 'repo-clean' 'service-config' 'config' 'repo-config' 'service-config-validate' 'config-validate' 'repo-config-validate' 'service-key-import' 'key-import' 'service-repositories' 'service-run' 'run' 'service-setup' 'init' 'repo-init' 'repo-setup' 'setup' 'service-shell' 'shell' 'service-tree-migrate' 'user-add' 'user-list' 'user-remove' 'web') +_shtab_ahriman_subparsers=('aur-search' 'search' 'help-commands-unsafe' 'help' 'help-updates' 'help-version' 'version' 'package-add' 'add' 'package-update' 'package-changes' 'package-changes-remove' 'package-remove' 'remove' 'package-status' 'status' 'package-status-remove' 'package-status-update' 'status-update' 'patch-add' 'patch-list' 'patch-remove' 'patch-set-add' 'repo-backup' 'repo-check' 'check' 'repo-create-keyring' 'repo-create-mirrorlist' 'repo-daemon' 'daemon' 'repo-rebuild' 'rebuild' 'repo-remove-unknown' 'remove-unknown' 'repo-report' 'report' 'repo-restore' 'repo-sign' 'sign' 'repo-status-update' 'repo-sync' 'sync' 'repo-tree' 'repo-triggers' 'repo-update' 'update' 'service-clean' 'clean' 'repo-clean' 'service-config' 'config' 'repo-config' 'service-config-validate' 'config-validate' 'repo-config-validate' 'service-key-import' 'key-import' 'service-repositories' 'service-run' 'run' 'service-setup' 'init' 'repo-init' 'repo-setup' 'setup' 'service-shell' 'shell' 'service-tree-migrate' 'service-worker-register' 'service-worker-unregister' 'user-add' 'user-list' 'user-remove' 'web') _shtab_ahriman_option_strings=('-h' '--help' '-a' '--architecture' '-c' '--configuration' '--force' '-l' '--lock' '--log-handler' '-q' '--quiet' '--report' '--no-report' '-r' '--repository' '--unsafe' '-V' '--version' '--wait-timeout') _shtab_ahriman_aur_search_option_strings=('-h' '--help' '-e' '--exit-code' '--info' '--no-info' '--sort-by') @@ -71,6 +71,8 @@ _shtab_ahriman_setup_option_strings=('-h' '--help' '--build-as-user' '--from-con _shtab_ahriman_service_shell_option_strings=('-h' '--help') _shtab_ahriman_shell_option_strings=('-h' '--help') _shtab_ahriman_service_tree_migrate_option_strings=('-h' '--help') +_shtab_ahriman_service_worker_register_option_strings=('-h' '--help') +_shtab_ahriman_service_worker_unregister_option_strings=('-h' '--help') _shtab_ahriman_user_add_option_strings=('-h' '--help' '--key' '--packager' '-p' '--password' '-R' '--role') _shtab_ahriman_user_list_option_strings=('-h' '--help' '-e' '--exit-code' '-R' '--role') _shtab_ahriman_user_remove_option_strings=('-h' '--help') @@ -78,7 +80,7 @@ _shtab_ahriman_web_option_strings=('-h' '--help') -_shtab_ahriman_pos_0_choices=('aur-search' 'search' 'help-commands-unsafe' 'help' 'help-updates' 'help-version' 'version' 'package-add' 'add' 'package-update' 'package-changes' 'package-changes-remove' 'package-remove' 'remove' 'package-status' 'status' 'package-status-remove' 'package-status-update' 'status-update' 'patch-add' 'patch-list' 'patch-remove' 'patch-set-add' 'repo-backup' 'repo-check' 'check' 'repo-create-keyring' 'repo-create-mirrorlist' 'repo-daemon' 'daemon' 'repo-rebuild' 'rebuild' 'repo-remove-unknown' 'remove-unknown' 'repo-report' 'report' 'repo-restore' 'repo-sign' 'sign' 'repo-status-update' 'repo-sync' 'sync' 'repo-tree' 'repo-triggers' 'repo-update' 'update' 'service-clean' 'clean' 'repo-clean' 'service-config' 'config' 'repo-config' 'service-config-validate' 'config-validate' 'repo-config-validate' 'service-key-import' 'key-import' 'service-repositories' 'service-run' 'run' 'service-setup' 'init' 'repo-init' 'repo-setup' 'setup' 'service-shell' 'shell' 'service-tree-migrate' 'user-add' 'user-list' 'user-remove' 'web') +_shtab_ahriman_pos_0_choices=('aur-search' 'search' 'help-commands-unsafe' 'help' 'help-updates' 'help-version' 'version' 'package-add' 'add' 'package-update' 'package-changes' 'package-changes-remove' 'package-remove' 'remove' 'package-status' 'status' 'package-status-remove' 'package-status-update' 'status-update' 'patch-add' 'patch-list' 'patch-remove' 'patch-set-add' 'repo-backup' 'repo-check' 'check' 'repo-create-keyring' 'repo-create-mirrorlist' 'repo-daemon' 'daemon' 'repo-rebuild' 'rebuild' 'repo-remove-unknown' 'remove-unknown' 'repo-report' 'report' 'repo-restore' 'repo-sign' 'sign' 'repo-status-update' 'repo-sync' 'sync' 'repo-tree' 'repo-triggers' 'repo-update' 'update' 'service-clean' 'clean' 'repo-clean' 'service-config' 'config' 'repo-config' 'service-config-validate' 'config-validate' 'repo-config-validate' 'service-key-import' 'key-import' 'service-repositories' 'service-run' 'run' 'service-setup' 'init' 'repo-init' 'repo-setup' 'setup' 'service-shell' 'shell' 'service-tree-migrate' 'service-worker-register' 'service-worker-unregister' 'user-add' 'user-list' 'user-remove' 'web') _shtab_ahriman___log_handler_choices=('console' 'syslog' 'journald') _shtab_ahriman_aur_search___sort_by_choices=('description' 'first_submitted' 'id' 'last_modified' 'maintainer' 'name' 'num_votes' 'out_of_date' 'package_base' 'package_base_id' 'popularity' 'repository' 'submitter' 'url' 'url_path' 'version') _shtab_ahriman_search___sort_by_choices=('description' 'first_submitted' 'id' 'last_modified' 'maintainer' 'name' 'num_votes' 'out_of_date' 'package_base' 'package_base_id' 'popularity' 'repository' 'submitter' 'url' 'url_path' 'version') @@ -525,6 +527,10 @@ _shtab_ahriman_shell__v_nargs=0 _shtab_ahriman_shell___verbose_nargs=0 _shtab_ahriman_service_tree_migrate__h_nargs=0 _shtab_ahriman_service_tree_migrate___help_nargs=0 +_shtab_ahriman_service_worker_register__h_nargs=0 +_shtab_ahriman_service_worker_register___help_nargs=0 +_shtab_ahriman_service_worker_unregister__h_nargs=0 +_shtab_ahriman_service_worker_unregister___help_nargs=0 _shtab_ahriman_user_add__h_nargs=0 _shtab_ahriman_user_add___help_nargs=0 _shtab_ahriman_user_list__h_nargs=0 diff --git a/package/share/man/man1/ahriman.1 b/package/share/man/man1/ahriman.1 index 50bb83fb..033e5e97 100644 --- a/package/share/man/man1/ahriman.1 +++ b/package/share/man/man1/ahriman.1 @@ -1,9 +1,9 @@ -.TH AHRIMAN "1" "2023\-12\-27" "ahriman" "Generated Python Manual" +.TH AHRIMAN "1" "2023\-12\-31" "ahriman" "Generated Python Manual" .SH NAME ahriman .SH SYNOPSIS .B ahriman -[-h] [-a ARCHITECTURE] [-c CONFIGURATION] [--force] [-l LOCK] [--log-handler {console,syslog,journald}] [-q] [--report | --no-report] [-r REPOSITORY] [--unsafe] [-V] [--wait-timeout WAIT_TIMEOUT] {aur-search,search,help-commands-unsafe,help,help-updates,help-version,version,package-add,add,package-update,package-changes,package-changes-remove,package-remove,remove,package-status,status,package-status-remove,package-status-update,status-update,patch-add,patch-list,patch-remove,patch-set-add,repo-backup,repo-check,check,repo-create-keyring,repo-create-mirrorlist,repo-daemon,daemon,repo-rebuild,rebuild,repo-remove-unknown,remove-unknown,repo-report,report,repo-restore,repo-sign,sign,repo-status-update,repo-sync,sync,repo-tree,repo-triggers,repo-update,update,service-clean,clean,repo-clean,service-config,config,repo-config,service-config-validate,config-validate,repo-config-validate,service-key-import,key-import,service-repositories,service-run,run,service-setup,init,repo-init,repo-setup,setup,service-shell,shell,service-tree-migrate,user-add,user-list,user-remove,web} ... +[-h] [-a ARCHITECTURE] [-c CONFIGURATION] [--force] [-l LOCK] [--log-handler {console,syslog,journald}] [-q] [--report | --no-report] [-r REPOSITORY] [--unsafe] [-V] [--wait-timeout WAIT_TIMEOUT] {aur-search,search,help-commands-unsafe,help,help-updates,help-version,version,package-add,add,package-update,package-changes,package-changes-remove,package-remove,remove,package-status,status,package-status-remove,package-status-update,status-update,patch-add,patch-list,patch-remove,patch-set-add,repo-backup,repo-check,check,repo-create-keyring,repo-create-mirrorlist,repo-daemon,daemon,repo-rebuild,rebuild,repo-remove-unknown,remove-unknown,repo-report,report,repo-restore,repo-sign,sign,repo-status-update,repo-sync,sync,repo-tree,repo-triggers,repo-update,update,service-clean,clean,repo-clean,service-config,config,repo-config,service-config-validate,config-validate,repo-config-validate,service-key-import,key-import,service-repositories,service-run,run,service-setup,init,repo-init,repo-setup,setup,service-shell,shell,service-tree-migrate,service-worker-register,service-worker-unregister,user-add,user-list,user-remove,web} ... .SH DESCRIPTION ArcH linux ReposItory MANager @@ -176,6 +176,12 @@ invoke python shell \fBahriman\fR \fI\,service\-tree\-migrate\/\fR migrate repository tree .TP +\fBahriman\fR \fI\,service\-worker\-register\/\fR +register itself as worker +.TP +\fBahriman\fR \fI\,service\-worker\-unregister\/\fR +unregister itself as worker +.TP \fBahriman\fR \fI\,user\-add\/\fR create or update user .TP @@ -869,6 +875,16 @@ usage: ahriman service\-tree\-migrate [\-h] migrate repository tree between versions +.SH COMMAND \fI\,'ahriman service\-worker\-register'\/\fR +usage: ahriman service\-worker\-register [\-h] + +call remote service registering itself as available worker + +.SH COMMAND \fI\,'ahriman service\-worker\-unregister'\/\fR +usage: ahriman service\-worker\-unregister [\-h] + +call remote service removing itself from list of available workers + .SH COMMAND \fI\,'ahriman user\-add'\/\fR usage: ahriman user\-add [\-h] [\-\-key KEY] [\-\-packager PACKAGER] [\-p PASSWORD] [\-R {unauthorized,read,reporter,full}] username diff --git a/package/share/zsh/site-functions/_ahriman b/package/share/zsh/site-functions/_ahriman index 5ebe47c9..6aba1c0c 100644 --- a/package/share/zsh/site-functions/_ahriman +++ b/package/share/zsh/site-functions/_ahriman @@ -65,6 +65,8 @@ _shtab_ahriman_commands() { "service-setup:create initial service configuration, requires root" "service-shell:drop into python shell" "service-tree-migrate:migrate repository tree between versions" + "service-worker-register:call remote service registering itself as available worker" + "service-worker-unregister:call remote service removing itself from list of available workers" "setup:create initial service configuration, requires root" "shell:drop into python shell" "sign:(re-)sign packages and repository database according to current settings" @@ -552,6 +554,14 @@ _shtab_ahriman_service_tree_migrate_options=( "(- : *)"{-h,--help}"[show this help message and exit]" ) +_shtab_ahriman_service_worker_register_options=( + "(- : *)"{-h,--help}"[show this help message and exit]" +) + +_shtab_ahriman_service_worker_unregister_options=( + "(- : *)"{-h,--help}"[show this help message and exit]" +) + _shtab_ahriman_setup_options=( "(- : *)"{-h,--help}"[show this help message and exit]" "--build-as-user[force makepkg user to the specific one (default\: None)]:build_as_user:" @@ -717,6 +727,8 @@ _shtab_ahriman() { service-setup) _arguments -C -s $_shtab_ahriman_service_setup_options ;; service-shell) _arguments -C -s $_shtab_ahriman_service_shell_options ;; service-tree-migrate) _arguments -C -s $_shtab_ahriman_service_tree_migrate_options ;; + service-worker-register) _arguments -C -s $_shtab_ahriman_service_worker_register_options ;; + service-worker-unregister) _arguments -C -s $_shtab_ahriman_service_worker_unregister_options ;; setup) _arguments -C -s $_shtab_ahriman_setup_options ;; shell) _arguments -C -s $_shtab_ahriman_shell_options ;; sign) _arguments -C -s $_shtab_ahriman_sign_options ;; diff --git a/recipes/distributed/README.md b/recipes/distributed/README.md index 52b3fd00..235d60b2 100644 --- a/recipes/distributed/README.md +++ b/recipes/distributed/README.md @@ -8,4 +8,4 @@ 6. All updates from worker instances are uploaded to the web service. 7. Repository is available at `http://localhost:8080/repo`. -Note, in this configuration, workers are spawned in replicated mode, thus the backend accesses them in round-robin-like manner. +In this example, worker list is automatically defined based on the addresses they reported. diff --git a/src/ahriman/core/triggers/trigger_loader.py b/src/ahriman/core/triggers/trigger_loader.py index bece4270..89d47932 100644 --- a/src/ahriman/core/triggers/trigger_loader.py +++ b/src/ahriman/core/triggers/trigger_loader.py @@ -262,6 +262,6 @@ class TriggerLoader(LazyLogging): run triggers before the application exit """ self.logger.debug("executing triggers on stop") - for trigger in self.triggers: + for trigger in reversed(self.triggers): with self.__execute_trigger(trigger): trigger.on_stop() diff --git a/tests/ahriman/application/handlers/test_handler_validate.py b/tests/ahriman/application/handlers/test_handler_validate.py index 73af3fed..2f4a4e2f 100644 --- a/tests/ahriman/application/handlers/test_handler_validate.py +++ b/tests/ahriman/application/handlers/test_handler_validate.py @@ -79,6 +79,7 @@ def test_schema(configuration: Configuration) -> None: assert schema.pop("s3") assert schema.pop("telegram") assert schema.pop("upload") + assert schema.pop("worker") assert schema == CONFIGURATION_SCHEMA diff --git a/tests/ahriman/core/distributed/test_distributed_system.py b/tests/ahriman/core/distributed/test_distributed_system.py index e6aaf93e..ec27d925 100644 --- a/tests/ahriman/core/distributed/test_distributed_system.py +++ b/tests/ahriman/core/distributed/test_distributed_system.py @@ -80,6 +80,7 @@ def test_register(distributed_system: DistributedSystem, mocker: MockerFixture) """ must register service """ + mocker.patch("ahriman.core.distributed.distributed_system.DistributedSystem.load_identifier", return_value="id") mocker.patch("pathlib.Path.is_file", return_value=False) run_mock = mocker.patch("ahriman.core.distributed.distributed_system.DistributedSystem.make_request") write_mock = mocker.patch("pathlib.Path.write_text") @@ -95,6 +96,7 @@ def test_register_skip(distributed_system: DistributedSystem, mocker: MockerFixt """ must skip service registration if it doesn't owe the identifier """ + mocker.patch("ahriman.core.distributed.distributed_system.DistributedSystem.load_identifier", return_value="id") mocker.patch("pathlib.Path.is_file", return_value=True) run_mock = mocker.patch("ahriman.core.distributed.distributed_system.DistributedSystem.make_request") write_mock = mocker.patch("pathlib.Path.write_text") @@ -109,6 +111,7 @@ def test_register_force(distributed_system: DistributedSystem, mocker: MockerFix """ must register service even if it doesn't owe the identifier if force is supplied """ + mocker.patch("ahriman.core.distributed.distributed_system.DistributedSystem.load_identifier", return_value="id") mocker.patch("pathlib.Path.is_file", return_value=True) run_mock = mocker.patch("ahriman.core.distributed.distributed_system.DistributedSystem.make_request") write_mock = mocker.patch("pathlib.Path.write_text") @@ -124,6 +127,7 @@ def test_unregister(distributed_system: DistributedSystem, mocker: MockerFixture """ must unregister service """ + mocker.patch("ahriman.core.distributed.distributed_system.DistributedSystem.load_identifier", return_value="id") run_mock = mocker.patch("ahriman.core.distributed.distributed_system.DistributedSystem.make_request") remove_mock = mocker.patch("pathlib.Path.unlink") distributed_system._owe_identifier = True @@ -138,6 +142,7 @@ def test_unregister_skip(distributed_system: DistributedSystem, mocker: MockerFi """ must skip service removal if it doesn't owe the identifier """ + mocker.patch("ahriman.core.distributed.distributed_system.DistributedSystem.load_identifier", return_value="id") run_mock = mocker.patch("ahriman.core.distributed.distributed_system.DistributedSystem.make_request") remove_mock = mocker.patch("pathlib.Path.unlink") @@ -150,6 +155,7 @@ def test_unregister_force(distributed_system: DistributedSystem, mocker: MockerF """ must remove service even if it doesn't owe the identifier if force is supplied """ + mocker.patch("ahriman.core.distributed.distributed_system.DistributedSystem.load_identifier", return_value="id") run_mock = mocker.patch("ahriman.core.distributed.distributed_system.DistributedSystem.make_request") remove_mock = mocker.patch("pathlib.Path.unlink") diff --git a/tests/testresources/core/ahriman.ini b/tests/testresources/core/ahriman.ini index 904cac17..3685f3ca 100644 --- a/tests/testresources/core/ahriman.ini +++ b/tests/testresources/core/ahriman.ini @@ -25,7 +25,7 @@ ignore_packages = makechrootpkg_flags = makepkg_flags = --skippgpcheck triggers = ahriman.core.report.ReportTrigger ahriman.core.upload.UploadTrigger -triggers_known = ahriman.core.gitremote.RemotePullTrigger ahriman.core.gitremote.RemotePushTrigger ahriman.core.report.ReportTrigger ahriman.core.upload.UploadTrigger ahriman.core.support.KeyringTrigger ahriman.core.support.MirrorlistTrigger +triggers_known = ahriman.core.distributed.WorkerLoaderTrigger ahriman.core.distributed.WorkerRegisterTrigger ahriman.core.distributed.WorkerTrigger ahriman.core.distributed.WorkerUnregisterTrigger ahriman.core.gitremote.RemotePullTrigger ahriman.core.gitremote.RemotePushTrigger ahriman.core.report.ReportTrigger ahriman.core.upload.UploadTrigger ahriman.core.support.KeyringTrigger ahriman.core.support.MirrorlistTrigger [repository] name = aur-clone