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