diff --git a/addon/flamenco/manager/__init__.py b/addon/flamenco/manager/__init__.py
index 7fba5207..10edad99 100644
--- a/addon/flamenco/manager/__init__.py
+++ b/addon/flamenco/manager/__init__.py
@@ -10,7 +10,7 @@
"""
-__version__ = "5f44849d"
+__version__ = "6dec235e"
# import ApiClient
from flamenco.manager.api_client import ApiClient
diff --git a/addon/flamenco/manager/api/worker_mgt_api.py b/addon/flamenco/manager/api/worker_mgt_api.py
new file mode 100644
index 00000000..2df6e7f1
--- /dev/null
+++ b/addon/flamenco/manager/api/worker_mgt_api.py
@@ -0,0 +1,152 @@
+"""
+ 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.api_client import ApiClient, Endpoint as _Endpoint
+from flamenco.manager.model_utils import ( # noqa: F401
+ check_allowed_values,
+ check_validations,
+ date,
+ datetime,
+ file_type,
+ none_type,
+ validate_and_convert_types
+)
+from flamenco.manager.model.worker_list import WorkerList
+
+
+class WorkerMgtApi(object):
+ """NOTE: This class is auto generated by OpenAPI Generator
+ Ref: https://openapi-generator.tech
+
+ Do not edit the class manually.
+ """
+
+ def __init__(self, api_client=None):
+ if api_client is None:
+ api_client = ApiClient()
+ self.api_client = api_client
+ self.fetch_workers_endpoint = _Endpoint(
+ settings={
+ 'response_type': (WorkerList,),
+ 'auth': [],
+ 'endpoint_path': '/api/worker-mgt/workers',
+ 'operation_id': 'fetch_workers',
+ 'http_method': 'GET',
+ 'servers': None,
+ },
+ params_map={
+ 'all': [
+ ],
+ 'required': [],
+ 'nullable': [
+ ],
+ 'enum': [
+ ],
+ 'validation': [
+ ]
+ },
+ root_map={
+ 'validations': {
+ },
+ 'allowed_values': {
+ },
+ 'openapi_types': {
+ },
+ 'attribute_map': {
+ },
+ 'location_map': {
+ },
+ 'collection_format_map': {
+ }
+ },
+ headers_map={
+ 'accept': [
+ 'application/json'
+ ],
+ 'content_type': [],
+ },
+ api_client=api_client
+ )
+
+ def fetch_workers(
+ self,
+ **kwargs
+ ):
+ """Get list of workers. # noqa: E501
+
+ This method makes a synchronous HTTP request by default. To make an
+ asynchronous HTTP request, please pass async_req=True
+
+ >>> thread = api.fetch_workers(async_req=True)
+ >>> result = thread.get()
+
+
+ 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:
+ WorkerList
+ 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')
+ return self.fetch_workers_endpoint.call_with_http_info(**kwargs)
+
diff --git a/addon/flamenco/manager/api_client.py b/addon/flamenco/manager/api_client.py
index 7bbfe78f..ca412ff9 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/5f44849d (Blender add-on)'
+ self.user_agent = 'Flamenco/6dec235e (Blender add-on)'
def __enter__(self):
return self
diff --git a/addon/flamenco/manager/apis/__init__.py b/addon/flamenco/manager/apis/__init__.py
index 9e21ad7a..d0595b45 100644
--- a/addon/flamenco/manager/apis/__init__.py
+++ b/addon/flamenco/manager/apis/__init__.py
@@ -18,3 +18,4 @@ from flamenco.manager.api.jobs_api import JobsApi
from flamenco.manager.api.meta_api import MetaApi
from flamenco.manager.api.shaman_api import ShamanApi
from flamenco.manager.api.worker_api import WorkerApi
+from flamenco.manager.api.worker_mgt_api import WorkerMgtApi
diff --git a/addon/flamenco/manager/configuration.py b/addon/flamenco/manager/configuration.py
index 79d4ad9b..ebb41656 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: 5f44849d".\
+ "SDK Package Version: 6dec235e".\
format(env=sys.platform, pyversion=sys.version)
def get_host_settings(self):
diff --git a/addon/flamenco/manager/docs/WorkerList.md b/addon/flamenco/manager/docs/WorkerList.md
new file mode 100644
index 00000000..ed7a7215
--- /dev/null
+++ b/addon/flamenco/manager/docs/WorkerList.md
@@ -0,0 +1,13 @@
+# WorkerList
+
+List of workers.
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**workers** | [**[WorkerSummary]**](WorkerSummary.md) | |
+**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/docs/WorkerMgtApi.md b/addon/flamenco/manager/docs/WorkerMgtApi.md
new file mode 100644
index 00000000..854f0395
--- /dev/null
+++ b/addon/flamenco/manager/docs/WorkerMgtApi.md
@@ -0,0 +1,70 @@
+# flamenco.manager.WorkerMgtApi
+
+All URIs are relative to *http://localhost*
+
+Method | HTTP request | Description
+------------- | ------------- | -------------
+[**fetch_workers**](WorkerMgtApi.md#fetch_workers) | **GET** /api/worker-mgt/workers | Get list of workers.
+
+
+# **fetch_workers**
+> WorkerList fetch_workers()
+
+Get list of workers.
+
+### Example
+
+
+```python
+import time
+import flamenco.manager
+from flamenco.manager.api import worker_mgt_api
+from flamenco.manager.model.worker_list import WorkerList
+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 = worker_mgt_api.WorkerMgtApi(api_client)
+
+ # example, this endpoint has no required or optional parameters
+ try:
+ # Get list of workers.
+ api_response = api_instance.fetch_workers()
+ pprint(api_response)
+ except flamenco.manager.ApiException as e:
+ print("Exception when calling WorkerMgtApi->fetch_workers: %s\n" % e)
+```
+
+
+### Parameters
+This endpoint does not need any parameter.
+
+### Return type
+
+[**WorkerList**](WorkerList.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+
+### HTTP response details
+
+| Status code | Description | Response headers |
+|-------------|-------------|------------------|
+**200** | Known workers | - |
+
+[[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)
+
diff --git a/addon/flamenco/manager/docs/WorkerSummary.md b/addon/flamenco/manager/docs/WorkerSummary.md
new file mode 100644
index 00000000..a268402d
--- /dev/null
+++ b/addon/flamenco/manager/docs/WorkerSummary.md
@@ -0,0 +1,16 @@
+# WorkerSummary
+
+Basic information about a Worker.
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**id** | **str** | |
+**nickname** | **str** | |
+**status** | [**WorkerStatus**](WorkerStatus.md) | |
+**status_requested** | [**WorkerStatus**](WorkerStatus.md) | | [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]
+
+[[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/worker_list.py b/addon/flamenco/manager/model/worker_list.py
new file mode 100644
index 00000000..4df58c17
--- /dev/null
+++ b/addon/flamenco/manager/model/worker_list.py
@@ -0,0 +1,267 @@
+"""
+ 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.worker_summary import WorkerSummary
+ globals()['WorkerSummary'] = WorkerSummary
+
+
+class WorkerList(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 {
+ 'workers': ([WorkerSummary],), # noqa: E501
+ }
+
+ @cached_property
+ def discriminator():
+ return None
+
+
+ attribute_map = {
+ 'workers': 'workers', # noqa: E501
+ }
+
+ read_only_vars = {
+ }
+
+ _composed_schemas = {}
+
+ @classmethod
+ @convert_js_args_to_python_args
+ def _from_openapi_data(cls, workers, *args, **kwargs): # noqa: E501
+ """WorkerList - a model defined in OpenAPI
+
+ Args:
+ workers ([WorkerSummary]):
+
+ 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.workers = workers
+ 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, workers, *args, **kwargs): # noqa: E501
+ """WorkerList - a model defined in OpenAPI
+
+ Args:
+ workers ([WorkerSummary]):
+
+ 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.workers = workers
+ 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/model/worker_summary.py b/addon/flamenco/manager/model/worker_summary.py
new file mode 100644
index 00000000..ae0f2dad
--- /dev/null
+++ b/addon/flamenco/manager/model/worker_summary.py
@@ -0,0 +1,283 @@
+"""
+ 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.worker_status import WorkerStatus
+ globals()['WorkerStatus'] = WorkerStatus
+
+
+class WorkerSummary(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
+ 'nickname': (str,), # noqa: E501
+ 'status': (WorkerStatus,), # noqa: E501
+ 'status_requested': (WorkerStatus,), # noqa: E501
+ }
+
+ @cached_property
+ def discriminator():
+ return None
+
+
+ attribute_map = {
+ 'id': 'id', # noqa: E501
+ 'nickname': 'nickname', # noqa: E501
+ 'status': 'status', # noqa: E501
+ 'status_requested': 'status_requested', # noqa: E501
+ }
+
+ read_only_vars = {
+ }
+
+ _composed_schemas = {}
+
+ @classmethod
+ @convert_js_args_to_python_args
+ def _from_openapi_data(cls, id, nickname, status, *args, **kwargs): # noqa: E501
+ """WorkerSummary - a model defined in OpenAPI
+
+ Args:
+ id (str):
+ nickname (str):
+ status (WorkerStatus):
+
+ 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,)
+ status_requested (WorkerStatus): [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.nickname = nickname
+ self.status = status
+ 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, nickname, status, *args, **kwargs): # noqa: E501
+ """WorkerSummary - a model defined in OpenAPI
+
+ Args:
+ id (str):
+ nickname (str):
+ status (WorkerStatus):
+
+ 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,)
+ status_requested (WorkerStatus): [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.nickname = nickname
+ self.status = status
+ 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 1ccb7a85..707b299c 100644
--- a/addon/flamenco/manager/models/__init__.py
+++ b/addon/flamenco/manager/models/__init__.py
@@ -53,8 +53,10 @@ 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
+from flamenco.manager.model.worker_list import WorkerList
from flamenco.manager.model.worker_registration import WorkerRegistration
from flamenco.manager.model.worker_sign_on import WorkerSignOn
from flamenco.manager.model.worker_state_change import WorkerStateChange
from flamenco.manager.model.worker_state_changed import WorkerStateChanged
from flamenco.manager.model.worker_status import WorkerStatus
+from flamenco.manager.model.worker_summary import WorkerSummary
diff --git a/addon/flamenco/manager_README.md b/addon/flamenco/manager_README.md
index cc90a199..40252dfc 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: 5f44849d
+- Package version: 6dec235e
- Build package: org.openapitools.codegen.languages.PythonClientCodegen
For more information, please visit [https://flamenco.io/](https://flamenco.io/)
@@ -95,6 +95,7 @@ Class | Method | HTTP request | Description
*WorkerApi* | [**task_update**](flamenco/manager/docs/WorkerApi.md#task_update) | **POST** /api/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/worker/state |
*WorkerApi* | [**worker_state_changed**](flamenco/manager/docs/WorkerApi.md#worker_state_changed) | **POST** /api/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* | [**fetch_workers**](flamenco/manager/docs/WorkerMgtApi.md#fetch_workers) | **GET** /api/worker-mgt/workers | Get list of workers.
## Documentation For Models
@@ -143,11 +144,13 @@ Class | Method | HTTP request | Description
- [TaskSummary](flamenco/manager/docs/TaskSummary.md)
- [TaskUpdate](flamenco/manager/docs/TaskUpdate.md)
- [TaskWorker](flamenco/manager/docs/TaskWorker.md)
+ - [WorkerList](flamenco/manager/docs/WorkerList.md)
- [WorkerRegistration](flamenco/manager/docs/WorkerRegistration.md)
- [WorkerSignOn](flamenco/manager/docs/WorkerSignOn.md)
- [WorkerStateChange](flamenco/manager/docs/WorkerStateChange.md)
- [WorkerStateChanged](flamenco/manager/docs/WorkerStateChanged.md)
- [WorkerStatus](flamenco/manager/docs/WorkerStatus.md)
+ - [WorkerSummary](flamenco/manager/docs/WorkerSummary.md)
## Documentation For Authorization
diff --git a/internal/worker/mocks/client.gen.go b/internal/worker/mocks/client.gen.go
index 75ab6a0a..a509beed 100644
--- a/internal/worker/mocks/client.gen.go
+++ b/internal/worker/mocks/client.gen.go
@@ -116,6 +116,26 @@ func (mr *MockFlamencoClientMockRecorder) FetchTaskWithResponse(arg0, arg1 inter
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchTaskWithResponse", reflect.TypeOf((*MockFlamencoClient)(nil).FetchTaskWithResponse), varargs...)
}
+// FetchWorkersWithResponse mocks base method.
+func (m *MockFlamencoClient) FetchWorkersWithResponse(arg0 context.Context, arg1 ...api.RequestEditorFn) (*api.FetchWorkersResponse, error) {
+ m.ctrl.T.Helper()
+ varargs := []interface{}{arg0}
+ for _, a := range arg1 {
+ varargs = append(varargs, a)
+ }
+ ret := m.ctrl.Call(m, "FetchWorkersWithResponse", varargs...)
+ ret0, _ := ret[0].(*api.FetchWorkersResponse)
+ ret1, _ := ret[1].(error)
+ return ret0, ret1
+}
+
+// FetchWorkersWithResponse indicates an expected call of FetchWorkersWithResponse.
+func (mr *MockFlamencoClientMockRecorder) FetchWorkersWithResponse(arg0 interface{}, arg1 ...interface{}) *gomock.Call {
+ mr.mock.ctrl.T.Helper()
+ varargs := append([]interface{}{arg0}, arg1...)
+ return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchWorkersWithResponse", reflect.TypeOf((*MockFlamencoClient)(nil).FetchWorkersWithResponse), varargs...)
+}
+
// GetConfigurationWithResponse mocks base method.
func (m *MockFlamencoClient) GetConfigurationWithResponse(arg0 context.Context, arg1 ...api.RequestEditorFn) (*api.GetConfigurationResponse, error) {
m.ctrl.T.Helper()
diff --git a/pkg/api/openapi_client.gen.go b/pkg/api/openapi_client.gen.go
index 58343e88..5b473e4f 100644
--- a/pkg/api/openapi_client.gen.go
+++ b/pkg/api/openapi_client.gen.go
@@ -134,6 +134,9 @@ type ClientInterface interface {
// GetVersion request
GetVersion(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error)
+ // FetchWorkers request
+ FetchWorkers(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error)
+
// RegisterWorker request with any body
RegisterWorkerWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error)
@@ -375,6 +378,18 @@ func (c *Client) GetVersion(ctx context.Context, reqEditors ...RequestEditorFn)
return c.Client.Do(req)
}
+func (c *Client) FetchWorkers(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) {
+ req, err := NewFetchWorkersRequest(c.Server)
+ 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) RegisterWorkerWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) {
req, err := NewRegisterWorkerRequestWithBody(c.Server, contentType, body)
if err != nil {
@@ -1016,6 +1031,33 @@ func NewGetVersionRequest(server string) (*http.Request, error) {
return req, nil
}
+// NewFetchWorkersRequest generates requests for FetchWorkers
+func NewFetchWorkersRequest(server string) (*http.Request, error) {
+ var err error
+
+ serverURL, err := url.Parse(server)
+ if err != nil {
+ return nil, err
+ }
+
+ operationPath := fmt.Sprintf("/api/worker-mgt/workers")
+ if operationPath[0] == '/' {
+ operationPath = "." + operationPath
+ }
+
+ queryURL, err := serverURL.Parse(operationPath)
+ if err != nil {
+ return nil, err
+ }
+
+ req, err := http.NewRequest("GET", queryURL.String(), nil)
+ if err != nil {
+ return nil, err
+ }
+
+ return req, nil
+}
+
// NewRegisterWorkerRequest calls the generic RegisterWorker builder with application/json body
func NewRegisterWorkerRequest(server string, body RegisterWorkerJSONRequestBody) (*http.Request, error) {
var bodyReader io.Reader
@@ -1571,6 +1613,9 @@ type ClientWithResponsesInterface interface {
// GetVersion request
GetVersionWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetVersionResponse, error)
+ // FetchWorkers request
+ FetchWorkersWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*FetchWorkersResponse, error)
+
// RegisterWorker request with any body
RegisterWorkerWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*RegisterWorkerResponse, error)
@@ -1888,6 +1933,28 @@ func (r GetVersionResponse) StatusCode() int {
return 0
}
+type FetchWorkersResponse struct {
+ Body []byte
+ HTTPResponse *http.Response
+ JSON200 *WorkerList
+}
+
+// Status returns HTTPResponse.Status
+func (r FetchWorkersResponse) Status() string {
+ if r.HTTPResponse != nil {
+ return r.HTTPResponse.Status
+ }
+ return http.StatusText(0)
+}
+
+// StatusCode returns HTTPResponse.StatusCode
+func (r FetchWorkersResponse) StatusCode() int {
+ if r.HTTPResponse != nil {
+ return r.HTTPResponse.StatusCode
+ }
+ return 0
+}
+
type RegisterWorkerResponse struct {
Body []byte
HTTPResponse *http.Response
@@ -2303,6 +2370,15 @@ func (c *ClientWithResponses) GetVersionWithResponse(ctx context.Context, reqEdi
return ParseGetVersionResponse(rsp)
}
+// FetchWorkersWithResponse request returning *FetchWorkersResponse
+func (c *ClientWithResponses) FetchWorkersWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*FetchWorkersResponse, error) {
+ rsp, err := c.FetchWorkers(ctx, reqEditors...)
+ if err != nil {
+ return nil, err
+ }
+ return ParseFetchWorkersResponse(rsp)
+}
+
// RegisterWorkerWithBodyWithResponse request with arbitrary body returning *RegisterWorkerResponse
func (c *ClientWithResponses) RegisterWorkerWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*RegisterWorkerResponse, error) {
rsp, err := c.RegisterWorkerWithBody(ctx, contentType, body, reqEditors...)
@@ -2799,6 +2875,32 @@ func ParseGetVersionResponse(rsp *http.Response) (*GetVersionResponse, error) {
return response, nil
}
+// ParseFetchWorkersResponse parses an HTTP response from a FetchWorkersWithResponse call
+func ParseFetchWorkersResponse(rsp *http.Response) (*FetchWorkersResponse, error) {
+ bodyBytes, err := ioutil.ReadAll(rsp.Body)
+ defer func() { _ = rsp.Body.Close() }()
+ if err != nil {
+ return nil, err
+ }
+
+ response := &FetchWorkersResponse{
+ Body: bodyBytes,
+ HTTPResponse: rsp,
+ }
+
+ switch {
+ case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200:
+ var dest WorkerList
+ if err := json.Unmarshal(bodyBytes, &dest); err != nil {
+ return nil, err
+ }
+ response.JSON200 = &dest
+
+ }
+
+ return response, nil
+}
+
// ParseRegisterWorkerResponse parses an HTTP response from a RegisterWorkerWithResponse call
func ParseRegisterWorkerResponse(rsp *http.Response) (*RegisterWorkerResponse, error) {
bodyBytes, err := ioutil.ReadAll(rsp.Body)
diff --git a/pkg/api/openapi_server.gen.go b/pkg/api/openapi_server.gen.go
index c6cf962b..614c3a42 100644
--- a/pkg/api/openapi_server.gen.go
+++ b/pkg/api/openapi_server.gen.go
@@ -49,6 +49,9 @@ type ServerInterface interface {
// Get the Flamenco version of this Manager
// (GET /api/version)
GetVersion(ctx echo.Context) error
+ // Get list of workers.
+ // (GET /api/worker-mgt/workers)
+ FetchWorkers(ctx echo.Context) error
// Register a new worker
// (POST /api/worker/register-worker)
RegisterWorker(ctx echo.Context) error
@@ -250,6 +253,15 @@ func (w *ServerInterfaceWrapper) GetVersion(ctx echo.Context) error {
return err
}
+// FetchWorkers converts echo context to params.
+func (w *ServerInterfaceWrapper) FetchWorkers(ctx echo.Context) error {
+ var err error
+
+ // Invoke the callback with all the unmarshalled arguments
+ err = w.Handler.FetchWorkers(ctx)
+ return err
+}
+
// RegisterWorker converts echo context to params.
func (w *ServerInterfaceWrapper) RegisterWorker(ctx echo.Context) error {
var err error
@@ -491,6 +503,7 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL
router.GET(baseURL+"/api/tasks/:task_id/logtail", wrapper.FetchTaskLogTail)
router.POST(baseURL+"/api/tasks/:task_id/setstatus", wrapper.SetTaskStatus)
router.GET(baseURL+"/api/version", wrapper.GetVersion)
+ router.GET(baseURL+"/api/worker-mgt/workers", wrapper.FetchWorkers)
router.POST(baseURL+"/api/worker/register-worker", wrapper.RegisterWorker)
router.POST(baseURL+"/api/worker/sign-off", wrapper.SignOff)
router.POST(baseURL+"/api/worker/sign-on", wrapper.SignOn)
diff --git a/pkg/api/openapi_spec.gen.go b/pkg/api/openapi_spec.gen.go
index ac2c5cab..6e8d2a5d 100644
--- a/pkg/api/openapi_spec.gen.go
+++ b/pkg/api/openapi_spec.gen.go
@@ -18,131 +18,133 @@ import (
// Base64 encoded, gzipped, json marshaled Swagger object
var swaggerSpec = []string{
- "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",
- "96/f/2cAAAD//+3OGFVziQAA",
+ "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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 96a01bae..b8853f29 100644
--- a/pkg/api/openapi_types.gen.go
+++ b/pkg/api/openapi_types.gen.go
@@ -514,6 +514,11 @@ type TaskWorker struct {
Name string `json:"name"`
}
+// List of workers.
+type WorkerList struct {
+ Workers []WorkerSummary `json:"workers"`
+}
+
// WorkerRegistration defines model for WorkerRegistration.
type WorkerRegistration struct {
Nickname string `json:"nickname"`
@@ -542,6 +547,14 @@ type WorkerStateChanged struct {
// WorkerStatus defines model for WorkerStatus.
type WorkerStatus string
+// Basic information about a Worker.
+type WorkerSummary struct {
+ Id string `json:"id"`
+ Nickname string `json:"nickname"`
+ Status WorkerStatus `json:"status"`
+ StatusRequested *WorkerStatus `json:"status_requested,omitempty"`
+}
+
// SubmitJobJSONBody defines parameters for SubmitJob.
type SubmitJobJSONBody SubmittedJob
diff --git a/web/app/src/manager-api/ApiClient.js b/web/app/src/manager-api/ApiClient.js
index bd6ce8ed..19914f13 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/5f44849d / webbrowser'
+ 'User-Agent': 'Flamenco/6dec235e / webbrowser'
};
/**
diff --git a/web/app/src/manager-api/index.js b/web/app/src/manager-api/index.js
index 0246b5f2..4759e91b 100644
--- a/web/app/src/manager-api/index.js
+++ b/web/app/src/manager-api/index.js
@@ -55,15 +55,18 @@ import TaskStatusChange from './model/TaskStatusChange';
import TaskSummary from './model/TaskSummary';
import TaskUpdate from './model/TaskUpdate';
import TaskWorker from './model/TaskWorker';
+import WorkerList from './model/WorkerList';
import WorkerRegistration from './model/WorkerRegistration';
import WorkerSignOn from './model/WorkerSignOn';
import WorkerStateChange from './model/WorkerStateChange';
import WorkerStateChanged from './model/WorkerStateChanged';
import WorkerStatus from './model/WorkerStatus';
+import WorkerSummary from './model/WorkerSummary';
import JobsApi from './manager/JobsApi';
import MetaApi from './manager/MetaApi';
import ShamanApi from './manager/ShamanApi';
import WorkerApi from './manager/WorkerApi';
+import WorkerMgtApi from './manager/WorkerMgtApi';
/**
@@ -356,6 +359,12 @@ export {
*/
TaskWorker,
+ /**
+ * The WorkerList model constructor.
+ * @property {module:model/WorkerList}
+ */
+ WorkerList,
+
/**
* The WorkerRegistration model constructor.
* @property {module:model/WorkerRegistration}
@@ -386,6 +395,12 @@ export {
*/
WorkerStatus,
+ /**
+ * The WorkerSummary model constructor.
+ * @property {module:model/WorkerSummary}
+ */
+ WorkerSummary,
+
/**
* The JobsApi service constructor.
* @property {module:manager/JobsApi}
@@ -408,5 +423,11 @@ export {
* The WorkerApi service constructor.
* @property {module:manager/WorkerApi}
*/
- WorkerApi
+ WorkerApi,
+
+ /**
+ * The WorkerMgtApi service constructor.
+ * @property {module:manager/WorkerMgtApi}
+ */
+ WorkerMgtApi
};
diff --git a/web/app/src/manager-api/manager/WorkerMgtApi.js b/web/app/src/manager-api/manager/WorkerMgtApi.js
new file mode 100644
index 00000000..be5297de
--- /dev/null
+++ b/web/app/src/manager-api/manager/WorkerMgtApi.js
@@ -0,0 +1,77 @@
+/**
+ * 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 WorkerList from '../model/WorkerList';
+
+/**
+* WorkerMgt service.
+* @module manager/WorkerMgtApi
+* @version 0.0.0
+*/
+export default class WorkerMgtApi {
+
+ /**
+ * Constructs a new WorkerMgtApi.
+ * @alias module:manager/WorkerMgtApi
+ * @class
+ * @param {module:ApiClient} [apiClient] Optional API client implementation to use,
+ * default to {@link module:ApiClient#instance} if unspecified.
+ */
+ constructor(apiClient) {
+ this.apiClient = apiClient || ApiClient.instance;
+ }
+
+
+
+ /**
+ * Get list of workers.
+ * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/WorkerList} and HTTP response
+ */
+ fetchWorkersWithHttpInfo() {
+ let postBody = null;
+
+ let pathParams = {
+ };
+ let queryParams = {
+ };
+ let headerParams = {
+ };
+ let formParams = {
+ };
+
+ let authNames = [];
+ let contentTypes = [];
+ let accepts = ['application/json'];
+ let returnType = WorkerList;
+ return this.apiClient.callApi(
+ '/api/worker-mgt/workers', 'GET',
+ pathParams, queryParams, headerParams, formParams, postBody,
+ authNames, contentTypes, accepts, returnType, null
+ );
+ }
+
+ /**
+ * Get list of workers.
+ * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/WorkerList}
+ */
+ fetchWorkers() {
+ return this.fetchWorkersWithHttpInfo()
+ .then(function(response_and_data) {
+ return response_and_data.data;
+ });
+ }
+
+
+}
diff --git a/web/app/src/manager-api/model/WorkerList.js b/web/app/src/manager-api/model/WorkerList.js
new file mode 100644
index 00000000..cee23c1f
--- /dev/null
+++ b/web/app/src/manager-api/model/WorkerList.js
@@ -0,0 +1,75 @@
+/**
+ * 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 WorkerSummary from './WorkerSummary';
+
+/**
+ * The WorkerList model module.
+ * @module model/WorkerList
+ * @version 0.0.0
+ */
+class WorkerList {
+ /**
+ * Constructs a new WorkerList
.
+ * List of workers.
+ * @alias module:model/WorkerList
+ * @param workers {Array.}
+ */
+ constructor(workers) {
+
+ WorkerList.initialize(this, workers);
+ }
+
+ /**
+ * 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, workers) {
+ obj['workers'] = workers;
+ }
+
+ /**
+ * Constructs a WorkerList
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/WorkerList} obj Optional instance to populate.
+ * @return {module:model/WorkerList} The populated WorkerList
instance.
+ */
+ static constructFromObject(data, obj) {
+ if (data) {
+ obj = obj || new WorkerList();
+
+ if (data.hasOwnProperty('workers')) {
+ obj['workers'] = ApiClient.convertToType(data['workers'], [WorkerSummary]);
+ }
+ }
+ return obj;
+ }
+
+
+}
+
+/**
+ * @member {Array.} workers
+ */
+WorkerList.prototype['workers'] = undefined;
+
+
+
+
+
+
+export default WorkerList;
+
diff --git a/web/app/src/manager-api/model/WorkerSummary.js b/web/app/src/manager-api/model/WorkerSummary.js
new file mode 100644
index 00000000..dbf8898d
--- /dev/null
+++ b/web/app/src/manager-api/model/WorkerSummary.js
@@ -0,0 +1,103 @@
+/**
+ * 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 WorkerStatus from './WorkerStatus';
+
+/**
+ * The WorkerSummary model module.
+ * @module model/WorkerSummary
+ * @version 0.0.0
+ */
+class WorkerSummary {
+ /**
+ * Constructs a new WorkerSummary
.
+ * Basic information about a Worker.
+ * @alias module:model/WorkerSummary
+ * @param id {String}
+ * @param nickname {String}
+ * @param status {module:model/WorkerStatus}
+ */
+ constructor(id, nickname, status) {
+
+ WorkerSummary.initialize(this, id, nickname, status);
+ }
+
+ /**
+ * 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, id, nickname, status) {
+ obj['id'] = id;
+ obj['nickname'] = nickname;
+ obj['status'] = status;
+ }
+
+ /**
+ * Constructs a WorkerSummary
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/WorkerSummary} obj Optional instance to populate.
+ * @return {module:model/WorkerSummary} The populated WorkerSummary
instance.
+ */
+ static constructFromObject(data, obj) {
+ if (data) {
+ obj = obj || new WorkerSummary();
+
+ if (data.hasOwnProperty('id')) {
+ obj['id'] = ApiClient.convertToType(data['id'], 'String');
+ }
+ if (data.hasOwnProperty('nickname')) {
+ obj['nickname'] = ApiClient.convertToType(data['nickname'], 'String');
+ }
+ if (data.hasOwnProperty('status')) {
+ obj['status'] = WorkerStatus.constructFromObject(data['status']);
+ }
+ if (data.hasOwnProperty('status_requested')) {
+ obj['status_requested'] = WorkerStatus.constructFromObject(data['status_requested']);
+ }
+ }
+ return obj;
+ }
+
+
+}
+
+/**
+ * @member {String} id
+ */
+WorkerSummary.prototype['id'] = undefined;
+
+/**
+ * @member {String} nickname
+ */
+WorkerSummary.prototype['nickname'] = undefined;
+
+/**
+ * @member {module:model/WorkerStatus} status
+ */
+WorkerSummary.prototype['status'] = undefined;
+
+/**
+ * @member {module:model/WorkerStatus} status_requested
+ */
+WorkerSummary.prototype['status_requested'] = undefined;
+
+
+
+
+
+
+export default WorkerSummary;
+