diff --git a/addon/flamenco/manager/__init__.py b/addon/flamenco/manager/__init__.py index d7fd3978..3b7feb48 100644 --- a/addon/flamenco/manager/__init__.py +++ b/addon/flamenco/manager/__init__.py @@ -10,7 +10,7 @@ """ -__version__ = "fd807980" +__version__ = "b3f245cf" # 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 7e241b5b..88ecf65e 100644 --- a/addon/flamenco/manager/api/meta_api.py +++ b/addon/flamenco/manager/api/meta_api.py @@ -21,10 +21,13 @@ from flamenco.manager.model_utils import ( # noqa: F401 none_type, validate_and_convert_types ) +from flamenco.manager.model.error import Error from flamenco.manager.model.flamenco_version import FlamencoVersion from flamenco.manager.model.manager_configuration import ManagerConfiguration from flamenco.manager.model.manager_variable_audience import ManagerVariableAudience from flamenco.manager.model.manager_variables import ManagerVariables +from flamenco.manager.model.path_check_input import PathCheckInput +from flamenco.manager.model.path_check_result import PathCheckResult class MetaApi(object): @@ -38,6 +41,54 @@ class MetaApi(object): if api_client is None: api_client = ApiClient() self.api_client = api_client + self.check_shared_storage_path_endpoint = _Endpoint( + settings={ + 'response_type': (PathCheckResult,), + 'auth': [], + 'endpoint_path': '/api/v3/configuration/check/shared-storage', + 'operation_id': 'check_shared_storage_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.get_configuration_endpoint = _Endpoint( settings={ 'response_type': (ManagerConfiguration,), @@ -80,6 +131,49 @@ class MetaApi(object): }, api_client=api_client ) + self.get_configuration_file_endpoint = _Endpoint( + settings={ + 'response_type': ({str: (bool, date, datetime, dict, float, int, list, str, none_type)},), + 'auth': [], + 'endpoint_path': '/api/v3/configuration/file', + 'operation_id': 'get_configuration_file', + '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', + 'application/yaml' + ], + 'content_type': [], + }, + api_client=api_client + ) self.get_variables_endpoint = _Endpoint( settings={ 'response_type': (ManagerVariables,), @@ -178,6 +272,79 @@ class MetaApi(object): api_client=api_client ) + def check_shared_storage_path( + self, + **kwargs + ): + """Validate a path for use as shared storage. # 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_shared_storage_path(async_req=True) + >>> result = thread.get() + + + Keyword Args: + path_check_input (PathCheckInput): 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: + PathCheckResult + 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_shared_storage_path_endpoint.call_with_http_info(**kwargs) + def get_configuration( self, **kwargs @@ -250,6 +417,78 @@ class MetaApi(object): kwargs['_host_index'] = kwargs.get('_host_index') return self.get_configuration_endpoint.call_with_http_info(**kwargs) + def get_configuration_file( + self, + **kwargs + ): + """Retrieve the configuration of Flamenco Manager. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + + >>> thread = api.get_configuration_file(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: + {str: (bool, date, datetime, dict, float, int, list, str, none_type)} + 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.get_configuration_file_endpoint.call_with_http_info(**kwargs) + def get_variables( self, audience, diff --git a/addon/flamenco/manager/api_client.py b/addon/flamenco/manager/api_client.py index eee5720f..1231d722 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/fd807980 (Blender add-on)' + self.user_agent = 'Flamenco/b3f245cf (Blender add-on)' def __enter__(self): return self diff --git a/addon/flamenco/manager/configuration.py b/addon/flamenco/manager/configuration.py index 04fca0e2..d3cc8bbe 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: fd807980".\ + "SDK Package Version: b3f245cf".\ format(env=sys.platform, pyversion=sys.version) def get_host_settings(self): diff --git a/addon/flamenco/manager/docs/ManagerConfiguration.md b/addon/flamenco/manager/docs/ManagerConfiguration.md index 345cae12..479e2148 100644 --- a/addon/flamenco/manager/docs/ManagerConfiguration.md +++ b/addon/flamenco/manager/docs/ManagerConfiguration.md @@ -6,6 +6,7 @@ Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- **storage_location** | **str** | Directory used for job file storage. | **shaman_enabled** | **bool** | Whether the Shaman file transfer API is available. | +**is_first_run** | **bool** | Whether this is considered the first time the Manager runs. This is determined by a few factors, like a non-existent configuration file or certain settings being empty while they shouldn't be. | **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/MetaApi.md b/addon/flamenco/manager/docs/MetaApi.md index 88a75d46..f29c66b2 100644 --- a/addon/flamenco/manager/docs/MetaApi.md +++ b/addon/flamenco/manager/docs/MetaApi.md @@ -4,11 +4,84 @@ All URIs are relative to *http://localhost* Method | HTTP request | Description ------------- | ------------- | ------------- +[**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. [**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_shared_storage_path** +> PathCheckResult check_shared_storage_path() + +Validate a path for use as shared storage. + +### 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_result import PathCheckResult +from flamenco.manager.model.path_check_input import PathCheckInput +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 | Path to check (optional) + + # example passing only required values which don't have defaults set + # and optional values + try: + # Validate a path for use as shared storage. + api_response = api_instance.check_shared_storage_path(path_check_input=path_check_input) + pprint(api_response) + except flamenco.manager.ApiException as e: + print("Exception when calling MetaApi->check_shared_storage_path: %s\n" % e) +``` + + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **path_check_input** | [**PathCheckInput**](PathCheckInput.md)| Path to check | [optional] + +### Return type + +[**PathCheckResult**](PathCheckResult.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) + # **get_configuration** > ManagerConfiguration get_configuration() @@ -70,6 +143,66 @@ 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) +# **get_configuration_file** +> {str: (bool, date, datetime, dict, float, int, list, str, none_type)} get_configuration_file() + +Retrieve the configuration of Flamenco Manager. + +### Example + + +```python +import time +import flamenco.manager +from flamenco.manager.api import meta_api +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: + # Retrieve the configuration of Flamenco Manager. + api_response = api_instance.get_configuration_file() + pprint(api_response) + except flamenco.manager.ApiException as e: + print("Exception when calling MetaApi->get_configuration_file: %s\n" % e) +``` + + +### Parameters +This endpoint does not need any parameter. + +### Return type + +**{str: (bool, date, datetime, dict, float, int, list, str, none_type)}** + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json, application/yaml + + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Normal response. | - | + +[[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_variables** > ManagerVariables get_variables(audience, platform) diff --git a/addon/flamenco/manager/docs/PathCheckInput.md b/addon/flamenco/manager/docs/PathCheckInput.md new file mode 100644 index 00000000..1ac64425 --- /dev/null +++ b/addon/flamenco/manager/docs/PathCheckInput.md @@ -0,0 +1,12 @@ +# PathCheckInput + + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**path** | **str** | | +**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/PathCheckResult.md b/addon/flamenco/manager/docs/PathCheckResult.md new file mode 100644 index 00000000..e18dbca3 --- /dev/null +++ b/addon/flamenco/manager/docs/PathCheckResult.md @@ -0,0 +1,14 @@ +# PathCheckResult + + +## Properties +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. | +**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/manager_configuration.py b/addon/flamenco/manager/model/manager_configuration.py index 0f78ec0f..f45b8559 100644 --- a/addon/flamenco/manager/model/manager_configuration.py +++ b/addon/flamenco/manager/model/manager_configuration.py @@ -83,6 +83,7 @@ class ManagerConfiguration(ModelNormal): return { 'storage_location': (str,), # noqa: E501 'shaman_enabled': (bool,), # noqa: E501 + 'is_first_run': (bool,), # noqa: E501 } @cached_property @@ -93,6 +94,7 @@ class ManagerConfiguration(ModelNormal): attribute_map = { 'storage_location': 'storageLocation', # noqa: E501 'shaman_enabled': 'shamanEnabled', # noqa: E501 + 'is_first_run': 'isFirstRun', # noqa: E501 } read_only_vars = { @@ -102,12 +104,13 @@ class ManagerConfiguration(ModelNormal): @classmethod @convert_js_args_to_python_args - def _from_openapi_data(cls, storage_location, shaman_enabled, *args, **kwargs): # noqa: E501 + def _from_openapi_data(cls, storage_location, shaman_enabled, is_first_run, *args, **kwargs): # noqa: E501 """ManagerConfiguration - a model defined in OpenAPI Args: storage_location (str): Directory used for job file storage. shaman_enabled (bool): Whether the Shaman file transfer API is available. + is_first_run (bool): Whether this is considered the first time the Manager runs. This is determined by a few factors, like a non-existent configuration file or certain settings being empty while they shouldn't be. Keyword Args: _check_type (bool): if True, values for parameters in openapi_types @@ -169,6 +172,7 @@ class ManagerConfiguration(ModelNormal): self.storage_location = storage_location self.shaman_enabled = shaman_enabled + self.is_first_run = is_first_run for var_name, var_value in kwargs.items(): if var_name not in self.attribute_map and \ self._configuration is not None and \ @@ -189,12 +193,13 @@ class ManagerConfiguration(ModelNormal): ]) @convert_js_args_to_python_args - def __init__(self, storage_location, shaman_enabled, *args, **kwargs): # noqa: E501 + def __init__(self, storage_location, shaman_enabled, is_first_run, *args, **kwargs): # noqa: E501 """ManagerConfiguration - a model defined in OpenAPI Args: storage_location (str): Directory used for job file storage. shaman_enabled (bool): Whether the Shaman file transfer API is available. + is_first_run (bool): Whether this is considered the first time the Manager runs. This is determined by a few factors, like a non-existent configuration file or certain settings being empty while they shouldn't be. Keyword Args: _check_type (bool): if True, values for parameters in openapi_types @@ -254,6 +259,7 @@ class ManagerConfiguration(ModelNormal): self.storage_location = storage_location self.shaman_enabled = shaman_enabled + self.is_first_run = is_first_run for var_name, var_value in kwargs.items(): if var_name not in self.attribute_map and \ self._configuration is not None and \ diff --git a/addon/flamenco/manager/model/path_check_input.py b/addon/flamenco/manager/model/path_check_input.py new file mode 100644 index 00000000..b7b003cc --- /dev/null +++ b/addon/flamenco/manager/model/path_check_input.py @@ -0,0 +1,261 @@ +""" + 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 PathCheckInput(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 + """ + 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. + """ + return { + 'path': (str,), # noqa: E501 + } + + @cached_property + def discriminator(): + return None + + + attribute_map = { + 'path': 'path', # noqa: E501 + } + + read_only_vars = { + } + + _composed_schemas = {} + + @classmethod + @convert_js_args_to_python_args + def _from_openapi_data(cls, path, *args, **kwargs): # noqa: E501 + """PathCheckInput - a model defined in OpenAPI + + Args: + path (str): + + 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.path = path + 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, *args, **kwargs): # noqa: E501 + """PathCheckInput - a model defined in OpenAPI + + Args: + path (str): + + 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.path = path + 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/path_check_result.py b/addon/flamenco/manager/model/path_check_result.py new file mode 100644 index 00000000..1a67e687 --- /dev/null +++ b/addon/flamenco/manager/model/path_check_result.py @@ -0,0 +1,273 @@ +""" + Flamenco manager + + Render Farm manager API # noqa: E501 + + The version of the OpenAPI document: 1.0.0 + Generated by: https://openapi-generator.tech +""" + + +import re # noqa: F401 +import sys # noqa: F401 + +from flamenco.manager.model_utils import ( # noqa: F401 + ApiTypeError, + ModelComposed, + ModelNormal, + ModelSimple, + cached_property, + change_keys_js_to_python, + convert_js_args_to_python_args, + date, + datetime, + file_type, + none_type, + validate_get_composed_info, + OpenApiModel +) +from flamenco.manager.exceptions import ApiAttributeError + + + +class PathCheckResult(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 + """ + 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. + """ + return { + 'path': (str,), # noqa: E501 + 'is_usable': (bool,), # noqa: E501 + 'cause': (str,), # noqa: E501 + } + + @cached_property + def discriminator(): + return None + + + attribute_map = { + 'path': 'path', # noqa: E501 + 'is_usable': 'is_usable', # noqa: E501 + 'cause': 'cause', # noqa: E501 + } + + read_only_vars = { + } + + _composed_schemas = {} + + @classmethod + @convert_js_args_to_python_args + def _from_openapi_data(cls, path, is_usable, cause, *args, **kwargs): # noqa: E501 + """PathCheckResult - a model defined in OpenAPI + + 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. + + 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.path = path + 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, is_usable, cause, *args, **kwargs): # noqa: E501 + """PathCheckResult - a model defined in OpenAPI + + 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. + + 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.path = path + 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/models/__init__.py b/addon/flamenco/manager/models/__init__.py index 90826beb..92275d86 100644 --- a/addon/flamenco/manager/models/__init__.py +++ b/addon/flamenco/manager/models/__init__.py @@ -36,6 +36,8 @@ from flamenco.manager.model.manager_variable import ManagerVariable from flamenco.manager.model.manager_variable_audience import ManagerVariableAudience from flamenco.manager.model.manager_variables import ManagerVariables from flamenco.manager.model.may_keep_running import MayKeepRunning +from flamenco.manager.model.path_check_input import PathCheckInput +from flamenco.manager.model.path_check_result import PathCheckResult from flamenco.manager.model.registered_worker import RegisteredWorker from flamenco.manager.model.security_error import SecurityError from flamenco.manager.model.shaman_checkout import ShamanCheckout diff --git a/addon/flamenco/manager_README.md b/addon/flamenco/manager_README.md index adf5ff7a..e5015fea 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: fd807980 +- Package version: b3f245cf - 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_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* | [**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. *MetaApi* | [**get_version**](flamenco/manager/docs/MetaApi.md#get_version) | **GET** /api/v3/version | Get the Flamenco version of this Manager *ShamanApi* | [**shaman_checkout**](flamenco/manager/docs/ShamanApi.md#shaman_checkout) | **POST** /api/v3/shaman/checkout/create | Create a directory, and symlink the required files into it. The files must all have been uploaded to Shaman before calling this endpoint. @@ -136,6 +138,8 @@ Class | Method | HTTP request | Description - [ManagerVariableAudience](flamenco/manager/docs/ManagerVariableAudience.md) - [ManagerVariables](flamenco/manager/docs/ManagerVariables.md) - [MayKeepRunning](flamenco/manager/docs/MayKeepRunning.md) + - [PathCheckInput](flamenco/manager/docs/PathCheckInput.md) + - [PathCheckResult](flamenco/manager/docs/PathCheckResult.md) - [RegisteredWorker](flamenco/manager/docs/RegisteredWorker.md) - [SecurityError](flamenco/manager/docs/SecurityError.md) - [ShamanCheckout](flamenco/manager/docs/ShamanCheckout.md) diff --git a/internal/worker/mocks/client.gen.go b/internal/worker/mocks/client.gen.go index 7451ab3d..48c887ce 100644 --- a/internal/worker/mocks/client.gen.go +++ b/internal/worker/mocks/client.gen.go @@ -36,6 +36,46 @@ func (m *MockFlamencoClient) EXPECT() *MockFlamencoClientMockRecorder { return m.recorder } +// CheckSharedStoragePathWithBodyWithResponse mocks base method. +func (m *MockFlamencoClient) CheckSharedStoragePathWithBodyWithResponse(arg0 context.Context, arg1 string, arg2 io.Reader, arg3 ...api.RequestEditorFn) (*api.CheckSharedStoragePathResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1, arg2} + for _, a := range arg3 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "CheckSharedStoragePathWithBodyWithResponse", varargs...) + ret0, _ := ret[0].(*api.CheckSharedStoragePathResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// CheckSharedStoragePathWithBodyWithResponse indicates an expected call of CheckSharedStoragePathWithBodyWithResponse. +func (mr *MockFlamencoClientMockRecorder) CheckSharedStoragePathWithBodyWithResponse(arg0, arg1, arg2 interface{}, arg3 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{arg0, arg1, arg2}, arg3...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CheckSharedStoragePathWithBodyWithResponse", reflect.TypeOf((*MockFlamencoClient)(nil).CheckSharedStoragePathWithBodyWithResponse), varargs...) +} + +// CheckSharedStoragePathWithResponse mocks base method. +func (m *MockFlamencoClient) CheckSharedStoragePathWithResponse(arg0 context.Context, arg1 api.CheckSharedStoragePathJSONRequestBody, arg2 ...api.RequestEditorFn) (*api.CheckSharedStoragePathResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "CheckSharedStoragePathWithResponse", varargs...) + ret0, _ := ret[0].(*api.CheckSharedStoragePathResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// CheckSharedStoragePathWithResponse indicates an expected call of CheckSharedStoragePathWithResponse. +func (mr *MockFlamencoClientMockRecorder) CheckSharedStoragePathWithResponse(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{arg0, arg1}, arg2...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CheckSharedStoragePathWithResponse", reflect.TypeOf((*MockFlamencoClient)(nil).CheckSharedStoragePathWithResponse), varargs...) +} + // FetchGlobalLastRenderedInfoWithResponse mocks base method. func (m *MockFlamencoClient) FetchGlobalLastRenderedInfoWithResponse(arg0 context.Context, arg1 ...api.RequestEditorFn) (*api.FetchGlobalLastRenderedInfoResponse, error) { m.ctrl.T.Helper() @@ -216,6 +256,26 @@ func (mr *MockFlamencoClientMockRecorder) FetchWorkersWithResponse(arg0 interfac return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchWorkersWithResponse", reflect.TypeOf((*MockFlamencoClient)(nil).FetchWorkersWithResponse), varargs...) } +// GetConfigurationFileWithResponse mocks base method. +func (m *MockFlamencoClient) GetConfigurationFileWithResponse(arg0 context.Context, arg1 ...api.RequestEditorFn) (*api.GetConfigurationFileResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0} + for _, a := range arg1 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetConfigurationFileWithResponse", varargs...) + ret0, _ := ret[0].(*api.GetConfigurationFileResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetConfigurationFileWithResponse indicates an expected call of GetConfigurationFileWithResponse. +func (mr *MockFlamencoClientMockRecorder) GetConfigurationFileWithResponse(arg0 interface{}, arg1 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{arg0}, arg1...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetConfigurationFileWithResponse", reflect.TypeOf((*MockFlamencoClient)(nil).GetConfigurationFileWithResponse), 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 baabc736..dc934a6f 100644 --- a/pkg/api/openapi_client.gen.go +++ b/pkg/api/openapi_client.gen.go @@ -14,6 +14,8 @@ import ( "net/url" "strings" + "gopkg.in/yaml.v2" + "github.com/deepmap/oapi-codegen/pkg/runtime" ) @@ -93,6 +95,14 @@ type ClientInterface interface { // GetConfiguration request GetConfiguration(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) + // CheckSharedStoragePath request with any body + CheckSharedStoragePathWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + + CheckSharedStoragePath(ctx context.Context, body CheckSharedStoragePathJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + + // GetConfigurationFile request + GetConfigurationFile(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) + // GetVariables request GetVariables(ctx context.Context, audience ManagerVariableAudience, platform string, reqEditors ...RequestEditorFn) (*http.Response, error) @@ -226,6 +236,42 @@ func (c *Client) GetConfiguration(ctx context.Context, reqEditors ...RequestEdit 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 { + 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) CheckSharedStoragePath(ctx context.Context, body CheckSharedStoragePathJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewCheckSharedStoragePathRequest(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) GetConfigurationFile(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewGetConfigurationFileRequest(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) GetVariables(ctx context.Context, audience ManagerVariableAudience, platform string, reqEditors ...RequestEditorFn) (*http.Response, error) { req, err := NewGetVariablesRequest(c.Server, audience, platform) if err != nil { @@ -781,6 +827,73 @@ func NewGetConfigurationRequest(server string) (*http.Request, error) { 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 + buf, err := json.Marshal(body) + if err != nil { + return nil, err + } + bodyReader = bytes.NewReader(buf) + return NewCheckSharedStoragePathRequestWithBody(server, "application/json", bodyReader) +} + +// NewCheckSharedStoragePathRequestWithBody generates requests for CheckSharedStoragePath with any type of body +func NewCheckSharedStoragePathRequestWithBody(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/shared-storage") + 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 +} + +// NewGetConfigurationFileRequest generates requests for GetConfigurationFile +func NewGetConfigurationFileRequest(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/file") + 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 +} + // NewGetVariablesRequest generates requests for GetVariables func NewGetVariablesRequest(server string, audience ManagerVariableAudience, platform string) (*http.Request, error) { var err error @@ -2020,6 +2133,14 @@ type ClientWithResponsesInterface interface { // GetConfiguration request GetConfigurationWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetConfigurationResponse, error) + // CheckSharedStoragePath request with any body + CheckSharedStoragePathWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*CheckSharedStoragePathResponse, error) + + CheckSharedStoragePathWithResponse(ctx context.Context, body CheckSharedStoragePathJSONRequestBody, reqEditors ...RequestEditorFn) (*CheckSharedStoragePathResponse, error) + + // GetConfigurationFile request + GetConfigurationFileWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetConfigurationFileResponse, error) + // GetVariables request GetVariablesWithResponse(ctx context.Context, audience ManagerVariableAudience, platform string, reqEditors ...RequestEditorFn) (*GetVariablesResponse, error) @@ -2163,6 +2284,54 @@ func (r GetConfigurationResponse) StatusCode() int { return 0 } +type CheckSharedStoragePathResponse struct { + Body []byte + HTTPResponse *http.Response + JSON200 *PathCheckResult + JSONDefault *Error +} + +// Status returns HTTPResponse.Status +func (r CheckSharedStoragePathResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r CheckSharedStoragePathResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + +type GetConfigurationFileResponse struct { + Body []byte + HTTPResponse *http.Response + JSON200 *struct { + AdditionalProperties map[string]interface{} `json:"-"` + } + YAML200 *string +} + +// Status returns HTTPResponse.Status +func (r GetConfigurationFileResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r GetConfigurationFileResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + type GetVariablesResponse struct { Body []byte HTTPResponse *http.Response @@ -2896,6 +3065,32 @@ func (c *ClientWithResponses) GetConfigurationWithResponse(ctx context.Context, return ParseGetConfigurationResponse(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...) + if err != nil { + return nil, err + } + return ParseCheckSharedStoragePathResponse(rsp) +} + +func (c *ClientWithResponses) CheckSharedStoragePathWithResponse(ctx context.Context, body CheckSharedStoragePathJSONRequestBody, reqEditors ...RequestEditorFn) (*CheckSharedStoragePathResponse, error) { + rsp, err := c.CheckSharedStoragePath(ctx, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseCheckSharedStoragePathResponse(rsp) +} + +// GetConfigurationFileWithResponse request returning *GetConfigurationFileResponse +func (c *ClientWithResponses) GetConfigurationFileWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetConfigurationFileResponse, error) { + rsp, err := c.GetConfigurationFile(ctx, reqEditors...) + if err != nil { + return nil, err + } + return ParseGetConfigurationFileResponse(rsp) +} + // GetVariablesWithResponse request returning *GetVariablesResponse func (c *ClientWithResponses) GetVariablesWithResponse(ctx context.Context, audience ManagerVariableAudience, platform string, reqEditors ...RequestEditorFn) (*GetVariablesResponse, error) { rsp, err := c.GetVariables(ctx, audience, platform, reqEditors...) @@ -3306,6 +3501,74 @@ func ParseGetConfigurationResponse(rsp *http.Response) (*GetConfigurationRespons 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) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &CheckSharedStoragePathResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest PathCheckResult + 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 +} + +// ParseGetConfigurationFileResponse parses an HTTP response from a GetConfigurationFileWithResponse call +func ParseGetConfigurationFileResponse(rsp *http.Response) (*GetConfigurationFileResponse, error) { + bodyBytes, err := ioutil.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &GetConfigurationFileResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest struct { + AdditionalProperties map[string]interface{} `json:"-"` + } + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON200 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "yaml") && rsp.StatusCode == 200: + var dest string + if err := yaml.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.YAML200 = &dest + + } + + return response, nil +} + // ParseGetVariablesResponse parses an HTTP response from a GetVariablesWithResponse call func ParseGetVariablesResponse(rsp *http.Response) (*GetVariablesResponse, error) { bodyBytes, err := ioutil.ReadAll(rsp.Body) diff --git a/pkg/api/openapi_server.gen.go b/pkg/api/openapi_server.gen.go index 2d56323f..ac7f7ce4 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 + // Validate a path for use as shared storage. + // (POST /api/v3/configuration/check/shared-storage) + CheckSharedStoragePath(ctx echo.Context) error + // Retrieve the configuration of Flamenco Manager. + // (GET /api/v3/configuration/file) + GetConfigurationFile(ctx echo.Context) error // 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 /api/v3/configuration/variables/{audience}/{platform}) GetVariables(ctx echo.Context, audience ManagerVariableAudience, platform string) error @@ -129,6 +135,24 @@ func (w *ServerInterfaceWrapper) GetConfiguration(ctx echo.Context) error { return err } +// CheckSharedStoragePath converts echo context to params. +func (w *ServerInterfaceWrapper) CheckSharedStoragePath(ctx echo.Context) error { + var err error + + // Invoke the callback with all the unmarshalled arguments + err = w.Handler.CheckSharedStoragePath(ctx) + return err +} + +// GetConfigurationFile converts echo context to params. +func (w *ServerInterfaceWrapper) GetConfigurationFile(ctx echo.Context) error { + var err error + + // Invoke the callback with all the unmarshalled arguments + err = w.Handler.GetConfigurationFile(ctx) + return err +} + // GetVariables converts echo context to params. func (w *ServerInterfaceWrapper) GetVariables(ctx echo.Context) error { var err error @@ -647,6 +671,8 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL } router.GET(baseURL+"/api/v3/configuration", wrapper.GetConfiguration) + 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) router.POST(baseURL+"/api/v3/jobs", wrapper.SubmitJob) router.GET(baseURL+"/api/v3/jobs/last-rendered", wrapper.FetchGlobalLastRenderedInfo) diff --git a/pkg/api/openapi_spec.gen.go b/pkg/api/openapi_spec.gen.go index b54db85f..b0769a54 100644 --- a/pkg/api/openapi_spec.gen.go +++ b/pkg/api/openapi_spec.gen.go @@ -18,158 +18,165 @@ import ( // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", + "cbTy12m5AAA=", } // 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 7d370919..6c782e6b 100644 --- a/pkg/api/openapi_types.gen.go +++ b/pkg/api/openapi_types.gen.go @@ -323,6 +323,9 @@ type JobsQueryResult struct { // ManagerConfiguration defines model for ManagerConfiguration. type ManagerConfiguration struct { + // Whether this is considered the first time the Manager runs. This is determined by a few factors, like a non-existent configuration file or certain settings being empty while they shouldn't be. + IsFirstRun bool `json:"isFirstRun"` + // Whether the Shaman file transfer API is available. ShamanEnabled bool `json:"shamanEnabled"` @@ -354,6 +357,23 @@ type MayKeepRunning struct { StatusChangeRequested bool `json:"statusChangeRequested"` } +// PathCheckInput defines model for PathCheckInput. +type PathCheckInput struct { + Path string `json:"path"` +} + +// PathCheckResult defines model for PathCheckResult. +type PathCheckResult struct { + // Description of why this path is not usable. + Cause string `json:"cause"` + + // Whether the path is usable or not. + IsUsable bool `json:"is_usable"` + + // The path that was checked. + Path string `json:"path"` +} + // RegisteredWorker defines model for RegisteredWorker. type RegisteredWorker struct { Address string `json:"address"` @@ -658,6 +678,9 @@ type WorkerSummary struct { Version string `json:"version"` } +// CheckSharedStoragePathJSONBody defines parameters for CheckSharedStoragePath. +type CheckSharedStoragePathJSONBody PathCheckInput + // SubmitJobJSONBody defines parameters for SubmitJob. type SubmitJobJSONBody SubmittedJob @@ -703,6 +726,9 @@ type WorkerStateChangedJSONBody WorkerStateChanged // TaskUpdateJSONBody defines parameters for TaskUpdate. type TaskUpdateJSONBody TaskUpdate +// CheckSharedStoragePathJSONRequestBody defines body for CheckSharedStoragePath for application/json ContentType. +type CheckSharedStoragePathJSONRequestBody CheckSharedStoragePathJSONBody + // SubmitJobJSONRequestBody defines body for SubmitJob for application/json ContentType. type SubmitJobJSONRequestBody SubmitJobJSONBody diff --git a/web/app/src/manager-api/ApiClient.js b/web/app/src/manager-api/ApiClient.js index 23c557d7..884fd7ec 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/fd807980 / webbrowser' + 'User-Agent': 'Flamenco/b3f245cf / webbrowser' }; /** diff --git a/web/app/src/manager-api/index.js b/web/app/src/manager-api/index.js index bb527b94..f3dd10b0 100644 --- a/web/app/src/manager-api/index.js +++ b/web/app/src/manager-api/index.js @@ -36,6 +36,8 @@ import ManagerConfiguration from './model/ManagerConfiguration'; import ManagerVariable from './model/ManagerVariable'; import ManagerVariableAudience from './model/ManagerVariableAudience'; import MayKeepRunning from './model/MayKeepRunning'; +import PathCheckInput from './model/PathCheckInput'; +import PathCheckResult from './model/PathCheckResult'; import RegisteredWorker from './model/RegisteredWorker'; import SecurityError from './model/SecurityError'; import ShamanCheckout from './model/ShamanCheckout'; @@ -254,6 +256,18 @@ export { */ MayKeepRunning, + /** + * The PathCheckInput model constructor. + * @property {module:model/PathCheckInput} + */ + PathCheckInput, + + /** + * The PathCheckResult model constructor. + * @property {module:model/PathCheckResult} + */ + PathCheckResult, + /** * The RegisteredWorker model constructor. * @property {module:model/RegisteredWorker} diff --git a/web/app/src/manager-api/manager/MetaApi.js b/web/app/src/manager-api/manager/MetaApi.js index 95e06c51..1f3ace45 100644 --- a/web/app/src/manager-api/manager/MetaApi.js +++ b/web/app/src/manager-api/manager/MetaApi.js @@ -13,10 +13,13 @@ import ApiClient from "../ApiClient"; +import Error from '../model/Error'; import FlamencoVersion from '../model/FlamencoVersion'; import ManagerConfiguration from '../model/ManagerConfiguration'; import ManagerVariable from '../model/ManagerVariable'; import ManagerVariableAudience from '../model/ManagerVariableAudience'; +import PathCheckInput from '../model/PathCheckInput'; +import PathCheckResult from '../model/PathCheckResult'; /** * Meta service. @@ -38,6 +41,50 @@ export default class MetaApi { + /** + * Validate a path for use as shared storage. + * @param {Object} opts Optional parameters + * @param {module:model/PathCheckInput} opts.pathCheckInput Path to check + * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/PathCheckResult} and HTTP response + */ + checkSharedStoragePathWithHttpInfo(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 = PathCheckResult; + return this.apiClient.callApi( + '/api/v3/configuration/check/shared-storage', 'POST', + pathParams, queryParams, headerParams, formParams, postBody, + authNames, contentTypes, accepts, returnType, null + ); + } + + /** + * Validate a path for use as shared storage. + * @param {Object} opts Optional parameters + * @param {module:model/PathCheckInput} opts.pathCheckInput Path to check + * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/PathCheckResult} + */ + checkSharedStoragePath(opts) { + return this.checkSharedStoragePathWithHttpInfo(opts) + .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 @@ -77,6 +124,45 @@ export default class MetaApi { } + /** + * Retrieve the configuration of Flamenco Manager. + * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link Object.} and HTTP response + */ + getConfigurationFileWithHttpInfo() { + let postBody = null; + + let pathParams = { + }; + let queryParams = { + }; + let headerParams = { + }; + let formParams = { + }; + + let authNames = []; + let contentTypes = []; + let accepts = ['application/json', 'application/yaml']; + let returnType = {'String': Object}; + return this.apiClient.callApi( + '/api/v3/configuration/file', 'GET', + pathParams, queryParams, headerParams, formParams, postBody, + authNames, contentTypes, accepts, returnType, null + ); + } + + /** + * Retrieve the configuration of Flamenco Manager. + * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link Object.} + */ + getConfigurationFile() { + return this.getConfigurationFileWithHttpInfo() + .then(function(response_and_data) { + return response_and_data.data; + }); + } + + /** * 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. * @param {module:model/ManagerVariableAudience} audience diff --git a/web/app/src/manager-api/model/ManagerConfiguration.js b/web/app/src/manager-api/model/ManagerConfiguration.js index 019d8c55..3e1c993c 100644 --- a/web/app/src/manager-api/model/ManagerConfiguration.js +++ b/web/app/src/manager-api/model/ManagerConfiguration.js @@ -24,10 +24,11 @@ class ManagerConfiguration { * @alias module:model/ManagerConfiguration * @param storageLocation {String} Directory used for job file storage. * @param shamanEnabled {Boolean} Whether the Shaman file transfer API is available. + * @param isFirstRun {Boolean} Whether this is considered the first time the Manager runs. This is determined by a few factors, like a non-existent configuration file or certain settings being empty while they shouldn't be. */ - constructor(storageLocation, shamanEnabled) { + constructor(storageLocation, shamanEnabled, isFirstRun) { - ManagerConfiguration.initialize(this, storageLocation, shamanEnabled); + ManagerConfiguration.initialize(this, storageLocation, shamanEnabled, isFirstRun); } /** @@ -35,9 +36,10 @@ class ManagerConfiguration { * 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, storageLocation, shamanEnabled) { + static initialize(obj, storageLocation, shamanEnabled, isFirstRun) { obj['storageLocation'] = storageLocation; obj['shamanEnabled'] = shamanEnabled; + obj['isFirstRun'] = isFirstRun; } /** @@ -57,6 +59,9 @@ class ManagerConfiguration { if (data.hasOwnProperty('shamanEnabled')) { obj['shamanEnabled'] = ApiClient.convertToType(data['shamanEnabled'], 'Boolean'); } + if (data.hasOwnProperty('isFirstRun')) { + obj['isFirstRun'] = ApiClient.convertToType(data['isFirstRun'], 'Boolean'); + } } return obj; } @@ -76,6 +81,12 @@ ManagerConfiguration.prototype['storageLocation'] = undefined; */ ManagerConfiguration.prototype['shamanEnabled'] = undefined; +/** + * Whether this is considered the first time the Manager runs. This is determined by a few factors, like a non-existent configuration file or certain settings being empty while they shouldn't be. + * @member {Boolean} isFirstRun + */ +ManagerConfiguration.prototype['isFirstRun'] = undefined; + diff --git a/web/app/src/manager-api/model/PathCheckInput.js b/web/app/src/manager-api/model/PathCheckInput.js new file mode 100644 index 00000000..388ae767 --- /dev/null +++ b/web/app/src/manager-api/model/PathCheckInput.js @@ -0,0 +1,73 @@ +/** + * 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'; + +/** + * The PathCheckInput model module. + * @module model/PathCheckInput + * @version 0.0.0 + */ +class PathCheckInput { + /** + * Constructs a new PathCheckInput. + * @alias module:model/PathCheckInput + * @param path {String} + */ + constructor(path) { + + PathCheckInput.initialize(this, path); + } + + /** + * 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) { + obj['path'] = path; + } + + /** + * Constructs a PathCheckInput 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/PathCheckInput} obj Optional instance to populate. + * @return {module:model/PathCheckInput} The populated PathCheckInput instance. + */ + static constructFromObject(data, obj) { + if (data) { + obj = obj || new PathCheckInput(); + + if (data.hasOwnProperty('path')) { + obj['path'] = ApiClient.convertToType(data['path'], 'String'); + } + } + return obj; + } + + +} + +/** + * @member {String} path + */ +PathCheckInput.prototype['path'] = undefined; + + + + + + +export default PathCheckInput; + diff --git a/web/app/src/manager-api/model/PathCheckResult.js b/web/app/src/manager-api/model/PathCheckResult.js new file mode 100644 index 00000000..4cfb2ad4 --- /dev/null +++ b/web/app/src/manager-api/model/PathCheckResult.js @@ -0,0 +1,96 @@ +/** + * 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'; + +/** + * The PathCheckResult model module. + * @module model/PathCheckResult + * @version 0.0.0 + */ +class PathCheckResult { + /** + * Constructs a new 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. + */ + constructor(path, isUsable, cause) { + + PathCheckResult.initialize(this, path, 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, isUsable, cause) { + obj['path'] = path; + obj['is_usable'] = isUsable; + obj['cause'] = cause; + } + + /** + * Constructs a PathCheckResult 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/PathCheckResult} obj Optional instance to populate. + * @return {module:model/PathCheckResult} The populated PathCheckResult instance. + */ + static constructFromObject(data, obj) { + if (data) { + obj = obj || new PathCheckResult(); + + if (data.hasOwnProperty('path')) { + obj['path'] = ApiClient.convertToType(data['path'], 'String'); + } + 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 path that was checked. + * @member {String} path + */ +PathCheckResult.prototype['path'] = undefined; + +/** + * Whether the path is usable or not. + * @member {Boolean} is_usable + */ +PathCheckResult.prototype['is_usable'] = undefined; + +/** + * Description of why this path is not usable. + * @member {String} cause + */ +PathCheckResult.prototype['cause'] = undefined; + + + + + + +export default PathCheckResult; +