diff --git a/addon/flamenco/manager/__init__.py b/addon/flamenco/manager/__init__.py
index 37348c6a..77d2585a 100644
--- a/addon/flamenco/manager/__init__.py
+++ b/addon/flamenco/manager/__init__.py
@@ -10,7 +10,7 @@
"""
-__version__ = "adba7217"
+__version__ = "9985860c"
# import ApiClient
from flamenco.manager.api_client import ApiClient
diff --git a/addon/flamenco/manager/api/jobs_api.py b/addon/flamenco/manager/api/jobs_api.py
index a1a5d724..d27435ae 100644
--- a/addon/flamenco/manager/api/jobs_api.py
+++ b/addon/flamenco/manager/api/jobs_api.py
@@ -31,6 +31,7 @@ from flamenco.manager.model.jobs_query import JobsQuery
from flamenco.manager.model.jobs_query_result import JobsQueryResult
from flamenco.manager.model.submitted_job import SubmittedJob
from flamenco.manager.model.task import Task
+from flamenco.manager.model.task_status_change import TaskStatusChange
class JobsApi(object):
@@ -388,6 +389,62 @@ class JobsApi(object):
},
api_client=api_client
)
+ self.set_task_status_endpoint = _Endpoint(
+ settings={
+ 'response_type': None,
+ 'auth': [],
+ 'endpoint_path': '/api/tasks/{task_id}/setstatus',
+ 'operation_id': 'set_task_status',
+ 'http_method': 'POST',
+ 'servers': None,
+ },
+ params_map={
+ 'all': [
+ 'task_id',
+ 'task_status_change',
+ ],
+ 'required': [
+ 'task_id',
+ 'task_status_change',
+ ],
+ 'nullable': [
+ ],
+ 'enum': [
+ ],
+ 'validation': [
+ ]
+ },
+ root_map={
+ 'validations': {
+ },
+ 'allowed_values': {
+ },
+ 'openapi_types': {
+ 'task_id':
+ (str,),
+ 'task_status_change':
+ (TaskStatusChange,),
+ },
+ 'attribute_map': {
+ 'task_id': 'task_id',
+ },
+ 'location_map': {
+ 'task_id': 'path',
+ 'task_status_change': 'body',
+ },
+ 'collection_format_map': {
+ }
+ },
+ headers_map={
+ 'accept': [
+ 'application/json'
+ ],
+ 'content_type': [
+ 'application/json'
+ ]
+ },
+ api_client=api_client
+ )
self.submit_job_endpoint = _Endpoint(
settings={
'response_type': (Job,),
@@ -977,6 +1034,87 @@ class JobsApi(object):
job_status_change
return self.set_job_status_endpoint.call_with_http_info(**kwargs)
+ def set_task_status(
+ self,
+ task_id,
+ task_status_change,
+ **kwargs
+ ):
+ """set_task_status # noqa: E501
+
+ This method makes a synchronous HTTP request by default. To make an
+ asynchronous HTTP request, please pass async_req=True
+
+ >>> thread = api.set_task_status(task_id, task_status_change, async_req=True)
+ >>> result = thread.get()
+
+ Args:
+ task_id (str):
+ task_status_change (TaskStatusChange): The status change to request.
+
+ Keyword Args:
+ _return_http_data_only (bool): response data without head status
+ code and headers. Default is True.
+ _preload_content (bool): if False, the urllib3.HTTPResponse object
+ will be returned without reading/decoding response data.
+ Default is True.
+ _request_timeout (int/float/tuple): timeout setting for this request. If
+ one number provided, it will be total request timeout. It can also
+ be a pair (tuple) of (connection, read) timeouts.
+ Default is None.
+ _check_input_type (bool): specifies if type checking
+ should be done one the data sent to the server.
+ Default is True.
+ _check_return_type (bool): specifies if type checking
+ should be done one the data received from the server.
+ Default is True.
+ _spec_property_naming (bool): True if the variable names in the input data
+ are serialized names, as specified in the OpenAPI document.
+ False if the variable names in the input data
+ are pythonic names, e.g. snake case (default)
+ _content_type (str/None): force body content-type.
+ Default is None and content-type will be predicted by allowed
+ content-types and body.
+ _host_index (int/None): specifies the index of the server
+ that we want to use.
+ Default is read from the configuration.
+ async_req (bool): execute request asynchronously
+
+ Returns:
+ None
+ If the method is called asynchronously, returns the request
+ thread.
+ """
+ kwargs['async_req'] = kwargs.get(
+ 'async_req', False
+ )
+ kwargs['_return_http_data_only'] = kwargs.get(
+ '_return_http_data_only', True
+ )
+ kwargs['_preload_content'] = kwargs.get(
+ '_preload_content', True
+ )
+ kwargs['_request_timeout'] = kwargs.get(
+ '_request_timeout', None
+ )
+ kwargs['_check_input_type'] = kwargs.get(
+ '_check_input_type', True
+ )
+ kwargs['_check_return_type'] = kwargs.get(
+ '_check_return_type', True
+ )
+ kwargs['_spec_property_naming'] = kwargs.get(
+ '_spec_property_naming', False
+ )
+ kwargs['_content_type'] = kwargs.get(
+ '_content_type')
+ kwargs['_host_index'] = kwargs.get('_host_index')
+ kwargs['task_id'] = \
+ task_id
+ kwargs['task_status_change'] = \
+ task_status_change
+ return self.set_task_status_endpoint.call_with_http_info(**kwargs)
+
def submit_job(
self,
submitted_job,
diff --git a/addon/flamenco/manager/api_client.py b/addon/flamenco/manager/api_client.py
index 58aa2d2a..888c0dce 100644
--- a/addon/flamenco/manager/api_client.py
+++ b/addon/flamenco/manager/api_client.py
@@ -76,7 +76,7 @@ class ApiClient(object):
self.default_headers[header_name] = header_value
self.cookie = cookie
# Set default User-Agent.
- self.user_agent = 'Flamenco/adba7217 (Blender add-on)'
+ self.user_agent = 'Flamenco/9985860c (Blender add-on)'
def __enter__(self):
return self
diff --git a/addon/flamenco/manager/configuration.py b/addon/flamenco/manager/configuration.py
index a0df5a4a..5b58645d 100644
--- a/addon/flamenco/manager/configuration.py
+++ b/addon/flamenco/manager/configuration.py
@@ -404,7 +404,7 @@ conf = flamenco.manager.Configuration(
"OS: {env}\n"\
"Python Version: {pyversion}\n"\
"Version of the API: 1.0.0\n"\
- "SDK Package Version: adba7217".\
+ "SDK Package Version: 9985860c".\
format(env=sys.platform, pyversion=sys.version)
def get_host_settings(self):
diff --git a/addon/flamenco/manager/docs/JobsApi.md b/addon/flamenco/manager/docs/JobsApi.md
index f3f90f4b..a8f37b56 100644
--- a/addon/flamenco/manager/docs/JobsApi.md
+++ b/addon/flamenco/manager/docs/JobsApi.md
@@ -11,6 +11,7 @@ Method | HTTP request | Description
[**get_job_types**](JobsApi.md#get_job_types) | **GET** /api/jobs/types | Get list of job types and their parameters.
[**query_jobs**](JobsApi.md#query_jobs) | **POST** /api/jobs/query | Fetch list of jobs.
[**set_job_status**](JobsApi.md#set_job_status) | **POST** /api/jobs/{job_id}/setstatus |
+[**set_task_status**](JobsApi.md#set_task_status) | **POST** /api/tasks/{task_id}/setstatus |
[**submit_job**](JobsApi.md#submit_job) | **POST** /api/jobs | Submit a new job for Flamenco Manager to execute.
@@ -491,6 +492,77 @@ No authorization required
[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
+# **set_task_status**
+> set_task_status(task_id, task_status_change)
+
+
+
+### Example
+
+
+```python
+import time
+import flamenco.manager
+from flamenco.manager.api import jobs_api
+from flamenco.manager.model.task_status_change import TaskStatusChange
+from flamenco.manager.model.error import Error
+from pprint import pprint
+# Defining the host is optional and defaults to http://localhost
+# See configuration.py for a list of all supported configuration parameters.
+configuration = flamenco.manager.Configuration(
+ host = "http://localhost"
+)
+
+
+# Enter a context with an instance of the API client
+with flamenco.manager.ApiClient() as api_client:
+ # Create an instance of the API class
+ api_instance = jobs_api.JobsApi(api_client)
+ task_id = "task_id_example" # str |
+ task_status_change = TaskStatusChange(
+ status=TaskStatus("active"),
+ reason="reason_example",
+ ) # TaskStatusChange | The status change to request.
+
+ # example passing only required values which don't have defaults set
+ try:
+ api_instance.set_task_status(task_id, task_status_change)
+ except flamenco.manager.ApiException as e:
+ print("Exception when calling JobsApi->set_task_status: %s\n" % e)
+```
+
+
+### Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **task_id** | **str**| |
+ **task_status_change** | [**TaskStatusChange**](TaskStatusChange.md)| The status change to request. |
+
+### Return type
+
+void (empty response body)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: application/json
+ - **Accept**: application/json
+
+
+### HTTP response details
+
+| Status code | Description | Response headers |
+|-------------|-------------|------------------|
+**204** | Status change was accepted. | - |
+**422** | The requested status change is not valid for the current status of the task. | - |
+**0** | Unexpected error. | - |
+
+[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
+
# **submit_job**
> Job submit_job(submitted_job)
diff --git a/addon/flamenco/manager/docs/TaskStatusChange.md b/addon/flamenco/manager/docs/TaskStatusChange.md
new file mode 100644
index 00000000..afb4c5f0
--- /dev/null
+++ b/addon/flamenco/manager/docs/TaskStatusChange.md
@@ -0,0 +1,13 @@
+# TaskStatusChange
+
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**status** | [**TaskStatus**](TaskStatus.md) | |
+**reason** | **str** | The reason for this status change. |
+**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/task_status_change.py b/addon/flamenco/manager/model/task_status_change.py
new file mode 100644
index 00000000..0703e1d1
--- /dev/null
+++ b/addon/flamenco/manager/model/task_status_change.py
@@ -0,0 +1,273 @@
+"""
+ Flamenco manager
+
+ Render Farm manager API # noqa: E501
+
+ The version of the OpenAPI document: 1.0.0
+ Generated by: https://openapi-generator.tech
+"""
+
+
+import re # noqa: F401
+import sys # noqa: F401
+
+from flamenco.manager.model_utils import ( # noqa: F401
+ ApiTypeError,
+ ModelComposed,
+ ModelNormal,
+ ModelSimple,
+ cached_property,
+ change_keys_js_to_python,
+ convert_js_args_to_python_args,
+ date,
+ datetime,
+ file_type,
+ none_type,
+ validate_get_composed_info,
+ OpenApiModel
+)
+from flamenco.manager.exceptions import ApiAttributeError
+
+
+def lazy_import():
+ from flamenco.manager.model.task_status import TaskStatus
+ globals()['TaskStatus'] = TaskStatus
+
+
+class TaskStatusChange(ModelNormal):
+ """NOTE: This class is auto generated by OpenAPI Generator.
+ Ref: https://openapi-generator.tech
+
+ Do not edit the class manually.
+
+ Attributes:
+ allowed_values (dict): The key is the tuple path to the attribute
+ and the for var_name this is (var_name,). The value is a dict
+ with a capitalized key describing the allowed value and an allowed
+ value. These dicts store the allowed enum values.
+ attribute_map (dict): The key is attribute name
+ and the value is json key in definition.
+ discriminator_value_class_map (dict): A dict to go from the discriminator
+ variable value to the discriminator class name.
+ validations (dict): The key is the tuple path to the attribute
+ and the for var_name this is (var_name,). The value is a dict
+ that stores validations for max_length, min_length, max_items,
+ min_items, exclusive_maximum, inclusive_maximum, exclusive_minimum,
+ inclusive_minimum, and regex.
+ additional_properties_type (tuple): A tuple of classes accepted
+ as additional properties values.
+ """
+
+ allowed_values = {
+ }
+
+ validations = {
+ }
+
+ @cached_property
+ def additional_properties_type():
+ """
+ This must be a method because a model may have properties that are
+ of type self, this must run after the class is loaded
+ """
+ lazy_import()
+ return (bool, date, datetime, dict, float, int, list, str, none_type,) # noqa: E501
+
+ _nullable = False
+
+ @cached_property
+ def openapi_types():
+ """
+ This must be a method because a model may have properties that are
+ of type self, this must run after the class is loaded
+
+ Returns
+ openapi_types (dict): The key is attribute name
+ and the value is attribute type.
+ """
+ lazy_import()
+ return {
+ 'status': (TaskStatus,), # noqa: E501
+ 'reason': (str,), # noqa: E501
+ }
+
+ @cached_property
+ def discriminator():
+ return None
+
+
+ attribute_map = {
+ 'status': 'status', # noqa: E501
+ 'reason': 'reason', # noqa: E501
+ }
+
+ read_only_vars = {
+ }
+
+ _composed_schemas = {}
+
+ @classmethod
+ @convert_js_args_to_python_args
+ def _from_openapi_data(cls, status, reason, *args, **kwargs): # noqa: E501
+ """TaskStatusChange - a model defined in OpenAPI
+
+ Args:
+ status (TaskStatus):
+ reason (str): The reason for this status change.
+
+ Keyword Args:
+ _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.
+ Defaults to True
+ _path_to_item (tuple/list): This is a list of keys or values to
+ drill down to the model in received_data
+ when deserializing a response
+ _spec_property_naming (bool): True if the variable names in the input data
+ are serialized names, as specified in the OpenAPI document.
+ False if the variable names in the input data
+ are pythonic names, e.g. snake case (default)
+ _configuration (Configuration): the instance to use when
+ deserializing a file_type parameter.
+ If passed, type conversion is attempted
+ If omitted no type conversion is done.
+ _visited_composed_classes (tuple): This stores a tuple of
+ classes that we have traveled through so that
+ if we see that class again we will not use its
+ discriminator again.
+ When traveling through a discriminator, the
+ composed schema that is
+ is traveled through is added to this set.
+ For example if Animal has a discriminator
+ petType and we pass in "Dog", and the class Dog
+ allOf includes Animal, we move through Animal
+ once using the discriminator, and pick Dog.
+ Then in Dog, we will make an instance of the
+ Animal class but this time we won't travel
+ through its discriminator because we passed in
+ _visited_composed_classes = (Animal,)
+ """
+
+ _check_type = kwargs.pop('_check_type', True)
+ _spec_property_naming = kwargs.pop('_spec_property_naming', False)
+ _path_to_item = kwargs.pop('_path_to_item', ())
+ _configuration = kwargs.pop('_configuration', None)
+ _visited_composed_classes = kwargs.pop('_visited_composed_classes', ())
+
+ self = super(OpenApiModel, cls).__new__(cls)
+
+ if args:
+ raise ApiTypeError(
+ "Invalid positional arguments=%s passed to %s. Remove those invalid positional arguments." % (
+ args,
+ self.__class__.__name__,
+ ),
+ path_to_item=_path_to_item,
+ valid_classes=(self.__class__,),
+ )
+
+ self._data_store = {}
+ self._check_type = _check_type
+ self._spec_property_naming = _spec_property_naming
+ self._path_to_item = _path_to_item
+ self._configuration = _configuration
+ self._visited_composed_classes = _visited_composed_classes + (self.__class__,)
+
+ self.status = status
+ self.reason = reason
+ for var_name, var_value in kwargs.items():
+ if var_name not in self.attribute_map and \
+ self._configuration is not None and \
+ self._configuration.discard_unknown_keys and \
+ self.additional_properties_type is None:
+ # discard variable.
+ continue
+ setattr(self, var_name, var_value)
+ return self
+
+ required_properties = set([
+ '_data_store',
+ '_check_type',
+ '_spec_property_naming',
+ '_path_to_item',
+ '_configuration',
+ '_visited_composed_classes',
+ ])
+
+ @convert_js_args_to_python_args
+ def __init__(self, status, reason, *args, **kwargs): # noqa: E501
+ """TaskStatusChange - a model defined in OpenAPI
+
+ Args:
+ status (TaskStatus):
+ reason (str): The reason for this status change.
+
+ Keyword Args:
+ _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.
+ Defaults to True
+ _path_to_item (tuple/list): This is a list of keys or values to
+ drill down to the model in received_data
+ when deserializing a response
+ _spec_property_naming (bool): True if the variable names in the input data
+ are serialized names, as specified in the OpenAPI document.
+ False if the variable names in the input data
+ are pythonic names, e.g. snake case (default)
+ _configuration (Configuration): the instance to use when
+ deserializing a file_type parameter.
+ If passed, type conversion is attempted
+ If omitted no type conversion is done.
+ _visited_composed_classes (tuple): This stores a tuple of
+ classes that we have traveled through so that
+ if we see that class again we will not use its
+ discriminator again.
+ When traveling through a discriminator, the
+ composed schema that is
+ is traveled through is added to this set.
+ For example if Animal has a discriminator
+ petType and we pass in "Dog", and the class Dog
+ allOf includes Animal, we move through Animal
+ once using the discriminator, and pick Dog.
+ Then in Dog, we will make an instance of the
+ Animal class but this time we won't travel
+ through its discriminator because we passed in
+ _visited_composed_classes = (Animal,)
+ """
+
+ _check_type = kwargs.pop('_check_type', True)
+ _spec_property_naming = kwargs.pop('_spec_property_naming', False)
+ _path_to_item = kwargs.pop('_path_to_item', ())
+ _configuration = kwargs.pop('_configuration', None)
+ _visited_composed_classes = kwargs.pop('_visited_composed_classes', ())
+
+ if args:
+ raise ApiTypeError(
+ "Invalid positional arguments=%s passed to %s. Remove those invalid positional arguments." % (
+ args,
+ self.__class__.__name__,
+ ),
+ path_to_item=_path_to_item,
+ valid_classes=(self.__class__,),
+ )
+
+ self._data_store = {}
+ self._check_type = _check_type
+ self._spec_property_naming = _spec_property_naming
+ self._path_to_item = _path_to_item
+ self._configuration = _configuration
+ self._visited_composed_classes = _visited_composed_classes + (self.__class__,)
+
+ self.status = status
+ self.reason = reason
+ for var_name, var_value in kwargs.items():
+ if var_name not in self.attribute_map and \
+ self._configuration is not None and \
+ self._configuration.discard_unknown_keys and \
+ self.additional_properties_type is None:
+ # discard variable.
+ continue
+ setattr(self, var_name, var_value)
+ if var_name in self.read_only_vars:
+ raise ApiAttributeError(f"`{var_name}` is a read-only attribute. Use `from_openapi_data` to instantiate "
+ f"class with read only attributes.")
diff --git a/addon/flamenco/manager/models/__init__.py b/addon/flamenco/manager/models/__init__.py
index a1163f2e..9a958df2 100644
--- a/addon/flamenco/manager/models/__init__.py
+++ b/addon/flamenco/manager/models/__init__.py
@@ -46,6 +46,7 @@ from flamenco.manager.model.socket_io_task_update import SocketIOTaskUpdate
from flamenco.manager.model.submitted_job import SubmittedJob
from flamenco.manager.model.task import Task
from flamenco.manager.model.task_status import TaskStatus
+from flamenco.manager.model.task_status_change import TaskStatusChange
from flamenco.manager.model.task_summary import TaskSummary
from flamenco.manager.model.task_update import TaskUpdate
from flamenco.manager.model.task_worker import TaskWorker
diff --git a/addon/flamenco/manager_README.md b/addon/flamenco/manager_README.md
index 9fa36242..869bb356 100644
--- a/addon/flamenco/manager_README.md
+++ b/addon/flamenco/manager_README.md
@@ -4,7 +4,7 @@ Render Farm manager API
The `flamenco.manager` package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project:
- API version: 1.0.0
-- Package version: adba7217
+- Package version: 9985860c
- Build package: org.openapitools.codegen.languages.PythonClientCodegen
For more information, please visit [https://flamenco.io/](https://flamenco.io/)
@@ -42,6 +42,7 @@ from flamenco.manager.model.jobs_query import JobsQuery
from flamenco.manager.model.jobs_query_result import JobsQueryResult
from flamenco.manager.model.submitted_job import SubmittedJob
from flamenco.manager.model.task import Task
+from flamenco.manager.model.task_status_change import TaskStatusChange
# Defining the host is optional and defaults to http://localhost
# See configuration.py for a list of all supported configuration parameters.
configuration = flamenco.manager.Configuration(
@@ -77,6 +78,7 @@ Class | Method | HTTP request | Description
*JobsApi* | [**get_job_types**](flamenco/manager/docs/JobsApi.md#get_job_types) | **GET** /api/jobs/types | Get list of job types and their parameters.
*JobsApi* | [**query_jobs**](flamenco/manager/docs/JobsApi.md#query_jobs) | **POST** /api/jobs/query | Fetch list of jobs.
*JobsApi* | [**set_job_status**](flamenco/manager/docs/JobsApi.md#set_job_status) | **POST** /api/jobs/{job_id}/setstatus |
+*JobsApi* | [**set_task_status**](flamenco/manager/docs/JobsApi.md#set_task_status) | **POST** /api/tasks/{task_id}/setstatus |
*JobsApi* | [**submit_job**](flamenco/manager/docs/JobsApi.md#submit_job) | **POST** /api/jobs | Submit a new job for Flamenco Manager to execute.
*MetaApi* | [**get_configuration**](flamenco/manager/docs/MetaApi.md#get_configuration) | **GET** /api/configuration | Get the configuration of this Manager.
*MetaApi* | [**get_version**](flamenco/manager/docs/MetaApi.md#get_version) | **GET** /api/version | Get the Flamenco version of this Manager
@@ -132,6 +134,7 @@ Class | Method | HTTP request | Description
- [SubmittedJob](flamenco/manager/docs/SubmittedJob.md)
- [Task](flamenco/manager/docs/Task.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)
diff --git a/internal/worker/mocks/client.gen.go b/internal/worker/mocks/client.gen.go
index 3992d85c..f4ecf42a 100644
--- a/internal/worker/mocks/client.gen.go
+++ b/internal/worker/mocks/client.gen.go
@@ -316,6 +316,46 @@ func (mr *MockFlamencoClientMockRecorder) SetJobStatusWithResponse(arg0, arg1, a
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetJobStatusWithResponse", reflect.TypeOf((*MockFlamencoClient)(nil).SetJobStatusWithResponse), varargs...)
}
+// SetTaskStatusWithBodyWithResponse mocks base method.
+func (m *MockFlamencoClient) SetTaskStatusWithBodyWithResponse(arg0 context.Context, arg1, arg2 string, arg3 io.Reader, arg4 ...api.RequestEditorFn) (*api.SetTaskStatusResponse, error) {
+ m.ctrl.T.Helper()
+ varargs := []interface{}{arg0, arg1, arg2, arg3}
+ for _, a := range arg4 {
+ varargs = append(varargs, a)
+ }
+ ret := m.ctrl.Call(m, "SetTaskStatusWithBodyWithResponse", varargs...)
+ ret0, _ := ret[0].(*api.SetTaskStatusResponse)
+ ret1, _ := ret[1].(error)
+ return ret0, ret1
+}
+
+// SetTaskStatusWithBodyWithResponse indicates an expected call of SetTaskStatusWithBodyWithResponse.
+func (mr *MockFlamencoClientMockRecorder) SetTaskStatusWithBodyWithResponse(arg0, arg1, arg2, arg3 interface{}, arg4 ...interface{}) *gomock.Call {
+ mr.mock.ctrl.T.Helper()
+ varargs := append([]interface{}{arg0, arg1, arg2, arg3}, arg4...)
+ return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetTaskStatusWithBodyWithResponse", reflect.TypeOf((*MockFlamencoClient)(nil).SetTaskStatusWithBodyWithResponse), varargs...)
+}
+
+// SetTaskStatusWithResponse mocks base method.
+func (m *MockFlamencoClient) SetTaskStatusWithResponse(arg0 context.Context, arg1 string, arg2 api.SetTaskStatusJSONRequestBody, arg3 ...api.RequestEditorFn) (*api.SetTaskStatusResponse, error) {
+ m.ctrl.T.Helper()
+ varargs := []interface{}{arg0, arg1, arg2}
+ for _, a := range arg3 {
+ varargs = append(varargs, a)
+ }
+ ret := m.ctrl.Call(m, "SetTaskStatusWithResponse", varargs...)
+ ret0, _ := ret[0].(*api.SetTaskStatusResponse)
+ ret1, _ := ret[1].(error)
+ return ret0, ret1
+}
+
+// SetTaskStatusWithResponse indicates an expected call of SetTaskStatusWithResponse.
+func (mr *MockFlamencoClientMockRecorder) SetTaskStatusWithResponse(arg0, arg1, arg2 interface{}, arg3 ...interface{}) *gomock.Call {
+ mr.mock.ctrl.T.Helper()
+ varargs := append([]interface{}{arg0, arg1, arg2}, arg3...)
+ return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetTaskStatusWithResponse", reflect.TypeOf((*MockFlamencoClient)(nil).SetTaskStatusWithResponse), varargs...)
+}
+
// ShamanCheckoutRequirementsWithBodyWithResponse mocks base method.
func (m *MockFlamencoClient) ShamanCheckoutRequirementsWithBodyWithResponse(arg0 context.Context, arg1 string, arg2 io.Reader, arg3 ...api.RequestEditorFn) (*api.ShamanCheckoutRequirementsResponse, error) {
m.ctrl.T.Helper()
diff --git a/pkg/api/openapi_client.gen.go b/pkg/api/openapi_client.gen.go
index 423a805f..a4c410b7 100644
--- a/pkg/api/openapi_client.gen.go
+++ b/pkg/api/openapi_client.gen.go
@@ -123,6 +123,11 @@ type ClientInterface interface {
// FetchTask request
FetchTask(ctx context.Context, taskId string, reqEditors ...RequestEditorFn) (*http.Response, error)
+ // SetTaskStatus request with any body
+ SetTaskStatusWithBody(ctx context.Context, taskId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error)
+
+ SetTaskStatus(ctx context.Context, taskId string, body SetTaskStatusJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error)
+
// GetVersion request
GetVersion(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error)
@@ -316,6 +321,30 @@ func (c *Client) FetchTask(ctx context.Context, taskId string, reqEditors ...Req
return c.Client.Do(req)
}
+func (c *Client) SetTaskStatusWithBody(ctx context.Context, taskId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) {
+ req, err := NewSetTaskStatusRequestWithBody(c.Server, taskId, contentType, body)
+ if err != nil {
+ return nil, err
+ }
+ req = req.WithContext(ctx)
+ if err := c.applyEditors(ctx, req, reqEditors); err != nil {
+ return nil, err
+ }
+ return c.Client.Do(req)
+}
+
+func (c *Client) SetTaskStatus(ctx context.Context, taskId string, body SetTaskStatusJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) {
+ req, err := NewSetTaskStatusRequest(c.Server, taskId, body)
+ if err != nil {
+ return nil, err
+ }
+ req = req.WithContext(ctx)
+ if err := c.applyEditors(ctx, req, reqEditors); err != nil {
+ return nil, err
+ }
+ return c.Client.Do(req)
+}
+
func (c *Client) GetVersion(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) {
req, err := NewGetVersionRequest(c.Server)
if err != nil {
@@ -849,6 +878,53 @@ func NewFetchTaskRequest(server string, taskId string) (*http.Request, error) {
return req, nil
}
+// NewSetTaskStatusRequest calls the generic SetTaskStatus builder with application/json body
+func NewSetTaskStatusRequest(server string, taskId string, body SetTaskStatusJSONRequestBody) (*http.Request, error) {
+ var bodyReader io.Reader
+ buf, err := json.Marshal(body)
+ if err != nil {
+ return nil, err
+ }
+ bodyReader = bytes.NewReader(buf)
+ return NewSetTaskStatusRequestWithBody(server, taskId, "application/json", bodyReader)
+}
+
+// NewSetTaskStatusRequestWithBody generates requests for SetTaskStatus with any type of body
+func NewSetTaskStatusRequestWithBody(server string, taskId string, contentType string, body io.Reader) (*http.Request, error) {
+ var err error
+
+ var pathParam0 string
+
+ pathParam0, err = runtime.StyleParamWithLocation("simple", false, "task_id", runtime.ParamLocationPath, taskId)
+ if err != nil {
+ return nil, err
+ }
+
+ serverURL, err := url.Parse(server)
+ if err != nil {
+ return nil, err
+ }
+
+ operationPath := fmt.Sprintf("/api/tasks/%s/setstatus", pathParam0)
+ if operationPath[0] == '/' {
+ operationPath = "." + operationPath
+ }
+
+ queryURL, err := serverURL.Parse(operationPath)
+ if err != nil {
+ return nil, err
+ }
+
+ req, err := http.NewRequest("POST", queryURL.String(), body)
+ if err != nil {
+ return nil, err
+ }
+
+ req.Header.Add("Content-Type", contentType)
+
+ return req, nil
+}
+
// NewGetVersionRequest generates requests for GetVersion
func NewGetVersionRequest(server string) (*http.Request, error) {
var err error
@@ -1386,6 +1462,11 @@ type ClientWithResponsesInterface interface {
// FetchTask request
FetchTaskWithResponse(ctx context.Context, taskId string, reqEditors ...RequestEditorFn) (*FetchTaskResponse, error)
+ // SetTaskStatus request with any body
+ SetTaskStatusWithBodyWithResponse(ctx context.Context, taskId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*SetTaskStatusResponse, error)
+
+ SetTaskStatusWithResponse(ctx context.Context, taskId string, body SetTaskStatusJSONRequestBody, reqEditors ...RequestEditorFn) (*SetTaskStatusResponse, error)
+
// GetVersion request
GetVersionWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetVersionResponse, error)
@@ -1637,6 +1718,28 @@ func (r FetchTaskResponse) StatusCode() int {
return 0
}
+type SetTaskStatusResponse struct {
+ Body []byte
+ HTTPResponse *http.Response
+ JSONDefault *Error
+}
+
+// Status returns HTTPResponse.Status
+func (r SetTaskStatusResponse) Status() string {
+ if r.HTTPResponse != nil {
+ return r.HTTPResponse.Status
+ }
+ return http.StatusText(0)
+}
+
+// StatusCode returns HTTPResponse.StatusCode
+func (r SetTaskStatusResponse) StatusCode() int {
+ if r.HTTPResponse != nil {
+ return r.HTTPResponse.StatusCode
+ }
+ return 0
+}
+
type GetVersionResponse struct {
Body []byte
HTTPResponse *http.Response
@@ -2016,6 +2119,23 @@ func (c *ClientWithResponses) FetchTaskWithResponse(ctx context.Context, taskId
return ParseFetchTaskResponse(rsp)
}
+// SetTaskStatusWithBodyWithResponse request with arbitrary body returning *SetTaskStatusResponse
+func (c *ClientWithResponses) SetTaskStatusWithBodyWithResponse(ctx context.Context, taskId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*SetTaskStatusResponse, error) {
+ rsp, err := c.SetTaskStatusWithBody(ctx, taskId, contentType, body, reqEditors...)
+ if err != nil {
+ return nil, err
+ }
+ return ParseSetTaskStatusResponse(rsp)
+}
+
+func (c *ClientWithResponses) SetTaskStatusWithResponse(ctx context.Context, taskId string, body SetTaskStatusJSONRequestBody, reqEditors ...RequestEditorFn) (*SetTaskStatusResponse, error) {
+ rsp, err := c.SetTaskStatus(ctx, taskId, body, reqEditors...)
+ if err != nil {
+ return nil, err
+ }
+ return ParseSetTaskStatusResponse(rsp)
+}
+
// GetVersionWithResponse request returning *GetVersionResponse
func (c *ClientWithResponses) GetVersionWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetVersionResponse, error) {
rsp, err := c.GetVersion(ctx, reqEditors...)
@@ -2434,6 +2554,32 @@ func ParseFetchTaskResponse(rsp *http.Response) (*FetchTaskResponse, error) {
return response, nil
}
+// ParseSetTaskStatusResponse parses an HTTP response from a SetTaskStatusWithResponse call
+func ParseSetTaskStatusResponse(rsp *http.Response) (*SetTaskStatusResponse, error) {
+ bodyBytes, err := ioutil.ReadAll(rsp.Body)
+ defer func() { _ = rsp.Body.Close() }()
+ if err != nil {
+ return nil, err
+ }
+
+ response := &SetTaskStatusResponse{
+ Body: bodyBytes,
+ HTTPResponse: rsp,
+ }
+
+ switch {
+ case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true:
+ var dest Error
+ if err := json.Unmarshal(bodyBytes, &dest); err != nil {
+ return nil, err
+ }
+ response.JSONDefault = &dest
+
+ }
+
+ return response, nil
+}
+
// ParseGetVersionResponse parses an HTTP response from a GetVersionWithResponse call
func ParseGetVersionResponse(rsp *http.Response) (*GetVersionResponse, error) {
bodyBytes, err := ioutil.ReadAll(rsp.Body)
diff --git a/pkg/api/openapi_server.gen.go b/pkg/api/openapi_server.gen.go
index d12756ca..c11f604a 100644
--- a/pkg/api/openapi_server.gen.go
+++ b/pkg/api/openapi_server.gen.go
@@ -40,6 +40,9 @@ type ServerInterface interface {
// Fetch a single task.
// (GET /api/tasks/{task_id})
FetchTask(ctx echo.Context, taskId string) error
+
+ // (POST /api/tasks/{task_id}/setstatus)
+ SetTaskStatus(ctx echo.Context, taskId string) error
// Get the Flamenco version of this Manager
// (GET /api/version)
GetVersion(ctx echo.Context) error
@@ -200,6 +203,22 @@ func (w *ServerInterfaceWrapper) FetchTask(ctx echo.Context) error {
return err
}
+// SetTaskStatus converts echo context to params.
+func (w *ServerInterfaceWrapper) SetTaskStatus(ctx echo.Context) error {
+ var err error
+ // ------------- Path parameter "task_id" -------------
+ var taskId string
+
+ err = runtime.BindStyledParameterWithLocation("simple", false, "task_id", runtime.ParamLocationPath, ctx.Param("task_id"), &taskId)
+ if err != nil {
+ return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter task_id: %s", err))
+ }
+
+ // Invoke the callback with all the unmarshalled arguments
+ err = w.Handler.SetTaskStatus(ctx, taskId)
+ return err
+}
+
// GetVersion converts echo context to params.
func (w *ServerInterfaceWrapper) GetVersion(ctx echo.Context) error {
var err error
@@ -429,6 +448,7 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL
router.POST(baseURL+"/api/jobs/:job_id/setstatus", wrapper.SetJobStatus)
router.GET(baseURL+"/api/jobs/:job_id/tasks", wrapper.FetchJobTasks)
router.GET(baseURL+"/api/tasks/:task_id", wrapper.FetchTask)
+ router.POST(baseURL+"/api/tasks/:task_id/setstatus", wrapper.SetTaskStatus)
router.GET(baseURL+"/api/version", wrapper.GetVersion)
router.POST(baseURL+"/api/worker/register-worker", wrapper.RegisterWorker)
router.POST(baseURL+"/api/worker/sign-off", wrapper.SignOff)
diff --git a/pkg/api/openapi_spec.gen.go b/pkg/api/openapi_spec.gen.go
index 532f3b60..09d3d46a 100644
--- a/pkg/api/openapi_spec.gen.go
+++ b/pkg/api/openapi_spec.gen.go
@@ -18,119 +18,121 @@ import (
// Base64 encoded, gzipped, json marshaled Swagger object
var swaggerSpec = []string{
- "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",
+ "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",
}
// GetSwagger returns the content of the embedded swagger specification file
diff --git a/pkg/api/openapi_types.gen.go b/pkg/api/openapi_types.gen.go
index 7136f158..f03820e0 100644
--- a/pkg/api/openapi_types.gen.go
+++ b/pkg/api/openapi_types.gen.go
@@ -447,6 +447,13 @@ type Task struct {
// TaskStatus defines model for TaskStatus.
type TaskStatus string
+// TaskStatusChange defines model for TaskStatusChange.
+type TaskStatusChange struct {
+ // The reason for this status change.
+ Reason string `json:"reason"`
+ Status TaskStatus `json:"status"`
+}
+
// Just enough information about the task to show in the job's task list.
type TaskSummary struct {
Id string `json:"id"`
@@ -511,6 +518,9 @@ type QueryJobsJSONBody JobsQuery
// SetJobStatusJSONBody defines parameters for SetJobStatus.
type SetJobStatusJSONBody JobStatusChange
+// SetTaskStatusJSONBody defines parameters for SetTaskStatus.
+type SetTaskStatusJSONBody TaskStatusChange
+
// RegisterWorkerJSONBody defines parameters for RegisterWorker.
type RegisterWorkerJSONBody WorkerRegistration
@@ -547,6 +557,9 @@ type QueryJobsJSONRequestBody QueryJobsJSONBody
// SetJobStatusJSONRequestBody defines body for SetJobStatus for application/json ContentType.
type SetJobStatusJSONRequestBody SetJobStatusJSONBody
+// SetTaskStatusJSONRequestBody defines body for SetTaskStatus for application/json ContentType.
+type SetTaskStatusJSONRequestBody SetTaskStatusJSONBody
+
// RegisterWorkerJSONRequestBody defines body for RegisterWorker for application/json ContentType.
type RegisterWorkerJSONRequestBody RegisterWorkerJSONBody
diff --git a/web/app/src/manager-api/ApiClient.js b/web/app/src/manager-api/ApiClient.js
index a34c9fb3..b3ddeed7 100644
--- a/web/app/src/manager-api/ApiClient.js
+++ b/web/app/src/manager-api/ApiClient.js
@@ -55,7 +55,7 @@ class ApiClient {
* @default {}
*/
this.defaultHeaders = {
- 'User-Agent': 'Flamenco/adba7217 / webbrowser'
+ 'User-Agent': 'Flamenco/9985860c / webbrowser'
};
/**
diff --git a/web/app/src/manager-api/index.js b/web/app/src/manager-api/index.js
index 860b6f17..4c794f4b 100644
--- a/web/app/src/manager-api/index.js
+++ b/web/app/src/manager-api/index.js
@@ -48,6 +48,7 @@ import SocketIOTaskUpdate from './model/SocketIOTaskUpdate';
import SubmittedJob from './model/SubmittedJob';
import Task from './model/Task';
import TaskStatus from './model/TaskStatus';
+import TaskStatusChange from './model/TaskStatusChange';
import TaskSummary from './model/TaskSummary';
import TaskUpdate from './model/TaskUpdate';
import TaskWorker from './model/TaskWorker';
@@ -310,6 +311,12 @@ export {
*/
TaskStatus,
+ /**
+ * The TaskStatusChange model constructor.
+ * @property {module:model/TaskStatusChange}
+ */
+ TaskStatusChange,
+
/**
* The TaskSummary model constructor.
* @property {module:model/TaskSummary}
diff --git a/web/app/src/manager-api/manager/JobsApi.js b/web/app/src/manager-api/manager/JobsApi.js
index 8378f744..273e00ea 100644
--- a/web/app/src/manager-api/manager/JobsApi.js
+++ b/web/app/src/manager-api/manager/JobsApi.js
@@ -23,6 +23,7 @@ import JobsQuery from '../model/JobsQuery';
import JobsQueryResult from '../model/JobsQueryResult';
import SubmittedJob from '../model/SubmittedJob';
import Task from '../model/Task';
+import TaskStatusChange from '../model/TaskStatusChange';
/**
* Jobs service.
@@ -362,6 +363,56 @@ export default class JobsApi {
}
+ /**
+ * @param {String} taskId
+ * @param {module:model/TaskStatusChange} taskStatusChange The status change to request.
+ * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing HTTP response
+ */
+ setTaskStatusWithHttpInfo(taskId, taskStatusChange) {
+ let postBody = taskStatusChange;
+ // verify the required parameter 'taskId' is set
+ if (taskId === undefined || taskId === null) {
+ throw new Error("Missing the required parameter 'taskId' when calling setTaskStatus");
+ }
+ // verify the required parameter 'taskStatusChange' is set
+ if (taskStatusChange === undefined || taskStatusChange === null) {
+ throw new Error("Missing the required parameter 'taskStatusChange' when calling setTaskStatus");
+ }
+
+ let pathParams = {
+ 'task_id': taskId
+ };
+ let queryParams = {
+ };
+ let headerParams = {
+ };
+ let formParams = {
+ };
+
+ let authNames = [];
+ let contentTypes = ['application/json'];
+ let accepts = ['application/json'];
+ let returnType = null;
+ return this.apiClient.callApi(
+ '/api/tasks/{task_id}/setstatus', 'POST',
+ pathParams, queryParams, headerParams, formParams, postBody,
+ authNames, contentTypes, accepts, returnType, null
+ );
+ }
+
+ /**
+ * @param {String} taskId
+ * @param {module:model/TaskStatusChange} taskStatusChange The status change to request.
+ * @return {Promise} a {@link https://www.promisejs.org/|Promise}
+ */
+ setTaskStatus(taskId, taskStatusChange) {
+ return this.setTaskStatusWithHttpInfo(taskId, taskStatusChange)
+ .then(function(response_and_data) {
+ return response_and_data.data;
+ });
+ }
+
+
/**
* Submit a new job for Flamenco Manager to execute.
* @param {module:model/SubmittedJob} submittedJob Job to submit
diff --git a/web/app/src/manager-api/model/TaskStatusChange.js b/web/app/src/manager-api/model/TaskStatusChange.js
new file mode 100644
index 00000000..4ef6b4f2
--- /dev/null
+++ b/web/app/src/manager-api/model/TaskStatusChange.js
@@ -0,0 +1,85 @@
+/**
+ * Flamenco manager
+ * Render Farm manager API
+ *
+ * The version of the OpenAPI document: 1.0.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ *
+ */
+
+import ApiClient from '../ApiClient';
+import TaskStatus from './TaskStatus';
+
+/**
+ * The TaskStatusChange model module.
+ * @module model/TaskStatusChange
+ * @version 0.0.0
+ */
+class TaskStatusChange {
+ /**
+ * Constructs a new TaskStatusChange
.
+ * @alias module:model/TaskStatusChange
+ * @param status {module:model/TaskStatus}
+ * @param reason {String} The reason for this status change.
+ */
+ constructor(status, reason) {
+
+ TaskStatusChange.initialize(this, status, reason);
+ }
+
+ /**
+ * Initializes the fields of this object.
+ * This method is used by the constructors of any subclasses, in order to implement multiple inheritance (mix-ins).
+ * Only for internal use.
+ */
+ static initialize(obj, status, reason) {
+ obj['status'] = status;
+ obj['reason'] = reason;
+ }
+
+ /**
+ * Constructs a TaskStatusChange
from a plain JavaScript object, optionally creating a new instance.
+ * Copies all relevant properties from data
to obj
if supplied or a new instance if not.
+ * @param {Object} data The plain JavaScript object bearing properties of interest.
+ * @param {module:model/TaskStatusChange} obj Optional instance to populate.
+ * @return {module:model/TaskStatusChange} The populated TaskStatusChange
instance.
+ */
+ static constructFromObject(data, obj) {
+ if (data) {
+ obj = obj || new TaskStatusChange();
+
+ if (data.hasOwnProperty('status')) {
+ obj['status'] = TaskStatus.constructFromObject(data['status']);
+ }
+ if (data.hasOwnProperty('reason')) {
+ obj['reason'] = ApiClient.convertToType(data['reason'], 'String');
+ }
+ }
+ return obj;
+ }
+
+
+}
+
+/**
+ * @member {module:model/TaskStatus} status
+ */
+TaskStatusChange.prototype['status'] = undefined;
+
+/**
+ * The reason for this status change.
+ * @member {String} reason
+ */
+TaskStatusChange.prototype['reason'] = undefined;
+
+
+
+
+
+
+export default TaskStatusChange;
+