
Add a `Worker` column to the Job Tasks Table. This lets artists quickly visualize on which machine a task is currently running, giving better insights on worker utilization, as well as better expectations on how long a task might take to finish when running Flamenco on a Renderfarm made of different slow / fast workers. Similarly to the Task Details panel for the "Assigned To" field `LinkWorker` Vue element, the cell element contains an hyperlink to the corresponding worker in the Workers page. Since the Worker page also contains a backlink to the currently running task, this lets user quickly navigate between the two pages, as seen in the screen recording demo below. Reviewed-on: https://projects.blender.org/studio/flamenco/pulls/104402 Reviewed-by: Sybren A. Stüvel <sybren@blender.org>
310 lines
13 KiB
Python
Generated
310 lines
13 KiB
Python
Generated
"""
|
|
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
|
|
from flamenco.manager.model.task_worker import TaskWorker
|
|
globals()['TaskStatus'] = TaskStatus
|
|
globals()['TaskWorker'] = TaskWorker
|
|
|
|
|
|
class TaskSummary(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 {
|
|
'id': (str,), # noqa: E501
|
|
'name': (str,), # noqa: E501
|
|
'status': (TaskStatus,), # noqa: E501
|
|
'index_in_job': (int,), # noqa: E501
|
|
'priority': (int,), # noqa: E501
|
|
'task_type': (str,), # noqa: E501
|
|
'updated': (datetime,), # noqa: E501
|
|
'worker': (TaskWorker,), # noqa: E501
|
|
}
|
|
|
|
@cached_property
|
|
def discriminator():
|
|
return None
|
|
|
|
|
|
attribute_map = {
|
|
'id': 'id', # noqa: E501
|
|
'name': 'name', # noqa: E501
|
|
'status': 'status', # noqa: E501
|
|
'index_in_job': 'index_in_job', # noqa: E501
|
|
'priority': 'priority', # noqa: E501
|
|
'task_type': 'task_type', # noqa: E501
|
|
'updated': 'updated', # noqa: E501
|
|
'worker': 'worker', # noqa: E501
|
|
}
|
|
|
|
read_only_vars = {
|
|
}
|
|
|
|
_composed_schemas = {}
|
|
|
|
@classmethod
|
|
@convert_js_args_to_python_args
|
|
def _from_openapi_data(cls, id, name, status, index_in_job, priority, task_type, updated, *args, **kwargs): # noqa: E501
|
|
"""TaskSummary - a model defined in OpenAPI
|
|
|
|
Args:
|
|
id (str):
|
|
name (str):
|
|
status (TaskStatus):
|
|
index_in_job (int):
|
|
priority (int):
|
|
task_type (str):
|
|
updated (datetime):
|
|
|
|
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,)
|
|
worker (TaskWorker): [optional] # noqa: E501
|
|
"""
|
|
|
|
_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.id = id
|
|
self.name = name
|
|
self.status = status
|
|
self.index_in_job = index_in_job
|
|
self.priority = priority
|
|
self.task_type = task_type
|
|
self.updated = updated
|
|
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, id, name, status, index_in_job, priority, task_type, updated, *args, **kwargs): # noqa: E501
|
|
"""TaskSummary - a model defined in OpenAPI
|
|
|
|
Args:
|
|
id (str):
|
|
name (str):
|
|
status (TaskStatus):
|
|
index_in_job (int):
|
|
priority (int):
|
|
task_type (str):
|
|
updated (datetime):
|
|
|
|
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,)
|
|
worker (TaskWorker): [optional] # noqa: E501
|
|
"""
|
|
|
|
_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.id = id
|
|
self.name = name
|
|
self.status = status
|
|
self.index_in_job = index_in_job
|
|
self.priority = priority
|
|
self.task_type = task_type
|
|
self.updated = updated
|
|
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.")
|