Mandatory Requirements ====================== The only mandatory requirement for **jobs** is that they must complete a defined amount of work and then terminate, as job execution is considered complete once this work is done. To specify the amount of work a job must perform, the user must define the following function: .. code-block:: async def checkCompleteness(lambdaContext: LambdaContext) -> bool: jobDone: bool = ... return jobDone The function must return a boolean value. For details on interacting with ``lambdaContext``, see the `corresponding chapter <./workflow_development.html#lambda-context>`_. For details on additional helpers available within this function, see the `corresponding chapter <./workflow_development.html#job-helpers>`_. This function must indicate whether there is remaining work to be completed in the current or subsequent job execution runs. Although there is no restriction preventing the function from always returning ``True`` (indicating that work is still pending), its presence in ``lambda_main.py`` is a mandatory requirement for creating a **workflow** and, consequently, for creating **jobs** within that **workflow**. Additional Requirements ======================= There are also several optional functions that users may define for more granular control over the **job** lifecycle, enables more flexible control over the execution time of each specific **job**, allowing resources to be freed up and utilized more optimally across all **jobs**: Execution completeness check ---------------------------- Following the same principle as defining the total amount of completed work, users may define a function that reports whether the portion of work scheduled for the current **job** execution run has been completed. Regardless of whether this function is defined, the maximum execution time for a single **job** is governed by the ``luna-lambda`` service settings. .. code-block:: async def checkExecutionCompleteness(lambdaContext: LambdaContext) -> bool: batchDone: bool = ... return batchDone The function must return a boolean value. For details on interacting with ``lambdaContext``, see the `corresponding chapter <./workflow_development.html#lambda-context>`_. For details on additional helpers available within this function, see the `corresponding chapter <./workflow_development.html#job-helpers>`_. Job busyness check ------------------ To determine whether a **job** can be terminated, the ``checkExecutionCompleteness`` function is used. However, there are cases where ``checkExecutionCompleteness`` reports that the current work is done, but some background processes still need to be completed before the **job** can be stopped. In such cases, the ``checkBusy`` function can be used. A **job** will not be considered complete — taking into account all other constraints — as long as ``checkBusy`` returns ``True`` instead of ``False``: .. code-block:: async def checkBusy(lambdaContext: LambdaContext) -> bool: jobIsBusy: bool = ... return jobIsBusy The function must return a boolean value. For details on interacting with ``lambdaContext``, see the `corresponding chapter <./workflow_development.html#lambda-context>`_. For details on additional helpers available within this function, see the `corresponding chapter <./workflow_development.html#job-helpers>`_