From 0a1e1efc41dc5737bd767068db6c320c613336e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sybren=20A=2E=20St=C3=BCvel?= Date: Wed, 31 Aug 2022 11:42:46 +0200 Subject: [PATCH] OAPI: regenerate code --- addon/flamenco/manager/api/meta_api.py | 137 +++++++ addon/flamenco/manager/docs/MetaApi.md | 69 ++++ .../manager/docs/SharedStorageLocation.md | 16 + .../manager/model/shared_storage_location.py | 285 +++++++++++++ addon/flamenco/manager/models/__init__.py | 1 + addon/flamenco/manager_README.md | 3 + internal/worker/mocks/client.gen.go | 20 + pkg/api/openapi_client.gen.go | 116 ++++++ pkg/api/openapi_server.gen.go | 28 ++ pkg/api/openapi_spec.gen.go | 374 +++++++++--------- pkg/api/openapi_types.gen.go | 10 + web/app/src/manager-api/index.js | 7 + web/app/src/manager-api/manager/MetaApi.js | 54 +++ .../model/SharedStorageLocation.js | 106 +++++ 14 files changed, 1040 insertions(+), 186 deletions(-) create mode 100644 addon/flamenco/manager/docs/SharedStorageLocation.md create mode 100644 addon/flamenco/manager/model/shared_storage_location.py create mode 100644 web/app/src/manager-api/model/SharedStorageLocation.js diff --git a/addon/flamenco/manager/api/meta_api.py b/addon/flamenco/manager/api/meta_api.py index aae252c6..d67e0c96 100644 --- a/addon/flamenco/manager/api/meta_api.py +++ b/addon/flamenco/manager/api/meta_api.py @@ -31,6 +31,7 @@ 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 from flamenco.manager.model.setup_assistant_config import SetupAssistantConfig +from flamenco.manager.model.shared_storage_location import SharedStorageLocation class MetaApi(object): @@ -267,6 +268,61 @@ class MetaApi(object): }, api_client=api_client ) + self.get_shared_storage_endpoint = _Endpoint( + settings={ + 'response_type': (SharedStorageLocation,), + 'auth': [], + 'endpoint_path': '/api/v3/configuration/shared-storage/{audience}/{platform}', + 'operation_id': 'get_shared_storage', + 'http_method': 'GET', + 'servers': None, + }, + params_map={ + 'all': [ + 'audience', + 'platform', + ], + 'required': [ + 'audience', + 'platform', + ], + 'nullable': [ + ], + 'enum': [ + ], + 'validation': [ + ] + }, + root_map={ + 'validations': { + }, + 'allowed_values': { + }, + 'openapi_types': { + 'audience': + (ManagerVariableAudience,), + 'platform': + (str,), + }, + 'attribute_map': { + 'audience': 'audience', + 'platform': 'platform', + }, + 'location_map': { + 'audience': 'path', + 'platform': 'path', + }, + 'collection_format_map': { + } + }, + headers_map={ + 'accept': [ + 'application/json' + ], + 'content_type': [], + }, + api_client=api_client + ) self.get_variables_endpoint = _Endpoint( settings={ 'response_type': (ManagerVariables,), @@ -775,6 +831,87 @@ class MetaApi(object): kwargs['_host_index'] = kwargs.get('_host_index') return self.get_configuration_file_endpoint.call_with_http_info(**kwargs) + def get_shared_storage( + self, + audience, + platform, + **kwargs + ): + """Get the shared storage location of this Manager, adjusted for the given audience and platform. # 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_shared_storage(audience, platform, async_req=True) + >>> result = thread.get() + + Args: + audience (ManagerVariableAudience): + platform (str): + + 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: + SharedStorageLocation + 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') + kwargs['audience'] = \ + audience + kwargs['platform'] = \ + platform + return self.get_shared_storage_endpoint.call_with_http_info(**kwargs) + def get_variables( self, audience, diff --git a/addon/flamenco/manager/docs/MetaApi.md b/addon/flamenco/manager/docs/MetaApi.md index 44b36afa..9b778a3f 100644 --- a/addon/flamenco/manager/docs/MetaApi.md +++ b/addon/flamenco/manager/docs/MetaApi.md @@ -9,6 +9,7 @@ Method | HTTP request | Description [**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_shared_storage**](MetaApi.md#get_shared_storage) | **GET** /api/v3/configuration/shared-storage/{audience}/{platform} | Get the shared storage location of this Manager, adjusted for the given audience and platform. [**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 [**save_setup_assistant_config**](MetaApi.md#save_setup_assistant_config) | **POST** /api/v3/configuration/setup-assistant | Update the Manager's configuration, and restart it in fully functional mode. @@ -332,6 +333,74 @@ No authorization required - **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_shared_storage** +> SharedStorageLocation get_shared_storage(audience, platform) + +Get the shared storage location of this Manager, adjusted for the given audience and platform. + +### Example + + +```python +import time +import flamenco.manager +from flamenco.manager.api import meta_api +from flamenco.manager.model.manager_variable_audience import ManagerVariableAudience +from flamenco.manager.model.shared_storage_location import SharedStorageLocation +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) + audience = ManagerVariableAudience("workers") # ManagerVariableAudience | + platform = "platform_example" # str | + + # example passing only required values which don't have defaults set + try: + # Get the shared storage location of this Manager, adjusted for the given audience and platform. + api_response = api_instance.get_shared_storage(audience, platform) + pprint(api_response) + except flamenco.manager.ApiException as e: + print("Exception when calling MetaApi->get_shared_storage: %s\n" % e) +``` + + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **audience** | **ManagerVariableAudience**| | + **platform** | **str**| | + +### Return type + +[**SharedStorageLocation**](SharedStorageLocation.md) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + + ### HTTP response details | Status code | Description | Response headers | diff --git a/addon/flamenco/manager/docs/SharedStorageLocation.md b/addon/flamenco/manager/docs/SharedStorageLocation.md new file mode 100644 index 00000000..e64da85f --- /dev/null +++ b/addon/flamenco/manager/docs/SharedStorageLocation.md @@ -0,0 +1,16 @@ +# SharedStorageLocation + +Location of the shared storage, adjusted for a specific audience & platform. This uses two-way variables to adjust the shared storage path from the Manager's configuration. + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**location** | **str** | | +**audience** | [**ManagerVariableAudience**](ManagerVariableAudience.md) | | +**platform** | **str** | | +**shaman_enabled** | **bool** | Whether the Shaman file transfer API is available. | +**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/shared_storage_location.py b/addon/flamenco/manager/model/shared_storage_location.py new file mode 100644 index 00000000..697434ab --- /dev/null +++ b/addon/flamenco/manager/model/shared_storage_location.py @@ -0,0 +1,285 @@ +""" + 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.manager_variable_audience import ManagerVariableAudience + globals()['ManagerVariableAudience'] = ManagerVariableAudience + + +class SharedStorageLocation(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 { + 'location': (str,), # noqa: E501 + 'audience': (ManagerVariableAudience,), # noqa: E501 + 'platform': (str,), # noqa: E501 + 'shaman_enabled': (bool,), # noqa: E501 + } + + @cached_property + def discriminator(): + return None + + + attribute_map = { + 'location': 'location', # noqa: E501 + 'audience': 'audience', # noqa: E501 + 'platform': 'platform', # noqa: E501 + 'shaman_enabled': 'shamanEnabled', # noqa: E501 + } + + read_only_vars = { + } + + _composed_schemas = {} + + @classmethod + @convert_js_args_to_python_args + def _from_openapi_data(cls, location, audience, platform, shaman_enabled, *args, **kwargs): # noqa: E501 + """SharedStorageLocation - a model defined in OpenAPI + + Args: + location (str): + audience (ManagerVariableAudience): + platform (str): + shaman_enabled (bool): Whether the Shaman file transfer API is available. + + 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.location = location + self.audience = audience + self.platform = platform + self.shaman_enabled = shaman_enabled + 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, location, audience, platform, shaman_enabled, *args, **kwargs): # noqa: E501 + """SharedStorageLocation - a model defined in OpenAPI + + Args: + location (str): + audience (ManagerVariableAudience): + platform (str): + shaman_enabled (bool): Whether the Shaman file transfer API is available. + + 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.location = location + self.audience = audience + self.platform = platform + self.shaman_enabled = shaman_enabled + 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 83dcc6dc..1f973f78 100644 --- a/addon/flamenco/manager/models/__init__.py +++ b/addon/flamenco/manager/models/__init__.py @@ -52,6 +52,7 @@ from flamenco.manager.model.shaman_file_status import ShamanFileStatus from flamenco.manager.model.shaman_requirements_request import ShamanRequirementsRequest from flamenco.manager.model.shaman_requirements_response import ShamanRequirementsResponse from flamenco.manager.model.shaman_single_file_status import ShamanSingleFileStatus +from flamenco.manager.model.shared_storage_location import SharedStorageLocation from flamenco.manager.model.socket_io_job_update import SocketIOJobUpdate from flamenco.manager.model.socket_io_last_rendered_update import SocketIOLastRenderedUpdate from flamenco.manager.model.socket_io_subscription import SocketIOSubscription diff --git a/addon/flamenco/manager_README.md b/addon/flamenco/manager_README.md index 3b9d69ff..2cd6fab4 100644 --- a/addon/flamenco/manager_README.md +++ b/addon/flamenco/manager_README.md @@ -93,6 +93,7 @@ Class | Method | HTTP request | Description *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_shared_storage**](flamenco/manager/docs/MetaApi.md#get_shared_storage) | **GET** /api/v3/configuration/shared-storage/{audience}/{platform} | Get the shared storage location of this Manager, adjusted for the given audience and platform. *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 *MetaApi* | [**save_setup_assistant_config**](flamenco/manager/docs/MetaApi.md#save_setup_assistant_config) | **POST** /api/v3/configuration/setup-assistant | Update the Manager's configuration, and restart it in fully functional mode. @@ -109,6 +110,7 @@ Class | Method | HTTP request | Description *WorkerApi* | [**task_update**](flamenco/manager/docs/WorkerApi.md#task_update) | **POST** /api/v3/worker/task/{task_id} | Update the task, typically to indicate progress, completion, or failure. *WorkerApi* | [**worker_state**](flamenco/manager/docs/WorkerApi.md#worker_state) | **GET** /api/v3/worker/state | *WorkerApi* | [**worker_state_changed**](flamenco/manager/docs/WorkerApi.md#worker_state_changed) | **POST** /api/v3/worker/state-changed | Worker changed state. This could be as acknowledgement of a Manager-requested state change, or in response to worker-local signals. +*WorkerMgtApi* | [**delete_worker**](flamenco/manager/docs/WorkerMgtApi.md#delete_worker) | **DELETE** /api/v3/worker-mgt/workers/{worker_id} | Remove the given worker. It is recommended to only call this function when the worker is in `offline` state. If the worker is still running, stop it first. Any task still assigned to the worker will be requeued. *WorkerMgtApi* | [**fetch_worker**](flamenco/manager/docs/WorkerMgtApi.md#fetch_worker) | **GET** /api/v3/worker-mgt/workers/{worker_id} | Fetch info about the worker. *WorkerMgtApi* | [**fetch_worker_sleep_schedule**](flamenco/manager/docs/WorkerMgtApi.md#fetch_worker_sleep_schedule) | **GET** /api/v3/worker-mgt/workers/{worker_id}/sleep-schedule | *WorkerMgtApi* | [**fetch_workers**](flamenco/manager/docs/WorkerMgtApi.md#fetch_workers) | **GET** /api/v3/worker-mgt/workers | Get list of workers. @@ -161,6 +163,7 @@ Class | Method | HTTP request | Description - [ShamanRequirementsRequest](flamenco/manager/docs/ShamanRequirementsRequest.md) - [ShamanRequirementsResponse](flamenco/manager/docs/ShamanRequirementsResponse.md) - [ShamanSingleFileStatus](flamenco/manager/docs/ShamanSingleFileStatus.md) + - [SharedStorageLocation](flamenco/manager/docs/SharedStorageLocation.md) - [SocketIOJobUpdate](flamenco/manager/docs/SocketIOJobUpdate.md) - [SocketIOLastRenderedUpdate](flamenco/manager/docs/SocketIOLastRenderedUpdate.md) - [SocketIOSubscription](flamenco/manager/docs/SocketIOSubscription.md) diff --git a/internal/worker/mocks/client.gen.go b/internal/worker/mocks/client.gen.go index 92c04214..4350287c 100644 --- a/internal/worker/mocks/client.gen.go +++ b/internal/worker/mocks/client.gen.go @@ -456,6 +456,26 @@ func (mr *MockFlamencoClientMockRecorder) GetJobTypesWithResponse(arg0 interface return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetJobTypesWithResponse", reflect.TypeOf((*MockFlamencoClient)(nil).GetJobTypesWithResponse), varargs...) } +// GetSharedStorageWithResponse mocks base method. +func (m *MockFlamencoClient) GetSharedStorageWithResponse(arg0 context.Context, arg1 api.ManagerVariableAudience, arg2 string, arg3 ...api.RequestEditorFn) (*api.GetSharedStorageResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1, arg2} + for _, a := range arg3 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetSharedStorageWithResponse", varargs...) + ret0, _ := ret[0].(*api.GetSharedStorageResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetSharedStorageWithResponse indicates an expected call of GetSharedStorageWithResponse. +func (mr *MockFlamencoClientMockRecorder) GetSharedStorageWithResponse(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, "GetSharedStorageWithResponse", reflect.TypeOf((*MockFlamencoClient)(nil).GetSharedStorageWithResponse), varargs...) +} + // GetVariablesWithResponse mocks base method. func (m *MockFlamencoClient) GetVariablesWithResponse(arg0 context.Context, arg1 api.ManagerVariableAudience, arg2 string, arg3 ...api.RequestEditorFn) (*api.GetVariablesResponse, error) { m.ctrl.T.Helper() diff --git a/pkg/api/openapi_client.gen.go b/pkg/api/openapi_client.gen.go index 7954a1d6..e164e6d0 100644 --- a/pkg/api/openapi_client.gen.go +++ b/pkg/api/openapi_client.gen.go @@ -116,6 +116,9 @@ type ClientInterface interface { SaveSetupAssistantConfig(ctx context.Context, body SaveSetupAssistantConfigJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + // GetSharedStorage request + GetSharedStorage(ctx context.Context, audience ManagerVariableAudience, platform string, reqEditors ...RequestEditorFn) (*http.Response, error) + // GetVariables request GetVariables(ctx context.Context, audience ManagerVariableAudience, platform string, reqEditors ...RequestEditorFn) (*http.Response, error) @@ -359,6 +362,18 @@ func (c *Client) SaveSetupAssistantConfig(ctx context.Context, body SaveSetupAss return c.Client.Do(req) } +func (c *Client) GetSharedStorage(ctx context.Context, audience ManagerVariableAudience, platform string, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewGetSharedStorageRequest(c.Server, audience, platform) + 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 { @@ -1148,6 +1163,47 @@ func NewSaveSetupAssistantConfigRequestWithBody(server string, contentType strin return req, nil } +// NewGetSharedStorageRequest generates requests for GetSharedStorage +func NewGetSharedStorageRequest(server string, audience ManagerVariableAudience, platform string) (*http.Request, error) { + var err error + + var pathParam0 string + + pathParam0, err = runtime.StyleParamWithLocation("simple", false, "audience", runtime.ParamLocationPath, audience) + if err != nil { + return nil, err + } + + var pathParam1 string + + pathParam1, err = runtime.StyleParamWithLocation("simple", false, "platform", runtime.ParamLocationPath, platform) + if err != nil { + return nil, err + } + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/api/v3/configuration/shared-storage/%s/%s", pathParam0, pathParam1) + 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 @@ -2557,6 +2613,9 @@ type ClientWithResponsesInterface interface { SaveSetupAssistantConfigWithResponse(ctx context.Context, body SaveSetupAssistantConfigJSONRequestBody, reqEditors ...RequestEditorFn) (*SaveSetupAssistantConfigResponse, error) + // GetSharedStorage request + GetSharedStorageWithResponse(ctx context.Context, audience ManagerVariableAudience, platform string, reqEditors ...RequestEditorFn) (*GetSharedStorageResponse, error) + // GetVariables request GetVariablesWithResponse(ctx context.Context, audience ManagerVariableAudience, platform string, reqEditors ...RequestEditorFn) (*GetVariablesResponse, error) @@ -2830,6 +2889,28 @@ func (r SaveSetupAssistantConfigResponse) StatusCode() int { return 0 } +type GetSharedStorageResponse struct { + Body []byte + HTTPResponse *http.Response + JSON200 *SharedStorageLocation +} + +// Status returns HTTPResponse.Status +func (r GetSharedStorageResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r GetSharedStorageResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + type GetVariablesResponse struct { Body []byte HTTPResponse *http.Response @@ -3723,6 +3804,15 @@ func (c *ClientWithResponses) SaveSetupAssistantConfigWithResponse(ctx context.C return ParseSaveSetupAssistantConfigResponse(rsp) } +// GetSharedStorageWithResponse request returning *GetSharedStorageResponse +func (c *ClientWithResponses) GetSharedStorageWithResponse(ctx context.Context, audience ManagerVariableAudience, platform string, reqEditors ...RequestEditorFn) (*GetSharedStorageResponse, error) { + rsp, err := c.GetSharedStorage(ctx, audience, platform, reqEditors...) + if err != nil { + return nil, err + } + return ParseGetSharedStorageResponse(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...) @@ -4337,6 +4427,32 @@ func ParseSaveSetupAssistantConfigResponse(rsp *http.Response) (*SaveSetupAssist return response, nil } +// ParseGetSharedStorageResponse parses an HTTP response from a GetSharedStorageWithResponse call +func ParseGetSharedStorageResponse(rsp *http.Response) (*GetSharedStorageResponse, error) { + bodyBytes, err := ioutil.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &GetSharedStorageResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest SharedStorageLocation + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON200 = &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 27bafe6b..19d3c7be 100644 --- a/pkg/api/openapi_server.gen.go +++ b/pkg/api/openapi_server.gen.go @@ -31,6 +31,9 @@ type ServerInterface interface { // Update the Manager's configuration, and restart it in fully functional mode. // (POST /api/v3/configuration/setup-assistant) SaveSetupAssistantConfig(ctx echo.Context) error + // Get the shared storage location of this Manager, adjusted for the given audience and platform. + // (GET /api/v3/configuration/shared-storage/{audience}/{platform}) + GetSharedStorage(ctx echo.Context, audience ManagerVariableAudience, platform string) 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 @@ -201,6 +204,30 @@ func (w *ServerInterfaceWrapper) SaveSetupAssistantConfig(ctx echo.Context) erro return err } +// GetSharedStorage converts echo context to params. +func (w *ServerInterfaceWrapper) GetSharedStorage(ctx echo.Context) error { + var err error + // ------------- Path parameter "audience" ------------- + var audience ManagerVariableAudience + + err = runtime.BindStyledParameterWithLocation("simple", false, "audience", runtime.ParamLocationPath, ctx.Param("audience"), &audience) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter audience: %s", err)) + } + + // ------------- Path parameter "platform" ------------- + var platform string + + err = runtime.BindStyledParameterWithLocation("simple", false, "platform", runtime.ParamLocationPath, ctx.Param("platform"), &platform) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter platform: %s", err)) + } + + // Invoke the callback with all the unmarshalled arguments + err = w.Handler.GetSharedStorage(ctx, audience, platform) + return err +} + // GetVariables converts echo context to params. func (w *ServerInterfaceWrapper) GetVariables(ctx echo.Context) error { var err error @@ -788,6 +815,7 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL router.POST(baseURL+"/api/v3/configuration/check/shared-storage", wrapper.CheckSharedStoragePath) router.GET(baseURL+"/api/v3/configuration/file", wrapper.GetConfigurationFile) router.POST(baseURL+"/api/v3/configuration/setup-assistant", wrapper.SaveSetupAssistantConfig) + router.GET(baseURL+"/api/v3/configuration/shared-storage/:audience/:platform", wrapper.GetSharedStorage) 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 e7f5efeb..9aa1af34 100644 --- a/pkg/api/openapi_spec.gen.go +++ b/pkg/api/openapi_spec.gen.go @@ -18,192 +18,194 @@ import ( // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", - "0g/xHC6v6fq36/8XAAD//40ZVqbg2gAA", + "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", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/pkg/api/openapi_types.gen.go b/pkg/api/openapi_types.gen.go index 6ea08f75..b318fc3a 100644 --- a/pkg/api/openapi_types.gen.go +++ b/pkg/api/openapi_types.gen.go @@ -489,6 +489,16 @@ type ShamanSingleFileStatus struct { Status ShamanFileStatus `json:"status"` } +// Location of the shared storage, adjusted for a specific audience & platform. This uses two-way variables to adjust the shared storage path from the Manager's configuration. +type SharedStorageLocation struct { + Audience ManagerVariableAudience `json:"audience"` + Location string `json:"location"` + Platform string `json:"platform"` + + // Whether the Shaman file transfer API is available. + ShamanEnabled bool `json:"shamanEnabled"` +} + // Subset of a Job, sent over SocketIO when a job changes. For new jobs, `previous_status` will be excluded. type SocketIOJobUpdate struct { // UUID of the Job diff --git a/web/app/src/manager-api/index.js b/web/app/src/manager-api/index.js index 80520c09..8af339e9 100644 --- a/web/app/src/manager-api/index.js +++ b/web/app/src/manager-api/index.js @@ -51,6 +51,7 @@ import ShamanFileStatus from './model/ShamanFileStatus'; import ShamanRequirementsRequest from './model/ShamanRequirementsRequest'; import ShamanRequirementsResponse from './model/ShamanRequirementsResponse'; import ShamanSingleFileStatus from './model/ShamanSingleFileStatus'; +import SharedStorageLocation from './model/SharedStorageLocation'; import SocketIOJobUpdate from './model/SocketIOJobUpdate'; import SocketIOLastRenderedUpdate from './model/SocketIOLastRenderedUpdate'; import SocketIOSubscription from './model/SocketIOSubscription'; @@ -353,6 +354,12 @@ export { */ ShamanSingleFileStatus, + /** + * The SharedStorageLocation model constructor. + * @property {module:model/SharedStorageLocation} + */ + SharedStorageLocation, + /** * The SocketIOJobUpdate model constructor. * @property {module:model/SocketIOJobUpdate} diff --git a/web/app/src/manager-api/manager/MetaApi.js b/web/app/src/manager-api/manager/MetaApi.js index 83bd6921..97beb6de 100644 --- a/web/app/src/manager-api/manager/MetaApi.js +++ b/web/app/src/manager-api/manager/MetaApi.js @@ -22,6 +22,7 @@ import ManagerVariableAudience from '../model/ManagerVariableAudience'; import PathCheckInput from '../model/PathCheckInput'; import PathCheckResult from '../model/PathCheckResult'; import SetupAssistantConfig from '../model/SetupAssistantConfig'; +import SharedStorageLocation from '../model/SharedStorageLocation'; /** * Meta service. @@ -248,6 +249,59 @@ export default class MetaApi { } + /** + * Get the shared storage location of this Manager, adjusted for the given audience and platform. + * @param {module:model/ManagerVariableAudience} audience + * @param {String} platform + * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/SharedStorageLocation} and HTTP response + */ + getSharedStorageWithHttpInfo(audience, platform) { + let postBody = null; + // verify the required parameter 'audience' is set + if (audience === undefined || audience === null) { + throw new Error("Missing the required parameter 'audience' when calling getSharedStorage"); + } + // verify the required parameter 'platform' is set + if (platform === undefined || platform === null) { + throw new Error("Missing the required parameter 'platform' when calling getSharedStorage"); + } + + let pathParams = { + 'audience': audience, + 'platform': platform + }; + let queryParams = { + }; + let headerParams = { + }; + let formParams = { + }; + + let authNames = []; + let contentTypes = []; + let accepts = ['application/json']; + let returnType = SharedStorageLocation; + return this.apiClient.callApi( + '/api/v3/configuration/shared-storage/{audience}/{platform}', 'GET', + pathParams, queryParams, headerParams, formParams, postBody, + authNames, contentTypes, accepts, returnType, null + ); + } + + /** + * Get the shared storage location of this Manager, adjusted for the given audience and platform. + * @param {module:model/ManagerVariableAudience} audience + * @param {String} platform + * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/SharedStorageLocation} + */ + getSharedStorage(audience, platform) { + return this.getSharedStorageWithHttpInfo(audience, platform) + .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/SharedStorageLocation.js b/web/app/src/manager-api/model/SharedStorageLocation.js new file mode 100644 index 00000000..90cb0237 --- /dev/null +++ b/web/app/src/manager-api/model/SharedStorageLocation.js @@ -0,0 +1,106 @@ +/** + * 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 ManagerVariableAudience from './ManagerVariableAudience'; + +/** + * The SharedStorageLocation model module. + * @module model/SharedStorageLocation + * @version 0.0.0 + */ +class SharedStorageLocation { + /** + * Constructs a new SharedStorageLocation. + * Location of the shared storage, adjusted for a specific audience & platform. This uses two-way variables to adjust the shared storage path from the Manager's configuration. + * @alias module:model/SharedStorageLocation + * @param location {String} + * @param audience {module:model/ManagerVariableAudience} + * @param platform {String} + * @param shamanEnabled {Boolean} Whether the Shaman file transfer API is available. + */ + constructor(location, audience, platform, shamanEnabled) { + + SharedStorageLocation.initialize(this, location, audience, platform, shamanEnabled); + } + + /** + * 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, location, audience, platform, shamanEnabled) { + obj['location'] = location; + obj['audience'] = audience; + obj['platform'] = platform; + obj['shamanEnabled'] = shamanEnabled; + } + + /** + * Constructs a SharedStorageLocation 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/SharedStorageLocation} obj Optional instance to populate. + * @return {module:model/SharedStorageLocation} The populated SharedStorageLocation instance. + */ + static constructFromObject(data, obj) { + if (data) { + obj = obj || new SharedStorageLocation(); + + if (data.hasOwnProperty('location')) { + obj['location'] = ApiClient.convertToType(data['location'], 'String'); + } + if (data.hasOwnProperty('audience')) { + obj['audience'] = ManagerVariableAudience.constructFromObject(data['audience']); + } + if (data.hasOwnProperty('platform')) { + obj['platform'] = ApiClient.convertToType(data['platform'], 'String'); + } + if (data.hasOwnProperty('shamanEnabled')) { + obj['shamanEnabled'] = ApiClient.convertToType(data['shamanEnabled'], 'Boolean'); + } + } + return obj; + } + + +} + +/** + * @member {String} location + */ +SharedStorageLocation.prototype['location'] = undefined; + +/** + * @member {module:model/ManagerVariableAudience} audience + */ +SharedStorageLocation.prototype['audience'] = undefined; + +/** + * @member {String} platform + */ +SharedStorageLocation.prototype['platform'] = undefined; + +/** + * Whether the Shaman file transfer API is available. + * @member {Boolean} shamanEnabled + */ +SharedStorageLocation.prototype['shamanEnabled'] = undefined; + + + + + + +export default SharedStorageLocation; +