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; +