diff --git a/addon/flamenco/manager/__init__.py b/addon/flamenco/manager/__init__.py index 3b7feb48..bd86aa21 100644 --- a/addon/flamenco/manager/__init__.py +++ b/addon/flamenco/manager/__init__.py @@ -10,7 +10,7 @@ """ -__version__ = "b3f245cf" +__version__ = "186dd064" # import ApiClient from flamenco.manager.api_client import ApiClient diff --git a/addon/flamenco/manager/api/meta_api.py b/addon/flamenco/manager/api/meta_api.py index 88ecf65e..2adb0883 100644 --- a/addon/flamenco/manager/api/meta_api.py +++ b/addon/flamenco/manager/api/meta_api.py @@ -21,6 +21,8 @@ from flamenco.manager.model_utils import ( # noqa: F401 none_type, validate_and_convert_types ) +from flamenco.manager.model.blender_path_check_result import BlenderPathCheckResult +from flamenco.manager.model.blender_path_find_result import BlenderPathFindResult from flamenco.manager.model.error import Error from flamenco.manager.model.flamenco_version import FlamencoVersion from flamenco.manager.model.manager_configuration import ManagerConfiguration @@ -41,6 +43,54 @@ class MetaApi(object): if api_client is None: api_client = ApiClient() self.api_client = api_client + self.check_blender_exe_path_endpoint = _Endpoint( + settings={ + 'response_type': (BlenderPathCheckResult,), + 'auth': [], + 'endpoint_path': '/api/v3/configuration/check/blender', + 'operation_id': 'check_blender_exe_path', + 'http_method': 'POST', + 'servers': None, + }, + params_map={ + 'all': [ + 'path_check_input', + ], + 'required': [], + 'nullable': [ + ], + 'enum': [ + ], + 'validation': [ + ] + }, + root_map={ + 'validations': { + }, + 'allowed_values': { + }, + 'openapi_types': { + 'path_check_input': + (PathCheckInput,), + }, + 'attribute_map': { + }, + 'location_map': { + 'path_check_input': 'body', + }, + 'collection_format_map': { + } + }, + headers_map={ + 'accept': [ + 'application/json' + ], + 'content_type': [ + 'application/json' + ] + }, + api_client=api_client + ) self.check_shared_storage_path_endpoint = _Endpoint( settings={ 'response_type': (PathCheckResult,), @@ -89,6 +139,48 @@ class MetaApi(object): }, api_client=api_client ) + self.find_blender_exe_path_endpoint = _Endpoint( + settings={ + 'response_type': (BlenderPathFindResult,), + 'auth': [], + 'endpoint_path': '/api/v3/configuration/check/blender', + 'operation_id': 'find_blender_exe_path', + '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 + ) self.get_configuration_endpoint = _Endpoint( settings={ 'response_type': (ManagerConfiguration,), @@ -272,6 +364,79 @@ class MetaApi(object): api_client=api_client ) + def check_blender_exe_path( + self, + **kwargs + ): + """Validate a CLI command for use as way to start Blender # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + + >>> thread = api.check_blender_exe_path(async_req=True) + >>> result = thread.get() + + + Keyword Args: + path_check_input (PathCheckInput): Command or executable path to check. [optional] + _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: + BlenderPathCheckResult + 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.check_blender_exe_path_endpoint.call_with_http_info(**kwargs) + def check_shared_storage_path( self, **kwargs @@ -345,6 +510,78 @@ class MetaApi(object): kwargs['_host_index'] = kwargs.get('_host_index') return self.check_shared_storage_path_endpoint.call_with_http_info(**kwargs) + def find_blender_exe_path( + self, + **kwargs + ): + """Find one or more CLI commands for use as way to start Blender # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + + >>> thread = api.find_blender_exe_path(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: + BlenderPathFindResult + 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.find_blender_exe_path_endpoint.call_with_http_info(**kwargs) + def get_configuration( self, **kwargs diff --git a/addon/flamenco/manager/api_client.py b/addon/flamenco/manager/api_client.py index 1231d722..4ef81c4f 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/b3f245cf (Blender add-on)' + self.user_agent = 'Flamenco/186dd064 (Blender add-on)' def __enter__(self): return self diff --git a/addon/flamenco/manager/configuration.py b/addon/flamenco/manager/configuration.py index d3cc8bbe..4daaf214 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: b3f245cf".\ + "SDK Package Version: 186dd064".\ format(env=sys.platform, pyversion=sys.version) def get_host_settings(self): diff --git a/addon/flamenco/manager/docs/BlenderPathCheckResult.md b/addon/flamenco/manager/docs/BlenderPathCheckResult.md new file mode 100644 index 00000000..8349776b --- /dev/null +++ b/addon/flamenco/manager/docs/BlenderPathCheckResult.md @@ -0,0 +1,16 @@ +# BlenderPathCheckResult + + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**path** | **str** | The path that was found. | +**source** | [**BlenderPathSource**](BlenderPathSource.md) | | +**is_usable** | **bool** | Whether the path is usable or not. | +**cause** | **str** | Description of why this path is (not) usable. | +**input** | **str** | The input that was given to find this Blender. | [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/docs/BlenderPathFindResult.md b/addon/flamenco/manager/docs/BlenderPathFindResult.md new file mode 100644 index 00000000..ca37b143 --- /dev/null +++ b/addon/flamenco/manager/docs/BlenderPathFindResult.md @@ -0,0 +1,11 @@ +# BlenderPathFindResult + + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**value** | [**[BlenderPathCheckResult]**](BlenderPathCheckResult.md) | | + +[[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/BlenderPathSource.md b/addon/flamenco/manager/docs/BlenderPathSource.md new file mode 100644 index 00000000..c0150a8a --- /dev/null +++ b/addon/flamenco/manager/docs/BlenderPathSource.md @@ -0,0 +1,11 @@ +# BlenderPathSource + + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**value** | **str** | | must be one of ["file_association", "path_envvar", "input_path", ] + +[[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/MetaApi.md b/addon/flamenco/manager/docs/MetaApi.md index f29c66b2..ce0a5525 100644 --- a/addon/flamenco/manager/docs/MetaApi.md +++ b/addon/flamenco/manager/docs/MetaApi.md @@ -4,13 +4,86 @@ All URIs are relative to *http://localhost* Method | HTTP request | Description ------------- | ------------- | ------------- +[**check_blender_exe_path**](MetaApi.md#check_blender_exe_path) | **POST** /api/v3/configuration/check/blender | Validate a CLI command for use as way to start Blender [**check_shared_storage_path**](MetaApi.md#check_shared_storage_path) | **POST** /api/v3/configuration/check/shared-storage | Validate a path for use as shared storage. +[**find_blender_exe_path**](MetaApi.md#find_blender_exe_path) | **GET** /api/v3/configuration/check/blender | Find one or more CLI commands for use as way to start Blender [**get_configuration**](MetaApi.md#get_configuration) | **GET** /api/v3/configuration | Get the configuration of this Manager. [**get_configuration_file**](MetaApi.md#get_configuration_file) | **GET** /api/v3/configuration/file | Retrieve the configuration of Flamenco Manager. [**get_variables**](MetaApi.md#get_variables) | **GET** /api/v3/configuration/variables/{audience}/{platform} | Get the variables of this Manager. Used by the Blender add-on to recognise two-way variables, and for the web interface to do variable replacement based on the browser's platform. [**get_version**](MetaApi.md#get_version) | **GET** /api/v3/version | Get the Flamenco version of this Manager +# **check_blender_exe_path** +> BlenderPathCheckResult check_blender_exe_path() + +Validate a CLI command for use as way to start Blender + +### Example + + +```python +import time +import flamenco.manager +from flamenco.manager.api import meta_api +from flamenco.manager.model.error import Error +from flamenco.manager.model.path_check_input import PathCheckInput +from flamenco.manager.model.blender_path_check_result import BlenderPathCheckResult +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 = meta_api.MetaApi(api_client) + path_check_input = PathCheckInput( + path="path_example", + ) # PathCheckInput | Command or executable path to check (optional) + + # example passing only required values which don't have defaults set + # and optional values + try: + # Validate a CLI command for use as way to start Blender + api_response = api_instance.check_blender_exe_path(path_check_input=path_check_input) + pprint(api_response) + except flamenco.manager.ApiException as e: + print("Exception when calling MetaApi->check_blender_exe_path: %s\n" % e) +``` + + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **path_check_input** | [**PathCheckInput**](PathCheckInput.md)| Command or executable path to check | [optional] + +### Return type + +[**BlenderPathCheckResult**](BlenderPathCheckResult.md) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: application/json + - **Accept**: application/json + + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Normal response, path check went fine. | - | +**0** | Something went wrong. | - | + +[[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) + # **check_shared_storage_path** > PathCheckResult check_shared_storage_path() @@ -82,6 +155,69 @@ No authorization required [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) +# **find_blender_exe_path** +> BlenderPathFindResult find_blender_exe_path() + +Find one or more CLI commands for use as way to start Blender + +### Example + + +```python +import time +import flamenco.manager +from flamenco.manager.api import meta_api +from flamenco.manager.model.error import Error +from flamenco.manager.model.blender_path_find_result import BlenderPathFindResult +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 = meta_api.MetaApi(api_client) + + # example, this endpoint has no required or optional parameters + try: + # Find one or more CLI commands for use as way to start Blender + api_response = api_instance.find_blender_exe_path() + pprint(api_response) + except flamenco.manager.ApiException as e: + print("Exception when calling MetaApi->find_blender_exe_path: %s\n" % e) +``` + + +### Parameters +This endpoint does not need any parameter. + +### Return type + +[**BlenderPathFindResult**](BlenderPathFindResult.md) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Found locations of Blender. | - | +**0** | Something went wrong. | - | + +[[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) + # **get_configuration** > ManagerConfiguration get_configuration() diff --git a/addon/flamenco/manager/docs/PathCheckResult.md b/addon/flamenco/manager/docs/PathCheckResult.md index e18dbca3..a100aa9c 100644 --- a/addon/flamenco/manager/docs/PathCheckResult.md +++ b/addon/flamenco/manager/docs/PathCheckResult.md @@ -6,7 +6,7 @@ Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- **path** | **str** | The path that was checked. | **is_usable** | **bool** | Whether the path is usable or not. | -**cause** | **str** | Description of why this path is not usable. | +**cause** | **str** | Description of why this path is (not) usable. | **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/blender_path_check_result.py b/addon/flamenco/manager/model/blender_path_check_result.py new file mode 100644 index 00000000..ee295daf --- /dev/null +++ b/addon/flamenco/manager/model/blender_path_check_result.py @@ -0,0 +1,289 @@ +""" + 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.blender_path_source import BlenderPathSource + globals()['BlenderPathSource'] = BlenderPathSource + + +class BlenderPathCheckResult(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 { + 'path': (str,), # noqa: E501 + 'source': (BlenderPathSource,), # noqa: E501 + 'is_usable': (bool,), # noqa: E501 + 'cause': (str,), # noqa: E501 + 'input': (str,), # noqa: E501 + } + + @cached_property + def discriminator(): + return None + + + attribute_map = { + 'path': 'path', # noqa: E501 + 'source': 'source', # noqa: E501 + 'is_usable': 'is_usable', # noqa: E501 + 'cause': 'cause', # noqa: E501 + 'input': 'input', # noqa: E501 + } + + read_only_vars = { + } + + _composed_schemas = {} + + @classmethod + @convert_js_args_to_python_args + def _from_openapi_data(cls, path, source, is_usable, cause, *args, **kwargs): # noqa: E501 + """BlenderPathCheckResult - a model defined in OpenAPI + + Args: + path (str): The path that was found. + source (BlenderPathSource): + is_usable (bool): Whether the path is usable or not. + cause (str): Description of why this path is (not) usable. + + 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,) + input (str): The input that was given to find this Blender.. [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.path = path + self.source = source + self.is_usable = is_usable + self.cause = cause + 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, path, source, is_usable, cause, *args, **kwargs): # noqa: E501 + """BlenderPathCheckResult - a model defined in OpenAPI + + Args: + path (str): The path that was found. + source (BlenderPathSource): + is_usable (bool): Whether the path is usable or not. + cause (str): Description of why this path is (not) usable. + + 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,) + input (str): The input that was given to find this Blender.. [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.path = path + self.source = source + self.is_usable = is_usable + self.cause = cause + 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/blender_path_find_result.py b/addon/flamenco/manager/model/blender_path_find_result.py new file mode 100644 index 00000000..868f1702 --- /dev/null +++ b/addon/flamenco/manager/model/blender_path_find_result.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.blender_path_check_result import BlenderPathCheckResult + globals()['BlenderPathCheckResult'] = BlenderPathCheckResult + + +class BlenderPathFindResult(ModelSimple): + """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. + 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 = { + } + + additional_properties_type = None + + _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 { + 'value': ([BlenderPathCheckResult],), + } + + @cached_property + def discriminator(): + return None + + + attribute_map = {} + + read_only_vars = set() + + _composed_schemas = None + + 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, *args, **kwargs): + """BlenderPathFindResult - a model defined in OpenAPI + + Note that value can be passed either in args or in kwargs, but not in both. + + Args: + args[0] ([BlenderPathCheckResult]): # noqa: E501 + + Keyword Args: + value ([BlenderPathCheckResult]): # noqa: E501 + _check_type (bool): if True, values for parameters in openapi_types + will be type checked and a TypeError will be + raised if the wrong type is input. + 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,) + """ + # required up here when default value is not given + _path_to_item = kwargs.pop('_path_to_item', ()) + + if 'value' in kwargs: + value = kwargs.pop('value') + elif args: + args = list(args) + value = args.pop(0) + else: + raise ApiTypeError( + "value is required, but not passed in args or kwargs and doesn't have default", + path_to_item=_path_to_item, + valid_classes=(self.__class__,), + ) + + _check_type = kwargs.pop('_check_type', True) + _spec_property_naming = kwargs.pop('_spec_property_naming', False) + _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.value = value + if kwargs: + raise ApiTypeError( + "Invalid named arguments=%s passed to %s. Remove those invalid named arguments." % ( + kwargs, + self.__class__.__name__, + ), + path_to_item=_path_to_item, + valid_classes=(self.__class__,), + ) + + @classmethod + @convert_js_args_to_python_args + def _from_openapi_data(cls, *args, **kwargs): + """BlenderPathFindResult - a model defined in OpenAPI + + Note that value can be passed either in args or in kwargs, but not in both. + + Args: + args[0] ([BlenderPathCheckResult]): # noqa: E501 + + Keyword Args: + value ([BlenderPathCheckResult]): # noqa: E501 + _check_type (bool): if True, values for parameters in openapi_types + will be type checked and a TypeError will be + raised if the wrong type is input. + 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,) + """ + # required up here when default value is not given + _path_to_item = kwargs.pop('_path_to_item', ()) + + self = super(OpenApiModel, cls).__new__(cls) + + if 'value' in kwargs: + value = kwargs.pop('value') + elif args: + args = list(args) + value = args.pop(0) + else: + raise ApiTypeError( + "value is required, but not passed in args or kwargs and doesn't have default", + path_to_item=_path_to_item, + valid_classes=(self.__class__,), + ) + + _check_type = kwargs.pop('_check_type', True) + _spec_property_naming = kwargs.pop('_spec_property_naming', False) + _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.value = value + if kwargs: + raise ApiTypeError( + "Invalid named arguments=%s passed to %s. Remove those invalid named arguments." % ( + kwargs, + self.__class__.__name__, + ), + path_to_item=_path_to_item, + valid_classes=(self.__class__,), + ) + + return self diff --git a/addon/flamenco/manager/model/blender_path_source.py b/addon/flamenco/manager/model/blender_path_source.py new file mode 100644 index 00000000..134c535b --- /dev/null +++ b/addon/flamenco/manager/model/blender_path_source.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 + + + +class BlenderPathSource(ModelSimple): + """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. + 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 = { + ('value',): { + 'FILE_ASSOCIATION': "file_association", + 'PATH_ENVVAR': "path_envvar", + 'INPUT_PATH': "input_path", + }, + } + + validations = { + } + + additional_properties_type = None + + _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. + """ + return { + 'value': (str,), + } + + @cached_property + def discriminator(): + return None + + + attribute_map = {} + + read_only_vars = set() + + _composed_schemas = None + + 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, *args, **kwargs): + """BlenderPathSource - a model defined in OpenAPI + + Note that value can be passed either in args or in kwargs, but not in both. + + Args: + args[0] (str):, must be one of ["file_association", "path_envvar", "input_path", ] # noqa: E501 + + Keyword Args: + value (str):, must be one of ["file_association", "path_envvar", "input_path", ] # noqa: E501 + _check_type (bool): if True, values for parameters in openapi_types + will be type checked and a TypeError will be + raised if the wrong type is input. + 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,) + """ + # required up here when default value is not given + _path_to_item = kwargs.pop('_path_to_item', ()) + + if 'value' in kwargs: + value = kwargs.pop('value') + elif args: + args = list(args) + value = args.pop(0) + else: + raise ApiTypeError( + "value is required, but not passed in args or kwargs and doesn't have default", + path_to_item=_path_to_item, + valid_classes=(self.__class__,), + ) + + _check_type = kwargs.pop('_check_type', True) + _spec_property_naming = kwargs.pop('_spec_property_naming', False) + _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.value = value + if kwargs: + raise ApiTypeError( + "Invalid named arguments=%s passed to %s. Remove those invalid named arguments." % ( + kwargs, + self.__class__.__name__, + ), + path_to_item=_path_to_item, + valid_classes=(self.__class__,), + ) + + @classmethod + @convert_js_args_to_python_args + def _from_openapi_data(cls, *args, **kwargs): + """BlenderPathSource - a model defined in OpenAPI + + Note that value can be passed either in args or in kwargs, but not in both. + + Args: + args[0] (str):, must be one of ["file_association", "path_envvar", "input_path", ] # noqa: E501 + + Keyword Args: + value (str):, must be one of ["file_association", "path_envvar", "input_path", ] # noqa: E501 + _check_type (bool): if True, values for parameters in openapi_types + will be type checked and a TypeError will be + raised if the wrong type is input. + 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,) + """ + # required up here when default value is not given + _path_to_item = kwargs.pop('_path_to_item', ()) + + self = super(OpenApiModel, cls).__new__(cls) + + if 'value' in kwargs: + value = kwargs.pop('value') + elif args: + args = list(args) + value = args.pop(0) + else: + raise ApiTypeError( + "value is required, but not passed in args or kwargs and doesn't have default", + path_to_item=_path_to_item, + valid_classes=(self.__class__,), + ) + + _check_type = kwargs.pop('_check_type', True) + _spec_property_naming = kwargs.pop('_spec_property_naming', False) + _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.value = value + if kwargs: + raise ApiTypeError( + "Invalid named arguments=%s passed to %s. Remove those invalid named arguments." % ( + kwargs, + self.__class__.__name__, + ), + path_to_item=_path_to_item, + valid_classes=(self.__class__,), + ) + + return self diff --git a/addon/flamenco/manager/model/path_check_result.py b/addon/flamenco/manager/model/path_check_result.py index 1a67e687..8ed29504 100644 --- a/addon/flamenco/manager/model/path_check_result.py +++ b/addon/flamenco/manager/model/path_check_result.py @@ -110,7 +110,7 @@ class PathCheckResult(ModelNormal): Args: path (str): The path that was checked. is_usable (bool): Whether the path is usable or not. - cause (str): Description of why this path is not usable. + cause (str): Description of why this path is (not) usable. Keyword Args: _check_type (bool): if True, values for parameters in openapi_types @@ -199,7 +199,7 @@ class PathCheckResult(ModelNormal): Args: path (str): The path that was checked. is_usable (bool): Whether the path is usable or not. - cause (str): Description of why this path is not usable. + cause (str): Description of why this path is (not) usable. Keyword Args: _check_type (bool): if True, values for parameters in openapi_types diff --git a/addon/flamenco/manager/models/__init__.py b/addon/flamenco/manager/models/__init__.py index 92275d86..41a1a69e 100644 --- a/addon/flamenco/manager/models/__init__.py +++ b/addon/flamenco/manager/models/__init__.py @@ -16,6 +16,9 @@ from flamenco.manager.model.available_job_setting_type import AvailableJobSettin from flamenco.manager.model.available_job_setting_visibility import AvailableJobSettingVisibility from flamenco.manager.model.available_job_type import AvailableJobType from flamenco.manager.model.available_job_types import AvailableJobTypes +from flamenco.manager.model.blender_path_check_result import BlenderPathCheckResult +from flamenco.manager.model.blender_path_find_result import BlenderPathFindResult +from flamenco.manager.model.blender_path_source import BlenderPathSource from flamenco.manager.model.command import Command from flamenco.manager.model.error import Error from flamenco.manager.model.flamenco_version import FlamencoVersion diff --git a/addon/flamenco/manager_README.md b/addon/flamenco/manager_README.md index e5015fea..abc52c3a 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: b3f245cf +- Package version: 186dd064 - Build package: org.openapitools.codegen.languages.PythonClientCodegen For more information, please visit [https://flamenco.io/](https://flamenco.io/) @@ -86,7 +86,9 @@ Class | Method | HTTP request | Description *JobsApi* | [**set_job_status**](flamenco/manager/docs/JobsApi.md#set_job_status) | **POST** /api/v3/jobs/{job_id}/setstatus | *JobsApi* | [**set_task_status**](flamenco/manager/docs/JobsApi.md#set_task_status) | **POST** /api/v3/tasks/{task_id}/setstatus | *JobsApi* | [**submit_job**](flamenco/manager/docs/JobsApi.md#submit_job) | **POST** /api/v3/jobs | Submit a new job for Flamenco Manager to execute. +*MetaApi* | [**check_blender_exe_path**](flamenco/manager/docs/MetaApi.md#check_blender_exe_path) | **POST** /api/v3/configuration/check/blender | Validate a CLI command for use as way to start Blender *MetaApi* | [**check_shared_storage_path**](flamenco/manager/docs/MetaApi.md#check_shared_storage_path) | **POST** /api/v3/configuration/check/shared-storage | Validate a path for use as shared storage. +*MetaApi* | [**find_blender_exe_path**](flamenco/manager/docs/MetaApi.md#find_blender_exe_path) | **GET** /api/v3/configuration/check/blender | Find one or more CLI commands for use as way to start Blender *MetaApi* | [**get_configuration**](flamenco/manager/docs/MetaApi.md#get_configuration) | **GET** /api/v3/configuration | Get the configuration of this Manager. *MetaApi* | [**get_configuration_file**](flamenco/manager/docs/MetaApi.md#get_configuration_file) | **GET** /api/v3/configuration/file | Retrieve the configuration of Flamenco Manager. *MetaApi* | [**get_variables**](flamenco/manager/docs/MetaApi.md#get_variables) | **GET** /api/v3/configuration/variables/{audience}/{platform} | Get the variables of this Manager. Used by the Blender add-on to recognise two-way variables, and for the web interface to do variable replacement based on the browser's platform. @@ -118,6 +120,9 @@ Class | Method | HTTP request | Description - [AvailableJobSettingVisibility](flamenco/manager/docs/AvailableJobSettingVisibility.md) - [AvailableJobType](flamenco/manager/docs/AvailableJobType.md) - [AvailableJobTypes](flamenco/manager/docs/AvailableJobTypes.md) + - [BlenderPathCheckResult](flamenco/manager/docs/BlenderPathCheckResult.md) + - [BlenderPathFindResult](flamenco/manager/docs/BlenderPathFindResult.md) + - [BlenderPathSource](flamenco/manager/docs/BlenderPathSource.md) - [Command](flamenco/manager/docs/Command.md) - [Error](flamenco/manager/docs/Error.md) - [FlamencoVersion](flamenco/manager/docs/FlamencoVersion.md) diff --git a/pkg/api/openapi_client.gen.go b/pkg/api/openapi_client.gen.go index dc934a6f..f1ca06e9 100644 --- a/pkg/api/openapi_client.gen.go +++ b/pkg/api/openapi_client.gen.go @@ -95,6 +95,14 @@ type ClientInterface interface { // GetConfiguration request GetConfiguration(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) + // FindBlenderExePath request + FindBlenderExePath(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) + + // CheckBlenderExePath request with any body + CheckBlenderExePathWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + + CheckBlenderExePath(ctx context.Context, body CheckBlenderExePathJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + // CheckSharedStoragePath request with any body CheckSharedStoragePathWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) @@ -236,6 +244,42 @@ func (c *Client) GetConfiguration(ctx context.Context, reqEditors ...RequestEdit return c.Client.Do(req) } +func (c *Client) FindBlenderExePath(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewFindBlenderExePathRequest(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) CheckBlenderExePathWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewCheckBlenderExePathRequestWithBody(c.Server, contentType, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) CheckBlenderExePath(ctx context.Context, body CheckBlenderExePathJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewCheckBlenderExePathRequest(c.Server, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + func (c *Client) CheckSharedStoragePathWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { req, err := NewCheckSharedStoragePathRequestWithBody(c.Server, contentType, body) if err != nil { @@ -827,6 +871,73 @@ func NewGetConfigurationRequest(server string) (*http.Request, error) { return req, nil } +// NewFindBlenderExePathRequest generates requests for FindBlenderExePath +func NewFindBlenderExePathRequest(server string) (*http.Request, error) { + var err error + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/api/v3/configuration/check/blender") + 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 +} + +// NewCheckBlenderExePathRequest calls the generic CheckBlenderExePath builder with application/json body +func NewCheckBlenderExePathRequest(server string, body CheckBlenderExePathJSONRequestBody) (*http.Request, error) { + var bodyReader io.Reader + buf, err := json.Marshal(body) + if err != nil { + return nil, err + } + bodyReader = bytes.NewReader(buf) + return NewCheckBlenderExePathRequestWithBody(server, "application/json", bodyReader) +} + +// NewCheckBlenderExePathRequestWithBody generates requests for CheckBlenderExePath with any type of body +func NewCheckBlenderExePathRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { + var err error + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/api/v3/configuration/check/blender") + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + req, err := http.NewRequest("POST", queryURL.String(), body) + if err != nil { + return nil, err + } + + req.Header.Add("Content-Type", contentType) + + return req, nil +} + // NewCheckSharedStoragePathRequest calls the generic CheckSharedStoragePath builder with application/json body func NewCheckSharedStoragePathRequest(server string, body CheckSharedStoragePathJSONRequestBody) (*http.Request, error) { var bodyReader io.Reader @@ -2133,6 +2244,14 @@ type ClientWithResponsesInterface interface { // GetConfiguration request GetConfigurationWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetConfigurationResponse, error) + // FindBlenderExePath request + FindBlenderExePathWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*FindBlenderExePathResponse, error) + + // CheckBlenderExePath request with any body + CheckBlenderExePathWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*CheckBlenderExePathResponse, error) + + CheckBlenderExePathWithResponse(ctx context.Context, body CheckBlenderExePathJSONRequestBody, reqEditors ...RequestEditorFn) (*CheckBlenderExePathResponse, error) + // CheckSharedStoragePath request with any body CheckSharedStoragePathWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*CheckSharedStoragePathResponse, error) @@ -2284,6 +2403,52 @@ func (r GetConfigurationResponse) StatusCode() int { return 0 } +type FindBlenderExePathResponse struct { + Body []byte + HTTPResponse *http.Response + JSON200 *BlenderPathFindResult + JSONDefault *Error +} + +// Status returns HTTPResponse.Status +func (r FindBlenderExePathResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r FindBlenderExePathResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + +type CheckBlenderExePathResponse struct { + Body []byte + HTTPResponse *http.Response + JSON200 *BlenderPathCheckResult + JSONDefault *Error +} + +// Status returns HTTPResponse.Status +func (r CheckBlenderExePathResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r CheckBlenderExePathResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + type CheckSharedStoragePathResponse struct { Body []byte HTTPResponse *http.Response @@ -3065,6 +3230,32 @@ func (c *ClientWithResponses) GetConfigurationWithResponse(ctx context.Context, return ParseGetConfigurationResponse(rsp) } +// FindBlenderExePathWithResponse request returning *FindBlenderExePathResponse +func (c *ClientWithResponses) FindBlenderExePathWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*FindBlenderExePathResponse, error) { + rsp, err := c.FindBlenderExePath(ctx, reqEditors...) + if err != nil { + return nil, err + } + return ParseFindBlenderExePathResponse(rsp) +} + +// CheckBlenderExePathWithBodyWithResponse request with arbitrary body returning *CheckBlenderExePathResponse +func (c *ClientWithResponses) CheckBlenderExePathWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*CheckBlenderExePathResponse, error) { + rsp, err := c.CheckBlenderExePathWithBody(ctx, contentType, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseCheckBlenderExePathResponse(rsp) +} + +func (c *ClientWithResponses) CheckBlenderExePathWithResponse(ctx context.Context, body CheckBlenderExePathJSONRequestBody, reqEditors ...RequestEditorFn) (*CheckBlenderExePathResponse, error) { + rsp, err := c.CheckBlenderExePath(ctx, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseCheckBlenderExePathResponse(rsp) +} + // CheckSharedStoragePathWithBodyWithResponse request with arbitrary body returning *CheckSharedStoragePathResponse func (c *ClientWithResponses) CheckSharedStoragePathWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*CheckSharedStoragePathResponse, error) { rsp, err := c.CheckSharedStoragePathWithBody(ctx, contentType, body, reqEditors...) @@ -3501,6 +3692,72 @@ func ParseGetConfigurationResponse(rsp *http.Response) (*GetConfigurationRespons return response, nil } +// ParseFindBlenderExePathResponse parses an HTTP response from a FindBlenderExePathWithResponse call +func ParseFindBlenderExePathResponse(rsp *http.Response) (*FindBlenderExePathResponse, error) { + bodyBytes, err := ioutil.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &FindBlenderExePathResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest BlenderPathFindResult + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON200 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: + var dest Error + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSONDefault = &dest + + } + + return response, nil +} + +// ParseCheckBlenderExePathResponse parses an HTTP response from a CheckBlenderExePathWithResponse call +func ParseCheckBlenderExePathResponse(rsp *http.Response) (*CheckBlenderExePathResponse, error) { + bodyBytes, err := ioutil.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &CheckBlenderExePathResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest BlenderPathCheckResult + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON200 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: + var dest Error + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSONDefault = &dest + + } + + return response, nil +} + // ParseCheckSharedStoragePathResponse parses an HTTP response from a CheckSharedStoragePathWithResponse call func ParseCheckSharedStoragePathResponse(rsp *http.Response) (*CheckSharedStoragePathResponse, error) { bodyBytes, err := ioutil.ReadAll(rsp.Body) diff --git a/pkg/api/openapi_server.gen.go b/pkg/api/openapi_server.gen.go index ac7f7ce4..1f57abeb 100644 --- a/pkg/api/openapi_server.gen.go +++ b/pkg/api/openapi_server.gen.go @@ -16,6 +16,12 @@ type ServerInterface interface { // Get the configuration of this Manager. // (GET /api/v3/configuration) GetConfiguration(ctx echo.Context) error + // Find one or more CLI commands for use as way to start Blender + // (GET /api/v3/configuration/check/blender) + FindBlenderExePath(ctx echo.Context) error + // Validate a CLI command for use as way to start Blender + // (POST /api/v3/configuration/check/blender) + CheckBlenderExePath(ctx echo.Context) error // Validate a path for use as shared storage. // (POST /api/v3/configuration/check/shared-storage) CheckSharedStoragePath(ctx echo.Context) error @@ -135,6 +141,24 @@ func (w *ServerInterfaceWrapper) GetConfiguration(ctx echo.Context) error { return err } +// FindBlenderExePath converts echo context to params. +func (w *ServerInterfaceWrapper) FindBlenderExePath(ctx echo.Context) error { + var err error + + // Invoke the callback with all the unmarshalled arguments + err = w.Handler.FindBlenderExePath(ctx) + return err +} + +// CheckBlenderExePath converts echo context to params. +func (w *ServerInterfaceWrapper) CheckBlenderExePath(ctx echo.Context) error { + var err error + + // Invoke the callback with all the unmarshalled arguments + err = w.Handler.CheckBlenderExePath(ctx) + return err +} + // CheckSharedStoragePath converts echo context to params. func (w *ServerInterfaceWrapper) CheckSharedStoragePath(ctx echo.Context) error { var err error @@ -671,6 +695,8 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL } router.GET(baseURL+"/api/v3/configuration", wrapper.GetConfiguration) + router.GET(baseURL+"/api/v3/configuration/check/blender", wrapper.FindBlenderExePath) + router.POST(baseURL+"/api/v3/configuration/check/blender", wrapper.CheckBlenderExePath) router.POST(baseURL+"/api/v3/configuration/check/shared-storage", wrapper.CheckSharedStoragePath) router.GET(baseURL+"/api/v3/configuration/file", wrapper.GetConfigurationFile) router.GET(baseURL+"/api/v3/configuration/variables/:audience/:platform", wrapper.GetVariables) diff --git a/pkg/api/openapi_spec.gen.go b/pkg/api/openapi_spec.gen.go index b0769a54..8f34d351 100644 --- a/pkg/api/openapi_spec.gen.go +++ b/pkg/api/openapi_spec.gen.go @@ -18,165 +18,169 @@ import ( // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", - "cbTy12m5AAA=", + "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", + "AA==", } // 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 6c782e6b..eaf9585a 100644 --- a/pkg/api/openapi_types.gen.go +++ b/pkg/api/openapi_types.gen.go @@ -46,6 +46,15 @@ const ( AvailableJobSettingVisibilityWeb AvailableJobSettingVisibility = "web" ) +// Defines values for BlenderPathSource. +const ( + BlenderPathSourceFileAssociation BlenderPathSource = "file_association" + + BlenderPathSourceInputPath BlenderPathSource = "input_path" + + BlenderPathSourcePathEnvvar BlenderPathSource = "path_envvar" +) + // Defines values for JobStatus. const ( JobStatusActive JobStatus = "active" @@ -211,6 +220,28 @@ type AvailableJobTypes struct { JobTypes []AvailableJobType `json:"job_types"` } +// BlenderPathCheckResult defines model for BlenderPathCheckResult. +type BlenderPathCheckResult struct { + // Description of why this path is (not) usable. + Cause string `json:"cause"` + + // The input that was given to find this Blender. + Input *string `json:"input,omitempty"` + + // Whether the path is usable or not. + IsUsable bool `json:"is_usable"` + + // The path that was found. + Path string `json:"path"` + Source BlenderPathSource `json:"source"` +} + +// BlenderPathFindResult defines model for BlenderPathFindResult. +type BlenderPathFindResult []BlenderPathCheckResult + +// BlenderPathSource defines model for BlenderPathSource. +type BlenderPathSource string + // Command represents a single command to execute by the Worker. type Command struct { Name string `json:"name"` @@ -364,7 +395,7 @@ type PathCheckInput struct { // PathCheckResult defines model for PathCheckResult. type PathCheckResult struct { - // Description of why this path is not usable. + // Description of why this path is (not) usable. Cause string `json:"cause"` // Whether the path is usable or not. @@ -678,6 +709,9 @@ type WorkerSummary struct { Version string `json:"version"` } +// CheckBlenderExePathJSONBody defines parameters for CheckBlenderExePath. +type CheckBlenderExePathJSONBody PathCheckInput + // CheckSharedStoragePathJSONBody defines parameters for CheckSharedStoragePath. type CheckSharedStoragePathJSONBody PathCheckInput @@ -726,6 +760,9 @@ type WorkerStateChangedJSONBody WorkerStateChanged // TaskUpdateJSONBody defines parameters for TaskUpdate. type TaskUpdateJSONBody TaskUpdate +// CheckBlenderExePathJSONRequestBody defines body for CheckBlenderExePath for application/json ContentType. +type CheckBlenderExePathJSONRequestBody CheckBlenderExePathJSONBody + // CheckSharedStoragePathJSONRequestBody defines body for CheckSharedStoragePath for application/json ContentType. type CheckSharedStoragePathJSONRequestBody CheckSharedStoragePathJSONBody diff --git a/web/app/src/manager-api/ApiClient.js b/web/app/src/manager-api/ApiClient.js index 884fd7ec..78eea20c 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/b3f245cf / webbrowser' + 'User-Agent': 'Flamenco/186dd064 / webbrowser' }; /** diff --git a/web/app/src/manager-api/index.js b/web/app/src/manager-api/index.js index f3dd10b0..21012c78 100644 --- a/web/app/src/manager-api/index.js +++ b/web/app/src/manager-api/index.js @@ -20,6 +20,8 @@ import AvailableJobSettingType from './model/AvailableJobSettingType'; import AvailableJobSettingVisibility from './model/AvailableJobSettingVisibility'; import AvailableJobType from './model/AvailableJobType'; import AvailableJobTypes from './model/AvailableJobTypes'; +import BlenderPathCheckResult from './model/BlenderPathCheckResult'; +import BlenderPathSource from './model/BlenderPathSource'; import Command from './model/Command'; import Error from './model/Error'; import FlamencoVersion from './model/FlamencoVersion'; @@ -160,6 +162,18 @@ export { */ AvailableJobTypes, + /** + * The BlenderPathCheckResult model constructor. + * @property {module:model/BlenderPathCheckResult} + */ + BlenderPathCheckResult, + + /** + * The BlenderPathSource model constructor. + * @property {module:model/BlenderPathSource} + */ + BlenderPathSource, + /** * The Command model constructor. * @property {module:model/Command} diff --git a/web/app/src/manager-api/manager/MetaApi.js b/web/app/src/manager-api/manager/MetaApi.js index 1f3ace45..b6621669 100644 --- a/web/app/src/manager-api/manager/MetaApi.js +++ b/web/app/src/manager-api/manager/MetaApi.js @@ -13,6 +13,7 @@ import ApiClient from "../ApiClient"; +import BlenderPathCheckResult from '../model/BlenderPathCheckResult'; import Error from '../model/Error'; import FlamencoVersion from '../model/FlamencoVersion'; import ManagerConfiguration from '../model/ManagerConfiguration'; @@ -41,6 +42,50 @@ export default class MetaApi { + /** + * Validate a CLI command for use as way to start Blender + * @param {Object} opts Optional parameters + * @param {module:model/PathCheckInput} opts.pathCheckInput Command or executable path to check + * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/BlenderPathCheckResult} and HTTP response + */ + checkBlenderExePathWithHttpInfo(opts) { + opts = opts || {}; + let postBody = opts['pathCheckInput']; + + let pathParams = { + }; + let queryParams = { + }; + let headerParams = { + }; + let formParams = { + }; + + let authNames = []; + let contentTypes = ['application/json']; + let accepts = ['application/json']; + let returnType = BlenderPathCheckResult; + return this.apiClient.callApi( + '/api/v3/configuration/check/blender', 'POST', + pathParams, queryParams, headerParams, formParams, postBody, + authNames, contentTypes, accepts, returnType, null + ); + } + + /** + * Validate a CLI command for use as way to start Blender + * @param {Object} opts Optional parameters + * @param {module:model/PathCheckInput} opts.pathCheckInput Command or executable path to check + * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/BlenderPathCheckResult} + */ + checkBlenderExePath(opts) { + return this.checkBlenderExePathWithHttpInfo(opts) + .then(function(response_and_data) { + return response_and_data.data; + }); + } + + /** * Validate a path for use as shared storage. * @param {Object} opts Optional parameters @@ -85,6 +130,45 @@ export default class MetaApi { } + /** + * Find one or more CLI commands for use as way to start Blender + * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link Array.} and HTTP response + */ + findBlenderExePathWithHttpInfo() { + let postBody = null; + + let pathParams = { + }; + let queryParams = { + }; + let headerParams = { + }; + let formParams = { + }; + + let authNames = []; + let contentTypes = []; + let accepts = ['application/json']; + let returnType = [BlenderPathCheckResult]; + return this.apiClient.callApi( + '/api/v3/configuration/check/blender', 'GET', + pathParams, queryParams, headerParams, formParams, postBody, + authNames, contentTypes, accepts, returnType, null + ); + } + + /** + * Find one or more CLI commands for use as way to start Blender + * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link Array.} + */ + findBlenderExePath() { + return this.findBlenderExePathWithHttpInfo() + .then(function(response_and_data) { + return response_and_data.data; + }); + } + + /** * Get the configuration of this Manager. * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/ManagerConfiguration} and HTTP response diff --git a/web/app/src/manager-api/model/BlenderPathCheckResult.js b/web/app/src/manager-api/model/BlenderPathCheckResult.js new file mode 100644 index 00000000..0a0400a5 --- /dev/null +++ b/web/app/src/manager-api/model/BlenderPathCheckResult.js @@ -0,0 +1,116 @@ +/** + * 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 BlenderPathSource from './BlenderPathSource'; + +/** + * The BlenderPathCheckResult model module. + * @module model/BlenderPathCheckResult + * @version 0.0.0 + */ +class BlenderPathCheckResult { + /** + * Constructs a new BlenderPathCheckResult. + * @alias module:model/BlenderPathCheckResult + * @param path {String} The path that was found. + * @param source {module:model/BlenderPathSource} + * @param isUsable {Boolean} Whether the path is usable or not. + * @param cause {String} Description of why this path is (not) usable. + */ + constructor(path, source, isUsable, cause) { + + BlenderPathCheckResult.initialize(this, path, source, isUsable, cause); + } + + /** + * 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, path, source, isUsable, cause) { + obj['path'] = path; + obj['source'] = source; + obj['is_usable'] = isUsable; + obj['cause'] = cause; + } + + /** + * Constructs a BlenderPathCheckResult 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/BlenderPathCheckResult} obj Optional instance to populate. + * @return {module:model/BlenderPathCheckResult} The populated BlenderPathCheckResult instance. + */ + static constructFromObject(data, obj) { + if (data) { + obj = obj || new BlenderPathCheckResult(); + + if (data.hasOwnProperty('input')) { + obj['input'] = ApiClient.convertToType(data['input'], 'String'); + } + if (data.hasOwnProperty('path')) { + obj['path'] = ApiClient.convertToType(data['path'], 'String'); + } + if (data.hasOwnProperty('source')) { + obj['source'] = BlenderPathSource.constructFromObject(data['source']); + } + if (data.hasOwnProperty('is_usable')) { + obj['is_usable'] = ApiClient.convertToType(data['is_usable'], 'Boolean'); + } + if (data.hasOwnProperty('cause')) { + obj['cause'] = ApiClient.convertToType(data['cause'], 'String'); + } + } + return obj; + } + + +} + +/** + * The input that was given to find this Blender. + * @member {String} input + */ +BlenderPathCheckResult.prototype['input'] = undefined; + +/** + * The path that was found. + * @member {String} path + */ +BlenderPathCheckResult.prototype['path'] = undefined; + +/** + * @member {module:model/BlenderPathSource} source + */ +BlenderPathCheckResult.prototype['source'] = undefined; + +/** + * Whether the path is usable or not. + * @member {Boolean} is_usable + */ +BlenderPathCheckResult.prototype['is_usable'] = undefined; + +/** + * Description of why this path is (not) usable. + * @member {String} cause + */ +BlenderPathCheckResult.prototype['cause'] = undefined; + + + + + + +export default BlenderPathCheckResult; + diff --git a/web/app/src/manager-api/model/BlenderPathSource.js b/web/app/src/manager-api/model/BlenderPathSource.js new file mode 100644 index 00000000..5d2a1366 --- /dev/null +++ b/web/app/src/manager-api/model/BlenderPathSource.js @@ -0,0 +1,53 @@ +/** + * 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'; +/** +* Enum class BlenderPathSource. +* @enum {} +* @readonly +*/ +export default class BlenderPathSource { + + /** + * value: "file_association" + * @const + */ + "file_association" = "file_association"; + + + /** + * value: "path_envvar" + * @const + */ + "path_envvar" = "path_envvar"; + + + /** + * value: "input_path" + * @const + */ + "input_path" = "input_path"; + + + + /** + * Returns a BlenderPathSource enum value from a Javascript object name. + * @param {Object} data The plain JavaScript object containing the name of the enum value. + * @return {module:model/BlenderPathSource} The enum BlenderPathSource value. + */ + static constructFromObject(object) { + return object; + } +} + diff --git a/web/app/src/manager-api/model/PathCheckResult.js b/web/app/src/manager-api/model/PathCheckResult.js index 4cfb2ad4..a53e5501 100644 --- a/web/app/src/manager-api/model/PathCheckResult.js +++ b/web/app/src/manager-api/model/PathCheckResult.js @@ -24,7 +24,7 @@ class PathCheckResult { * @alias module:model/PathCheckResult * @param path {String} The path that was checked. * @param isUsable {Boolean} Whether the path is usable or not. - * @param cause {String} Description of why this path is not usable. + * @param cause {String} Description of why this path is (not) usable. */ constructor(path, isUsable, cause) { @@ -82,7 +82,7 @@ PathCheckResult.prototype['path'] = undefined; PathCheckResult.prototype['is_usable'] = undefined; /** - * Description of why this path is not usable. + * Description of why this path is (not) usable. * @member {String} cause */ PathCheckResult.prototype['cause'] = undefined;