diff --git a/.changelogs/1.1.3/239_add_optional_delay_time_until_service_starts.yml b/.changelogs/1.1.3/239_add_optional_delay_time_until_service_starts.yml new file mode 100644 index 0000000..3d711dd --- /dev/null +++ b/.changelogs/1.1.3/239_add_optional_delay_time_until_service_starts.yml @@ -0,0 +1,2 @@ +feature: + - Add optional wait time parameter to delay execution until the service takes action (by @gyptazy). #239 diff --git a/README.md b/README.md index 5419175..74be9ac 100644 --- a/README.md +++ b/README.md @@ -267,6 +267,10 @@ The following options can be set in the configuration file `proxlb.yaml`: | | `schedule` | | | `Dict` | Schedule config block for rebalancing. | | | | interval | 12 | `Int` | How often rebalancing should occur in daemon mode.| | | | format | hours | `Str` | Sets the time format. [values: `hours` (default), `minutes`]| +| | `delay` | | | `Dict` | Schedule config block for an optional delay until the service starts. | +| | | enable | False | `Bool` | If a delay time should be validated.| +| | | time | 1 | `Int` | Delay time until the service starts after the initial execution.| +| | | format | hours | `Str` | Sets the time format. [values: `hours` (default), `minutes`]| | | log_level | | INFO | `Str` | Defines the default log level that should be logged. [values: `INFO` (default), `WARNING`, `CRITICAL`, `DEBUG`] | @@ -307,6 +311,10 @@ service: schedule: interval: 12 format: hours + delay: + enable: False + time: 1 + format: hours log_level: INFO ``` diff --git a/config/proxlb_example.yaml b/config/proxlb_example.yaml index 1235d22..234bc3a 100644 --- a/config/proxlb_example.yaml +++ b/config/proxlb_example.yaml @@ -33,4 +33,8 @@ service: schedule: interval: 12 format: hours + delay: + enable: False + time: 1 + format: hours log_level: INFO diff --git a/proxlb/main.py b/proxlb/main.py index 6d5eb56..ec1a7ca 100644 --- a/proxlb/main.py +++ b/proxlb/main.py @@ -48,6 +48,9 @@ def main(): # Update log level from config and fallback to INFO if not defined logger.set_log_level(proxlb_config.get('service', {}).get('log_level', 'INFO')) + # Validate of an optional service delay + Helper.get_service_delay(proxlb_config) + # Connect to Proxmox API & create API object proxmox_api = ProxmoxApi(proxlb_config) diff --git a/proxlb/utils/helper.py b/proxlb/utils/helper.py index 1ab6bbc..748cac7 100644 --- a/proxlb/utils/helper.py +++ b/proxlb/utils/helper.py @@ -145,6 +145,39 @@ class Helper: logger.debug("Finished: get_daemon_mode.") + @staticmethod + def get_service_delay(proxlb_config: Dict[str, Any]) -> None: + """ + Checks if a start up delay for the service is defined and waits to proceed until + the time is up. + + Parameters: + proxlb_config (Dict[str, Any]): A dictionary containing the ProxLB configuration. + + Returns: + None + """ + logger.debug("Starting: get_service_delay.") + if proxlb_config.get("service", {}).get("delay", {}).get("enable", False): + + # Convert hours to seconds + if proxlb_config["service"]["delay"].get("format", "hours") == "hours": + sleep_seconds = proxlb_config.get("service", {}).get("delay", {}).get("time", 1) * 3600 + # Convert minutes to seconds + elif proxlb_config["service"]["delay"].get("format", "hours") == "minutes": + sleep_seconds = proxlb_config.get("service", {}).get("delay", {}).get("time", 60) * 60 + else: + logger.error("Invalid format for service delay. Please use 'hours' or 'minutes'.") + sys.exit(1) + + logger.info(f"Service delay active: First run in: {proxlb_config.get('service', {}).get('delay', {}).get('time', 1)} {proxlb_config['service']['delay'].get('format', 'hours')}.") + time.sleep(sleep_seconds) + + else: + logger.debug("Service delay not active. Proceeding without delay.") + + logger.debug("Finished: get_service_delay.") + @staticmethod def print_json(proxlb_config: Dict[str, Any], print_json: bool = False) -> None: """