diff --git a/addon/flamenco/manager/docs/Job.md b/addon/flamenco/manager/docs/Job.md index cc3a8eb5..518abd93 100644 --- a/addon/flamenco/manager/docs/Job.md +++ b/addon/flamenco/manager/docs/Job.md @@ -18,6 +18,7 @@ Name | Type | Description | Notes **metadata** | [**JobMetadata**](JobMetadata.md) | | [optional] **storage** | [**JobStorageInfo**](JobStorageInfo.md) | | [optional] **worker_tag** | **str** | Worker tag that should execute this job. When a tag ID is given, only Workers in that tag will be scheduled to work on it. If empty or ommitted, all workers can work on this job. | [optional] +**submit_as_paused** | **bool** | Whether to submit this job as paused. This is useful for jobs that should not start immediately, but only after manual intervention. | [optional] if omitted the server will use the default value of False **delete_requested_at** | **datetime** | If job deletion was requested, this is the timestamp at which that request was stored on Flamenco Manager. | [optional] **any string name** | **bool, date, datetime, dict, float, int, list, str, none_type** | any string name can be used but the value must be the correct type | [optional] diff --git a/addon/flamenco/manager/docs/JobStatus.md b/addon/flamenco/manager/docs/JobStatus.md index c7e1da07..2c1d142b 100644 --- a/addon/flamenco/manager/docs/JobStatus.md +++ b/addon/flamenco/manager/docs/JobStatus.md @@ -4,7 +4,7 @@ ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**value** | **str** | | must be one of ["active", "canceled", "completed", "failed", "paused", "queued", "cancel-requested", "requeueing", "under-construction", ] +**value** | **str** | | must be one of ["active", "canceled", "completed", "failed", "paused", "pause-requested", "queued", "cancel-requested", "requeueing", "under-construction", ] [[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/addon/flamenco/manager/docs/JobsApi.md b/addon/flamenco/manager/docs/JobsApi.md index e17890e1..911f639e 100644 --- a/addon/flamenco/manager/docs/JobsApi.md +++ b/addon/flamenco/manager/docs/JobsApi.md @@ -1296,6 +1296,7 @@ with flamenco.manager.ApiClient() as api_client: shaman_checkout_id="shaman_checkout_id_example", ), worker_tag="worker_tag_example", + submit_as_paused=False, ) # SubmittedJob | Job to submit # example passing only required values which don't have defaults set @@ -1332,7 +1333,7 @@ No authorization required | Status code | Description | Response headers | |-------------|-------------|------------------| -**200** | Job was succesfully compiled into individual tasks. | - | +**200** | Job was successfully compiled into individual tasks. | - | **412** | The given job type etag does not match the job type etag on the Manager. This is likely due to the client caching the job type for too long. | - | **0** | Error message | - | @@ -1378,6 +1379,7 @@ with flamenco.manager.ApiClient() as api_client: shaman_checkout_id="shaman_checkout_id_example", ), worker_tag="worker_tag_example", + submit_as_paused=False, ) # SubmittedJob | Job to check # example passing only required values which don't have defaults set diff --git a/addon/flamenco/manager/docs/SubmittedJob.md b/addon/flamenco/manager/docs/SubmittedJob.md index e3b22b0d..2ecf789a 100644 --- a/addon/flamenco/manager/docs/SubmittedJob.md +++ b/addon/flamenco/manager/docs/SubmittedJob.md @@ -14,6 +14,7 @@ Name | Type | Description | Notes **metadata** | [**JobMetadata**](JobMetadata.md) | | [optional] **storage** | [**JobStorageInfo**](JobStorageInfo.md) | | [optional] **worker_tag** | **str** | Worker tag that should execute this job. When a tag ID is given, only Workers in that tag will be scheduled to work on it. If empty or ommitted, all workers can work on this job. | [optional] +**submit_as_paused** | **bool** | Whether to submit this job as paused. This is useful for jobs that should not start immediately, but only after manual intervention. | [optional] if omitted the server will use the default value of False **any string name** | **bool, date, datetime, dict, float, int, list, str, none_type** | any string name can be used but the value must be the correct type | [optional] [[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/addon/flamenco/manager/model/job.py b/addon/flamenco/manager/model/job.py index 6918b169..9ef3636f 100644 --- a/addon/flamenco/manager/model/job.py +++ b/addon/flamenco/manager/model/job.py @@ -111,6 +111,7 @@ class Job(ModelComposed): 'metadata': (JobMetadata,), # noqa: E501 'storage': (JobStorageInfo,), # noqa: E501 'worker_tag': (str,), # noqa: E501 + 'submit_as_paused': (bool,), # noqa: E501 'delete_requested_at': (datetime,), # noqa: E501 } @@ -134,6 +135,7 @@ class Job(ModelComposed): 'metadata': 'metadata', # noqa: E501 'storage': 'storage', # noqa: E501 'worker_tag': 'worker_tag', # noqa: E501 + 'submit_as_paused': 'submit_as_paused', # noqa: E501 'delete_requested_at': 'delete_requested_at', # noqa: E501 } @@ -190,6 +192,7 @@ class Job(ModelComposed): metadata (JobMetadata): [optional] # noqa: E501 storage (JobStorageInfo): [optional] # noqa: E501 worker_tag (str): Worker tag that should execute this job. When a tag ID is given, only Workers in that tag will be scheduled to work on it. If empty or ommitted, all workers can work on this job. . [optional] # noqa: E501 + submit_as_paused (bool): Whether to submit this job as paused. This is useful for jobs that should not start immediately, but only after manual intervention. . [optional] if omitted the server will use the default value of False # noqa: E501 delete_requested_at (datetime): If job deletion was requested, this is the timestamp at which that request was stored on Flamenco Manager. . [optional] # noqa: E501 """ @@ -305,6 +308,7 @@ class Job(ModelComposed): metadata (JobMetadata): [optional] # noqa: E501 storage (JobStorageInfo): [optional] # noqa: E501 worker_tag (str): Worker tag that should execute this job. When a tag ID is given, only Workers in that tag will be scheduled to work on it. If empty or ommitted, all workers can work on this job. . [optional] # noqa: E501 + submit_as_paused (bool): Whether to submit this job as paused. This is useful for jobs that should not start immediately, but only after manual intervention. . [optional] if omitted the server will use the default value of False # noqa: E501 delete_requested_at (datetime): If job deletion was requested, this is the timestamp at which that request was stored on Flamenco Manager. . [optional] # noqa: E501 """ diff --git a/addon/flamenco/manager/model/job_status.py b/addon/flamenco/manager/model/job_status.py index f1e535fe..bcde8127 100644 --- a/addon/flamenco/manager/model/job_status.py +++ b/addon/flamenco/manager/model/job_status.py @@ -57,6 +57,7 @@ class JobStatus(ModelSimple): 'COMPLETED': "completed", 'FAILED': "failed", 'PAUSED': "paused", + 'PAUSE-REQUESTED': "pause-requested", 'QUEUED': "queued", 'CANCEL-REQUESTED': "cancel-requested", 'REQUEUEING': "requeueing", @@ -112,10 +113,10 @@ class JobStatus(ModelSimple): Note that value can be passed either in args or in kwargs, but not in both. Args: - args[0] (str):, must be one of ["active", "canceled", "completed", "failed", "paused", "queued", "cancel-requested", "requeueing", "under-construction", ] # noqa: E501 + args[0] (str):, must be one of ["active", "canceled", "completed", "failed", "paused", "pause-requested", "queued", "cancel-requested", "requeueing", "under-construction", ] # noqa: E501 Keyword Args: - value (str):, must be one of ["active", "canceled", "completed", "failed", "paused", "queued", "cancel-requested", "requeueing", "under-construction", ] # noqa: E501 + value (str):, must be one of ["active", "canceled", "completed", "failed", "paused", "pause-requested", "queued", "cancel-requested", "requeueing", "under-construction", ] # noqa: E501 _check_type (bool): if True, values for parameters in openapi_types will be type checked and a TypeError will be raised if the wrong type is input. @@ -202,10 +203,10 @@ class JobStatus(ModelSimple): Note that value can be passed either in args or in kwargs, but not in both. Args: - args[0] (str):, must be one of ["active", "canceled", "completed", "failed", "paused", "queued", "cancel-requested", "requeueing", "under-construction", ] # noqa: E501 + args[0] (str):, must be one of ["active", "canceled", "completed", "failed", "paused", "pause-requested", "queued", "cancel-requested", "requeueing", "under-construction", ] # noqa: E501 Keyword Args: - value (str):, must be one of ["active", "canceled", "completed", "failed", "paused", "queued", "cancel-requested", "requeueing", "under-construction", ] # noqa: E501 + value (str):, must be one of ["active", "canceled", "completed", "failed", "paused", "pause-requested", "queued", "cancel-requested", "requeueing", "under-construction", ] # noqa: E501 _check_type (bool): if True, values for parameters in openapi_types will be type checked and a TypeError will be raised if the wrong type is input. diff --git a/addon/flamenco/manager/model/submitted_job.py b/addon/flamenco/manager/model/submitted_job.py index ce91ed25..0cc34271 100644 --- a/addon/flamenco/manager/model/submitted_job.py +++ b/addon/flamenco/manager/model/submitted_job.py @@ -100,6 +100,7 @@ class SubmittedJob(ModelNormal): 'metadata': (JobMetadata,), # noqa: E501 'storage': (JobStorageInfo,), # noqa: E501 'worker_tag': (str,), # noqa: E501 + 'submit_as_paused': (bool,), # noqa: E501 } @cached_property @@ -117,6 +118,7 @@ class SubmittedJob(ModelNormal): 'metadata': 'metadata', # noqa: E501 'storage': 'storage', # noqa: E501 'worker_tag': 'worker_tag', # noqa: E501 + 'submit_as_paused': 'submit_as_paused', # noqa: E501 } read_only_vars = { @@ -171,6 +173,7 @@ class SubmittedJob(ModelNormal): metadata (JobMetadata): [optional] # noqa: E501 storage (JobStorageInfo): [optional] # noqa: E501 worker_tag (str): Worker tag that should execute this job. When a tag ID is given, only Workers in that tag will be scheduled to work on it. If empty or ommitted, all workers can work on this job. . [optional] # noqa: E501 + submit_as_paused (bool): Whether to submit this job as paused. This is useful for jobs that should not start immediately, but only after manual intervention. . [optional] if omitted the server will use the default value of False # noqa: E501 """ priority = kwargs.get('priority', 50) @@ -268,6 +271,7 @@ class SubmittedJob(ModelNormal): metadata (JobMetadata): [optional] # noqa: E501 storage (JobStorageInfo): [optional] # noqa: E501 worker_tag (str): Worker tag that should execute this job. When a tag ID is given, only Workers in that tag will be scheduled to work on it. If empty or ommitted, all workers can work on this job. . [optional] # noqa: E501 + submit_as_paused (bool): Whether to submit this job as paused. This is useful for jobs that should not start immediately, but only after manual intervention. . [optional] if omitted the server will use the default value of False # noqa: E501 """ priority = kwargs.get('priority', 50) diff --git a/addon/flamenco/manager_README.md b/addon/flamenco/manager_README.md index 38a4a737..f0c5662b 100644 --- a/addon/flamenco/manager_README.md +++ b/addon/flamenco/manager_README.md @@ -76,152 +76,152 @@ All URIs are relative to *http://localhost* Class | Method | HTTP request | Description ------------ | ------------- | ------------- | ------------- -*JobsApi* | [**delete_job**](flamenco\manager\docs/JobsApi.md#delete_job) | **DELETE** /api/v3/jobs/{job_id} | Request deletion this job, including its tasks and any log files. The actual deletion may happen in the background. No job files will be deleted (yet). -*JobsApi* | [**delete_job_mass**](flamenco\manager\docs/JobsApi.md#delete_job_mass) | **DELETE** /api/v3/jobs/mass-delete | Mark jobs for deletion, based on certain criteria. -*JobsApi* | [**delete_job_what_would_it_do**](flamenco\manager\docs/JobsApi.md#delete_job_what_would_it_do) | **GET** /api/v3/jobs/{job_id}/what-would-delete-do | Get info about what would be deleted when deleting this job. The job itself, its logs, and the last-rendered images will always be deleted. The job files are only deleted conditionally, and this operation can be used to figure that out. -*JobsApi* | [**fetch_global_last_rendered_info**](flamenco\manager\docs/JobsApi.md#fetch_global_last_rendered_info) | **GET** /api/v3/jobs/last-rendered | Get the URL that serves the last-rendered images. -*JobsApi* | [**fetch_job**](flamenco\manager\docs/JobsApi.md#fetch_job) | **GET** /api/v3/jobs/{job_id} | Fetch info about the job. -*JobsApi* | [**fetch_job_blocklist**](flamenco\manager\docs/JobsApi.md#fetch_job_blocklist) | **GET** /api/v3/jobs/{job_id}/blocklist | Fetch the list of workers that are blocked from doing certain task types on this job. -*JobsApi* | [**fetch_job_last_rendered_info**](flamenco\manager\docs/JobsApi.md#fetch_job_last_rendered_info) | **GET** /api/v3/jobs/{job_id}/last-rendered | Get the URL that serves the last-rendered images of this job. -*JobsApi* | [**fetch_job_tasks**](flamenco\manager\docs/JobsApi.md#fetch_job_tasks) | **GET** /api/v3/jobs/{job_id}/tasks | Fetch a summary of all tasks of the given job. -*JobsApi* | [**fetch_task**](flamenco\manager\docs/JobsApi.md#fetch_task) | **GET** /api/v3/tasks/{task_id} | Fetch a single task. -*JobsApi* | [**fetch_task_log_info**](flamenco\manager\docs/JobsApi.md#fetch_task_log_info) | **GET** /api/v3/tasks/{task_id}/log | Get the URL of the task log, and some more info. -*JobsApi* | [**fetch_task_log_tail**](flamenco\manager\docs/JobsApi.md#fetch_task_log_tail) | **GET** /api/v3/tasks/{task_id}/logtail | Fetch the last few lines of the task's log. -*JobsApi* | [**get_job_type**](flamenco\manager\docs/JobsApi.md#get_job_type) | **GET** /api/v3/jobs/type/{typeName} | Get single job type and its parameters. -*JobsApi* | [**get_job_types**](flamenco\manager\docs/JobsApi.md#get_job_types) | **GET** /api/v3/jobs/types | Get list of job types and their parameters. -*JobsApi* | [**query_jobs**](flamenco\manager\docs/JobsApi.md#query_jobs) | **POST** /api/v3/jobs/query | Fetch list of jobs. -*JobsApi* | [**remove_job_blocklist**](flamenco\manager\docs/JobsApi.md#remove_job_blocklist) | **DELETE** /api/v3/jobs/{job_id}/blocklist | Remove entries from a job blocklist. -*JobsApi* | [**set_job_priority**](flamenco\manager\docs/JobsApi.md#set_job_priority) | **POST** /api/v3/jobs/{job_id}/setpriority | -*JobsApi* | [**set_job_status**](flamenco\manager\docs/JobsApi.md#set_job_status) | **POST** /api/v3/jobs/{job_id}/setstatus | -*JobsApi* | [**set_task_status**](flamenco\manager\docs/JobsApi.md#set_task_status) | **POST** /api/v3/tasks/{task_id}/setstatus | -*JobsApi* | [**submit_job**](flamenco\manager\docs/JobsApi.md#submit_job) | **POST** /api/v3/jobs | Submit a new job for Flamenco Manager to execute. -*JobsApi* | [**submit_job_check**](flamenco\manager\docs/JobsApi.md#submit_job_check) | **POST** /api/v3/jobs/check | Submit a new job for Flamenco Manager to check. -*MetaApi* | [**check_blender_exe_path**](flamenco\manager\docs/MetaApi.md#check_blender_exe_path) | **POST** /api/v3/configuration/check/blender | Validate a CLI command for use as way to start Blender -*MetaApi* | [**check_shared_storage_path**](flamenco\manager\docs/MetaApi.md#check_shared_storage_path) | **POST** /api/v3/configuration/check/shared-storage | Validate a path for use as shared storage. -*MetaApi* | [**find_blender_exe_path**](flamenco\manager\docs/MetaApi.md#find_blender_exe_path) | **GET** /api/v3/configuration/check/blender | Find one or more CLI commands for use as way to start Blender -*MetaApi* | [**get_configuration**](flamenco\manager\docs/MetaApi.md#get_configuration) | **GET** /api/v3/configuration | Get the configuration of this Manager. -*MetaApi* | [**get_configuration_file**](flamenco\manager\docs/MetaApi.md#get_configuration_file) | **GET** /api/v3/configuration/file | Retrieve the configuration of Flamenco Manager. -*MetaApi* | [**get_farm_status**](flamenco\manager\docs/MetaApi.md#get_farm_status) | **GET** /api/v3/status | Get the status of this Flamenco farm. -*MetaApi* | [**get_shared_storage**](flamenco\manager\docs/MetaApi.md#get_shared_storage) | **GET** /api/v3/configuration/shared-storage/{audience}/{platform} | Get the shared storage location of this Manager, adjusted for the given audience and platform. -*MetaApi* | [**get_variables**](flamenco\manager\docs/MetaApi.md#get_variables) | **GET** /api/v3/configuration/variables/{audience}/{platform} | Get the variables of this Manager. Used by the Blender add-on to recognise two-way variables, and for the web interface to do variable replacement based on the browser's platform. -*MetaApi* | [**get_version**](flamenco\manager\docs/MetaApi.md#get_version) | **GET** /api/v3/version | Get the Flamenco version of this Manager -*MetaApi* | [**save_setup_assistant_config**](flamenco\manager\docs/MetaApi.md#save_setup_assistant_config) | **POST** /api/v3/configuration/setup-assistant | Update the Manager's configuration, and restart it in fully functional mode. -*ShamanApi* | [**shaman_checkout**](flamenco\manager\docs/ShamanApi.md#shaman_checkout) | **POST** /api/v3/shaman/checkout/create | Create a directory, and symlink the required files into it. The files must all have been uploaded to Shaman before calling this endpoint. -*ShamanApi* | [**shaman_checkout_requirements**](flamenco\manager\docs/ShamanApi.md#shaman_checkout_requirements) | **POST** /api/v3/shaman/checkout/requirements | Checks a Shaman Requirements file, and reports which files are unknown. -*ShamanApi* | [**shaman_file_store**](flamenco\manager\docs/ShamanApi.md#shaman_file_store) | **POST** /api/v3/shaman/files/{checksum}/{filesize} | Store a new file on the Shaman server. Note that the Shaman server can forcibly close the HTTP connection when another client finishes uploading the exact same file, to prevent double uploads. The file's contents should be sent in the request body. -*ShamanApi* | [**shaman_file_store_check**](flamenco\manager\docs/ShamanApi.md#shaman_file_store_check) | **GET** /api/v3/shaman/files/{checksum}/{filesize} | Check the status of a file on the Shaman server. -*WorkerApi* | [**may_worker_run**](flamenco\manager\docs/WorkerApi.md#may_worker_run) | **GET** /api/v3/worker/task/{task_id}/may-i-run | The response indicates whether the worker is allowed to run / keep running the task. Optionally contains a queued worker status change. -*WorkerApi* | [**register_worker**](flamenco\manager\docs/WorkerApi.md#register_worker) | **POST** /api/v3/worker/register-worker | Register a new worker -*WorkerApi* | [**schedule_task**](flamenco\manager\docs/WorkerApi.md#schedule_task) | **POST** /api/v3/worker/task | Obtain a new task to execute -*WorkerApi* | [**sign_off**](flamenco\manager\docs/WorkerApi.md#sign_off) | **POST** /api/v3/worker/sign-off | Mark the worker as offline -*WorkerApi* | [**sign_on**](flamenco\manager\docs/WorkerApi.md#sign_on) | **POST** /api/v3/worker/sign-on | Authenticate & sign in the worker. -*WorkerApi* | [**task_output_produced**](flamenco\manager\docs/WorkerApi.md#task_output_produced) | **POST** /api/v3/worker/task/{task_id}/output-produced | Store the most recently rendered frame here. Note that it is up to the Worker to ensure this is in a format that's digestable by the Manager. Currently only PNG and JPEG support is planned. -*WorkerApi* | [**task_update**](flamenco\manager\docs/WorkerApi.md#task_update) | **POST** /api/v3/worker/task/{task_id} | Update the task, typically to indicate progress, completion, or failure. -*WorkerApi* | [**worker_state**](flamenco\manager\docs/WorkerApi.md#worker_state) | **GET** /api/v3/worker/state | -*WorkerApi* | [**worker_state_changed**](flamenco\manager\docs/WorkerApi.md#worker_state_changed) | **POST** /api/v3/worker/state-changed | Worker changed state. This could be as acknowledgement of a Manager-requested state change, or in response to worker-local signals. -*WorkerMgtApi* | [**create_worker_tag**](flamenco\manager\docs/WorkerMgtApi.md#create_worker_tag) | **POST** /api/v3/worker-mgt/tags | Create a new worker tag. -*WorkerMgtApi* | [**delete_worker**](flamenco\manager\docs/WorkerMgtApi.md#delete_worker) | **DELETE** /api/v3/worker-mgt/workers/{worker_id} | Remove the given worker. It is recommended to only call this function when the worker is in `offline` state. If the worker is still running, stop it first. Any task still assigned to the worker will be requeued. -*WorkerMgtApi* | [**delete_worker_tag**](flamenco\manager\docs/WorkerMgtApi.md#delete_worker_tag) | **DELETE** /api/v3/worker-mgt/tag/{tag_id} | Remove this worker tag. This unassigns all workers from the tag and removes it. -*WorkerMgtApi* | [**fetch_worker**](flamenco\manager\docs/WorkerMgtApi.md#fetch_worker) | **GET** /api/v3/worker-mgt/workers/{worker_id} | Fetch info about the worker. -*WorkerMgtApi* | [**fetch_worker_sleep_schedule**](flamenco\manager\docs/WorkerMgtApi.md#fetch_worker_sleep_schedule) | **GET** /api/v3/worker-mgt/workers/{worker_id}/sleep-schedule | -*WorkerMgtApi* | [**fetch_worker_tag**](flamenco\manager\docs/WorkerMgtApi.md#fetch_worker_tag) | **GET** /api/v3/worker-mgt/tag/{tag_id} | Get a single worker tag. -*WorkerMgtApi* | [**fetch_worker_tags**](flamenco\manager\docs/WorkerMgtApi.md#fetch_worker_tags) | **GET** /api/v3/worker-mgt/tags | Get list of worker tags. -*WorkerMgtApi* | [**fetch_workers**](flamenco\manager\docs/WorkerMgtApi.md#fetch_workers) | **GET** /api/v3/worker-mgt/workers | Get list of workers. -*WorkerMgtApi* | [**request_worker_status_change**](flamenco\manager\docs/WorkerMgtApi.md#request_worker_status_change) | **POST** /api/v3/worker-mgt/workers/{worker_id}/setstatus | -*WorkerMgtApi* | [**set_worker_sleep_schedule**](flamenco\manager\docs/WorkerMgtApi.md#set_worker_sleep_schedule) | **POST** /api/v3/worker-mgt/workers/{worker_id}/sleep-schedule | -*WorkerMgtApi* | [**set_worker_tags**](flamenco\manager\docs/WorkerMgtApi.md#set_worker_tags) | **POST** /api/v3/worker-mgt/workers/{worker_id}/settags | -*WorkerMgtApi* | [**update_worker_tag**](flamenco\manager\docs/WorkerMgtApi.md#update_worker_tag) | **PUT** /api/v3/worker-mgt/tag/{tag_id} | Update an existing worker tag. +*JobsApi* | [**delete_job**](flamenco/manager/docs/JobsApi.md#delete_job) | **DELETE** /api/v3/jobs/{job_id} | Request deletion this job, including its tasks and any log files. The actual deletion may happen in the background. No job files will be deleted (yet). +*JobsApi* | [**delete_job_mass**](flamenco/manager/docs/JobsApi.md#delete_job_mass) | **DELETE** /api/v3/jobs/mass-delete | Mark jobs for deletion, based on certain criteria. +*JobsApi* | [**delete_job_what_would_it_do**](flamenco/manager/docs/JobsApi.md#delete_job_what_would_it_do) | **GET** /api/v3/jobs/{job_id}/what-would-delete-do | Get info about what would be deleted when deleting this job. The job itself, its logs, and the last-rendered images will always be deleted. The job files are only deleted conditionally, and this operation can be used to figure that out. +*JobsApi* | [**fetch_global_last_rendered_info**](flamenco/manager/docs/JobsApi.md#fetch_global_last_rendered_info) | **GET** /api/v3/jobs/last-rendered | Get the URL that serves the last-rendered images. +*JobsApi* | [**fetch_job**](flamenco/manager/docs/JobsApi.md#fetch_job) | **GET** /api/v3/jobs/{job_id} | Fetch info about the job. +*JobsApi* | [**fetch_job_blocklist**](flamenco/manager/docs/JobsApi.md#fetch_job_blocklist) | **GET** /api/v3/jobs/{job_id}/blocklist | Fetch the list of workers that are blocked from doing certain task types on this job. +*JobsApi* | [**fetch_job_last_rendered_info**](flamenco/manager/docs/JobsApi.md#fetch_job_last_rendered_info) | **GET** /api/v3/jobs/{job_id}/last-rendered | Get the URL that serves the last-rendered images of this job. +*JobsApi* | [**fetch_job_tasks**](flamenco/manager/docs/JobsApi.md#fetch_job_tasks) | **GET** /api/v3/jobs/{job_id}/tasks | Fetch a summary of all tasks of the given job. +*JobsApi* | [**fetch_task**](flamenco/manager/docs/JobsApi.md#fetch_task) | **GET** /api/v3/tasks/{task_id} | Fetch a single task. +*JobsApi* | [**fetch_task_log_info**](flamenco/manager/docs/JobsApi.md#fetch_task_log_info) | **GET** /api/v3/tasks/{task_id}/log | Get the URL of the task log, and some more info. +*JobsApi* | [**fetch_task_log_tail**](flamenco/manager/docs/JobsApi.md#fetch_task_log_tail) | **GET** /api/v3/tasks/{task_id}/logtail | Fetch the last few lines of the task's log. +*JobsApi* | [**get_job_type**](flamenco/manager/docs/JobsApi.md#get_job_type) | **GET** /api/v3/jobs/type/{typeName} | Get single job type and its parameters. +*JobsApi* | [**get_job_types**](flamenco/manager/docs/JobsApi.md#get_job_types) | **GET** /api/v3/jobs/types | Get list of job types and their parameters. +*JobsApi* | [**query_jobs**](flamenco/manager/docs/JobsApi.md#query_jobs) | **POST** /api/v3/jobs/query | Fetch list of jobs. +*JobsApi* | [**remove_job_blocklist**](flamenco/manager/docs/JobsApi.md#remove_job_blocklist) | **DELETE** /api/v3/jobs/{job_id}/blocklist | Remove entries from a job blocklist. +*JobsApi* | [**set_job_priority**](flamenco/manager/docs/JobsApi.md#set_job_priority) | **POST** /api/v3/jobs/{job_id}/setpriority | +*JobsApi* | [**set_job_status**](flamenco/manager/docs/JobsApi.md#set_job_status) | **POST** /api/v3/jobs/{job_id}/setstatus | +*JobsApi* | [**set_task_status**](flamenco/manager/docs/JobsApi.md#set_task_status) | **POST** /api/v3/tasks/{task_id}/setstatus | +*JobsApi* | [**submit_job**](flamenco/manager/docs/JobsApi.md#submit_job) | **POST** /api/v3/jobs | Submit a new job for Flamenco Manager to execute. +*JobsApi* | [**submit_job_check**](flamenco/manager/docs/JobsApi.md#submit_job_check) | **POST** /api/v3/jobs/check | Submit a new job for Flamenco Manager to check. +*MetaApi* | [**check_blender_exe_path**](flamenco/manager/docs/MetaApi.md#check_blender_exe_path) | **POST** /api/v3/configuration/check/blender | Validate a CLI command for use as way to start Blender +*MetaApi* | [**check_shared_storage_path**](flamenco/manager/docs/MetaApi.md#check_shared_storage_path) | **POST** /api/v3/configuration/check/shared-storage | Validate a path for use as shared storage. +*MetaApi* | [**find_blender_exe_path**](flamenco/manager/docs/MetaApi.md#find_blender_exe_path) | **GET** /api/v3/configuration/check/blender | Find one or more CLI commands for use as way to start Blender +*MetaApi* | [**get_configuration**](flamenco/manager/docs/MetaApi.md#get_configuration) | **GET** /api/v3/configuration | Get the configuration of this Manager. +*MetaApi* | [**get_configuration_file**](flamenco/manager/docs/MetaApi.md#get_configuration_file) | **GET** /api/v3/configuration/file | Retrieve the configuration of Flamenco Manager. +*MetaApi* | [**get_farm_status**](flamenco/manager/docs/MetaApi.md#get_farm_status) | **GET** /api/v3/status | Get the status of this Flamenco farm. +*MetaApi* | [**get_shared_storage**](flamenco/manager/docs/MetaApi.md#get_shared_storage) | **GET** /api/v3/configuration/shared-storage/{audience}/{platform} | Get the shared storage location of this Manager, adjusted for the given audience and platform. +*MetaApi* | [**get_variables**](flamenco/manager/docs/MetaApi.md#get_variables) | **GET** /api/v3/configuration/variables/{audience}/{platform} | Get the variables of this Manager. Used by the Blender add-on to recognise two-way variables, and for the web interface to do variable replacement based on the browser's platform. +*MetaApi* | [**get_version**](flamenco/manager/docs/MetaApi.md#get_version) | **GET** /api/v3/version | Get the Flamenco version of this Manager +*MetaApi* | [**save_setup_assistant_config**](flamenco/manager/docs/MetaApi.md#save_setup_assistant_config) | **POST** /api/v3/configuration/setup-assistant | Update the Manager's configuration, and restart it in fully functional mode. +*ShamanApi* | [**shaman_checkout**](flamenco/manager/docs/ShamanApi.md#shaman_checkout) | **POST** /api/v3/shaman/checkout/create | Create a directory, and symlink the required files into it. The files must all have been uploaded to Shaman before calling this endpoint. +*ShamanApi* | [**shaman_checkout_requirements**](flamenco/manager/docs/ShamanApi.md#shaman_checkout_requirements) | **POST** /api/v3/shaman/checkout/requirements | Checks a Shaman Requirements file, and reports which files are unknown. +*ShamanApi* | [**shaman_file_store**](flamenco/manager/docs/ShamanApi.md#shaman_file_store) | **POST** /api/v3/shaman/files/{checksum}/{filesize} | Store a new file on the Shaman server. Note that the Shaman server can forcibly close the HTTP connection when another client finishes uploading the exact same file, to prevent double uploads. The file's contents should be sent in the request body. +*ShamanApi* | [**shaman_file_store_check**](flamenco/manager/docs/ShamanApi.md#shaman_file_store_check) | **GET** /api/v3/shaman/files/{checksum}/{filesize} | Check the status of a file on the Shaman server. +*WorkerApi* | [**may_worker_run**](flamenco/manager/docs/WorkerApi.md#may_worker_run) | **GET** /api/v3/worker/task/{task_id}/may-i-run | The response indicates whether the worker is allowed to run / keep running the task. Optionally contains a queued worker status change. +*WorkerApi* | [**register_worker**](flamenco/manager/docs/WorkerApi.md#register_worker) | **POST** /api/v3/worker/register-worker | Register a new worker +*WorkerApi* | [**schedule_task**](flamenco/manager/docs/WorkerApi.md#schedule_task) | **POST** /api/v3/worker/task | Obtain a new task to execute +*WorkerApi* | [**sign_off**](flamenco/manager/docs/WorkerApi.md#sign_off) | **POST** /api/v3/worker/sign-off | Mark the worker as offline +*WorkerApi* | [**sign_on**](flamenco/manager/docs/WorkerApi.md#sign_on) | **POST** /api/v3/worker/sign-on | Authenticate & sign in the worker. +*WorkerApi* | [**task_output_produced**](flamenco/manager/docs/WorkerApi.md#task_output_produced) | **POST** /api/v3/worker/task/{task_id}/output-produced | Store the most recently rendered frame here. Note that it is up to the Worker to ensure this is in a format that's digestable by the Manager. Currently only PNG and JPEG support is planned. +*WorkerApi* | [**task_update**](flamenco/manager/docs/WorkerApi.md#task_update) | **POST** /api/v3/worker/task/{task_id} | Update the task, typically to indicate progress, completion, or failure. +*WorkerApi* | [**worker_state**](flamenco/manager/docs/WorkerApi.md#worker_state) | **GET** /api/v3/worker/state | +*WorkerApi* | [**worker_state_changed**](flamenco/manager/docs/WorkerApi.md#worker_state_changed) | **POST** /api/v3/worker/state-changed | Worker changed state. This could be as acknowledgement of a Manager-requested state change, or in response to worker-local signals. +*WorkerMgtApi* | [**create_worker_tag**](flamenco/manager/docs/WorkerMgtApi.md#create_worker_tag) | **POST** /api/v3/worker-mgt/tags | Create a new worker tag. +*WorkerMgtApi* | [**delete_worker**](flamenco/manager/docs/WorkerMgtApi.md#delete_worker) | **DELETE** /api/v3/worker-mgt/workers/{worker_id} | Remove the given worker. It is recommended to only call this function when the worker is in `offline` state. If the worker is still running, stop it first. Any task still assigned to the worker will be requeued. +*WorkerMgtApi* | [**delete_worker_tag**](flamenco/manager/docs/WorkerMgtApi.md#delete_worker_tag) | **DELETE** /api/v3/worker-mgt/tag/{tag_id} | Remove this worker tag. This unassigns all workers from the tag and removes it. +*WorkerMgtApi* | [**fetch_worker**](flamenco/manager/docs/WorkerMgtApi.md#fetch_worker) | **GET** /api/v3/worker-mgt/workers/{worker_id} | Fetch info about the worker. +*WorkerMgtApi* | [**fetch_worker_sleep_schedule**](flamenco/manager/docs/WorkerMgtApi.md#fetch_worker_sleep_schedule) | **GET** /api/v3/worker-mgt/workers/{worker_id}/sleep-schedule | +*WorkerMgtApi* | [**fetch_worker_tag**](flamenco/manager/docs/WorkerMgtApi.md#fetch_worker_tag) | **GET** /api/v3/worker-mgt/tag/{tag_id} | Get a single worker tag. +*WorkerMgtApi* | [**fetch_worker_tags**](flamenco/manager/docs/WorkerMgtApi.md#fetch_worker_tags) | **GET** /api/v3/worker-mgt/tags | Get list of worker tags. +*WorkerMgtApi* | [**fetch_workers**](flamenco/manager/docs/WorkerMgtApi.md#fetch_workers) | **GET** /api/v3/worker-mgt/workers | Get list of workers. +*WorkerMgtApi* | [**request_worker_status_change**](flamenco/manager/docs/WorkerMgtApi.md#request_worker_status_change) | **POST** /api/v3/worker-mgt/workers/{worker_id}/setstatus | +*WorkerMgtApi* | [**set_worker_sleep_schedule**](flamenco/manager/docs/WorkerMgtApi.md#set_worker_sleep_schedule) | **POST** /api/v3/worker-mgt/workers/{worker_id}/sleep-schedule | +*WorkerMgtApi* | [**set_worker_tags**](flamenco/manager/docs/WorkerMgtApi.md#set_worker_tags) | **POST** /api/v3/worker-mgt/workers/{worker_id}/settags | +*WorkerMgtApi* | [**update_worker_tag**](flamenco/manager/docs/WorkerMgtApi.md#update_worker_tag) | **PUT** /api/v3/worker-mgt/tag/{tag_id} | Update an existing worker tag. ## Documentation For Models - - [AssignedTask](flamenco\manager\docs/AssignedTask.md) - - [AvailableJobSetting](flamenco\manager\docs/AvailableJobSetting.md) - - [AvailableJobSettingEvalInfo](flamenco\manager\docs/AvailableJobSettingEvalInfo.md) - - [AvailableJobSettingSubtype](flamenco\manager\docs/AvailableJobSettingSubtype.md) - - [AvailableJobSettingType](flamenco\manager\docs/AvailableJobSettingType.md) - - [AvailableJobSettingVisibility](flamenco\manager\docs/AvailableJobSettingVisibility.md) - - [AvailableJobType](flamenco\manager\docs/AvailableJobType.md) - - [AvailableJobTypes](flamenco\manager\docs/AvailableJobTypes.md) - - [BlenderPathCheckResult](flamenco\manager\docs/BlenderPathCheckResult.md) - - [BlenderPathFindResult](flamenco\manager\docs/BlenderPathFindResult.md) - - [BlenderPathSource](flamenco\manager\docs/BlenderPathSource.md) - - [Command](flamenco\manager\docs/Command.md) - - [Error](flamenco\manager\docs/Error.md) - - [EventFarmStatus](flamenco\manager\docs/EventFarmStatus.md) - - [EventJobUpdate](flamenco\manager\docs/EventJobUpdate.md) - - [EventLastRenderedUpdate](flamenco\manager\docs/EventLastRenderedUpdate.md) - - [EventLifeCycle](flamenco\manager\docs/EventLifeCycle.md) - - [EventTaskLogUpdate](flamenco\manager\docs/EventTaskLogUpdate.md) - - [EventTaskUpdate](flamenco\manager\docs/EventTaskUpdate.md) - - [EventWorkerTagUpdate](flamenco\manager\docs/EventWorkerTagUpdate.md) - - [EventWorkerUpdate](flamenco\manager\docs/EventWorkerUpdate.md) - - [FarmStatus](flamenco\manager\docs/FarmStatus.md) - - [FarmStatusReport](flamenco\manager\docs/FarmStatusReport.md) - - [FlamencoVersion](flamenco\manager\docs/FlamencoVersion.md) - - [Job](flamenco\manager\docs/Job.md) - - [JobAllOf](flamenco\manager\docs/JobAllOf.md) - - [JobBlocklist](flamenco\manager\docs/JobBlocklist.md) - - [JobBlocklistEntry](flamenco\manager\docs/JobBlocklistEntry.md) - - [JobDeletionInfo](flamenco\manager\docs/JobDeletionInfo.md) - - [JobLastRenderedImageInfo](flamenco\manager\docs/JobLastRenderedImageInfo.md) - - [JobMassDeletionSelection](flamenco\manager\docs/JobMassDeletionSelection.md) - - [JobMetadata](flamenco\manager\docs/JobMetadata.md) - - [JobPriorityChange](flamenco\manager\docs/JobPriorityChange.md) - - [JobSettings](flamenco\manager\docs/JobSettings.md) - - [JobStatus](flamenco\manager\docs/JobStatus.md) - - [JobStatusChange](flamenco\manager\docs/JobStatusChange.md) - - [JobStorageInfo](flamenco\manager\docs/JobStorageInfo.md) - - [JobTasksSummary](flamenco\manager\docs/JobTasksSummary.md) - - [JobsQuery](flamenco\manager\docs/JobsQuery.md) - - [JobsQueryResult](flamenco\manager\docs/JobsQueryResult.md) - - [LifeCycleEventType](flamenco\manager\docs/LifeCycleEventType.md) - - [ManagerConfiguration](flamenco\manager\docs/ManagerConfiguration.md) - - [ManagerVariable](flamenco\manager\docs/ManagerVariable.md) - - [ManagerVariableAudience](flamenco\manager\docs/ManagerVariableAudience.md) - - [ManagerVariables](flamenco\manager\docs/ManagerVariables.md) - - [MayKeepRunning](flamenco\manager\docs/MayKeepRunning.md) - - [PathCheckInput](flamenco\manager\docs/PathCheckInput.md) - - [PathCheckResult](flamenco\manager\docs/PathCheckResult.md) - - [RegisteredWorker](flamenco\manager\docs/RegisteredWorker.md) - - [SecurityError](flamenco\manager\docs/SecurityError.md) - - [SetupAssistantConfig](flamenco\manager\docs/SetupAssistantConfig.md) - - [ShamanCheckout](flamenco\manager\docs/ShamanCheckout.md) - - [ShamanCheckoutResult](flamenco\manager\docs/ShamanCheckoutResult.md) - - [ShamanFileSpec](flamenco\manager\docs/ShamanFileSpec.md) - - [ShamanFileSpecWithStatus](flamenco\manager\docs/ShamanFileSpecWithStatus.md) - - [ShamanFileStatus](flamenco\manager\docs/ShamanFileStatus.md) - - [ShamanRequirementsRequest](flamenco\manager\docs/ShamanRequirementsRequest.md) - - [ShamanRequirementsResponse](flamenco\manager\docs/ShamanRequirementsResponse.md) - - [ShamanSingleFileStatus](flamenco\manager\docs/ShamanSingleFileStatus.md) - - [SharedStorageLocation](flamenco\manager\docs/SharedStorageLocation.md) - - [SocketIOSubscription](flamenco\manager\docs/SocketIOSubscription.md) - - [SocketIOSubscriptionOperation](flamenco\manager\docs/SocketIOSubscriptionOperation.md) - - [SocketIOSubscriptionType](flamenco\manager\docs/SocketIOSubscriptionType.md) - - [SubmittedJob](flamenco\manager\docs/SubmittedJob.md) - - [Task](flamenco\manager\docs/Task.md) - - [TaskLogInfo](flamenco\manager\docs/TaskLogInfo.md) - - [TaskStatus](flamenco\manager\docs/TaskStatus.md) - - [TaskStatusChange](flamenco\manager\docs/TaskStatusChange.md) - - [TaskSummary](flamenco\manager\docs/TaskSummary.md) - - [TaskUpdate](flamenco\manager\docs/TaskUpdate.md) - - [TaskWorker](flamenco\manager\docs/TaskWorker.md) - - [Worker](flamenco\manager\docs/Worker.md) - - [WorkerAllOf](flamenco\manager\docs/WorkerAllOf.md) - - [WorkerList](flamenco\manager\docs/WorkerList.md) - - [WorkerRegistration](flamenco\manager\docs/WorkerRegistration.md) - - [WorkerSignOn](flamenco\manager\docs/WorkerSignOn.md) - - [WorkerSleepSchedule](flamenco\manager\docs/WorkerSleepSchedule.md) - - [WorkerStateChange](flamenco\manager\docs/WorkerStateChange.md) - - [WorkerStateChanged](flamenco\manager\docs/WorkerStateChanged.md) - - [WorkerStatus](flamenco\manager\docs/WorkerStatus.md) - - [WorkerStatusChangeRequest](flamenco\manager\docs/WorkerStatusChangeRequest.md) - - [WorkerSummary](flamenco\manager\docs/WorkerSummary.md) - - [WorkerTag](flamenco\manager\docs/WorkerTag.md) - - [WorkerTagChangeRequest](flamenco\manager\docs/WorkerTagChangeRequest.md) - - [WorkerTagList](flamenco\manager\docs/WorkerTagList.md) - - [WorkerTask](flamenco\manager\docs/WorkerTask.md) - - [WorkerTaskAllOf](flamenco\manager\docs/WorkerTaskAllOf.md) + - [AssignedTask](flamenco/manager/docs/AssignedTask.md) + - [AvailableJobSetting](flamenco/manager/docs/AvailableJobSetting.md) + - [AvailableJobSettingEvalInfo](flamenco/manager/docs/AvailableJobSettingEvalInfo.md) + - [AvailableJobSettingSubtype](flamenco/manager/docs/AvailableJobSettingSubtype.md) + - [AvailableJobSettingType](flamenco/manager/docs/AvailableJobSettingType.md) + - [AvailableJobSettingVisibility](flamenco/manager/docs/AvailableJobSettingVisibility.md) + - [AvailableJobType](flamenco/manager/docs/AvailableJobType.md) + - [AvailableJobTypes](flamenco/manager/docs/AvailableJobTypes.md) + - [BlenderPathCheckResult](flamenco/manager/docs/BlenderPathCheckResult.md) + - [BlenderPathFindResult](flamenco/manager/docs/BlenderPathFindResult.md) + - [BlenderPathSource](flamenco/manager/docs/BlenderPathSource.md) + - [Command](flamenco/manager/docs/Command.md) + - [Error](flamenco/manager/docs/Error.md) + - [EventFarmStatus](flamenco/manager/docs/EventFarmStatus.md) + - [EventJobUpdate](flamenco/manager/docs/EventJobUpdate.md) + - [EventLastRenderedUpdate](flamenco/manager/docs/EventLastRenderedUpdate.md) + - [EventLifeCycle](flamenco/manager/docs/EventLifeCycle.md) + - [EventTaskLogUpdate](flamenco/manager/docs/EventTaskLogUpdate.md) + - [EventTaskUpdate](flamenco/manager/docs/EventTaskUpdate.md) + - [EventWorkerTagUpdate](flamenco/manager/docs/EventWorkerTagUpdate.md) + - [EventWorkerUpdate](flamenco/manager/docs/EventWorkerUpdate.md) + - [FarmStatus](flamenco/manager/docs/FarmStatus.md) + - [FarmStatusReport](flamenco/manager/docs/FarmStatusReport.md) + - [FlamencoVersion](flamenco/manager/docs/FlamencoVersion.md) + - [Job](flamenco/manager/docs/Job.md) + - [JobAllOf](flamenco/manager/docs/JobAllOf.md) + - [JobBlocklist](flamenco/manager/docs/JobBlocklist.md) + - [JobBlocklistEntry](flamenco/manager/docs/JobBlocklistEntry.md) + - [JobDeletionInfo](flamenco/manager/docs/JobDeletionInfo.md) + - [JobLastRenderedImageInfo](flamenco/manager/docs/JobLastRenderedImageInfo.md) + - [JobMassDeletionSelection](flamenco/manager/docs/JobMassDeletionSelection.md) + - [JobMetadata](flamenco/manager/docs/JobMetadata.md) + - [JobPriorityChange](flamenco/manager/docs/JobPriorityChange.md) + - [JobSettings](flamenco/manager/docs/JobSettings.md) + - [JobStatus](flamenco/manager/docs/JobStatus.md) + - [JobStatusChange](flamenco/manager/docs/JobStatusChange.md) + - [JobStorageInfo](flamenco/manager/docs/JobStorageInfo.md) + - [JobTasksSummary](flamenco/manager/docs/JobTasksSummary.md) + - [JobsQuery](flamenco/manager/docs/JobsQuery.md) + - [JobsQueryResult](flamenco/manager/docs/JobsQueryResult.md) + - [LifeCycleEventType](flamenco/manager/docs/LifeCycleEventType.md) + - [ManagerConfiguration](flamenco/manager/docs/ManagerConfiguration.md) + - [ManagerVariable](flamenco/manager/docs/ManagerVariable.md) + - [ManagerVariableAudience](flamenco/manager/docs/ManagerVariableAudience.md) + - [ManagerVariables](flamenco/manager/docs/ManagerVariables.md) + - [MayKeepRunning](flamenco/manager/docs/MayKeepRunning.md) + - [PathCheckInput](flamenco/manager/docs/PathCheckInput.md) + - [PathCheckResult](flamenco/manager/docs/PathCheckResult.md) + - [RegisteredWorker](flamenco/manager/docs/RegisteredWorker.md) + - [SecurityError](flamenco/manager/docs/SecurityError.md) + - [SetupAssistantConfig](flamenco/manager/docs/SetupAssistantConfig.md) + - [ShamanCheckout](flamenco/manager/docs/ShamanCheckout.md) + - [ShamanCheckoutResult](flamenco/manager/docs/ShamanCheckoutResult.md) + - [ShamanFileSpec](flamenco/manager/docs/ShamanFileSpec.md) + - [ShamanFileSpecWithStatus](flamenco/manager/docs/ShamanFileSpecWithStatus.md) + - [ShamanFileStatus](flamenco/manager/docs/ShamanFileStatus.md) + - [ShamanRequirementsRequest](flamenco/manager/docs/ShamanRequirementsRequest.md) + - [ShamanRequirementsResponse](flamenco/manager/docs/ShamanRequirementsResponse.md) + - [ShamanSingleFileStatus](flamenco/manager/docs/ShamanSingleFileStatus.md) + - [SharedStorageLocation](flamenco/manager/docs/SharedStorageLocation.md) + - [SocketIOSubscription](flamenco/manager/docs/SocketIOSubscription.md) + - [SocketIOSubscriptionOperation](flamenco/manager/docs/SocketIOSubscriptionOperation.md) + - [SocketIOSubscriptionType](flamenco/manager/docs/SocketIOSubscriptionType.md) + - [SubmittedJob](flamenco/manager/docs/SubmittedJob.md) + - [Task](flamenco/manager/docs/Task.md) + - [TaskLogInfo](flamenco/manager/docs/TaskLogInfo.md) + - [TaskStatus](flamenco/manager/docs/TaskStatus.md) + - [TaskStatusChange](flamenco/manager/docs/TaskStatusChange.md) + - [TaskSummary](flamenco/manager/docs/TaskSummary.md) + - [TaskUpdate](flamenco/manager/docs/TaskUpdate.md) + - [TaskWorker](flamenco/manager/docs/TaskWorker.md) + - [Worker](flamenco/manager/docs/Worker.md) + - [WorkerAllOf](flamenco/manager/docs/WorkerAllOf.md) + - [WorkerList](flamenco/manager/docs/WorkerList.md) + - [WorkerRegistration](flamenco/manager/docs/WorkerRegistration.md) + - [WorkerSignOn](flamenco/manager/docs/WorkerSignOn.md) + - [WorkerSleepSchedule](flamenco/manager/docs/WorkerSleepSchedule.md) + - [WorkerStateChange](flamenco/manager/docs/WorkerStateChange.md) + - [WorkerStateChanged](flamenco/manager/docs/WorkerStateChanged.md) + - [WorkerStatus](flamenco/manager/docs/WorkerStatus.md) + - [WorkerStatusChangeRequest](flamenco/manager/docs/WorkerStatusChangeRequest.md) + - [WorkerSummary](flamenco/manager/docs/WorkerSummary.md) + - [WorkerTag](flamenco/manager/docs/WorkerTag.md) + - [WorkerTagChangeRequest](flamenco/manager/docs/WorkerTagChangeRequest.md) + - [WorkerTagList](flamenco/manager/docs/WorkerTagList.md) + - [WorkerTask](flamenco/manager/docs/WorkerTask.md) + - [WorkerTaskAllOf](flamenco/manager/docs/WorkerTaskAllOf.md) ## Documentation For Authorization diff --git a/go.mod b/go.mod index 5f989ad1..30860137 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module projects.blender.org/studio/flamenco -go 1.22 +go 1.22.0 require ( github.com/adrg/xdg v0.4.0 @@ -20,15 +20,15 @@ require ( github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 github.com/google/uuid v1.5.0 github.com/graarh/golang-socketio v0.0.0-20170510162725-2c44953b9b5f - github.com/labstack/echo/v4 v4.9.1 - github.com/mattn/go-colorable v0.1.12 + github.com/labstack/echo/v4 v4.11.4 + github.com/mattn/go-colorable v0.1.13 github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 github.com/pressly/goose/v3 v3.15.1 github.com/rs/zerolog v1.26.1 github.com/stretchr/testify v1.8.4 github.com/zcalusic/sysinfo v1.0.1 github.com/ziflex/lecho/v3 v3.1.0 - golang.org/x/crypto v0.16.0 + golang.org/x/crypto v0.17.0 golang.org/x/image v0.10.0 golang.org/x/net v0.19.0 golang.org/x/sys v0.15.0 @@ -38,6 +38,7 @@ require ( ) require ( + github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/dlclark/regexp2 v1.7.0 // indirect github.com/dustin/go-humanize v1.0.1 // indirect @@ -52,17 +53,19 @@ require ( github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect - github.com/labstack/gommon v0.4.0 // indirect - github.com/mailru/easyjson v0.7.0 // indirect + github.com/josharian/intern v1.0.0 // indirect + github.com/labstack/gommon v0.4.2 // indirect + github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-isatty v0.0.20 // indirect + github.com/oapi-codegen/runtime v1.1.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect - github.com/valyala/fasttemplate v1.2.1 // indirect + github.com/valyala/fasttemplate v1.2.2 // indirect golang.org/x/mod v0.14.0 // indirect golang.org/x/sync v0.5.0 // indirect golang.org/x/text v0.14.0 // indirect - golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba // indirect + golang.org/x/time v0.5.0 // indirect golang.org/x/tools v0.16.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect lukechampine.com/uint128 v1.3.0 // indirect diff --git a/go.sum b/go.sum index ccd57485..bf63e514 100644 --- a/go.sum +++ b/go.sum @@ -1,9 +1,13 @@ +github.com/RaveNoX/go-jsoncommentstrip v1.0.0/go.mod h1:78ihd09MekBnJnxpICcwzCMzGrKSKYe4AqU6PDYYpjk= github.com/adrg/xdg v0.4.0 h1:RzRqFcjH4nE5C6oTAxhBtoE2IRyjBSa62SCbyPidvls= github.com/adrg/xdg v0.4.0/go.mod h1:N6ag73EX4wyxeaoeHctc1mas01KZgsj5tYiAIwqJE/E= github.com/alessio/shellescape v1.4.2 h1:MHPfaU+ddJ0/bYWpgIeUnQUqKrlJ1S7BfEYPM4uEoM0= github.com/alessio/shellescape v1.4.2/go.mod h1:PZAiSCk0LJaZkiCSkPv8qIobYglO3FPpyFjDCtHLS30= +github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7Dml6nw9rQ= +github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk= github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w= github.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY= github.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic= github.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= @@ -94,8 +98,11 @@ github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d/go.mod h1:2PavIy+JPciBPrBUjwbNvtwB6RQlve+hkpll6QSNmOE= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= @@ -108,12 +115,12 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= github.com/labstack/echo/v4 v4.6.1/go.mod h1:RnjgMWNDB9g/HucVWhQYNQP9PvbYf6adqftqryo7s9k= -github.com/labstack/echo/v4 v4.9.1 h1:GliPYSpzGKlyOhqIbG8nmHBo3i1saKWFOgh41AN3b+Y= -github.com/labstack/echo/v4 v4.9.1/go.mod h1:Pop5HLc+xoc4qhTZ1ip6C0RtP7Z+4VzRLWZZFKqbbjo= +github.com/labstack/echo/v4 v4.11.4 h1:vDZmA+qNeh1pd/cCkEicDMrjtrnMGQ1QFI9gWN1zGq8= +github.com/labstack/echo/v4 v4.11.4/go.mod h1:noh7EvLwqDsmh/X/HWKPUl1AjzJrhyptRyEbQJfxen8= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/labstack/gommon v0.3.1/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM= -github.com/labstack/gommon v0.4.0 h1:y7cvthEAEbU0yHOf4axH8ZG2NH8knB9iNSoTO8dyIk8= -github.com/labstack/gommon v0.4.0/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM= +github.com/labstack/gommon v0.4.2 h1:F8qTUNXgG1+6WQmqoUWnz8WiEU60mXVVw0P4ht1WRA0= +github.com/labstack/gommon v0.4.2/go.mod h1:QlUFxVM+SNXhDL/Z7YhocGIBYOiwB0mXm1+1bAPHPyU= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= github.com/lestrrat-go/backoff/v2 v2.0.8/go.mod h1:rHP/q/r9aT27n24JQLa7JhSQZCKBBOiM/uP402WwN8Y= @@ -125,19 +132,20 @@ github.com/lestrrat-go/jwx v1.2.7/go.mod h1:bw24IXWbavc0R2RsOtpXL7RtMyP589yZ1+L7 github.com/lestrrat-go/option v1.0.0/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.0 h1:aizVhC/NAAcKWb+5QsU1iNOZb4Yws5UO2I+aIprQITM= -github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y= @@ -146,6 +154,8 @@ github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/oapi-codegen/runtime v1.1.1 h1:EXLHh0DXIJnWhdRPN2w4MXAzFyE4CskzhNLUmtpMYro= +github.com/oapi-codegen/runtime v1.1.1/go.mod h1:SK9X900oXmPWilYR5/WKPzt3Kqxn/uS/+lbpREv+eCg= github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 h1:KoWmjvw+nsYOo29YJK9vDA65RGE3NrOnUtO7a+RF9HU= github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= @@ -163,6 +173,7 @@ github.com/rs/xid v1.3.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/zerolog v1.26.0/go.mod h1:yBiM87lvSqX8h0Ww4sdzNSkVYZ8dL2xjZJG1lAuGZEo= github.com/rs/zerolog v1.26.1 h1:/ihwxqH+4z8UxyI70wM1z9yCvkWcfz/a3mj48k/Zngc= github.com/rs/zerolog v1.26.1/go.mod h1:/wSSJWX7lVrsOwlbyTRSOJvqRlc+WjWlfes+CiJ+tmc= +github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad/go.mod h1:qLr4V1qq6nMqFKkMo8ZTx3f+BZEkzsRUY10Xsm2mwU0= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= @@ -178,8 +189,9 @@ github.com/ugorji/go/codec v1.2.6/go.mod h1:V6TCNZ4PHqoHGFZuSG1W8nrCzzdgA2DozYxW github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= -github.com/valyala/fasttemplate v1.2.1 h1:TVEnxayobAdVkhQfrfes2IzOB6o+z4roRkPF52WA1u4= github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= +github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= +github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= @@ -199,8 +211,8 @@ golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211215165025-cf75a172585e/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= -golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY= -golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= +golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.10.0 h1:gXjUUtwtx5yOE0VKWq1CH4IJAClq4UGgUA3i+rpON9M= golang.org/x/image v0.10.0/go.mod h1:jtrku+n79PfroUbvDdeUWMAI+heR786BofxrbiSF+J0= @@ -258,6 +270,7 @@ golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= @@ -277,8 +290,9 @@ golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba h1:O8mE0/t419eoIwhTFpKVkHiTs/Igowgfkj25AcZrtiE= golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200918232735-d647fc253266/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= diff --git a/internal/manager/api_impl/jobs.go b/internal/manager/api_impl/jobs.go index 9e9918b2..3e8a1ca7 100644 --- a/internal/manager/api_impl/jobs.go +++ b/internal/manager/api_impl/jobs.go @@ -92,6 +92,8 @@ func (f *Flamenco) SubmitJob(e echo.Context) error { logger = logger.With().Str("job_id", authoredJob.JobID).Logger() // TODO: check whether this job should be queued immediately or start paused. + // checking whether the job has + //if authoredJob.Status = api.JobStatusQueued if err := f.persist.StoreAuthoredJob(ctx, *authoredJob); err != nil { diff --git a/internal/manager/job_compilers/job_compilers.go b/internal/manager/job_compilers/job_compilers.go index db7e2520..af852265 100644 --- a/internal/manager/job_compilers/job_compilers.go +++ b/internal/manager/job_compilers/job_compilers.go @@ -111,6 +111,7 @@ func (s *Service) Compile(ctx context.Context, sj api.SubmittedJob) (*AuthoredJo Settings: make(JobSettings), Metadata: make(JobMetadata), + //SubmitAsPaused: sj.SubmitAsPaused, } if sj.Settings != nil { for key, value := range sj.Settings.AdditionalProperties { diff --git a/internal/manager/job_compilers/scripts/simple_blender_render.js b/internal/manager/job_compilers/scripts/simple_blender_render.js index d4a18672..076e6c95 100644 --- a/internal/manager/job_compilers/scripts/simple_blender_render.js +++ b/internal/manager/job_compilers/scripts/simple_blender_render.js @@ -31,6 +31,9 @@ const JOB_TYPE = { description: "File extension used when rendering images" }, { key: "has_previews", type: "bool", required: false, eval: "C.scene.render.image_settings.use_preview", visible: "hidden", description: "Whether Blender will render preview images."}, + + // Settings for demo purposes: + { key: "submit_as_paused", type: "bool", required: true, default: false, visible: "submission", description: "Submit the job in a paused state" }, ] }; diff --git a/internal/manager/task_state_machine/task_state_machine.go b/internal/manager/task_state_machine/task_state_machine.go index 38b02659..bf40aec5 100644 --- a/internal/manager/task_state_machine/task_state_machine.go +++ b/internal/manager/task_state_machine/task_state_machine.go @@ -116,8 +116,7 @@ func (sm *StateMachine) updateJobAfterTaskStatusChange( return sm.jobStatusIfAThenB(ctx, logger, job, api.JobStatusCompleted, api.JobStatusRequeueing, "task was queued") case api.TaskStatusPaused: - // Pausing a task has no impact on the job. - return nil + return sm.updateJobOnTaskStatusPaused(ctx, logger, job) case api.TaskStatusCanceled: return sm.updateJobOnTaskStatusCanceled(ctx, logger, job) @@ -180,6 +179,38 @@ func (sm *StateMachine) updateJobOnTaskStatusCanceled(ctx context.Context, logge return nil } +// updateJobOnTaskStatusPaused conditionally escalates the pausing of a task to pause the job. +func (sm *StateMachine) updateJobOnTaskStatusPaused(ctx context.Context, logger zerolog.Logger, job *persistence.Job) error { + // If no more tasks can run, pause the job. + numRunnable, _, err := sm.persist.CountTasksOfJobInStatus(ctx, job, + api.TaskStatusActive, api.TaskStatusQueued, api.TaskStatusSoftFailed) + if err != nil { + return err + } + if numRunnable == 0 { + logger.Info().Msg("paused task was last runnable task of job, pausing job") + return sm.JobStatusChange(ctx, job, api.JobStatusPaused, "paused task was last runnable task of job, pausing job") + } + + if job.Status == api.JobStatusPauseRequested { + // if the job is in pause-requested state, and all other tasks are paused, + // then the job can be paused. + numPaused, numTotal, err := sm.persist.CountTasksOfJobInStatus(ctx, job, api.TaskStatusPaused) + if err != nil { + return err + } + if numPaused == numTotal { + logger.Info().Msg("all tasks of job are paused, job is paused") + return sm.JobStatusChange(ctx, job, api.JobStatusPaused, "all tasks paused") + } + } else { + // if the job is not in pause-requested state, then some error occurred and the job should be failed. + logger.Info().Msg("task cannot be changed to paused when job is not in pause-requested state") + } + + return nil +} + // updateJobOnTaskStatusFailed conditionally escalates the failure of a task to fail the entire job. func (sm *StateMachine) updateJobOnTaskStatusFailed(ctx context.Context, logger zerolog.Logger, job *persistence.Job) error { // Count the number of failed tasks. If it is over the threshold, fail the job. @@ -382,6 +413,13 @@ func (sm *StateMachine) updateTasksAfterJobStatusChange( massTaskUpdate: true, }, err + case api.JobStatusPauseRequested: + jobStatus, err := sm.pauseTasks(ctx, logger, job) + return tasksUpdateResult{ + followingJobStatus: jobStatus, + massTaskUpdate: true, + }, err + case api.JobStatusRequeueing: jobStatus, err := sm.requeueTasks(ctx, logger, job, oldJobStatus) return tasksUpdateResult{ @@ -435,6 +473,37 @@ func (sm *StateMachine) cancelTasks( return "", nil } +func (sm *StateMachine) pauseTasks( + ctx context.Context, logger zerolog.Logger, job *persistence.Job, +) (api.JobStatus, error) { + logger.Info().Msg("pausing tasks of job") + + // Any task that might run in the future should get paused. + // Active jobs should remain active until finished + taskStatusesToPause := []api.TaskStatus{ + api.TaskStatusActive, + api.TaskStatusQueued, + api.TaskStatusCanceled, + } + err := sm.persist.UpdateJobsTaskStatusesConditional( + ctx, job, taskStatusesToPause, api.TaskStatusPaused, + fmt.Sprintf("Manager paused this task because the job got status %q.", job.Status), + ) + if err != nil { + return "", fmt.Errorf("pausing tasks of job %s: %w", job.UUID, err) + } + + // If pause was requested, it has now happened, so the job can transition. + if job.Status == api.JobStatusPauseRequested { + logger.Info().Msg("all tasks of job paused, job can go to 'paused' status") + return api.JobStatusPaused, nil + } + + // This could mean pause was triggered by failure of the job, in which case the + // job is already in the correct status. + return "", nil +} + // requeueTasks re-queues all tasks of the job. // // This function assumes that the current job status is "requeueing". diff --git a/pkg/api/flamenco-openapi.yaml b/pkg/api/flamenco-openapi.yaml index c0c8dc50..24f8275f 100644 --- a/pkg/api/flamenco-openapi.yaml +++ b/pkg/api/flamenco-openapi.yaml @@ -758,7 +758,7 @@ paths: $ref: "#/components/schemas/SubmittedJob" responses: "200": - description: Job was succesfully compiled into individual tasks. + description: Job was successfully compiled into individual tasks. content: application/json: schema: { $ref: "#/components/schemas/Job" } @@ -1680,6 +1680,7 @@ components: - completed - failed - paused + - pause-requested - queued - cancel-requested - requeueing @@ -1861,6 +1862,12 @@ components: Worker tag that should execute this job. When a tag ID is given, only Workers in that tag will be scheduled to work on it. If empty or ommitted, all workers can work on this job. + "submit_as_paused": + type: boolean + description: > + Whether to submit this job as paused. This is useful for jobs that + should not start immediately, but only after manual intervention. + default: false required: [name, type, priority, submitter_platform] example: type: "simple-blender-render" diff --git a/pkg/api/openapi_spec.gen.go b/pkg/api/openapi_spec.gen.go index f0cf7565..b0b81392 100644 --- a/pkg/api/openapi_spec.gen.go +++ b/pkg/api/openapi_spec.gen.go @@ -18,233 +18,234 @@ import ( // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", "AQA=", } diff --git a/pkg/api/openapi_types.gen.go b/pkg/api/openapi_types.gen.go index b1c66999..7a430247 100644 --- a/pkg/api/openapi_types.gen.go +++ b/pkg/api/openapi_types.gen.go @@ -84,6 +84,8 @@ const ( JobStatusFailed JobStatus = "failed" + JobStatusPauseRequested JobStatus = "pause-requested" + JobStatusPaused JobStatus = "paused" JobStatusQueued JobStatus = "queued" @@ -703,6 +705,9 @@ type SubmittedJob struct { // Storage info of a job, which Flamenco can use to remove job-related files when necessary. Storage *JobStorageInfo `json:"storage,omitempty"` + // Whether to submit this job as paused. This is useful for jobs that should not start immediately, but only after manual intervention. + SubmitAsPaused *bool `json:"submit_as_paused,omitempty"` + // Operating system of the submitter. This is used to recognise two-way variables. This should be a lower-case version of the platform, like "linux", "windows", "darwin", "openbsd", etc. Should be ompatible with Go's `runtime.GOOS`; run `go tool dist list` to get a list of possible platforms. // As a special case, the platform "manager" can be given, which will be interpreted as "the Manager's platform". This is mostly to make test/debug scripts easier, as they can use a static document on all platforms. SubmitterPlatform string `json:"submitter_platform"` diff --git a/web/app/src/components/jobs/JobActionsBar.vue b/web/app/src/components/jobs/JobActionsBar.vue index 615ffae7..eeb24eb9 100644 --- a/web/app/src/components/jobs/JobActionsBar.vue +++ b/web/app/src/components/jobs/JobActionsBar.vue @@ -8,6 +8,9 @@ + diff --git a/web/app/src/manager-api/model/Job.js b/web/app/src/manager-api/model/Job.js index a5bab8d8..cb67a17d 100644 --- a/web/app/src/manager-api/model/Job.js +++ b/web/app/src/manager-api/model/Job.js @@ -100,6 +100,9 @@ class Job { if (data.hasOwnProperty('worker_tag')) { obj['worker_tag'] = ApiClient.convertToType(data['worker_tag'], 'String'); } + if (data.hasOwnProperty('submit_as_paused')) { + obj['submit_as_paused'] = ApiClient.convertToType(data['submit_as_paused'], 'Boolean'); + } if (data.hasOwnProperty('id')) { obj['id'] = ApiClient.convertToType(data['id'], 'String'); } @@ -175,6 +178,13 @@ Job.prototype['storage'] = undefined; */ Job.prototype['worker_tag'] = undefined; +/** + * Whether to submit this job as paused. This is useful for jobs that should not start immediately, but only after manual intervention. + * @member {Boolean} submit_as_paused + * @default false + */ +Job.prototype['submit_as_paused'] = false; + /** * UUID of the Job * @member {String} id @@ -253,6 +263,12 @@ SubmittedJob.prototype['storage'] = undefined; * @member {String} worker_tag */ SubmittedJob.prototype['worker_tag'] = undefined; +/** + * Whether to submit this job as paused. This is useful for jobs that should not start immediately, but only after manual intervention. + * @member {Boolean} submit_as_paused + * @default false + */ +SubmittedJob.prototype['submit_as_paused'] = false; // Implement JobAllOf interface: /** * UUID of the Job diff --git a/web/app/src/manager-api/model/JobStatus.js b/web/app/src/manager-api/model/JobStatus.js index 169d161e..546532d6 100644 --- a/web/app/src/manager-api/model/JobStatus.js +++ b/web/app/src/manager-api/model/JobStatus.js @@ -54,6 +54,13 @@ export default class JobStatus { "paused" = "paused"; + /** + * value: "pause-requested" + * @const + */ + "pause-requested" = "pause-requested"; + + /** * value: "queued" * @const diff --git a/web/app/src/manager-api/model/SubmittedJob.js b/web/app/src/manager-api/model/SubmittedJob.js index fb0d29ed..049a7bd6 100644 --- a/web/app/src/manager-api/model/SubmittedJob.js +++ b/web/app/src/manager-api/model/SubmittedJob.js @@ -84,6 +84,9 @@ class SubmittedJob { if (data.hasOwnProperty('worker_tag')) { obj['worker_tag'] = ApiClient.convertToType(data['worker_tag'], 'String'); } + if (data.hasOwnProperty('submit_as_paused')) { + obj['submit_as_paused'] = ApiClient.convertToType(data['submit_as_paused'], 'Boolean'); + } } return obj; } @@ -141,6 +144,13 @@ SubmittedJob.prototype['storage'] = undefined; */ SubmittedJob.prototype['worker_tag'] = undefined; +/** + * Whether to submit this job as paused. This is useful for jobs that should not start immediately, but only after manual intervention. + * @member {Boolean} submit_as_paused + * @default false + */ +SubmittedJob.prototype['submit_as_paused'] = false; + diff --git a/web/app/src/stores/tasks.js b/web/app/src/stores/tasks.js index afcdf393..b5e1bdb4 100644 --- a/web/app/src/stores/tasks.js +++ b/web/app/src/stores/tasks.js @@ -18,6 +18,9 @@ export const useTasks = defineStore('tasks', { activeTaskID: '', }), getters: { + canPause() { + return this._anyTaskWithStatus(['active', 'queued', 'cancelled']); + }, canCancel() { return this._anyTaskWithStatus(['queued', 'active', 'soft-failed']); },