%global _empty_manifest_terminate_build 0 Name: python-docker-cluster-controller Version: 0.1.28 Release: 1 Summary: A simple Python class to orchestrate cluster nodes within a docker environment. License: GNU GENERAL PUBLIC LICENSE URL: https://github.com/erikdewildt/docker-cluster-controller Source0: https://mirrors.aliyun.com/pypi/web/packages/cc/ce/303e92224d779b54b14515ed2e1b4787a5da745802e264175eec4d847fc3/docker-cluster-controller-0.1.28.tar.gz BuildArch: noarch Requires: python3-Jinja2 Requires: python3-etcd Requires: python3-schedule Requires: python3-sentry-sdk Requires: python3-func-timeout %description # Docker Cluster Controller This project provides a 'clustercontroller' package which can be used to create a docker-entrypoint. In complex docker swarm setups the order in which containers are started cannot be controlled (depends_on). When there is a need to have different actions depening on boot order this has to be handled during initialisation of the container. The clustercontroller package provides a class which can be used in a docker-entrypoint. In the docker-entrypoint multiprocessing is used through methods provided by the package to start two main processes: 1. ClusterController process 2. The actual service the container needs to provide Both processes are registered and actively monitored. If one of both processes (unexpectedly) terminates the other is gracefully terminated using terminate signals. The ClusterController registers the instance in ETCD and tries to aquire a master role. Depending on the boot order of containers it will either get the master role or become slave. Depending on the role methods are executed during initialisation, during it's lifecycle any state transfer will also call appropriate actions for handling these events. During startup of the controller 'scheduled' jobs can be registered for example to perform hourly actions. It is important to only use multiprocessing task using the 'start_process' method within these time based methods to 'freeze' any other processes. ## Installation: pip install docker-cluster-controller ## Usage: 1. Build a container with a docker-entrypoint using the clustercontroller. See the docker-entrypoint.py as and example implementation. 1. Start a ETCD Cluster, see [docker-service-discovery] 2. In the docker-compose file set environment variables so the clustercontroller knows where and how to register |Environment Variable |Description | |---------------------|------------| |ETCD_HOSTS |The hostnames of the ETCD node (comma seperated) | |ETCD_PORT |The port of the ETCD node | |PORTS_WHEN_ACTIVE | The port(s) when de service has become active (e.g. 80,443,8443) |ENVIRONMENT: | A single ETCD node can be used for multimple environments, therefore the environment has to be specified. E.g. development'| |SERVICE: |The name of the service | ## Backup: To use the rotating backup functionality some environemnt variables have to be set: |Environment Variable |Description | |---------------------|------------| |BACKUP_HOURS_TO_KEEP=24 |The number of hourly backups to keep | |BACKUP_DAYS_TO_KEEP=14 |The number of daily backups to keep | |BACKUP_WEEKS_TO_KEEP=4 |The number of weekly backups to keep | |BACKUP_MONTHS_TO_KEEP=3 |The number of monthly backups to keep | |BACKUP_DESTINATION_FOLDER=backup |The backup destination folder | Within a scheduled method the backup can be called: ```python run_backup(name='myapp_backup', command=['backup_command', '-x', 'some_option', '-y', 'some_other_option']) ``` ## Filesystem locks When starting the controller a tuple with some file system paths can be specified. The controller then make sures a lockfile is created for the current container in the path(s) specified. ```python self.filesystem_locks= ('backup', ) ``` The 'get_filesystem_lock' method will return True if the current container has a lock for the path or False if another container has a lock in place. ```python self.get_filesystem_lock('backup') ``` [docker-service-discovery]: https://github.com/erikdewildt/docker-service-discovery %package -n python3-docker-cluster-controller Summary: A simple Python class to orchestrate cluster nodes within a docker environment. Provides: python-docker-cluster-controller BuildRequires: python3-devel BuildRequires: python3-setuptools BuildRequires: python3-pip %description -n python3-docker-cluster-controller # Docker Cluster Controller This project provides a 'clustercontroller' package which can be used to create a docker-entrypoint. In complex docker swarm setups the order in which containers are started cannot be controlled (depends_on). When there is a need to have different actions depening on boot order this has to be handled during initialisation of the container. The clustercontroller package provides a class which can be used in a docker-entrypoint. In the docker-entrypoint multiprocessing is used through methods provided by the package to start two main processes: 1. ClusterController process 2. The actual service the container needs to provide Both processes are registered and actively monitored. If one of both processes (unexpectedly) terminates the other is gracefully terminated using terminate signals. The ClusterController registers the instance in ETCD and tries to aquire a master role. Depending on the boot order of containers it will either get the master role or become slave. Depending on the role methods are executed during initialisation, during it's lifecycle any state transfer will also call appropriate actions for handling these events. During startup of the controller 'scheduled' jobs can be registered for example to perform hourly actions. It is important to only use multiprocessing task using the 'start_process' method within these time based methods to 'freeze' any other processes. ## Installation: pip install docker-cluster-controller ## Usage: 1. Build a container with a docker-entrypoint using the clustercontroller. See the docker-entrypoint.py as and example implementation. 1. Start a ETCD Cluster, see [docker-service-discovery] 2. In the docker-compose file set environment variables so the clustercontroller knows where and how to register |Environment Variable |Description | |---------------------|------------| |ETCD_HOSTS |The hostnames of the ETCD node (comma seperated) | |ETCD_PORT |The port of the ETCD node | |PORTS_WHEN_ACTIVE | The port(s) when de service has become active (e.g. 80,443,8443) |ENVIRONMENT: | A single ETCD node can be used for multimple environments, therefore the environment has to be specified. E.g. development'| |SERVICE: |The name of the service | ## Backup: To use the rotating backup functionality some environemnt variables have to be set: |Environment Variable |Description | |---------------------|------------| |BACKUP_HOURS_TO_KEEP=24 |The number of hourly backups to keep | |BACKUP_DAYS_TO_KEEP=14 |The number of daily backups to keep | |BACKUP_WEEKS_TO_KEEP=4 |The number of weekly backups to keep | |BACKUP_MONTHS_TO_KEEP=3 |The number of monthly backups to keep | |BACKUP_DESTINATION_FOLDER=backup |The backup destination folder | Within a scheduled method the backup can be called: ```python run_backup(name='myapp_backup', command=['backup_command', '-x', 'some_option', '-y', 'some_other_option']) ``` ## Filesystem locks When starting the controller a tuple with some file system paths can be specified. The controller then make sures a lockfile is created for the current container in the path(s) specified. ```python self.filesystem_locks= ('backup', ) ``` The 'get_filesystem_lock' method will return True if the current container has a lock for the path or False if another container has a lock in place. ```python self.get_filesystem_lock('backup') ``` [docker-service-discovery]: https://github.com/erikdewildt/docker-service-discovery %package help Summary: Development documents and examples for docker-cluster-controller Provides: python3-docker-cluster-controller-doc %description help # Docker Cluster Controller This project provides a 'clustercontroller' package which can be used to create a docker-entrypoint. In complex docker swarm setups the order in which containers are started cannot be controlled (depends_on). When there is a need to have different actions depening on boot order this has to be handled during initialisation of the container. The clustercontroller package provides a class which can be used in a docker-entrypoint. In the docker-entrypoint multiprocessing is used through methods provided by the package to start two main processes: 1. ClusterController process 2. The actual service the container needs to provide Both processes are registered and actively monitored. If one of both processes (unexpectedly) terminates the other is gracefully terminated using terminate signals. The ClusterController registers the instance in ETCD and tries to aquire a master role. Depending on the boot order of containers it will either get the master role or become slave. Depending on the role methods are executed during initialisation, during it's lifecycle any state transfer will also call appropriate actions for handling these events. During startup of the controller 'scheduled' jobs can be registered for example to perform hourly actions. It is important to only use multiprocessing task using the 'start_process' method within these time based methods to 'freeze' any other processes. ## Installation: pip install docker-cluster-controller ## Usage: 1. Build a container with a docker-entrypoint using the clustercontroller. See the docker-entrypoint.py as and example implementation. 1. Start a ETCD Cluster, see [docker-service-discovery] 2. In the docker-compose file set environment variables so the clustercontroller knows where and how to register |Environment Variable |Description | |---------------------|------------| |ETCD_HOSTS |The hostnames of the ETCD node (comma seperated) | |ETCD_PORT |The port of the ETCD node | |PORTS_WHEN_ACTIVE | The port(s) when de service has become active (e.g. 80,443,8443) |ENVIRONMENT: | A single ETCD node can be used for multimple environments, therefore the environment has to be specified. E.g. development'| |SERVICE: |The name of the service | ## Backup: To use the rotating backup functionality some environemnt variables have to be set: |Environment Variable |Description | |---------------------|------------| |BACKUP_HOURS_TO_KEEP=24 |The number of hourly backups to keep | |BACKUP_DAYS_TO_KEEP=14 |The number of daily backups to keep | |BACKUP_WEEKS_TO_KEEP=4 |The number of weekly backups to keep | |BACKUP_MONTHS_TO_KEEP=3 |The number of monthly backups to keep | |BACKUP_DESTINATION_FOLDER=backup |The backup destination folder | Within a scheduled method the backup can be called: ```python run_backup(name='myapp_backup', command=['backup_command', '-x', 'some_option', '-y', 'some_other_option']) ``` ## Filesystem locks When starting the controller a tuple with some file system paths can be specified. The controller then make sures a lockfile is created for the current container in the path(s) specified. ```python self.filesystem_locks= ('backup', ) ``` The 'get_filesystem_lock' method will return True if the current container has a lock for the path or False if another container has a lock in place. ```python self.get_filesystem_lock('backup') ``` [docker-service-discovery]: https://github.com/erikdewildt/docker-service-discovery %prep %autosetup -n docker-cluster-controller-0.1.28 %build %py3_build %install %py3_install install -d -m755 %{buildroot}/%{_pkgdocdir} if [ -d doc ]; then cp -arf doc %{buildroot}/%{_pkgdocdir}; fi if [ -d docs ]; then cp -arf docs %{buildroot}/%{_pkgdocdir}; fi if [ -d example ]; then cp -arf example %{buildroot}/%{_pkgdocdir}; fi if [ -d examples ]; then cp -arf examples %{buildroot}/%{_pkgdocdir}; fi pushd %{buildroot} if [ -d usr/lib ]; then find usr/lib -type f -printf "\"/%h/%f\"\n" >> filelist.lst fi if [ -d usr/lib64 ]; then find usr/lib64 -type f -printf "\"/%h/%f\"\n" >> filelist.lst fi if [ -d usr/bin ]; then find usr/bin -type f -printf "\"/%h/%f\"\n" >> filelist.lst fi if [ -d usr/sbin ]; then find usr/sbin -type f -printf "\"/%h/%f\"\n" >> filelist.lst fi touch doclist.lst if [ -d usr/share/man ]; then find usr/share/man -type f -printf "\"/%h/%f.gz\"\n" >> doclist.lst fi popd mv %{buildroot}/filelist.lst . mv %{buildroot}/doclist.lst . %files -n python3-docker-cluster-controller -f filelist.lst %dir %{python3_sitelib}/* %files help -f doclist.lst %{_docdir}/* %changelog * Tue Jun 20 2023 Python_Bot - 0.1.28-1 - Package Spec generated